From 8e902224cf5eb69c2349b0d36dda45b1281e12c4 Mon Sep 17 00:00:00 2001 From: rachelchu Date: Wed, 11 Oct 2017 15:01:05 +0200 Subject: [PATCH] template project, first version --- AntTweakBar/.gitignore | 28 + AntTweakBar/AntTweakBar_Doc.url | 7 + AntTweakBar/ChangeLog.txt | 226 + AntTweakBar/Clean.bat | 23 + AntTweakBar/License.txt | 22 + AntTweakBar/Readme.txt | 15 + AntTweakBar/examples/Examples_VS2008.sln | 123 + AntTweakBar/examples/Examples_VS2012.sln | 115 + AntTweakBar/examples/Makefile | 104 + AntTweakBar/examples/Makefile.osx | 100 + AntTweakBar/examples/Readme.txt | 26 + AntTweakBar/examples/SDL-1.3.lib | Bin 0 -> 84550 bytes AntTweakBar/examples/SDL.lib | Bin 0 -> 39752 bytes AntTweakBar/examples/TwAdvanced1.cpp | 737 + AntTweakBar/examples/TwAdvanced1.vcproj | 378 + AntTweakBar/examples/TwAdvanced1.vcxproj | 242 + AntTweakBar/examples/TwCopyDLL.vcproj | 118 + AntTweakBar/examples/TwCopyDLL.vcxproj | 118 + AntTweakBar/examples/TwDualGLUT.c | 465 + AntTweakBar/examples/TwDualGLUT.vcproj | 390 + AntTweakBar/examples/TwDualGLUT.vcxproj | 246 + AntTweakBar/examples/TwGLCoreSDL.c | 410 + AntTweakBar/examples/TwGLCoreSDL.vcproj | 467 + AntTweakBar/examples/TwGLCoreSDL.vcxproj | 300 + AntTweakBar/examples/TwSimpleDX10.cpp | 486 + AntTweakBar/examples/TwSimpleDX10.vcproj | 380 + AntTweakBar/examples/TwSimpleDX10.vcxproj | 224 + AntTweakBar/examples/TwSimpleDX11.cpp | 985 + AntTweakBar/examples/TwSimpleDX11.hlsl | 35 + AntTweakBar/examples/TwSimpleDX11.vcproj | 422 + AntTweakBar/examples/TwSimpleDX11.vcxproj | 254 + AntTweakBar/examples/TwSimpleDX9.cpp | 261 + AntTweakBar/examples/TwSimpleDX9.vcproj | 380 + AntTweakBar/examples/TwSimpleDX9.vcxproj | 224 + AntTweakBar/examples/TwSimpleGLFW.c | 202 + AntTweakBar/examples/TwSimpleGLFW.vcproj | 378 + AntTweakBar/examples/TwSimpleGLFW.vcxproj | 234 + AntTweakBar/examples/TwSimpleGLUT.c | 344 + AntTweakBar/examples/TwSimpleGLUT.vcproj | 390 + AntTweakBar/examples/TwSimpleGLUT.vcxproj | 246 + AntTweakBar/examples/TwSimpleSDL.c | 260 + AntTweakBar/examples/TwSimpleSDL.vcproj | 467 + AntTweakBar/examples/TwSimpleSDL.vcxproj | 300 + AntTweakBar/examples/TwSimpleSFML.cpp | 249 + AntTweakBar/examples/TwSimpleSFML.vcproj | 421 + AntTweakBar/examples/TwString.cpp | 410 + AntTweakBar/examples/TwString.vcproj | 378 + AntTweakBar/examples/TwString.vcxproj | 234 + AntTweakBar/examples/bin32/GLFW.dll | Bin 0 -> 69632 bytes AntTweakBar/examples/bin32/Readme.txt | 57 + AntTweakBar/examples/bin32/SDL-1.3.dll | Bin 0 -> 826368 bytes AntTweakBar/examples/bin32/SDL.dll | Bin 0 -> 237568 bytes AntTweakBar/examples/bin32/glut32.dll | Bin 0 -> 237568 bytes AntTweakBar/examples/bin64/Readme.txt | 57 + AntTweakBar/examples/bin64/glut64.dll | Bin 0 -> 272896 bytes AntTweakBar/examples/d3d10vs2003.h | 46 + AntTweakBar/examples/glfw.h | 482 + AntTweakBar/examples/glfwdll.lib | Bin 0 -> 15196 bytes AntTweakBar/examples/glut32.lib | Bin 0 -> 28728 bytes AntTweakBar/examples/glut64.lib | Bin 0 -> 26180 bytes AntTweakBar/examples/sfml-graphics-s.lib | Bin 0 -> 4754186 bytes AntTweakBar/examples/sfml-system-s.lib | Bin 0 -> 357904 bytes AntTweakBar/examples/sfml-window-s.lib | Bin 0 -> 722424 bytes AntTweakBar/include/AntTweakBar.h | 378 + AntTweakBar/lib/Readme.txt | 2 + AntTweakBar/src/AntPerfTimer.h | 56 + AntTweakBar/src/AntTweakBar.rc | 83 + AntTweakBar/src/AntTweakBar.vcproj | 1025 + AntTweakBar/src/AntTweakBar.vcxproj | 490 + AntTweakBar/src/AntTweakBar.vcxproj.filters | 217 + AntTweakBar/src/AntTweakBar_2013.vcxproj | 495 + AntTweakBar/src/AntTweakBar_2015.vcxproj | 495 + AntTweakBar/src/AntTweakBar_2017.vcxproj | 496 + AntTweakBar/src/AntTweakBar_VS2008.sln | 25 + AntTweakBar/src/AntTweakBar_VS2012.sln | 25 + AntTweakBar/src/LoadOGL.cpp | 545 + AntTweakBar/src/LoadOGL.h | 397 + AntTweakBar/src/LoadOGLCore.cpp | 539 + AntTweakBar/src/LoadOGLCore.h | 403 + AntTweakBar/src/Makefile | 102 + AntTweakBar/src/Makefile.osx | 97 + AntTweakBar/src/MiniGLFW.h | 109 + AntTweakBar/src/MiniGLUT.h | 142 + AntTweakBar/src/MiniSDL12.h | 339 + AntTweakBar/src/MiniSDL13.h | 428 + AntTweakBar/src/MiniSFML16.h | 220 + AntTweakBar/src/Readme.txt | 12 + AntTweakBar/src/TwBar.cpp | 7771 +++++ AntTweakBar/src/TwBar.h | 438 + AntTweakBar/src/TwColors.cpp | 153 + AntTweakBar/src/TwColors.h | 80 + AntTweakBar/src/TwDirect3D10.cpp | 1291 + AntTweakBar/src/TwDirect3D10.h | 108 + AntTweakBar/src/TwDirect3D11.cpp | 1653 + AntTweakBar/src/TwDirect3D11.h | 117 + AntTweakBar/src/TwDirect3D11.hlsl | 83 + AntTweakBar/src/TwDirect3D9.cpp | 640 + AntTweakBar/src/TwDirect3D9.h | 90 + AntTweakBar/src/TwEventGLFW.c | 212 + AntTweakBar/src/TwEventGLUT.c | 150 + AntTweakBar/src/TwEventSDL.c | 43 + AntTweakBar/src/TwEventSDL12.c | 71 + AntTweakBar/src/TwEventSDL13.c | 129 + AntTweakBar/src/TwEventSFML.cpp | 173 + AntTweakBar/src/TwEventWin.c | 256 + AntTweakBar/src/TwEventX11.c | 207 + AntTweakBar/src/TwFonts.cpp | 4898 +++ AntTweakBar/src/TwFonts.h | 67 + AntTweakBar/src/TwGraph.h | 58 + AntTweakBar/src/TwMgr.cpp | 6753 ++++ AntTweakBar/src/TwMgr.h | 517 + AntTweakBar/src/TwOpenGL.cpp | 906 + AntTweakBar/src/TwOpenGL.h | 98 + AntTweakBar/src/TwOpenGLCore.cpp | 933 + AntTweakBar/src/TwOpenGLCore.h | 121 + AntTweakBar/src/TwPrecomp.cpp | 1 + AntTweakBar/src/TwPrecomp.h | 93 + AntTweakBar/src/d3d10vs2003.h | 46 + AntTweakBar/src/res/FontChars.txt | 232 + AntTweakBar/src/res/FontFixed1.pgm | 28788 ++++++++++++++++ AntTweakBar/src/res/FontLargeAA.pgm | 1197 + AntTweakBar/src/res/FontNormal.pgm | 895 + AntTweakBar/src/res/FontNormalAA.pgm | 1012 + AntTweakBar/src/res/FontSmall.pgm | 603 + AntTweakBar/src/res/TwXCursors.h | 908 + AntTweakBar/src/res/cur00000.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00001.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00002.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00003.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00004.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00005.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00006.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00007.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00008.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00009.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00010.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00011.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00012.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/cur00013.cur | Bin 0 -> 326 bytes AntTweakBar/src/res/curs00.pbm | 32 + AntTweakBar/src/res/curs01.pbm | 32 + AntTweakBar/src/res/curs02.pbm | 32 + AntTweakBar/src/res/curs03.pbm | 32 + AntTweakBar/src/res/curs04.pbm | 32 + AntTweakBar/src/res/curs05.pbm | 32 + AntTweakBar/src/res/curs06.pbm | 32 + AntTweakBar/src/res/curs07.pbm | 32 + AntTweakBar/src/res/curs08.pbm | 32 + AntTweakBar/src/res/curs09.pbm | 32 + AntTweakBar/src/res/curs10.pbm | 32 + AntTweakBar/src/res/curs11.pbm | 32 + AntTweakBar/src/res/curs12.pbm | 32 + AntTweakBar/src/res/curs13.pbm | 32 + AntTweakBar/src/res/mask00.pbm | 32 + AntTweakBar/src/res/mask01.pbm | 32 + AntTweakBar/src/res/mask02.pbm | 32 + AntTweakBar/src/res/mask03.pbm | 32 + AntTweakBar/src/res/mask04.pbm | 32 + AntTweakBar/src/res/mask05.pbm | 32 + AntTweakBar/src/res/mask06.pbm | 32 + AntTweakBar/src/res/mask07.pbm | 32 + AntTweakBar/src/res/mask08.pbm | 32 + AntTweakBar/src/res/mask09.pbm | 32 + AntTweakBar/src/res/mask10.pbm | 32 + AntTweakBar/src/res/mask11.pbm | 32 + AntTweakBar/src/res/mask12.pbm | 32 + AntTweakBar/src/res/mask13.pbm | 32 + AntTweakBar/src/resource.h | 29 + DXUT11/.gitattributes | 19 + DXUT11/.gitignore | 22 + DXUT11/Core/DDSTextureLoader.cpp | 1832 + DXUT11/Core/DDSTextureLoader.h | 133 + DXUT11/Core/DXUT.cpp | 4480 +++ DXUT11/Core/DXUT.h | 341 + DXUT11/Core/DXUTDevice11.cpp | 1276 + DXUT11/Core/DXUTDevice11.h | 210 + DXUT11/Core/DXUT_2013.vcxproj | 425 + DXUT11/Core/DXUT_2013.vcxproj.filters | 29 + DXUT11/Core/DXUT_2013_Win10.vcxproj | 431 + DXUT11/Core/DXUT_2013_Win10.vcxproj.filters | 29 + DXUT11/Core/DXUT_2015.vcxproj | 425 + DXUT11/Core/DXUT_2015.vcxproj.filters | 29 + DXUT11/Core/DXUT_2015_Win10.vcxproj | 426 + DXUT11/Core/DXUT_2015_Win10.vcxproj.filters | 29 + DXUT11/Core/DXUT_2017_Win10.vcxproj | 426 + DXUT11/Core/DXUT_2017_Win10.vcxproj.filters | 29 + DXUT11/Core/DXUT_DirectXTK_2013.vcxproj | 425 + .../Core/DXUT_DirectXTK_2013.vcxproj.filters | 23 + DXUT11/Core/DXUT_DirectXTK_2015.vcxproj | 425 + .../Core/DXUT_DirectXTK_2015.vcxproj.filters | 23 + DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj | 426 + .../DXUT_DirectXTK_2015_Win10.vcxproj.filters | 23 + DXUT11/Core/DXUT_DirectXTK_2017.vcxproj | 426 + .../Core/DXUT_DirectXTK_2017.vcxproj.filters | 23 + DXUT11/Core/DXUTmisc.cpp | 1280 + DXUT11/Core/DXUTmisc.h | 298 + DXUT11/Core/ScreenGrab.cpp | 1150 + DXUT11/Core/ScreenGrab.h | 43 + DXUT11/Core/WICTextureLoader.cpp | 933 + DXUT11/Core/WICTextureLoader.h | 123 + DXUT11/Core/dxerr.cpp | 3659 ++ DXUT11/Core/dxerr.h | 76 + DXUT11/DXUT_2013.sln | 58 + DXUT11/DXUT_2013_Win10.sln | 58 + DXUT11/DXUT_2015.sln | 58 + DXUT11/DXUT_2015_Win10.sln | 58 + DXUT11/DXUT_2017_Win10.sln | 58 + DXUT11/DXUT_DirectXTK_2013.sln | 84 + DXUT11/DXUT_DirectXTK_2015.sln | 84 + DXUT11/DXUT_DirectXTK_2015_Win10.sln | 80 + DXUT11/DXUT_DirectXTK_2017.sln | 84 + DXUT11/LICENSE | 21 + DXUT11/Media/UI/Font.dds | Bin 0 -> 76128 bytes DXUT11/Media/UI/dxutcontrols.dds | Bin 0 -> 262272 bytes DXUT11/Optional/DXUTLockFreePipe.h | 226 + DXUT11/Optional/DXUTOpt_2013.vcxproj | 434 + DXUT11/Optional/DXUTOpt_2013.vcxproj.filters | 32 + DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj | 440 + .../DXUTOpt_2013_Win10.vcxproj.filters | 32 + DXUT11/Optional/DXUTOpt_2015.vcxproj | 434 + DXUT11/Optional/DXUTOpt_2015.vcxproj.filters | 32 + DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj | 435 + .../DXUTOpt_2015_Win10.vcxproj.filters | 32 + DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj | 435 + .../DXUTOpt_2017_Win10.vcxproj.filters | 32 + .../Optional/DXUTOpt_DirectXTK_2013.vcxproj | 432 + .../DXUTOpt_DirectXTK_2013.vcxproj.filters | 30 + .../Optional/DXUTOpt_DirectXTK_2015.vcxproj | 432 + .../DXUTOpt_DirectXTK_2015.vcxproj.filters | 30 + .../DXUTOpt_DirectXTK_2015_Win10.vcxproj | 433 + ...UTOpt_DirectXTK_2015_Win10.vcxproj.filters | 30 + .../Optional/DXUTOpt_DirectXTK_2017.vcxproj | 433 + .../DXUTOpt_DirectXTK_2017.vcxproj.filters | 30 + DXUT11/Optional/DXUTcamera.cpp | 1228 + DXUT11/Optional/DXUTcamera.h | 426 + DXUT11/Optional/DXUTgui.cpp | 6676 ++++ DXUT11/Optional/DXUTgui.h | 1125 + DXUT11/Optional/DXUTguiIME.cpp | 1002 + DXUT11/Optional/DXUTguiIME.h | 141 + DXUT11/Optional/DXUTres.cpp | 8315 +++++ DXUT11/Optional/DXUTres.h | 17 + DXUT11/Optional/DXUTsettingsdlg.cpp | 1587 + DXUT11/Optional/DXUTsettingsdlg.h | 173 + DXUT11/Optional/ImeUi.cpp | 3252 ++ DXUT11/Optional/ImeUi.h | 126 + DXUT11/Optional/SDKmesh.cpp | 1311 + DXUT11/Optional/SDKmesh.h | 460 + DXUT11/Optional/SDKmisc.cpp | 1032 + DXUT11/Optional/SDKmisc.h | 134 + DXUT11/Optional/directx.ico | Bin 0 -> 25214 bytes DXUT11/ReadMe.txt | 139 + DXUT11/Windows10SDKVS13_x64.props | 12 + DXUT11/Windows10SDKVS13_x86.props | 12 + DirectXTK/.gitattributes | 20 + DirectXTK/.gitignore | 26 + DirectXTK/Audio/AudioEngine.cpp | 1739 + .../DirectXTKAudio_Desktop_2013_DXSDK.vcxproj | 197 + ...TKAudio_Desktop_2013_DXSDK.vcxproj.filters | 53 + .../DirectXTKAudio_Desktop_2013_Win8.vcxproj | 185 + ...XTKAudio_Desktop_2013_Win8.vcxproj.filters | 53 + .../DirectXTKAudio_Desktop_2015_DXSDK.vcxproj | 197 + ...TKAudio_Desktop_2015_DXSDK.vcxproj.filters | 53 + .../DirectXTKAudio_Desktop_2015_Win8.vcxproj | 185 + ...XTKAudio_Desktop_2015_Win8.vcxproj.filters | 53 + .../DirectXTKAudio_Desktop_2017_DXSDK.vcxproj | 202 + ...TKAudio_Desktop_2017_DXSDK.vcxproj.filters | 53 + .../DirectXTKAudio_Desktop_2017_Win8.vcxproj | 194 + ...XTKAudio_Desktop_2017_Win8.vcxproj.filters | 53 + .../Audio/DynamicSoundEffectInstance.cpp | 374 + DirectXTK/Audio/SoundCommon.cpp | 789 + DirectXTK/Audio/SoundCommon.h | 370 + DirectXTK/Audio/SoundEffect.cpp | 611 + DirectXTK/Audio/SoundEffectInstance.cpp | 334 + DirectXTK/Audio/WAVFileReader.cpp | 681 + DirectXTK/Audio/WAVFileReader.h | 55 + DirectXTK/Audio/WaveBank.cpp | 511 + DirectXTK/Audio/WaveBankReader.cpp | 1376 + DirectXTK/Audio/WaveBankReader.h | 85 + DirectXTK/DirectXTK_Desktop_2013.sln | 76 + DirectXTK/DirectXTK_Desktop_2013.vcxproj | 592 + .../DirectXTK_Desktop_2013.vcxproj.filters | 1170 + DirectXTK/DirectXTK_Desktop_2013_DXSDK.sln | 76 + DirectXTK/DirectXTK_Desktop_2015.sln | 76 + DirectXTK/DirectXTK_Desktop_2015.vcxproj | 590 + .../DirectXTK_Desktop_2015.vcxproj.filters | 1170 + DirectXTK/DirectXTK_Desktop_2015_DXSDK.sln | 76 + DirectXTK/DirectXTK_Desktop_2015_Win10.sln | 74 + .../DirectXTK_Desktop_2015_Win10.vcxproj | 603 + ...rectXTK_Desktop_2015_Win10.vcxproj.filters | 1209 + DirectXTK/DirectXTK_Desktop_2017.sln | 76 + DirectXTK/DirectXTK_Desktop_2017.vcxproj | 601 + .../DirectXTK_Desktop_2017.vcxproj.filters | 1170 + DirectXTK/DirectXTK_Desktop_2017_DXSDK.sln | 76 + DirectXTK/DirectXTK_Desktop_2017_Win10.sln | 74 + .../DirectXTK_Desktop_2017_Win10.vcxproj | 607 + ...rectXTK_Desktop_2017_Win10.vcxproj.filters | 1209 + DirectXTK/DirectXTK_Windows10.sln | 34 + DirectXTK/DirectXTK_Windows10.vcxproj | 690 + DirectXTK/DirectXTK_Windows10.vcxproj.filters | 1211 + DirectXTK/DirectXTK_Windows81.sln | 34 + DirectXTK/DirectXTK_Windows81.vcxproj | 705 + DirectXTK/DirectXTK_Windows81.vcxproj.filters | 1209 + DirectXTK/DirectXTK_WindowsPhone81.sln | 28 + DirectXTK/DirectXTK_WindowsPhone81.vcxproj | 498 + .../DirectXTK_WindowsPhone81.vcxproj.filters | 1062 + ...rectXTK_XAMLSilverlight_WindowsPhone81.sln | 28 + ...XTK_XAMLSilverlight_WindowsPhone81.vcxproj | 541 + ...Silverlight_WindowsPhone81.vcxproj.filters | 1064 + DirectXTK/DirectXTK_XboxOneXDK_2015.sln | 25 + DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj | 621 + .../DirectXTK_XboxOneXDK_2015.vcxproj.filters | 1255 + DirectXTK/DirectXTK_XboxOneXDK_2017.sln | 25 + DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj | 621 + .../DirectXTK_XboxOneXDK_2017.vcxproj.filters | 1255 + DirectXTK/Inc/Audio.h | 682 + DirectXTK/Inc/CommonStates.h | 70 + DirectXTK/Inc/DDSTextureLoader.h | 158 + DirectXTK/Inc/DirectXHelpers.h | 150 + DirectXTK/Inc/Effects.h | 691 + DirectXTK/Inc/GamePad.h | 272 + DirectXTK/Inc/GeometricPrimitive.h | 83 + DirectXTK/Inc/GraphicsMemory.h | 56 + DirectXTK/Inc/Keyboard.h | 482 + DirectXTK/Inc/Model.h | 145 + DirectXTK/Inc/Mouse.h | 123 + DirectXTK/Inc/PostProcess.h | 201 + DirectXTK/Inc/PrimitiveBatch.h | 143 + DirectXTK/Inc/ScreenGrab.h | 50 + DirectXTK/Inc/SimpleMath.h | 1026 + DirectXTK/Inc/SimpleMath.inl | 3706 ++ DirectXTK/Inc/SpriteBatch.h | 96 + DirectXTK/Inc/SpriteFont.h | 81 + DirectXTK/Inc/VertexTypes.h | 366 + DirectXTK/Inc/WICTextureLoader.h | 155 + DirectXTK/Inc/XboxDDSTextureLoader.h | 62 + DirectXTK/LICENSE | 21 + DirectXTK/MakeSpriteFont/BitmapImporter.cs | 125 + DirectXTK/MakeSpriteFont/BitmapUtils.cs | 244 + DirectXTK/MakeSpriteFont/CharacterRegion.cs | 137 + .../MakeSpriteFont/CommandLineOptions.cs | 99 + DirectXTK/MakeSpriteFont/CommandLineParser.cs | 253 + DirectXTK/MakeSpriteFont/Glyph.cs | 43 + DirectXTK/MakeSpriteFont/GlyphCropper.cs | 54 + DirectXTK/MakeSpriteFont/GlyphPacker.cs | 285 + DirectXTK/MakeSpriteFont/IFontImporter.cs | 25 + .../MakeSpriteFont/MakeSpriteFont.csproj | 60 + DirectXTK/MakeSpriteFont/Program.cs | 187 + .../MakeSpriteFont/Properties/AssemblyInfo.cs | 45 + DirectXTK/MakeSpriteFont/SpriteFontWriter.cs | 272 + DirectXTK/MakeSpriteFont/TrueTypeImporter.cs | 252 + DirectXTK/Readme.txt | 385 + DirectXTK/Src/AlignedNew.h | 67 + DirectXTK/Src/AlphaTestEffect.cpp | 447 + DirectXTK/Src/BasicEffect.cpp | 733 + DirectXTK/Src/BasicPostProcess.cpp | 596 + DirectXTK/Src/Bezier.h | 169 + DirectXTK/Src/BinaryReader.cpp | 92 + DirectXTK/Src/BinaryReader.h | 75 + DirectXTK/Src/CommonStates.cpp | 365 + DirectXTK/Src/ConstantBuffer.h | 115 + DirectXTK/Src/DDSTextureLoader.cpp | 1332 + DirectXTK/Src/DGSLEffect.cpp | 941 + DirectXTK/Src/DGSLEffectFactory.cpp | 591 + DirectXTK/Src/DemandCreate.h | 51 + DirectXTK/Src/DualPostProcess.cpp | 340 + DirectXTK/Src/DualTextureEffect.cpp | 338 + DirectXTK/Src/EffectCommon.cpp | 451 + DirectXTK/Src/EffectCommon.h | 293 + DirectXTK/Src/EffectFactory.cpp | 521 + DirectXTK/Src/EnvironmentMapEffect.cpp | 606 + DirectXTK/Src/GamePad.cpp | 1440 + DirectXTK/Src/GeometricPrimitive.cpp | 793 + DirectXTK/Src/Geometry.cpp | 1184 + DirectXTK/Src/Geometry.h | 32 + DirectXTK/Src/GraphicsMemory.cpp | 334 + DirectXTK/Src/Keyboard.cpp | 557 + DirectXTK/Src/LoaderHelpers.h | 874 + DirectXTK/Src/Model.cpp | 302 + DirectXTK/Src/ModelLoadCMO.cpp | 874 + DirectXTK/Src/ModelLoadSDKMESH.cpp | 632 + DirectXTK/Src/ModelLoadVBO.cpp | 188 + DirectXTK/Src/Mouse.cpp | 1031 + DirectXTK/Src/NormalMapEffect.cpp | 506 + DirectXTK/Src/PlatformHelpers.h | 152 + DirectXTK/Src/PrimitiveBatch.cpp | 436 + DirectXTK/Src/SDKMesh.h | 345 + DirectXTK/Src/ScreenGrab.cpp | 658 + DirectXTK/Src/Shaders/AlphaTestEffect.fx | 133 + DirectXTK/Src/Shaders/BasicEffect.fx | 610 + DirectXTK/Src/Shaders/Common.fxh | 66 + DirectXTK/Src/Shaders/CompileShaders.cmd | 267 + .../AlphaTestEffect_PSAlphaTestEqNe.inc | 350 + .../AlphaTestEffect_PSAlphaTestEqNe.pdb | Bin 0 -> 34304 bytes .../AlphaTestEffect_PSAlphaTestEqNeNoFog.inc | 286 + .../AlphaTestEffect_PSAlphaTestEqNeNoFog.pdb | Bin 0 -> 34304 bytes .../AlphaTestEffect_PSAlphaTestLtGt.inc | 331 + .../AlphaTestEffect_PSAlphaTestLtGt.pdb | Bin 0 -> 34304 bytes .../AlphaTestEffect_PSAlphaTestLtGtNoFog.inc | 268 + .../AlphaTestEffect_PSAlphaTestLtGtNoFog.pdb | Bin 0 -> 34304 bytes .../Compiled/AlphaTestEffect_VSAlphaTest.inc | 391 + .../Compiled/AlphaTestEffect_VSAlphaTest.pdb | Bin 0 -> 36352 bytes .../AlphaTestEffect_VSAlphaTestNoFog.inc | 338 + .../AlphaTestEffect_VSAlphaTestNoFog.pdb | Bin 0 -> 36352 bytes .../AlphaTestEffect_VSAlphaTestVc.inc | 413 + .../AlphaTestEffect_VSAlphaTestVc.pdb | Bin 0 -> 36352 bytes .../AlphaTestEffect_VSAlphaTestVcNoFog.inc | 359 + .../AlphaTestEffect_VSAlphaTestVcNoFog.pdb | Bin 0 -> 36352 bytes .../Shaders/Compiled/BasicEffect_PSBasic.inc | 219 + .../Shaders/Compiled/BasicEffect_PSBasic.pdb | Bin 0 -> 62976 bytes .../Compiled/BasicEffect_PSBasicNoFog.inc | 143 + .../Compiled/BasicEffect_PSBasicNoFog.pdb | Bin 0 -> 62976 bytes .../BasicEffect_PSBasicPixelLighting.inc | 858 + .../BasicEffect_PSBasicPixelLighting.pdb | Bin 0 -> 67072 bytes .../BasicEffect_PSBasicPixelLightingTx.inc | 922 + .../BasicEffect_PSBasicPixelLightingTx.pdb | Bin 0 -> 67072 bytes .../Compiled/BasicEffect_PSBasicTx.inc | 292 + .../Compiled/BasicEffect_PSBasicTx.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_PSBasicTxNoFog.inc | 206 + .../Compiled/BasicEffect_PSBasicTxNoFog.pdb | Bin 0 -> 62976 bytes .../BasicEffect_PSBasicVertexLighting.inc | 243 + .../BasicEffect_PSBasicVertexLighting.pdb | Bin 0 -> 65024 bytes ...BasicEffect_PSBasicVertexLightingNoFog.inc | 194 + ...BasicEffect_PSBasicVertexLightingNoFog.pdb | Bin 0 -> 62976 bytes .../BasicEffect_PSBasicVertexLightingTx.inc | 316 + .../BasicEffect_PSBasicVertexLightingTx.pdb | Bin 0 -> 65024 bytes ...sicEffect_PSBasicVertexLightingTxNoFog.inc | 269 + ...sicEffect_PSBasicVertexLightingTxNoFog.pdb | Bin 0 -> 65024 bytes .../Shaders/Compiled/BasicEffect_VSBasic.inc | 347 + .../Shaders/Compiled/BasicEffect_VSBasic.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_VSBasicNoFog.inc | 291 + .../Compiled/BasicEffect_VSBasicNoFog.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_VSBasicOneLight.inc | 783 + .../Compiled/BasicEffect_VSBasicOneLight.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicOneLightBn.inc | 812 + .../BasicEffect_VSBasicOneLightBn.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicOneLightTx.inc | 829 + .../BasicEffect_VSBasicOneLightTx.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicOneLightTxBn.inc | 857 + .../BasicEffect_VSBasicOneLightTxBn.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicOneLightTxVc.inc | 876 + .../BasicEffect_VSBasicOneLightTxVc.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicOneLightTxVcBn.inc | 905 + .../BasicEffect_VSBasicOneLightTxVcBn.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicOneLightVc.inc | 831 + .../BasicEffect_VSBasicOneLightVc.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicOneLightVcBn.inc | 859 + .../BasicEffect_VSBasicOneLightVcBn.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicPixelLighting.inc | 504 + .../BasicEffect_VSBasicPixelLighting.pdb | Bin 0 -> 65024 bytes .../BasicEffect_VSBasicPixelLightingBn.inc | 535 + .../BasicEffect_VSBasicPixelLightingBn.pdb | Bin 0 -> 65024 bytes .../BasicEffect_VSBasicPixelLightingTx.inc | 546 + .../BasicEffect_VSBasicPixelLightingTx.pdb | Bin 0 -> 65024 bytes .../BasicEffect_VSBasicPixelLightingTxBn.inc | 576 + .../BasicEffect_VSBasicPixelLightingTxBn.pdb | Bin 0 -> 65024 bytes .../BasicEffect_VSBasicPixelLightingTxVc.inc | 567 + .../BasicEffect_VSBasicPixelLightingTxVc.pdb | Bin 0 -> 65024 bytes ...BasicEffect_VSBasicPixelLightingTxVcBn.inc | 597 + ...BasicEffect_VSBasicPixelLightingTxVcBn.pdb | Bin 0 -> 65024 bytes .../BasicEffect_VSBasicPixelLightingVc.inc | 526 + .../BasicEffect_VSBasicPixelLightingVc.pdb | Bin 0 -> 65024 bytes .../BasicEffect_VSBasicPixelLightingVcBn.inc | 556 + .../BasicEffect_VSBasicPixelLightingVcBn.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_VSBasicTx.inc | 394 + .../Compiled/BasicEffect_VSBasicTx.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_VSBasicTxNoFog.inc | 336 + .../Compiled/BasicEffect_VSBasicTxNoFog.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_VSBasicTxVc.inc | 415 + .../Compiled/BasicEffect_VSBasicTxVc.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_VSBasicTxVcNoFog.inc | 358 + .../Compiled/BasicEffect_VSBasicTxVcNoFog.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_VSBasicVc.inc | 370 + .../Compiled/BasicEffect_VSBasicVc.pdb | Bin 0 -> 65024 bytes .../Compiled/BasicEffect_VSBasicVcNoFog.inc | 312 + .../Compiled/BasicEffect_VSBasicVcNoFog.pdb | Bin 0 -> 65024 bytes .../BasicEffect_VSBasicVertexLighting.inc | 993 + .../BasicEffect_VSBasicVertexLighting.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicVertexLightingBn.inc | 1021 + .../BasicEffect_VSBasicVertexLightingBn.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicVertexLightingTx.inc | 1038 + .../BasicEffect_VSBasicVertexLightingTx.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicVertexLightingTxBn.inc | 1067 + .../BasicEffect_VSBasicVertexLightingTxBn.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicVertexLightingTxVc.inc | 1084 + .../BasicEffect_VSBasicVertexLightingTxVc.pdb | Bin 0 -> 67072 bytes ...asicEffect_VSBasicVertexLightingTxVcBn.inc | 1112 + ...asicEffect_VSBasicVertexLightingTxVcBn.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicVertexLightingVc.inc | 1038 + .../BasicEffect_VSBasicVertexLightingVc.pdb | Bin 0 -> 67072 bytes .../BasicEffect_VSBasicVertexLightingVcBn.inc | 1067 + .../BasicEffect_VSBasicVertexLightingVcBn.pdb | Bin 0 -> 67072 bytes .../Src/Shaders/Compiled/DGSLEffect_main.inc | 583 + .../Src/Shaders/Compiled/DGSLEffect_main.pdb | Bin 0 -> 30208 bytes .../Compiled/DGSLEffect_main1Bones.inc | 841 + .../Compiled/DGSLEffect_main1Bones.pdb | Bin 0 -> 32256 bytes .../Compiled/DGSLEffect_main1BonesVc.inc | 859 + .../Compiled/DGSLEffect_main1BonesVc.pdb | Bin 0 -> 32256 bytes .../Compiled/DGSLEffect_main2Bones.inc | 888 + .../Compiled/DGSLEffect_main2Bones.pdb | Bin 0 -> 32256 bytes .../Compiled/DGSLEffect_main2BonesVc.inc | 907 + .../Compiled/DGSLEffect_main2BonesVc.pdb | Bin 0 -> 32256 bytes .../Compiled/DGSLEffect_main4Bones.inc | 991 + .../Compiled/DGSLEffect_main4Bones.pdb | Bin 0 -> 32256 bytes .../Compiled/DGSLEffect_main4BonesVc.inc | 1009 + .../Compiled/DGSLEffect_main4BonesVc.pdb | Bin 0 -> 32256 bytes .../Shaders/Compiled/DGSLEffect_mainVc.inc | 601 + .../Shaders/Compiled/DGSLEffect_mainVc.pdb | Bin 0 -> 30208 bytes .../Src/Shaders/Compiled/DGSLLambert_main.inc | 492 + .../Src/Shaders/Compiled/DGSLLambert_main.pdb | Bin 0 -> 24064 bytes .../Shaders/Compiled/DGSLLambert_mainTk.inc | 527 + .../Shaders/Compiled/DGSLLambert_mainTk.pdb | Bin 0 -> 24064 bytes .../Shaders/Compiled/DGSLLambert_mainTx.inc | 560 + .../Shaders/Compiled/DGSLLambert_mainTx.pdb | Bin 0 -> 24064 bytes .../Shaders/Compiled/DGSLLambert_mainTxTk.inc | 602 + .../Shaders/Compiled/DGSLLambert_mainTxTk.pdb | Bin 0 -> 24064 bytes .../Src/Shaders/Compiled/DGSLPhong_main.inc | 909 + .../Src/Shaders/Compiled/DGSLPhong_main.pdb | Bin 0 -> 28160 bytes .../Src/Shaders/Compiled/DGSLPhong_mainTk.inc | 928 + .../Src/Shaders/Compiled/DGSLPhong_mainTk.pdb | Bin 0 -> 28160 bytes .../Src/Shaders/Compiled/DGSLPhong_mainTx.inc | 959 + .../Src/Shaders/Compiled/DGSLPhong_mainTx.pdb | Bin 0 -> 28160 bytes .../Shaders/Compiled/DGSLPhong_mainTxTk.inc | 983 + .../Shaders/Compiled/DGSLPhong_mainTxTk.pdb | Bin 0 -> 30208 bytes .../Src/Shaders/Compiled/DGSLUnlit_main.inc | 206 + .../Src/Shaders/Compiled/DGSLUnlit_main.pdb | Bin 0 -> 22016 bytes .../Src/Shaders/Compiled/DGSLUnlit_mainTk.inc | 244 + .../Src/Shaders/Compiled/DGSLUnlit_mainTk.pdb | Bin 0 -> 22016 bytes .../Src/Shaders/Compiled/DGSLUnlit_mainTx.inc | 270 + .../Src/Shaders/Compiled/DGSLUnlit_mainTx.pdb | Bin 0 -> 22016 bytes .../Shaders/Compiled/DGSLUnlit_mainTxTk.inc | 321 + .../Shaders/Compiled/DGSLUnlit_mainTxTk.pdb | Bin 0 -> 22016 bytes .../DualTextureEffect_PSDualTexture.inc | 374 + .../DualTextureEffect_PSDualTexture.pdb | Bin 0 -> 34304 bytes .../DualTextureEffect_PSDualTextureNoFog.inc | 293 + .../DualTextureEffect_PSDualTextureNoFog.pdb | Bin 0 -> 34304 bytes .../DualTextureEffect_VSDualTexture.inc | 430 + .../DualTextureEffect_VSDualTexture.pdb | Bin 0 -> 34304 bytes .../DualTextureEffect_VSDualTextureNoFog.inc | 376 + .../DualTextureEffect_VSDualTextureNoFog.pdb | Bin 0 -> 34304 bytes .../DualTextureEffect_VSDualTextureVc.inc | 451 + .../DualTextureEffect_VSDualTextureVc.pdb | Bin 0 -> 34304 bytes ...DualTextureEffect_VSDualTextureVcNoFog.inc | 398 + ...DualTextureEffect_VSDualTextureVcNoFog.pdb | Bin 0 -> 34304 bytes .../EnvironmentMapEffect_PSEnvMap.inc | 369 + .../EnvironmentMapEffect_PSEnvMap.pdb | Bin 0 -> 50688 bytes .../EnvironmentMapEffect_PSEnvMapNoFog.inc | 309 + .../EnvironmentMapEffect_PSEnvMapNoFog.pdb | Bin 0 -> 50688 bytes ...ronmentMapEffect_PSEnvMapPixelLighting.inc | 739 + ...ronmentMapEffect_PSEnvMapPixelLighting.pdb | Bin 0 -> 54784 bytes ...MapEffect_PSEnvMapPixelLightingFresnel.inc | 832 + ...MapEffect_PSEnvMapPixelLightingFresnel.pdb | Bin 0 -> 54784 bytes ...fect_PSEnvMapPixelLightingFresnelNoFog.inc | 785 + ...fect_PSEnvMapPixelLightingFresnelNoFog.pdb | Bin 0 -> 54784 bytes ...ntMapEffect_PSEnvMapPixelLightingNoFog.inc | 692 + ...ntMapEffect_PSEnvMapPixelLightingNoFog.pdb | Bin 0 -> 54784 bytes .../EnvironmentMapEffect_PSEnvMapSpecular.inc | 406 + .../EnvironmentMapEffect_PSEnvMapSpecular.pdb | Bin 0 -> 50688 bytes ...ronmentMapEffect_PSEnvMapSpecularNoFog.inc | 355 + ...ronmentMapEffect_PSEnvMapSpecularNoFog.pdb | Bin 0 -> 50688 bytes .../EnvironmentMapEffect_VSEnvMap.inc | 786 + .../EnvironmentMapEffect_VSEnvMap.pdb | Bin 0 -> 52736 bytes .../EnvironmentMapEffect_VSEnvMapBn.inc | 814 + .../EnvironmentMapEffect_VSEnvMapBn.pdb | Bin 0 -> 54784 bytes .../EnvironmentMapEffect_VSEnvMapFresnel.inc | 855 + .../EnvironmentMapEffect_VSEnvMapFresnel.pdb | Bin 0 -> 54784 bytes ...EnvironmentMapEffect_VSEnvMapFresnelBn.inc | 884 + ...EnvironmentMapEffect_VSEnvMapFresnelBn.pdb | Bin 0 -> 54784 bytes .../EnvironmentMapEffect_VSEnvMapOneLight.inc | 734 + .../EnvironmentMapEffect_VSEnvMapOneLight.pdb | Bin 0 -> 52736 bytes ...nvironmentMapEffect_VSEnvMapOneLightBn.inc | 762 + ...nvironmentMapEffect_VSEnvMapOneLightBn.pdb | Bin 0 -> 52736 bytes ...nmentMapEffect_VSEnvMapOneLightFresnel.inc | 804 + ...nmentMapEffect_VSEnvMapOneLightFresnel.pdb | Bin 0 -> 54784 bytes ...entMapEffect_VSEnvMapOneLightFresnelBn.inc | 833 + ...entMapEffect_VSEnvMapOneLightFresnelBn.pdb | Bin 0 -> 54784 bytes ...ronmentMapEffect_VSEnvMapPixelLighting.inc | 547 + ...ronmentMapEffect_VSEnvMapPixelLighting.pdb | Bin 0 -> 52736 bytes ...nmentMapEffect_VSEnvMapPixelLightingBn.inc | 578 + ...nmentMapEffect_VSEnvMapPixelLightingBn.pdb | Bin 0 -> 52736 bytes ...ormalMapEffect_PSNormalPixelLightingTx.inc | 1153 + ...ormalMapEffect_PSNormalPixelLightingTx.pdb | Bin 0 -> 54784 bytes ...MapEffect_PSNormalPixelLightingTxNoFog.inc | 1119 + ...MapEffect_PSNormalPixelLightingTxNoFog.pdb | Bin 0 -> 54784 bytes ...ffect_PSNormalPixelLightingTxNoFogSpec.inc | 1070 + ...ffect_PSNormalPixelLightingTxNoFogSpec.pdb | Bin 0 -> 54784 bytes ...apEffect_PSNormalPixelLightingTxNoSpec.inc | 1105 + ...apEffect_PSNormalPixelLightingTxNoSpec.pdb | Bin 0 -> 54784 bytes ...ormalMapEffect_VSNormalPixelLightingTx.inc | 645 + ...ormalMapEffect_VSNormalPixelLightingTx.pdb | Bin 0 -> 52736 bytes ...malMapEffect_VSNormalPixelLightingTxBn.inc | 695 + ...malMapEffect_VSNormalPixelLightingTxBn.pdb | Bin 0 -> 52736 bytes ...malMapEffect_VSNormalPixelLightingTxVc.inc | 666 + ...malMapEffect_VSNormalPixelLightingTxVc.pdb | Bin 0 -> 52736 bytes ...lMapEffect_VSNormalPixelLightingTxVcBn.inc | 717 + ...lMapEffect_VSNormalPixelLightingTxVcBn.pdb | Bin 0 -> 52736 bytes .../Compiled/PostProcess_PSBloomBlur.inc | 136 + .../Compiled/PostProcess_PSBloomBlur.pdb | Bin 0 -> 38400 bytes .../Compiled/PostProcess_PSBloomCombine.inc | 173 + .../Compiled/PostProcess_PSBloomCombine.pdb | Bin 0 -> 40448 bytes .../Compiled/PostProcess_PSBloomExtract.inc | 109 + .../Compiled/PostProcess_PSBloomExtract.pdb | Bin 0 -> 38400 bytes .../Shaders/Compiled/PostProcess_PSCopy.inc | 81 + .../Shaders/Compiled/PostProcess_PSCopy.pdb | Bin 0 -> 38400 bytes .../Compiled/PostProcess_PSDownScale2x2.inc | 136 + .../Compiled/PostProcess_PSDownScale2x2.pdb | Bin 0 -> 38400 bytes .../Compiled/PostProcess_PSDownScale4x4.inc | 136 + .../Compiled/PostProcess_PSDownScale4x4.pdb | Bin 0 -> 38400 bytes .../PostProcess_PSGaussianBlur5x5.inc | 136 + .../PostProcess_PSGaussianBlur5x5.pdb | Bin 0 -> 38400 bytes .../Shaders/Compiled/PostProcess_PSMerge.inc | 112 + .../Shaders/Compiled/PostProcess_PSMerge.pdb | Bin 0 -> 38400 bytes .../Compiled/PostProcess_PSMonochrome.inc | 95 + .../Compiled/PostProcess_PSMonochrome.pdb | Bin 0 -> 38400 bytes .../Shaders/Compiled/PostProcess_PSSepia.inc | 111 + .../Shaders/Compiled/PostProcess_PSSepia.pdb | Bin 0 -> 38400 bytes .../Shaders/Compiled/PostProcess_VSQuad.inc | 119 + .../Shaders/Compiled/PostProcess_VSQuad.pdb | Bin 0 -> 38400 bytes .../SkinnedEffect_PSSkinnedPixelLighting.inc | 922 + .../SkinnedEffect_PSSkinnedPixelLighting.pdb | Bin 0 -> 58880 bytes .../SkinnedEffect_PSSkinnedVertexLighting.inc | 316 + .../SkinnedEffect_PSSkinnedVertexLighting.pdb | Bin 0 -> 54784 bytes ...nedEffect_PSSkinnedVertexLightingNoFog.inc | 270 + ...nedEffect_PSSkinnedVertexLightingNoFog.pdb | Bin 0 -> 54784 bytes ...innedEffect_VSSkinnedOneLightFourBones.inc | 1182 + ...innedEffect_VSSkinnedOneLightFourBones.pdb | Bin 0 -> 60928 bytes ...nedEffect_VSSkinnedOneLightFourBonesBn.inc | 1208 + ...nedEffect_VSSkinnedOneLightFourBonesBn.pdb | Bin 0 -> 60928 bytes ...SkinnedEffect_VSSkinnedOneLightOneBone.inc | 1030 + ...SkinnedEffect_VSSkinnedOneLightOneBone.pdb | Bin 0 -> 58880 bytes ...innedEffect_VSSkinnedOneLightOneBoneBn.inc | 1055 + ...innedEffect_VSSkinnedOneLightOneBoneBn.pdb | Bin 0 -> 60928 bytes ...kinnedEffect_VSSkinnedOneLightTwoBones.inc | 1078 + ...kinnedEffect_VSSkinnedOneLightTwoBones.pdb | Bin 0 -> 58880 bytes ...nnedEffect_VSSkinnedOneLightTwoBonesBn.inc | 1103 + ...nnedEffect_VSSkinnedOneLightTwoBonesBn.pdb | Bin 0 -> 60928 bytes ...Effect_VSSkinnedPixelLightingFourBones.inc | 910 + ...Effect_VSSkinnedPixelLightingFourBones.pdb | Bin 0 -> 58880 bytes ...fect_VSSkinnedPixelLightingFourBonesBn.inc | 946 + ...fect_VSSkinnedPixelLightingFourBonesBn.pdb | Bin 0 -> 58880 bytes ...edEffect_VSSkinnedPixelLightingOneBone.inc | 757 + ...edEffect_VSSkinnedPixelLightingOneBone.pdb | Bin 0 -> 56832 bytes ...Effect_VSSkinnedPixelLightingOneBoneBn.inc | 794 + ...Effect_VSSkinnedPixelLightingOneBoneBn.pdb | Bin 0 -> 58880 bytes ...dEffect_VSSkinnedPixelLightingTwoBones.inc | 807 + ...dEffect_VSSkinnedPixelLightingTwoBones.pdb | Bin 0 -> 58880 bytes ...ffect_VSSkinnedPixelLightingTwoBonesBn.inc | 842 + ...ffect_VSSkinnedPixelLightingTwoBonesBn.pdb | Bin 0 -> 58880 bytes ...ffect_VSSkinnedVertexLightingFourBones.inc | 1400 + ...ffect_VSSkinnedVertexLightingFourBones.pdb | Bin 0 -> 60928 bytes ...ect_VSSkinnedVertexLightingFourBonesBn.inc | 1426 + ...ect_VSSkinnedVertexLightingFourBonesBn.pdb | Bin 0 -> 60928 bytes ...dEffect_VSSkinnedVertexLightingOneBone.inc | 1248 + ...dEffect_VSSkinnedVertexLightingOneBone.pdb | Bin 0 -> 60928 bytes ...ffect_VSSkinnedVertexLightingOneBoneBn.inc | 1274 + ...ffect_VSSkinnedVertexLightingOneBoneBn.pdb | Bin 0 -> 60928 bytes ...Effect_VSSkinnedVertexLightingTwoBones.inc | 1296 + ...Effect_VSSkinnedVertexLightingTwoBones.pdb | Bin 0 -> 60928 bytes ...fect_VSSkinnedVertexLightingTwoBonesBn.inc | 1322 + ...fect_VSSkinnedVertexLightingTwoBonesBn.pdb | Bin 0 -> 60928 bytes .../SpriteEffect_SpritePixelShader.inc | 204 + .../SpriteEffect_SpritePixelShader.pdb | Bin 0 -> 13824 bytes .../SpriteEffect_SpriteVertexShader.inc | 299 + .../SpriteEffect_SpriteVertexShader.pdb | Bin 0 -> 15872 bytes .../Shaders/Compiled/ToneMap_PSACESFilmic.inc | 140 + .../Shaders/Compiled/ToneMap_PSACESFilmic.pdb | Bin 0 -> 42496 bytes .../Compiled/ToneMap_PSACESFilmic_SRGB.inc | 156 + .../Compiled/ToneMap_PSACESFilmic_SRGB.pdb | Bin 0 -> 42496 bytes .../Src/Shaders/Compiled/ToneMap_PSCopy.inc | 81 + .../Src/Shaders/Compiled/ToneMap_PSCopy.pdb | Bin 0 -> 40448 bytes .../Src/Shaders/Compiled/ToneMap_PSHDR10.inc | 189 + .../Src/Shaders/Compiled/ToneMap_PSHDR10.pdb | Bin 0 -> 42496 bytes .../Shaders/Compiled/ToneMap_PSReinhard.inc | 113 + .../Shaders/Compiled/ToneMap_PSReinhard.pdb | Bin 0 -> 40448 bytes .../Compiled/ToneMap_PSReinhard_SRGB.inc | 130 + .../Compiled/ToneMap_PSReinhard_SRGB.pdb | Bin 0 -> 42496 bytes .../Shaders/Compiled/ToneMap_PSSaturate.inc | 98 + .../Shaders/Compiled/ToneMap_PSSaturate.pdb | Bin 0 -> 40448 bytes .../Compiled/ToneMap_PSSaturate_SRGB.inc | 114 + .../Compiled/ToneMap_PSSaturate_SRGB.pdb | Bin 0 -> 42496 bytes .../Src/Shaders/Compiled/ToneMap_PS_SRGB.inc | 105 + .../Src/Shaders/Compiled/ToneMap_PS_SRGB.pdb | Bin 0 -> 40448 bytes .../Src/Shaders/Compiled/ToneMap_VSQuad.inc | 119 + .../Src/Shaders/Compiled/ToneMap_VSQuad.pdb | Bin 0 -> 40448 bytes DirectXTK/Src/Shaders/DGSLEffect.fx | 294 + DirectXTK/Src/Shaders/DGSLLambert.hlsl | 178 + DirectXTK/Src/Shaders/DGSLPhong.hlsl | 211 + DirectXTK/Src/Shaders/DGSLUnlit.hlsl | 153 + DirectXTK/Src/Shaders/DualTextureEffect.fx | 119 + DirectXTK/Src/Shaders/EnvironmentMapEffect.fx | 292 + DirectXTK/Src/Shaders/Lighting.fxh | 109 + DirectXTK/Src/Shaders/NormalMapEffect.fx | 212 + DirectXTK/Src/Shaders/PostProcess.fx | 181 + DirectXTK/Src/Shaders/SkinnedEffect.fx | 392 + DirectXTK/Src/Shaders/SpriteEffect.fx | 34 + DirectXTK/Src/Shaders/Structures.fxh | 265 + DirectXTK/Src/Shaders/ToneMap.fx | 231 + DirectXTK/Src/Shaders/Utilities.fxh | 74 + DirectXTK/Src/SharedResourcePool.h | 105 + DirectXTK/Src/SimpleMath.cpp | 192 + DirectXTK/Src/SkinnedEffect.cpp | 652 + DirectXTK/Src/SpriteBatch.cpp | 1200 + DirectXTK/Src/SpriteFont.cpp | 461 + DirectXTK/Src/TeapotData.inc | 185 + DirectXTK/Src/ToneMapPostProcess.cpp | 430 + DirectXTK/Src/VertexTypes.cpp | 177 + DirectXTK/Src/WICTextureLoader.cpp | 1147 + DirectXTK/Src/XboxDDSTextureLoader.cpp | 787 + DirectXTK/Src/dds.h | 228 + DirectXTK/Src/pch.cpp | 14 + DirectXTK/Src/pch.h | 108 + DirectXTK/Src/vbo.h | 38 + DirectXTK/XWBTool/xwbtool.cpp | 1769 + .../XWBTool/xwbtool_Desktop_2013.vcxproj | 165 + .../xwbtool_Desktop_2013.vcxproj.filters | 10 + .../XWBTool/xwbtool_Desktop_2015.vcxproj | 165 + .../xwbtool_Desktop_2015.vcxproj.filters | 10 + .../XWBTool/xwbtool_Desktop_2017.vcxproj | 174 + .../xwbtool_Desktop_2017.vcxproj.filters | 10 + Effects11/.gitattributes | 18 + Effects11/.gitignore | 22 + Effects11/Binary/EffectBinaryFormat.h | 679 + Effects11/Binary/EffectStateBase11.h | 55 + Effects11/Binary/EffectStates11.h | 241 + Effects11/Binary/SOParser.h | 319 + Effects11/Effect.h | 1265 + Effects11/EffectAPI.cpp | 331 + Effects11/EffectLoad.cpp | 4002 +++ Effects11/EffectLoad.h | 156 + Effects11/EffectNonRuntime.cpp | 3026 ++ Effects11/EffectReflection.cpp | 2184 ++ Effects11/EffectRuntime.cpp | 722 + Effects11/EffectVariable.inl | 4967 +++ Effects11/Effects11_2013.sln | 31 + Effects11/Effects11_2013.vcxproj | 419 + Effects11/Effects11_2013.vcxproj.filters | 35 + Effects11/Effects11_2015.sln | 31 + Effects11/Effects11_2015.vcxproj | 418 + Effects11/Effects11_2015.vcxproj.filters | 35 + Effects11/Effects11_2015_Win10.sln | 31 + Effects11/Effects11_2015_Win10.vcxproj | 419 + .../Effects11_2015_Win10.vcxproj.filters | 35 + Effects11/Effects11_2017.vcxproj | 419 + Effects11/Effects11_2017_Win10.sln | 31 + Effects11/Effects11_2017_Win10.vcxproj | 419 + .../Effects11_2017_Win10.vcxproj.filters | 35 + Effects11/Effects11_Windows10.sln | 34 + Effects11/Effects11_Windows10.vcxproj | 257 + Effects11/Effects11_Windows10.vcxproj.filters | 26 + Effects11/Effects11_Windows81.sln | 34 + Effects11/Effects11_Windows81.vcxproj | 239 + Effects11/Effects11_Windows81.vcxproj.filters | 32 + Effects11/Effects11_WindowsPhone81.sln | 28 + Effects11/Effects11_WindowsPhone81.vcxproj | 180 + .../Effects11_WindowsPhone81.vcxproj.filters | 26 + Effects11/Effects11_XboxOneXDK_2015.sln | 23 + Effects11/Effects11_XboxOneXDK_2015.vcxproj | 197 + .../Effects11_XboxOneXDK_2015.vcxproj.filters | 26 + Effects11/IUnknownImp.h | 57 + Effects11/LICENSE | 21 + Effects11/ReadMe.txt | 150 + Effects11/d3dxGlobal.cpp | 392 + Effects11/inc/d3dx11effect.h | 1200 + Effects11/inc/d3dxGlobal.h | 1284 + Effects11/pchfx.h | 62 + Simulations/Demo_2013.vcxproj | 277 + Simulations/Demo_2015.vcxproj | 277 + Simulations/Demo_2017.vcxproj | 278 + Simulations/DrawingUtilitiesClass.h | 424 + Simulations/MassSpringSystemSimulator.h | 58 + Simulations/Simulator.h | 75 + Simulations/TemplateSimulator.cpp | 149 + Simulations/TemplateSimulator.h | 38 + Simulations/effect.fx | 89 + Simulations/main.cpp | 386 + Simulations/util/FFmpeg.cpp | 220 + Simulations/util/FFmpeg.h | 67 + Simulations/util/matrixbase.h | 901 + Simulations/util/quaternion.h | 173 + Simulations/util/timer.h | 65 + Simulations/util/util.cpp | 58 + Simulations/util/util.h | 13 + Simulations/util/vector4d.h | 463 + Simulations/util/vectorbase.h | 1260 + .../SimulationsRunner_2013.vcxproj | 238 + .../SimulationsRunner_2015.vcxproj | 238 + .../SimulationsRunner_2017.vcxproj | 239 + .../PublicMassSpringSystemTests.cpp | 124 + SimulatorTester/SimulatorTester_2013.vcxproj | 193 + SimulatorTester/SimulatorTester_2015.vcxproj | 193 + SimulatorTester/SimulatorTester_2017.vcxproj | 194 + Template_2013.sln | 186 + Template_2015.sln | 186 + Template_2017.sln | 186 + readme.txt | 47 + 794 files changed, 326190 insertions(+) create mode 100644 AntTweakBar/.gitignore create mode 100644 AntTweakBar/AntTweakBar_Doc.url create mode 100644 AntTweakBar/ChangeLog.txt create mode 100644 AntTweakBar/Clean.bat create mode 100644 AntTweakBar/License.txt create mode 100644 AntTweakBar/Readme.txt create mode 100644 AntTweakBar/examples/Examples_VS2008.sln create mode 100644 AntTweakBar/examples/Examples_VS2012.sln create mode 100644 AntTweakBar/examples/Makefile create mode 100644 AntTweakBar/examples/Makefile.osx create mode 100644 AntTweakBar/examples/Readme.txt create mode 100644 AntTweakBar/examples/SDL-1.3.lib create mode 100644 AntTweakBar/examples/SDL.lib create mode 100644 AntTweakBar/examples/TwAdvanced1.cpp create mode 100644 AntTweakBar/examples/TwAdvanced1.vcproj create mode 100644 AntTweakBar/examples/TwAdvanced1.vcxproj create mode 100644 AntTweakBar/examples/TwCopyDLL.vcproj create mode 100644 AntTweakBar/examples/TwCopyDLL.vcxproj create mode 100644 AntTweakBar/examples/TwDualGLUT.c create mode 100644 AntTweakBar/examples/TwDualGLUT.vcproj create mode 100644 AntTweakBar/examples/TwDualGLUT.vcxproj create mode 100644 AntTweakBar/examples/TwGLCoreSDL.c create mode 100644 AntTweakBar/examples/TwGLCoreSDL.vcproj create mode 100644 AntTweakBar/examples/TwGLCoreSDL.vcxproj create mode 100644 AntTweakBar/examples/TwSimpleDX10.cpp create mode 100644 AntTweakBar/examples/TwSimpleDX10.vcproj create mode 100644 AntTweakBar/examples/TwSimpleDX10.vcxproj create mode 100644 AntTweakBar/examples/TwSimpleDX11.cpp create mode 100644 AntTweakBar/examples/TwSimpleDX11.hlsl create mode 100644 AntTweakBar/examples/TwSimpleDX11.vcproj create mode 100644 AntTweakBar/examples/TwSimpleDX11.vcxproj create mode 100644 AntTweakBar/examples/TwSimpleDX9.cpp create mode 100644 AntTweakBar/examples/TwSimpleDX9.vcproj create mode 100644 AntTweakBar/examples/TwSimpleDX9.vcxproj create mode 100644 AntTweakBar/examples/TwSimpleGLFW.c create mode 100644 AntTweakBar/examples/TwSimpleGLFW.vcproj create mode 100644 AntTweakBar/examples/TwSimpleGLFW.vcxproj create mode 100644 AntTweakBar/examples/TwSimpleGLUT.c create mode 100644 AntTweakBar/examples/TwSimpleGLUT.vcproj create mode 100644 AntTweakBar/examples/TwSimpleGLUT.vcxproj create mode 100644 AntTweakBar/examples/TwSimpleSDL.c create mode 100644 AntTweakBar/examples/TwSimpleSDL.vcproj create mode 100644 AntTweakBar/examples/TwSimpleSDL.vcxproj create mode 100644 AntTweakBar/examples/TwSimpleSFML.cpp create mode 100644 AntTweakBar/examples/TwSimpleSFML.vcproj create mode 100644 AntTweakBar/examples/TwString.cpp create mode 100644 AntTweakBar/examples/TwString.vcproj create mode 100644 AntTweakBar/examples/TwString.vcxproj create mode 100644 AntTweakBar/examples/bin32/GLFW.dll create mode 100644 AntTweakBar/examples/bin32/Readme.txt create mode 100644 AntTweakBar/examples/bin32/SDL-1.3.dll create mode 100644 AntTweakBar/examples/bin32/SDL.dll create mode 100644 AntTweakBar/examples/bin32/glut32.dll create mode 100644 AntTweakBar/examples/bin64/Readme.txt create mode 100644 AntTweakBar/examples/bin64/glut64.dll create mode 100644 AntTweakBar/examples/d3d10vs2003.h create mode 100644 AntTweakBar/examples/glfw.h create mode 100644 AntTweakBar/examples/glfwdll.lib create mode 100644 AntTweakBar/examples/glut32.lib create mode 100644 AntTweakBar/examples/glut64.lib create mode 100644 AntTweakBar/examples/sfml-graphics-s.lib create mode 100644 AntTweakBar/examples/sfml-system-s.lib create mode 100644 AntTweakBar/examples/sfml-window-s.lib create mode 100644 AntTweakBar/include/AntTweakBar.h create mode 100644 AntTweakBar/lib/Readme.txt create mode 100644 AntTweakBar/src/AntPerfTimer.h create mode 100644 AntTweakBar/src/AntTweakBar.rc create mode 100644 AntTweakBar/src/AntTweakBar.vcproj create mode 100644 AntTweakBar/src/AntTweakBar.vcxproj create mode 100644 AntTweakBar/src/AntTweakBar.vcxproj.filters create mode 100644 AntTweakBar/src/AntTweakBar_2013.vcxproj create mode 100644 AntTweakBar/src/AntTweakBar_2015.vcxproj create mode 100644 AntTweakBar/src/AntTweakBar_2017.vcxproj create mode 100644 AntTweakBar/src/AntTweakBar_VS2008.sln create mode 100644 AntTweakBar/src/AntTweakBar_VS2012.sln create mode 100644 AntTweakBar/src/LoadOGL.cpp create mode 100644 AntTweakBar/src/LoadOGL.h create mode 100644 AntTweakBar/src/LoadOGLCore.cpp create mode 100644 AntTweakBar/src/LoadOGLCore.h create mode 100644 AntTweakBar/src/Makefile create mode 100644 AntTweakBar/src/Makefile.osx create mode 100644 AntTweakBar/src/MiniGLFW.h create mode 100644 AntTweakBar/src/MiniGLUT.h create mode 100644 AntTweakBar/src/MiniSDL12.h create mode 100644 AntTweakBar/src/MiniSDL13.h create mode 100644 AntTweakBar/src/MiniSFML16.h create mode 100644 AntTweakBar/src/Readme.txt create mode 100644 AntTweakBar/src/TwBar.cpp create mode 100644 AntTweakBar/src/TwBar.h create mode 100644 AntTweakBar/src/TwColors.cpp create mode 100644 AntTweakBar/src/TwColors.h create mode 100644 AntTweakBar/src/TwDirect3D10.cpp create mode 100644 AntTweakBar/src/TwDirect3D10.h create mode 100644 AntTweakBar/src/TwDirect3D11.cpp create mode 100644 AntTweakBar/src/TwDirect3D11.h create mode 100644 AntTweakBar/src/TwDirect3D11.hlsl create mode 100644 AntTweakBar/src/TwDirect3D9.cpp create mode 100644 AntTweakBar/src/TwDirect3D9.h create mode 100644 AntTweakBar/src/TwEventGLFW.c create mode 100644 AntTweakBar/src/TwEventGLUT.c create mode 100644 AntTweakBar/src/TwEventSDL.c create mode 100644 AntTweakBar/src/TwEventSDL12.c create mode 100644 AntTweakBar/src/TwEventSDL13.c create mode 100644 AntTweakBar/src/TwEventSFML.cpp create mode 100644 AntTweakBar/src/TwEventWin.c create mode 100644 AntTweakBar/src/TwEventX11.c create mode 100644 AntTweakBar/src/TwFonts.cpp create mode 100644 AntTweakBar/src/TwFonts.h create mode 100644 AntTweakBar/src/TwGraph.h create mode 100644 AntTweakBar/src/TwMgr.cpp create mode 100644 AntTweakBar/src/TwMgr.h create mode 100644 AntTweakBar/src/TwOpenGL.cpp create mode 100644 AntTweakBar/src/TwOpenGL.h create mode 100644 AntTweakBar/src/TwOpenGLCore.cpp create mode 100644 AntTweakBar/src/TwOpenGLCore.h create mode 100644 AntTweakBar/src/TwPrecomp.cpp create mode 100644 AntTweakBar/src/TwPrecomp.h create mode 100644 AntTweakBar/src/d3d10vs2003.h create mode 100644 AntTweakBar/src/res/FontChars.txt create mode 100644 AntTweakBar/src/res/FontFixed1.pgm create mode 100644 AntTweakBar/src/res/FontLargeAA.pgm create mode 100644 AntTweakBar/src/res/FontNormal.pgm create mode 100644 AntTweakBar/src/res/FontNormalAA.pgm create mode 100644 AntTweakBar/src/res/FontSmall.pgm create mode 100644 AntTweakBar/src/res/TwXCursors.h create mode 100644 AntTweakBar/src/res/cur00000.cur create mode 100644 AntTweakBar/src/res/cur00001.cur create mode 100644 AntTweakBar/src/res/cur00002.cur create mode 100644 AntTweakBar/src/res/cur00003.cur create mode 100644 AntTweakBar/src/res/cur00004.cur create mode 100644 AntTweakBar/src/res/cur00005.cur create mode 100644 AntTweakBar/src/res/cur00006.cur create mode 100644 AntTweakBar/src/res/cur00007.cur create mode 100644 AntTweakBar/src/res/cur00008.cur create mode 100644 AntTweakBar/src/res/cur00009.cur create mode 100644 AntTweakBar/src/res/cur00010.cur create mode 100644 AntTweakBar/src/res/cur00011.cur create mode 100644 AntTweakBar/src/res/cur00012.cur create mode 100644 AntTweakBar/src/res/cur00013.cur create mode 100644 AntTweakBar/src/res/curs00.pbm create mode 100644 AntTweakBar/src/res/curs01.pbm create mode 100644 AntTweakBar/src/res/curs02.pbm create mode 100644 AntTweakBar/src/res/curs03.pbm create mode 100644 AntTweakBar/src/res/curs04.pbm create mode 100644 AntTweakBar/src/res/curs05.pbm create mode 100644 AntTweakBar/src/res/curs06.pbm create mode 100644 AntTweakBar/src/res/curs07.pbm create mode 100644 AntTweakBar/src/res/curs08.pbm create mode 100644 AntTweakBar/src/res/curs09.pbm create mode 100644 AntTweakBar/src/res/curs10.pbm create mode 100644 AntTweakBar/src/res/curs11.pbm create mode 100644 AntTweakBar/src/res/curs12.pbm create mode 100644 AntTweakBar/src/res/curs13.pbm create mode 100644 AntTweakBar/src/res/mask00.pbm create mode 100644 AntTweakBar/src/res/mask01.pbm create mode 100644 AntTweakBar/src/res/mask02.pbm create mode 100644 AntTweakBar/src/res/mask03.pbm create mode 100644 AntTweakBar/src/res/mask04.pbm create mode 100644 AntTweakBar/src/res/mask05.pbm create mode 100644 AntTweakBar/src/res/mask06.pbm create mode 100644 AntTweakBar/src/res/mask07.pbm create mode 100644 AntTweakBar/src/res/mask08.pbm create mode 100644 AntTweakBar/src/res/mask09.pbm create mode 100644 AntTweakBar/src/res/mask10.pbm create mode 100644 AntTweakBar/src/res/mask11.pbm create mode 100644 AntTweakBar/src/res/mask12.pbm create mode 100644 AntTweakBar/src/res/mask13.pbm create mode 100644 AntTweakBar/src/resource.h create mode 100644 DXUT11/.gitattributes create mode 100644 DXUT11/.gitignore create mode 100644 DXUT11/Core/DDSTextureLoader.cpp create mode 100644 DXUT11/Core/DDSTextureLoader.h create mode 100644 DXUT11/Core/DXUT.cpp create mode 100644 DXUT11/Core/DXUT.h create mode 100644 DXUT11/Core/DXUTDevice11.cpp create mode 100644 DXUT11/Core/DXUTDevice11.h create mode 100644 DXUT11/Core/DXUT_2013.vcxproj create mode 100644 DXUT11/Core/DXUT_2013.vcxproj.filters create mode 100644 DXUT11/Core/DXUT_2013_Win10.vcxproj create mode 100644 DXUT11/Core/DXUT_2013_Win10.vcxproj.filters create mode 100644 DXUT11/Core/DXUT_2015.vcxproj create mode 100644 DXUT11/Core/DXUT_2015.vcxproj.filters create mode 100644 DXUT11/Core/DXUT_2015_Win10.vcxproj create mode 100644 DXUT11/Core/DXUT_2015_Win10.vcxproj.filters create mode 100644 DXUT11/Core/DXUT_2017_Win10.vcxproj create mode 100644 DXUT11/Core/DXUT_2017_Win10.vcxproj.filters create mode 100644 DXUT11/Core/DXUT_DirectXTK_2013.vcxproj create mode 100644 DXUT11/Core/DXUT_DirectXTK_2013.vcxproj.filters create mode 100644 DXUT11/Core/DXUT_DirectXTK_2015.vcxproj create mode 100644 DXUT11/Core/DXUT_DirectXTK_2015.vcxproj.filters create mode 100644 DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj create mode 100644 DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj.filters create mode 100644 DXUT11/Core/DXUT_DirectXTK_2017.vcxproj create mode 100644 DXUT11/Core/DXUT_DirectXTK_2017.vcxproj.filters create mode 100644 DXUT11/Core/DXUTmisc.cpp create mode 100644 DXUT11/Core/DXUTmisc.h create mode 100644 DXUT11/Core/ScreenGrab.cpp create mode 100644 DXUT11/Core/ScreenGrab.h create mode 100644 DXUT11/Core/WICTextureLoader.cpp create mode 100644 DXUT11/Core/WICTextureLoader.h create mode 100644 DXUT11/Core/dxerr.cpp create mode 100644 DXUT11/Core/dxerr.h create mode 100644 DXUT11/DXUT_2013.sln create mode 100644 DXUT11/DXUT_2013_Win10.sln create mode 100644 DXUT11/DXUT_2015.sln create mode 100644 DXUT11/DXUT_2015_Win10.sln create mode 100644 DXUT11/DXUT_2017_Win10.sln create mode 100644 DXUT11/DXUT_DirectXTK_2013.sln create mode 100644 DXUT11/DXUT_DirectXTK_2015.sln create mode 100644 DXUT11/DXUT_DirectXTK_2015_Win10.sln create mode 100644 DXUT11/DXUT_DirectXTK_2017.sln create mode 100644 DXUT11/LICENSE create mode 100644 DXUT11/Media/UI/Font.dds create mode 100644 DXUT11/Media/UI/dxutcontrols.dds create mode 100644 DXUT11/Optional/DXUTLockFreePipe.h create mode 100644 DXUT11/Optional/DXUTOpt_2013.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_2013.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTOpt_2015.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_2015.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTOpt_DirectXTK_2013.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_DirectXTK_2013.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTOpt_DirectXTK_2015.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_DirectXTK_2015.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTOpt_DirectXTK_2015_Win10.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_DirectXTK_2015_Win10.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTOpt_DirectXTK_2017.vcxproj create mode 100644 DXUT11/Optional/DXUTOpt_DirectXTK_2017.vcxproj.filters create mode 100644 DXUT11/Optional/DXUTcamera.cpp create mode 100644 DXUT11/Optional/DXUTcamera.h create mode 100644 DXUT11/Optional/DXUTgui.cpp create mode 100644 DXUT11/Optional/DXUTgui.h create mode 100644 DXUT11/Optional/DXUTguiIME.cpp create mode 100644 DXUT11/Optional/DXUTguiIME.h create mode 100644 DXUT11/Optional/DXUTres.cpp create mode 100644 DXUT11/Optional/DXUTres.h create mode 100644 DXUT11/Optional/DXUTsettingsdlg.cpp create mode 100644 DXUT11/Optional/DXUTsettingsdlg.h create mode 100644 DXUT11/Optional/ImeUi.cpp create mode 100644 DXUT11/Optional/ImeUi.h create mode 100644 DXUT11/Optional/SDKmesh.cpp create mode 100644 DXUT11/Optional/SDKmesh.h create mode 100644 DXUT11/Optional/SDKmisc.cpp create mode 100644 DXUT11/Optional/SDKmisc.h create mode 100644 DXUT11/Optional/directx.ico create mode 100644 DXUT11/ReadMe.txt create mode 100644 DXUT11/Windows10SDKVS13_x64.props create mode 100644 DXUT11/Windows10SDKVS13_x86.props create mode 100644 DirectXTK/.gitattributes create mode 100644 DirectXTK/.gitignore create mode 100644 DirectXTK/Audio/AudioEngine.cpp create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2013_DXSDK.vcxproj create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2013_DXSDK.vcxproj.filters create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2013_Win8.vcxproj create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2013_Win8.vcxproj.filters create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2015_DXSDK.vcxproj create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2015_DXSDK.vcxproj.filters create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2015_Win8.vcxproj create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2015_Win8.vcxproj.filters create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2017_DXSDK.vcxproj create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2017_DXSDK.vcxproj.filters create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2017_Win8.vcxproj create mode 100644 DirectXTK/Audio/DirectXTKAudio_Desktop_2017_Win8.vcxproj.filters create mode 100644 DirectXTK/Audio/DynamicSoundEffectInstance.cpp create mode 100644 DirectXTK/Audio/SoundCommon.cpp create mode 100644 DirectXTK/Audio/SoundCommon.h create mode 100644 DirectXTK/Audio/SoundEffect.cpp create mode 100644 DirectXTK/Audio/SoundEffectInstance.cpp create mode 100644 DirectXTK/Audio/WAVFileReader.cpp create mode 100644 DirectXTK/Audio/WAVFileReader.h create mode 100644 DirectXTK/Audio/WaveBank.cpp create mode 100644 DirectXTK/Audio/WaveBankReader.cpp create mode 100644 DirectXTK/Audio/WaveBankReader.h create mode 100644 DirectXTK/DirectXTK_Desktop_2013.sln create mode 100644 DirectXTK/DirectXTK_Desktop_2013.vcxproj create mode 100644 DirectXTK/DirectXTK_Desktop_2013.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_Desktop_2013_DXSDK.sln create mode 100644 DirectXTK/DirectXTK_Desktop_2015.sln create mode 100644 DirectXTK/DirectXTK_Desktop_2015.vcxproj create mode 100644 DirectXTK/DirectXTK_Desktop_2015.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_Desktop_2015_DXSDK.sln create mode 100644 DirectXTK/DirectXTK_Desktop_2015_Win10.sln create mode 100644 DirectXTK/DirectXTK_Desktop_2015_Win10.vcxproj create mode 100644 DirectXTK/DirectXTK_Desktop_2015_Win10.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_Desktop_2017.sln create mode 100644 DirectXTK/DirectXTK_Desktop_2017.vcxproj create mode 100644 DirectXTK/DirectXTK_Desktop_2017.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_Desktop_2017_DXSDK.sln create mode 100644 DirectXTK/DirectXTK_Desktop_2017_Win10.sln create mode 100644 DirectXTK/DirectXTK_Desktop_2017_Win10.vcxproj create mode 100644 DirectXTK/DirectXTK_Desktop_2017_Win10.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_Windows10.sln create mode 100644 DirectXTK/DirectXTK_Windows10.vcxproj create mode 100644 DirectXTK/DirectXTK_Windows10.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_Windows81.sln create mode 100644 DirectXTK/DirectXTK_Windows81.vcxproj create mode 100644 DirectXTK/DirectXTK_Windows81.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_WindowsPhone81.sln create mode 100644 DirectXTK/DirectXTK_WindowsPhone81.vcxproj create mode 100644 DirectXTK/DirectXTK_WindowsPhone81.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.sln create mode 100644 DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj create mode 100644 DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_XboxOneXDK_2015.sln create mode 100644 DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj create mode 100644 DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj.filters create mode 100644 DirectXTK/DirectXTK_XboxOneXDK_2017.sln create mode 100644 DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj create mode 100644 DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj.filters create mode 100644 DirectXTK/Inc/Audio.h create mode 100644 DirectXTK/Inc/CommonStates.h create mode 100644 DirectXTK/Inc/DDSTextureLoader.h create mode 100644 DirectXTK/Inc/DirectXHelpers.h create mode 100644 DirectXTK/Inc/Effects.h create mode 100644 DirectXTK/Inc/GamePad.h create mode 100644 DirectXTK/Inc/GeometricPrimitive.h create mode 100644 DirectXTK/Inc/GraphicsMemory.h create mode 100644 DirectXTK/Inc/Keyboard.h create mode 100644 DirectXTK/Inc/Model.h create mode 100644 DirectXTK/Inc/Mouse.h create mode 100644 DirectXTK/Inc/PostProcess.h create mode 100644 DirectXTK/Inc/PrimitiveBatch.h create mode 100644 DirectXTK/Inc/ScreenGrab.h create mode 100644 DirectXTK/Inc/SimpleMath.h create mode 100644 DirectXTK/Inc/SimpleMath.inl create mode 100644 DirectXTK/Inc/SpriteBatch.h create mode 100644 DirectXTK/Inc/SpriteFont.h create mode 100644 DirectXTK/Inc/VertexTypes.h create mode 100644 DirectXTK/Inc/WICTextureLoader.h create mode 100644 DirectXTK/Inc/XboxDDSTextureLoader.h create mode 100644 DirectXTK/LICENSE create mode 100644 DirectXTK/MakeSpriteFont/BitmapImporter.cs create mode 100644 DirectXTK/MakeSpriteFont/BitmapUtils.cs create mode 100644 DirectXTK/MakeSpriteFont/CharacterRegion.cs create mode 100644 DirectXTK/MakeSpriteFont/CommandLineOptions.cs create mode 100644 DirectXTK/MakeSpriteFont/CommandLineParser.cs create mode 100644 DirectXTK/MakeSpriteFont/Glyph.cs create mode 100644 DirectXTK/MakeSpriteFont/GlyphCropper.cs create mode 100644 DirectXTK/MakeSpriteFont/GlyphPacker.cs create mode 100644 DirectXTK/MakeSpriteFont/IFontImporter.cs create mode 100644 DirectXTK/MakeSpriteFont/MakeSpriteFont.csproj create mode 100644 DirectXTK/MakeSpriteFont/Program.cs create mode 100644 DirectXTK/MakeSpriteFont/Properties/AssemblyInfo.cs create mode 100644 DirectXTK/MakeSpriteFont/SpriteFontWriter.cs create mode 100644 DirectXTK/MakeSpriteFont/TrueTypeImporter.cs create mode 100644 DirectXTK/Readme.txt create mode 100644 DirectXTK/Src/AlignedNew.h create mode 100644 DirectXTK/Src/AlphaTestEffect.cpp create mode 100644 DirectXTK/Src/BasicEffect.cpp create mode 100644 DirectXTK/Src/BasicPostProcess.cpp create mode 100644 DirectXTK/Src/Bezier.h create mode 100644 DirectXTK/Src/BinaryReader.cpp create mode 100644 DirectXTK/Src/BinaryReader.h create mode 100644 DirectXTK/Src/CommonStates.cpp create mode 100644 DirectXTK/Src/ConstantBuffer.h create mode 100644 DirectXTK/Src/DDSTextureLoader.cpp create mode 100644 DirectXTK/Src/DGSLEffect.cpp create mode 100644 DirectXTK/Src/DGSLEffectFactory.cpp create mode 100644 DirectXTK/Src/DemandCreate.h create mode 100644 DirectXTK/Src/DualPostProcess.cpp create mode 100644 DirectXTK/Src/DualTextureEffect.cpp create mode 100644 DirectXTK/Src/EffectCommon.cpp create mode 100644 DirectXTK/Src/EffectCommon.h create mode 100644 DirectXTK/Src/EffectFactory.cpp create mode 100644 DirectXTK/Src/EnvironmentMapEffect.cpp create mode 100644 DirectXTK/Src/GamePad.cpp create mode 100644 DirectXTK/Src/GeometricPrimitive.cpp create mode 100644 DirectXTK/Src/Geometry.cpp create mode 100644 DirectXTK/Src/Geometry.h create mode 100644 DirectXTK/Src/GraphicsMemory.cpp create mode 100644 DirectXTK/Src/Keyboard.cpp create mode 100644 DirectXTK/Src/LoaderHelpers.h create mode 100644 DirectXTK/Src/Model.cpp create mode 100644 DirectXTK/Src/ModelLoadCMO.cpp create mode 100644 DirectXTK/Src/ModelLoadSDKMESH.cpp create mode 100644 DirectXTK/Src/ModelLoadVBO.cpp create mode 100644 DirectXTK/Src/Mouse.cpp create mode 100644 DirectXTK/Src/NormalMapEffect.cpp create mode 100644 DirectXTK/Src/PlatformHelpers.h create mode 100644 DirectXTK/Src/PrimitiveBatch.cpp create mode 100644 DirectXTK/Src/SDKMesh.h create mode 100644 DirectXTK/Src/ScreenGrab.cpp create mode 100644 DirectXTK/Src/Shaders/AlphaTestEffect.fx create mode 100644 DirectXTK/Src/Shaders/BasicEffect.fx create mode 100644 DirectXTK/Src/Shaders/Common.fxh create mode 100644 DirectXTK/Src/Shaders/CompileShaders.cmd create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNe.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNe.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNeNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNeNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGt.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGt.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGtNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGtNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTest.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTest.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVcNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVcNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasic.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasic.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLighting.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLighting.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLightingTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLightingTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTxNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTxNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLighting.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLighting.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTxNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTxNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasic.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasic.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLight.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLight.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVcBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVcBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVcBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVcBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLighting.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLighting.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVcBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVcBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVcBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVcBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxVcNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxVcNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVcNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVcNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLighting.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLighting.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVcBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVcBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVcBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVcBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1Bones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1Bones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1BonesVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1BonesVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main2Bones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main2Bones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main2BonesVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main2BonesVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main4Bones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main4Bones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main4BonesVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_main4BonesVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_mainVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLEffect_mainVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLLambert_main.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLLambert_main.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTk.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTk.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTxTk.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTxTk.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLPhong_main.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLPhong_main.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLPhong_mainTk.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLPhong_mainTk.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLPhong_mainTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLPhong_mainTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLPhong_mainTxTk.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLPhong_mainTxTk.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLUnlit_main.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLUnlit_main.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLUnlit_mainTk.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLUnlit_mainTk.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLUnlit_mainTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLUnlit_mainTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLUnlit_mainTxTk.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DGSLUnlit_mainTxTk.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_PSDualTexture.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_PSDualTexture.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_PSDualTextureNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_PSDualTextureNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_VSDualTexture.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_VSDualTexture.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_VSDualTextureNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_VSDualTextureNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_VSDualTextureVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_VSDualTextureVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_VSDualTextureVcNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/DualTextureEffect_VSDualTextureVcNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMap.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMap.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLighting.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLighting.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingFresnel.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingFresnel.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingFresnelNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingFresnelNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapSpecular.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapSpecular.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapSpecularNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_PSEnvMapSpecularNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMap.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMap.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapFresnel.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapFresnel.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapFresnelBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapFresnelBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLight.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLight.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightFresnel.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightFresnel.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightFresnelBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightFresnelBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapPixelLighting.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapPixelLighting.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapPixelLightingBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/EnvironmentMapEffect_VSEnvMapPixelLightingBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoFogSpec.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoFogSpec.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoSpec.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoSpec.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTx.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTx.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxVc.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxVc.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxVcBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxVcBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSBloomBlur.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSBloomBlur.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSBloomCombine.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSBloomCombine.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSBloomExtract.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSBloomExtract.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSCopy.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSCopy.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSDownScale2x2.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSDownScale2x2.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSDownScale4x4.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSDownScale4x4.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSGaussianBlur5x5.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSGaussianBlur5x5.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSMerge.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSMerge.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSMonochrome.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSMonochrome.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSSepia.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_PSSepia.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_VSQuad.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/PostProcess_VSQuad.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_PSSkinnedPixelLighting.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_PSSkinnedPixelLighting.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_PSSkinnedVertexLighting.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_PSSkinnedVertexLighting.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_PSSkinnedVertexLightingNoFog.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_PSSkinnedVertexLightingNoFog.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightFourBones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightFourBones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightFourBonesBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightFourBonesBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightOneBone.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightOneBone.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightOneBoneBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightOneBoneBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightTwoBones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightTwoBones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightTwoBonesBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedOneLightTwoBonesBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingFourBones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingFourBones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingFourBonesBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingFourBonesBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingOneBone.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingOneBone.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingOneBoneBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingOneBoneBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingTwoBones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingTwoBones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingTwoBonesBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedPixelLightingTwoBonesBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingFourBones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingFourBones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingFourBonesBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingFourBonesBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingOneBone.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingOneBone.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingOneBoneBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingOneBoneBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingTwoBones.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingTwoBones.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingTwoBonesBn.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SkinnedEffect_VSSkinnedVertexLightingTwoBonesBn.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SpriteEffect_SpritePixelShader.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SpriteEffect_SpritePixelShader.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/SpriteEffect_SpriteVertexShader.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/SpriteEffect_SpriteVertexShader.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSACESFilmic.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSACESFilmic.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSACESFilmic_SRGB.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSACESFilmic_SRGB.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSCopy.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSCopy.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSHDR10.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSHDR10.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSReinhard.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSReinhard.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSReinhard_SRGB.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSReinhard_SRGB.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSSaturate.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSSaturate.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSSaturate_SRGB.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PSSaturate_SRGB.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PS_SRGB.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_PS_SRGB.pdb create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_VSQuad.inc create mode 100644 DirectXTK/Src/Shaders/Compiled/ToneMap_VSQuad.pdb create mode 100644 DirectXTK/Src/Shaders/DGSLEffect.fx create mode 100644 DirectXTK/Src/Shaders/DGSLLambert.hlsl create mode 100644 DirectXTK/Src/Shaders/DGSLPhong.hlsl create mode 100644 DirectXTK/Src/Shaders/DGSLUnlit.hlsl create mode 100644 DirectXTK/Src/Shaders/DualTextureEffect.fx create mode 100644 DirectXTK/Src/Shaders/EnvironmentMapEffect.fx create mode 100644 DirectXTK/Src/Shaders/Lighting.fxh create mode 100644 DirectXTK/Src/Shaders/NormalMapEffect.fx create mode 100644 DirectXTK/Src/Shaders/PostProcess.fx create mode 100644 DirectXTK/Src/Shaders/SkinnedEffect.fx create mode 100644 DirectXTK/Src/Shaders/SpriteEffect.fx create mode 100644 DirectXTK/Src/Shaders/Structures.fxh create mode 100644 DirectXTK/Src/Shaders/ToneMap.fx create mode 100644 DirectXTK/Src/Shaders/Utilities.fxh create mode 100644 DirectXTK/Src/SharedResourcePool.h create mode 100644 DirectXTK/Src/SimpleMath.cpp create mode 100644 DirectXTK/Src/SkinnedEffect.cpp create mode 100644 DirectXTK/Src/SpriteBatch.cpp create mode 100644 DirectXTK/Src/SpriteFont.cpp create mode 100644 DirectXTK/Src/TeapotData.inc create mode 100644 DirectXTK/Src/ToneMapPostProcess.cpp create mode 100644 DirectXTK/Src/VertexTypes.cpp create mode 100644 DirectXTK/Src/WICTextureLoader.cpp create mode 100644 DirectXTK/Src/XboxDDSTextureLoader.cpp create mode 100644 DirectXTK/Src/dds.h create mode 100644 DirectXTK/Src/pch.cpp create mode 100644 DirectXTK/Src/pch.h create mode 100644 DirectXTK/Src/vbo.h create mode 100644 DirectXTK/XWBTool/xwbtool.cpp create mode 100644 DirectXTK/XWBTool/xwbtool_Desktop_2013.vcxproj create mode 100644 DirectXTK/XWBTool/xwbtool_Desktop_2013.vcxproj.filters create mode 100644 DirectXTK/XWBTool/xwbtool_Desktop_2015.vcxproj create mode 100644 DirectXTK/XWBTool/xwbtool_Desktop_2015.vcxproj.filters create mode 100644 DirectXTK/XWBTool/xwbtool_Desktop_2017.vcxproj create mode 100644 DirectXTK/XWBTool/xwbtool_Desktop_2017.vcxproj.filters create mode 100644 Effects11/.gitattributes create mode 100644 Effects11/.gitignore create mode 100644 Effects11/Binary/EffectBinaryFormat.h create mode 100644 Effects11/Binary/EffectStateBase11.h create mode 100644 Effects11/Binary/EffectStates11.h create mode 100644 Effects11/Binary/SOParser.h create mode 100644 Effects11/Effect.h create mode 100644 Effects11/EffectAPI.cpp create mode 100644 Effects11/EffectLoad.cpp create mode 100644 Effects11/EffectLoad.h create mode 100644 Effects11/EffectNonRuntime.cpp create mode 100644 Effects11/EffectReflection.cpp create mode 100644 Effects11/EffectRuntime.cpp create mode 100644 Effects11/EffectVariable.inl create mode 100644 Effects11/Effects11_2013.sln create mode 100644 Effects11/Effects11_2013.vcxproj create mode 100644 Effects11/Effects11_2013.vcxproj.filters create mode 100644 Effects11/Effects11_2015.sln create mode 100644 Effects11/Effects11_2015.vcxproj create mode 100644 Effects11/Effects11_2015.vcxproj.filters create mode 100644 Effects11/Effects11_2015_Win10.sln create mode 100644 Effects11/Effects11_2015_Win10.vcxproj create mode 100644 Effects11/Effects11_2015_Win10.vcxproj.filters create mode 100644 Effects11/Effects11_2017.vcxproj create mode 100644 Effects11/Effects11_2017_Win10.sln create mode 100644 Effects11/Effects11_2017_Win10.vcxproj create mode 100644 Effects11/Effects11_2017_Win10.vcxproj.filters create mode 100644 Effects11/Effects11_Windows10.sln create mode 100644 Effects11/Effects11_Windows10.vcxproj create mode 100644 Effects11/Effects11_Windows10.vcxproj.filters create mode 100644 Effects11/Effects11_Windows81.sln create mode 100644 Effects11/Effects11_Windows81.vcxproj create mode 100644 Effects11/Effects11_Windows81.vcxproj.filters create mode 100644 Effects11/Effects11_WindowsPhone81.sln create mode 100644 Effects11/Effects11_WindowsPhone81.vcxproj create mode 100644 Effects11/Effects11_WindowsPhone81.vcxproj.filters create mode 100644 Effects11/Effects11_XboxOneXDK_2015.sln create mode 100644 Effects11/Effects11_XboxOneXDK_2015.vcxproj create mode 100644 Effects11/Effects11_XboxOneXDK_2015.vcxproj.filters create mode 100644 Effects11/IUnknownImp.h create mode 100644 Effects11/LICENSE create mode 100644 Effects11/ReadMe.txt create mode 100644 Effects11/d3dxGlobal.cpp create mode 100644 Effects11/inc/d3dx11effect.h create mode 100644 Effects11/inc/d3dxGlobal.h create mode 100644 Effects11/pchfx.h create mode 100644 Simulations/Demo_2013.vcxproj create mode 100644 Simulations/Demo_2015.vcxproj create mode 100644 Simulations/Demo_2017.vcxproj create mode 100644 Simulations/DrawingUtilitiesClass.h create mode 100644 Simulations/MassSpringSystemSimulator.h create mode 100644 Simulations/Simulator.h create mode 100644 Simulations/TemplateSimulator.cpp create mode 100644 Simulations/TemplateSimulator.h create mode 100644 Simulations/effect.fx create mode 100644 Simulations/main.cpp create mode 100644 Simulations/util/FFmpeg.cpp create mode 100644 Simulations/util/FFmpeg.h create mode 100644 Simulations/util/matrixbase.h create mode 100644 Simulations/util/quaternion.h create mode 100644 Simulations/util/timer.h create mode 100644 Simulations/util/util.cpp create mode 100644 Simulations/util/util.h create mode 100644 Simulations/util/vector4d.h create mode 100644 Simulations/util/vectorbase.h create mode 100644 SimulationsRunner/SimulationsRunner_2013.vcxproj create mode 100644 SimulationsRunner/SimulationsRunner_2015.vcxproj create mode 100644 SimulationsRunner/SimulationsRunner_2017.vcxproj create mode 100644 SimulatorTester/PublicMassSpringSystemTests.cpp create mode 100644 SimulatorTester/SimulatorTester_2013.vcxproj create mode 100644 SimulatorTester/SimulatorTester_2015.vcxproj create mode 100644 SimulatorTester/SimulatorTester_2017.vcxproj create mode 100644 Template_2013.sln create mode 100644 Template_2015.sln create mode 100644 Template_2017.sln create mode 100644 readme.txt diff --git a/AntTweakBar/.gitignore b/AntTweakBar/.gitignore new file mode 100644 index 0000000..fbb1c81 --- /dev/null +++ b/AntTweakBar/.gitignore @@ -0,0 +1,28 @@ +*.[oa] +*~ +*.ncb +*.sdf +*.suo +*.user +*.asp +*.pch +/src/debug32 +/src/debug64 +/src/release32 +/src/release64 +/src/ipch +/examples/debug32 +/examples/debug64 +/examples/tmp +/examples/bin32/*.exe +/examples/bin32/*.out +/examples/bin32/AntTweakBar.dll +/examples/bin64/*.exe +/examples/bin64/*.out +/examples/bin64/AntTweakBar64.dll +lib/debug +lib/*.lib +lib/*.dll +lib/*.exp +lib/*.so +lib/*.so.* diff --git a/AntTweakBar/AntTweakBar_Doc.url b/AntTweakBar/AntTweakBar_Doc.url new file mode 100644 index 0000000..3c8bd45 --- /dev/null +++ b/AntTweakBar/AntTweakBar_Doc.url @@ -0,0 +1,7 @@ +[InternetShortcut] +URL=http://anttweakbar.sourceforge.net/doc +Modified=C043A0DCA0FFC801E7 +HotKey=0 +IDList= +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,2 diff --git a/AntTweakBar/ChangeLog.txt b/AntTweakBar/ChangeLog.txt new file mode 100644 index 0000000..e34167a --- /dev/null +++ b/AntTweakBar/ChangeLog.txt @@ -0,0 +1,226 @@ +--- AntTweakBar library change log --- + +* Version 1.16 (2013/03/21) + + - Moved AntTweakBar documentation to sourceforge, available at: + http://anttweakbar.sourceforge.net/doc + - AntTweakBar source code repository is now on sourceforge too at: + http://sourceforge.net/projects/anttweakbar + - Fixed several issues with the core profile on OSX 10.8 (Thanks to + Christoph G., George P. and Robert H. for their help). + - Fixed unwanted repeated key pressed (Thanks to Alec J. for the patch). + - Added Visual Studio 2012 projects to the repository. + - Memory representation of std::string has changed again with Visual Studio + 2012. Handled it. + - Modified Linux and OSX Makefiles to build also static version of the library + in addition to dynamic library (Thanks to Luigi R.). + - Fonts can be scaled globally through the "fontscaling" parameter, may be + useful for high density display (Suggested by Eric RH.). + - Fixed compilation issue with different system locale (Reported by Arnaud M.) + +* Version 1.15 (2012/07/22) + + - Added support for OpenGL Core Profile (3.2 and higher); it is enabled by + setting the TwGraphAPI parameter of the TwInit function to TW_OPENGL_CORE + (Thanks to Oystein E. and Arnaud M. for their contribution). + - Added a simple example that uses OpenGL Core Profile and SDL; see + TwGLCoreSDL.c . + - Added helper function TwEventX11 to handle native X11 events (Thanks to + Greg P. for the code). + - Added builtin fixed-width font for tweak bars; it is enabled through + the fontstyle bar parameter; it is not resizable (Thanks to Jay D. for + the font). + - Store and restore states of OpenGL vertex attribute arrays (Thanks to + Jerry J. and Eduard B.). + - Fixed memory access violation caused by the popup bar (Thanks to Matthias R. + for reporting it). + - Added code to overcome issue caused by the memory representation change + of std::string that occurs between Visual Studio 2008 and 2010. + +* Version 1.14 (2011/03/26) + + - Added 64 bit version of the library. + - Added multiple windows support (Inspired by comments and code from Evan F. + and Ivo H.) + - Better MacOSX support (Thanks to Alexis DH., Fabrice N., Diederick H., + Alec J.). + - Improved readability of overlapped transparent bars. Content of overlapped + regions is clipped and not drawn. This behavior can be disabled using + the bar parameter "overlap". + - Added support for Direct3D11 (Thanks to Jorge H., Lukasz M., Se1zen). + - Added an example based on DirectX 11. + - Added support for SDL 1.3 integration in addition to SDL 1.2. + ABI modification: TwEventSDL takes SDL version as an additional parameter. + - Added support for SFML 1.6 integration. + - Added support for GLFW 2.7 integration in addition to GLFW 2.6. This may + imply changing the calling convention of event callbacks. Can be done by + defining GLFW_CDECL before including AntTweakBar.h if needed. + - Added function TwKeyTest that checks if a key event would be processed by + AntTweakBar but without processing it. Needed to fix bad handling report of + WM_KEYUP and WM_KEYDOWN in TwEventWin (Thanks to Ryan DB. for reporting it). + - Added check sign for vars of type boolean. + - Added new bar parameter "buttonalign" to center or left-align buttons + (Suggested by Michael R.). + - Allowed values column width to be adjusted to fit its content. This is done + by setting the bar parameter valueswidth=fit (Requested by Koshmaar and + Michael R.). The user can also click in the left or right area near the + value width slider to fit column content. + - Added new helper function TwDefineEnumFromString to ease the defining of an + enum through a string of comma-separated enum values (Thanks to Bruno L. + for the suggestion and code). + - Fixed compilation issues with gcc4 (missing includes, warnings). + - Fixes for the fedora package maintained by Sean Middleditch. + - Fixed rotation widget display and interaction issues when the library is + compiled with gcc -O3 (Thanks to Ares L. for reporting this). + - Fixed SDL key event SDLK_RETURN handling after a bar is minimized (Thanks + to Sean M. for reporting this). + - Fixed issue with SDL_ShowCursor (Thanks to Hugues M. for reporting it). + - Fixed DirectX10 resource issue. + - Store and restore GL_TEXTURE_COORD_ARRAY state (Thanks to Jerry J. for + reporting this). + - Fixed mouse click repetition issue with passive event loop (Thanks to + Bruno L. for reporting it). + - Fixed issue with mouse button event when glut windows doesn't have focus + (Thanks to Scott J. for the fix). + - Reset enum content each time the var parameter "enum" is set using TwDefine + or TwSetParam (Following Carsten W. and Sulaiman remarks). + - Fixed memory corruption when more than one std_string are defined in a + custom struct (Thanks to Sulaiman for reporting it). + - Fixed mouse position issue with Direct3D9 fullscreen mode in TwSimpleDX9 + (Thanks to Paolo S. for pointing this out). + - Fixed ignored double-click in TwEvenWin (Thanks to H. Seungho for this). + +* Version 1.13 (2009/04/19) + + - Now compiles on Mac OSX (Many thanks to Evan F. for rewriting the OS + specific code, and to Tyler S. and Konstantin L. for their feedback). + - Added functions TwGetBarCount, TwGetBarByIndex, TwGetBarByName, + TwRefreshBar. + - Fixed bug related to var of type TW_TYPE_STDSTRING on Windows: Microsoft + implementation of std::string does not have the same size in Debug and + Release mode (hidden member added for debugging), which caused a crash when + mixing the Release version of AntTweakBar with a program compiled in Debug + mode (Thanks to Minh D. for reporting it). + - Added function TwGetParam and TwSetParam to allow access to the parameters + defining the behavior of bars and variables. + - Changed the bar/var parameters without value (like "show"/"hide") to + parameters with value ("visible=true or false") to be compatible with the + new TwGetParam and TwSetParam functions (the old syntax is still kept + for backward compatibility). + - Arrow keys and Return key can now be used to navigate and tweak values. + - Bars can now be moved partly outside of the window. They can still be + constrained to be fully contained in the window by setting the parameter + "contained=true". + - Added another way to move a bar by pressing mouse middle button in the bar. + +* Version 1.12 (2008/09/27) + + - Added new var types TW_TYPE_QUAT* and TW_TYPE_DIR* allowing for the + interactive tweaking of rotations (through quaternions) and 3D vectors + (directions). + - Better management of transparent tweak bars. New bar parameters added: + alpha=n text=dark/light. + - Default color scheme changed (now transparent by default). To reactivate the + previous scheme, call TwDefine("GLOBAL colorscheme=0") before creating bars. + - Added paramters to manage the bar behavior: resizable, movable, iconifiable, + fontresizable, alwaystop, alwaysbottom, visible, iconified (following + Jeppe F. B. feedback). + - Added functions TwSetBottomBar and TwGetBottomBar. + - The library can now be recompiled without requiring to install GLUT, GLFW + and SDL. + - New var parameters arrow, arrowcolor, axisx, axusy, axisz and showval added + for quaternion and direction types. + - Msvc specific keyword removed from PrefTimer (thanks to Tim J. for pointing + this out). + - Fixed bug related to popup behavior when the help bar is visible. + - GL_TEXTURE_RECTANGLE_ARB/EXT state is now saved and restored by TwDraw + (thanks to Cyril C. for suggesting this). + - glBlendFunc and glBlendEquationEXT are now saved and restored by TwDraw + (thanks to Sebastion B. for reporting the problem). + - Fixed bug related cursor visibility state with SDL (Thanks to Jeppe F. B. + for reporting it). + +* Version 1.11 (2007/12/10) + + - Now DirectX10 is also supported in addition to OpenGL and DirectX9. + Initialization of AntTweakBar with DX10: TwInit(TW_DIRECT3D10, d3d10Device). + - A new example that uses DirectX10 has been added: see TwSimpleDX10 in the + examples directory. + - Recap for string variables added to the doc. See + http://anttweakbar.sourceforge.net/doc/tools:anttweakbar:varstring + - An example that illustrates the use of the different types of string + variables has been added. See TwString in the examples directory. + - Added some code for multi-thread safety (thanks to Daniel 'DrUiD' B. for + the tip). + - Cleanup of the Help bar. Now only variables having help are displayed in + the Help bar. + - Function TwHandleErrors documented. + - Separators don't require a name anymore. + - Var parameter 'order' becomes 'colororder', and its values become 'rgba' and + 'argb' (order=ogl and order=dx still exist but are deprecated). + - A small icon added for variables of type bool. + - Function TwCopyCDStringToLibrary added. + - The keyword 'GLOBAL' has been added for TwDefine commands that don't apply + to a specific tweak bar (suggested by Koshmaar). + - TwEventWin32 becomes TwEventWin (a #define has been added to keep + compatibility with previous applications). + - TwWindowSize(0,0) now releases graphics resources allocated by AntTweakBar + (may be useful for Direct3D applications, before resizing for instance). + - A wrong assert removed from TwMgr.cpp (thanks to Chris W. for reporting it). + - Some slight cosmetic changes (again). + +* Version 1.10 (2007/08/31) + + - Variable values can now also be entered and edited via keyboard input + (implementation based on modifications made by Laury M., thank you Laury). + - Variables of type string are now handled: 3 types of string added + TW_TYPE_CSSTRING, TW_TYPE_CDSTRING and TW_STDSTRING. + - Text selection and copy/paste added. + - Position of bar icons is modifiable (cf. TwBar paramters iconPos, iconAlign + and iconMargin). + - Separators can be added in a bar (TwAddSeparator). + - OpenGL: states related to 3D textures and multitexturing are now saved and + restored by TwDraw (thanks to Dylan D. for pointing this out). + - Selected element of a listbox now highlighted. + - ReadOnly and ReadWrite behavior of buttons revisited. + - Documentation improved (examples for TwType, new functions documented,...). + - Some slight cosmetic changes. + +* Version 1.05 (2007/03/01) + + - Listbox and rotoslider buttons added. + - Icon resources (AntTweakBar.rc) no more required for static linkage (thanks + to Joe C. for pointing this out). + - Fixed a rotoslider precision problem when mouse button is released. + +* Version 1.04 (2006/12/16) + + - OpenGL: Vertex buffer object state and Vertex/fragment program and object + states are now reset and restored by TwDraw (thanks to Dylan D. and Siva K. + for pointing this out). + - Fixed problem that occurs when an initialized variable of type float/double + is displayed. + +* Version 1.03 (2006/10/28) + + - Medium font antialiased. + - Now also compiles on 64 bits x86 platform (thanks to Herling G. for this). + - Slight changes to avoid visual 8 secure crt warnings. + - Corrected behaviour if min/max values are not defined. + - Modif to avoid looping to max value when reaching zero with unsigned types. + - Min/max/step parameters for type TW_TYPE_CHAR now read ascii codes (not + characters). + - Added FPU precision control (because DirectX changes it). + - Fixed problem that occurs when the lib is initialized/uninitialized more + than once (thanks Lukasz P. for reporting it). + - Distribution follows Savannah's recommendations. + +* Version 1.02 (2006/09/27) + + - Library sources released. + +* Version 1.01 (2006/09/14) + + - First official release. + + \ No newline at end of file diff --git a/AntTweakBar/Clean.bat b/AntTweakBar/Clean.bat new file mode 100644 index 0000000..3e0196e --- /dev/null +++ b/AntTweakBar/Clean.bat @@ -0,0 +1,23 @@ +RMDIR /S /Q src\debug32 +RMDIR /S /Q src\debug64 +RMDIR /S /Q src\release32 +RMDIR /S /Q src\release64 +RMDIR /S /Q src\ipch +CD src +DEL *.ncb *.aps *.o *.bak *.user *.sdf +DEL /A:h *.suo +CD .. +RMDIR /S /Q lib\debug +RMDIR /S /Q examples\debug32 +RMDIR /S /Q examples\debug64 +RMDIR /S /Q examples\tmp +DEL lib\*.exp +CD examples +DEL *.ncb *.aps *.o *.bak *.user *.sdf +DEL /A:h *.suo +DEL /S BuildLog.htm +CD .. + +PAUSE + + diff --git a/AntTweakBar/License.txt b/AntTweakBar/License.txt new file mode 100644 index 0000000..4f6d9ca --- /dev/null +++ b/AntTweakBar/License.txt @@ -0,0 +1,22 @@ +--- AntTweakBar license --- + +Copyright (C) 2005-2013 Philippe Decaudin + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the +use of this software. + +Permission is granted to anyone to use this software for any purpose, including +commercial applications, and to alter it and redistribute it freely, subject to +the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim +that you wrote the original software. If you use this software in a product, +an acknowledgment in the product documentation would be appreciated but is not +required. + +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + diff --git a/AntTweakBar/Readme.txt b/AntTweakBar/Readme.txt new file mode 100644 index 0000000..7d555e8 --- /dev/null +++ b/AntTweakBar/Readme.txt @@ -0,0 +1,15 @@ +AntTweakBar development library +------------------------------- + + +AntTweakBar is a small and easy-to-use C/C++ library that allows programmers +to quickly add a light and intuitive GUI into OpenGL and DirectX based +graphic programs to interactively tweak parameters. + +This package includes the development version of the AntTweakBar library +for Windows, GNU/Linux and OSX, and some program examples (sources + binaries). + +For installation and documentation please refer to: +http://anttweakbar.sourceforge.net/doc + + diff --git a/AntTweakBar/examples/Examples_VS2008.sln b/AntTweakBar/examples/Examples_VS2008.sln new file mode 100644 index 0000000..6f92d97 --- /dev/null +++ b/AntTweakBar/examples/Examples_VS2008.sln @@ -0,0 +1,123 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwCopyDLL", "TwCopyDLL.vcproj", "{AB180E0E-0EFA-4AD4-8F08-4492D144D963}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLFW", "TwSimpleGLFW.vcproj", "{29C096AF-172E-4A36-A1FE-E15B259D6834}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLUT", "TwSimpleGLUT.vcproj", "{CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleSDL", "TwSimpleSDL.vcproj", "{3B516919-D0DA-43CE-820E-8306368F605B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX9", "TwSimpleDX9.vcproj", "{6B414E54-701C-4ED3-9034-F5CD7BFC3451}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwAdvanced1", "TwAdvanced1.vcproj", "{008D1CEC-1586-4C89-B524-DF15D9605163}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwString", "TwString.vcproj", "{29C097AF-176E-4C36-A12E-E15B250D6835}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX10", "TwSimpleDX10.vcproj", "{6B412E54-70AC-40D3-903F-F5CD73FC3D51}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX11", "TwSimpleDX11.vcproj", "{6D417E54-50AC-40D3-913A-35CD73F93D51}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwDualGLUT", "TwDualGLUT.vcproj", "{DC6C7BF1-5AF3-295F-9385-C51E003A2856}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwGLCoreSDL", "TwGLCoreSDL.vcproj", "{3B5FCA22-D015-499E-8211-830ABC8F605B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleSFML", "TwSimpleSFML.vcproj", "{AA613E00-5339-4B87-9285-A53EFF3C9AB9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug|Win32.ActiveCfg = Debug|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug|Win32.Build.0 = Debug|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug|x64.ActiveCfg = Debug|x64 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug|x64.Build.0 = Debug|x64 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release|Win32.ActiveCfg = Release|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release|Win32.Build.0 = Release|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release|x64.ActiveCfg = Release|x64 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release|x64.Build.0 = Release|x64 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug|Win32.ActiveCfg = Debug|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug|Win32.Build.0 = Debug|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug|x64.ActiveCfg = Debug|x64 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release|Win32.ActiveCfg = Release|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release|Win32.Build.0 = Release|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release|x64.ActiveCfg = Release|x64 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug|Win32.ActiveCfg = Debug|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug|Win32.Build.0 = Debug|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug|x64.ActiveCfg = Debug|x64 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug|x64.Build.0 = Debug|x64 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release|Win32.ActiveCfg = Release|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release|Win32.Build.0 = Release|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release|x64.ActiveCfg = Release|x64 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release|x64.Build.0 = Release|x64 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug|Win32.Build.0 = Debug|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug|x64.ActiveCfg = Debug|x64 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release|Win32.ActiveCfg = Release|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release|Win32.Build.0 = Release|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release|x64.ActiveCfg = Release|x64 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug|Win32.ActiveCfg = Debug|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug|Win32.Build.0 = Debug|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug|x64.ActiveCfg = Debug|x64 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug|x64.Build.0 = Debug|x64 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release|Win32.ActiveCfg = Release|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release|Win32.Build.0 = Release|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release|x64.ActiveCfg = Release|x64 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release|x64.Build.0 = Release|x64 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug|Win32.ActiveCfg = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug|Win32.Build.0 = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug|x64.ActiveCfg = Debug|x64 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release|Win32.ActiveCfg = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release|Win32.Build.0 = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release|x64.ActiveCfg = Release|x64 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Debug|Win32.ActiveCfg = Debug|Win32 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Debug|Win32.Build.0 = Debug|Win32 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Debug|x64.ActiveCfg = Debug|x64 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Release|Win32.ActiveCfg = Release|Win32 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Release|Win32.Build.0 = Release|Win32 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Release|x64.ActiveCfg = Release|x64 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Debug|Win32.ActiveCfg = Debug|Win32 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Debug|Win32.Build.0 = Debug|Win32 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Debug|x64.ActiveCfg = Debug|x64 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Debug|x64.Build.0 = Debug|x64 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Release|Win32.ActiveCfg = Release|Win32 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Release|Win32.Build.0 = Release|Win32 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Release|x64.ActiveCfg = Release|x64 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Release|x64.Build.0 = Release|x64 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Debug|Win32.Build.0 = Debug|Win32 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Debug|x64.ActiveCfg = Debug|x64 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Debug|x64.Build.0 = Debug|x64 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Release|Win32.ActiveCfg = Release|Win32 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Release|Win32.Build.0 = Release|Win32 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Release|x64.ActiveCfg = Release|x64 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Release|x64.Build.0 = Release|x64 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Debug|Win32.ActiveCfg = Debug|Win32 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Debug|Win32.Build.0 = Debug|Win32 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Debug|x64.ActiveCfg = Debug|x64 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Debug|x64.Build.0 = Debug|x64 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Release|Win32.ActiveCfg = Release|Win32 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Release|Win32.Build.0 = Release|Win32 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Release|x64.ActiveCfg = Release|x64 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Release|x64.Build.0 = Release|x64 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Debug|Win32.Build.0 = Debug|Win32 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Debug|x64.ActiveCfg = Debug|x64 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Release|Win32.ActiveCfg = Release|Win32 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Release|Win32.Build.0 = Release|Win32 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Release|x64.ActiveCfg = Release|x64 + {AA613E00-5339-4B87-9285-A53EFF3C9AB9}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA613E00-5339-4B87-9285-A53EFF3C9AB9}.Debug|Win32.Build.0 = Debug|Win32 + {AA613E00-5339-4B87-9285-A53EFF3C9AB9}.Debug|x64.ActiveCfg = Debug|x64 + {AA613E00-5339-4B87-9285-A53EFF3C9AB9}.Release|Win32.ActiveCfg = Release|Win32 + {AA613E00-5339-4B87-9285-A53EFF3C9AB9}.Release|Win32.Build.0 = Release|Win32 + {AA613E00-5339-4B87-9285-A53EFF3C9AB9}.Release|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/AntTweakBar/examples/Examples_VS2012.sln b/AntTweakBar/examples/Examples_VS2012.sln new file mode 100644 index 0000000..61ed394 --- /dev/null +++ b/AntTweakBar/examples/Examples_VS2012.sln @@ -0,0 +1,115 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Desktop +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwCopyDLL", "TwCopyDLL.vcxproj", "{AB180E0E-0EFA-4AD4-8F08-4492D144D963}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLFW", "TwSimpleGLFW.vcxproj", "{29C096AF-172E-4A36-A1FE-E15B259D6834}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLUT", "TwSimpleGLUT.vcxproj", "{CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleSDL", "TwSimpleSDL.vcxproj", "{3B516919-D0DA-43CE-820E-8306368F605B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX9", "TwSimpleDX9.vcxproj", "{6B414E54-701C-4ED3-9034-F5CD7BFC3451}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwAdvanced1", "TwAdvanced1.vcxproj", "{008D1CEC-1586-4C89-B524-DF15D9605163}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwString", "TwString.vcxproj", "{29C097AF-176E-4C36-A12E-E15B250D6835}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX10", "TwSimpleDX10.vcxproj", "{6B412E54-70AC-40D3-903F-F5CD73FC3D51}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX11", "TwSimpleDX11.vcxproj", "{6D417E54-50AC-40D3-913A-35CD73F93D51}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwDualGLUT", "TwDualGLUT.vcxproj", "{DC6C7BF1-5AF3-295F-9385-C51E003A2856}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwGLCoreSDL", "TwGLCoreSDL.vcxproj", "{3B5FCA22-D015-499E-8211-830ABC8F605B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug|Win32.ActiveCfg = Debug|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug|Win32.Build.0 = Debug|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug|x64.ActiveCfg = Debug|x64 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug|x64.Build.0 = Debug|x64 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release|Win32.ActiveCfg = Release|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release|Win32.Build.0 = Release|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release|x64.ActiveCfg = Release|x64 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release|x64.Build.0 = Release|x64 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug|Win32.ActiveCfg = Debug|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug|Win32.Build.0 = Debug|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug|x64.ActiveCfg = Debug|x64 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release|Win32.ActiveCfg = Release|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release|Win32.Build.0 = Release|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release|x64.ActiveCfg = Release|x64 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug|Win32.ActiveCfg = Debug|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug|Win32.Build.0 = Debug|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug|x64.ActiveCfg = Debug|x64 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug|x64.Build.0 = Debug|x64 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release|Win32.ActiveCfg = Release|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release|Win32.Build.0 = Release|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release|x64.ActiveCfg = Release|x64 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release|x64.Build.0 = Release|x64 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug|Win32.Build.0 = Debug|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug|x64.ActiveCfg = Debug|x64 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release|Win32.ActiveCfg = Release|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release|Win32.Build.0 = Release|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release|x64.ActiveCfg = Release|x64 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug|Win32.ActiveCfg = Debug|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug|Win32.Build.0 = Debug|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug|x64.ActiveCfg = Debug|x64 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug|x64.Build.0 = Debug|x64 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release|Win32.ActiveCfg = Release|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release|Win32.Build.0 = Release|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release|x64.ActiveCfg = Release|x64 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release|x64.Build.0 = Release|x64 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug|Win32.ActiveCfg = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug|Win32.Build.0 = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug|x64.ActiveCfg = Debug|x64 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release|Win32.ActiveCfg = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release|Win32.Build.0 = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release|x64.ActiveCfg = Release|x64 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Debug|Win32.ActiveCfg = Debug|Win32 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Debug|Win32.Build.0 = Debug|Win32 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Debug|x64.ActiveCfg = Debug|x64 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Release|Win32.ActiveCfg = Release|Win32 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Release|Win32.Build.0 = Release|Win32 + {29C097AF-176E-4C36-A12E-E15B250D6835}.Release|x64.ActiveCfg = Release|x64 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Debug|Win32.ActiveCfg = Debug|Win32 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Debug|Win32.Build.0 = Debug|Win32 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Debug|x64.ActiveCfg = Debug|x64 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Debug|x64.Build.0 = Debug|x64 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Release|Win32.ActiveCfg = Release|Win32 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Release|Win32.Build.0 = Release|Win32 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Release|x64.ActiveCfg = Release|x64 + {6B412E54-70AC-40D3-903F-F5CD73FC3D51}.Release|x64.Build.0 = Release|x64 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Debug|Win32.Build.0 = Debug|Win32 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Debug|x64.ActiveCfg = Debug|x64 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Debug|x64.Build.0 = Debug|x64 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Release|Win32.ActiveCfg = Release|Win32 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Release|Win32.Build.0 = Release|Win32 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Release|x64.ActiveCfg = Release|x64 + {6D417E54-50AC-40D3-913A-35CD73F93D51}.Release|x64.Build.0 = Release|x64 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Debug|Win32.ActiveCfg = Debug|Win32 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Debug|Win32.Build.0 = Debug|Win32 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Debug|x64.ActiveCfg = Debug|x64 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Debug|x64.Build.0 = Debug|x64 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Release|Win32.ActiveCfg = Release|Win32 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Release|Win32.Build.0 = Release|Win32 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Release|x64.ActiveCfg = Release|x64 + {DC6C7BF1-5AF3-295F-9385-C51E003A2856}.Release|x64.Build.0 = Release|x64 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Debug|Win32.Build.0 = Debug|Win32 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Debug|x64.ActiveCfg = Debug|x64 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Release|Win32.ActiveCfg = Release|Win32 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Release|Win32.Build.0 = Release|Win32 + {3B5FCA22-D015-499E-8211-830ABC8F605B}.Release|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/AntTweakBar/examples/Makefile b/AntTweakBar/examples/Makefile new file mode 100644 index 0000000..f60d414 --- /dev/null +++ b/AntTweakBar/examples/Makefile @@ -0,0 +1,104 @@ +####### Compiler, tools and options + + +#---- Release +CXXCFG = -O3 +LFLAGS = -L../lib +OUT_DIR = bin64 +#---- Debug +#CXXCFG = -g -D_DEBUG +#LFLAGS = -Wl -L../lib/debug64 +#OUT_DIR = debug64 + + +CXX = g++ +CXXFLAGS = $(CXXCFG) -Wall -fno-strict-aliasing +INCPATH = -I../include -I/usr/local/include -I/usr/X11R6/include -I/usr/include +LIBS = -L/usr/X11R6/lib -lAntTweakBar -lGL -lGLU -lX11 -lXext -lXmu -lXrandr -lpthread -lm + +DEL_FILE = rm -f +DEL_DIR = rmdir +NO_STDERR = 2> /dev/null +EXP_SH = '\#!/bin/sh' +EXP_PATH = 'export LD_LIBRARY_PATH=`dirname $$0`/../../lib ; $$0.out' + +####### Files + + +SRC_FILES = TwSimpleGLFW.c TwSimpleGLUT.c TwSimpleSDL.c TwAdvanced1.cpp TwString.cpp TwDualGLUT.c + + +####### Build rules + + +#first: depend all +first: all + +all: Makefile $(SRC_FILES) + + @echo "===== Build TwSimpleGLUT ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleGLUT.c $(LFLAGS) -lglut $(LIBS) -o $(OUT_DIR)/TwSimpleGLUT.out + @echo $(EXP_SH) > $(OUT_DIR)/TwSimpleGLUT + @echo $(EXP_PATH) >> $(OUT_DIR)/TwSimpleGLUT + @chmod +x $(OUT_DIR)/TwSimpleGLUT + @echo "To execute the example, run " $(OUT_DIR)/TwSimpleGLUT + + @echo "===== Build TwSimpleSDL ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleSDL.c $(LFLAGS) -lSDL $(LIBS) -o $(OUT_DIR)/TwSimpleSDL.out + @echo $(EXP_SH) > $(OUT_DIR)/TwSimpleSDL + @echo $(EXP_PATH) >> $(OUT_DIR)/TwSimpleSDL + @chmod +x $(OUT_DIR)/TwSimpleSDL + @echo "To execute the example, run " $(OUT_DIR)/TwSimpleSDL + + @echo "===== Build TwSimpleGLFW ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleGLFW.c $(LFLAGS) -lglfw $(LIBS) -o $(OUT_DIR)/TwSimpleGLFW.out + @echo $(EXP_SH) > $(OUT_DIR)/TwSimpleGLFW + @echo $(EXP_PATH) >> $(OUT_DIR)/TwSimpleGLFW + @chmod +x $(OUT_DIR)/TwSimpleGLFW + @echo "To execute the example, run " $(OUT_DIR)/TwSimpleGLFW + + @echo "===== Build TwDualGLUT ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwDualGLUT.c $(LFLAGS) -lglut $(LIBS) -o $(OUT_DIR)/TwDualGLUT.out + @echo $(EXP_SH) > $(OUT_DIR)/TwDualGLUT + @echo $(EXP_PATH) >> $(OUT_DIR)/TwDualGLUT + @chmod +x $(OUT_DIR)/TwDualGLUT + @echo "To execute the example, run " $(OUT_DIR)/TwDualGLUT + + @echo "===== Build TwAdvanced1 ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwAdvanced1.cpp $(LFLAGS) -lglfw $(LIBS) -o $(OUT_DIR)/TwAdvanced1.out + @echo $(EXP_SH) > $(OUT_DIR)/TwAdvanced1 + @echo $(EXP_PATH) >> $(OUT_DIR)/TwAdvanced1 + @chmod +x $(OUT_DIR)/TwAdvanced1 + @echo "To execute the example, run " $(OUT_DIR)/TwAdvanced1 + + @echo "===== Build TwString ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwString.cpp $(LFLAGS) -lglut $(LIBS) -o $(OUT_DIR)/TwString.out + @echo $(EXP_SH) > $(OUT_DIR)/TwString + @echo $(EXP_PATH) >> $(OUT_DIR)/TwString + @chmod +x $(OUT_DIR)/TwString + @echo "To execute the example, run " $(OUT_DIR)/TwString + +# append dependencies to this Makefile +#depend: +# @echo "===== Make dependencies =====" +# makedepend -Y +# makedepend -a -Y -- $(CXXFLAGS) $(INCPATH) -- $(SRC_FILES) $(NO_STDERR) + + +# clean temporary files +clean: + @echo "===== Clean =====" + -$(DEL_FILE) *.o + -$(DEL_FILE) *~ core *.core *.stackdump + -$(DEL_FILE) debug64/* + -$(DEL_DIR) debug64 + + +####### DEPENDENCIES + +TwSimpleGLFW.o: ../include/AntTweakBar.h +TwSimpleGLUT.o: ../include/AntTweakBar.h +TwDualGLUT.o: ../include/AntTweakBar.h +TwSimpleSDL.o: ../include/AntTweakBar.h +TwAdvanced1.o: ../include/AntTweakBar.h +TwString.o: ../include/AntTweakBar.h diff --git a/AntTweakBar/examples/Makefile.osx b/AntTweakBar/examples/Makefile.osx new file mode 100644 index 0000000..260ca6d --- /dev/null +++ b/AntTweakBar/examples/Makefile.osx @@ -0,0 +1,100 @@ +####### Compiler, tools and options + + +#---- Release +CXXCFG = -O3 +LFLAGS = -L../lib +OUT_DIR = bin64 +#---- Debug +#CXXCFG = -g -D_DEBUG +#LFLAGS = -Wl -L../lib/debug64 +#OUT_DIR = debug64 + + +#BASE = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks +CXX = g++ +CXXFLAGS = $(CXXCFG) -Wall -fno-strict-aliasing -D_MACOSX +INCPATH = -I../include -I/usr/local/include -I/usr/X11R6/include -I/usr/include +#-I$(BASE)/OpenGL.framework/Headers/ -I$(BASE)/AppKit.framework/Headers/ + +LIBS = ../lib/libAntTweakBar.dylib -lpthread -lm -framework AppKit -framework OpenGL + +DEL_FILE = rm -f +DEL_DIR = rmdir +NO_STDERR = 2> /dev/null +EXP_PATH = 'export DYLD_LIBRARY_PATH=`dirname $$0`/../../lib ; $$0.out' + + +####### Files + + +SRC_FILES = TwSimpleGLUT.c TwSimpleSDL.c TwSimpleGLFW.c TwAdvanced1.cpp TwString.cpp TwDualGLUT.c TwGLCoreSDL.c + + +####### Build rules + + +#first: depend all +first: all + +all: Makefile $(SRC_FILES) + + @echo "===== Build TwSimpleGLUT ====" + $(CXX) $(CXXFLAGS) $(INCPATH) -I$(BASE)/GLUT.framework/Headers/ TwSimpleGLUT.c $(LFLAGS) $(LIBS) -framework GLUT -o $(OUT_DIR)/TwSimpleGLUT.out + @echo $(EXP_PATH) > $(OUT_DIR)/TwSimpleGLUT + @chmod +x $(OUT_DIR)/TwSimpleGLUT + @echo "To execute the example, run " $(OUT_DIR)/TwSimpleGLUT + + @echo "===== Build TwDualGLUT ====" + $(CXX) $(CXXFLAGS) $(INCPATH) -I$(BASE)/GLUT.framework/Headers/ TwDualGLUT.c $(LFLAGS) $(LIBS) -framework GLUT -o $(OUT_DIR)/TwDualGLUT.out + @echo $(EXP_PATH) > $(OUT_DIR)/TwDualGLUT + @chmod +x $(OUT_DIR)/TwDualGLUT + @echo "To execute the example, run " $(OUT_DIR)/TwDualGLUT + + @echo "===== Build TwString ====" + $(CXX) $(CXXFLAGS) $(INCPATH) -I$(BASE)/GLUT.framework/Headers/ TwString.cpp $(LFLAGS) $(LIBS) -framework GLUT -o $(OUT_DIR)/TwString.out + @echo $(EXP_PATH) > $(OUT_DIR)/TwString + @chmod +x $(OUT_DIR)/TwString + @echo "To execute the example, run " $(OUT_DIR)/TwString + +# @echo "===== Build TwSimpleSDL ====" +# $(CXX) $(CXXFLAGS) $(INCPATH) -I$(BASE)/SDL.framework/Headers/ TwSimpleSDL.c $(LFLAGS) -framework SDL $(LIBS) -o $(OUT_DIR)/TwSimpleSDL.out +# @echo $(EXP_PATH) > $(OUT_DIR)/TwSimpleSDL +# @chmod +x $(OUT_DIR)/TwSimpleSDL + +# @echo "===== Build TwSimpleGLFW ====" +# $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleGLFW.c $(LFLAGS) -lglfw -framework AGL -framework Carbon $(LIBS) -o $(OUT_DIR)/TwSimpleGLFW.out +# @echo $(EXP_PATH) > $(OUT_DIR)/TwSimpleGLFW +# @chmod +x $(OUT_DIR)/TwSimpleGLFW + +# @echo "===== Build TwAdvanced1 ====" +# $(CXX) $(CXXFLAGS) $(INCPATH) TwAdvanced1.cpp $(LFLAGS) -lglfw -framework AGL -framework Carbon $(LIBS) -o $(OUT_DIR)/TwAdvanced1.out +# @echo $(EXP_PATH) > $(OUT_DIR)/TwAdvanced1 +# @chmod +x $(OUT_DIR)/TwSimpleAdvanced1 + + +# append dependencies to this Makefile +#depend: +# @echo "===== Make dependencies =====" +# makedepend -Y +# makedepend -a -Y -- $(CXXFLAGS) $(INCPATH) -- $(SRC_FILES) $(NO_STDERR) + + +# clean temporary files +clean: + @echo "===== Clean =====" + -$(DEL_FILE) *.o + -$(DEL_FILE) *~ core *.core *.stackdump + -$(DEL_FILE) debug64/* + -$(DEL_DIR) debug64 + + +####### DEPENDENCIES + +TwSimpleGLFW.o: ../include/AntTweakBar.h +TwSimpleGLUT.o: ../include/AntTweakBar.h +TwDualGLUT.o: ../include/AntTweakBar.h +TwSimpleSDL.o: ../include/AntTweakBar.h +TwAdvanced1.o: ../include/AntTweakBar.h +TwString.o: ../include/AntTweakBar.h +TwGLCoreSDL.o: ../include/AntTweakBar.h diff --git a/AntTweakBar/examples/Readme.txt b/AntTweakBar/examples/Readme.txt new file mode 100644 index 0000000..64362ef --- /dev/null +++ b/AntTweakBar/examples/Readme.txt @@ -0,0 +1,26 @@ +Compiled versions of the examples for 32-bit and 64-bit systems can be found in +the examples/bin32 and examples/bin64 directories. + +Under GNU/Linux and OSX, you may need to rebuild the library and the examples. +To do so, under GNU/Linux, open a terminal, go in the src directory and type +make, then go in the examples directory and type make. Under OSX do the same +but type make -f Makefile.osx instead of make. + +To recompile the examples you also need the following external libraries +(for convenience Windows versions are included in the examples directory). + +- GLFW : http://www.glfw.org + +- GLUT : http://opengl.org/resources/libraries/glut + the windows version can be found at + http://www.xmission.com/~nate/glut.html + +- SDL : http://www.libsdl.org + +- SFML : http://www.sfml-dev.org + +- DirectX SDK if you want to recompile the Windows library & DX examples + http://msdn.microsoft.com/directx + The path to the DirectX shader compiler fxc.exe (included in the DirectX SDK) + must be listed in the VC++ directories. + diff --git a/AntTweakBar/examples/SDL-1.3.lib b/AntTweakBar/examples/SDL-1.3.lib new file mode 100644 index 0000000000000000000000000000000000000000..004e0759366d234f1074ae54accaeece04515f9f GIT binary patch literal 84550 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 D`l($F literal 0 HcmV?d00001 diff --git a/AntTweakBar/examples/TwAdvanced1.cpp b/AntTweakBar/examples/TwAdvanced1.cpp new file mode 100644 index 0000000..6d12cfb --- /dev/null +++ b/AntTweakBar/examples/TwAdvanced1.cpp @@ -0,0 +1,737 @@ +// --------------------------------------------------------------------------- +// +// @file TwAdvanced1.cpp +// @brief An example showing many features of AntTweakBar, +// including variable accessed by callbacks and +// the definition of a custom structure type. +// It also uses OpenGL and GLFW windowing system +// but could be easily adapted to other frameworks. +// +// AntTweakBar: http://anttweakbar.sourceforge.net/doc +// OpenGL: http://www.opengl.org +// GLFW: http://www.glfw.org +// +// +// This example draws a simple scene that can be re-tesselated +// interactively, and illuminated dynamically by an adjustable +// number of moving lights. +// +// +// @author Philippe Decaudin +// @date 2006/05/20 +// +// --------------------------------------------------------------------------- + +#include + +#define GLFW_DLL // use GLFW as a dynamically linked library +#include "glfw.h" + +#include +#include +#include +#include +#if !defined(_WIN32) && !defined(_WIN64) +# define _snprintf snprintf +#endif + +const float FLOAT_2PI = 6.283185307f; // 2*PI + + +// Light structure: embeds light parameters +struct Light +{ + bool Active; // light On or Off + float Pos[4]; // light position (in homogeneous coordinates, ie. Pos[4]=1) + float Color[4]; // light color (no alpha, ie. Color[4]=1) + float Radius; // radius of the light influence area + float Dist0, Angle0, Height0, Speed0; // light initial cylindrical coordinates and speed + char Name[4]; // light short name (will be named "1", "2", "3",...) + enum AnimMode { ANIM_FIXED, ANIM_BOUNCE, ANIM_ROTATE, ANIM_COMBINED }; + AnimMode Animation; // light animation mode +}; + + +// Class that describes the scene and its methods +class Scene +{ +public: + bool Wireframe; // draw scene in wireframe or filled + int Subdiv; // number of subdivisions used to tessellate the scene + int NumLights; // number of dynamic lights + float BgColor0[3], BgColor1[3]; // top and bottom background colors + float Ambient; // scene ambient factor + float Reflection; // ground plane reflection factor (0=no reflection, 1=full reflection) + double RotYAngle; // rotation angle of the scene around its Y axis (in degree) + enum RotMode { ROT_OFF, ROT_CW, ROT_CCW }; + RotMode Rotation; // scene rotation mode (off, clockwise, counter-clockwise) + + Scene(); // constructor + ~Scene(); // destructor + void Init(bool changeLightPos); // (re)initialize the scene + void Draw() const; // draw scene + void Update(double time); // move lights + +private: + void CreateBar(); // create a tweak bar for lights + + // Some drawing subroutines + void DrawSubdivPlaneY(float xMin, float xMax, float y, float zMin, float zMax, int xSubdiv, int zSubdiv) const; + void DrawSubdivCylinderY(float xCenter, float yBottom, float zCenter, float height, float radiusBottom, float radiusTop, int sideSubdiv, int ySubdiv) const; + void DrawSubdivHaloZ(float x, float y, float z, float radius, int subdiv) const; + void DrawHalos(bool reflected) const; + + GLuint objList, groundList, haloList; // OpenGL display list IDs + int maxLights; // maximum number of dynamic lights allowed by the graphic card + Light * lights; // array of lights + TwBar * lightsBar; // pointer to the tweak bar for lights created by CreateBar() +}; + + +// Constructor +Scene::Scene() +{ + // Set scene members. + // The scene will be created by Scene::Init( ) + Wireframe = false; + Subdiv = 20; + NumLights = 0; + BgColor0[0] = 0.9f; + BgColor0[1] = 0.0f; + BgColor0[2] = 0.0f; + BgColor1[0] = 0.3f; + BgColor1[1] = 0.0f; + BgColor1[2] = 0.0f; + Ambient = 0.2f; + Reflection = 0.5f; + RotYAngle = 0; + Rotation = ROT_CCW; + objList = 0; + groundList = 0; + haloList = 0; + maxLights = 0; + lights = NULL; + lightsBar = NULL; +} + + +// Destructor +Scene::~Scene() +{ + // delete all lights + if( lights ) + delete[] lights; +} + + +// Create the scene, and (re)initialize lights if changeLights is true +void Scene::Init(bool changeLights) +{ + // Get the max number of lights allowed by the graphic card + glGetIntegerv(GL_MAX_LIGHTS, &maxLights); + if( maxLights>16 ) + maxLights = 16; + + // Create the lights array + if( lights==NULL && maxLights>0 ) + { + lights = new Light[maxLights]; + NumLights = 3; // default number of lights + if( NumLights>maxLights ) + NumLights = maxLights; + changeLights = true; // force lights initialization + + // Create a tweak bar for lights + CreateBar(); + } + + // (Re)initialize lights if needed (uses random values) + if( changeLights ) + for(int i=0; ilights[i].Color[1]) ? 1.0f-lights[i].Color[1] : 1.0f-lights[i].Color[0]; + lights[i].Color[3] = 1; + lights[i].Active = true; + } + + // Initialize some OpenGL states + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + glEnable(GL_NORMALIZE); + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + + // Create objects display list using the current Subdiv parameter to control the tesselation + if( objList>0 ) + glDeleteLists(objList, 1); // delete previously created display list + objList = glGenLists(1); + glNewList(objList, GL_COMPILE); + DrawSubdivCylinderY(-0.9f, 0, -0.9f, 1.4f, 0.15f, 0.12f, Subdiv/2+8, Subdiv); + DrawSubdivCylinderY(+0.9f, 0, -0.9f, 1.4f, 0.15f, 0.12f, Subdiv/2+8, Subdiv); + DrawSubdivCylinderY(+0.9f, 0, +0.9f, 1.4f, 0.15f, 0.12f, Subdiv/2+8, Subdiv); + DrawSubdivCylinderY(-0.9f, 0, +0.9f, 1.4f, 0.15f, 0.12f, Subdiv/2+8, Subdiv); + DrawSubdivCylinderY(0, 0, 0, 0.4f, 0.5f, 0.3f, Subdiv+16, Subdiv/8+1); + DrawSubdivCylinderY(0, 0.4f, 0, 0.05f, 0.3f, 0.0f, Subdiv+16, Subdiv/16+1); + glEndList(); + + // Create ground display list + if( groundList>0 ) + glDeleteLists(groundList, 1); // delete previously created display list + groundList = glGenLists(1); + glNewList(groundList, GL_COMPILE); + DrawSubdivPlaneY(-1.2f, 1.2f, 0, -1.2f, 1.2f, (3*Subdiv)/2, (3*Subdiv)/2); + glEndList(); + + // Create display list to draw light halos + if( haloList>0 ) + glDeleteLists(haloList, 1); // delete previously created display list + haloList = glGenLists(1); + glNewList(haloList, GL_COMPILE); + DrawSubdivHaloZ(0, 0, 0, 1, 32); + glEndList(); +} + + +// Callback function associated to the 'Change lights' button of the lights tweak bar. +void TW_CALL ReinitCB(void *clientData) +{ + Scene *scene = static_cast(clientData); // scene pointer is stored in clientData + scene->Init(true); // re-initialize the scene +} + + +// Create a tweak bar for lights. +// New enum type and struct type are defined and used by this bar. +void Scene::CreateBar() +{ + // Create a new tweak bar and change its label, position and transparency + lightsBar = TwNewBar("Lights"); + TwDefine(" Lights label='Lights TweakBar' position='580 16' alpha=0 help='Use this bar to edit the lights in the scene.' "); + + // Add a variable of type int to control the number of lights + TwAddVarRW(lightsBar, "NumLights", TW_TYPE_INT32, &NumLights, + " label='Number of lights' keyIncr=l keyDecr=L help='Changes the number of lights in the scene.' "); + + // Set the NumLights min value (=0) and max value (depends on the user graphic card) + int zero = 0; + TwSetParam(lightsBar, "NumLights", "min", TW_PARAM_INT32, 1, &zero); + TwSetParam(lightsBar, "NumLights", "max", TW_PARAM_INT32, 1, &maxLights); + // Note, TwDefine could also have been used for that pupose like this: + // char def[256]; + // _snprintf(def, 255, "Lights/NumLights min=0 max=%d", maxLights); + // TwDefine(def); // min and max are defined using a definition string + + + // Add a button to re-initialize the lights; this button calls the ReinitCB callback function + TwAddButton(lightsBar, "Reinit", ReinitCB, this, + " label='Change lights' key=c help='Random changes of lights parameters.' "); + + // Define a new enum type for the tweak bar + TwEnumVal modeEV[] = // array used to describe the Scene::AnimMode enum values + { + { Light::ANIM_FIXED, "Fixed" }, + { Light::ANIM_BOUNCE, "Bounce" }, + { Light::ANIM_ROTATE, "Rotate" }, + { Light::ANIM_COMBINED, "Combined" } + }; + TwType modeType = TwDefineEnum("Mode", modeEV, 4); // create a new TwType associated to the enum defined by the modeEV array + + // Define a new struct type: light variables are embedded in this structure + TwStructMember lightMembers[] = // array used to describe tweakable variables of the Light structure + { + { "Active", TW_TYPE_BOOLCPP, offsetof(Light, Active), " help='Enable/disable the light.' " }, // Light::Active is a C++ boolean value + { "Color", TW_TYPE_COLOR4F, offsetof(Light, Color), " noalpha help='Light color.' " }, // Light::Color is represented by 4 floats, but alpha channel should be ignored + { "Radius", TW_TYPE_FLOAT, offsetof(Light, Radius), " min=0 max=4 step=0.02 help='Light radius.' " }, + { "Animation", modeType, offsetof(Light, Animation), " help='Change the animation mode.' " }, // use the enum 'modeType' created before to tweak the Light::Animation variable + { "Speed", TW_TYPE_FLOAT, offsetof(Light, Speed0), " readonly=true help='Light moving speed.' " } // Light::Speed is made read-only + }; + TwType lightType = TwDefineStruct("Light", lightMembers, 5, sizeof(Light), NULL, NULL); // create a new TwType associated to the struct defined by the lightMembers array + + // Use the newly created 'lightType' to add variables associated with lights + for(int i=0; il_ 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�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 EFL#+cqW}N^ literal 0 HcmV?d00001 diff --git a/AntTweakBar/examples/bin32/SDL.dll b/AntTweakBar/examples/bin32/SDL.dll new file mode 100644 index 0000000000000000000000000000000000000000..00822b7ed9e3dadd5a87d5c0c13e89c772497df0 GIT binary patch literal 237568 zcmeEv4PaE&mH(T0lVnH+-wO;d=(LW_;6{>aG_egPY63|ZgoFtp6Ho|rOQ#Vniq814 zMNB%0%)IL$+D~@duC{i!+y1*~*S1t!$t0KnY9)yvAATTKoyh=xwIO`Y|99@4nN0ZB zV%zNoeVO;}=eg&ed+xdCo_lWfjcX)Xk|YD3SWJ@E8VjK zUb0>{>%~jvHr;%u?e;rv`|2HE`kL*_Us|^8HjnL}zhb+?yUcd;GF!#$I@{N7Tk@65 zM~}|5$BW)}{gc0cxbckxiD%5zo&(>;_wn*=2foFBcOUpBe!t=R2LGK?yWzkZp8oX% zqwqTh;ormWbN9V>;HUU?&D+W2m#y5*f9Kr%bXK>SG|`unRzy6_y#PDPmxFEc^<1k z#PAY6~q`Vv$ z=wl*!9FN{U(4q5Whx5^Lp4%=m^Y@&tpQ?y^A|qb1{k>rYHx7hsh<@0e$odA4=1pU> z?1r|@-n8G6vPTpaN^Nr!g@?Zo<1LLWL&JvSW4(%QP07%e=0IaI3ftphkJ4vKyf)Wv z&_+|BZ=bofw@zDNw|UaFP-bT|UF#g!`nk|GAuqDu3Np z?STrru?vq5FDCz7`zZXX{ss0-{F?Dt9((^mq9D%&!C7`=ZEP#=AkUcKT)XjEqNF+D z%>f+<&@j-c_l(vm?6%f+blKyNp;x;ad9|r6^zBpY*{ya9t2Cj|^m<-kczcOnV%24V zwkJ>`t1J!7vYQAHR#|~mpDAp2`|fiXS^Yfa+wG3PT)SmbGZG?&A*vR(Yn6rc$|{Qq zVAl3M#MQAMJdU5XcBPdF-qldTzrCMDS*)@sXlNGyhxW*858jvW3{NZ7OHo68tez@G zb5O6sD(6xG8&DA25gm(23)?|)yS?e6e6&|Zm)qHqzyiBj+rfIYBdjyDM|HDKjC^w_ zqW|dUY>V$r`J&ZX{Gawd7L1Wtfgh95bkyTo6 z8p3~J`$FGFK~=Sn%>|7hDlPmZ7z+bw)YTX6cQv%NKUNIV>_&qDyX09+nE58&o}pm& z5tDtJV+_5)4uAOH2YY7JqG8tBIk9msfb;n_qPM-H*x1+{FgLHlstmp^LnV71A6-!= zGyH-ISt`YxCICx4A1wq7U);dUKFE|%O>0nE zIP@=^E=Ayvsac*YnTglLvI8n_D0A2`S}$adT>OmfF0*ePCyAKuvRrArq%LY)h`}>I zIpR3$VGsO2G#mhp4qK<_rIH7TY&|M_fV#DjXfg8m7xWS_tP|7kL%*IX{ZsMu3G`25 zD$m-$R@l|x>{#s_S8UuSfy%Cm>tYyOiyAwVY#}+s>ey$frS-11-3?ybQZ@YbLvg06 zJa`dUxrlDtt+bA&FW;l0A>*1#F9FI{-^)=3?u&Nc)QN#=W|f4}aZP55Up73RhF-eE zH<+fZ`XvTg;bzVMJBy^o?7^q-6Lwxrvr526Sn*!iG)SG2FG>hkpmx;3C%O9YJNODt z%l|EO!xH;58~o@e!8WzfZdO;&P)m_>oItFz))ihjkpQ-0N*o=|PHCj?I!S58 zToPknGqJkG%DQcH0=LWyF9VC90W^*HR+|Iy;oX1<4gAx6!(b6)-P!d22+r@_&EpaX zTyq3;|3h>jq!av?BrX2JMiY4zwu2>&XAe`KwDo#S>|xH@dcmH{l0${3PtbEF*nuJ7 zr)0wtB;vF9Nc0$-v7Vv9h7wZZF+@*}2Zcut#$w4l5Vbf18&FzTp)N5}yB{Dx=^w^y z)>3fZ%IkU8i4lvyQO_i@+byKvPh;!8d61q<58PVAjFk=1^EJ?Dg%r*v)E<%DRri zUadAAzkzboFnnREFxIgSnnO*KEX}CyS|k28C=Y!R0MOE5j2xrxp z)hsQ0sZZGlEr;oMt#`U_uPk?j2K7qoE=n}`%UEH1;co3qdTokUE^G63a_6-qudK}Q zkN3NDQKP>~7aBDB(|sZEZ~biV)(EC~X{eZQ4l731?$v4KdTruK#iUayRl1>KZlsKr z7QneSuY-NiGpMvq=Vbw)UaefGWy>Ac0upIuT3323swWWiRkOW&BDRxrj;5fk%CqG< z<=H86w{P%%%5{I#(e5t<)Tg-G}dHd`rM%Ime?8 zlOWnL+xtXxL81oFoJ8re=F%rhze|VWKYK#yOXr1`50wtg5?bq>J%dvN zz;Z{R-pMN3a%nVRTv}?m7-j?mI7vRI^^1vh)(cvr*~rWZPI<@Tu&Wc zD}ylnE*TUOIt)_tyY#-035crpz7ko6^ur2RI8?xwblP%RLjfQTWQynKWepYZc}m}4 z;jkR+Colyl>;t8h_$%wzvN5Zb>p<{CpXng;YHu`xHO6W4?WDMVA~!9YU>~2zwlDH5 zqT|{X){Z&Wf1szWmbPR=}AauQj&9jl50WeR7sRQ1IX|S`j(+MTkJ+v_b;YsZnslP$PW2s8bV(Q4q=D(-6sQ5XrPe zNuF!thy*IK6Z~em43e3Tk;F;E7c$Z?>@uVh$ZYRsP9Ue}Eg5wu^A!>UI8SjkA5j~; z`K;W+YSmz=K3FsrJgR5VQ|e|7$9?bVeFqEhTXdT%6}!)h(8Ty5(O7O6pl z(=(PG)?6`PSYI>SuWIA{PM!BXDsH(`Zm$a9r7N%;B-$cKlrLRDq9<@TnoqGNWgT^# z!__CJ)5{<>Dy_dJx}oWm6A-bt71%3BBkb|X6xGa7gGIVvX*t^@zZ9P^lr~x!C0IJ< zGRhQ2i-^_vA|?$}#}~9JaCjXXbhBM<)*XPz>Fx=;d!lkD+m*M&U#r8C(u!_)9WYw_ z6X`8)&=3ANU(a5lFMn+stsMRH4TZb?wHey$Zno7O>Ni%SEVF-py1#sszZP>%mcKUB z`;ABk3Bt)4|0#S82T9iM(rHzCZTx9L${q&Me43LuNP7Q#IRTPEfRsicrJo2=hQHkC zuN~zt&-B-30i-Jkhzcy99TrvwG#Z0u2Mfs^ZJU+Wu@rYma~;=eV!i`90VEk#r4AyTU$JdA6Nq$sNkG2*w*!D`R_(^bG2EV3j|{uS1Va?ws5=+h4Bd zyjZ%GRi5FmrJ0bu;xA8!N&*yvU^haDMy&o?v;n@Ul~(tJNjI({u3B2~GiC1_#eD9K1CD zd^BQ|e|{#YSb#_Ux=0N3s-U?HgS^%fALkHXFdK0U_%^CQoDq5?Lu?N|k}@>v$9OlL zJl;2=8zSX)4d;L1*?-lSt3^DW)^(SIL%{11)v1zE4r+fb`x;)Wsp06fGy{J;wR&w_HSzhJDGuJp@ zH&kW3>=UbuL*o56!gPGZq)d#BG&3%2YrlyP80ZL1sRJgt=tO3N>x7Bd+`wnv8ce<5 zyt*!^VBSAX1sIPLXvon(Y}tDdD>&a4J~Cr_#E?8|`D$00?u_MMIK2FpEh@xDY74J| zFO*4>W@67Zuo`t}J;DxobmgpyRz{FIvNVXqdjEv!4)32uAan8MQWY(iT#zFkAUQ&9 zdHdbl(1;g}^{#}>o8&FDz!$O&)d%?o^?5Ig3$k2{O|9{ByvF7an;rhz z03ZnSXO|NoE-q*%YaiY6k<<+Jlc<`DGD5!yAZuvljE10d25A+f^Jim~$yb-?oD&Ml z2HH(6ACQ1u8!s&03V|=Kb!5{a>8n8#iDqnD%U)W3`wkmDpZ6VBz1ND`zM$0}_eHp@ z<{wX$g4bn3R^+d;_s!@y;>cQUYzC%V2a+I?#55`zV%pRIUQ$;Q^~sgQxx+Jq;90sh zIj$CIwMTssgYSTmDiknbQAj|^SXdGWw3PC@(rB&dO6S2D-p$cVMVl@@OPkIec+kVy z@u{@7aKvJ+c^WThM`Drlb9`#GgJ4L$1L~>U0U)FJ$R@e|_jobZy053D4ogT5g5IoWfQIC+t%O^ar} z5~MjezEV%>3|NQKdYt3sPY_3Z2P_{CFA#?bF{Au0ASToA0%EfKE{r*j7tjRo0-69` zKq?Bym&)-48V0_`aD0u`s2DRZW*jdDWQJlUC~aSX02TdGLcI{zEp&KhYqf_VX!;JA z&JHd>K`#Q73=RsQ1t@?PT?c5<(^=jp&k5CB-8R{>h`kkVFLGqrdRKJnxKSZ3Q z_Ano{M=)x!_;i4sTrv#Yv8Mp{9O2@~IbnRBfS*|epGQ=v(30QaaZ`mV!S?}&??VpX zN5oZX|HMb)pZQ1};C*-yedy~lI>1^!KdhM-pQV`}qYY=k?_GQlt;1j$(s+dq>k}F; z3?y2l5-1jGQG~aspSLK=TeOe2Xg_b!0p6nbI90yS#}F_8sssi=mB2ujugm1{J{g@l zR9VWP_2f}KCaMP*LeBz2;K#raFgM8SL64{Ty3!rqZ6BlgYalKgm_xPD6K@6D^kJV3PsrD!zF}!UKuiB!|@1yV!>fh3^-}V0l17 z#FW6j&cMC7-Q`wrA}MgMt-IVVN$+3p8QY9`@Ph90+{Ke66$*zcT7i66_&)MAV<&J7 zg1Rf7%zgi|Wb9R2J$Frtp-_xHPYrs;lY1=*D&EDc9BEr}ZIrgw`C7ScYM|E1YOQi_ zpw{|od$cs3pgs3A2`-8!Xr>a%sf1TY-`=ZN%L4eAZ-c08g|L`=O{dcO9@#4lJ1>^I(#XB9wxd)k9F2su zWMzHqfDkcS-i`q%d4Ea&{a*k~`gWdb#ghae$MbS4!8j0DE;1f?wS6cH3SGISG~HX< zd_;fu#c=@ItwV@e6GzMw`sn8bkfJ%##Y1Tl$kRIGFmeF5$HChR95&yZc7t!r@u}X5 z4bBTCb!+&V&O4?6F$5|l=J@2DDY}ApX}kcG*^*j@CsY`NcGR~1;@d14KNQ0fj8x@=A~G5}oE9IxC5M&POhD4|4q>Y#8mx+~T!x)kwv8Q8R(%dJF?-wN zSEEq?C;IQNrBS1vX}(;d9ehsC(XYn?r7Kbb-SNOjQv++`fr|@LQkGI}ee9UB>M1~g z+J1-Ho_PWTB0Bb&vON5lo{{qLllF}Ic}aaO%?}8uax7LQ-kxC5^#}LzH`agfozVWY zP=8vGvfQeyL!MV>*nl^p)N<=oARSBXs-SxrG*cRBa~ zhT(WtRnYv-@xXX=z5_-?O6#{M*y7u(Yd);gWbbvY;MvU-Hm+i$tg;(&Stt}9<=dl! zkbTR+ZsJ)UBZXy(um*%lI>|FN6v>Jf|5WFx8kW-}QeByvbF>KiOgyJC6uH3nrjCVB z!>BsfoY8jqp2_#F?!R~iV_}BTe2+cm&0r2IxUKAaNsp#smlOFeZi{)r zqb%Lho++Tms)CXNa6JdQ$axLOqn_tA81Kw(aE0&7MC)7y>;_9f7cJJx(n@un&)qey z)NnV&J`_lay%4L?ZlWbAItFoHz6f!s651fWKrE{C6-(ZUwc!TnCz_gRcKF3Sj&^R~ z(8_w? zGtJV#Evmo{4wQ5UZndje(wn`;gK}CKV4GMM{`Wt{0l3dtxStY44FM0#v`8_y!af)C zCdxM+%;4!Q4dL68=`#xVM<$?!NN#D{ue4_29phr28*sZ}NKs**r?d_Lmk3A~0am4z zZ(__gV2@!x^nJByZg#mFB0H=N3irF&GCjN7tgH*m+feypc{|qJHcY4Uz$d|zu;QP` zKE$^*{*6(H6uGpqomRM6S+||tX~^q9&H1z+K26nX(r7aS+J7jmE@lyB-BxAYYjPj3 zvjDU6Ja&s&=JnoYKsg14y+A+_Qm0eX5mJnjU1@-g7h1}u7ci%V%`pIw3PhJN2WcT3 zz`!g-1YxM=jEx}+7uxiP1i&dg{QZwOiV;AI@lg$777uuC(ZL-TwKpEzvCsjdwxpGV zZy$*dro!I3dgjPy7S^P?&_H&(MOo)GGlz+lS>-LzXb+%rZqw$uk~*P*ZGp{Hh#eC~ zTbodbm8`@bN3W1YnOS~ajyQlFt9KhQE08o_5tHr`R!;HyT)aZ64|2|j4a&OP&Fmgt z<#D;IB#MeuRBItRLQ%FmzlgDU3kyXJyp}%zf}R8fThLWDKp^*X7*M~%yHnI`>YTxP zly#ewb*~U!J?Kkipzr6RU)$+l%{hmb$!!ycO*j_@aLF>xP zf12UV(8f;lgW%#s2Wk%WXOwH^$^P1yhH!mvSxGk~Ska3lW?tg!@)p9f>ity$%V=6L z3txqenzq==iw8QWTzMKnqV3SPw?{L$y3blZwd9o*Z&EqvsV&tM@7l)a-)C~}utn6mKBVU`#cCh7YqR}&WqeX)^^&F93LUX?wG+e~CA)BSJy$gLP0je@I zRt4#*+Cr()4~tLY1sEqbBIlO3NFu=6Efj@LeZfLZf{n*DMCx}_^YOBxo$?~RMUKcH z-9VYWKRUUqcq2e>fSvR~Hg=ntWv~X(U5l_Ytg^dvgO$`@7IuFM=!5dHw%wjPfD$ui zwsHm`QX!OUmNE`9Ap-63g=D_;4}~*Ad-R&Mpv*u27=HZok82g_Is)8Z9@Foh zTC$D9{u{up0__%LHp_2N_aOlIF?%05MH^_m%sMsxp)dmOY$~LoTxvF( zZ()}ui71y1BO)Lv7fomAHqhkO3>rYoF0K2xuXFV z19@RW-@U4QfNL@U;jLKZ2*R;lwHaf5VCD5hqFID7%~*y~bF~nS5dkuB3$wsTCyZt= z+TF}B%^k?lZ}xTTrq(>+6=MmAt;AmA>PW+E4HJ0ZA;aAzuy8d`g)D1mdlXV-Cw`xz zU+nF}nC|->H?-_6py-ay!p%G+G^6Fs_6mfA$Yl4ma!Gv~&wf1FNEgFz0tnx}S*XRy z$Ge4PW4MFH3H8tuSUIPiz-}g*pU38_fDuAZgB_m^>>AOMgnMvA}p9e7Xvg$ zdw&KvdPQL`;w$)w(9A7FPlpLhIsoLv_lhxOcL`Cd*)@aEa?Awc4YD@^R(~B{WB5i1fIcF#S+WVsT zYwLRpe`hJ{4k_y*q4$i~mR(_Y<{d#mXulES?XC7)1hW_AH?Y^?SvV)Kyu9n_>CsHx~m+ z3bjs&UV&8ST&g>u$E>oL3I)=Ok+oF6TRuip?BbG80KwF$><#6?%V7A=B1kY7iHUvB zLxwW>ki5%*WELV3BrQ|g4jiKs0wi+IB7W(c}_D5KS%tc(VjeI?y0TeAZH087*;cC4kWLbK7*I)8bxdo+f>+|cUY@3^}WSo zY#>lb#E7z@QRW=tH#R|Dc~MSa&Nz+6jPfh!#kqNd2tcab&@p2Ofv>^Z^&|?l_6_oa zh(Zhcj^J+*r_kcQ!+5u!M4@&fCZa|26dE&Gg}s6>HJ2&W54ydEQ|LLAiqh4r4tId| zs#T~Vm!M!e>r%#bdP~q-rScnPC7e6)Zhmkg(I~C;ZUu#|0DXbQKni%n0g^~iXob@D zMv_9EiFqi&KWmYNuP~a-wEQ!&c_wzd+Q9CCP7Y<>lgm180QF+!x?uki`lX5L?s?x9#tC_EXL1bI|N|y)_-{AQh+-iPdc6fe7}QdJ08MI;$M7y zPW%gN@!PFz9??YuE9Rrjp$4!-X16D)!mPBC9er>bpFBYoeK67hT^u92P*$ZQ4tN^8 zf#WG8YZF3y^_tD0u^mNi@X)CDCfKkUlx; zuNe~gXE9WGGm}mHOq?X3N$-3TH2MQPS=Ewy6uF!1w#*htLq)GMFZWWd~@tAcqEh(=khAqhw$9!K*=HpLAEC6f;Y zeJZIUHxj}z_(+0~Noi;fn#v=l6pXW2KS<^ecov{VGw^%?PYxax&oPA4I86LY!S6}) zhYGA>{=k^br7;Oj6>G93Xcwr(Uc)Jwld|eEF^?>+1|*!_n|5!p+^AR!f^5p|?YQ;h{v&D!KtW9ppcl+;V`Sb)j_{JxCm zmw49TS%xR2|IT52By7k|7$ZGEKI%Th7+EXE$m4U8VD3lkrT%lNby1i;g&(enjT_ zk)k@TAK4VwkGy(9G-DP`B4lSk)nBQ0-}qfIa~oUU9ZhfDnKTrC_pj*La|VQ6vq`Hw7BfW z;<8xiLCkSI2<@o3gaQO4N(vBKT-wqqSY3{%TAlX9dzB2g;@I+eyW#E$3Ys%_9 z1`JjTgen9mz)_)xxe7pqatfFy1qD}7Sw#=gWLcE5{1?6SPb?#@q8jNTp_ux(JwyWq zL!n$A1kus!NQeAwhs;QaaQ>F$VJl{MDxt=ujlFZ@JV<59+RBMKFoB3#9*pdRcMXJ} zhO<#xp-7{=@u3h|FY=rd=OkV?yyGJGQg+N*2zNjznMFej8h*hBoq)-X1VVpX(YfZX zdaNZdhkkFKq-HdbJVaX3SzI4Nnh><3f{|eaw^hJYN~Joid@9901iUgZ9h(Om7#nJ! zX|J3s($g?+VwW7LtqFk_`w5Fjb6h%t4GLPmC`hd zc9fQcl-9c-6LUsw_Gz8ZEiTL=DLFqfKq+FbM&$v{x55A_yAAOxn$KccsU{8M%=^3O<*B{q|WNmD62fx4?4 zXa*~ywGj;^45^V0N)b@cX%L*VfO<})jdak*SwWl=N=G{AtV_Iqv`Hy0_KdK&v#!BM zM$m{@hpB%=NchBBtiPKP6nW=EtnO%4C)l5pZyL=NB3|TSM2eN2qZ50qn-)mwg*Qp+ zYB%3=#7R80WV`nr z2E+U1X1u*hCLqf#c>IL#(uso*kt>L}6&>ZS+feYu`RHi!Y${HufK&tv0gT zNi~hb38bqog{~TFZ8KhrnG@Scq|3I_VjgIB!4yubqRn2R;SLLpH8i(auNEk+o1p0o zP9LVVwz2Mn*7{+@VyRsKPym4$D`-!y!;|IkkVRt-({cSKeCyF!eXe*$joB$0XmZtp z#WHJDwM<%EsU9xUEM)r7vh_kl5 zOI?ElE*D~Klr_Kg7L1WH`&f7L-lL&#dgfMtc66d|@4LRY_JrP(vtB`LR-a}j?LnEJ zY_!Ud%}l0E2(e8g^IU{MX^ary+s0l}R=dbe)2E3me)=U9SN7B5D)%h7vVVHG0(yZ3 zl@^v9X>te%QW+VKetKjyf|}Egu>aktiL5+=DGfXfW3T{>qzGhG#;3JnuC^?TOhN)N zt>t$MKqkvtwWL`e3Ys2bN1%_KPafaw^g=8G@6buAIlI6jIBVrb zo8}xaOxQTb`Ra}n`KsUwI6KFAE3v$sLkSL>;HwDD&4aBoXRE|t4<&i)1h7r8R@R-_ zm*lJUQgr-DjMb#~SJR%jiiQ!luvN;3Nnwbu1ULP*;HDgjC!2tueg64`2+U1Ep#2;X zn8Iw&5rOvehd>O6N-+{Riygt&SqN?fUmtIPrs6Ad>B-Ev80S;Nk!=vw6HFLui`eaw z`ZPqxMR!W-6?Y8TV5IQl0`jlnfd~sjMabD;#vX92+pYM?he;HEV4GnFTW-Ke#_2^E zUVw2H;RA=jX*-FW2v*tIU}6WUSZRHA6d7U++dZ-m?H>IAu@Gr3SVbhb^ED37L}6ZG zgLEiGzevI%-21~6f?E{eYzt)J?3KiuA@8E8c4c+Fk;}Q9(~KbSOb7&tRLYyUARHG5M({O)FMby1 zybRD0`ucbbZ3JH<`1&*_%n|zfr1TY8I>1e#@*zplg0Mg)ORFLXVr2*^hJ-l|2@(?K znzeUH>O8Nc{`NizZf+!X{?{e-vVW1(L-$DP=DSnnP4Y5e6aG%@t_BTf{O2@qT8822GIz%S8@v{$*eyqZ>*Pf6!bCp)|oQ%8h*hijv z__oM~!Z>j>TfqBzny|kk_HCyA^uZb!Z&U1(RrYKYMUnu(%?7~n zp@5-qH)Loy*)V9Yx4g~4d58YuJm%ZR&^t!$<*X=lDry#a*(u2Tv$F0(NQp5C)#h~q z65JjWI$)IlOhEBAp)|Ab7e=smw%{^?SnR4lqNuE{K>1M^dfk1Lmmreoy^j*9g!dr` zFR_p3p|Py@DW4PzT#0%9 zEd4HCb0OnLUP+!YwWgjiO*v064+_9cRVreEuII}w$7xrAUFjXox(Yic(RNi~SM&yUoOQ6* zNi7Cez(<`J7@RBQbrTQB&D-Ac7IlNN4kUvSMa#Kvd3#F2td6WsoPMU2!*jUk#~>`~ zRAsf72K!$d4gtg8L$%A2SjQzD04s_309^?cxsgWYdF%ku@Q5r1yP2F%fhzf+58nDK zDQNm_jENC>BT2aSV^HZNS7t2ii#uqK5X%2}WV|Y{oehxZxU_Dh`1~ z(DhjGIr6(zI9>#!OE0G<)q@LG=zzDfn(jCH1SOxQSX|qJI{)6wi##a^f;c}}26In2 z!O}&z(I9dwqSpNU0ZFaJGZSb(f?uM8xc?qHw0yIf-3u2jY`F=y(y$rUp5r}-+G3al zAXng4SxFv{H*+S1y^lK1v0yC?*K6=e0nZOx211zn$tT}W^`5D2R^VnAvX|fl^-ZuK z3A!Ts`!@Z}*_jh@vrPFl_TIs5Ipo13zvoEK0bjdbe$CgRcL(Mj58fPOHy+1_@0f1o zUF;=M2s^|+2)(QH9LPG3mv_{x4}#Uldm^;2XFj;|;P&9GYH|ojF5>KLGCZafu-8Hn z6=Wno&t3zZs;}LU6Y+HzdLlUoa$f2=AXDw;oP+X#8G)vwRF1a`>BwV50eqERk7lr! zLQ$0+0Bze(-4yl`T7oUEtzb3$xF+ZaHR(=4>M#b8cwyj`G zH-V4%HYOY{orV7#A^tNDxjq&CQwo!Z6GrulJu>(Yc6x^KAAE!VAnug>2jSn9gpBY+?s>rBgmg(W`WXO$e$QK5RQ6|fa{ns z0CB)l_&R|r&y^$|oiwvx_OUCgYPfI|G{bm>q=Q|d=tZ8peMc^49q?CNXzz)Udqj!0#ch#&zJh#Xi+LOgI`u1Kd zZ^?T}S@(Ph(-AloO;d4lK)->$?KEF^>4mTaZS{Y~g{2eWg2WX`n?zuV8IOt&0WNr) zNk8v!37AfWp1&a&!W*#YsmZwb`8flLp{GR(kQ%uN6We+2GJ%>%2waDjqnHbX&p8+} z1#kVm6fA0t+?f=w;4CdRJqVu{U?ugdaSk8vMAwObbQc@8VLlD|{?o&!q3=R9I+?yfVhQ>tF7hro z@4p=wr=ssOK$A+}=N&a4gTDW1jif#VW_mRU?!WP#pl$jk|9%z1zaJD;LVqyNPG{KR z#*D9Xi}AJ?NARF@nMNC?bGdJ@BDhC}H3`1yoYhP_q?B3YkeCEatT>?!TVOA3+l+YH zIb0*t6_x$RFY2Kt}X7N=@%49i&h7A2@QaQ>oDlpPJR~4$gmC^!gcB#06G;UfA1A4- z!|=N>cpeDnW7RaAaOi9>$OhIW$1uvs|K4J(NJprIJevMh*vrT2yT6FNe5{)OfvLnr zCO71-g`9zsb(5Hcgcs0URz;H#{JPL2M9x5=|082gIz}I#gfMK0ILKjboJuJ2tdkHq z109-#o+A}g$|Q9A49|2-LgX+F>EM4fWeOVJb2J^%q{9u6_!MNpghW#ioc{){iGC$@ z0vhHX)G#IP9@KhG^!iUy3mC&vNFMkPh4kS3eOoP+ep&p}wQVy;=t4o7Z0$afaF zpJXJPOUdBImb}T%BXNk5MRZ6c6tJ^8`@aQ$kvOyRg|+bU_1zQYF(>kK|F%YGX@P8b zQ6uz|Febz@62|x$4RW39pyL?x5MLo&BEW)7D^Ej}+{Y`u*eJw~7u@$@B@s=CXW)Bm z%MFmw;5Jujol16Y(`DbgDT>}0`ATpotB!GD?DtJL-2%`E8{AMUad@K_hc~iucmp@g z(z%OrU1%@N$nYUv;6EAq;cVnAfMU1xWh|acum`KOZlPr~W@{XB(Hxl&J#!925^+aNuru%h?ml;vy{7awg_2@PmkEIO?B%$i;HSVX`?M% z*gkI)PMwF35lGu9V?;=P7G4~=^aUIwnBh0>rkRhAB{bv4#|SxjUUEhujmF3)uEia= zhEoQuw$T!*jGOs6aH@sd`O(cWOE@*HUMEDeVv^|#93F+v|MbFxFPUzSfh%t4zPZ;8 zryl;1h?IJOQ6qnejuNqMxX>CQC-Xl%If2p0bjW83Mj9t9e(;CTleQUtvC)J2hJow`WCJ89~A z?&D5fB;L`~MdDpPpUA99@ove9Q`Z^AyE9E)r>uq8%8+j&$vqGsX!F&^PrxjR zWRh?P1sNbDP4YZMEf~g><_e}1S(mgXbJAJpwjWCBb>D~m*pDQ&^U)z0&$o}{!+CLg z60u(rKdUeoXB8mV*|7z>0FoXgsOenahMr6cb8!ok1@`}QNe0B$Sa#&40(&t=gKAS!ociK9t(Ai_ccknak6{f5gl+#gN8(KbW> z?>9`w>Ww5n>t#^~Qkn@eKGZ&TW$plKBXa>-R5pQ%=~f6BQsS*b-YEn~zD>`C)G(WY$Ei zZG_A|-C1;m%uY#Wk-6gJ!d%Fj^FV_OaBdTV9!@O8{+v)E&LtUh*-vpt1GI9bzmU{z zKNB*hxX+YsFtO4NCbyX(G2xAFAC#E_rR3czuK1izS1*tRiEERO=zC&N&ybn3HF1*( z40Qe#ljf-}x*%g=*e-8<5)x%LnQk9u{h{~LVKpi&5qxi79O@sHbqq%qU@Jfx)a!)# zjI#PFnu*Un&q&h9zmiQTbrgCCw(7y6m619G2~{$#;QhuEl3IhO6}>SZ&*gYzJUbBf z3p{^4df4+n!{{MR&;wZl6FnF?J-`a$O!RQJJSp_>e>CY?>EV%I!qXF;Z=pAC#&aE> zv3SA=`#m0vazoRjxcS~0&c@OMW|^s{Nyr|AwCr@pE?wbF=N)iM71^JXr>HV31ZI_3 z2{9Nfk>PO}I$v=OQY!NpMa<(A*B~jY-bAHf9xHxD7gNA9My*bp=Sg`27aW%*vQ^)Ero&x^yOhe-*bm1X;9MM0!sDG9t?@9e5;`dT~?djwDDgMe+#ryWs5e@QGf11TVk zDy)Qhb1=mZ6iO+%?abYTQm-{n|+ z{|GRXtFK$>7Ef||um^r@kQaC@9o2 zvE1f<)eRF#wLrJt+G)vco=D0CaY^BY(J7y-B6mPWd3@Q<_f#x=!EJMpRsp!ij+nCg zH)LCdQ%ZzFxCi2UD*K~X5>|o6%Mb-M2SDR{Djbz6VG#!Bgi6{~DJ68~{vSanX?K7v zLJ#ha-voLs9l_o?Q9Tjk2=@Mxp*(`U5$ye~rjZfa8=<|wBif7Tg`R`1V5SK;A7WS$ z_tHRjV3o={BELxLJ90_ivGX@L2m5PDt==H1%Ck6&^gBuY<}*0A@wB8)_-#`EfqC6j z2Ql1S&&mtnz+j+LPnJ}42W9-~HKRwZs|_#zPcC1JD`K@949$m(cN!NKw!?jcvD0@% z=dEtOFHP?q!yJaT&7Q1<>ziN4ov{?z{4a1!jDYsOcmS(}>9J=Fn@T^3a7N=13)kEB zBr+W`dS{?SgSWWlK1j>(LwrTceZtf4r7iba$Y|dC8RjsG$_l!YMLgP(e06S$zoM$b z&8`M6ZCgFr%nNxP&Kmlt=O)IG~d9P+u)siaJ`*}7MDa_tUY${S%09jRTPN*d0HHW`9 z9pYw9l-bXa02d5&Yr)AZXrz^M_{NA$`!$fLPli+)Brswt&lkd+-{) zrfVhiqBm{*o*rEA$1zGvAO7!j`U<8%b44pp(pq8R*j@4r`DpFin0X6vmOTbi1{AubkNdTejxCdonw4=`6oe zlQy=@UVG=W%!a;Cp!Z#ys* z+Mfm&AyEEg^=q}qL;KTP_U=J&R(}<4FTaA{UaqVzqaMq~arKk4=u@*m$0#z5BnASL z*obJVxe3pjjgopJo*!ZaEXPxU zX9Avng#8{54agJ5Gm7m1NFIglN*x$+=?hX?!i2L@02I1TtFspEC$=z7uRaxDJ z1Ci$ipicx2fg&FnssB6>#0dUB!EpHdpub2zITNO{E8?(*O+JiG(;raaa2E3bm|r!?8tKRnHkraQ*pZFc!gJOz@3MJVt1u3!oOq1)fzZIowV19&!58j%$hm zwWSjCT_!>1uaA*qoL`?$KJ$s70;2&)0O!21n-MS)vk@_$5p4X!VI%TO!I-$HBp)Ic z1;+GM1PWmt9{m<Mo;1|!Uh}-z0q~_x}uvJpOif7MD*zd>F z`v>@g!b7qc{qya!fo+g0FzyE3j9uF%vM9!pe$oOI2peN^HV2>R`Gvc&?q8UOjXu7L zwnH$ZyL>EQIFQ6hIEQ73t*uvSt)X|pR{1s)EO+@%T?{*QQ-^&hs!nGMEje$1+N;grebqQ}s8!?2c&(bwc~#?*cvfx2JrUKT zaU!gG6hE8Jx9z?dwyle}=`i1)n?n0@vG~orBkpj`w;8;3{t@QWbyf8T@7bqUHrH;CKk@X>_^3w8qhPtt|ZCG zI2W_Tb)+4d*+@*yKNhXDC;1sXk9~#s^!eatpBBL9i*QHai;Gue2=xi((h>ZP;O~<# z9E{&cKQ3Mx#$tbvyom`?=m#%jzZFm64oUs#E0X#dJdbRb)C@c;wn=JeCwyAqX?aaj z-+Wb4%kez6TT*p+zO;+%k>h)_E;h}~Zm~loHL+=?wQQy(uLHZ74LyVK-9_sUHjTWC z*;p1^XoI!-!R>HT4EZkSb#O&nLSJlCTF28a5_Un7k}5ef&w#k!P}~ihun)}__MteR3Qzy6 z!A2cJ-r%r6zVapxg~aO?!ZOcdu>shd;HM7LFA699`4rS)56COTZ(pK`%gy)Y9k zz;-&x_LvpRPF!h_nP@xKar{axzS7X0xYD?+1ooXu>pSS+vsgIVaAx8h4MuIWM)@QL zqq$hez+luyE6^c>(cIG-jDFmTh73l_QVd4zWH3tC%R;13R+CE?LMS0~xWQ;y++eiq zEC!=x++g(o9Ad@ZCMU$W>1f#q9zW(t7;Z#bHiE~vW%wr<=p*!avW5K!9#4Hz;jc0A zjL_o}?i@~sX5N4;v5Lh8IMHVK_PV+l6_u@`4m~cKFk<>fF zuzh(~Qun?MyO=*hetwJAGi172M*A&Bn7?4f0!MvGN6Ms_FBb0l;EadXGi6Z2`%$?z zn|>^;#&&RP&L+ra4oGGNNKlk;l3by*=3c<{B13ed=OmRdh5hY<}^_LtHe@ zM}wRR$9}n|l9A7Pl**+-Fohy3u3OJ}juck3GgFh{$94tR#rtVphWqZgg5F3$qY49{Y0>(EVQK&DNb zJqim@l{W|V&mNt)hL(^`L_@ST7kChz!v*qUIYK)W2;)7u`VtdwcK)#LOO?vWkS{!P1*kT5$_ETFUo@^%B~qkIK+=H@ zbfS|_-*pt9JJNMSqj03_Mn)ay-Xo*#uQ>OOjJlCgH!|w}+7jnK@TePEEPQH<1-=a6 z3k4^4E$WO|Kjb@drL@MQ#U_>$4tWct(F&{=omjAL{vcsVSW4$4zq?;jU&fZnp@Z=M zGJrMepKzb;hmtz_1FTu!J8{1Uwt}=ya}^FWlpIi6Z-$M*Qk|YNBQ_%>R7gL;o?sV;m4;v!d527PdreSFh`&&g_SY}^Z5^{Q{92}dE7rcwlj zyKy6MWHi#%hZlU4{-*Q4690Px{Y6z};WE7WHky5dCVb}BdyB)b!_p6T;EDvf;g?cB z3&QRAtPekpzrKy|Y6Y7{GoIq8Gdw^sR7iMV{H-AT2v7YW{bf7CFUQ04!&`XxM*jC% z{&#&mZgKd(@#fo@yJ21xQEze++h5Pm_94Krr`2#?+dT=OG_I#zuLRfk7TfoXe98u&;M40LMLKl?u;7H~X z-1Cbz2WNlaJCuF*%~ZY*5i?) zS0#$^#grA3d@*%pnlEPaUQ{36`7oj2{csQcawK)*4IKtJ$aLPeR3b97J6#R6bCycs z%{e-W?eJ~1we5y&DC|P328}?G)9+XPn^Kj$`ok_9Y zI@)4=l%i`4!O|b#1yr_F7o4l;=MYt~Dg*zXm7%NU-!6R1uPoIiVtpG6rgc?h$h@+W z9V>nlt#4~zS^G(gi&rL#$|~&l_%@bJL$T|CfMPm4%&-0zH<4r7X)3ETE9(Z4+#(;IfqT>=vX{(vY-K%z(M$x}u*r!%=}G9b=6ll| zzD-BVJfnY$AtB|F0}?Cup<^YqlpIzbcptx1mMA-KaE9knBCboEOLYx|ox)yFyqndj zB^{oxV<7&=_W;k2DHADZK!Ke03I}kSIB!?m<}UPrw6bPB5#-u~E4Y1c0qdgIg0^0- z8T|ksC`$$AQ8GsEOf0I4wdb|1SQrD4-aUTv7ptH=pl&sn+-_XaPDo;)>9&EDV|fAN zh68K&fVaf-z#Fp1Q|i@m|z&k2tM8 zrsW=ST6J^Zw`=U!MYu$jjCCK_=~H1?WkATG5yYwN?0*f4AcF>FeXDXqO2GUzWO zNW}zP+udLjxwS$3X_!;zhAyax{(QlWfpbmRaw#DPy>Q=!4PjQGlbRM2WG!oGlo}%s z(C|A#rLMqRLwMrnIW954+HRq!>4w71OLg^{BhAG^%DU-B6l#x+=Og`V-=T4bdOx>R zKgShw8S7o)i4TDfxWXM!#Np=|@nb+Bn{H%_h!;Dl%>BNNrBH}C3~qLt$|Pl7w5{C@ z(zSVvOht2wI0+X~cP`C!g*#CWy431)h1cV?&J}(VKbTp<^CWOv?-rz#T(R*Wj@+dZ3kPRr=0#D&cvOK-$i#rJ#0&<4 z1dP!jZc=`2DH=ra=6L)h5ns5UD4Zi`Hu%A9Ce|rOhL8ED`Iz4dgqb&SO9nlo8o~pD+ZCD&&e2nk`(^Z#uVVq>`q&Zcbaq(=J9Kmf}X+? z5Q33{Daqj56zhD9iioEG$Oad?n(_g1a*bv36-! zfyYD+@93t-Dg4h5@^IGGn5!S+P`x=v8Kfdf#oX@%PKDrH_TG8eXYKDI=_ zLDw=FVtdvT@`e{!=i((+CQFnXZ|Ve*nM9d8R*Vs4E=iP$=%$UJvDmmB5X0E}fWB?O zdx10j4KB+V3fqyQ;kV$wQeitg{?X6tV&j@nEz$+j+u9f1r?_I{UgZ*;NE^7CP=c1; zM3B`&5;S5O3jYrbj6@sLfaCd{b;NX4@HS&ZZFd#TG*WjJG~1Ho>aODb6&rUu6|@4Z z9@2y{&}eAey|MN$p8?m4Fs~309k2Gr@0&RTH9vj!To>{ zu$$RRW64WO@OApc%nhN~3eIB(F=S$rOlRGNyQ5ihC}^Er67uNTu9EJRphMr) zI5hwdbe^ZPWYhiTpm|1c?svvDUt{nZ%Y7ZDl1(c=3eKI8UXuTv72|80iYVI?Jex6@ zEwmEZ%8+do&*t#;n@U3WBU@Q|iS;`x$2*%;%69MYY(diu#hq=ixXuarl}Bi3+b0KqCYI@V+Ii0a*sZ)yqc{-OGniY!Vfa693fj zc&^@Am`A|ue?>SrkLD`#$yemXrDv7{L!dGO)NR}=f2wY7;0q@c8&tsdemL!|x{K5C<6^1++-IYg) zzfJKT^-M;5VY~7p-=J=Vv9P^N`B9+$D62f`+oP6rc}%=ilkUgoP*VPBN}2?bM;aGdY+0b8!FOvE=8UJiIRS( ztg^qfEW=P)&55$m>m^;h!#&347et>o-o)Ns*ctveTy4$e*`6?wU6>`lLt%Xi9rD41 zKjB-3;ti*YpE(qtcB=Tiq4@Mu#b*u0XJ8P7k6_^9R`5hpHu_r_R&aS#@z@g>0`}uS zrk}^Yhrp6eo(pQj&qEI9pEQwS_NU|^H_0>B*_}qo=p+0Sq(XwnzE6d2p6)un3F8U!}ojz8f`5#{_bl^%W`$smi6+<<~J!&&7z z>Bm$irf=Y{7PE-@Sj9#RXj)5?^ITi-<_wqb?LjzaQXX7}>`0PN6U{&4z2rG1cq4_a zu-j?2p>vf>ZNn$)Y-f0zV9t<_Frm!vbfegOH)f+;cc3bhJ?9R%jO?|w%DOjT>g*1z zOvfej-RUTG(A`ZOB@~mDb*LfqmOf~@-W^zGfLey+0h%n$89~EE0hdbK&$%KvXu`70 z7^s0gf(cgwR++o2_*ztH#d-lq61()YunbPeG4vI=0N)xksd8TUE`hXcII0 zSfh&VbqBn_-uE^oN7HR=rJ3!dt#E2#M*XyZYbH|sbZsvVtj9AHy_IOPGIAx2=*7;*j=Iu8rts!7^KoB6zpYZ{=%1EE%97>K) zbE3xg0=()7bp#v7q1d7Z_zU|r6%XMXGjBs|JL7&T|^w z0W}_g6z)7nraR!!4{yq6Fs-6jKG;iv|)YLiQn$e=E!y1>0zw0>u7B$XK z%y+!T#0PqTPo@C*=8~%kIPV2~Ksv)qxNK%9xta!@XJ&jvvCq?N+rS3lv%ZQHis{bS zHjHzasSJIz#o&3ZihEvj*2TVS5-4}^go_s5G;Dfa!^KpXv0uwE`L3>QV8y>A8UP{r zKFneKleoeh85LMz`u=lv=0zd(>S%qB0eR!FBbS2%MO9ho-HTilt01haM zQ`xVf6rdhUucQ8gfYb(&5nkJp@)sZ@griM2u~kKsxZP9B9wPKZL(9ssxLmHTJ$RhG z&&sjR$0DC~tUX9a%1!8JRo>n>2j`AgS$NJ`kFkM9k!evUUq#&i6m_4vsI%#hG)4-V zd2cRC>7F&B!5sZ@YG1}ibFR9XxbebL;D-PN@NA7BiYXwPBw<0r0Y`hFE|8m1gyuOx zX-+-Q#{870HvB6r5aM{oGR42jPjPY%`2gZy^rpt)aUg8c7sSw7nwTKMS5ie#?DGp-b;(*Ese;KjSLw`5OAh< z@;vDRtG<0IiJW!L@EpE`Gq`;#>?TQRy_hP+`vrI(i+55Sh{0I6xgIJiR|EBJglPm_ z$xhE?w%njO4A;~cyl~2{!buBs#hKt8 zDRB_pu58$@tbibZZ=cJ@yihL@flPqCHD64`go@=a_1Geq45Uyaq8Wd&9#qlw+%Ed^nTV&lV z7`$Vlg)+{m3r|J|fptLxpmq}fa@K|alh5WND9O3Si*KKWrdZM1x_V{9JUy1NH=~|% zgG*W0i5BNJtYs?=m>AKpS`(D6@>Urq(4lLzp$lTTRSmCp)G9fkg;B9cP*z=p8gU}D zY`ji=j0g-gSuV7CT(w7k8p6`klJw&T3AHr_E;N9U_x+Y=iSX^)X#4RR{0a)C;(@Dz z!d_)Vxn9|@NbkmRPq|ZB*TEXi%7#&LryL?g&Nk%XhEx3Vodbvotq*}bfzJXF3ri-? zbhZ=if&&GqQX5}IX!T>e;QurCKJZaqRsR1>G6@42m;oj`Zi zZ7H1)m{6gBF2*s-R$6B))s!Zkq|M}EDk^GSaTgZc_zg8C%OF}3Cw$;$mmRht_ zQ3pdcZ4pw7%XST{r*q*m z*804U_me$NT%kaAXgIg`&>xc(vj|xx!suD98N>QSRN(FS4WtQw0Usfniz=<2co_hj%&7-ZVWUhuI$D!rzhuSL_;@; z@7VLV#ePIA(%xmcud9A!Y~z?5KPx%r3Pi0?saeFnEQd|S&UfYZ@nULszSM59)UF6V zG_%zCe3#VjQeH)p{Z93Jxzw*UJW|68Hw3!h;P6;iQ;uf(0GaN|ov)ex89DY#?fPSn zNp=V;*Q6DhDldw4jVZv`D#yAdBpdek4(H_d_Wm&^S@FQd>OFc_((@CcFT380O~XjN z&;6_QK6OmJOSO-#b(g927jKL0BE!P)W^4VQGnuy1@0sfKP4hc_`}rjbo#?-+Aq&JT z-rco1%wEzJ$`6oIrO-A#t&~2;xYCR9&T-afU6ioNbV|OJX)&aVntZtfm?81*zDEoQ zimF|;s47}1@9qUTxo^lIc8LsOoZlmi_wgY{s@ykZ^m@ZO1fH>HpX?PlEvDK z^m#T?q&;S82l=rO8%g4F-Hk3#wfDjAkbi4``>Pl?WGCpR_<`Y>u`7i{Oiz&xS_~;o z<&}pYQYx+@@2&Hy_S{#`Ud&Xwd@YIlt!E5LTIZzOyR_R|hq{k+V+gMI7$ahzVYy|e zIAGXrlX0>^Jbq|*Dg(sJU0^fTBvQm*RNoURMga^yxTG-x_t(A)VD91S@HMGmQj zovnrasUb-U%MwD0`tZO1H;Z}`MV(_8wdTU2)@>;Lzgo`QrJTtAwVZFtKtnmN9aYXz za}f40RnXaax+xk%6`BR4`%HdbEi>lCaOz=Za+nxaNVkVm&S9dREBjreJdF>h4j4~{ z(X0ATncrg{v}EyI?To%#B&ZFk>2mGpjR6fCov1Sdy4&_@ zE^Ho$d{tqe;V;6)>@pVEOvT+rgNCiMRx^t&3|?8@V;BbIFQUOxhGB6pmi}pT7t%k? zmbMJM2?W5=D*g(0F?=3(K?FjIa2Ic6xC@*J26sVO zpG|xsc33xwb3l3`UV=E6s51sHZ+2NtE6!+*O;1Hh=iZs%Pg9r+i zu<%KB-K*;ymR%wYw)ZxcFB93gS&uSpiL3RXBpyn?7*4-PA6qUf$CjLQ;SRoq(uKQt z^f5-bTGCdR__P{a3(|#8h;x?ao4rkPPbG#>TQ|wgdvuiyq zD^o76TBAk>5072`u9sfmwjR<9)`~=H9O-VC!hccSoVL>nvVvmJRV#V2@cgl?2~4o- zmgW~lrzIEWlj)WK*?!&xO)Q;M6yFz!pQ~+s!TP#H26Ji6lI7hcq@fk8>5{GfT44np z&`JEH|3?zH*|ZOejaY4kM3H5#fa*!y?lO?_#fNJX3*E!5f3Rz5l?)e&#qRDo(%H<3 z5rDs$KFT5ySj4Ybx2cu;WTo_h_^>Zp6xkSL1^l7Alrroc7`Ai!n)~Otd~MA;eOz_h zoVeA+j`y5=*_NNe?ZXn!m0*7}e4||HJ4IZCzbk(4LGR=H)jm0C=I)Wcv&ao2S2b{- z2j+14S<2X)nB!iQ>i+Y&v|XURF2)95gbig!IC3oD^o3f|2bp3yi6H40JC5Hw z`ALEOdGeh+I0oOlc`J}cxh%3dBAzHOstUb>z6EG@dSr|VoDDgY_w3#VVZ8b1juq5%f8Ksx zWQ6a}dm6+I^q?ak(Ff?yI|@RO3_1mxs>r`Q*LS(15>P-<;1jvN_bYnjI?6Jd{o zKBFiFV!+4kB> zgOb!h6BMlk6(|aUWbkGSA2dYsDT?YqBBbrls|Lxg%MQfV5&^G; zpe-T5mc{%*(3n@rQ_K?e=T(3%QB(>NseFH48R$|)5fZ&j(JIj8idKVUqU_I$g04`s z26UyOR**=JAy-g9Q3vSVin>7WQM3+(+AjXqgMx}SfTk;Y1cZ(uUpIo@uV@pfL{SPP ztEB$CVY(-pUZ9h>p?(D_mCmN91XQM|0wi)Z$_A24eyJ!>xuQyt>}2%k6%k9NB0uP( zidIq^Rf?VjwVcJ*sY5xwEixx;7JrdI6~ni<597|> zvo-M%oHuXaPeW!{mqDQ|^XH%=#Qc^nJd6L%9!-p-_DWJ89hH=1$U$+KZ$6oI(V!^kK^@%L_M03>mS(tcmqw)8oJYnpr{*rib6VThS82{{-cZ4L|1Puqj`J{Z@S;(ub4qYos zWm)JR_^>V#10RuxzxI|K9>ryq2r2Ij^v?}$suK5#V{65sGI3{h;?CN{opt?l>sNnN zzRYXmk+?I|KX;*^{<$l+UoVfy3Jthw;9C;m>Y;y@N3`sl@>nzUPx5H3m2VFYlcBPO zg3f|^LV{#)3#prs&1yw5Km``bR~dqi%@ri1Ty~=%A>x6X1PNKU-7HARH!x3-^y5&F zd_5>Vb%^Po0S->2r&`cbP;HH%U3+tVD-`Xgwc21A`XAg%tp%tnvwhyTD0Mf}MK~oh zGL>$)H5ydcm#maOWNEwDD`N1r0Qw0 z(7dkz%BBO!=RPHAXe5;KF#Qv4DhkhTJrB##$F%>y0h-ZSaBg? z%ahN3;FQQQ^4j7;KO~<~hN|<)HOJ?QT3=$Zx_nu+`;L1qF?#1I=|k364EeJhb6K-X zJUNNkCGh)peOc)}G~F-wo#Hp1n6o@zj?MYmY@f;>5FyI-z8`5uKGn?0isq{QF*>+N z*5)G6xjBDE@3KBUw_;>>@@kJ`gm<$*i4VJ*yz69YjQ5O#$@Po$UY51&2WlyM&*jdy z=56P)vbCjF-S#4@QcMqg#w8ZPVpA07BWeg#{n6X8kBXZW?{QTfYCY28wsl>MyeEdP z%L%v|TEJf4s;*11Y!e2W`)S4I{u`;(=ERLG$8XEGt9aFR6m7N_CH>zOE>lD&Lo|YA z*+WR8?t4Y1Lan<0B_i7Qg;H@+F`=9K>$XcU#zrFx$}Fw>64l#G9M;0`74_GB$0fc@ zpk#ErJDqP9VVSy;DkGol;>X`|-~XA$aMNxo3lO6BRodJ3Z5qmghaJ|ePOfm_%b&g9o+^^0UnTa5PdpkwD~ z6GpTx79>A(=I)s;+Rd~X^y^|1)aq8^tZVo8$rNKZ_j=m8DN;f~M`d!SFibK=Bbn>Z zFCk)+O>0X{yWQrTCP@E4U&bR1B-C+|(^=k+!7LSgFgLa|IiWLsqJqgmh=fKB29w=isEa1xv>ve)2xbV?dPQTN2l#^VwK)C7j97j&n$9Qm* z*HEhT(<)c9Zgs(WoWzOKSq-kLH@qF4yd>x9kaeRJF2p=S;p%v#z9!l&!`>gsP!;p+ zkP_^a(QEL%JERmlWw;u=WQUAWJ7tXek&IA-`O;;}pKWn0Xpr$n{->&u>T`=7hp}FZ zO$(*I%X)#nV}|ecy^{An>plm0I}T(NPVrd83beR?4hTU}%$>NylbZfdDvpwJox)Wq zhm$qmJEp zTIFyQ)8bDL=p8v_(C{l z2I{Xhy|6=Tn{ny>DWTMZ%qrHynGtiQ%djOaLog=7HZe%eF=cB1Z94tubEa=hraFd5 zOWdwW7Yq&lWBczUQ|(gOZLtYbzb4kCxj@wzu8=6Uus{ZJBi(CA@DxVozvZGGbnOI5HW5HuM zN5?NpRi0I%X-a+O6BkmC>G0MZxA4xldd|FrLC^VaVV<2R$t*%WV38*g_9xaBCDx*G zA4seXlC!E;%+a94{7KOuQhI3H0R?fFWMXcKbe0BxB3z0`E}T!yFB^Oxy87}xhdf_q zF=EL^!lC3^%wUR^pxH(!PwPMkImjT{l)Tm7)L~{2a{y-Y# zngMbWSxPkN7pxu#tS`!N^eGQ2!UzP#NVH{gCH^s zk-psjP>LA3#gRMEBDZ%`B9UcVO_}A*(wXsi4F@{iuQu+{JHde?yL>2ctt93<96Q!LcB&wXp`FfkPIqWO?aNbjK%G75=$UP0D;a5tGO-s-mQ z^IHsLN31Vt*Sq5^ia})czN8EF2s%?wZt!fXx06$2hszIio=zB3u?cDHCifSK zNJCT1qolzI+@B|T5DLnspgs^P=%CJORAvII;HHR_(M)j!++s=@^Mz91G=sUWCYG3m zCM#D{%8^>k7U;Ru^(NmR)_jXs2A~Tw4EOyUZ18q5vt5Nj z{K71(1}_ibvy-s}}&98Guw2Nmx{2A|a1rG}l-BePSfa^{+k_#3ae(X6kN9*P=57IQH2)|3uLAq z-E2_*OpV#ih9mS6d$WNgAWTlShEl>5GPCyC``OAm={?=^%?uE>msW;3u!iWO3>c8J z3>Z9Qz@Sc1@Rou|4hhgBc^gaWS;36te_uKe>VQS;HNJF(^Nc z4gsI6Vf4pmQi*QKpm?BBd*lQ4%E`RgI8j1&eXcOFmrzYl3IU`GH{pS zt%>5cCG`|N;6QX7bdk%vof7IFy;c?y*epKra5+Jxj{5T?6dvgk@=4H0Z6QxYG*zJ^p+%ejogJ)gEu>K0>riNWJJ~rdB-y#!~u;q_{w%527&X zVpN}DlFi0zZ}4BlYb>_S$*ND4I85iy1S*5L77vz<4(c{VawEZ!lEh|QEUTI^$$ix< zjE~$(ZEC4P5y$&r-Z^|A13^Y94u7hk=a#vG_Nlp&s@a#f139|m{`;eM)l71XYrB7D zw5-Ni>u8H!R+GcS+sV?K2HZit2j8FTJJFYY^~mcJ*;mnyI3YuGO%w4%r`1d#`q+IY z=rH*?(UtXkoY%ot^QlMh>SWhX(+}Mfe{1DEw}?@f3g{c7F2zFTnzrbq4Bl+;HVJWq z!5xCHHh7ib_Zd7-@MWQJqy!L=GNxbLB#-!BUq?@D+GZ&bp93SG`LcYOj0)n7r%O~8 zPP}hEl#_mZCK=)Pb$&nQw}szx{2X}~{&QaFG|DAs6wbih47ljiW%mK0e_MYlB#R5b zRqwKDJtAfL2(t*M!oo%o%J!eppECs4Ut2`=J8UYNDWVEj1AqLMkFE3tKJ6$mTaiU3 z1nEMd(G=+#OOeq+o6NTAAs!a07xbt`x>WhIO-at=!}RfB=4zyml_X}0O_LInnc6dV zxs$gSHL?mTwPt$IlEh0X8f4Z@9_#uB7F|uHCU@6mvt#E@yAnbeIdnyBfJmXqnw(ry zM9nmXNTduklm(^BmoONR;T6zq>P>S%dQ66waej!tGG=^YU~xBLyrIa}z>9v^R3$Tb zy{Eg@*L?(C+w(PwRm(3O_A^{8A*`*m##^SZ*JpMFM(L};zC;({flN-d-1K<2DQW*K zBjM35CrIWC(D3GFMUejrJbHup7P#g|KNxA?ymK3yPuKV;r3$m_fwQH;PIaQby}bG7==er{lpa z9qR|*P4%l6x5H=}CAZ7xW~7<@Gkt9Wy+3Tqx4e?>v}UyQ#rDetmbnl?U67+uve@UR z^7tkc<;5Yj@-SLrlgJ8;i3(61K3AZ&kMf32VI4kWENdX^_Rl~P^d#Y;Sg|%Dc=vY7wl(YZYSt=rLt4Qv37q*Q zZ$(Mhl*>;85U4qN(rHkjeV?NZ)^%9a`Q+MCxrwyc`@mkp)KEIF_o1DVJ<)&?jiPZ9 zMml&At1=`Z73q+i5-bWuHc21&<6FwHYAq=bY2`PDEMIy-B~|0W0uGNND_}_#iw{6+B8Z`~{uo(0+JtTgz zMEOinLTi&-s}#Q1)N83+qf%Qt~3o9ZpR}#vKl87E1WS3MyK*6iSK z`GKyb!CEOmH-y&R7j(A$%6a{OIb7TQ(z(92w{!5}i@Cm^J2$Vqx&+n@X2AzYK)Y~8Kcc))WTq9oO0~NA~Qbebmg z6YQiKL_`$~hZ`28JoizfkVN;=V2EbW`jBi6{C;3?CI_>s**eN(-@C2~`bcPPXKDa? zs4h>JzgD#mA-*3qGOjhPgq}#CmcCJ&{Fn>6uO4)fNWhwXmR$z#L!vkggR#DNo-!D2 z9#yxvq919#4(U>CoIHx6#fw;+g;W2aN@>3G*EDOY0#70w5g_(JvsKXSlO>vUjLFEACL_N>QHUCn!j8ltSt$ss@w}k- zpL^SSU15%^6wxz^!YCa62ZSYSH`oIWllm48)i*f1qu!;GKwv2B>bk-k}t9?-f}J^4JtqDD)}B;vBp@OGO@Z$#MSgQPLi2m_ct| zhKit!+IXL@UYcJh!Q1&3Jj$3tPBAsxwMJ`JYbZlk!#6p7e|NLf_aMKw`5nB)?2XC3 znCywkuCk2!q%xMD7XEo(-oQTyKYe5LI_00E@2klZZhC6XLZ_=OHm5&tfUc6FLk~6@ zd|2>}2JaGFWw7wmgCDLb6lVG#4Nv{Cnzb(8ZiH`r1fLN}3bs}r6kXX`i9N&Cn$LVO zY^}U9%NVxyw%Nkfi|$!azQcs@9g|Dmkd#tm7%7_ zMd#^#jtwJ>QD7ttx|E+X0{y`r>#r-Nc25+o)a}me_s6b-Ix87&WsgCqaB@zFzo?|r zpP(0`lFAU3dgeAE4VRL}iKUD_o40BSydAgk!kAJ?Or;G?jWWiM)h!hpJH&4n zznA%C_EzmJ)&GG`{~wI+vwxrCMAI%KmC5_fa7r- z&1Bp{x{zmm!8Mp;RVfD?Fw!PC5l&G|YGV6ha(Y1p^8b8ga*Ls^Nlg*Q2k1U3RMhK%= z#L=P^OztXiA%Bfb?V<|I%>VE&7^j)2McGS~gs;<((Y>%Ud~mQEA~E;b&ffE!Q^$K% z8hqza$gSKg(a(-QRfO%%&39NG!3uJPfDYHlZej|dkXOVD1=~uqSVuHK)e&#}alYD7 zQFInp!besxcK97KzoJzq-M3^+F6SlvOGf3g$EtW!yRVYgIlX}4juI>LWJ z51D3Mdzp*?w6iqfd2M7EPdjQo4rSvkF#~k{CUP9?H|i1?{`&qujx4yEb~?xs`riW# zQ|Ny$rB?g%4)b!kq9Y)qhkX=e^stYCj2`xJP=)$Sfv!<>5@htShd@RT`xK~BzYc@0 zQ*;(orpOV==!CmKvf1CC=LU(Gu|LlP8n4I)GTP04kkM5x0)0}y7K4n&a{v@ow;%`( zfmljFF-4`IPb(?|eMV6QXtknB&=N(}pgR=Rf<*lRU1g9_kF5uNT;1k@jDB?pv{Ky` zf|?aA27OA=Qcy(E3J}VB#J3V;biE@WG%s*l1*%fC8uWfeQP2uSYd~eR*p^nnmXc31 zTjsR^VJ-;U0fJcob%Fj~(K?XP@Lmu4gt~12-Kppi5GxKsYy^qoL4V#R(1#Rl1$|i2 zHbJC|4m`-CXgkO#20sA`sJ|T`qjJ0pWR#=%+!l%Iwb@02$@z z!=Qk=9RV5T=%XN`9DNLAl%tP>bc-Y}1u_cGCqd&h><|c{0WqHf8GZ6$kkJ@F3lg=? z{yYb@n5W1EGFs_wkkKdifQ)Xt4CW}ORi6L{n3jDA-EDSF-Ck`cxzbW4V?1!k;F+Iro$W%Rn|vaDencN3#MBP4qv z4E=va$9p+S-i4~ZP$3wrV`eMwCY?jF~ag|KYqSyTansK)KNLWNpGEji>wI52CH^)946laY*8l)qfn=j{}VLgdwS z*6eMRiknb5DsJ#mtf8{l&#T1aI;FqPg*> zT!dE_Z|70=Ut2C=TE#CRW#5|uE?>4q#1Q6KU=hb7k4mlI!es$)4l469wcZ%nAs?>3 z-~*y<`Ecn)K5UQ=j*EPV%7@=^-@w>3A|Y{qg&Ew?u32VErb^_)4=)Ii=~J|#E0mJ? z-tHo-l*HP<>g?)_FodhO%fW*(8i~$cNX^5E~Msb3fukWHnCgwt8g=QBafrM;DfGK7PME6pz0gy?-(cckV z$HOs;c(g+yk6qqcCf!DYa#%Ifmx$Rb(fmY$nMx2}rqm#haU-`<7}VE%*l72lcPsvp z)2->V&!(>F)BWKT?ox!G@wE4cGiO1d4yl1}^Cf!{BvOa`{~Zp4U=hGR405-Lw4+6W znqGV1VUW;D**JC&MdaaG|7m&Hhe3+U67p8Oshxu!bLC9P`c84E@U_aLGNg~{WB18h z?RpN1^v|u6^CJCo>xc9)Z{U7;3k~UG;fgkSTj_|)BU0NTkN-cN6Inop^qfeUAU!9t z=|MqqPNYYXoD=a$wdBb;kpN40`<%$~Q5)8X;Ch%U)tnTqE%$u91(LNY-7VMB*wb>Y_&1 zJJ=vlg%Vkp{a^gHCqca8B|m!>{)t zp?b;Z6MwJyT+PEIy;S@k-V#-4td?0eLZ#quV2l+?v>XE zv#;BD9sImWWrN^54UP)_gq<0|VT0=gqe38sDiw?hfnbkdR0sqQ)8#~kK=5I~qC&78 z5D~IO)+&#(( z-z1-R%!u0{+)oq(Vz1eQW&(u=RSN#J%jhX5TCgvoE)ma;AXB}4aHGdnQ^8wemHVXa zah30^9d?!5(|W|Xh7;fM;Vl(cW)$x5zVR@ZvSoU^%@3yb|6JHnQT8Yj_Nh?Dde$NA zl?#)Vy7$kcxz*dngb&7LBu5RA{lWt=|4c#VinC#Ps{Rta1cf@ro>a|wVKcisqK3+G zs7Ywb)iTYrU{Usnf!6-+zSAcV%oaCw&B7pck4$f>?pb~yvc4JSW8!xDO&GO)9*Yta zckpPzzU(fZwr00caR`_)^hiE_Flr}T3_|blQzyHnHh(O!T_t~Jyu#8%P9JcY5L*~x z!OxfbO46TePg|axq(4arkq#aq({?*x0mkJu313%wN%S@=mkr^kqJ_q3rscmRQP+JI zO%paa22E7)eph>18qZod?rfs8yLG)4E(ymE<|M);sp}a2?m9jxQU%D#%&} zHe`h6I~y#ldKOxrDN5E4$KNXQKD3KW%CNiUQ)bxZVV`9i(sPHdA4qvSd!pFH#>8vY zZJyYB#58MjRTCy`sv_>S_r?FR=>9d!6A`x&SKqM*^$b{CHl6jDO|s*AQiIkyeauYQ zrxM9GQd!OkAT5cJ|nJgmCRJSUKS%dqQr!iGuB=@Fl3e&tYB&nU&LrJX%A=De5~ zb#(WpCM4#TE=NYrQmV_nOl=;<6K_7Nv{o?Ei?5bBK9G>*GE|@po+JOhb2~R zUEi=0GD7I7S58mXTN~PiV6d*`wmRCSqaoghtxRIO zh2I5jo}mSD+I~_DN$7dQdVn;1h$k!B>(&-W3*;WYg|sDSt*lPT5c*TBT)l=VwZ5w3 z>gQcn{&c>z)ySWiyNOXrj^CZmM;Uxk>R#l%&@zYGRuc2+z8r7IA@nM+eu~oyoTvbf zF#g=zd7Or@en}P<<7#aPF6Ggfs7id+ooMu=UjH~9ATe9ct3~(#(KyGjNJfB%X;4x^~6uF}#jB zNLXy;jygwZ4jr1Kgt?p~%p7U5&;M1SO!en;*gZ_N5eqNZq$dK}tf3RKDU_W3x|}Tk zh#b>gx<*<)8R9W=7E=#uzT<&RY|~>UqNyqM_!E@!2$}{}uXsD3LP*n;DxNViaIkG7 zjoa6~&eVKwAUb&@FY%uRtf9fn#NmE2$5Fyw&I&{e%t^xd&wPn0BLHEzzUWCp9mSbr_-9Vr_+|Q<+xbnrgS-f!vZ~>208t0 zr_)3&Lr}ka{nPSlxAu{mOQOKD=A~vRg#M{N38Le_gIsIe~R}^4H;GmX)Tg2 z)axVFvzW?$GNe;k=6tgjJzzrpF7-sFT-_xJFX6CFnJx z43bHRLn808u8~8B4e1v!%lMDSba)u~9Qz%|SalFSVD%d&M-J<|Iv+C}&WG&LSPt)n zIAX2Xc21kBt5tYYY9Lz=Y)1D-Z7dD42SR9SM34;)#0=FNBd~BPx~e<&5y+M9_sipoH}OA>1Tch?u(#=PEl|BvM|R_|QhoY2h~3v%k~^ zTa+q?2^o=A)~ab8?vX%61j0!sEQcvp`OA&UFjNb}FwYi!Voq_n9YZC=T2IuHWbl>v?|ugz)SG%E zKxM*wfsI~lIU1=HiADA!knjsx771Ct?++J}rAeL0E8}}yB&+gOb}CG;Q!@$nM{|N| z3^hvtTjr{>`AD7BjjAQY{^ndponiMDn^*@V)^A)S*3%uq^^~s`6Moyo&zvhSoR%^S zg@?GtG87;4#CHWBA-vn$DYR+RgUqNU*aGm66J$T~Zh&B^=UtRmu922Ok?g3vWO#9?)m6sD;xLUkYJ5;`qpPm{WL-Wt1;opCe7qfOC95r-_-p&sn;t`UW5<~qo(H; z%$`rH39(8-3=Uo-#1q=lAWCJtere5jC+E7W-hwjAIIUp#C@w%r&i7Oe$VAH6I+yDy zu+~h|NJCW(MDGfxma}leVVjh9of_aF>?YpWZ^V5o2o-RnJ(7CkQGCI?1Up|AOA>$o zo{Lb3NjW*&oxDZV=*tpvD@18xa&!M|p-3}K^wSo+43D;^fU;^ubS>uDnL$^;|FOYZ zo9BJJLkoy$lIg=~!%Q-`AZUA>Ei_$|GE5|9bN)LPtomhid}Av4W6c$YFZ$knk^Gqq zlpomUi;mkC;86qWOgnd7Ci{hCuHT>LoYx{zF|NQQ#=uY7HP z_Qmqs3wWuua^uI)v~FCKs-kppa~Z42(x2JBA)AbSYM)1^B-@0Z!#Hf^msn1wF3gZJqO|#FF7z~9 zD7*xms6W)8TqxU57jU647{*3|+7_^FB>Zo<&{|=}F2;#kQ-ld+JT8M@Es+XVmL&HO z+zV68JQ)=rfBBl>8{i8#d6O}h@Yh(;T3FHdSXT+p0z>-zSZ4J3jJbrFS#t?jWz8kL zm;4GNdbtUW`J?SIwE&d0m?<#&b@Vl5T1lb>DnYoU5Wo_HV z)8f$Xq!#y?f%ooDOd9F-a)VQhi`#yFh0+V<)Puik`bK8NqWG_!EGIEXV$JnY+MxAc z+&^~HnU^k?3kOOV6A>=#Pp8{^YipG)@JMl}rlM8mS?nc~qLI$Bv&}fI2$<)}TAp%5 zNzTl!T)~TuuXtW%)k|Wlt&o_3k6N{IC}jVMwrEDROAGtAS`OA?5hu|QT|nww)F@F6S+LT?Q6h1iIBp7G zCn?JgHE+l}I8~D&IOhowm*h|sfN(4k^JUz6)Ek`|ISLbY;w%B|JMlPy zhP4`+N(DSshuE)@#23?ffr!ok!z^{8b0Nog!f5>l&=l$k*@6YaQe?-(A(~ z?fkm&j21T6wqkroUN;0c$m0es8Y3Q0!JiX1B;3|C6)V-M1gkc7o0Nv8q}4YBJMa!; zD-YNsdkemdYIt`j@`Uh^zxp*Biu2{b49Dm=SeR&FPSM?Tq7iKr?z@$*91!A@+J0Ws z7g- zUD~M7M2&xuamiKMa>nSxs)L+8OC)iK@E_qfrxQ=-JF#4&z4$U=F*y00)>CSaKakF<1Ll%(z(hri?J68WZvokFt=zv{QUJ}7>t z(h1JRb*J|eDf4-&K<~+>>E~m=+7LHPe0^N zF37IJnq9W20mIQDw&!&973XA^;Y0*c%J|7BvA2e?)K_237$x+_&0!)Pmn+M14^ccf z7oCxJPJ_#u5>Gh>U%*%@lYUB|jy1kt_%;`y}H|CVrS4ZkA{8 zh*EXLQZ2DOHYygk#xmwO>w2NsY-4MEtdh1~!#2b0VjZ!P(5j5L)@nLcNJlFy5s(KR zuO=;!;;qaSZ+5Z8=mcLw8BJ|y0C;GMCxaSC4RuiSXY-|*l8@Tx;Zy& z3LCU;99>wvF35V#H(o=f%a>8+DI77Dwg|kEX;G1dn_AcWXotsU0HlThLZ`#3S+2h} zFl80WsWx}~WB~P{hmTVNq9|pDQ4irH@5+HhD!scWSyydE-lFydUDiw9-QjaA*Zp$s zSMD#EBgAN0(7Iw1euT_(59U6{GeG+>)<%fcxxo5*DPv7;D)%L#EU_L^IXWGm12UC_ zuCO?_Q|q#(Fm)5COxFK4$yXWAc5Oo!YJE)1{t~ZQqZirHTW*PF%18_pt}?#QEjJ8d z)U7<*&jXp(wDs+g{@Z(Y^<2m5?RZ*hLhZX)lg&nk&NywcyBT=>a#YFRnO<8*Wfdn~ zGMPEzy*Z6$8>Rd9bManR*HWLox!8UC+q_K9d_2p`6c+Kf#RiD0c!~8x<>*;!F8mMQ zf+owoNapW`qC1w076%kX8T1yO$VpzgT0C_f?8joDQ8HSHGl|DT8s`;51eGo3R|NIRN+%kEG*_h(&x zr(KYuq^E>pbS<5bDca({@G^zi0&*Q&AhutmRek0bO15oKG|nfN#>z?)^w!}b+mNel zP&pj-ZkD(654^;WfI4GmF-I~-uyRj=QHAJjBAR$uGpoK0qGpid2}?_ z85dL0q}8W&1J?7hWt6kCD#A+8u)PyZ;QvCrt zm}?xtuEU1pKJ>RajAl&f?sG}R{_8B)G${LbwqH+W13oeai#cOkaY;O*5zzX0V=DE1 z&Jl{3oxoN5mfsPb)R^)gmTGXNj#3?JYKnv=vhoyDQ;BQD)ReJkOO;~(L&qQ)`{3nj zU0CSwr5Cj7h=D!2_LE9!x4N-KWVMUe{yDN1aKOxTKI`rHoY3K@8=9qWe?r{8QORFu zV4@7|MQDw8+#=4oy~lEl#X2u0>E%9~Qw@pOux*cTDu#El2f!X!z35EL!Qh5%y$d6C zW~HZN9`#ddmG}NOhigvM{M{aoIaojC#zQug&tg0vao<^b<$f`pvDJzVTLp4Y-r5f) z8TW2+bvK=(3cLL6ir?;9*zQzx7L;QZ)K>MjzBFQzu3gBH1S30ZDK_c>KN*H;Ow8dr zo_LjG?MJLdXOo|IcHiji_I6{LL5x>-)KSt~Jq*#3PRB$EVCBxN+Ml@9)B3!*-!|DP zt|3Xs-1i(x)et{iwix8ovYPQ7M{^5s<~rZgv$V4&zkQMjV1P!f+NrS!Rsh(*G$wM* zJyM49Y{_DF!Y5Y|kY<-P@bE;CUhn8FUcbItH5-;bab>7h>N$S>=WYnLro@|e2 zMj~o;RX`4KuBrDMUqW!ge6$3Ol)}EdOsvdZGf@j{B>8d=VnEKe@04?9VmP^_NY}&M zugTTxiMei!S(Pwu*wGl%*KFyF+;xz7BAj}Dn)G2-fjUXaM9#$MZ){k!AoVeA0$&2N zR54#T^{D!^)oc2!a6sqfw6jk;DCrC|;=*{mp{jShmqwiH>s!XZReXSZ_Kg$C z3j8ZLT3f4b3j^lcVyM*tSG80mm!s4;P)HXgEtQBI*6~3rfHg4evst>3P#b|q%SMLm zPs*0Nnb$4}8}Z1O&WmD1K7oiq%OZtfPT;_bTQg`_{!t=|pv}$CB`T8X!auE|ix8vw zY-dgK#H7N)K-ulnY(Tl9{_7}WY?57P_A($+Df7iXYQWC645+fG8HsQ7bijIOm3Em{ z(-1Q6!%gdYh5L0mu|dv9EmsP-uOho#xy;ICX}HQNP)^sUD;0(=@i1zo((>F0uVJcs zE_a1Oam@%c!eWZ1ERkd7*9akTI#X1@I)T1Zj=uPs5B*-R#-7hQlKa@3 zt;ycU!){n^mXveFO*(BT$J*n4e6AZ&B({#YPIwPyXHXnh18Dq_^-x-r$|x1Xv|R}o ze5a-4voYLn^&;}NceP%vpXeNdKSm;Lo|O;I&{8o z?sJj$@w8;?^L!r?2Y1Zvw+2`?ki!<2RNz5gO$DZW1p~z3qmd|?=BnV}JEoRR&-kS3 zE=Z5nQP?^}?P&Z`^`;`Fx=6oCs_1oVI9rWU!F-_7v?67fPO|Bg>K>-L?W!yokf;iN zDnmF!q`$@85Tb(wO%AflHJuMr_dLaLwu;U-6ltTQEK1IG_2)Bp!e$rlhfCV`V4N36 z|AR8%%0Dgwhl}Wd1^5YXNn~#fZ2tJ5drtLqZ|6Vb=6#a8!sElAWdZK@J|w|KIcwdQ zR5@!6k6Q=tvL2TB;(hLTzxx-ty|0e@#m0}w5IxvneNDbtH@aYM;(av1xJ1X*`srFr zGr?8Vy~oD!RWqC{Eo;DA@~h$nA*trMQx5$~u>xc@t)b#iO0;?R6_9^2-#MQZdt|*% zr$8D*9?xO}$@%w0xj&D#MY9>M# z@5x)SA)PvhTlvcrshPR17&;O4Ee<$_aYx(k!TCI!EoXDhbceT7j(3WTW+vSA%kkm) z-iPEsv}juneMPk`5A#qDF2ofQ5rT^3(%gX)qDaa(=Ob6s9oz?h8y`*_7svmi)n{8B zACQI%HHA~(B}SRM$kL4AWW`+Z$d<9gdJYpJ|q90st^(EH@i-`h?GWtQujuJ^{b}01=9#TE%PlyjkvO}NIOFGk^ zo7!wa968O2X;P$S_L^cRh+IlN$l2q3T&V{>Tqlf_&)fMO;n6#^eU@kgL2K=MrTz2< zstjKL|9si$ThH%Fe!t^)1@$_c-xv8g^8dg5bDr-xCqFmqf(|Sk{WM zP8}5N3pdM8zwsXwemy?9d9!N&XWxe@Qa5Q{X>HK$M8dn9y-$*APWMb_d{55YnI!v~ z@U`uGB>^4wWmF@-nKTz_nhlXnBudA(6D_iD`NV+k|CL0uvyt*QnY8WlZv7uEui1}D zx~^sTQ6+z~*x-hFILWZy?#fbD20X}gU)@L34i(0US>IRLt&we!xU54uPk*kU+jC== zrwG$lcmIhnHv3}rEg6{&)~^?tzauihA)!<|qa$HQ&$eQJcQ+FOtufLbuJ~~7Jyq#o z=i#q$oQn1SiXgjrTTm&Jms3>FiLco&N8}}8zwDBiR{Ld}ynKci#@6-3^DTbg;rE~X zMpgg%&BN>Tq`*g0IXjTAJzI{E%9i8uC-p$qxGx#i__z|2FH%P^m;n|R zscU-4hGddU_{gz*3Z;68o>sFa9^pen>U$Ta#(Fi(70QV#Bv9fC@t68M&7$JU9in!= zyXPtSGQ@Y55qYP0re8^?yRH!1QK>6GkJZVc)Fm9Q%pFRFX6WNYH4nK<`(Cw5K#$_Y zw(Kuxt=%_1RU{41zKd)E$n}Sr9B+{VY?1m+J`k#{m{gIgQx6b0 zW0k3YH@+pf@r`(W=n*-4Cy_~Iq_)CHKx|t~bHpY|`dF~A>ngh)!TsH-+j}&tDd!I{ zdm=tIOKnrrYgL#Dm=H>@FCiZkDD^U$a+}WLi=k%n8Lgl;FWcpLsgF;lO-lDln@Bb! z--OLe?IeCE=gUNI)4@l{zctY`Una*5sgL8TNz;a`>=DX$;^rO`QvZp#0t3I%cMLwv3C0X4!O|0KEA)LmW#ql zTen(;QkVs)Ii@7mQ;^vmQpkvZE@boYpJYgJ#h*!APpR|z&61Zz$%wQ4Hzu-MgE@9gkfbM(a3xQI?#;V7ez0v;qEN!J9etVAZceDfy#+tQlf%4J?XmVptHMpm2B*ob zoh9;^toU-WTALzS@dGKUmWx7MBhgw1t6qp57#Xqc@hf)q#c2N(2CIwG{)tacvd8b# zkLm0(1hk~(67o=LiCTri2q#qdFTJBpg(wBfeB@3&NFWm+ocf>%5Fbv%6>c4F-8>Hdbq z(RwpQzkg0wyS&5-HDT>w&;6=kk4DA`6zOo!9kV7%+^R99h?2S*QmZdWWc_-*nVJG| z1RlxiJcN}EVm2u* z9uP)%a~b0RL9WBN$1q$=_(^eSvd&rg5y!u9wl@77(*PdEi-8q=G0Q-Xh@FZ3oZ)0t zW0PN{N7?o+l-MHcWt3S=9Wy4!&$*-Ti=QiqUZ(4~uq@=d_&&0b8}vt_IG}&CSi%J~ zoGVf-FH_A+>e0K;rO*75_|Fpmvh_lr)vRo>K7X?~b_7esaYHZwONX{k z1CDr+%K>pLp*0$a1N(F-*~p8dINWpJ71sQv?9xn2`A;(}uq+~mhDBTj7+y-#%i4I% zZ8YoGH@pN19=&1>XC#_lId*#Q%+LFnt9(1#h*AtHFTcGHAD*LEwBbWM)O}u#B(hFq z;W$(<(46qktThVSe-OWUJ5J^Jjzp1?5(`AnxdQh~%w#W1G84D+k?4G>PhR149G$q0 z*Q0r>i8VyM{~k;&s^>lq`yfNt-F^IJM_{3-PJMYvtoW!wg(UudboP8 zFtT47{SSH$Ko}ZI%E{u{iJO$Y44Z) zM|BUJ=T7D0&J|SCi7ikgf7oZ@LbY#JlAF$#EoU@`Lp44`m56#nEjf!)*F7h#gBf%? zPb=d;P18XNty>l|z|5%3 zmUmqtK9*&?z=(=xqU2V}Ohwwy&EiwVD z{05g$U%K*N1eCC~V$ZY(qg}p+G$Y^1ELk%!6+FQ^> zG|uc7e$Yh18=P9+PSyrKmrqP-}m%6l@+l4AGje5A)ms3XE zCiupZKIIWIgvJOB`!S7*m6q%oS!|(f=7egLUqbTqZfl~@Xu`c&9(eRc+&4mD#hMEk zX%lUqiEm$qry7aRnyD*&^Znm0_FdU5^IiDA^YX)06hg%2d-KJ<>wb#)K6m7MGg*^P z!%*fX4^;#Axw%54*>W|Au`wya?U{oLBk|{F!be3%-wx{|>^SQtf46G_LF**wl_u!b zEM)C}CjEUGPHR;8Nk2^E-&Iug!hKgWqWhYvhPY1c-eRlz#l#Ib6!AV@-dkUE;c!>+ z@`URJ>!#vmiMm6sK4dYH;$!AKgv=nCrb#cHNpEz1117&gliyYeeWwY1UVa-xslrSI z-i}^qfhCdKYAn6k+LLH3g;D?FV>qUcF?&^AA?+{bYcoSuxH0t*UEL5KjYb)T^gdek z5_dh!djL8<5PNg5#F{80S(6!RlFYnU_ZOJkljnGl(uThJOZ}`ZELhX6YmZl6ymJITdC(aif?< z4wz|A=-(|Q0E;ZT;{i4nhnlQ=J>2PvSGbFNy07SmaV%}Brc>Pn9n-+&tl<~i>-ks zYi-cXOI@DprQ4a8@^sseWaZ+FeYATTwKPF%iOiX77LY|&8e_P8x2~WTq~3355j8+b zH`6xq)Rwfk!6bTR*y=4m9ZF3owA)uq@?z#%M+&8aDyXVHw<=uT!M4t?~eckga+%4&b)E^m{O}$`1ao8En zS8uNxPbQbjUn68;|9QwdlKK`JA3J9=Sz-Y>^e|>IF#{TckaoKvJ}ym0#J2P+h77-x z{#p=^${PNbsTKaXKW{Z*j?EX5QWSJlQ5)#6q7Km0iZ+7wD%u6wrDy>3grdWs?TU_o z9#eD_v`x`5&{jn$&?ZGEK^qkffgVwG3baAdFlfD^v!Hc~9AC`!bt!UzIuyAQblE;#fmCG3l&v@LW-(E^Ay#B z>J`<2>J-(3Y8A}`RVxaCDi!SlRVeBKl_}Z_Dpj-}RHEo%;jwmVy9aao)>+OMb-v{z9Xs7Fx+XqTc&&<;iOK-(1! zfVL?*4BDjV213jjw z0<=j{C1``9YEYM=T2QN^I?!rG^`MoC=7AO~3W4S+S_rCDv=~&OXep>f(F#zpqLm<@ zq6o;PXccJq7Aetc&`Cv6&@n}8K!+8zg7zzF1MO1O0otyp3$#_yI?yAE)`Qk5+5l=( z^av=bXd@`1XcK6uqOG8iqHUl$MUR0h6>SHVDtZDGP_zT&SF{V{R@4JJd$W{iFK9^7 ze$a76PlJvq8UQ`5=rE{9(Gk!SijIP|DLMw)sOUIoy`mJTL(xgl8bw2(RfOs2{%>zB5CKd8RaJLH4^l`0*tl@ z3kY|bx8o$Ux`u++W&wq!Aq8vD4P^i$}Fu<7Wy`ekkqD>?BfkS_uG67Y7))}Q_5 zOThSn+7n;l*><4qgr)D!6QX7nKaexHw(S|`;Jt0nD?lvk|hX!rHCkaD%(Bdsi?m`Isvh<9&*zai7#i+zge0UKHis$ zVZ!{xRq{%`R6Zij6&vNBm~73+#6)Q%#3UMV*Ehsx+YYl{x!0ONXasD2>t>E| zZ2!7>uHbh&zXkkm;ddv$Pw{Kz7vm>>RxhltB)^nvMd}kAbG8b#D)-MgXcbDa zFj7!dHBpNGxxdqrnbJ}OM_<*%E^&YV*b+yiRx&#|1^Sk%=YV%ciY)!F{8{w#-$UED ztM;^Bwnd^zXmSZnDxsM`tP>fg*QEaG#f&6bIuKhKi1AqB?b7p3=%GXqBglEC*tK%Z z7EN8gqZf??H(eOzTZoM)PSU0eSM#Dv(56V>HX@#>5vv+Jn-YYQ_@)1jN<+^6$N>+% z71~aO6|*MN@Q#VFCSG7Ca`Xks{dtLGD&J0z>K{iMVxPJX%YPgk2zS2Lx0W-PW?D;oY)_)63=x%20PF{xN1z6pcbL{VFOX zdP|}_RLfGJqfL*wvhtSS(uHq#pA7MkISWd z3TAXYoT*qDUljhCuJi`aeb{eY)Kn})Q1XnXu9Vh18*M9$aqVu`42^%zwh zXt<8*^mWPfv`Mx_(fU4AW--AOwGovyf@w_5)gE)i z9^oDK`g3LX2t$F|sJ%`Z_02`J&j&o{?W00o*>qgT^N>9uP0Rf{Z?W3okh^8MLCP$lv}F_b>h8)5dxOT0$EFSeN5>O$dmqP7OYbYInmpw& zi5e(JY#l@Fv`|h%A(EA+C0BjVNd@YPu4lrWTAJ5CS6u9%EqzOm+io1bS}iWgRbR>b zt?(KDKxA1S8wn*P{sFZpPZYvzIeQM=u=NC6&MTavWNzr#>cqHLY|=*xq^_3x)%RYN zzSZQYZ+fIdbDYs{O2q`Qnu`2AM++9F^fMO}^FmsYd;wwjQ^%8z!V|a zO4lzZLxo!WYj4-~(ELMl-^054*ZDL;cav1EgY@gb;`bcJZAgy9Sw%JWRKQa1EoR*OMjXNJ;%t(yE6`SB500=*>anlNv%YHqmp3uD6E7 z-6bSmp+>%$Qv*i^9-Vhwvz1oT%uq@Dsday2vD`tc^JZEsx7i-EcI~)*a{H-ZxjeaS z=6iV~>3HKXzuj(gCG2Qv0EepQAu>z`#*X+b+1?oArgHv<(#KK!LGxlcXfkms1={lV zQJEQ9hQ_VGbo(ZpM-eLHuP?3OQI<}3EMm63@2PFtKL6KT`qK=imF>`hoGKvq zkI6l!3dsF~a?hy(a^EfYoGKvqO>%!}Rb5jFH%(G9rwYiWBXO#LBtlTj`NY^~zL=*9 zNHQqGJXIj}bUc1v1??!{uY|vw_*=%`8vZP4X=zse(rohc|H*$u(x1SNB|b^xL$3mr z#)n?#7x#yU3O32pHT?cV5kD!&C2Lj9HHYe0pg1w&7^COTG)c&=HB+eUC&*g(A;vQ> z9PKS{J0mAbJ8#{)N=#CKBt&ruvDI{~91ZX62j8*~L!!dvj|rIsA0dG>sF4INGr@zp zHSR3~5s!JR>6`M158o4-)j3x-pWaI~K{3mt&nW9kXQz>K<`; zXHH6NJ~8He*zZr$RWZzb6syDZ#fwj&SWbAd$#-)u&T}6#uCrEK(7(Z8O zo_ouFwbm8b-{NSj>^@9J+M*nm4Ca=+Y zm4<-zBV)LAZ`tkM@@!RgV?^g}j9e=)H@>wHbGav27SYBME5x5K2nv4*5u0eVjC;NK zb#UWl`|%>KzD7DNL89>54CPMeCMU57ZN!6$uPbsd)q8}<4SPGp5+F1U1}_6k`h_w1 zLwcbizIz09G1sJmU%kI&x^=TdPqxotRMn`yuAL};aB`G~E3BrwxQa+oq>|5kQe{xa zs%S-;+V+E!r-TubbPVxQIRCUhq=xo7ME~I`e7o_wHD(uiOsGS`QyQ7#iW&pwu;|@4 zd}|73S278JhGMe?g3`cy+GbK?ZJKH~u{Nq2oPjefX^rZ5V`Z|i)^tEqG<-=i(H_;{ z3hZj3vfjoDYA;G8d@r1iPzqk80U3?z2Eh?<8q-nCnxLbIuE@=Q%o^P#`iZm!`(B!? z2j}pmsqfQyAI*~SbYkzvdjiksfgZZty=4y+Cgfn&7tvK2>ndc8A|unZ6iVtXZqz6i zk_bEr9bC*Pzev#U6=Ilv9=gSV)6_l$jepag(J9&o6BqJ}d7Fry;^m%)pn0_LZKx&i zUf5G>RPEMFrG!uV<8rPrs;p5ApOB#X%5&r0m5x|h##qqe?(#I%Q^Cp6!ifyKyK@Ng z=rA1a&c7ErfoLP23Ow0YKH1V&p6(1?{;)Nib<-^n%9v+c@VJ;q1v zdmnRNxh={|u%3P8Hmc8#4t7_jcUL;02A^$T`x{b{p&tupm-V z1V$Z0H>IJ;f_q8Of-6*dLUI$62`7*?iBZT@Hcz`(r;byA;wyM!UwX5Svz zb(@E|+1s^4D#eiSxnT#-B1w5^m#++126j@sw?%7gP~}aW!8ANlLMz7S3+XBG9;XnNtgBBjRWA11u4v`tnf-%C;f~s9Wx5*D{${adS6NUj?;U(o zJ-zQG+g>{0>n0S8H(Hr#CXQBSd~n)qN$ZPNx{_&~?~`_AqF|j^Y{>l4$}BU(>S*O8 zb|QnA66ti#>Q#MKVq7AMzz|kPUH1TRPxoZaAEJxzvGVAZ$5nh5B8kqu z$HqHfx3$kEkp?w9OmN7q4d4J2wc2z!+3x=tc+frP$`9_Jx7#DV!Zy+oC8`ia);$&O zx6l!l&_Z-X9#@&qHX$w23znt(I>gRWGX|Say5dtuV&zuQ zI8%5ix+3pv^zT<$nf1FH&dT$*ZDoO-@(OK4cf+}sr$oR^45Ng+QP-R!(grgNiu@@- zoyQ!kNw1dSgo&eC!Elt?@GvJDGc9 z;$lXl&63sK4)u9QbbeYzh}fplIb5%eE_FobIId?CuZOx-y+_T#&eYxYD|sTo;-YMc zFe@u=Gh)Kf-^qu}x~h6@udJrPak_Ry<~hUbVKUzUa;zBXqgniAYDP`9VY(_hNko#B z$s~eA9L!&~w&9sHRauFFbp19oJUTD~A)+(Yj5^jvi>Qw}$lUQcOV~}YCki1Xi&;-} zz9YKGaeWUPq8fMo_2|O2Jeoag)_<4Z<85vd2c@yBYnpoMr%J4p33;;KHHlrd2%3`sB`=< zdzLn;#t~ioOIytG%c^M58byO$Yy2bXmX0Sp-Hy*GyC`s;HT9uFa$+ASWLqCCPb;y9 zGd7EcO!gq9YI6zYQf~LA?TJ>+38#Q99d8F@&`UgC2{m1~&zy;5mQZdO;f5>e zPz_P5n0G4EI)(@p_%OvU2sJHmcd_#+fhqX3_&!>FpL&jgJ2(tqqn@0>SNKqYtO_fH zr&neUzErp)^8jGai8|$Ny1bnXo3EUtUuVm6*5FI}!4t{OGYM#^gMqhda@6&mo?*NF z`EHk;h!^rIGrIUY*7M%EcxOw#8(vB4Xi{{AZr;9R%c7-LCjCQ$uh6o6(lYVzzpx#Q zik!>?Q7bK#RFlnAX6qVh9x^sSnr$B@&hou-j`d31#|4;)DTTcNFjD`x$ej9|Gonth za^cwHAZt~Zyf&O1C8A8XB-NRlO?p;@-fDrrDBp=oal7^@^sYu7&evqwQbm#<T5hso{`rdr+PI+(Mk9jPDIfqWf z#)=d~{vlDtCc1mygHOpaKk1)0?iS~w7BQH8f48_3eR@E^;yTznPL?HC)BjHIk3PtF zl1(~Ugb?22C-R6Z#}9eD?uHUX(Xi{fYfHJhJ0rZ)EB%Q65YeyASeUfqmcTk^I4!W& z6}p*thoGR@M$7V=bE=H5G9n(_t2Gszbd87MXY`tswXci)1(u<*ljYS*(eq5B^>Nri zBR|m-i6W42@iUKZ)82kEUP}dK6*BECgNMstRP*8fVdu$=v{IC+)9Z~-)(H;-f1Cv= zmh&A?luDTD1|mt<)VjBPfvC$Dv8nhrx`;;gHR8rSPjFrPK~?YNr>=nV8&Htkq^f=H zEw|WIwdknd4wWqEIAy=%GaLr?lQ#%VvLiZ~pb~ZwCKtwKE7m?>KQ@f)?(QsNbrV41 z3m+^zu_XKqO&s9T1Kj8U-Vl!gig~@XNgrm7G z_cEibIGEY zpmd-?LXWt+=8{C~d_>?`7Wlf;-E|eO+QqWN681@NWT8(K2luzGM;zY!$=TVlwfQnK>)7sa0^o@%J2rt}S_wiAh zRJgVMTpRTgMn>Z7FLQTogszeJcNE6yXruau&E6xfFk-(^+t# zfX;UMXK{rNpj!!VgO0$hM6jv!aDS8in3TVO5pWZ{sUf^^D3i1wTIWouGv>NXDvg!Q zAFuQHPk0N$d(Ddfz+RTF`1c=H@!t=9m$V;R@h8oSms4&2d^KV}r-mk0zI?p$vSj6t ze^}+;ADT8+xddI)cmvjr$|huaK<;Lb!e(Zf)$2v5+4mpEy!VW^zTvrjqobpi_SfXs{`}0o zf#F%i!5~61ZISGe&z}|TUqg5YPesgEH^scawf7Ihk=>mOr8Hg%+}&N@692>$q}!hZ z#>*B6F9G4p+?|(^eCV%8Ws-&N@OHDqBtV5NL>jtFdJrqwu>LD*r_}7G(UT?XPBceo%R>(Jt?2{#M==0D9c#0Q*tar z5v?o$wD#=~(hhfLI1_L(ak{(e8Hu_>j0B0WDGjsBB6?X8qzt%gNHkPN9=_thDdVnE z0_kzGov;bU;H@_MDH($&7;cNfMFr}PTzBUZbHqX0kCQy#z2RD3uyGn9$OLDo&|!X+ zcdA2kpbBz%hoy#aL_LX?YIqU87V@pN{hRURDRRAk~0aiNmIdmQa z6!bCY$DHl2AGzzuT?0e*7ux?UcX|?Nh%}t-cstRgekl=w(r>oov(k=Jv_tpC?3w)> z?Kon#gU!rH@mMd+xqctAlR4-7cpTFc1&vfp6SgTn^ds`f{2~Z3$2P%|Wo$FW=&=n# zuvnGZ@g_m1dOlWCA-tZYAnWU|sBQj!L7lwfs+%Nmbb;bVMeszMIy&p4BQIsNzb0O0{dOV5iPKj> z5=vtnFkc-L?#DD1$}MqsHYA8Q=DL$67P~i;@ zgOg!(c-xmF z)E-E>)SS%DXLEWYD>frI7H95nj8u)nxQb*ZWBxf{l5Yw8EZ>~TZcWZ)hhZxwHzQ<9 zQm&dflNBVn8FS(iq4D32u_B@B2}=Vi`?g?=_sobB#Ck~!!zum{hO|sGBth(A4B{?e zNN92x!u%!}5@eTPNXy0<(lX7E8a|96Nm;K+Sz`=|(oz_b@V5&X(z5qqNRE#=U`VY; zS`!S3J5wqhXGqJ!!jOvJmm!U}Bgv3xN0K3#y)Xx68KC_ThLk!mHABi0bg%$Jd5I)! zvyX5yTSScp5V8z=j($!+6ow=-#Pe{WSV@_12F;9^88ky;J#4U+)p=d}8Ck2>ySu&$Jd$hm=8N@O zJ#>aM?r9z}+g22+i``qUYh-gn7HUeOVGHjEW%fP(XF-*SC1TCDjO2%+wU+2gE7syq z%367Gpr`e7>SWqJi#sqDZzm zWW=A4&VUlkdDeno{UlICwscBzamechqaLYJ&+H@8K0 z5uR2gbnEPN>b~iIzE9U`b=T&-Z`VG3LDx!SbHl`c)E#uJvyYtDJ(u4;7|Z{>*}-Ya z4n`>^NSoaL8dyY6%fh#N=Uo?OdI3c-IWGsm9yIbN`nSiVI0&$xT$2G0GUi= zwWJQ)?56>pUZm$Uk_xbfS{%BY8F)qO*EMDA^Y2l88hiu(Z4mu(O&QtO`*)c{FIer` z8gu<%eOb@THte2{#!9Y~(_uu<^5%JZmTjqemP(W?=t-$m%K=mzTk{)BQVmud%k19inQlB~W{!UbK@D_KMY;PvOHgWi6Cx>6QyXz$K(-_M% z`G10CR+;>TY6|1-EmPqyh;DYVg2)k+pF9}zen+TXm@FVPY3WpwmP$ohHo+JcApt?x z9s80@{lZ8OK~wvoDVKWAKL|(Mu)zG16Uz_ypAHNFMy-13+81;E6E)_!H_Vh2C_V_w zB_Q>SP@Zo;Nj2guQLL_3O&;R^d8Z=4qf9syZAhPaZtw`1eF%BkYL~pqREH5^D@0@D znW@8U%iD~>x799Qv5OsTa1FjDB{<30z(Jr$xx2K4+kiw{;iI}-_0EKsoDhKr)h1>) z(c&DVe+^{Vr4C94uU0B~v{K1C_==w`2N)B}8vFCKSHJemd)yn?Big2CdHb}fXEOCdd6_crLX#8=Yrkkx7Sjo|V%7dZ`?ImoHCFn?`LHaaZm~w|;?XIEhvZa@oxHfi z7Hyb}N0(whgogQ|Zoa+jglIAcWEy@`Q-^QxZ9XPxhg){Hgj`-TNywX6Y>lBem2gO% zujvUT;x3I?RER=B%TVF$pYRgxqkmuw-$M8eWZ0!%kPPQh5FhjX&y7)$s4TrE8KG1f zd?j;GHF#zoN96M*=r)^`*?VK;`JRwwLhqD^-l_gvLhH0tv`)F*^>GwYLJxTYN_W>E zglIsVkQD&ViFrR|e<7BCt2rBfO0khTSQXVZW8XUZ_52?t#tAxlu#~H3FYo;7712nU#38F`jd%ICPS)$ zXoQ++H)1SuLt+{%6#+?R02*2}F7fSP{jtazwW}ffNJpha?X>fTUDikPd|KM;5a0+q43IF>zIDvCKOP;TuK&+55NkBA87ZfO&$2DbiQ4~uQLBzmnk+h5aq zt(Oyetv3^Tt)Y&?wn)?2rQtogQ39(;b}&3=65PLyO?Q)fTc z7%7nUOJ8&!pd&PxuVYnWGO1e8O!+Zyon}Y-q8vxZ@jndy`Zx)TyY}(E6m)~+%|Mbvont@cs@`LII)=n3v-}JG zUYX@%@*YXRz6&gG1ItpK1O{H#a|A6}tY{%8R0`f*m-%eWY{A1i;8Sps)}q;W2AC4{4W$Pti6O0CAgD?Z$qr4-o6t6vUl@S zlzi;nFc7^m>6_~$>Q7lGp?U#MbeVy8Bn5zsFvgO*QzE%0^=0DRm(-Vu9~rgENQ=_~ z)>0xE+$rZIQyDgUz~7A!Wu6vgsCd%jrkH{g)Xqfd|`R&=AlM2iG@S|lg|1SL$c zG#cUDJ4Gavt6}aeh)0nQ{$~V(f(rzLg8xH;0UJhgQcAuS4DuQyUmq38AkW?Po(v~p z-#}iFrx&5ep&6Lb*Fih*hh}OLgAO3df*x3D$spH$dI7^jm^U-Qr&4I<|392JRnuj1 zURG!S70x@MK;e*ZK8h5T;D3hmiURNDgaS`EuPE^TLe48KcttA_lblzScOSrc*T^8$ z;^BWI=Pmt9IB&`SA#Q}ux8V|Yk>X>`WI_#e;g>Q=mfv5?ZF@R!I z<{XNg*<$3LV;=z{`D%6ny9xM1NWPA(m_jw%&=KF=#;FZj;ShDo@L&r!S|RpN8OS)v zrRP!MD1$AB)ZUJlZT4-ZOyHEX2xjC7494bmJ6eX8g#UH;Q}(wL-w`$vNldFGM|ZNk z2hH-H!{`a<=bCm%xARieJlgO&Cs5^dcYTRhYPZ(05Wm|ZH(fW&JDH-Wd!g7RnP8A9#ytl)k`<7cvhKyw7*+r+k6+ksm@U2o zRN@PLJ(m5yZf_Kpi7JICbS`OwRV0Y+z{=U$XOd%?E~N*9k19X z>w-q*<|9WBYW;m;DEDh2YC!EyjN-#-{+%7Ke^kIYlm-NKS`^D~ za!?`TxPCPJYpK`%v{WHRE-md;!`d*RxdV)R=SXl_S8IStY~UdQ59v~g=zkv=`{?|C zBQRvg)s!exfg$^?7XpK~|7BndPZJ0V)T)SyQDa;|cQ8AJ&*ZVDo5+?X1&!1Bnl0&w zO>iW=AK?X`>_@N$BJ z<`9pJd|A*jtheGXs%)?{oBepVe_TC@5TEYvQK#&^uxAf@4_ZTq7W0z{ z9l7fF_r{9uq3)s!6u)%1IOhGi{dtoEtYaR91LU=AV0$;E&ZD|cgxhQcTd`fqcX$4i zP3iPvxK!Lda8$46*d$LbXneCG1_yT`*g1J6g<~C~Fo_x=~QN+rM2mVU%gJPd8zE;1sAlh1TkeLZ<>$ z9PqMdLv={xUGZ3c`}zv@)Rz5*N!M|k+CEG6A>02fB8i;Ji4U57)AMGUzo+A6c-S^s z1or5cc<#Z%I533w>%T^h?SNw*v>Wnur)WSGljSPQcme|4HAV1+5*yeM1 zGjb$JKC5RGNn-EVBQ6=*yx**5Ql0T|qMG>Xv3lB`Dvb~*Vioa<3S^tRn7~nU3hI>v zkPx3DQy?zrRf`;WDa%l%A3323pT6c%cX(C3Pd$l?O<#0rTIM!pq|hAsNlkbIW6Cn& zjjC~OesGG-Gn)~W>)uo&t~+@#$1_Y5mZ2y=H%KJ1(2eBel3G?mn|WFLIU%jk#R)BE zY7)eyJWH0%Gwe5&G9gI}%g~ACdVb=)Bvx}IbWd*3ML;VD`?VIQd(#{jG8=+Co+si@ z1rBIt2>>E8Qr8CUKmwRdwQNBz{g18nbvvW=>D~BIEzRhzutn>gL~)5Oo!njFh}LIz z2h*ZUUELMw(fX|JV1`=iiBvdoqKE`tYN;=R^1MDff@*h>Q{wyA$f|`0FILX@#`7S1 zD430w(Fs~oOuQxBdHK^P{y>=CfGkAV7We}oI5=!tGH{Lp zn>O0ppUHZ#2HNZ?ef?2Bb1vVJ~GRms}PLoQx<#&d=zN#gl|Q!TIRoU)fj&FX3Y z&cJpZ|41T6Sp4VEMRQ%hIQAV2_}|>#*4B3N<(@Y)W>a&H+QxwLZ##LwzP)g3+g)jn z@C*)QjdNZ=xs6S_;ftlkL$VLtmmcpc$GW`FwlKUOPY3DQi!EvYu5Va-wS9xkuExle z#>gt2)!99zdzD0rqlg^l6`yn|SQT^pyoU30*zf9i!fQWjANHRK)tp}*@+-&bIf$1b z-g?OrC-tRU5=BxW#R)&pt`5e$|5Q^wvB>bF8W=zfo#?$^hW)7B&=n(@G0bFnjLyq` zw>NMQ=z=K;@`fCf4NIDzrM@P?Og++f0lF&rzNp)lwoB|!%dKg10tZ`O5u^kTs^QkF zrC+e7sw|GgfIvLT`+dnZlU=Wc?WZM+RCL>THp(@(i=Xxb^}tT|{aa^__@6g74M1l8 z`l~<|*xGDuvuI?wXA7b{Nkj>X;t3Qj3?GA(z=9$y$QFGg&4y6H1?|YGYK*M6RmWTp zgU|XZ0aJ+y`6K=pL!Uc8Zz^CDz+Z0@2up4apL$Cnkphku-6(X6Q1!LQAY6ud0!tbIGGJ=6FdWcrEdttRuwcQPXjaCL_A4 zMFk@ESNWC`1VX%D3sN1>=!z&XWJjG}_lA3=AR!8HneeR@!}}cdSiJMwN*l$&W5d5ld!a^|R9s9dq1+rD zl2--PY#%KXCvLnWRkL^I5ky6KaEa4>CT+lFlOGANv2b$cljvDy9+4N)a$Gifnl@VI$3MwRB*$3UVOS}pmZkY z(7Uh8dwX88B|Ak*$?<=!KWBA+w1g}D0h<5C{+vfok-vnVh~g^*A|z!}6GQ_N#s~$v z5*qSo8cLz8EP0zPZ%tCtGg!}SzRc&bR~aX!za1wg*&a%fro>;d#B`KjEXz~mr|9R? z;CV%{MRD;a{4(Bz2QFg1E_dn}8Kv$`<*wM=Qrqw%j-xVXnISt{!n=A-XTZE9*h_3~ zl}(Z{n-9;DRGPh!s^_#jnPl-~t9w(WiztpFgCu5rPHx93Qg$@whA$2p-}z>8&ew)= zCB3T7t9oI*K2_%+E>Ar%C{%UM$pa?`E|Um-`D|6Yekg&Dc*vvTSr%gMaqm?)D>HGX zX}0-{9_q6Co$KBpdq&y@N31|(zAqtk7Ido*;xnI}j4Az2U@ROkaICcm`wiwK_og%U zk$PCImKg#C&t@SKkC-?Uapwc( zq`K5Osa(%V{&V%UDf7{4CZs1-WdQ`ugp`<%N_x?;-{H1-qKUu9xa!3cKMDVTPomaR z*wrZuzwWNX08&V*?bR(%bh^8fDh}*VsQdm(`G5(5be+A#15fy0L#7lR|pO6WN*lk@VH79M8hg z$5g4$j3YDyejrmjfMPTOsQ%f)B_t@mv$xLRa4%V)(Zase7Mc+2c*`eKVGbVUiwe{n zb2gge6llw^-by5R8AZ|bju9JgJmHIInyYP^O+w3M2dA@+$=X~n!zN@U^x+bsSp<9* zxl-diuok$BgZJE>2LyyWYLjV96Jaw_R7aoh_|Mf>u+<{yk=GW!NOszz>CsB7{eU`! z#5^o|39Or@H>&kEERXuotI3QH5>RoM@Q<`a>1auPHgbn{L4X0P; zgoqqP)3ujO4gvQYoG4G#DQG+g75^I_6`8ilBhEpmq7{yrFCsf37+Qg1`^zFmNaxad zg(UTgh=d4#cIli`q$^DK&@9XB?b0$=g-t$;ft)+p3A;) zTcR7wQv|~V$??TJAk7sdTo{3~If)oH5aEBg z*hO7#o=lo$wl~{sZ^}8T$rH^D(VzpVPbDE0!A7;hXW!Xx*{WgW$hlNNE~U)C=!IkoSKiqJ!Y01C8+m@w4=({q<7bUAnwy6Xo?w@X-AtCd#)D zEsvQiG&wQFF^_R@#5jAs&sYx8{w46uxlB{!`S5L8CIFot9s_7f*>Wp^tITjkP?iL* zVh1emE}fd_Ebv3d8xZ%Ph9C%PZGG2{Eiz{-Lz|5eJ`C`}AF?G)T|3J{tEFY8I@xoW zP=_ZEkjp+oFrCj^%eq(OUQ!mlq^y#gOT)ua9=k=#%b9II*Db+CFP+_e>Fi1-B4c$(}M> zsnyz_9-Ofz1*Yynzt`DkH^~Gk$En4bl65aSE6H*YBL)- zEQD(3j8|JjwL93iUFr-BnAO%Ks+}*@ezs||RQtsXtDWzRt$c#owl}Kz)LP4ZZ6D7& zBP+ebX@EoEv=HhpZBURP8$=Jvn#qN-6SFRmO9Ki?y~jI zW2uesS344EeJe8WfSUI%5m-XAg0hP@hxk&20B{fr$xksI#1PxsI(ZxeI!(I0ABF3@ zKe}U2$wW5Kqn5nu-cpF0)TU!1z%ZckvqGOc@2veDt+kJY|J1TXfudF*g-uB#@yy(t zdKjXsz3xp*M(jOm$yugwz3aO2?8z5<-tgF8RIMZSQ<0TtBdyeS)V^&&cm(XK*0-pS zHF4;Y{&_D|FpJdJsn$QK@X>hfORHA%dH8a*#3e*k!M& z?OBLz-XG^jYR}S_*0%JXOY5a3%qHYTm1W-KA=s)kcH)N)7|p^q4xN z8LtHDT)c&&J0*gdSNOS?1*j)*jDc`f1s~j<3}K6UI-;KzJS2%D*9Q3wePTiAQrSM3 zR@+ok4O(AVD=iiC99Ag3zk0Nf;r@%^j9)z>H$T@19j(_4q3gus0)zGC4B+epANYuR zmQ6tQ&dC>WXS9!YoU?@;eb&aZ?n}y0UyeOSQLWiWh~I}+s7%cNvcrGqv-Xy?pOV(D zzTMlDD{ZOPZAqL>->Z*Qf>E*_BA-VGe|lUNLN#@P0WFIn$++C#eg*Qm4*A9XZ8?nw z5H_gq7s=frw%Rkzg;2O$82?Fvyjm?Gc5tlf*$JCKnW`f1#FLJ&z2l8hwMX=i$(TsY z!}7@)&KyoJJS3%%q`71wN4+R$>^J$ZgqB5wcJ_9>VXf_mTg{kssD86Kqyd^I^oIj0 zcuW%1x@`3(v`c7j*^6g6O)teRT)bxT>Z_`2YK^J?D9B+s5$KJSJ647-PMw|;6$Q?O z(%T^yI5v_Y<>b^w2trlqGLHW|9$_gaNq5%=I^$XXna)xSI`tiL|4_U@jGW4910C<5jk@eoNug>^e zT2W&>t=Y443=pynE3rOA`IEXljO(p^_LfeM2m<#8lX*0 zLL#5WjgmUYQZX=SaISP)h^sEhQ%)6+>>jXk)koL<`#Czv+?RvUa}BF%u|Q)k!xzb7 zjY!mH7omk4dF^AVYr?KEQs*(|ARz(-JxQhvKr%R)txi1Q3C);gxrtE72QJ$>%aUWU zq{$jv9bj@e#F&&lBVS?>U%)o;b1bjx9D#4-xI2GB)hC`P4H2@j&Tt*oBM@@EO-RbLm3513ptgEjH1qx2;GM1M|b25acH zr*f)TbN|Dm;mU_slfFUo5*;Wc^pkhk2?UrHBfe`P_H(PSpk{3lgb5inG705!cU z+*dCfq*D+LywPATQ1M|{0=tKXE(DB_=Lmoii{EVQ%Pl!pOJF2CLl)E$1Vfnz%Lld* zGK9xkb)@|@0cqHC;>iS@UOjBWDGoWBaBAPF$=(E2_ZM<61eF{}<*Io_eAahoBBapobE`$YPl@yYS$Nek)A7ydY>4 zKBB>`ftEZ>40vHLsadqxHTOzaAv9zZCxgNzS`ri;UHjxlZ-_x$Vxcz~b|G<$d5qNM zM9OpZ`W$tLtJl3{a^co`B2qaZFc&s8Z-|nULlA77axj8Peh#{~em{{kSONa1XTeOi zq7(r;*5{H3DP*BUgPlUYms9d##!>lk@@*sEKFPOj;mmCuJ^=Ul#Ojc{5w<#cyb0Rv zI~it}u_V@}vY`mWK#N(G6Y;18xdb@Xq{I1$(tjP6H5WiBCrZr8YC#b@r-7ZJ8H72! z;uj`r$D`vB3U(sh->pYR;4#_z49m`3j+#oOSg6ejxKK>pSHYJ?E6Dl{@TpUb2+s@l*$C(o9!BAfE1`wS)$|ty&TNU z>g1FH)|mWE93k{qPt4i%h4H`v@5bq1o;&mvbK7i|F1Qtr?A1`0Ru5mnBYoTz7)80r!^mU><5p=d1{4 z;}z>{_C1WVunUW_W34W=d)SFgA%coQGtcXuY z5o>K@Wsth?ZTqpndz7*}@XV_9HwKAf^LJ)Rbzi4;YmFS@|dcFK7hmhv**7leulAs+HI9grd)8ZT0BS7_trJUWtF9jr5^ zF|HY|vZE)XHbFVLRn>LILFV4nPiu(a^0vFvpa%DrCH$>NZ7E{qJiNy0a_v3#XSE^M zo&dvii6t>i4>3%)EU~$N)XNDtGY`ltI}d=YWa+W~9w%sx(+Fuve$uTWZ;# z7<6x0$@zURvZh<*<>!*FLrf{SlYE1LBwp~ha_u-`b9X)oIG2XLxYXS>i;3I>kLU%Z zqZiAY9cmlC!H(FSc6J$hj@V@PD~H{$wtN&AqE%cPnyRnkKf`ZGIprQidPOu>;siUUt~QaPfHx`O?$cyK^wW@wKOIC6`TvhjSt(yU+g($V-jM`HZMJi0=?}% z8e1hzD%{aCER9mz1OdN)Fxjj{@7FBqH|wS)1RFDv@MsbVp@1@Acw!DrBcr|1Gpbh| zV;!STb83q0Ed2s={6E{#(~lKoA6SALBY3DYUW90nFCo*Ub#T1(N}DIl-?#X?hrhq} z+dQlJ`#OJX_#5T#1b%aNehKcJi^deTsJhNc8H8=%g`6x)mX`(;b1mO=RqA8C7S z3uuH|hE^Zow5y5#I^N2z(c$C^`sWf3nSXr{kVR!MB1#o1p00iCFK64Qt=JNtj^Tdi zp|CsJVB_K}g9Oo~ycXCQp59a;V7d|F0*uJ}G8VFX2}n*cA3MPwrZse_QF;x7p0i15 zI7_t2bgd|Nl%{dATQ>SrnT)Xh3aa^>&d3Q1vOaeO2_P;jgbG#&#*dEyx&s}o4Gx7f zl67R%QRcNQ>eWTKVdUd1vDU$v4stBWgs>?TQpBPTF{}ug!l^EbOjTi4EaMw);R4bW z&twBO2c{P$FR;4q1IGpK%wDJn)xQRe;K=> zQOUT(%owf8?M4(a*1W4T$^ck`%7{TBKc8T%Igx(!LtZrkMP5y?R%Y1ijph^acx*{d zRgH1edvu?O(Y^_*;V+T8faw>_^gIV;=mnLpT8##)*w14vV{HC0`AjpQe0o?=4X~K2 zjr)EWkIPhklU@&H_G63x^gATQfwHQ;*65M@mfW=+Pn5J{@F*P(FCw`_N#L*vSrnKV z`^1X>Z-EG%2PmLpnwn=>#gffxSP?UXa#FCa)@U+;hf*f-A%!IMcoJFcq`Pw~ z)MyHl{Tv(oSOL7$-T4b%nsb}G^T*t)%Hjo>fL9hHv3+|3FRojkf4is7&_+$=`H*9v z|Bj;*EK(;U#Lh*YX0Wg*3iO9uLF0+P)1(_&??84mUw!N+iB|>Jt6XaAUZ(ST z1N~;8@6dELWr7XVe{{SG>oN6_b?lv@K)pc@ChbqVnFD!CuaUbZ?t=Pm4R>n`<=t9& zcdguoxNG~2+^yp-=d*IxB471g8+R}1yH4&b#qzaV(sB2PGQd&?nRuFRW|->JUtCZO zJEnsjBWd9*sK!-oe2i3ptGr|M3+o3Szm%uKty}W8%HgoA>Jw`umXp`MCGojOFC{1r zHcj>FOvjFR;nsKl`Q$)KjC;p#wxTSOLlrVtEr-G#LtnfZ0@$H>a>z1VD3RQ#9Q&wsYH${DdGk`P!#wi2DT{LJBHrH!9Hb32 z!D7rXv-LZE(?C0UfQ_)U$f3owUj!+=XUVzGkStn`PJNbURkd<;NjZS2bf4@Uq2icH zha63kjy1}(xx6+jUnBhV$O@B4`&Nn8fliGxv9}U$xcU)j=BC>gyQ!5=S+x&*-1${1Qn5E1mAx05`GLY0+NV z<{jNy-9109&odBi#lUX5h`hS=pp3&~RLzQ1R5htAgV zXNS(&&A|{Bom~U84-*gFu$EeB6vE!o=u_gX!Yrm``5wa)E4p2`qJO^h#S-)WYs~eX zm}^1I72$t-53r;lAPtfaBnQ}mJ68dt`ujnHzhQy6F!54&lJ+XV< zl@}xFca#x3y#b!ViG$a1%*77n?GlQ`Z{>lW*y2e9EgAlpx)@=v=mGuyg!_T5n1!)r zGWibzW$fp7%N&r4;lphmqqb05$EZF0C3Ugp9^*}^mZoS-o;7vph(k9>-&hrFkN(lb zp~Nb}{Q*q67HCXr%taG$@1jow^*e39hu|3e8EcFJfV!+|$DWi#+7_Qii@nC6&j6_e63#RxmIPv?LRTrr3H z2f7pv8ywGN=E&S;=FvHzbSD`+58cP$7D}mZ&T2}hI_0b~hOr6;H==qF9SomEAh0z} z(%<_XF#)_#j`CC+e=rlLjB(^M;eWZH-@~y;spv0^)2Vz7^>3Q_fck6*zz23jkK$6( ztE3|vrCo_835Dkvbz|u-Qt4Zy_I`(^3=N|GBt;^^j_(YcP#$Z)Gts}yiA^@YYlfzI zr+~mXtwErBHJ0Cz$iFM)BUNmaDFH96t2q{u%SRK3m?c;~QG-q7lPJ%vcC z6Fbax&E5&x{?J0>apDp-i&aw_c2V4vyNuhplcR7jD?#DjZywguUoL~mf=;ZGBXUAa zLg5*8#$~*sI+4mb7wCs8r7Ln4Py$C+jY7=+3@M*+&1F|`hqr+H8)iRwy(#2(^Xo98r&F^E={jC zmg^K8a`RnXkxLq`rc@boc%SG;>UcS?zSar#)d!8Ih?yvw<4UJg*t5P&jZm9kywonP z!6UKKRb@1oU0M`Awp?2999c+AijM+>pfSn(yfl1FB2ena{HvKnKc}{4>^zmR{@14V zzlH_{q(POAvPdQB>?&i8Jfd@|F}^5wup!1-$4ERpMPV^##LQj~X9dAe(3qkhoy1NX zsWOgDm99y@#OqH7i;^r~Ftg~Uujk%OQbDh^2E77kJB;_pTVrhESA@a-)ytDuqy@5` zbu`CWuY6k1ib>V0?r6tbLE+~sYSmS9pRlt z1`A{z)ZH-0=0VX>#D$XAu&Oa|yW0m{ax|>Fa|bs{t0*Bb_9$u%!>5~NY~6n@{;wPQMJiKaaksDnxB?h+fbKVEN$USF;gqCp%@NZwlv*f_n3!d?K}Rn(4<;p`lvpW z$<#Kr$?Qm7S6@)ZM^nlum_-@F#0x1SoM!xr`{s14W3H!F0PUfzFeT%8-X@pt!EGLj z?VFpsmU%`l=_%c^u)mh**3dJ$Tb-R0KCwmr$zGM7`!DzE9NPe(d~Fck@K>}e*)iGj zl0}d7Y2#*kT6iMR=k9Vy@<(OAGjKRG`NTX6h&&47)wI7Sjh0X4d~`7k$`bNm>h-WJ z7PDsg^Qd;6w~sYPsW^#ctBAZ%Rl@Fl!%o@k|5ejBTxV-2Qx_JWRxEXxK+-@FjoxL9o)f^d^CE6oo{?o(p%VI#AmOPH7dhZZQF`N?qC) z!9PM3UQWCYPhxM%-I<|*pGxRL8$xYR9-9a8Y2W9$zK-TtjG|60GiV^C4kkVWE@RpU zd~QE88FuRaRv)b+5*5F(U&Tcj9?f7}G`YXEl~?TRfA3+ApLO@ z(wDstq_36q6sv&@{{No#QPp=0W9W)%96RD7w;LL6wEOuSfuDNCZXcj-e~iz3ZSR?oXs#4;5I|We^r_&Pjm_VKef!}`7D2*fK*$# zb|&t>#`SjoG-)?a0#+7a)$C~63g3fmK$KbnHov3tGQVq9Hue#TC!qtWXUrZm4TjW+ zEM*H%ki|if;PLM0{kabVmCbGZbnbneW?4cub*!^97b67=CP2Gw-2XgrU&_5`0YkRT zquf3sx9RP>r8hi2ntX(4I`7T>zC614%IN9-wlJ+u%uV#09C>pUZ|aP1noW}<O?qRGMG`|J?T}o0d-)($JNcpY28ZiT^C0skjF@u)`hQk@g7UV%? zh{#=BuSUn!W+-X$$DBLV?uYKD47GRlDpOT z3rIV5<^-iAcyR&OJX~$W5!MC6_vAocypsU7tdD}^XA2Rv{Q+5IbT3Q_*&?#!^)@}l z+sIYlm$E-16NK4SY>K8f{fNPaYA%^&EH zs3FRTW}CRa#HXzx8`H6a8Tt|PR&1oSNRG-oKCOwDkeoOlBwog+-ORf{ABQ!gTNEwa zO*{*eY7)l7^9r6>zWbQb?-Tdc5YN=_xh_5Il&M<;2_?%rA&Rx~z=BC10?E7Nq1)wR zZgHV%SnKc5sU9F(eREcPzdF!71uW%qC*Hh9;5c~nxxal5@LjhCcinFv=dRh6SmloB z^J2B5yEi84!pxw%5)GdXQ~dm|YU%yh9DQA%uEk~rWK`lrR!rASuYV^6;RMLGjk|L(O%aAamn+;A7ku&4kj+Afu$aGWB-jGJ zhyz|x9d>fYU6OPzPGC4d*V+5*`|E2dD+r-h7&pqdUG`BmfCYhsD8=~H+yvZdKg>2@ z#}nD?1j+`^F8dkQ#H1=RUEc8Mu@5IV3h`~G!QoC)3ZAn8q%Y9dT8B zgwr18>k=}jh>~$^d(*60oZ2dn|2+JJE=^?X`A*J0rTIBBr_PnlskwF4rnrk0+i8gG zU62X9)^Wk(E+c$7>(*YRkf!`)py!hLf*uy;<^)3koc`pUu*tt8A(z4>=cTHxX*w&T z^R9VKFk}P9=+t6 z!ER4!S^3iNJD7VXM<~f0V$<24lt%9dxf54ipJq~&C>^XKwOdvsG`&t;U7xa; zCejU6P64izQfYBuv(9%MTxlj@F)q}hgG=6@kz+2>p-h}W) z%e<_>w9u-h(Ql0>k!atv=a-wD$%|%auafIqI;&?t6Pu$OO_ijxv}u_dKb*q*G&;G5#fD{OJ>qovteRV_SB_~sbI!GbG=Sq8>F zAg^j>nI=+vc&02IjOIR;3!-eCo9nD*9SrT>pQb&AR8xstpD?Oakv_gi} zwmI=Q%-W1OfJN)7UgO9DL0yWr&eXp$^G$8KSMqEi4+&)7Us+JuAdbtlh5Be}Q%Dkg zbv%LT2O^*t&tEzISqW@Ab(_fipkyu>|2pPGQpbtoss0_I&&r5&G1*w!ShGsU9-$ES zAtTHvtHU2}S}QF5wb|!)4zPMI?B3XU#2?WUQWkA`jN(kg<}v8t=#*p{kJN>fWs&fq-Z3V@F9>HFYn{!7-AAd$jbb! z#CSmIfxry=;P)Yemn7aOAK`c4Wl3Uy-!FZE1*vHxeA{@IAFa*-50~w2GFXLkVo>O7 zOto3>@~ui`9hD1f!%ep^aRUWGj9HD!l6nF?w`KS_k(bv*7UOrke;OWeuw>JlC!4LL zJ?`eoO%(#iyi$#8VFgV$1p&ELQWa_8{~=2coMdWKfh3IIn4~`VhGCtgft*qq)f&Ix z?Kbb2NVrk*Q<;cf`IIOn7jRAHY6?lgKN~N2yy^NbnJ)QS`!^8+YNdGm;g`I~)i*Cr zxD$KFRxL1fynYrjVW5Y@i8t-Xwmvd%Bocl#=9n6(#cReDS@NgY<~%e`sz1_tpku2& z_pEWrS9yFFi?Fca?mUi2srInrHh?Zg+c)jR$^{vt*>e2n{poqIJ*tJCsoB1R-HJ+Q zV}H5Jii>vn6sHB-cZr3x2)UF0oMJU^M0N|*aw7ANiYWG7semX|r4FoIBs6)eEA*x4 z0>||gj_`8g0N(0QcS8wc9y7qj3>VN$G#)$FZDCiP@!N02pZrR!;dXjKac6bX&0^x;|EU z#jqW#7gCDH>=IYhdrxV1)j6J{%kDYX%?YLYZnV4V%y?dW!*;1wHtcX&!e9muFTA_( zNOHz%<@S%&v3YyzgEg31?l*266i7f0tryoDzkFU3Q|!x6u!pEU&*YeIch@S~Wcp&c zyQ;ZYOI{W0&3X^<2fOH$_FUR8j$`xQ!pQ1wZ~we^>4hbBzfB_+?9{%h2K;+F?s8f1 z?OOju`wmX+t9?n;zA9GS>r1ehhd&TGsiI^1NGU$1^ITCvHsD6&Dy7`$ym;rLna+Ewa7V1uY+H>BK>Jng2p7D@Jkc4Z@TY1$^B3|QKFl}!K6G|9t}<-5 zo-v6@)gFLHV;W(xBM`_Es10!d9h5@`=ZvO5${6}$$$9V$nrr`e7{68_ zSyXm=pfHqC%5Z%b`}>mij(*hhlBvqrP9~Bw3j4>_70E`5FR*b3d%!Hxyv83!xT$nT ztZd#X4oACO-QuY3=yw|Los7q8u~q_Y8M0U!>m=q>vMjBuZ^~g}iw}zHkON|H2aRJU z)0cJD^4`a{(|_3RXfx(aZ1^I6#HBof1a`693Qse(k$g--LVlE7kcy5}!UB4!BXWn+ zxWVj7WImg{bz!f%R>aNt{`xp(d5Jv60%~IO;kz_heZ&+;N!>C<)w8>J)+}InN}X|x zbalEdf(%|^cw|xDlc&vcxbSAa<9!JD= zk6EZ>Hc~T}kh!`)O}a+|khV<(Ir`J2LV1;%dWzZTB(ZW$$fKc8)EOTGT@Z-C5&aEfPyiTa>KqB3pVpn=?35f)9Cqz9daCdh`1o{m8TRefm+rG{weJ@dX?>rIczx`&B zKsgws(lu<4ta7O=sj)xp|7Guez@seAz2V930xJZv=z?2Kb#0>si8e^8i3z%a00H^4 zNk{^SU;>Fr3?wGIih`K93C-p)l(s2H+tiXuTaL|9>Y)}|QAmua6${!_s+A(g($y$Z z|Ac_ZyuaVf^JJ4?d(Qh^*Y|$k^_{=g%y$~Yu?>ew ziTchx{?Tx6qc=4z2wt6bQ^13>OxK6@U9fZiE3dqA^6z`!w>P`LXMZg`o*S$U9~z&< zHQa+5FcTY#0FX@fIg8mHur7v$OIvTOR2+`1$7tx;+0QX57!>_ClZXO2VCL#uAU2U zDLkxFgDC{tVSg#ABS|Vv;i*iI8O{R(!ZAy@jVT3_LVi0cl-IK(C-ykZIKANFz_k9IP{;Y8Nst ztOG(XIHuu3FfGS}&-5%rJUFWu+rThoHZy>8gf}7?H|l7`*9A|jLB06nY zs(x?B@2-*fh(7nx7CJrpFnY!CqbrrU0>AqpE~TrHQ|FS2*nVo57UV5|79Gb84z4pUB6dej7EAvxLJNYiV@CFii}B7 z1+S9vy}@*d*p2@6m+AdbG~m0vIb%Yn&MFw!I-x;*S{Px2b|`p28lBlVtdRrJqd5oX z)*Md9K)-Y7b7w)^LvG|a^f}ZKSQ~Y?+qaSDR1pmJ>f<(k0<&4~U^Pr0v2!v-J`y@Q z0&;*8*gKiu82{NJaNi4#&;AO8lh;l4pU|NmtMM(MZsa5qh05bSScYJ;4a`h|O$DTD zfgBL#w z3p6dz9IL?)pP>cQNJc+etTojBa%a;_iAtJU(a zDp2Z+z=raybr40c*-rVr8DjAfU|C80*`n<7x{a(l#!2b$6&^6rEW_` z5(A^c3Y#s1T}j&hKwNfs8;y~L`&G*@Hn3mOn|*0r0gn>oyak8QGkuLhi8{A8Gc(69tbm z_PBbklW;S$VULa^fm(5(r}0m;@`5N-;_QukXdkVW(1L>Pzd!;j@wKKr2jq&+;F_(m z3a9G%4fleOF5C(7P|HH@z@D}syxbG{4*IHsNGfWSn`-FS@YF#?LNZPdO?eAT?hWji z5#gk+asjsjI?bgM#6(MmX`xNrldAiMVki5X;RQ~F8m^3uT#tZ5&$}ZVe{)v0MGN%i zh{|?@3|RT|Flzz(Kf345JhBwrr;Ltn8E9cTb^4kR} zYPEXQ{9O7xogcJF>MasFYmz@*&D0Jg*-4TG7D=N;LT63#*f}KaB#F03xM`~rMrTb@ zbq>kHBzaFCkPUCxWRcKWlT1B_p3JAdEvc)2yvnILg9Fp5f@;=TPgAKwPwpt`~)+9HbL$Z)0 zzp+TRStNAUB%{tD$s|d=MZ)7PD*JTSB!?yp&3-aTvMrMB773j-${Eut@e;By`p! zfBweM?4KY>jz#jkMM7sy^7C^@j*#SXi$ryLY?XA@BsJ%dyh4%>FuhZ?|B4k0oi&N? z9Fk{9vdbblV3E*SlZ-xxq@5%iERsK3By`p!Z(cPt`&&qoYmpqXNa(CdesK=TCX#q9 zlD}9abk-z+b4Y4Q@}X8T7T$2gBB8S;$vB6kiX^|aNZz$b=&VV`oI|pbB;U43A{Ggq zH3_fM5AOOFkz}Do@_|J{XHBwgD2cI=V;zq21}-&buE7ZA)*brb$xG;qk#P<0Avlb& zN>M~9%o0Bmo3)rCmU5a{j)T9s`!;+EBZ3r>GdnN{r~#YPZ#7(-6FfB)2lw|+Ta37Z z&`Tr3&WN+inzB!M3A22#m+?I&P(3MjA2gxO8KR4+`PmbQtDrnaZe}NBjPRGfGaBjI zTu<9(CWc!sxXd+d1Qrk2c8hUCi#Io!5v=;5MbohI_s#TfSqo9&RL*}4bxh8P;njg} zj)`0;qDL6@e_XbA%JG^-V@z6pLbZm!Kt$tojW8s8mbD~zKnpt3s51n?#J+vL6gid3|uO17pz?+QoFz=4rSjW)S zn+BZr*U*MTNO++vJF<@p`tg`*LJQw$q-!TW3PhBMCw4Jm z_`QAhtmfD*t__TTK);$=rRl0RavV)Ljz)JEmk>?Expepg;=s~@>zTQj`?`^iIHW@@ z9pdVhu2^+FA6tI#i8&V^s9oYndwbpG$~4?~o!LpdXdQGQH99hIw&HEfu6#XwGdYtc z2wRun)0x>+a(tg7e7`W}C>)Jc1Ic%} zkkG8~C{VZ*#Y`?ZuyB{w@g|g(gvfjp!~oejrRy*gjg0vkGZY*3QM!`OC$AX91Bsob zDRe$E)EU*RavlTl&R0Z!e`WJ zex%Q#`gA3WQ8V#;s>@Obh)@PxN;P3Ab{b0K?{Y!GsWICF?Q+QU6r4uMHnL)K3_o<> z@*GX%i|vRq+Wg7d0~QdxuA|nL*^bbSA^>&EXtlzN?GD8XkYA`y0(-aENKHG1vKGeo z7=~7AFij~nz_WGOwMBhFOb^ZB*tUgA{3iM;;8T`1E^vVP$x3Phqv~Wcc2gN5FdlC42`ows(T69sQogpK6Sgu2W4t1(mE$R`UVQU z%+g`gRwBefK;Aw|!)&>Gj}=mmYAsiF_-!x2-(ItWxo7_UCd?*(df$X6pncDXlVFR(ZP z($Md!u8V50Y{=1(7%We{NOXrkKRa^YGu#E}i%eU>lqV=5X|(@BqvH9yhCNVX2VIF+ zA)_7J!EjuRp~URqKQL)L^j|k8U!3;I1AI>nTD?nSo8!l%y?xsQP$@At;X-sEvDr90 zOw~-D5=go)q2{Le2>B1irEb}(V;$MLLLfM?^i?Xo3&w%8R}pZ0fpLfezqp2BWU1K> z2=C(&gfLREf<(}`2dTL2B)WLv4Nk&INp%X;;Bpu8iecde4k&LkxF&`b>c<@60*8)M zoeT@TGq(2B*tmu`hCf;@-Chddo?qsh=IWfI<0dk2PUOJPmGG(I!}XJmvp6N|RpAtv zVl3qes=p!={}VNVkqT`cTZudy>J4`5C>t42cH|8#?$k07f$OFBI7A1F_C*OJjJxRa8p0Q*ywS6$A!Srz2qfa$cS&dH`qYOwpg z8$s0{oes?6Fmn(xPkBDb^2kkl(ReeiVJwVjQ~6NFVI)CnpR7BlUZ35Ijw!?nHP*AZ zhGCllbsAE2N}Z^9a1(nls!LOfCVtVJm7$iF{G)IS>xH&6-wS3(qgz{40=YX~}mri+lkVF>4l86PSei zqX-&-_IS0#5Td16s0CM1z|2wh6#8)R3Ir*3ssmB^SiVeqH)5_t<@zXw_u=%S5;{Uo zp6kc3j0u4gcZBu7?8vk;36ZFW{ZA}J7d9qVHu9Xu^B(eo+7Oedn91fgfF0P zbOdAcGDa`X%)&L+P8Q}FexbcBYHM@9FS8lKh8_5-V%N++9`*+*T zIW6*_=QK!E_$iVYB0Rh~y#YZ9wX==+8ilh_|E$G77=3tgvf7~!Bk3`X*-!-n`L;^p z_YnkZ1y==;XP#9xZ|)2{jRyHJwoWMEbyC}|2aovSSq!K7uo1p_&}TKL$E3Xh>GFQ# zV+^61U4EsS^W6^PCgWG+oV3G1Javrz=>Z4*+50~ES#G3ip<*32pnjpWrpGN8%pr1( zKj#_k2`(6QYk+2=0%&f>QLL7Pc)C86;3fL3Iek-q)XyZi>87T^X?<}GZOEuTZhex) zhKaS&_ufNvT#%F+6TBchvSzVLhjGgybVP3n_d%lXqF;zJx#*@|lyzEG>`s}j!xgb(~%4%HT>a<-fu;6@S z`XV%|OU;a-P2wD3o&DfI`QNwLC72q6@M68dxOF`8x63SH?oKwS z!0@obkq_|%W@HgMpFEkLVD{v!@9<9kW=HP-O*E6{d7rd>cpN>f@*7z;;Il&??g;Nv zW4n?A!z-Ui@uOjEWK~eV4kW;LQzjvUqx(&hZ8CpRiK<;e76NrL($fdF!~tA&CxJ)pw~tn%s>${ zw&z)8IIw?uOx(BIQDrjW2cO=j4&XY&-(7_8)x-1Q?=FoRZ;u+e;bwXWM2!_uV`a71V6LMHPGcpaeJ7IhH0g^O>5h={mDfTjQra=zz4`&0Fu$@ykt z-jol`mX+2Ow{aM0<|d@)a_2d|IeWzK1d4*&G*D9eIm8suJe!$tb(5`r56ALrF&A^k zJ;*1yDJ(dP#pS8AE>1n6WAVN(Xh?(?yfuF(yu>|M0cDG6pVK*+Q zj@C>$Y1o4@;NvqB;(pLk*Fh->E`;jN&XkM1izs!(<-_FWTG;qmZl*{suRv~& z0KbJz!gBGK(c3?@x&FK~Aqz>&%GO@M=)SyW$Hlx$mDumw+wa$h1o#l6_HBPV*9;Ot z_&}S9S%r!U-V$(CRYfN^w<1zi_$3$|xnahcDRki?BRC;jw@*lvcLs_C?>|xt z<2JTpp9^oB!{5~)gpTr(y1npw37$OFH3ml&ZrsNC@QO&|Lmika>z%mxxQ2`13N076 zQRrbdWrfVk@*-6aSc0Aqtp?`7G5f49P;-fiw>fySAfm3eVE3hqgcSoc)K#T z&~;DLcvsXo7JMoq>-V(8*3{KQPaj~0F% z>30-E9AhTJlkLkK?SmaPOF|j|@rxh2;vGf@-spSe!EgV1oBGC8 zR0Nc(uSdh*7Bj79<5ij~n*o zP419h40yrCz^w%7;+8T4Lb!@>zJ~yT|^%QoOYkr4R9P(>yT)`dz;y zLBBUk_kS}%OwCrLW_sG8bq%^eE!NWG2?q`=W@6M!Q=wB5lD}F%N*c#b*Y$v_Izy*y z>+EPcGn68r6?(4?h3t3_Lqh-MAcSajN5)}eg9E`J=nISu43NjWH`1VvC_ywm z0&T-p&@&7Z=L-sQ)#TXdOM8}H0^`F98&7)~MsHwvE>C*pf!43qvh8wUPP4-K*zsc=&C&u!^z2$e4ytB z+?|UO-e|7gwGi4>_cDU74eKeYq2#6@G)29}cUUgjk-3-`Ao*Ozsr>6`kgxGZos&7F zKnQbwbG32Ki7#ArW#8zByqo6eFfRV$g1sVA> z0^Z!nUCQpLJDW3m=FGT;YvEaai);8gjFbnWck|-R&45ux9j?obY=GR8g|%nh_c;_BGdy|}=o{?cbikfaEl{RFpyASd$MVT_vxrI=A26t5k@;$gTwm*+$_z%bMg zm8$Hf2c$1~*KioXMW>-48@lgDLe2S@P@f~N{%N>}`kaA;P#^Rlaq8hOZROg*3_bEA zrz*wwUd1Q8p9(d6O*8rKR|-1y^u}q!;pPoE(pfUN>WY zql+;mJOTxofaf?cb4=?DzKp?X3@$<3uQI}d9?yaXH%x)+#i|J4djFMH5%i=se285F zJqFfifjgNvSM7VtU<7G04j5q{#y@=Tdr$y>xq*T4<=H0>etj<@hRzFQz&+)|mcOlABCTRWVI2Me1%|N!md!CCa757{?HJ zqwCfFo2u+>cz#$-pdb{vhN&{XQujBdpuaQ!k&|Cw498{xsF|Ar<0c*s#wrXu&K<@$ zCRE>Ihtw^ah2ZXWVTpz>R7$shK)oMuH4XR-GG|fKBVZ`6LDbAHz6C1Y(h>cQyIAr4YiTyKPT+%b2iRI;UvUm z!&5S1Vpoup7b#F)z_Z#1KFqo$_(T&(&^BCctO^z9q(fbkNbrmi;(KAAsj6-oxzG?qGwjFDwynnG@z;89qbN-t{4!ehhuwguLKp)38hP#siae3fDH zkg~1d?n|I9Hj!P!Uu~-IM%SR*n|i1u!MKJ|nC%*h+Km_#ugkar4cr*V7*I)28BeA| zw(*4bkj4yE|7^@1YG8;SvR4nJ;AyKihR!-yER=R2?xBMyCu~~1wcd}Gd3Q|Hc=CL2 z*xj`iKJOh}*MYU6G_C3*&NXbqrzY(KCm*z7?`daab_^zNzO>GDI~YY9ldIy%LORhn z<{7W=J<6+U-YF6hCL6EsW+W%yY<3(#F5P*#1=vEp0|^2*ra&-_O9`_=UCy-6*S(9z z!5M(t{<2zCBs}np$_kv#)^H&0076DtI%E7;tk_HwXmCQHuIs%!h+; zPaMmk=H!g#_zS_r6y~E}ONc`gFnX0Nt&P&jUTEjV}UyM;l)O`mr`10QwJY{38%f2Qa;dfY@+g{0k8KOBjy;eW8u- z0$t3Gus$IIqv{ju6Fz`3Tf3fsk;jtY;ZqnN*2X><_iE!A7>{cs7Z+Zz2mEr?ldp}O zkW)VZTsgu1qc(C18jqeAu5K7Bw2^bsPHl{bk&4FQfyN4HG%IPJl6_jfpV2 zz>U}uq9_o1N;`qzCkg16_yA)vjQL=)ro|4}QeeB#iN5LCPT069as)OQeK2-{|6t67 zaW_~H#w-{QfD2)q3!{uxMn8;m!GmyJ2qVuN!nla8;6xa?l`sO#2;=QA9(OC_N*ITO zCE;2M<3g|`j1@5c1$v)htb*}pmnmZa#;31P#x*dG153gKw-R2Spp3OJ{xwk<>tVcg zvNATpc+2(5_z;Y{(v)!%j8A1KV+)L#S<3h@jO!ODV=IhzVO&QPTVVX=?aH_n##hUf zaT|<90cC85Q4MT?`niyO^x1nm908mCh29PuwmHupl=gkS9WjAnd(SFIXTWyykdbPR zseMfgTVlhh#y;EY%a_%jUeuWFxOM&T7cv}+dYtvI-48tv4lz}Yo^ktPR4g%d&odpJ zQ`HbVd|wQ)VYv>PJzzbH`7>tyBhlA5< z*eJHBW(Lbwe}RNP2^{U{!xJ;m8uEDz5|i)5-8J2n^I-?> zi_OGvj;QNCh(+3YBydMUJWNyGDlj&%3eZV`C$P)b8H~rRcLx|xEp6@}gDx0hU{8{i zok}4ACsCL>y$fvv#>OpZM&XP^V>1n@OA_PiGth3-Qq4LGh{IaH)Ze+PnE)X#{qjvT zO};O~nSi*B4P-Lhn1hId9xf<#ranpr!p6UH2xU2KI-LB*C9&GAX=4R^G-i#~ADYyy zwZ>^GJ%FlwXvD0 z!_bp%Y-GYPE#+91_Ip%Le2f>Lu&9SQ!45O0j_;B zFQp5{H@M7AeU!x<7_(1|g=+{8X-&Y7v5~3VC%$I7IgO1>C%&Zpo_@b>xhuacDD8gP zAa|CScE5a(JBv=cdk49*47K|egWOr`+Wo>o?hp05XAE*@hob#Y8{i)H=*mf5loGfS zyYrsrtmK?*7~=DAXpzhKMC>#9=c0uUPhFbe30|fB^BYyUK-DB#tgg0jMzXHX@RAhM zS5`8jtZv35xxU1lY&3{P@C{jS!*>N*0@_HhDnD`>W>h4cAL@WnEBio2x-i>P4M;Ip zc-nvl)bKpE_e=M1%KO1db;iq_@|tb1^kIHF_@$rL@YB;@_Q}dxGO~sQXO~Z)&gP}e zplV!rW-D9zeP$-7C27~xMM=R+OP4a#+jXde`vbhgsHm}65V!Gi@U15gWtr(jUs!sC zlvnkqXK?R_{ab3;gubT&(uF2!ZtoOCcid1)rh1@Zt2 z#f#Wf?-y98gD6d;KR?MGIK;1g8(DKHOEt3mKo{)urGPm_&v+Ps zMUUB2?VF~oNSE2)sBJ2LmYGPIomqhVMvxSs6F@`f!W?SU`Clv6Bt&NvP9I zozQ*Lk{G|~+n0z;UmDdt!-y<@7{x7r`TJ-Vkr46?Htyf(GRHZNZ@7ML)UsTRtR%D? zwx}$OR~MG9K`}+H{>GtSGsnnI#wpxH>iI&;%Jx%@ z8xETAphs-nw|^;^mmkFb7|+o_!_641jbg)NJ84!Yd`$C&1KgDoOVgd3GqKzb(j?qN zvB=dmebb#wF3bJm0cP%#Tkc;OV7_F4Sw(U1eH{sUoX+OiV)2ilDi=@#xF7Icz_$TE z0{jf{Bw!by6R;of2H+h)58z5v+ho90z-+)uKpvn9uny1&XaQ^iv;%em$WJCeWGABk z^$(db>GSSWWa_h=v;-Cy8+e-nO?E5$F+CT#H(m2__&%TJ_3)ZZ>yz2;!}ra#KKaAX zs*CI@KvRluaVPdq)H|zY4~dPIfV(vPHgNUAkNdeA3sju7b3=YRY{saLqP56vc5zM+#``YvtZjC44t{;l+Y za+v1p_pwL&$h3Sc4^PXox`cFe2{#*AKA;pMD-&q4k(C8>b@OIUxAiT4qia%kle00_ z=Bs}x*t<_n2=P%UQE_K!DbA zN!y-`Wa3b|-t2*ZeD<)~Q+Ph3_LL)tXPioxDiU*F2Zv@L4@^L1nTKCd_G$kJCZh@9 zUIVvRC!$Ln17=E4{XfR+^;Gu2+w0JBafq;;E3lKRdS=O zqfCmQ)uB*-4j!(QW0|D^eujR>&4@uB)OVg%^MhLD89ht%I=?P|YQr#j9~?M^W^e$d*IS^N8sYpcUk=Reqz8l6+1e>Ig)6g6uXG zGGPtj4PJ!%!+LzMBu}sp5!%qh_0TJZ&|0m*U_-J$n>a&*Ni!75R)^jb8DS zKA+Ty@xg_ap#+D=BYw}MPU91pJvcPwdVAQBUYqOCOOX$-&VGB?A!P|WZisN*{r0c} z+CDt8A6Bqh{9i`D2&b@Pa^!b(!Aur{zHsJsXArQ zlebwA$hvW913BR^L&2A)xq&&X>k=Lz@Jaow+gwL?6lwgV2;#tlTvOpg$<-#k zXmq~bN3PFiGH1ZuaNl6O`1;W>5GK?)>V2BQe!baP&0a#UXE4XK+@IT_%;jPjl3+8D<3 z>^R9z|MAJB>%rK!_7wiuiD>!?-m3@R^fHBBuSukJOh%XN(^z zCRz-G_KT!onQ;rk^#r#KXjjVu6}nyNJxkrT)O{CjGkBY)#W&xVKp%_q!Wpjcz3#Yg ze~9{ytN$Fo7A4;$)Rb}c{{?rnUnRhIcbaYVcHKr1GZ}=}x_I3Og_;-~vu~RF$WxeR zP4jGj8iQAs1Ls8S%GtX^Ig6ce_Oa|8aSeB%GC)!FYxQZ%E}QE;91f=tIR#f*nx+j) zw;>J&>vMa54o^PMkzay7+fjR;3fAWq+m!Q(|9~@8l^_v1XzZy;qXTrV$CZce+Yva{ z57Nv8Iv#d3aSa=g#S-H#$MO<;Z%H`G$Z#7u&ShcOZTm7PsSsw~=|z3UZbeeb!Q&<2 zDw~lJwKz24lwO<>z)UOyXF;x;@><-JcRB4zVLYXq;WF-mo8M+&?;t}x_>%89*k|uR z=Yg2e;0F{muE5=g(F=J`@JDVxt+p$oJsbLcy&svBhXel@hWL66SQt3C&$_P%19|b4lct1RG~;+)Ipl~)sWt*m z0<$G!vvnjUnHL$SjM!(5*3IN? zO+wJzf6fy#U`lL`zs~+fi4p&B$*6eVH%PP}G)=CO@Fk%R8$5A}`#uGT|kCHVo-; z4S(SlAP<{j_X4?yXPEZ)?0+UT%r5BDU{l6jQDw@6$<2oAj%)Y{4^`!}t~*p+BYxa&O-NRCj_fAFf%UFxB@qr2P!f2yz}}7Dc*FfLoZ?3* zly3hk3>l5t(s*-kkF)VBB+uCUzN>L81IU<8IwZ;r<$oAL%9n(|x|bM)k$vMEmdUAKCdXMIve-#r_dYDKNR`!2tHihIc)8f^Hsl{@}lF@7w=nd*?d1 z+5KyDH9Q7&ZkzuGnd1NTHjgIX-{Q5w#rDqa$)WB2OTD7_(AF*QL)!Ye6q!~#Cq=ZK zgNsto)|0mz@jH$5O>Fd|J{ff~Jeh4A!}5@3{@(xdX8zMJY36*I0L_+d`;pwdNgesP z-MaS?RDL=e?m<51P7g`AeQMuZV0-~P+j(X)-j73f(p>Sju)oQk9Gt?2{&UnE5}w%X z=I$A$I+`3gPC#+tpl@9LB33RrkL9|9Hu}C*_I?QDc&o-W<+jx?0<8$qQ)&`sj`AMH5F6gtmhyN)Z=Rdx1 z!5NFrXMZ2DF;d1Azirg(@PL@mE@5zu>SntNFZ?kyO|wJvg}NN*>r`8&x!FC14Z{8j zDBR=)*C_XPBl%$#@2EeqV8aWWF$KitZr&Mo{FykSuQ?)%ZJW8k(D7&c`zT>52Jm43 zV2m)qre|t#4R`goXwSgKn;OsEJinJ>bn?QTFaHt5nL<`5XkLdN83*tbH>5vc?}R1Y zc(vK_&F19w&2Dl9cb&7$9)B5@%LsuR)Lbp_ZiAO+9501Cym^??DX)e04#!B2_~7I- z7XCn>>n3~X7RWCQ(`~f;Kz04CKPEpkw_IX&`m7~}>^9neV2=DLSO!=FJqv(?eTw1; zx8?{s_?qLdM&c6f@9SEE*`;dAXMbDupm0bs-fUbL_XXfIl$x_Q%|6|@H0~_m^Tx$z z*%vSV91*zTLjulVuz=2UFajqEq-O+gq9&L%#S84{OY}sVGo#GcbISOl8E3CG^5@aNWR&=)yrk$I!U&hLep8 zZ~C+`|0J`N|7qjW8~OmBH7@I8l*>MYk5ho&DQ`9ApK8qS#X!swo?(C8iVU1-@8MX3 zQj3p9`(Jbmlf)x)t`*}Dkv=>L(2e5G> zI|lgU)f?BpVq)cd?UU1sq#t-;!%3GQP!wa89N}fFt z&i^!=e?s$?E6Q7FDE+*ZIDof6g4mz!3+JB+=l7wg+++mIP3~pq_s{vpYx0f7W;gbC zeCEUKkl&$pC!j}7K>f4NOE}mEMbwbw#npRI&xi}pM_}l(zed?0k9bdrsDd2xg z4|C*K-f&KYc)ZirWD9lK5J&=$;og7~j3e-k(_hXS6O8%|1C}ki&ugwvQN0?ZdhnKl zRHYj`Hn3OQi9S!*`}9zUX_1P?j+erkrk_R1c;+Y3=(GQ|*>QvYbcx}pD;ec@1RoNR z5EysiS%ov&b0560L${yo_xLN=<4s>@5ouBuVo!=|xQ5GCuEnrKL)Mb*AF;%f;~H?R z3{CG=EEXvE%Z48+d5lNtu>^2m!cF!0?7}(uR(<~EC`Xo|TM3^%_@p{*sHKmqe_t0L z6-rW)iED2xz7Yt*YotGjWY1tTe-lJTmDu(>iKVwJ-(gKEb{GVk=@FUqVe%Gi@@+2NuLGjyBw0Jl& z%8km`uZ-kfqh26Gf@4vT7B502@|W}C=s~>5fq?utA)m~MX_PuxI^p0c`-_@8*|c9n zA)sl06-9~b^hzlTPr$MVaGQ+jQH)86lVT|{Ce~ zJz%xirctqv8;K8+y+-X z96jVnG-I5~)Md&=EIINMlOu7~Q&RY^Ia0T8G?RSLdYhA{4JgUx;+EIF#>anocyCotgX4$FJi)f-`ZL@7-ozGdGE;mrH+oXErB%?*O zY~3Fo(yM&cog!5GAruC%st)woip5lqfehLYpj^5P_rHyD|HO#@_LMznu)%hw#G%0Zn?d&J|Yb846vHA;isjMM9D{s~i zdSdW87YvyR&ba#PRTYtM3YycS3vbRjIH^Hxsd+aCopq`ZIgTlQ-|IvOScp1xcg!ke zg(PD(h;dB!#=6Fa@;i4al8siYH=Zz%-`N{;d_dJ${LYDaBKX}+erIp|gps%bL8Pde zLqd3A-KR*=-Xk1W(Q`Xbpu*LB2F(RTNLP~Le%+C$Yf=cI>NNK+boL>zbUlAzrdiyO zn<@D$#Zv3kg2`q71B)D2pZ{(a`JfFf1i|xfPAJ41aWE1@3+y}?@kjoKMuXiqA20Xg zdvN$pFS?ITC@Qm?KK{${5v@C#hFtI9{1s{Q>TO!|Ik=DyjVJRR#_ISfGVMhS8XkZ< zI7;h;OI_v++}Rv|0ZzGn1^YSL(Y`0`5Z>Lx(i@d7dTvR*Uto7(2ExJqiQj{hLT-R7 z2a`A)^_hviIH-)dXeD#tP1_fqA%deQ3{?8bv3)fInkrCKZsQQNQ{Cn;hNF1mr>gC< zsex-@!0s9B*gOlS8S~vnYIA|Tc^2<^^3FhF&vNM5h5Q}o=zHeSn9{r;23~q@o~kz5 zu9>R#*`WR&ijpI*yl(A7Thn_*GE33Oo>3|+CsYy{>>gcY8Dlzno1pWgeV7kB=$_n2 zN|mY%Tt^y|4`cx~hYPOmo~uz!NmMOx3!b=!Bz(F9*N<2nY?w)L&*5PG0b@E&n%iGA za(Vw`no>`ki%oE&16RROMc7`&b6J4|oD!eZ2^B0jE&)fsF#`{<%}q$p#=}_9;*>4( zJUy3B>hLq%9G+vu(@pf?h0j=Mv+~P4H-;)-==lV-SNXUA`tI<+5ts_3OgIlu zBpE?RHl76WM>3c38yjy@PI*jz#Jz*|0gsTHYzAUHu3Ht4E!9kQ^9y>YOO+OB*1Y+M z0YdM8))sFAL@hY{Wm)poPIYwS+YDb``A2MJIL~RJ8w-@8EOp$#+!rP6X|?Ga=5C@7Q0z6`yG4nS#_|J8<`5{k3v5 zu`xQ4yYziA#s%TgC-820@aEE5v|oK{wqeiW$NK09ZtN)uc|{v-r4BEC1b!a-6xIkQ z(^7@HcyZ5E#F47Jp%#j}?Kj zR@hDzwtB{m>g{er;^dVRSYqoEoX}1hn#x3o;7A$3$>edZ;7XkZ#Crbkd;%fOf#sfY$(j0lW)14(J7(1q?@=V*oG1>;e87AQ9jL%mwU$JO5IIUCab5 z0+a&Q0X6_O1GWL426O;k0~`jN0Gt7gL3vyTxEgRHU=E-JKwT=A0WJjaS@#pTYx^$X zHNew=ZGZ;>Re&OZACL~X8ZaK<1ROtW6Gs8B0Cobl0lo)l0;~s=0P+Eufa?HWz=eRb zDC?Zbksl-RU650Up zH&MSwvhnQI-?8O_Vjn9TVkR;-eE~h*(UP2C;XtY$5hdmaW8v zljT<8y2-MgxNWlBLEJG}?j}AuS#}YNRJotnn<~4BeW~&=abc=FMqHOFj}y10%3k7* zR4Iv%rb=$N3Xvh5#NG_)BKBoS4{>3J^b*%)$ce;l8FDglM}|x#KAIsjh{YT^huAv@ zPm2Qk=Ex<)g>z&PaorqQPTV#}))05hk!y*M&XFNvJPm0Odvjz9u`frq5*Oykt;BUX zvYogsNA4i*$dS8=kLJiOVzET-C-yFp-Ne2n@-T7X5_yccZizfj+_psa5_c?-is6qg zkv!>u-c34*y+zVR>?@KU;=&^7C9W%y6N%f3JtvpOzxKKb77^DO zvYfchkTt{|hFnX0)Q}-!(Spa8fxIoUh1l03TZs!>Su~nuLAKfZ5h()`cL+ovrImEtpxrDf|T^147wd0X;;I?*I zL)_6W*AgFXmmy-YLmI^19kPYkw?noP7w(W-iR*UAcH*`jatCq84!N87=nmOMEOyKN z#NOSqo7lHo9wsi_Esqh`?Uq#VBHDJ#Ug8cs3PgN#x8yx1A-bfK*xMyt#J(=+AujBa zUgEkgIgz-nOHL;4=#r_#N4sPOvDh!?5PSE_9Ae*oxrDfIzbqoI+b_$B+xE*E;*R}t zE%DL)GDIx8r9tfNmMz4-ZrMs)*e$mb*LBNw;atU$aaalxMcU+bew;h)?#2v@wTH>R} zWr$exN`u(jD_e+ty|R_Kuvcy+uIrWU#BIHD2XRNQ+)aG6S9THO$jN?Uuaw=yJ}D0q z7fN}IxK7IB#BEac5_e!{iCF1C zR_RjoXp@S*UAh$g4(U?#yQNFfgIDPtJm~QfcT10t_^|XSdeo(&KQ29rzE^q_Jy?MB z4s(v~9CPGEFL92X=p$Yt zCn|c39g4nOPE_*?^r`SJ9EP0iC2o z=-0|Qiaw<0j82RlioQkWDEd~Jqv*HF97T`5RnhN|If{O_%u)1Rdamh2pQGrzEFXa-_V;i&xNW@~U>Lqr`A|J6w7Lh*ID~m`Ui@6->V<*cZ z(#NLCB1NB}=eDt!<9O+wBg=inOJupCFOubo9&-RiUn9#E{aRVB=tFu=9E-70(YMGN zMc*oG6#Z6Nqv$bqDEb|;M$zwhLh zmvSxXT|&>nU6_lL-sO@Z(z`q|M0%H3hDh(iT$S{$$udNGSE>vt`V2jHcg>N8m+qL$ z`G}WDL(vyWL(!K@L(yZdqv+R4L(zxyoZn^07DbOafTC}eEsB1tY*F;>vPIEjj8ycy zWs9Qk(rX3Re%Y$%F?J~W!?IP;ACovSi1Zwnt%@FftD={(mGo|**BEZ6+)8>k)*L=! zkK9Unw^wc@y?dhEN_scuetB5Ycgw?y9&-Rie@q@$^vC64Mc*qA zD|(EPq>mSRjTrBg$4DRVlE+9NkF_J|EkELW2BFtERT^s9&0N_pP|>5@pI&H zFWqzGaUU_(9E!e39#{0`^0=a}k;fH1=H!Y#q}QbJhU``JEwWe9W3H;`x5{2c-!6L< z{SMiy=rNa5^j&%_8^2$w#d>_Vl!_j697TT&H>H`L<9GpzxK~O=k2wJ7&B0%s7XWZU zd|m)>UI4&_@p%Ejc>w?y$mazB=LG;0XY4E@c_fAy&EO3D9YP;IPv)qYMUBY!^)SX`afJ8to z+=0~J5&4l%o2qWc7r_4y{$gx)$FSieoEMB76+3!NoNMfb7rDoczu5DYOD>K7>SdRE zulU;66Ry1K8xtm8Jt^^;YrmN^`MN2|-@5*Wl++v3(x={ZvoB-X^voGEXJyTvbIaU$ z^B4HDb8;6#A={$GOKx3y+p^`i7Z$BpSzK~QX<7N56{}WPR^3%y6A0dY&zgJhTf6T5 z^$*n6Js7HQ*zoPfaFg*+^TzLN`tJ9>-|~aa|Mu`BKm1Yak01TXmbRZhw)JN}|HZa{ zfBcv2|MA3=+kf@cfA0A8)4$od>$ksqX7{tt?b+MW`Fz(4`(AwM<=?-u|J6SnIQZJ@ zf9(F#8;Ab<=39Sx`|w|nymR!w-u>ILzenDCzvqJwkAHOHA0L16>1Vws`%azy{LB|; z|3Cl3LmIQl1+5QE_WgbNnVbES7QO%a$Ui-Ic2cDMjqYR5z4YAe*SvFQ@6CmizFN7Z z`wwHE+m|^bccBos53zr2TlLr{FGat5AFR$xe?4k{cgXku8e;!!i2c(c_M=1W?+mdY z8Df9%Smxqu2c+kw_`PL!?l?I1KkgHI7Ige*zL@WL^Qp1}W81pL<6`Gue|O}Qpa19d zNq-po)5Eaunv%b1z#3;Q8k|E*IcO7s0sb5~ z@8*KPl>^*-JOc-}!~wL)I2-pO+`jDZ{29aZXAJ*Oo-uqy+*5dW@q%EWpt>wjEX40E zd*14*>f)-x>f)^8!j;94jA_aJkxa@mJQ&Sc4bK_4oO~Rq#?HZWOCllv!cq2CBf$Jny8}?ABmaO#l>^WimD5%?-dU-Hh*>Hij0*jtBY%J{PM4K$uF+1DXUyP zV@-z0vdyh5Txt48n6u4zR9;|zUm#tp3Ip>%U3dp$En^6C3u|=c;5jGSGpoz)E?#(V z6+GNS`@G7P!HQy?cF-&_L!B246eCjcw3Tw@fH2MPR*BriFb0*%s0!PTTxtGC2pCKGk?b1Dc7kA5toYTg%uSA zWvf?K-lK{|Y!sQrB?BGA6^#3q;(K!ghzF;LnHwwfZ6dR*rm8ToqO{*h$QXZd@tslo zPizY-Gip|pm5Hm&kcuh`t5@pa@ZeZ(Y2`gSLX4AUzO|k8QELOwXzScc#j&dy${?3V zkmi~|b>+QgFt3XltHJb0Sw-Q!AP<0zRQs?>Idi&*WhlS}3?Efmd`C4(YNZ)MC>kpo zlMuJjckaD4f#Oy3iqUjdz|AHyR+a~A%%tRiMbYTQQ!%q^mQ+@*Dn|Wy#q`p`)pr!1 zo082|if6B=T#Zxh3#$uP*HoZ<&0-Vc`!Tau-(6TyhBtPL8MeS#Zl<`n=FUK6m6=R2 z(aI5efIzSseM%-%-fx?1%UuEXU%jw$dPSLPt)mzUIH{(xTIK9w+Rw@VM*^-HV4s>m zWwrPqW?s!5W|N#3tO%4^4Li z$PSiSEF@k;U9I#Nma!)pEp$JlZS$hEA_Hx|tV$;v`%$#9zo^u? z%F|M>qaavTY{D6S*kRc zJlzZyo8QSmj4!9SrZQN)qL@6mfqr#N=2(%JJ0r(x^D|6Je_;ihMzQ#J#;SSSbegdm zEM8oL#|tyjp9ZWBSd`Oe=Im)@ff}rqrmOxJ!v@-aSy4qXoY58YtwsF>9&^FC=vRe! z$P5V$4tEaVb6N#C8tJTn7qf$hZjYg1(tn)k%S!KM%pC%sURi;$un;i|@kvZhF&fK# z#g-?LL|;SlQ=!sde0SN3;#q|l?Q#lNA-z|q@P@kH8THH2RcvBit*9<5D)yJHDX!3i zfVfV@GQa@`NT!!oVsszq3!HpUVb!!?NeRXoF)MSnSrsoK)pw{t4J`+)3^vt$=NDE4 zQIX)oqjcje03PU&k(r<2x5#lb<_^@(>br&5V?+P9dIhqxSDUKt75@;+O9GV@;=8t0 z=;JF_;Jp%C2|5G34QX3dylPeD-NoW5TTK-v0)Z0oBI)Q|Y_;8m&LJRvVM7Hg!e85J zYE~4kF2O69wi46-MKR0EDvN}8(pFP;$Ld1R&9)V zw3P&kG5#0XN@_4Ph})Qs!j+=LR&tM?GtIS?tT5+9Ob7nswFX;Zpt4MedAa%1a~A6H zDh{!(E(6zAufltp%L`Qpyu4&(8OorZV-eXwkA>zC&hZT$(SX0C=I2ndkYqwReGKrk zCTzo+V#^4-cz7h%Ah+6t?^2sc8ZX3lw-8ld!8`{C6TKrq0l3{BBaYZ&#CBlc@EG9* zoN(Z&Ltr299^k6Y@CUl>sR#=o(tvNoeItak{TiF7O~JjIQ8B_l7vH=#;r$w59`4-W zIZp3SY~sWM0Q}U#jgVA@`!N9j7WmnT_;w&Z#Nqle;+bF*+iT!&4BWqk9x}-$TrKbi zze#Ix&*oly1Dv=YVc!RLxb1lW0PMdI%PR;^wp zkiS;}&m+%^;U8(d{dVLFfNn>)M#3+k7I5SO&;Y7XUVhlC0N$}EY)Dv+{31picpT;T zbNGjO3*ZFIM}8I~Ha!M6n5zJr0Diy$xNXO`Eucw4yh%uN72?N{MD^6tOQCbj@q zA^an?NOwKLYQQ&`U3IX-T*den!5_js!Lt7j$`h~$a0K~C0^ULZ4;}%;qfJZ%d$?1jkb%i059M=Kn7qwpa@U{*Z}we;OBs+ z0lx>l3+Mw}Fb4P1022TyfZ2d$fGWVZ0Y3)(3eXAI5BLk9!40Dl7<2MD)a zTmd0owpi1NH(aEVc>Ii(z6oB*ac}ffy-9;W+eYF-F9p z%NmP$%SAXIJ5G!j7h{zFins);r+D#I+@ri)c*PasYvSu7L0pM-`8Tlko`}`>B+Qbo z!MgREB1uffyl9F@7T*%r;|b~%k&5+r8eX8DiWT_H!Y4AsG%;OdiWy?2m?g5X?wliT z5p%^nF&}e5zsMFjB3CRFc_LpF;2!8=tRZg|OT}$snOH7v7loootPm@)E-n#w;Ere+ z9*DeCRESk#wWt(T;x17wYD7Q;@lf?WVvV?0+$YxJ9_jsJy?8*>iaPP22w@Cuz`fFM zi$)O^O~Syutr;uA?_l=xUGY8febItB>t^w9;$iWK_@VfbXvHY}C}ad%M4R|2BnMj| z9r(HU1@5H&I|PHj6zzEG`U&x**e-r0o)Z5lc8Fi&uIg{ZPO%Gejo*o9#BPzBIadwt zz{{~L*HdX_;p8KyfF71-1Xq?-szr76{6dH&`rT$@IuNySWua`-f@Kve718wkh00}m zrkZJ)<{3()z)+@V_6GZVCWiYOpSPQDvp0Z%csytBw zWv=6tJFF&K^UJ^jrM(~{zn^MI>SoPdjulu&0L!x?NRE^@?KV)R#W>(PK#pa3oLjl# zPRoqt(K!JPT&9?z{>?g{rvg8q(shOIps%ZXcXGGaXPn{Y@4muntN9L~TRtXt;x1z_3=}FlO|d!FmBS{&|%{2{hBr z&a`|kEVJ4>;?FNzSzI}LbxEc5RXGf-Rd_0x*Y6{%ux3i;e5{X{9m_IfjpjAjGaz8e zFJ57No;PpN0OJ6EIhhM{r(2(Lb2Vpz9>(jGbAQ)JLvFB0ukqEVIhBxQArsLq(Q;80 z5G^gs8Cl3!Q>H6@fZH^zt_B4Nf76120M`7>-2k6iW@ECPX0KjZyk?N6{yMe1pfk=` zV|K*@+!*KJgutVY^c-izI@qnhL$?B?17vjrQ>&R=IVstW5?Cwi+_Keo7Oz}xii=IB z8VYyKWU|doo9AC{Hg8&I23Kn#2&15bDebVVXzo$(EAEVT+H9-?xrp{5{lVPIdy1>4 zRhUBo#7h=uYoq4ud1Y&&fug9aoa=&N{-dAOAUD7YiLqh`?blyv$@H0ce{j{HkHMN! z4p$KytCMGoU&#(olSmLZ)doK)v&1vI!P#n(Yy zrMCC)QdmTmM2&R;F9Qn4?E1+4+A{?C15;O7f|0Sh7@Gs?^PouLKy z{?{%;T0nF_QgKABy1eqLss=O=)iDp5M4G*~*@Tph8Cr0Q3QyVldAVR7hhK;Tl~9uf zLYL~oqS>pf%&8X~D3L8IvGyWNUnsdDbZ}9^f78Rl$~&;tH8WUIVal|XJ0^C~Hl_F| z+8GrTR#&N^N~N@*u%^GiR~wQ2t;DpM{BPRK2B2*H4aKw#^x5B3R&l3FH&A8F$C~N< z-}w?aUjpY#;Cu<3FM;zVaJ~fo_e&tg=2WwnjJ(X*3o>(N=g-K|^RC&MGb}qp-E^hh zGxifQ%iiz~$bBVd& z^8-&X@)Y@u>7^y5U3df>@e-dw@c}WwJj8UA#EL8UimI|QI7%tf15q}``6Znz`MiK8 zizihXDr-oq{`Ki_8JF_`vl7%dX@zBU;mhFTkLB~Z{ID@YhVXf?cBg<|#LhC2;_*cl zd~PxF%AdoRh88S`x=aaN%(#M-5jT?07nGLsP)EV9QG64}k*$am)2C3-5YF%=rIpco zP+Ob%a z=fWq@4?d0t_=mUwZa4OdJc_*{k0XZW@9Mv6{)S8Q7w%ndVRhr`&_51uCl{J^d?EFg zGW?fc8mpl0j))t6R#9bPQ3;N{3XnzRDWkn)dFrF6fr=drWa$`!813Er_QCvj&;S$#gAq1T&ES|pC zAIr0X=())Gsi-TeR*t5MXhF-=o6IASdx*G`}7?)y6?!oS@_AcyCa+XY5M4g3EJCs+}sNrLVW%bM&GNkT( zLF?0XmLgB4bQt#uQU#-nd&;RR<#T{JFFXXREvR)hG#yGLkL zX)z?&j4H&&;msxlQeqZi;}wy=7^lH&t0%ilsC#e;Vz9oPi}pi=<{*?4KAUDedhi1) z;%zaWS9=OPL_0+cmP5v%)WyZIe7{cn5?@H~BzS*`s#G9GDmf^p#42YYI1pkcnB&m1 zqHP_%)!^wcbO~vtXW(aneoIZCcqldf6ks}5^-oD}g7ZglzA}Ek5zcc1Qi6GczSjRs zjQwe`IYBTeT^|@`9&jlLSVoYRWLfAW;rCI&iwVDh`yw7<{z94NSa?dM|7YM0`OJNaXPDc2t*0Im_drg`_6L z+c#20%OYl|6q87K;CmPnn;AnaRivz8Qo(%z6*R205;6tTI}MonvMBN#kCZ5=^1q}7 zhY|8b0QP^mo|Rjf8+W4pa~eUUTCz>*-eXx|=LySR_ZkxxIN$n6YS2g05VZmrV482z z5U!KJse};@lfX1@ASm|@zlFRcl~O$j$;xEbMQ z3^ym-oMDumOG{(;RKlk+d>Y}?7;Zth1;f+;Y3U48m`>X13?np&OKZvS8HCSZ7~yGL zS}TUnBzz{r6!MgI7Q<%~KAT~LeqnVt!w5Oz(#~P{T*Buv+=g%)hG|ELw6+YNNBBI3 z&nJ97!xs>~fMK36&oB+3v~~=)C)}Rl4um@}+>vlchC31N#PEfLFJ!ng;m!hDE|6!xCYMVVSVZutHd2 z7~y|hn#!<7SYucxtTSv7HW)Sun+#ioErxBvHp32Khhdkn%dkh-W0)3FruhtK63%3} z7vWwE_a@w%;XZ`>Fq}m=i{ZY6`!d{*a6g7=0bg2wh6fNHz%VIZX#*J^M0gOxg9#62 zcnIMk48siJ(uOiTjPNjqhZ7#oa5mv=hDQ({!SG1JBN-;8E^QRUqX~~@cnsk&3=>nI zHkRRWgvT*Fp73~vFD863!0SurOjp-Dgl=^hvCZ!U(WCqgs)&2%eT3-xeQ-P_)3PaB77CYR}-d?GyKu~ zPhZli8JdoVzJ}pz317?be8Te?UO;#O!`BhMj^Txb7czW3;p-W`f$$9s-$?jI zh8GcD#PDLmiy6L&@J$TgO!#JoZy|gO!%GM+VR$Lwr3^14yo}*n3E#@_a>C0QUO{*T z!?zK>jp5q~-_GzIgzsQ@CE=9}|BLXy7`~J6oebYa_%4R;CVV%;_Yl5^;d=?+%kV0~ zs~EnI@O=#5PxyX@A0Yey!>b9eX81wE4>J63!vALYA;J$ayoT@^hSw5a%kaa5A7=Ow z!jCZgDB(vLevI&A3_nizafY8D`~<`62(M%KNy1Mu{1oA*7=D`Y(+saCyq@7_2tUK{ zvxJ{z_&LJQF}#8B28K5h-pKItgr8^l1;Q^dyovB8hBp)5%Wq;jM(XGQ5rOHiq9I{075s5`L56w+O$* z@OHx68Gf7a+YG-$_#KAdCHyYKwS;RK-a&W=!|xG(kKy+Tzt8Xogg;>TL&6_2{1M@g z82*^>#|-Zzyp!Qi2!F!xr-VOcco*Sa41Y%WGloAW{5iv45dMPUFA0Ci@NUAp8Qw#9 z55r#({)*wR34hJ-H-x`o_*=r?GW;Fk?->4`@b?VwCA^p69|-@z@P7#Zhv6Ry|H$w@ z!uuHhiSSPh|4jI2hJPXa3&Z;f?`QY`;R6gGBz%zJUkU%p@FBv77(Pt+FvGtQ{*B=y zgpV+Ml<-l8e<%Dq!+#L|gW*33|H<$%!p9i?i|}6zA18dA;lBz09pdZb_J4zL*IsTm za6?>A;6mUgA+E+p@Rx@F)8hBjiBs$0(?VR0kKnHb{>S~*1S0uWBji7tUx4f6hwI~! zKjnw=1lI=ur$?{>+$w@IfLqtYZ6mk|uJgd@@$wMvSPy5^!`&koU$K^e)rYWH4@>p1 zTn{Vtuv!mm^{`$K8}+bR4_o!HT@O3;uv-s%^{`(LXV$~L>fzq?aG!cOs~+xK5BIBw z``5z*>fwR)@Su8la6LSv9v)f`537fVM{uDFp8*{c;5V4~&wTxO+@Bxt?6c$CURHVT zEJnL!WsU4LE~MzWtbxO_$Bd5h^#L~--i(GNKE5t5N@>-hMY(v4UflHwM!ba2FQTQc z#HW)J2<3@#+VN8ywt$$9JsIF=3mERCKNG7+D-gAtOqZN&1&AOoBPT7=07dW=#YthLO6zyD8 zmqdPfSk6rz!YOd5!TCqL`w5QlB(EJ5g+zOqd;Mt3N8;ASAt5jYe+L3weg#x*XpF3i0A#MXOq_w zV>6Hy$q^d&bs@++@funF@jL>LP5e97=j8oU{Z4F}e=18nk&Nt-1Bdn+d2yGz_xz*R z1a%I^etuC9ivcGa52t9d_;^KFz#j(hQn`YA^8(joe)1;rX7jVkvDFAqzOsKRKi&`A zQdm3_jMaEK{}<_%6;UYk|GSKF&-DrIiaZnkJa!H59PJQoZH(`7Y(7F`w9Xi0&&2Nz z>kxE7b}iY5l68U)E%X*b9`Lys3?)7K4@o3V{{4a?EY?r@?x;ms2H4}FA1z_SUl4av z5eoVW9*Y)YfkU-B9H|rs&Q}&?{7KEM;w`LEZ4eh?3r$4#s*tQh?;YUp`(Er^4U zyK;jjOa{hNAOO3MrBQb*XY}tibZ9T!%Kg_^2Z%X-D(x|WXd8Hzc|P#|1Behu^-8$L>i* zWeGKdbdY3p2-3tjiv+n8Vw#^qj&zI?jvHM_-5aV0`PDCrFSLRlz#;_j>tONIn23Wo zn&4?TWXX#>2ZIa%~EN190&l)5J1DEY=F5RUUj|3lExpI5b`rou7hNI1QhOilX=j4pS@zOhABQix2!2#)^Y+Mzb(&Zu@+GOSk$gY1GipZXV`EvcFwd@B%Du0T|9$T%b%A`XEofI(9LBc}j{PXUaf0vJdI z3Jw_ujH?0|TxAqhhCQ>W;=%W-G7d3ZTp>1o!YK|R8E~#c4-an%>PqK>^5GM=a|j{H zrT2oq8MO0+ZkKWsdf@1a<02eAahNy^96AmShl)eNA>)v6h&Y5xxml&<#reERrd;AX zN}T+Tk|)2T2FdSaIwtNH*mr|Wy7+m6%)P{SG6fUg$xKXqkK}7a@--s)8j*aBNWMlS zUpivSV)s>2Q8AX z7RgtOy* z`AU&|rAWR~Bws0#uN28wisUOr@)aZbijjQ9NWNIgm@Gd868j#>7Xpf%kK_x1#m-0a zH5219{;9`5wfLtR|5W0ia{N<@e~R%>fy)o}|KhM$1cx0Xz?V^eIA-Fg!cmE%0!KNH z892&t(BwgKkrX6->MwSufDFY!f|BeuvJs}>pm`t%$7CFna9oOGB8~|- zGI0ML2rm=z)VcwQe}N;vhXP z14m~Z7vkuMqXUliINIUB{)X5y0p-OWSY(Bl1sg%2&N0M3qM~`Un***_=1$=#Qaf>f zRXlzXF>YKU&J7bMZ7aZIXTK__z+^gCf@I(?kA-t?Kg6O#1t6W66sbfwWT2-d*70U^ zvG_#VVSppEsXJ9n>_qP)T~&?!Gip2N9dxpt6WnC1U6&%{1;6%!K~ptuxYOmtD=6iOQG*;r>k(_Uh=7K?KEc#w89QV;3n2Eq7YcxqA!gVIXtH1U_nC@}AntPAWE*dqBs>>)oe3-={B zgJfJ`Mg?^j_IwcKU0#PJpt$RGjZ)KVaMa@1k0TkUM>-x}E2TlURbEg|iui|h)owh2twyC_G!>#&m1_Mx^Mx7b)aL@x%US%kbvv{gKV`j@%kq{>23nFa%p zjO>bd6g%jkL}`L{=~G%ZClRiS)!5|)#k7|kY^_lU$`98QQ#dCS;wf_~W8m}x4LYfv z!x|v|E+09dnF?cp_6g>qvJ?%FTRt_=&&cjct_`-p$wil3Bx{}I&%hT^96MP7Q^<17 z!!7`Peidz@%Tql$+V=xvI}g$42=0vplE>3Zm}g=ST6z%Nh&2wyL5k4#170#lRtlIb z<$rNc-|1zQbI?=StBTW#sC%b8i^OKVeSNX8BtAr__hr|qa2~c;2?DSom&%LcG;1Jp z!btL9C~(0pH^GAAAP$v_?gm01Cw7jm!_Fre$MtpQhn7KDWu#9xOAQhk$U2q_)BGOSpR zo}Y!))bxJh7wWb_cruwrdAN~q;$B*M-LLL`#AwihKw4AYb<@Hs1DqQfCV`y+!VQX} z4-k(UD=Dp-T8OHI1BQBNV);;V;ZP;oh-`KW<&8d%wcjP^d=?)Le%PHf9;PD=+NCr| zv$!e@sfP@MJi!i)=(kgg@)ErOtt(3uhfXsP$qe-9;9)MA_L!2`Y^-1iqTJC%CQGVD zi=SYBBSCQV!7jKbwtJXz5uSkIO8hz60vjwOdjpLkvJr!sE|3Id*LTYA*(pC5yTJ|v zN!q;b!kfhIvtdyKJG2U}4pxOA=(&QX?LfW;!!`)?rx8yJJaE{+(UV6H9NKpz zUSh~#k=+g{fdw>`G@T}w6~yHVIzqVbZ9HeBp9w!q6Re$}yzo2GErQ>Mrw<}5TJz~G z=o24=!51X$|2T6HPBXY=_^1;yOTLk?Iw!VqMPV*X%Y@j3PE|a%C^m~$qXpk#d&Xu< zP`IWRV*^-hzY*+YD`kb4D3oAfLQ#kl7g3hr{=OwMNk0p|BQ(7{Um^&cjV(Tg=3?_9 z8dh-(x*2^l+({^LE`b7ES{8o<&zF|fy`9o1EsNid@8luCE?MO<6dl)wmsb{+;xkNu zIQB5#AyAJ7<|A9$KpfY>o?)X2jECTR393x1QfM-nTHFu*m_mGFm*D`1n>mH)#P<5+~VkKkc5* zjb*E%DriSmn&e6MOUg2&1%E^dQlKG{>@QT7#M}x`4EiXZ44o+%*fttO1p4h2M$eu- zW$8-j3WXZ6Sy#CP0;yYX+pL&~K1$iWAdt8q{Q;&~JmIShq zbR5jNrBh45=wneNEhHq58lORTVFRANXtrb-I^_oruk1cU0~RwebtkXW{n0DIa-^P0 zFedsyt`)~-2WbZRoUpo(Qdj8F~~&FnR@ zH>yL|PuNPCE{#Knz~|(kkdqTNNTi1ivO=w*A`}T>VyxWLbEn0qit%zJ7JebWU>pa% z3zi-BzlIYxUgpGruAnjvMFMeiCCD?}BD+t#q2uMogj$KM_rt~y&p}8_L;ZOt|MO5E|QdspmvZ$Ij$L3pwF;OSvr(|pjuN=PyYR%Yys@MjC!@^ zxazvqOQFy#;%rVh-?Sl?72;Y>Z3Aw7YTc&@txr|(KlV=qi!>H{sbV()?4&vzd#Fyv z=P;~%9v(cjx#2GeOQStsDW@jMPvV&9uOa@`PrfBiq#(UYuw6x9xTYetA~0Mrq+9|< zi+Hb}ksNka2LB|0m!i)pR1c2Fk%IkQOTmhjf$1s%n>Gxe(*qWa>e>+36X|8)Yz25R z%BKwZ72!Ez)G(I0EbIwOJXiC`{bO-I?e5C%6TxutV87^pBlw?6K|B}bL*=auo+&{Y ziX$aSq@RObZBvj_47H>?sN`iRGnI&Tm&KIv59fI7`bxP9_$T4psGx>C(xDntJ*d@k z@vMP1Pr`twiZrZy+ua9hMu7 ztJDG&s6%eh4vF{KwBb6s;pE@R7C6}gCtKiT3!H3$lPz$v1x~iW$rd=-0w-JG|6U8g z;J*vCY9gE=bPzIy{=!J%5}{JKLZ}vQ5$+M55jF{L310~ZgeKw$ajIA&@k%e1xH8`^&Dh}K;HSU;lQYpgdm81ES=W;?T&Sz#V0b3KS}DHgvJ{}Q`M zgQRKFENO-GiS&ciK%Orzk=MxU{pH`$CXBE zb9J@4Mtu}{uU9u9_ZoGJx=r1#)~a8r2i0-fQtedzJpD%fbG?yqmhlY*uw;g9@(Jp- zS3D{t^Qd(U zKPJ=AZepj|>2@o7uASzjJFT47PFsg}IyxE7N+;Lly^dan*WD95#WOs|%k;9m0p1WV z+Z*kT_a=I8ddvMg{JZ>B{%U`X|ERx?$dGI<;2X{pa>RVGP%IY9#7c3tI9L2xTrI7U z9+lQf>!l6SCaFgH9Y1i>L~bp2l@-~L9XV5eORl!&Ti08Qt+OatCnt>CnP}t~`9`5p zY?K+5#%#QYO~wbtX=a9Ln3<^A67y5@XY)66o+bE-Z}^V?tPk=bh|AfaY*K2JEy`%M zwcpm~{f>Ty-`%JCkbZTTepiW?JIWbycll;H@eYP+oAerei@r^N+j5*tC(9Y&JmR$S z!&Dae_<= zz4AVJzkEnODj$;@DGQakYPC9FyV}O zcc>4luc_avH)~u?7#p=os1ddZ+l1{xt?+@cQ*gwgVu3hATq~{@UlI?B*GV@?E#)9Mxy_0H8Lo0s+QOY`~skO zm$*t?Ev~_+T8FeZh?~S3aSKM*c9Ci_LP<00_m3Pe-z)Try)v)To9)f@j(CUsqy90U z+a1PFaY93(iI66wV-yRvVjH$&XWCiz0DFjCOYeVw7?<^px!2rh?l%vaN6lmS8Kg_C ze5=gT?Cb33>=*4SZ-ckVtMS^>TgP7tw-^8CN>53zO7BXCrN;8Pay#@fQ|>L#l&_X= zk?)b;l;4+sl+RQyR1}QOj=$dYScaD3#`-r>VeaYSC{_Otkw)DDq5=PeyZ;`jm zyU$zWt@E1tXQJ1NzUBA!2m6=$m-!D+J=0SHx!71}FLV}EAxju9lt3yj7G4qF6Pk&J zc(1ri{7%f1-jL3hJIKA{vGOE2A3ZEn%hCpDLr~9jUDW&OBlYp9+28v2#$xj{%eMMj zuUWrY>Go%KJI8YdI~C5;&hyU8&Nk;==OgEH=X)pBZS5+q?T&QscF%-_5WG1k<-Z^W z9{1n&zwWQXA<)DN~9`Pe{+;9epYt zlFpI)Lt@@6-zh&O*T`GsZSr>c4>?^qTe(;%P|B3cmHCjMcPRHOk1Ee%M8BzgpnRe1 zRSqi0lvC7n^<1^1+EX>u-s%u_teT@)mxt&(w#b-7eK*dZ|7~zgE9Vzg@pie?)&qe@TBse;?BNd;Ng^CuDXD;~b-d(ZkS< zUdCW!j4|0LGAfKKjfKWi<4)s2<8k9@<7=aV+0wia^10lcZ!R`hm=BvznCs1r<}2n~ zX03V9{2l%NOsk#M)e
SYbE@~j=!PV}nS)^Y1}yS3fk?qUnJZhLlLjGNhJA&-z`n&^X+K~;h7t3!{g%DM{?OiKe`$Yf|6u=O|7!nbOU^>)Ip;;^ba#|{ znY+Q=gyq6M zVZU%lI4T?yE`tOrlCG5=l6Fdaq;_&lE|#y57hvqIg?xJgZ*Z&f8D`)AC@oY;?W2ys zJDaSQs8`@^tyCY!O!xxk!CmSejL37f3$;wGT$`(XrTw7&f>FuoS^5Bdh`v<6OWz17 z{hr>~XoXg8XQ+m6Ja5z*9~R?Hh zVP#q)(2~=v8P*lnJnIJQ7V9?aUh7F~gH>a_Ykh3(w|=)8*iG#=7{ijCYhPy1wy%Pu zzt7%kZ$~ROb+UD+ z9`_Hoh1Uk7W~8^oyWP9Td(eB-d)j;6+v0uc{pKC>8u-op)BUqCTlMmX_#^#^{+0fN z_`$anE(2}89j$ysI8SURb{7TF7JYHNI1zf!G_gXQB`y|k6<3OPL-$z=-RBu`GxVP~ z#J9zdAPc_2418GpLu@LY9@iBzr0$X+$&d*TE9XM@cm*>=p0-!JPX9@7XlO=%=n&&E z=gu?!WxQd$YqT)WF?mxm9kgt51Rw$~1t2-8CH{b_y~dgpq7oBs*P#q1RPB0FXQ%qs06 z7j5W^<-+B{JmGHPabctIy0Am|9=-HWAyqtG>;s)~0_MvK@gdA%KVUAu82VwEbh$Ji zTH+nj{m@sQg{JbR^nvt+v{yPP9g|Lx(=nrTlzT#F=`9a|T+NX$lPl$`YkX*{IT411=1 z19YY4m|@DDFPv{NYJPS8z{qKik#mmAyPe&huIf5&A9s*D!X1xZP~c8?E8QzFnr?Ad zx(~RIxzD*TyKlK4x?j3KxWBr;yMMV2yvE+C-s#@i7-5~fi@ix+fj14>$6RloccZt| zTZ!?u8guGqZ;$t*chozM(U$I?<@fdH`V0Mc{rCMZ{IC3<`~yChlfvDB@zz*qE}SKt zD|kY0VW==dm?-23(}YstW?_YJr*NLB11%LVcrW8Z#FEugW@36`%dMsGDp1z8uCi@evF0Y znyOu)t{e>HZt-_B&irfcU z)_i%Xd|d9OT&t{x?Xg4Yg&FO6$k)bNk+wiv0{!9#tvhtfetK(Tka0Tfm^tRv=B*et zA6e}%I{va>a6Wai(A&8sDJ1&2T=cVNgfqq7;sEGT1>*F;rm7a_i`R<_q{Y$)kT##m z2@7JGvQlXb`Ed>G+I{NZ>M4*1W1-h9hi3aY$v37O<&Xw98;=IEpw{>TKTF!kJPn$Q086Z& zIoX_M&cNJoyZNNK#q4IORzGW~wbWV*jd-VZ$V#=(vpWY;pr2iUd31$+kNt1^X?rJh zk$rZG)68k_ba!?_4zzb=jQxr3LU*})r@Iy!$t##U&%kJ&<2?y|{}pe$*UWF>U+7=t zYksER-yaRlc&2}~e;sCnyZrkxBkZB~vnqwdPbPBUn)VX$~1Ka#zk|;)Hd1|umu)DKDIQ@HM&8MyTaHC zE#oWWN28;unfF6i8)i+k?z5h=dSMPMw9BD!-3p!SZfIQ(LGOAJn%4`^y= zPf+8pp?&=X?du5McZ$>4Y3`ivoawZ2E`UbS#kt6l9n*20KA1I!IwPEM&IBjdiDCXM zb*h{>!3=tXbCYwcbGvi5bD#4N?9(TmXPg(DmoT5c0d4(#=M(7bUqfU6$vJ>|^-r{G zqhMw|6EgM!=qFv=9%yIXb=_XDMg~LDj&UbI*2df-x74kGeR8FHE#ARR?o#M5ce?kv z55it~!hOcw2z};N_YL=L_kH(c%*%V+@7*6Uo)5c!!j5U=HT7C}XL#p$=Xo8x&R!2s z^mNbmdU<`l!QOCh3}o|UFV8FTrh66MEbmIl=Y_C&mU=572kwPVwAOn9TG2*G>Q}w3 z-rL>|$c0^y+TTKM|Kc6?e)s-{>~89x>Yo8!={&!k-`Vd5D@pZj--kRO=nwZt`4tPz7u3YGDE7!Y#tB!b<2L4+swlj|oo-&j~LGFAJ}Mw|ZCjQ20dnQutclQq8Xn@hC*W*2c3oHl4$|kHAkfRFBZ2n!0vLeTp#QxqzAt_velC6u7VIbSfOsUZ!5T@;r54hem|ZTAI!Ill9vBfi zW|&@5e`zpyvN6&GX)U|)$xY=J@)`0u@_DdAJIg&}QPyP}_Gn*uusmEIBVQ~} zmhP$nxerAR4NDwH{}`L6}H za+9)Dd0zPvbI0Gx1*)j_g@!d%y-j^t?T>lmHSHbkKiX04xYh-dx{p3WAFE%lFV>gn z%fSWQrLWRg>uVq-*Xir^4SIqt+OF5?A7EbjOy8}4qwm%C>HGCVkf7<18yz7zM9eaM zz|M_;9eAyAgK>+o!noUb1(Nhf<2R$T*~iQ_Czy+1v6NYVS~o*BZn8gst#-stb&8*IDgsb#^&FIDa{vASnl6#9rmz;XdvjahrRig7H;^v2`WJ)l!V92Qi*D zVs<_5o$Kdf9Ng&N>T@+I_`PNDWI|8jW#}HCz(Poq&V{bgU6LeC^1zo4l7>lRrAwqK z(2GlX?b(!)s}Z;P}|T7Y+UtGp82%2xSLxvkP2?LSnRgf=fmi(dn~{T1ac zpX6TBZug}#NqIK_uKKi15hB3k(XHT}L+c(=> zZA!34?^^sY_H9yIxslod%x$I`1IIQG=^TYc-&{LgI~#iMNUf7T)Y$ zh5kFq`Op#EYutt2S(wROzYiqW#gI{-Lk4ktYQUv75pEY+U~D&$ewNNsnrK~-Ps~_u zl$kTE3HCv|+L`ZM?<{tfILnu2q*iRfJW`mu%1bPKAwk2YDpj%u69(}R61UynL7)nlRCiR45n2P%U0=~4f z?8yVV4QOf~)QV3h4O#4fd^cAosdKsgPON=ST3}XRWVUYQ}Imqe;PT~^# zUzi2IfaToPDRb_0);nLq-fQI=ZWeU?Tin&q>wkBTV-9H!P5vzJe9R!-Fn@Spp9g_^ zrdgvDTKps6{I+}Vc|UjuyuZ9NA^lCi(!UvdrFH^`fkeAN#5Q^=+7`hmexg<4lQepHNlEm#o#cWvc9m+u{+tS-3waCBKvmxetV6*!G0T>`uEUZ zEpXXmoXem?%!7Vj1O5C5=eX0@B`Gq}o#ZZqe*Qf4^L?)AT>`y)q4${g9OmFu%(9)q zt&jF6`T2ekX4Gr_oBU+~Cqy&n5ueLWC2ELkD6|lGp{pQ*ADSV|73PBl+zNa6L-{9I z!_5^<@gS2gQLa`NC{HTSDVvqo(N4#dG}yWo(77H|AAt;hL;VCy_aXH(_+nlL|CSC3 zJXNm%+jg`50OZ4F;^y^F^sgaf55Pau&}arJ+YY?NK;vSJ!K;i#uvs56o&+Pb#b{!V zFfReSwlLtgI)_GPJYpONfT4*h|-n8~vzrtcou}`7_V z)?U{>M=$yvZP*#?Wgq<#eX>3ioaHioEv)|6(5HTd)!zbkP&cDDT5pn3Wh{oxzXlfn z7Gsxj&^Q8rODD4{JYVC{?BZ@8tk|FQ-}^(TbVYIB3BY){WrNPO;Cl zEqkN=lHJvDU=LO~9iVMyx?SK$8t1+2HG<}5Ko@%wR`+q(b*bEH3|A38zNNw=kaw?$ zn&e>ixm3DJS}Q#dp7?9&X0XG}mGi)%3{i40hc8#&SK7m8_MMudJ*6GgdVtN?tyiGz zj~TBS-xxm`v&?JETcDl42j4+c>q0PoU%?Kk@BeBImYxSckpY%Z1Vb?c?8MvlZ%%t? zw12owJkkzpeXcq+m@gX%tpy33=N{nVH zFF;8?H})C_3>vj9;XBk!7cE$7&c>|ptobH5$yBQ;T2HZt!K<+>@E>fm-Ug?3(E7tV z8|4~mFSnnv|Kl7E#%W7v?mgXs;6$q2CD6v-2k(*Qwe~Imr|5fAz;M*iqW2}KfX8{tdfqzK z9s?ghE&B3K=QFT#-+-Un=j?Y5p=Td+IJY5q&NMe2vb(k07Mx8-H^c4j3h)gWU~aNu zJ$wyY;1o!4AF_KSBzL9vq4$l~68;PycKt+HY`6Hg`>zLfT57OH|13chCJEP|54;FV zt&NxmzbeV&i=|DSyjU@}n2b&xywnC9$p+oJ_0`2~J4^!@q% zVt6I)g|Y#e>z)w6d)n^nhw>iM7gF2mZO%+714hgRa1X)z7rE?Hs!dy2=uJ zmAwvpM6JCWj06YIEf3};)5&&nFr!vO4_M`_gJiG8JKK-QLR@e>S04Ju4JXq^Y=o>j; z!m6QNtb#YO1{%h0aX)m7boj6Zc!sjUag~ABS|Y82zqm%Kg~qiX-r{tbmj(EVv%$HR zf$ds?d3YV>-&!yq`@yrOqqPMk6Z~op-dnY@1aEE~yhXLjZg8p`-U6=*&>FMhAu5As zb&0wPo}n7}+IPc0%E2efgFDTHHz+5Vg_mF!UZ>S)wO~s2gDFYZd0l|-CtJ?}J5~)_ zU={TL8tDAHq33g$e|UINGr=R}URB6|uMTbzJ;*3;m zO46G^Z*PYU((G2ZXk)tC)v8tN8r&AsQkfRx8f(!60tU>wcbx2Qz^n!w&HMR0=iWOr zNecM-{qYZJ@11+kdCqg5^PK0L^PJ~A=iJbT+qDu+(>%B)CN!-Zzx=C}`)l9E5k2R^ zAI#AXo%NH8x{Fr--^8;+|XYtoqokcinY&yy~O3Ro#=gtLpZfY{oC2_>7DED$!=jFC(-baFKENQz`Kx@6NA!-Sl#? zHls|_4*a@U+ezR}CE7wiA13`ZmuQt&ObUA=ub}g=B4AqR%j36gjw9ydciH7)S#7$V z1XY^0{_=Y^+#0`C(>{Ga;#qd*a)9t#i~pA^Fm2aui~tY9_Ah_zzglqT@_RmY&&TjC zWks1K&oF-T{%VQup4&Fw4Zz=CjR^37nP}^$z||r2&A&G}@FoY||*&85;5}k_fZTXZp4qp<%sgSo60oMRYPc)({)@!J<%cyrn3R3}(Zz zmvXP6kx1<2+-uZoi2W}28XOPD#&WNr(Marn-PcCV#(M&I@uINWFAAsqqA=Po3ZJ|b z+1U7EMu*M1@^GVOhK9{Zpur3doAthk1bf30=#fBgWTK*161WAE^tpn`Yp!4lyIU{? z>=sM`y9JZi|5$g-tM&FueR!olT6*mI7&k-Xx%wEF`WUzC!?Uy}^G-7e5LF%HPIYAU zrmPk(Go#sox`6f4uQV-FytK!(v*~sIB)@>Fe<#1uRFI|}EpryI>PL%=kPq1}?b%V> z))T)GVM|Z#m}^9{W^mLDWvlDGTWZYcs9EPVL!%`tJXZ&^O^X>2%r25JGvYHn+l=6t z-ZZAg=RQkn$NE3SY&}&H{S@3!IHGU%7Wp6gZ?+9ctW^pt zlC-5^Gdcp!=vI*#8ZlO&CE?YFS0iYVzm}c`e=WVq()>HCnLKJ$N4<&S%&*O$bw`g6 z$;?RkfTwuyg3Y}}fnN>%{&iDC28<)+7Lcu?3} z>_F)zAn5mbtzSO}0}vRWA6t-irPpJuJlB&SZ>L`E^;r8<@>lbtCnfhHImBT~=BvG4 z>o%1<`(*IXGo9M;HB3|tqJcrc0(M1vjk3W=Ngy*TRmxuqB>NRuZi>vE=iTQRm(Geq3rO=bB9wR(IbD^Ex0>paGa zO5wk!!46;SX8bXgFNjb59%LgL-(izEKDitp!7 zW(MM)TX)(Foi;*)X0+dk4m}qf99ZWAc2@+@?hIeCT@4|h^;TrTN*o9VCgt6$aQ8WR zBfcQ-<0}4ylXu{`b;r%X{lD(8SKzeQ-OqU5E4rU- z?p1X^^Q8M}Exvwpr2!k{q9o;S<#{H?%v z(i9R77D&$yx0`Vn+v#^ReQ>NgIGQL;n|xu1d%Bp|J!W)_y=@PA+cEaG(hDfkRxPfs z_a!c{3lkhO>Z+V>0cp_G=Vva;t1ZMk-3CS$^t1IIV^yW#_k1)w7J~Prb%U^5Mo@`e_Ld9WdArZk@1^t z{N>1`9**!;+j4`M-tX#Wp}j`iICDP2 z`$T-MqS{RI6;-xnabuC4bukz}jPS3w}BYThylM&asQ zgL*USD($3Ye6=(Fk9AKJ)E`h32 zLs2P;jzbw4BEcxO;=k%aLSCbOc~YWB7!Bu?P9IgfU81Ow2^I?T zr0!11Yq?&tR=Q7B8Ql%0srC3h@{Mn!w0T^PfMq>ffx(H~7Dlr!;hsqZS zC(+3#qggzovHasK0zsHZL~SpRtt~;)B1QSqo^%#?&Cq-#W`Ys)8pMrWgIF7^g)^BP zlLrwL$WhRz`q}j7Nf5>(f9v1lDHR;UU8X@}G7TC-_g@{&Hq~J~P9#Z9Fr)K98U<(sbdkIUn^!wz>flnxIasPl z`ugZdgJsA-v}b68o{3Q11M=SbQnxN-q5Jo!`kI1$tmbDhxDdHT7o*E>dnC9KY}JRdidyz#SPYD zKO-DW2R(XIk2}}|fD@rPHev?YgNYC3EMwK7!<gNOae_mec%K^%>_e(peQlLsHG~j!^_aeP)U%qi?EX@IKJi%~E>(+x6DYr7Q|Z|Op=HxW z@8Xfpx!b6#7r+|{D8#Ihr)YPoZmm2K&3btvsTav%jpedGst;*byRl(DWoD^@ z@;Uuw&Z?q44c6JJF4*sf4jbr#IbWxYLB5vutFvA1cBub)k*f_xhN3>n|3! zok9vlGn_wOkLKOdq~n|I63uyis)QT<*T*cJWWPI^lasgsn!TX;!#2&cUmvqg^Fo{E zxvx(%ILY~bxy{MaX{bU_j#tU(zJ|_Gv;7wxMGGP6t$g1MJYj&s(oEypiRsX2C3RfB080^9xxW_ zm{ge*IwyoS+Z|DXX(?BHn<~LKi7H`}lW#J(4-6uo+z#ieM5ef}@1-1`>=`)KQqj&b;1?jnD5I^-9)$RAb6`xZ&z6>_mT*U*@mK(i)Fl9j+% zxTD(lz}B-+87xEw^JtPo5JZ-@SC>Boi)V4>_RL)2H2{YMusCy5dKL9(pp0XlF{C9x z;0W{sNNULmn9Fiv79Exb55&XO!SW_W0Ibl+W6bnCz`{KXeO+X6Jbehg0>#C(}(}XRqi0Tw=Lr)~$p#?f{{SMdJ3$?&${C*GDyYZZxE-L+Z{!KUA zIs#NzrCN$^J@Hw)y<}~vj2(c6KrPie`4dLLmMAK19P=kj#M}~)M$Ovq0%V?pVbzRQ zCRgrwE2K7TRiCiY7Bs`pZBgZFLW|DoC!saH{LMf7Y|$&`AIziXt4Gttzx!wNg#JRw z@Ag4eh8@P45J9UM7e>N}GhQ96Y(nogF6wMK1%6x_%4o?6v)CvyX*cnh4PGPS&7{mA zRB}Zy%tR6Ee|rnc^dU@v86SeWN^__5nXp6Nv0U7|r3XzTH}v72x+NO@+-&}CcFN1=avp!}nOiJ?4*fB_@-awiK$SKx9atj`y)bF9n^eXCCM}*OY4J2kOWdStoJZ1FAzYC-B)*_a)nBLn}un1xm6^G*%l zY7K-upUOL_1mT^+rw@7BdJ-#h4EM~!NJdd~X;4U}%5T7#B(f$Hwo5c52EOWie4+~H z<9m(vpv0@?MJ|v{mM~G3^T>F832S*lYZePy0h5%{`i7Y#1HmH25OgH4{I36z-OCj8 ze!K3K-Y;{G^zk1&E^lt9oDEyGDhRV{R2dbX(T_+!pVyc35&BQd$OsxmY^?`fHLVY6 z86?nE_v=mlP&O*qWH6XNJ{PKj8SK-oi?E2IH}$RaKZs0ZG(WjxNB2rCFtH%H7eCOZ zIJ#k^l|Ftf{m*zqppxKz8KK6~?UELF>x%U8n#9=v@GvL@fMRsm8RC(q7VVchAIq!< zO8?{aMfxiWUL=sQ#kANHUfP$FZ)SI^)$(Or-BE$9OGIcjBoL zHiB_ZX&bD6OOdBgzOfFBabheXK=l9u(kF|w%uHkldQpC_|8XGfHAB66`c^1M(236V zKlm1c279rX+KdIn}8_8)H+d{{&Dz&3{d+-S}bmE$##O2LRPiXNA8CX}e zJqVk@iECCACC<}>$BXsgiQ?v_V_Kp&6+FybGv4!0>Ca3U(ZjGO7{PA6sas3jF2)o# zV-E3LUGSyq?5@d|s+F!mY_?`}(1>_w%ME1>x;X^QVjmV20vPl7jCGmZi}V8W+RbWB zuRMpfd1y6@0efxqpcy>4!@E87Ei-!PnprHyw^$4W))#FLeUqW9q!DW+ z?PB!k{S!uTzZu$Zg!U~xr8n)kNy+%`D+5q^x5D0}}?P1iOrA`%+kO+K~qoJY`^;CCk&Tu-2n)VU3b8 zm8|orffB5%lyMJ{D;97VlV%DnZj=(6IUf&76p@D3H`F`QEXISXh&i@w!;HU9@E&(H;B&Zk^v+=!(@i*1B8R(bUZ6X=R zi`l_DT1MNa_?9F9+Q)UxNBFMA-)#e+m9*WHgFst(o8HEx#kwFZZa%_jE%D7%+eSXH zfU{M*>0p2*YH6VR$5mZ1I#4vM)F47^&`A%i52W2 zirK2|!cuNkhr!x)>XcPEXw-RRG|564R@GRI!Hw0p6u+sqFfcB#Ww32EUd$x#ki?D; z@J#?9k0=@6SuzEH7TmEa2Lahc$(R%+BT|%%(NeONd{8A5IZZOa?BLz#sKs4B!n>A; zh_t>XS2B@S8J5_xosvy2tt}V=H8eg~U?XVsEb064n`&E*9OgR$y9_U82k#WvtN4~A zfD%}~i@*v11@>=p5K3SfgOV~0O3G*{=@LGul1fM4!2q+3ccX1F?)nkl*)CDEBI-TU z3oQGvGj{sTy~TMwdn05v)wU35%N-G2fETlkcZ%rS_|`!HC8B&65fuQ6=*2k*C8CT$ z@t6k1W3&`+J|9%^l!!9GO!96dD{OrOYl^6Jl=?~ZL+mICpEkh? z)}oHzR9iXF`y6=<;KfYxPI>k7O#qa<@?GRr04T3>au7;h8G~XHDT>KxDW;bXs+dY% z8DMtsZghBX*N^b7CH_w2mFkOKOp#Ynh+bb_^`~I%hpmj0 zb{8DqThDm7S29i>RSva^b4%!lH+wfz#m_`2_QrJ^Ge2CMWk`h*EaS zyD3ZQ`=Q{IDfi+x)iwfR#>H0QH99Q3m~FgMe%p~tdau9d@2=AJ|?F67i>Tf47AP$pu?yW;(PZofMFr8onhw;EmXk;Y z9kAfNHcvBo3wk9o`E2~A+WJwrF)|rGWo@VNVkUWKgZnw(1VA-7zDt7>05-T&ISAF@ z7y~8~DVWS?VRA1Y@CPQV2FC!igLk9j1n&9~-nGP1X>jKQR9Gn5eIuk!cvYYstIp$k z#IY>b;WyQG95_ZDf$71E*~U8s=7)UiAb=7WzKg&J00rjp9E1`W#-J=rgR(GM%F@jT zRTd>M3^0?t8_7es>qmHJ=fOU5k~qA9Vf;0#R2BPXh(oIFAhNNXsyl!eGs!!v?(2LL z09AE-m#Py0R^8Wf5UT1JgW?h?ipyvz?mj-K;;O1+fZ4&j(XkhIDDFr2t919FRNEfB z43jL(rjonyVs`M(zU&|QmL!1c%lJ;R6af3Of5<_ozKlsh7Sn(%MhjW(d{AVmzKj88 z8}CNjPTZHC)Q|8NWWl6-8WvtHfholh=FY!Cx;NO6CpAsg4B0f7K;R&wLt2~@4py>E zINXlzO1Hr-L!6T4ya@*zF(w?+8^ZRPZ$##VBQz`~AyM#P!pVEj8Ze__!ZCdxY!5Ib zC%qJRHjPF2O|@+YD+ZlPX~m1#!888ZZyAqz z&SriK-vmH4bG}P67XUW%59c6MGiMCSMx-bkqor&&@3{|dd9t2xbZOef8up^sS;>B#^owB)Or zPvSS#wg5RCbR@M3FJ_W=O6rAt696Ttd>2U-07~jxa}Y{W8H17%DN4#{DQP7i@aO6h z3@|%*H#*93*N^b7B`yRi_*_$!F7oUEsp>rFll z-pgAclzPoZ#KC!?lfSUIal^q}qk?als>Vud-2nj6w@TUK>_zrN>m`&P^4J$p4-xTx z{xNP?`NJ#R$N*DB(7W`M3VG@FQ;Y$u5r(yCghCU+_%xDY<%vxfcJz;$#0a|?_p6j} zO~c-=(sG}-w$86@c?UDA_qL?@#!TplN?&@I*pn;g!XSzSo=lx!@RV?K5Cib4-{&dX zf?Z17C8IT=;<@<(%i{TNkDXoW_Y0pln>ea&H07x%CDHOvdHt6@)d#B=}r z{I|qgoi{J`tZhZfuuz|MQfGQpEWDOLbA=b)mh?XbZC(i2F<*hZwpzdS!OV?qXx0ro z6idp48hF(r=kq%iY2(%P9<<;Jc?)K%>%3duYYHGt^IZ6@gP%%hYyv*k$}PRPOC=mL zrEa<8FxJId)@vA{$pX0Tb&*?yfV`k4_3mcYRQxuU6a(W8yf@5v^E>JDy z(MRSxQOV#i{BE}+8k~JwGBgbLy`6YVMu*{3+>R$0#?Ma7#Cra$Zv%VE$*t7V>5t%W zv7r9-k;q-;Q5n*KgWQUZs@WUjzE!zdPQxIkk?td0i>2%#9Qj#~Glx<;#m z78e5Hcsa6lDdckz8Uy?Sut~6K9@;}GTc1?;=pwA4a#Py4I5;lC>KJ5WZf86AMfd2k zU3>^-g(u+W?I%^|lKuSS(*OLq|Ha?hhT)y!wviU9}s7pmJ%`dhDH{|a`#SOw=U zriK{MubXY3Kv*00x84FJ3qV*;#Y5XEf9r9eNy0zb_1KOL45oCljpGT6&b zLD9a2Ai9OcCR1s`}RMF<@iC#(~)Bm|Ld_E9Wm+pr^#j$l6C5EqcFKW4&1q=>?b#&B1IZiJ^I2Mu-(#v9D zTK|K6$W4PkSdPK0NMKAglT`kRpuvIB-%4O9<#s$M=WUPw!G{Fq5Z0hS9-&nV9Xj?^ z%*~UHR-nxI5#X?r0boaJ#Y&{rGB?0!dTJB|K+9a&SbC5`fIN))Smh06A1y}H(>_*JCydYyF7z#ZAoyD>cN1t~{>Wx|) zT1Qq!(Hi<5p%bC#dr_fYIBaL&It#I3h!I}sJo}9BV&^$vgqIKl6L+<$ZYE;Q|FBc$ zRNY2J4a&P8PpMJ@Nl*x+Y31~#@V8@ry)%T#FWbHb{W8>KY+-qN0bpb;v@(p+lI9A~#rFD%x5URdOO&T3)yo zBM;(@9Ry}kY)z~b&!Ts=9BoC+)nyzg64)6dBMM>J%P@+A`YRzVaQXFGpb6IoT<^!F z#&{X8d^e-xCXEk$jWoiwLvfmpjte zGAx%gz_3NQ<&x6=pROcWE-7Er%qA}>?f>afkeEwa#USip&riC5VHm#hlX7t&{k?*u ziy8Fg!lX+WCOvbG;42Z9Y071}jPG~mk-D4#YxC%=Wxxk=DOU2mIxj^%1Kw$;;C@!0 zQMV*B5BuRDHk>*{7H4L6%G`+4$#Pb!SNn7WyxVX+itF3Bj^pabHG*pb*Et`=WE|Hu zxUR?bQCtaJ2CgsQ`Wmi(!_|vx5Z8a<`ZF#cMBqGJoHlz(XUz1THEXu7Y>q!L_v~}d z`+xYayyD!PHZA&kfqe29Oj|ymxk=>nKKv+7Hj8jxPY6{xEh3pU3{Y~jO~jJ*YNrsH zq|`VmL?CD9r4VU+)s>585yju;WT!>sa3Cio+e8RYhWP zKCR}-b>+?>Bp&VDs1|rTuB&j><6493c3k)2+JWnza2>#P7}rm5J&)_Zabk?c`an<6w9@ko2pTKnwuKyo|3xdY}yoNfS7B9}+Ev!m4Q`zL7VpghUw|cdusB;W^ zHH>Y0TmZ8o%aDinB1AD;sjnyfioeDV4h1nU6efudTfg`pnT2DfE&1=2{L9rGYy)(- zRH+0ZRZ0|4JlOk?bMz+svE7_({~#peBo4-4F|d_{KN0Ka>t#HdF8zqt!k`KDpW7Ls zx2@rF2S>4Sv@9rW<3O?ts9`PH16#y?0>pOQAmT*U@-wyLP9ttF(viT#g;P_fT4(J;^m1I8`KB=8 z_8t;tmXRvX3U?I|Ld6L$Nx7;K`n5{cr2C*%DR*1S-^iKv7k%^}h2@j>7d`d?2|a_8 z;FgD1vJY|6{-WzRFNu!aF3hI}cvx7EDaAVw<4&b5CO;ER{^VCt zRgSZw+GW(Adv$gh^*g(aPG`=CfzlR;sBARqH+ODhmC6kC4emACxz62dbozDn8l67# zUZc|mdyOzT?E~dd5beE2rwjHPou0hc=ybteqtlc38rjJ0y+(z|vDe5(p4)4L>Gv=c zQfy@UYxf#$?k^grz{#v(|NHD_f^9`qRyElpgDFnL zy65wZLRTy@k8MTHj%8;XO~eJjwxZxDw)MfkHf&js*eJz_>Kp)YZM~xX^|usFAtWum zr%MRtD5J9bV!Y%S292?Z^)b*bl*%#(_5ejkOK74T#U3E=Dt4S>(_5va?jE3BF4D}u zNOA8#rzqxjn6gKC7RUHxr+)CSWu%!ra{c+|{ZoFw>X`7 z;A5gL-i05OR(fJAaLE34+n;}QCh|c$F7W3EUe}*ryrTuc@#h!!1@tyKe}2Hb{`|HR zHDVoq{!y6SAOv>4^yde>>(4)m4ob!5{P`2GR4RY|JMfg}&!3U*ak4-Ebu?^-Mr?n6 zkuJ<^#h)L2z_6bFs5<$t!vEl(*--|E>CZndyy+Mg-V6mwF*MMhA7@()Vlg?0ZFoai zMuwC6v$C`>DE|D(eMj&YvHLSQG_eDe(wDAs*pRG87A; zAnXJP>jhy?3Sm7qVX{mwhD&TW(3=iB&QlbM9AR=`0@pl8^S2gs6Da*F+*84BjRbMa zz#$xpfK}mjGE6T3cqBA_NglTl2qYd zslqQZR8`?#5VjA5eNhPG$d#+Y-Pr8!oC=_-&{IIz&+vApD&&-!gna|QsbKp!x&^7i zon~k!tI#xq?Wzh*sluI7g*zCks&FR=YX@OFgfLoYNSLa^Rx{daM4R=dW@pWs(Ncx7 zW{m}uY3na@F-Xc>Ab?Q2K|Ae~Ve6Yrecb1+X8-gfSjEN_#C12W599g+uK#yevu|Cm z1zyFq;Grj$4Vno>c|n{g0!zhcF7(`XA(WYFPi-vOoH9_Ie%H z;|JaqYQwxVyFWotV&zJH(R(#m$7FCrV0Jy73j%36zgomEu^o2-5sXNd9_2Uq0{C;-mIROFtr36YMAbl1_0K*G_}Vz&`Z=|24!We6M9 z8mFVED4j$KQq(5MP!llF#YIRz?Qo5mhOKiPGO(iWwYes6%5j`s!X%cBfn|+Y>GJ7N z1!P?P4YZd$u7IK7N>Ro~sfTIOmGAdLEUGu)x=joG2-o}Yt|ZM7vDg1Ca{rWELMZe8 zl>VdFXjojs@usm#NSt+5Et{FgnRs6;GglZHs{Wbdn#tM+*RQ4E28RQu_ht=LYv*Mq4qq^dT&TC;x+wt29(ApG6|@ z`U(6H@_&&yA97a?^4~rskX`ucTsEU5klu;7&gFdC#-}BGg2Rp0c_p9j;?rV2ZNO79 zIEpj1hOq>RMP$fcCy&g7okkAU#p1KQ2>*?3l*lTy_w?mV1$m_}Lo#T=!hwO#IgU@A z$BW*=KA9!qq#I8Eo-7h`ss01ePZG=NT$2n90o9-!2;dOHweTqPiX9l9aE8)O+kKV0rIkGk-tBOoM(rf3At|y@<0J{-?Yd_ zZj{oI^2=TWxpxZk@2Z40TfEaE|N9*BKG+P;MEO}$kl$2*{H$q_Uy(!psnGX?pz1<2=2i~Rf?^0lvl z+&=~Ri!yRLa_*lN`Qr+PY?GKrMsl{zm^IkS%=0JqarEUt45ejX`elq__LhGc@XT*8#ZNzuG|2J$_&Jjt&6rXfHHu!l*O@Ub!{#X% z*2afjAWlK3PO=EV5sCDoWweV^?k=W4!hvGEdubhRhG!F@I*+?G>L%)qQ2_(_HiVX*=-j7ZJ|4m4N~eng1Hi35v*-SD>JA&pIMq0iM( zar>j`;=rQlAvv+?Fwf#Uu*g1=`>^BQ*WQ48$EmBw}5om!v^mv)yHScmHexX!y< z3&e5NY{L1dxPFG`FXH!~aTR}33;Ye#qzmx-PFyQ-{T;52xatv(1;97v?)`rc_18L@ zzmc3hec<0SxQ224H?C8;^8J62{~Mw4uYvL8Y1_8Gz2s&#!vK6+=m}GE5IU3wk5{gm zr%L&@8*1!hvqa{TO{ahNb@VM&j12Z~`Z@LHtPvcJ?F10#eG?U7naEi&?S3>#XmRR9 zU`!EgGqrt^XeUv_Ai)KI#Ijg3(oa-W3Ke}g&V{FxmjVN6voU7QwsYyr<&un^Mg}(` zOE@>e!Keq;^OZnl6}{VTld4nc;PnkuCdj&h)s)Em+1;E8<;!{};bukUJf zL`%%W_fNV3X6+Y0Id7_z;Y@_tidn`exVTpw=5N?JSsL@1mXU5ER!aq#A`!V>!wj|f z*|96V!1%B45>nHbK@)C#7Y!3w*8Svz(y$%pBpAYcW^q>!(!p~aPOezpE8`nIpNhMV z^QnyYqc0RktbhEhVC*`90KJBH_k_Q+%FI3zjZVkz5k^*ZDKRuHhu z45=UaXx4ke! z_Q4GKl$arpvl3jx?QxUttI|y;ZjO!5M2#%4OFe}*Tgqa+1n8Q?7Vrw@2+T)l+`{J$ z=;L-bsKyABz7~ofj>+jkxm}{?;i3?}K(hg1a!| zRs?qm!TW^ZFEdmTyblEL2f<$!f@w3!v3n1W$uUB^aqz5`cwcM{iTmDSAr2PLidwW? zc;J=A7BFJDqWa0wF~~s?EI721;e!C;uWC~}1l1@N+*L_xqgJO#7(FxFapERz=YNmG zHfc*<%R^%6rV4D7zXb8UaQX#f^2oP?QVpX(lp{XXxJIv}GpXFPy z8J6|h<|BO3;*0E9?ijnzj)sZ7N|&T4LNoS?F+xjxAKOCtK(0Ic&KaQ2sWCb>;aNYz zyOy}<$jzr%7=hd&QkWIZAND;wOkcN%sl0VUh2$VUhj_WO&=h za}a97B4dhm@gV`_jFw$)>-nH4R~r@?pbnie+ScM(Kf=3E{`|E|JPo_0Y4hwHhEa1I&PE(3+9)*(M+(lrj+flqb&UeM-jbdz|m%>bVvrJ=+4 zmWAAtxaDH5K2{7fbk{hv< zB5q-O0bzFR$E#7X5HO}3x6!p2kD0fsWaM+Il#%L*aeR_*sJZ5H+J_?+SA|#?w8Cdw z(reIH!T%hS=79e}I2TaoggN*v&6<6@7sF^buOd#`%{gylz!E05 zKGEqzNM?O!fIlDV^zx^nvz$M+^KbJ`V9NZhObRns+0);aaRy%6Np55=?qr!V=XXkB zA#3=)&L--7$1Y);le5(xHJ^; zW&FN^>p5Ja&qwr{E0HBm)a~>z>l;#~dD^Px>4 z%XCoFx`;~JzfDE!k10<|;#6}=urewogL2o*tCE_rg7}4W&_T&DkK_he+`dQ0w zC+>&zMZ2F3b`QR%Z%J{$`ro@XEsVWZmq|?U(6hlqcFeO96FT0KmZ;FdXM+drs2+*J z)-fS%qMcO3%3Z)~^4#Hf;yk+yeE`I^$|*I5iCANi_2@DYGQ}}AnQc7)R{|$hI0YZ$ z&x|iL1t0S-#3zK&|71HGN8xq_(q9lVCI8c}k$?{9qt zXk*%i&K?pth{cNX-snlTA6V(;#|`5n)LSzc@0H$~5xsRp^w!@pROziFQ2IupxBgc2 z)?tIf&CYP zUF6Kg-iPgS*v=>BvGW?ev0Vy##2VR5uJ|wu$KD)n;9~cYDkb}*BgtF(%*kKP26&ZB zB<9ABld=C&C5*)~_bOYeI~lJJm0*y8UV_85F+0qf6%zU)kN1bVkoCdmDr=TWpe)Wq zx5+x2)Ur-Pg1n&_==eleTx}qOQt{7sN`?qmyP{UJM{@Svb;BOPh5XOVX9|YShd$LI zI+)BtKA}?EOS-_Xk1R};j=+l0+-C1=pwk5oLjMf5zySq58M+{B@#IKa46n3C?yv<( zb&U3b1MgK_NWxc-FKXSPVuOD?n#fzfb1&d(Q&z${gP9wL zReO2yu4|YSIJg%b6oZr7H4n{0R1LRe*Dubo9*9@Tv2ZkE16XdB|4s} zTYx}ztvO|GGJdFYaDsw85MNdE;$9SAn28dzh=;LCgpAKVV-@BeDm-AUT9T>d8@9nf zKJC4gfWqEN5T*83LT(ojjqI)DG51izMp*9Z`7Ad(kg(;i5+3Ar{~WJkIN8S8_;K0e zERQ!=1}C1Khx>)c2CLMDE7+^Y4iE5Z;D(T52S{KRNa#La)mYvdA4clB#T+On!LKI# zb{qZ@Is_;O0<3P|OZ^YZm>3;_GXA!mntYd<$652UvX(BAfz=mrSK~?xDjiDUXxOTV2|q-s zPFu(lD=jbJ$0kl~1zWKgZt`_Lf5%btX!;4pN;vd*>@=p1|1E^Mtj4BOhb?B^!t^7E zqcfN3z?j>c@rYf%UT#sPCftg)D|!P7ki)gbJPA8OW{snOqMuo+v>hiorYw_^t5F$> z^sqGZ;BaOhy|~mw;1JpW*gO_DHxbD0&;rX%I4k113)kmx{Ro#+e|k+Vm61fLbpt4i zef@zVloKIvJ-ZF>d-0CKA|PUAH-Inp7u}rcsSW!qqT~y#g4Vr3KCDxS>LLOsCwoXb zD1#7rQ)D{9F3s9 zsbfU<=cOK{legHA)Ugrpo5shSVC0s4JbUCT+k5n;J@~YCI|3cjqbtjgO+0> zkarA-eGCfjIXdJqw_iECB!CnDk~fy^Ma=%Zm}O^-S$@Wt+9@%ZU;<})9Ylv?5BMEv zoS9c2pGBQdt`Bdc7b{9g7Ar#67~{!j7{!IO`H-v1$aBGfU7vz!Txxc%)GU^;_7W2H z>&Vy0vS;zx=9*@y-LYr!{b>6cAJdU}wx~wU*SdR5%FpndC@~|M3uf6zpJ_b4mf+PL-;&pVy`mrSKMSvBM z#}lmZP;WoJX1uNse)^GtU_XQtGh&GEKycK4!YVm(5?FvRMxgp!D0zapfy{`WXc)kk zvvXLSr>R&3%EkhyJS^!eQHQEJWlI9Ig;BUn%lEs-)BO4;E7<5{$HSf@&urjm1l#+i+0 zi+WpR9kxTEZvbvq<7~tgSzob3iD5?LIe?zoINNH^!!QfbfyTLwUhBR*4Cesa-#7;p zZpgzhr_s~sYb-Fwd}jc^Kv(#0wfc z*6(FCppse>-UGnkLnzl>P~rlfOMm8lu5>Si-MSD{qruYMcpR*0XTTf;46MuA(OO>g zb^={OAUpEc8z-eb#ekmYk6I@shF^alSck8%X9tD`E?9|fJylwdJ8Fm1gRa$hhB|1J zg(d1nCkhVg6>B7DtpqjyFjczVecIqY#oVWj?$ajqbZx3M?uKo4!?w6#&F)jH8@t_o z+UY*EyKuYQr`>Ms9ye^S8@A7V+V4IcaN!QRVTatOZu^NmIgDrFNe>=UrN96-bpC(7K+7k5*tnl{ZRBxCZyaTn~{<9c04rU{0 zptv80AaZArcc7?$m4{K_D1>Q@hYmtU#$_v-)Hrsd2H_tnB#+|_df^9Nk!iCUeg1egCx{LFIobv0kfF0e82qokE*rF}c{K_v>(ef}ilcII1y))noge|`TNq(zAF^5fiiIN)0X}EnTHMKgF z^(UW3H2gaNBbJsv@lfmoSV^$28vB%z-vR(Si$x)Bc!q9jpGQWs%y9ue4u`!GfAWXG z@GR6{IQ50R{l1oGgMEO2(DeJ-pFjF6KZ2UO?FNcOBI@ahw zaI8Nx_WV(FVEv(Sh~p_t?grLDI~(m!oDjWlOdiGv!4Qmv!~LP*fuPkNvY2qBKQw}b zpLY@t3zz^9-Xa7aMxeX(hx!MCgZ-gFCWPKKgoNvzg#7|00E8bT1RsVt$4W-~vEZzB zH&`$tQ2^3cL#IlgJB>;v@=z&F#)lSok?KL&sL=te_o!aeZvG$js-6-iHU-MQ5$)Uo zWq*jeWP>Fr`amn!2R`ygHX-zZR@jY|v3+{1Pb-9H zZlC8UL54BXf|%#G&t4ze=W^VnecmaE3fm{}|0~46)jy|e|IpIT(Edltfd4RVs{OwK z{K|sC^_n4Io$h=0|M@kUBdyD`N1=5Y+lS8p|NS$-)08qD{s#--asDRcBW%5d1vxN5 zwgzIU90#Ye{&6NOP9*s%FhOWIgG6Y=TheD>6SufT?3Abx9z2Kf0*C7Y!zf(<#?>jC zvL)Y(jqbEKZ4Eb;*i%$ku8{=e`KTnxGRc@EK^P41NP>DC)3#PX2f-=4G|QXC5S|T~ z;beZUL?yFZ%ndwYmkXZjIr%AYQGonJgyCxOnmA}S^(E{zQ2jF-c#_R!Fi|QySKR`! zXBTJSKMX_oM)spl)I#LWBix+M9V4u?FAi#9>)YZOjMBrPs`v+f2>)m{e!IiIahrW2 zq&!PAJ5cMhmV6KbhHtSJQg7qO2n+lX2mh!&aYbiLKO8L1pjrBGxEa6I97Gt8HWTh; zwJkV>65VYUr}^STr_t=u7cm}=!uVhE6qrx`#^*lEJ*s23&olI%HbP51HS+KYQFr(ieVH0_b~Kv zs%M>rROs`RV+QcGjLb*#yeXz((ZV((G-DjbY6hes)(HcU{rLS{=ppwJ=TicVQUvv* z`C8l_eD6fX7KA-l+RaH4^rnsxG;2<@^Mb6YLBnM#u@ZgR?{5asuB#Ais!VI&6x!_wpxF^fo&DMvPLkFXFB1GJAa!GPm zSuHC!Nf79v_-t;Hn9T3Vz4hSXfO1=PQ2v13=OUral;S1Jw@r_?nM2s?;Z<}O;mc5Y z6iG@U8l;x=DT)R>I|j=Rq83fboO-_Ge@D-fcbr<1Y^`9DlB0Gh=WoY1oKT3PFV0YC6$_J|796T0lwuYm)v6L}q}0vt znBss<>CSHpr8s{^q=S@BPU+Bt{1xv!?KY)O>GLawnV~*ZndWbsw(^7^C-EDrJVBeQ zymS?^N&gN^NI!{N?BKa@J}++cNTWt8EN(2eA7iTR$I&K}ZIt6M%{dO7r?JF=Q{4sO z>=4oS*-2m>2$mTfNsKsl&0O|H*M!h=gl-hf6t36D?4*O82VGn_#uuixC9!EsGTDP- zMP8Rcl0yWF6lz^ULw-tm24={#J~%Zht(>`V2fJ^ZVn- zO*iKs#Tl_ayV_PPWXMaX(eU-p*uls+`E(m+yiMYKM`(F9bZXadvV!>KL;s)y)%g1J zsEmy_#Om=7>pmY7$m?z)1<+;H;S4J9_aBx(nN`B-Ou)ujR-c5rvqY2^+}sW(*lJ~* zr-_HHcVaC*9NUN-tlPmRShO?!R0{x)_1iZ_-xim?uP9Oq>APuK`j#mA^cuQAqU?0( z=BjmXnZ{xW{;cIi2HI(nY`&~*ITE1_QNez3S8XV)HVpGOHLq$S;o-c-2` zo^|ilP)D#*`9ELf{%)9oGRr%c^XEOC-5?}$dFNsNyrZ*+KUJN_`D3r;L11Gi@NWGV z1U!E&?<+v|4P1wC{Tr@hxK85gn{+ASl>QbQBc}JFy{ajI8^;IK=VW_p!73i&-KK!C zp8p(ek?wZR2I<>^j5k+Ih0+w1mY9O1MuVS-m zKj_K22!u}&sFsJ13&?}x5rHFBB1;nXe)15$Rk1Ms7KiUk!p_?BLiENvk#1?vUOKKr zJ1&nkgJ~*0V%`6!NKd}lB7gd`74c*goMuiwZuQ4DRYF2qWQOa>yc^838M$%?R_|1= zW&^FYfnZ02I|j`Q5GrKgI3|d^cwft(l>Lqa_re8)DFWT+W_Mfuxbe|)a=f@=SW{b^+Q!^xhIj3@J@Nm7sc zZW(D6BDUB>C|K4P)P2+!!==9XV9F<#Szlg83R-m))vl_0VYh7cs~s)c==O zk1I@E)cK2qiRI_+6f{Do{9JGUi-g0?9SOB$uo?X_TM`;nA9~{ktN9#hO8MO{$6M+P z`cUy7`p@sFg)xI)q=&K{rH12lw%p}%X(>2{K@<9;?HL6JMvigH5tG9dj5sV9)CL+2b~D6rqOz?yaafV) zjwiOTIuE7`lFr@;lS}8&GwRUe7+prI>zCx{8L6&Yn4@QjL(f8Jyn@%(XKUzJsl{uA zsjN%aSrgXahR)Ss3#zsrKatoH+*uQyOauCCUre0M&XWwKl|%z64pdsK{cGII>_u8` zcZpb8IlEMbKNyEsB?U`pSq`o!C zaQh%!Xhmk-eD#q5GqTCR?p4^p;!98}xZL4b4J|ns(J;C0G*xd%4du*A{FIe<5{ zOPwiiu~RZHI<6tFDwVRl!TN7(io`roSalAIj8D4=lYyq5WV2q-0KJoZW1W4pG6_dK zNV5C5jTm{jLdQZdx$Qh&NmBY=atlGq?GL6vIE?x=Lc)2HA1ZmRv1&b974kOf)@Jb8 z3`pgAa2pl}xM(ksC(7(vc|vTlfu=L^qQJ4hJ(5lPD-^(=U{bvrKv zJM6p=tjBpFw&TtV!A>|Y1nYHP2que*2#`!=mkD18)}Ie1&B*~9a$*QJ?7R@0<-9P{ z5$Ar9;Hytcu-@E>{TE!+Y#i!g)ah-YQ9RJ2caqWW*s~uHlu?~1*JAPdpk%i5BH{n zB~1{QgG|42$7&$ZGB4o365HDuJ{9FH$USVGQi5zf)eCyDdw>fWXYj(8wq9!0?v;{F z8E;=}4p{*@+&N@ITY;|yO73c@VEEA&iyI_O*y>tN@%MHy9$#Ma zSa)B;0FMOdDjC}JhGH~_qyMd%gP>FsEN~!84s=R(R>4Vrx%uQsCC<*@FJqM5^?zES z!m)4MON#-9`!&%fx#6>+liNQr$Xa`4)nASyWcx#h2X{?4R$I0|ANB}&k$Ju`3*VLD zniZ^lv@lInEJvq+*(Eo0Ls=>l@n)sdXq+nDh`|sK6iu@j^~)nJoQa?!pZX4lReL`x z4xv~K>C3kgP#>aYFX#Vin;UX7(6IH(adOTnh<)VYv2yOy75#*xtcgwp$3QlXYVnI? z&27ExlA$Uw+F(76Y*A12(?Y!peXvWwc?9_e$GXCDX`#> z(*%~Yz@1SuvfkjKIdC@bK|W3p4!iytNU1KR-jlGu-#|?xB_YBpsB_%6gN_SZe->bz z=guC^p=C@0%VoC^%R`TuZVoS)gxpuftv(E`idg$^Re}TzIIfPOm-4izdcb}Sn6@Z^ zV(6$2!kCgOrRBoSywcfsR35hexJ+P?ceQ*b0zTlMh0TBpj`b@$&UW<3)hFzKXi;q5 z_IDiB28+wFB3d2tV&Rd4$hf(^6IE4XUAag9^3_i=FEalZbrw$b2c6tg+TQKR=EBm<;0yoG}2dP2IH06CamY zmJ*X(C3GVfTWBbMlGxe*%DCxJasTTQ>rq?c>`au&lwp0ILUU6S6@HkGV{SvA_!;g{v10EFHZ299S zQoJRJvoS)5ov~e#!s<2`yWu3`iHGeVM{;xH4RcT%pe5G>$TbsC0+rLX>{?=eBLR1O zD$d|LzZhb$gfFTJmMgqSK4pl(JYW>#mCO(2qmLYDrWrn@e|NvfQ=hBCUBqhF0zNsm zo3DzY>eG);l?bfS-j0|?yTwPWJGV(B;*Fo4`hO5?hj?u}5rg|xun zgtMXu^_^Vec`9UYE(CKc!aS4h%>8zLbJXi5`xUA>V{f%z@d0bTHrTINAmQtK z?bmbEE2j5S>T>mZiTzrkUZD?2?78Z7W;cx`wrkK6?>mYE_HmuS^$f0;aCuNa=i#~( zS2eCxxITm{hU;Ej58&#+wGY>KaoH^^*Po3nzgZ4$!KQepQ$m*LNpWlh55?>U|J~E* zdVlxzkK^!$g&OYvUIar(-vYos89ZI|Wbo;#CxgG{98bR*pAR}mNsx(s;&2WkpzC95UxvpMB(c5RT;s)^v@ZL)JHwsZywEZ+x*k%Bh!Tbr+B0xS1tWTiSCn4 z>V5JNNpz~n8X5HIPvJu%eVMIj0yxErZ6TE1fsZKsN9K+vgTLT>S_Nm;J{jz%SFy@E z6M8cE46PITF%R^u%-=p49LxiL7fM-`1FmubfscoE4QI-p3_cIDrJdf*Cj9~iXP$N8 z9)L+pg?-?~)=xGrw8EE(!bz1Gr|vW^eKvwY~ns>O6C4l6Z^2EL;@clzvDO}It`VFozTr-Yq zfqA$V;<^ggb-1FqHsHE<(v|D4F~D_M=z*N^dAj#4(2iwbMSs-Ev+lzdn?4UFdGAXP$xk$ZcSg@@$ zEBK(_2W4oPD9>Tbv=Nsv245O)us)=4cS-AP4AkZ(w7Q>8*KfE+d~k{L&jsCMw* z!v~B`zo__uZ3eW&(F?#XcFrh=NeWGJU`0-cL4LN*Lo+gFmayOw;nI_O%@8$Cee=*K24lw)J zQU8!Dw$)Sx#&4XVi|ELX1n$o$>j|88MU7B-a$znYo*rs3-y9} z68X=wf2@X#=d@4TenEK)TSZFzSyyg#J_->MLGi#cu!Ice?3JZSt!xplDXBwkOV7EO zM<+xeRp?)FT1I)qs#Fp{bB^V+pSk0A9A}cr>BiVEK^p;kEY^b5)~^+p@+a20{!gzF zSok;a*PPcfFU%)b$1^xvBlzm14(I6ACzA3I(ll%+dPvS`X zRf*xxnNQb(Xg46{ln!*!h%U0#%;Sg0e z2<_88a>YF(j`9ob0^Nlg(|rxrz<`n?%-Cqxhw(=2`eFk-qKd}^(44Skr^#3FO=mQ@ zRcbdwz^Lbjq|Ror&ZrBRWqc5cmxm@CICH*T7!$sEVs(+uY%!#S&fV;g(0RFsworl? zCnKV(BeB2Xc_j`<7h`e?j_$w2=BS93(?TXx$!xxqiJ;b}bUY4TcIb9pJAJyp^-mOfF2{e18CfK%QqwCu)$D>P{R?f)0kL_ zv5qPRk^P9uEwJ3)m-!OoKqIPtrO+6>1@60=6us7Ar7-tDu9XUjgGGCJnJ6w$S^3Nn*V+ z5BI545QU$R6&Pu#~!iWr}TC?P|b@Av{4?`cTNJVkSm!imEyZ z9{Q8bbMe>DnsXas0kV85l+AOA5EC&}2M+h?r^$1A_zBNv|Du5Bir+c$-2)qbj@`ES z>c?QqAG3pfYD$X%z}`~qx~tn)+tw*HzPf$E4aCU-RN-t{t!=%; zF+#;DFcM*`h&!lKE8ACtsd*+zsh`RuK7fO*GO#~jRb*`vwk({ZFQ)o2Xq%(x*l3}~ zh!P{;NAjpMRylEIf!!opNXYTzq?v1yhQ;V`=7@+bqjdr4p_1WEM|U z975aWVK~8&rKcVv>>pl2LIWSi%nN|cEet&o%${^$0qCWDU3J6Wd*2Vr@O7e{r*M>I zKMv2xysz7fQ;RaS-D|KZHFI_M!mr}zitg>-C=O&6b=QK{%!2N~ZxMJw_p(`dJGZ-M z34Z))P3ymYF5R2T`5ItdfvXC|C7cPNI%xz$0K3t+N^Y;xbSZ znzDWPRtBRj2GdbvE;j@*B9LOW;&eMA$5*(3e|%AJR7?^O=tb0@DvkV&P&xev{Iq+! zs(arBBSMwG^s{~Hde>U-dN)KLY|Y<8jpAhj#oh z=Enxi*KtF-ralrz7)ifmN&jUeX>Skvd>3v6ACNbGJNjU2PDeU=A*AL;A8gIl22#lg zwKe|$zlfpZ%5BXb?4iW8p#egT$l7%oWKHP~I&*TzzVE6!%&Xxn{HF|g1fmc@hqje;n*7!TUYGNy-A z!+pPPPgjL)Puyh@a{rzsg;uj~1QIzv#fs>Z9oc3Nw&Pg0=#TBJwyG zcv_1C)Eg|AM{tS(3VDHYJtle-1;Jl|Lh%wFi3cC2;Nm!r?3@9&Z4XER)`%@w0p+F? zf|3p>&l*rdeRczRGaBfBhNfvCnI12KZO@Ur40J#rP;vo`294Bv zC^h?JoIde7q{0G`Iq}5*Mu}N*u7C(@7?~_B)m+^_LxUl4IG*;_e}V)<;ji(e>?Fy5 zio#3rv>%~svg{jR=?HG8?;0Nb`Q~^`4QUv-CX0YCCNLZ*G z`eX<3qnPsTruH{Y_AhWvehVjI;}USmxDs%kK=>96T_!WnCs?>dp8X{y|0m*J!lmN6 z`fZ4Maj|s&lLJcrKc1IPxv_A`phn9(@YakHC*c0O{~wh6vWhV$SQ5FlpoGyjO!1RM z;}6iE##Va99sC3H>lfpDh@XgW9fD9Qg5@c#E6{8W(~4NaG4navbmiX|Clgz*I%xLY z44Kjt!!nTBi_+SU6i>`5!(g=-|5C(y#e_HnrTkSkZ{YM9bO)vQRW@DdlQS7>GK6!W z7}IPe^Nb1g=CJykyZvemN4~@a^d&nVI%y(AVMYd!q%X5~e3zY;H zKI)gur|7EmKt&#=T(|m=ftn$E9_h40`gT(85|>Wvsd_wPmoTA2BD;UR|8jJq@?@Y{ryUP{CntCCk%(qY*rS z^0*Z^DmOTHETprs*g^FdV)IrcyQ-h6+MP)Z{A44+CA&;=;hg9_e1JQhWz6+KMy^~Twy`kO2^1L}J&kJ9hhf+}e)Aq{Ov4%7W<|!Hh&O{ zRrWppE=D z#pJfFAS|8C1@;hovOr^!gU9-PY!;;Qp|t}^DoWoBW4U#=?I$#_12bBGUjGqWZoToL z$xcpcA3;nTzNWKdE7~CN)%*Mu21%)|ZEk~rPuJG9LG-R`_qRd*q-$&1AUV;snzli@ zdD^f?MAzlIut;0ogUS6q+c`VFqVxW0w!7F>n6?!a{yE-$WoaeWup z4{(XN8gNOt_T$1?f?zX~k|*Pjr=S1XU&^>tYub35eZs^^>9LxK^CPrMiR~M}NJD$h zX#2QPbF4pPvhnGIeev-rDxoUD1Zox&`_ifXFrkvsQ~IO*f_ln`@|3jQWZcStJ%ZIL zdSPD=zGe)pMbx%n;$Un3D}_~&WLk!3tU`U%PzlF$M&H5I$#!p$n2CJ8p=CpniKe@W zfk;mv%eqro^PxFLC;6XYl0SvhdT_=IsgaXwvdWPEgWxE z>(S7RK@#cIPYp5{Yd*H8m@O)X^nZKKpxoDtEF<)WC~OqH{{u~X481WUkBxK%AiCp1VzoLHyvzf{53`JP>B9sZyM_@uUFxO%DQH8C5u&{~ zj0ZsbWt<{7q!(DRVZ{mwyaR0o`hVkN#^Rn-c9;z*mBFh@FSU*25FKnr`_E{Ocv;bc zC>7-x88?X@uq&&tT3%dk)K>&GFd~vf{HVCIW8$dAvHly^mx1x8Gt)`eRH24gt@1m` zxPfN3Xv2W0*yxaKoukjw>8FeO3CyT1u7duF2)R{QXvM6JG(%Csa=m(b+ zgyCZ668*2}x9YhDhw_v3aHD($`>{xp&s*anl;V@OD z_)P+qMplxjQ##+*J;ufgM-I*QgYf8-u*o|C84zAzO(l>q+%GZr$mJ)Ez?bo2I`$!K z%uq3kwFPB0Rj4u(d!opPV1lMte@3BH>_cOV4G)KPoiG%Y%MaBdVO^jC1JNNEq`~?d zaM8|UC_1QhRh@ve3Xrg&xaBzRa`}4(60C-f^@1@EkgLSrF{m+xX1iSe;pJ(&MtnNL zIuCn!$eZFmXVu}xt#bMMMtb;bJQkT%{Ob4G>C=x5HsS+Fb*Qx{2p!`GV-mH;6XAQ& zM2T|wM`IFo#S?YK6Jd`X3LBQLJ+c z1}T~}?Jz8$Wi;~$9yYR($2r4)&Xw~=uo;srkBt0KtQs>7vy;?m^PkGX3UVWPtZqi-e~*U$r%;#0`iO8KHwq!Aw_6`8{eP+?ZbXHWMn zBiVlyLU0aMfrteZsa}ok>2MA&7oTDWR%HvN;0{@$dBQ>*)o9y2K{~%lxKRPY@LHix z0vxsghtltqvucQ0;?jZ{BxPp;oR;>(q~>%C%qFPjqhMBw*ko{uS&E%fSb0y~rG}A} z!BY`OdxmH*`whWEGa+8}G+V7fj~c@eM<+!ww6#oQ2@NdgiHj}=AC(sjb`#x4KCo!) z2cV%mO*-;Rk-IL2+~~XsWAnl=<7<%fv(fOMAcs+w%1+2ZZy7KB4wf%odKe#^*1mZ; zaseavNM15HtRF=-*ceAK!@8Fu?;vV^Xf_VY0_VYO2oVB?kB-hlBV>+~5fVL23o}?h z^(};uHw~mgZ&PVbI~{9yquVF#F9TBG6C$7yS_Cyf>0CBMoiL|@bBZcngGA2=okteJ z(NJW-@QOtxB3b)@U=yj(^l}=&R~i}ew~|re{YRq>TUjygFjn!{kp{s5RP}UFkg0*~ z1f`!r=Jx84K6@E@wLW_x`*pG3BKBLxe%<(0;qSquPD>{d5R4YoFy4=U7!J2>OQCfe zf33xSbCTJ)Jz1mw0p&?@{6)~ zfs%3R{wYS-d%5lO5uaYa5{mx%=NxAH8fr8q_nH9go6x9ETPr=)JJwV|h#s+sOJ$LF zF1QD8wx19m=Sxvvg@D&9-8W?Ns87OKuNPfcf>e>66NRP*8O!(kNN|dzUs2Mq6iE>8 zMpYn&SJv93kNY)?&t4lK$VH1R_Kn{}(mG0tM!;&nBcyU}weR{-(8=tVK^NzFprOLC zjVbECGw=+uXz`g>O6|6+er$u)7u*YkvA>jc6-$N>!>5cy5IzW+1$F=tBc+0Ge#%_naV((Fp1N2k=JmlgZfJb*E3SkqOU7x z>(>=@4i&V9&()ppi{o|Csy+jukhhO?{W!wbIVf5y)x%ged;5+cC`JccOFrr+(0D=` z?zR1d%npFfvp6oy8)zJ=R0}icskqzOX={EGkw(MWxXe@OR=??B+;tl3aw^H2Yu2gTyVuX|A*^NPW6u&-sH z9CQ@3SUIZEQSUMU6t(rTj=Wi^2Ij_wW8iggBAg<6lA zj?t8n^dpcIQxKykwf{K?&(*`&W(h)Oj;S=y*ct=C$x(o59yL6X0Tes1cDZa^kWM=) zJ@`hodTJgTHV9_*=C&)1y}sl#e^?#7>Upzm*8w>+>y40VIr@=Ol-SE>lr$d||Bkr` zVh^zVR@t2qOzB%hLGFv))*F ztT&b_BvK0hOw$s;T3s7(XUO5~y`-C%6~@>F$_ZICoU=>iKr&Qsl)tQ$?u(e1o66vH zWurMDLS*y!5}Y-&#b(1y0aUzT77OoWeV6C}?z5yw9?$JTfzQ+QXqzEvOx9vK! z1?R+g)C>dp)E$I-kXvhP)x+$5Q0mLkZi&j{OQJY94{RVJa9WD(e~EU>mjMwx+>nl)P#Jw| zXf0Qqu0t?VV|^N1-&>9gsCkmcQw3;uJk9M!lC9#@r_JIbICK(Hn!sF`O#Y22SbWdT z7b6?4S1)1^8YoUTcbaA*3OjepBan^*ZdSqovxc&CfawHiVn+fNBu$_`9EtLx5e*7p zD+-km$jfbK^V%p80j76PZo51Bht-^Nn<rusTc_1Q<5(djSMihka@435-=sL+L)A1UY5mIS9*dI4RE4Lk)f_wXb zok=Ox@e-Ch=~r2zuL>(qQZ<;AHCd3$1i|-J%H5$}US5&K5AL-fMwk>FwSlbO zhFmXf62tX=lu%Wm?!qX?;D~9y4D}hvZdjxAN)F>;C&7yAd&pZbCa3-SSAQxT?71^o zY`yr^pGxzR*-|P&?i^aZKh}DfJg3@I2@%Oh*U3G|hze-`>Q93`mV@#zrlT{z4VLJ+ z`)@7PH*x}Z+iinK{P9 z!hJ0R;?(>F+wmfJ)h|FmkjrhvwhTZYaZeVFXNxM;m5B4o5!T?ph4X^(>g@Dxm?9_n z7v>d+wrVhBbWALxxR8iS(T>SUN>Lv3dx{ZhqhDlxEH9JY%R3G^W|$%L?z9QA*wG6 z@5kreN=f(k{DUQqob2ft*8Zjj0aTm%jIP^E;#U|@unj>w*?oN8bC?U6WG4>vC{m6B zsvZQ;yMcEU-(MkmEWTx5i?4nOz8eWNcn#otFX1cT{R;T%!1rBD1^+#KXO0D`P92Ny zX8<%7-$xO`=!^Dl6)K`MPE_3pe+J0;#pylgFB&Uq3_IqFtB=|QbTB20O5m|AK)tA-MQ(?AM2q7-F0+(zErvAi6^R>;)P~hna8l(jpy|{Eo0cW{CQ}%#f_sTRP8>qb&He-SqP7r7Acz|^RAq6$29|rG+{#vPig2|W7+U?qMdj9}OBM(+z zBF*NvRAbE>rZfWt#v)!viT-S4vdn;$5nO)=6JoG=2HUU+Lg%glaywoHA|Shv25{ry zVIQwBxlms~CqNJ9)Khqje4?JJu!{WmBjqDArZvck45VKaQz{qHr#xo*pus@!z=og z12u(r9Hyxs4)>AW3}ZHJyOZ2%i3?Oy=YmPC<4c0$Ta$vJ;P{f}{ojqWLmze^`OeUR^a3We@O7I47N+qZD_0AnSmgT`^x# zanf`WM;^aLDMiEj4hxzRvzuHj_0O|C(w@5?(z@S-EQc)zD%6{i4q1IB2-4C$B-cto zz2fuIz8oxYsGa5>&#TEmOHC&xO_-Y7o?m0N{idA&E+TlAPPe)N133hGi{{ClVp2!) zJf+l(R9hwn-DaiC+-jFY2BBN|-2H%7-;Mf&6|AMpLYo<##gGlvpdHCwf~CV;ESFdd ziHZy5TJDa`iG#;G%<~GR3u_uC$YI}_$7%&r3&01nqLi2!$+Un3#!ZgEC{uGB-*VP{fWdTrHPyWq#Ufe2o)5a59X4h$>XH zgL0_Dl;gkGY$C#30AVcilpmRqp{0E*2C`~(F{VauM{`DKZ5e3HW*^}O-_w!@-^&-R4HgLTP+`^TIqHd`)t6JPet_zPjBd3Y9w~dJ z2Mwh9(gyOv5~}92a*bVCtH;|0N{*=p& z!Q@gb%g#AUhlxgJl0aJ3zhjV*_Sv<`Mi^QY3w{xjQbH;!PKLGReZo!nEf(hDw@#dd zgvbtIn!21pfUgQ&%oquU#fGj;7!#DhV8UXo8jDD4i!NNl_!*D-#&o#0b$cv>9(6t= zhP`%mct;n8Fbo_v8op>G^$M{L$OaIfNxBY$8M(HtYsxFXTTGYB7DADeW(ft$u4x?~ zbWLq7G1pReXqyW*RlT|tjiaR=cvZSP+5Hh?I5Y;RYoymUAud6jAieeg9un8_=(v^==qukitZp7YO|^`twC^N6gmAO^@5lil zJ4vg8o%Ip$dFmmM$E%GaRV z2xQpe+OZOEa=}@oSJvXl9~YVP0}cIV{hfM~AFLC5)HlEpLKOI0Qb+nyCj-;)y1sw_ zjKtNf(yk|zX6|udDuf85gc{oTC@2(+z9ioak?Y?_;|h+v-i7*!17f-t5P+bI<}es3 zPMYn;i%FVI1%MoA=Q7*_X{1}~Of14Ltzl7KidL+CRx&KvouT#V;K8_Tx3%d!6>VLz z)Sj-X#%u#mbkN{2xvgAiua<|Uj-l+$*3cI=`Hk=G=P-^d+ssA4jJBGNziogN*F&}z zrsqh%QOUfK{APHDXwPZY*#YPoYpmjy(0T55>HOji7T@B#eyEYOq5Avc*y5Lx!xtn2s@Yv^rZ_f~b`7#S9UPqYS zs7+Vy=w;C?@&yBLif5QV2+RSBmv7?&%Z+DFzKsto=OLd!aY#9E)&zClySC;gd<3#} z`JN-3Vm%V5MGigy0L!@m04(R6%X#tMAjk)TwwBw5L#=pTKil7k_4@cYeSuZV)$uo_ zsI4d^L%V?`vX79NQh7PNzf2`N_Nmg$5Kn<5btsS&D9VB8x?hJ=f=ZZ8UZXi(cInAhs$B!F?6MD+Ej1F9 z+5MZB!k?scFE`9W;4erQzekFXwO0LY7NoBo>2s5*C$m-$4>Z*FIe(}(LGEG+v%8dK z6HZqs*qx94p^IpegU2STo<_aInMh^Yz)9cd(^+?6U5cd91ysD96dRwWPN$Fh1}0I? zU#%?sF(qysQp%=CAM~S(gwAodN#`7muT>Fej#1nww>xsZrENF!}k{12wGb-t12=}JWGmgrK~9RZCN}k zPLcn$8R;SVMX!WtiAO#t z)dpcAA+I>c$>XxoJ-&n;Y-pHUE)6fBotJ;ek>NvNGl#FrKjZ_Od0R6LGK6Wvm*~G=27br|Zii1ON#AWxul799Se?zD!RP{MG~0Npq5KYsIZ9E$js6BXGIhQ&>RzajzbzS46Pw7Q zxhY-!zCz4)JbIBa4Jz}S40{7-XQ0F`e8Y!h`W(@@xEhvO7-uNP3f6GL$VaH>W6?fE zTF&c%MS(4xo=E)~ldi-=B8^#<7E~DKNL&A)T`uHvkGHg=J@qa{dkXs&f3KaUxVx3+ z95%;c*mLm#7bmszw}U(vd|c=gn`JZj0?e&!4v*qO>=kVcA(IZ}7pAok@1EbdP${)b zWf5I!J&nD;y3#s?Tc>NNA2*P&b?6IS$KtKiuOff~6A7$R)(?eQCx%?*PHQ4r??A
wB`1`k#{iUT(x* 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 literal 0 HcmV?d00001 diff --git a/AntTweakBar/examples/bin64/Readme.txt b/AntTweakBar/examples/bin64/Readme.txt new file mode 100644 index 0000000..6d2956d --- /dev/null +++ b/AntTweakBar/examples/bin64/Readme.txt @@ -0,0 +1,57 @@ + +This directory contains binaries of integration examples of the AntTweakBar +library with some common windowing toolkits, so that you can directly try +the library. GNU/Linux and OSX examples require recompilation depending on your +configuration. + +Files with .exe extension are Windows versions. +Files without extension are GNU/Linux versions (they run the .out files) + + +--- + + +License & copyright notices + + +- AntTweakBar + +AntTweakBar.dll and Tw* files are part of the AntTweakBar library. +http://anttweakbar.sourceforge.net/doc + +AntTweakBar is a free software released under the zlib license. +For conditions of distribution and use, see ../../License.txt + + +- glfw.dll + +GLFW is licensed under the zlib/libpng license: +http://www.glfw.org/license.html + + +- SDL.dll / SDL-1.3.dll + +SDL (http://www.libsdl.org): + +This library is distributed under the terms of the GNU LGPL license: +http://www.gnu.org/copyleft/lesser.html + + +- glut32.dll / glut64.dll + +GLUT (http://opengl.org/resources/libraries/glut): + +The OpenGL Utility Toolkit distribution for Win32 (Windows NT & Windows 95) +contains source code modified from the original source code for GLUT +version 3.3 which was developed by Mark J. Kilgard. The original source code +for GLUT is Copyright 1997 by Mark J. Kilgard. GLUT for Win32 is Copyright 1997 +by Nate Robins and is not in the public domain, but it is freely +distributable without licensing fees. It is provided without guarantee or +warrantee expressed or implied. It was ported with the permission of +Mark J. Kilgard by Nate Robins. 64-bits support by Alexander Reshetov. + + +- SFML + +This library is distributed under the terms of the zlib/libpng license: +http://www.sfml-dev.org/license.php diff --git a/AntTweakBar/examples/bin64/glut64.dll b/AntTweakBar/examples/bin64/glut64.dll new file mode 100644 index 0000000000000000000000000000000000000000..5df6d9885c753c5a8132c604d7677131f0704b56 GIT binary patch literal 272896 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 G;J*P491%kR literal 0 HcmV?d00001 diff --git a/AntTweakBar/examples/d3d10vs2003.h b/AntTweakBar/examples/d3d10vs2003.h new file mode 100644 index 0000000..7f32914 --- /dev/null +++ b/AntTweakBar/examples/d3d10vs2003.h @@ -0,0 +1,46 @@ +// Workaround to include D3D10.h with VS2003 +#ifndef __out +#define __out +#endif +#ifndef __in +#define __in +#endif +#ifndef __inout +#define __inout +#endif +#ifndef __in_opt +#define __in_opt +#endif +#ifndef __out_opt +#define __out_opt +#endif +#ifndef __inout_opt +#define __inout_opt +#endif +#ifndef __in_ecount +#define __in_ecount(x) +#endif +#ifndef __in_ecount_opt +#define __in_ecount_opt(x) +#endif +#ifndef __out_ecount +#define __out_ecount(x) +#endif +#ifndef __out_ecount_opt +#define __out_ecount_opt(x) +#endif +#ifndef __inout_ecount +#define __inout_ecount(x) +#endif +#ifndef __inout_ecount_opt +#define __inout_ecount_opt(x) +#endif +#ifndef __in_bcount_opt +#define __in_bcount_opt(x) +#endif +#ifndef __out_bcount_opt +#define __out_bcount_opt(x) +#endif +#ifndef __inout_bcount_opt +#define __inout_bcount_opt(x) +#endif diff --git a/AntTweakBar/examples/glfw.h b/AntTweakBar/examples/glfw.h new file mode 100644 index 0000000..63eb727 --- /dev/null +++ b/AntTweakBar/examples/glfw.h @@ -0,0 +1,482 @@ +//======================================================================== +// GLFW - An OpenGL framework +// File: glfw.h +// API version: 2.5 +// Author: Marcus Geelnard (marcus.geelnard at home.se) +// WWW: http://glfw.sourceforge.net +//------------------------------------------------------------------------ +// Copyright (c) 2002-2005 Marcus Geelnard +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +// Marcus Geelnard +// marcus.geelnard at home.se +//------------------------------------------------------------------------ +// $Id: glfw.h,v 1.16 2005/03/14 20:52:51 marcus256 Exp $ +//======================================================================== + +#ifndef __glfw_h_ +#define __glfw_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +//======================================================================== +// Global definitions +//======================================================================== + +// We need a NULL pointer from time to time +#ifndef NULL + #ifdef __cplusplus + #define NULL 0 + #else + #define NULL ((void *)0) + #endif +#endif // NULL + + +// ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- + +// Please report any probles that you find with your compiler, which may +// be solved in this section! There are several compilers that I have not +// been able to test this file with yet. + +// First: If we are we on Windows, we want a single define for it (_WIN32) +// (Note: For Cygwin the compiler flag -mwin32 should be used, but to +// make sure that things run smoothly for Cygwin users, we add __CYGWIN__ +// to the list of "valid Win32 identifiers", which removes the need for +// -mwin32) +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)) + #define _WIN32 +#endif // _WIN32 + +// In order for extension support to be portable, we need to define an +// OpenGL function call method. We use the keyword APIENTRY, which is +// defined for Win32. (Note: Windows also needs this for ) +#ifndef APIENTRY + #ifdef _WIN32 + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #define GL_APIENTRY_DEFINED +#endif // APIENTRY + + +// The following three defines are here solely to make some Windows-based +// files happy. Theoretically we could include , but +// it has the major drawback of severely polluting our namespace. + +// Under Windows, we need WINGDIAPI defined +#if !defined(WINGDIAPI) && defined(_WIN32) + #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__) + // Microsoft Visual C++, Borland C++ Builder and Pelles C + #define WINGDIAPI __declspec(dllimport) + #elif defined(__LCC__) + // LCC-Win32 + #define WINGDIAPI __stdcall + #else + // Others (e.g. MinGW, Cygwin) + #define WINGDIAPI extern + #endif + #define GL_WINGDIAPI_DEFINED +#endif // WINGDIAPI + +// Some files also need CALLBACK defined +#if !defined(CALLBACK) && defined(_WIN32) + #if defined(_MSC_VER) + // Microsoft Visual C++ + #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) + #define CALLBACK __stdcall + #else + #define CALLBACK + #endif + #else + // Other Windows compilers + #define CALLBACK __stdcall + #endif + #define GLU_CALLBACK_DEFINED +#endif // CALLBACK + +// Microsoft Visual C++, Borland C++ and Pelles C needs wchar_t +#if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)) && !defined(_WCHAR_T_DEFINED) + typedef unsigned short wchar_t; + #define _WCHAR_T_DEFINED +#endif // _WCHAR_T_DEFINED + + +// ---------------- GLFW related system specific defines ----------------- + +#if defined(_WIN32) && defined(GLFW_BUILD_DLL) + + // We are building a Win32 DLL + #define GLFWAPI __declspec(dllexport) + #define GLFWAPIENTRY __stdcall + #define GLFWCALL __stdcall + +#elif defined(_WIN32) && defined(GLFW_DLL) + + // We are calling a Win32 DLL + #if defined(__LCC__) + #define GLFWAPI extern + #else + #define GLFWAPI __declspec(dllimport) + #endif + #define GLFWAPIENTRY __stdcall + #define GLFWCALL __stdcall + +#else + + // We are either building/calling a static lib or we are non-win32 + #define GLFWAPIENTRY + #define GLFWAPI + #define GLFWCALL + +#endif + +// -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- + +// Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is +// convenient for the user to only have to include . This also +// solves the problem with Windows and needing some +// special defines which normally requires the user to include +// (which is not a nice solution for portable programs). +#if defined(__APPLE_CC__) + #include + #include +#else + #include + #include +#endif + + +//======================================================================== +// GLFW version +//======================================================================== + +#define GLFW_VERSION_MAJOR 2 +#define GLFW_VERSION_MINOR 5 +#define GLFW_VERSION_REVISION 0 + + +//======================================================================== +// Input handling definitions +//======================================================================== + +// Key and button state/action definitions +#define GLFW_RELEASE 0 +#define GLFW_PRESS 1 + +// Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used +// for printable keys (such as A-Z, 0-9 etc), and values above 256 +// represent special (non-printable) keys (e.g. F1, Page Up etc). +#define GLFW_KEY_UNKNOWN -1 +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_SPECIAL 256 +#define GLFW_KEY_ESC (GLFW_KEY_SPECIAL+1) +#define GLFW_KEY_F1 (GLFW_KEY_SPECIAL+2) +#define GLFW_KEY_F2 (GLFW_KEY_SPECIAL+3) +#define GLFW_KEY_F3 (GLFW_KEY_SPECIAL+4) +#define GLFW_KEY_F4 (GLFW_KEY_SPECIAL+5) +#define GLFW_KEY_F5 (GLFW_KEY_SPECIAL+6) +#define GLFW_KEY_F6 (GLFW_KEY_SPECIAL+7) +#define GLFW_KEY_F7 (GLFW_KEY_SPECIAL+8) +#define GLFW_KEY_F8 (GLFW_KEY_SPECIAL+9) +#define GLFW_KEY_F9 (GLFW_KEY_SPECIAL+10) +#define GLFW_KEY_F10 (GLFW_KEY_SPECIAL+11) +#define GLFW_KEY_F11 (GLFW_KEY_SPECIAL+12) +#define GLFW_KEY_F12 (GLFW_KEY_SPECIAL+13) +#define GLFW_KEY_F13 (GLFW_KEY_SPECIAL+14) +#define GLFW_KEY_F14 (GLFW_KEY_SPECIAL+15) +#define GLFW_KEY_F15 (GLFW_KEY_SPECIAL+16) +#define GLFW_KEY_F16 (GLFW_KEY_SPECIAL+17) +#define GLFW_KEY_F17 (GLFW_KEY_SPECIAL+18) +#define GLFW_KEY_F18 (GLFW_KEY_SPECIAL+19) +#define GLFW_KEY_F19 (GLFW_KEY_SPECIAL+20) +#define GLFW_KEY_F20 (GLFW_KEY_SPECIAL+21) +#define GLFW_KEY_F21 (GLFW_KEY_SPECIAL+22) +#define GLFW_KEY_F22 (GLFW_KEY_SPECIAL+23) +#define GLFW_KEY_F23 (GLFW_KEY_SPECIAL+24) +#define GLFW_KEY_F24 (GLFW_KEY_SPECIAL+25) +#define GLFW_KEY_F25 (GLFW_KEY_SPECIAL+26) +#define GLFW_KEY_UP (GLFW_KEY_SPECIAL+27) +#define GLFW_KEY_DOWN (GLFW_KEY_SPECIAL+28) +#define GLFW_KEY_LEFT (GLFW_KEY_SPECIAL+29) +#define GLFW_KEY_RIGHT (GLFW_KEY_SPECIAL+30) +#define GLFW_KEY_LSHIFT (GLFW_KEY_SPECIAL+31) +#define GLFW_KEY_RSHIFT (GLFW_KEY_SPECIAL+32) +#define GLFW_KEY_LCTRL (GLFW_KEY_SPECIAL+33) +#define GLFW_KEY_RCTRL (GLFW_KEY_SPECIAL+34) +#define GLFW_KEY_LALT (GLFW_KEY_SPECIAL+35) +#define GLFW_KEY_RALT (GLFW_KEY_SPECIAL+36) +#define GLFW_KEY_TAB (GLFW_KEY_SPECIAL+37) +#define GLFW_KEY_ENTER (GLFW_KEY_SPECIAL+38) +#define GLFW_KEY_BACKSPACE (GLFW_KEY_SPECIAL+39) +#define GLFW_KEY_INSERT (GLFW_KEY_SPECIAL+40) +#define GLFW_KEY_DEL (GLFW_KEY_SPECIAL+41) +#define GLFW_KEY_PAGEUP (GLFW_KEY_SPECIAL+42) +#define GLFW_KEY_PAGEDOWN (GLFW_KEY_SPECIAL+43) +#define GLFW_KEY_HOME (GLFW_KEY_SPECIAL+44) +#define GLFW_KEY_END (GLFW_KEY_SPECIAL+45) +#define GLFW_KEY_KP_0 (GLFW_KEY_SPECIAL+46) +#define GLFW_KEY_KP_1 (GLFW_KEY_SPECIAL+47) +#define GLFW_KEY_KP_2 (GLFW_KEY_SPECIAL+48) +#define GLFW_KEY_KP_3 (GLFW_KEY_SPECIAL+49) +#define GLFW_KEY_KP_4 (GLFW_KEY_SPECIAL+50) +#define GLFW_KEY_KP_5 (GLFW_KEY_SPECIAL+51) +#define GLFW_KEY_KP_6 (GLFW_KEY_SPECIAL+52) +#define GLFW_KEY_KP_7 (GLFW_KEY_SPECIAL+53) +#define GLFW_KEY_KP_8 (GLFW_KEY_SPECIAL+54) +#define GLFW_KEY_KP_9 (GLFW_KEY_SPECIAL+55) +#define GLFW_KEY_KP_DIVIDE (GLFW_KEY_SPECIAL+56) +#define GLFW_KEY_KP_MULTIPLY (GLFW_KEY_SPECIAL+57) +#define GLFW_KEY_KP_SUBTRACT (GLFW_KEY_SPECIAL+58) +#define GLFW_KEY_KP_ADD (GLFW_KEY_SPECIAL+59) +#define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60) +#define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61) +#define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62) +#define GLFW_KEY_LAST GLFW_KEY_KP_ENTER + +// Mouse button definitions +#define GLFW_MOUSE_BUTTON_1 0 +#define GLFW_MOUSE_BUTTON_2 1 +#define GLFW_MOUSE_BUTTON_3 2 +#define GLFW_MOUSE_BUTTON_4 3 +#define GLFW_MOUSE_BUTTON_5 4 +#define GLFW_MOUSE_BUTTON_6 5 +#define GLFW_MOUSE_BUTTON_7 6 +#define GLFW_MOUSE_BUTTON_8 7 +#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 + +// Mouse button aliases +#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 + + +// Joystick identifiers +#define GLFW_JOYSTICK_1 0 +#define GLFW_JOYSTICK_2 1 +#define GLFW_JOYSTICK_3 2 +#define GLFW_JOYSTICK_4 3 +#define GLFW_JOYSTICK_5 4 +#define GLFW_JOYSTICK_6 5 +#define GLFW_JOYSTICK_7 6 +#define GLFW_JOYSTICK_8 7 +#define GLFW_JOYSTICK_9 8 +#define GLFW_JOYSTICK_10 9 +#define GLFW_JOYSTICK_11 10 +#define GLFW_JOYSTICK_12 11 +#define GLFW_JOYSTICK_13 12 +#define GLFW_JOYSTICK_14 13 +#define GLFW_JOYSTICK_15 14 +#define GLFW_JOYSTICK_16 15 +#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 + + +//======================================================================== +// Other definitions +//======================================================================== + +// glfwOpenWindow modes +#define GLFW_WINDOW 0x00010001 +#define GLFW_FULLSCREEN 0x00010002 + +// glfwGetWindowParam tokens +#define GLFW_OPENED 0x00020001 +#define GLFW_ACTIVE 0x00020002 +#define GLFW_ICONIFIED 0x00020003 +#define GLFW_ACCELERATED 0x00020004 +#define GLFW_RED_BITS 0x00020005 +#define GLFW_GREEN_BITS 0x00020006 +#define GLFW_BLUE_BITS 0x00020007 +#define GLFW_ALPHA_BITS 0x00020008 +#define GLFW_DEPTH_BITS 0x00020009 +#define GLFW_STENCIL_BITS 0x0002000A + +// The following constants are used for both glfwGetWindowParam +// and glfwOpenWindowHint +#define GLFW_REFRESH_RATE 0x0002000B +#define GLFW_ACCUM_RED_BITS 0x0002000C +#define GLFW_ACCUM_GREEN_BITS 0x0002000D +#define GLFW_ACCUM_BLUE_BITS 0x0002000E +#define GLFW_ACCUM_ALPHA_BITS 0x0002000F +#define GLFW_AUX_BUFFERS 0x00020010 +#define GLFW_STEREO 0x00020011 + +// glfwEnable/glfwDisable tokens +#define GLFW_MOUSE_CURSOR 0x00030001 +#define GLFW_STICKY_KEYS 0x00030002 +#define GLFW_STICKY_MOUSE_BUTTONS 0x00030003 +#define GLFW_SYSTEM_KEYS 0x00030004 +#define GLFW_KEY_REPEAT 0x00030005 +#define GLFW_AUTO_POLL_EVENTS 0x00030006 + +// glfwWaitThread wait modes +#define GLFW_WAIT 0x00040001 +#define GLFW_NOWAIT 0x00040002 + +// glfwGetJoystickParam tokens +#define GLFW_PRESENT 0x00050001 +#define GLFW_AXES 0x00050002 +#define GLFW_BUTTONS 0x00050003 + +// glfwReadImage/glfwLoadTexture2D flags +#define GLFW_NO_RESCALE_BIT 0x00000001 // Only for glfwReadImage +#define GLFW_ORIGIN_UL_BIT 0x00000002 +#define GLFW_BUILD_MIPMAPS_BIT 0x00000004 // Only for glfwLoadTexture2D +#define GLFW_ALPHA_MAP_BIT 0x00000008 + +// Time spans longer than this (seconds) are considered to be infinity +#define GLFW_INFINITY 100000.0 + + +//======================================================================== +// Typedefs +//======================================================================== + +// The video mode structure used by glfwGetVideoModes() +typedef struct { + int Width, Height; + int RedBits, BlueBits, GreenBits; +} GLFWvidmode; + +// Image/texture information +typedef struct { + int Width, Height; + int Format; + int BytesPerPixel; + unsigned char *Data; +} GLFWimage; + +// Thread ID +typedef int GLFWthread; + +// Mutex object +typedef void * GLFWmutex; + +// Condition variable object +typedef void * GLFWcond; + +// Function pointer types +typedef void (GLFWCALL * GLFWwindowsizefun)(int,int); +typedef int (GLFWCALL * GLFWwindowclosefun)(void); +typedef void (GLFWCALL * GLFWwindowrefreshfun)(void); +typedef void (GLFWCALL * GLFWmousebuttonfun)(int,int); +typedef void (GLFWCALL * GLFWmouseposfun)(int,int); +typedef void (GLFWCALL * GLFWmousewheelfun)(int); +typedef void (GLFWCALL * GLFWkeyfun)(int,int); +typedef void (GLFWCALL * GLFWcharfun)(int,int); +typedef void (GLFWCALL * GLFWthreadfun)(void *); + + +//======================================================================== +// Prototypes +//======================================================================== + +// GLFW initialization, termination and version querying +GLFWAPI int GLFWAPIENTRY glfwInit( void ); +GLFWAPI void GLFWAPIENTRY glfwTerminate( void ); +GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev ); + +// Window handling +GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode ); +GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint ); +GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void ); +GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title ); +GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height ); +GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height ); +GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y ); +GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void ); +GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void ); +GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void ); +GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval ); +GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param ); +GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun ); +GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun ); +GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun ); + +// Video mode functions +GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount ); +GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode ); + +// Input handling +GLFWAPI void GLFWAPIENTRY glfwPollEvents( void ); +GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void ); +GLFWAPI int GLFWAPIENTRY glfwGetKey( int key ); +GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button ); +GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos ); +GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos ); +GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void ); +GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos ); +GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun ); +GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun ); +GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun ); +GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun ); +GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun ); + +// Joystick input +GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param ); +GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes ); +GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ); + +// Time +GLFWAPI double GLFWAPIENTRY glfwGetTime( void ); +GLFWAPI void GLFWAPIENTRY glfwSetTime( double time ); +GLFWAPI void GLFWAPIENTRY glfwSleep( double time ); + +// Extension support +GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension ); +GLFWAPI void* GLFWAPIENTRY glfwGetProcAddress( const char *procname ); +GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev ); + +// Threading support +GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, void *arg ); +GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID ); +GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode ); +GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void ); +GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void ); +GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex ); +GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex ); +GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex ); +GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void ); +GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond ); +GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ); +GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond ); +GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond ); +GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void ); + +// Enable/disable functions +GLFWAPI void GLFWAPIENTRY glfwEnable( int token ); +GLFWAPI void GLFWAPIENTRY glfwDisable( int token ); + +// Image/texture I/O support +GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img, int flags ); +GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img ); +GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags ); + + +#ifdef __cplusplus +} +#endif + +#endif // __glfw_h_ diff --git a/AntTweakBar/examples/glfwdll.lib b/AntTweakBar/examples/glfwdll.lib new file mode 100644 index 0000000000000000000000000000000000000000..7092a6f7398ebf97c6fc62c79d14d7f48ef645f3 GIT binary patch literal 15196 zcmd^F&2JP(7JnEp#7hzagzpan1DH?S;~Co!mJDDZUIwsi6E2a=V7KwWc-op72Uumb zQWWKs6Nf10>@8YF5sI`q=A1ojq>VV_vWLwd5JfpfTC%_Du2&!3HBI;6Xb;=cZ>sy% zd;ROGe)YOu)$Bi8Y0NI1>*?>ckHNuwK0lDpj}~nCfV>P;;O7vB-XRL`ElS|<8HvwO0!Ow> zz~+bm_yqdu65#3sj$W2{f)Y5^EAcT(;CQ!01Es+CAx^+9z?Ue2lW1Rn$0&hQ=z;+A zCf+MO%-!1j zg9{D6GB;akwl4bhxl)1LLal$X<~O}t)%u+OpfnI_M?{8h!>hEs;KruiK4pG3#gwfjmk#|l(kH2k9o~j!+&J9E+UHQhMcl1q_UF5v?Zynu7!qvwOP4S z^SF=4^rhChR5w-hm7(#l<<*;2zdp6RwB$Eho_cAQoHg3=a>Mh+7b|zw6IcSRcg1U= z(f3>a(lvihDaWOj#g+2gUPC-qX)qtY5*XM*OaBl4qh_l*d;h|6tL4|5rj@J8X**GA zR2JC-K*xqk?zZxsY!gy!*_L$JrpS`bwlnCr)-wrZ*Diwl*;#Y(Mqr!sq=9oZqaY%sbVCK0J+VT^KzWt-ag9gJ9jXLQE`qoN%Z zZev!(dBTt(9iMNggl+WATMDnT?958bep(D|8Q);RmzGZGgu&dwypJSlQ|q|Hq&JUv zwb1q+j(W#k?3WO-$09PC64vnGw;q;-j=PJhwhtJsbl6WyFo3UgOH5eg@t-MD#6i<}lG`!1g1k1D*kO zM7?eoyDPQ80nQ5{4yAnU`2La$*rAu9i=zL?k|oNRdKl zj1v*IFARZjP+6}7-;S_G9&GZMRsZJUbd2zk!UWZVQ1QlQuf-D8M~#Cy>KLj zk$7!Md4vgJEJg=HV}U0YmxY40L?Z-|SZs?p3Ja;dsv;zIL#1x`HjtO?DKXW3!_7F5At?T zdDUwAYvbP+)~zDsFTt_u)SP!``EG8CbGkQif-OPoDAC3Xr>b+6Rwai_GCa1R_&e|~ zdA%BCi3YxwddMcjqX)%*0M--I67_!Fh4NM8P~uq6jq0P#8`nV~ZYBsbp)U^c zU|qz`EfEEey1|;bx}w zk9?LKSf zJ{yUTseghXe7WvEOBhpFfe8=cf?`aWhcTwGViO)h?;m_2%N6X~H2sMk?l#-gnLV(` zf0BR)QZOLPt3;H-0vnDE;WkHfr<-3H@kv^LSMDBR!;&7>cO;uVm1K(STq82{M!0r? zt4nd2b5uo@xfhe#wc6(5*{>qwlhl29+TAWO$ky0g>TAXvw4yCr%WU?9U6Jw0O0=vy z!o`^Yb7XH>lIO3Bu&EqF(eX*@wyFOn+2d?G-r9P_rji%FeRi+s;281xZQyx{c~n-U zXfpdnvFP@~gW%~=Jg$7JbI!uBn^S~Cu@)R;r)DOnsQ4u9+bRyanf8Hc12e@^L}po8 zUwql%vyx9m$0w;<*QOtHXx%FYnMxWPr+%@Wr zjD%h=Zgeq*iMS% z8Ep3Qnxf0>9Z9X*9pjVBJ&KM`()vdd+a6|%t_U(ob}wnum#<@d?^SH!QllbS(H`8# zEYU?wMaL&;doXDZ)T`O_AJ~{6d+)W0jv`mv&rJ5RYsXwk^Q{AMF1eno=rX^vLPBnM zkol~Y;@^fV$6VGLbmv@2oBv$m(7_bvqvU*$q|FkUXNFF znZ2agCey~BhVTy(IX~cq`*4@WSc&hPH|gtkG|Ky;Gp>YO;FyEU)j)1(YQITXb2=X7 zrT4LMIJYxlhx1>k@qQl)>ZP08+G>$3~$IuULiZkMTyF zG&9?9n=d*3u803_>53}6GEUtnN>@yzfOJTTn3w`Zo|&h49f z?_jVjMY1AGvGys7A}fmW5NY!eX`?(uQT8PwFL|&M$s1{*Qw^2qm@>5`S_MsdhEXgy}bi{2M!D#9I)lR`sd)_ zp?>vveG35m7r@}V07u>jc=ay8@pBr#!4UEKOBz4K5HYk>;~fkI?kNmk0g(6zL&V6K z#xF5M9Nn%kx*I^^2N)ubBCo*MCXEh;0)JK*p9YY?yo@7G?9=!FL&V9=8fbG;;1h*Y z*8n8`h#_KPNaN=iB2M>cyoaH{-xSWw0Z9BFL&W4^jh|wOIJ-mRI~WRls&H-rK;T$Y z;oOJ#8*%=q#xF2LOzqXcyiXzC!2CWKj}@*=14v*Wxq^7JSK~(* zBId9h5?F>g0c;0>t7s>IZFd!M4ecbbF0Ucxu^bXuhIxTc6|T<#NPL7LqJrg+z%o=2 z3wt%bk0GLp{1Ue?6!?omZ2>?6>!OB;PH12n5n>VhlLVGw5wV2*TjFgD1+WYP%a|Vt z%*!$&KCbaI3=ubWYP^S`z~2>a-T;t5?wg4Eq{go?M6B%5_y9vhV~fT+7z*4|NG=0N ze25|97`BVVMhrL3&rh74IzK%-KQ=xyIz2HpdwzO;slM7d*a!3T=Ppc6X5-=8N zp1N@E%>3B!>@XU{E6sUnK3uDvjT)=tjZW*%&|&b(EbW=q1!2H+nS^O}I+g0O)a=)( zS`yM6i90Km=IC;zRjGEOmPyznc5No3#!_e5HXxa+eJQTF%BhIyu68;}V(#2sOwN6%6qO(aY8q$rF5nB2!D`h!P7%HaM?o<})aeMjvt*C{W zNt5=-nbqx1)M&>^V`jD4Oj@0&W~yY|8$*^Sl2$c3o!n`6;_6MA9bFc01hZSM*JrA& zC~BA-p0FgOX)1}elOxLN&U9LFW66}ksFRdgQ0r>~D^3n@Gq0gS`rFcy{aBY9mCR3D zC#l7Yanx#?@(M*Rv$S=`rZh=FdZ*%A%ooX)QI9R&*x1GaWT?CNxbmkrgwWhMNCms`^>YLKFBaoqfb~t&D<^CY7;R z4oNxg^i(I3bHsKobR=~kCozh!?NlXBCGEI_gUj?Im3uKg^BAAyO#F6~wK7t&um+&s zJGe5^##UHJDyjPlawqbD|c{iqk+YLGp(p{D>6gV42nrtNcv|habq$` znnsoXW?Hx-n(5$D%QGtmq$SMiuUZqlF(4_kNJLv&$y*Yxx!Sh#kuU-2=`pN38Bf_C zLzYvOc00a>YlxdAZv?YTn)djf;sUOxdahR1J+16e& zOK9t>Tx2-)&=#Ee8orc>DwBj2#cWsG%epS~ggs?RNOL+`NwB%FJ5F?>6*CEDrLKi8 zovBD=z=T|1tl#6URzfQcPPvwhYqysxO{XND zm0A|7&5O7kCs>{F+hXUU`w?cu6T>W*lebtm5G^uei)>w;Uz0kjl7wj{^|&^gG@_wC zQ&dahYOXG%i`0x%)B;Cu40pQK%5qd|;ZkU_AoSe`#|~S#?K5-aj@9{U$7f`V9h;fv za@2~3(he&!$7GK7Y*c9`@&!%SyHF-kMz_=QWoI_BL9V>_L=D{g9QM{(Pzif>VNUM*2Zm$n+RzME2;giODa1q?2X5|Mv1>zT9WraufMl+Ade}kAsfg*mRcVf_E-tcHh8bH#y0iGs7j?4D z?~}V$cI%2PDJxsftm2iZCELxMlgwHY(!9`)7H{%qlkSL^t~`zrn^4+Qin>JO*EbufyZ;1nhz*;VF0;df*w@4bQ?Jcnak0@G|U&SD+UT zKpz~0ei(p3I0T2`2)qif!BIE{$KiDtf?*heQ5b`9H~}Z&6imQrI0KV#7S6$Wn1VN8 z8fIV?F2F^&1ebBRU4b`Y4z9vAn1}07fd!~S4I)^CC0K?SZoo~b!wNJYfhK$lTF{0L ztimmL3vR>zg)(lydB41`a9*t?Ilds}(URUAwRcF*LB(3+t~&B}_Ow)r{YzL5t#niJ zjCshJPP)Wd3tu)P%*4%(Sb1HaD6P^MW88A-8Z0e}`!*>t<>B;g*j0>YcV5~NNo>X) zY4T6!*P;MLU5G5bQm#F+EADaQHU(U1Oudk!jP#2-z?ell>+fQ*Yw=!@c|n&H8JOd2 zpFbe;!hwRYJBg)R%vVGP1^qx|fLnRn>%*doI&_$c@z$ib8_K&_?9|kBV@{rF-z|m= z`BOgMGeW7B@pzC`L0<+L6m(NC1MRG!_e2(F9rSZ~3C9ANmGKfVEA7rwO=3628jkp_ zgu6MbX9*QPekYp}XX@Oj=wUh8;5w&BagQahyV(egUl(_J@ zG)uDBQ8P1;r^Du8*_CI`E97Cadtl*M(@?&`}>Z!UMm|$nc%y**3Z3LYU?a3lZlX6(YhnD3m;BOvuP|NXX5( z|B9p82y6H9u(gF3cAguEB&KaU$tpwJ^Ga<@suC>s)SLWGJOGWQi zTEuv7ddUduMwgJ7{jnZUTtr)DDW%&Ze4DJJWQA)FB1T)+sI-c%L9OI$hlP%P{YgkN zTVN? z?u{EEGbXYYGLlD1>`k1CvfSQGWDndKpYvL3XE$pkwpT~x z%C=TVXKN-beO_ad+xt{0xBS0C!na`Jx8>4J1^LcgwmxLHTEgD(vr18}hn2ZZl_G7a z%y0KC!^k~7O>Aqj9Zg7`ex^1@{Emo{WO|ttn@;v^L4B|<^QDLq@2}PC%4_&}U!I|_ zP=AAVeaqy!4e;OR@4faP>(G~leusZY*TWaqZ3;U@wqf*o^dAMZHpn!HV0 z{cXkI-9#qetAQP4%1=S=E%esC@%7_KCP)$~vnAgvGHo|A089vj9B6I7(6nO}}q(ZW6 zB(iXVXM>US3mp`Y&Hzb-{Auxz{u61T16cnO!FqHY;U{KmaDwCw16HNQ#zEhJ`4&@* zgY|M8{IkrO$RMoq^%HdOT7Rsc95fN4pZufwp+nJ69!UEaY1Jn&6S?1?Q5Pv#YljYH zW{-bG0@cL+TKk7gZKR`Xz(k3T_y_Ythir89n<%08FXji+yKl8yq(*lk@qO!u14nd) z_J}Wm#n7BwC+6hmkz_r3ctc)4YCS%s6l=-B1Ag8Yk#~d3tM+Nkqu32|zv)6wiJy?| zxzUsu*LrnFrW>vS{gri(!?hc^Hc}~F2PC7U$71ywD&0Ed)a{8IXmwAB(l6hJ137Id zCf|od=|tj=ue2M!{+zxlrkG8P&m55)h6ly=aLUFHg}Px2^_0zqEqma^DCx0SPYJc& zBQ|5YTPKb+^cJ(=Ib-1|Y`rZupLr8tbo5xTboxe`JMwyvP260Oebe=p6A9}%1^IGj zmFJLetKl|5#hA%Ygznt>% z6VGngLN&V0X0uLHyW$Mg=vQn`ePYqyT?+a&nIkF_a(ep;7UaVY9tSjE)|Qm2KdlzdoPA`h41D zOPx2wQoelsIpc6AGWMj5(h0_B=&@M2LhmTgFcxzSjnZF3iE{en<5;5Ij7$6O7!^Gh zD^+Me{VZo<|GNTltf6Fqm1hs*OPw5yj2;V?EwE#F&T!e@Orj{g_JqdtUe4w#TKTy$ zr_c9b4|(3OxlY(_N|!S?i}QyUQaPko|x89 zw>fPn)}8%XR(%PeE5^VZ&?|<~xnS_1_<9YWb9tdFzCev0aQRaIYB!9bHMY+%vP&1; zaG9_Fd}l2OQ!eL12P34%Vk0qBwtmCM?ut9JTzL+`V%rJU?P(;b$G1A~ESg-|ib{FDS!4zlHO=vCgrAI<&y?Y~N;~%6^ zdCIq6Xik~7+0@58jEo+O)njPiJ7aM(a;TB zU>ADLVe=j45p}`-le3!pxQLrY-|>YR#~DzNcZ7<=4dkXJm8cO*W-DL%XTPl#_o4)J+LP=gv!p zjeTR(6<5yeE$$U98!rC+5+kF>g7ZsYjeHuj^Ygl~)r!Y4>eCo5S2gP`k7@hx9 zvn$5Hc&{5q`*SfyM~?+tFfjI3Qnu`uXv9;#6+`b94dSG)+!z@>7As$9C0fz|d~oHO?|rfiLd&JtRjG4Ca&d>I2HqRkn-FEM4y7g`xQoXz(N aQ@(70_FJ{ta$aHXXZdbfjGh;mE&l_+^;^^c literal 0 HcmV?d00001 diff --git a/AntTweakBar/examples/glut64.lib b/AntTweakBar/examples/glut64.lib new file mode 100644 index 0000000000000000000000000000000000000000..d5f244d2d3e2d53fcf1da8ff6dad5be0919be381 GIT binary patch literal 26180 zcmd^HPi&mU*?$NDf}6G>qy<6%6Veb;YLa;E#7+o~|HV%1*zr0s1cJTZeH|~X_ucNk z8|)nV@kv!wRj8L%sD~bUK&a}m>VZ$H5GPIueFshvs!$IV2QIBDRP{jn%>QTReRsS& zu}`)1%j`V!%>3S&cm6!{%)EK}Orc&}J=^s{xBYkgL~sA8f!=|W$85QZ_6_u&5GhMt z0Pr_}p1%Mb-vw~uEI{9f0{uq;IDUm8!#4sas{kB#Fhrahm-r)wh=Icr?_!7;+#%45 zzZnKA5}#v;$l)_EoSu-tGEO7T9F%wmLx!&fUR(m;_yj}5*+Gf-FhsnxPvSO)4F41u zS_a_w6hp+hGZMeW5HXDP=cr-GfX~J-g7xG01BQsv0}?;Skm2tFV^}^z?n{BOk1>uI z@0a);hKTd~C4Pn>!#@NjuwESaY!iq{%*TOsnnYaKEpZD&hA#y!&H-@z2}8tGj|A3f z3Nejs%dw6j!&d^At^sg-h9P2RLIUeJgP84>_yvXx{}Q;o0>FWJE+gj7NW70BBEMJS zCm1sPRbYM=fa6095m$~${02kB)%zu|?XNQ25m=Z4;J~^qAYOi6;@21=UfC&;V94-i zfos?<93Nwdcy&tIDU^IVsXF3PcdY`_GDO^ zm-q-nM4?9l>sCN4?~=fGu*~pTpT?&e-1O0 z*J?cXxl(C5sy4@}NqqyDwk5Fi^37$YsVgvGsByU+pHz{ONdM z_-qU1YAJq8Jcc84pCqL!1(Z&RJkOJ74tqERkX8oI}f>KN5%)GCDyqGRGl3x`-#KVMjjrsGn?*=&iWSvRHe zp~=f88jYl|Tq!qJXKqGyq!z`wLZZK(MAb$)uI8JyT3k<}lE{%3n>^!jy%=4HHyTN~ z_@=H~T1s*>E0uh)9z|7N`nZW29n}D;#c4dPl~3yB>J46+Qj{X1E8iU}(US53Ch|s! zh*;^mpJ7h^+fI#3<&|<&Z>SRRwMl`cNBSX_BV$HmqFjpTOQLaGixk9^QYB3m<7#Kt|KHpD%_0J=-}0!vLr@xx=^l8#j#j% zbcCei>Yh(3MnmZy_SJr~4DhbtOE7(}Q z9?Q8IXE7t7dX3dW&Gf3d$i!1xq$*NRN{nV+Eh4OObi__?)*G>~X_izL&Byn4dJ}4@spERzNOCxbrHk*!-Qn;+SOf^`{(HKSBt5{f#N_DwJg2!|)JSEZLPvk5n55K+%+b!*R--z3W*K+1=A%L_7K<={UKvkmCG`~bd}M^Keq3(~ z>qZpHqeQ1xC`QYLN@bXDlJu0D&yZ*2a%Nqfi^wx_&BfOGqjM2C%@q~V94Aj^;wde% z)aGkkFSXLeIg|K<+Z4;-@v?%8I3EAh+8duQr8ia&L@@Gg0R?h z#7XCqjuICUB}T&eFEUaK7gbB0KY;(fN9@f5`~>k=#4LJNKSUh6 z0`MEe{pk6uA?_fi7LX6|{L28pM(lhAAVK^YF?S8?fEaug%S7yZ4ci3qHDdWX)&Vj2 zI>7G{`xgOziuejKzXb3RqNjj-h+XIrUPpX^m?#2#fH+dZ_kv*V**6e(5LfY?zK!kn zHx%CkJK(#p7jD7xut9$9g!|xrcmQ_6gU|)vg5B_K_zvuWhu~q@2j7G5!z1u0JO=yW zaX0`^z?1M4bi>nd5T1cU@B=su&%zOS4vxYP;YZK|FTgQ44kw@&a?l6;a1u_z01U!u zI0G-jS$GMC;2aFY2#mrQjKg`DfJwLj7hwvf;S$WiEL?^;$iqBbfvd0pFT*Qv4PJ%U z;5xhxi?9R*ScW2$u&OI?16H97Z@`;SfiiMaF5MQhT3hbl6d7~=SM2bt4mC%Me!jvvXfZx+Vwb9?Oi9f;C&hENw+nw2SSwgDgwzccGX+^JPwy$+5 zMGBPd#-ql*WKs7*iIEZK8?`36f^`>!NzxW1l~R7oYUE1hriO`P4mp1r84*zHkSW;L z8iYh!gd(bLEAW`M0!7T+L11y)@{|L~A%)y}Q@{18yA+THqqZ7LCCBD0YTIXAqAW8WacnX!V@KTT2R)p2WTX=2%vjrA zN?8s|b-HZXTTDlpRN8&21jJXZtt*znKGj}g&RDC@XTsF;I6 z5+@x^+czxPST-`o`k8ftW~>>hp*u9@wTl%oE4OR4@G{8BnTpeb^nn;p)YgfPS$2t* z(rH}_$&9XL#KBAL51me(v_`1?v)W>Cjv=(1*cm*#vOmbFkC2=59TF#_rPT?JeImp2 za_fRD2lSAIE0E(97Ehg-7@_m{<`9IbX#0Rg_=0bpbz~oGs7cc~mS9ED0|*|^K6-G^ z7wBO^syDE;+3gI@>Mp4Cx~`%rx4t=T)GE9mw7QAPwEA;BrAkHk-Z#71o*Phi+?Tpa zx9^3$|NDQFUH6~|7d^7MS+Jpbz$A1|Te9~gPR>MbqaQ&C? z?|;)AsEU4S236xBbbT|)s*>=!2_C7FV>+l}boz{h$)95X$UjyVeitBPEZBh_XS^{T z;62@{UUDKgAU}*?y<`XPB_Hr7W6zh}OPH&l{*hkNtK_Vgyr&{EWW8iN-hMmp^a*^1 zmY2UtH*9Zgoj8>vttQ6S=g1)5aCWPC#ulEHh(9(q+1R3gLolSq7M`bwKc@GYipY@Z zZFTFm)3OJUf2(?9U%zbDZuT_}8=s}yY~DJ=>$nr&AREgW&U`Y&&CmAUW#6f6&cn!g z56&f&Q&3d%fT71OL46Ix3WOm&i$GUY{T;|?TaJ|&x>5MM6+I&lK zrMxAfY<<1iHG3M_c1yNwPfReQr=NV=Vayl+TiQ>)qxk3tKzB1&dB*j36_@Rt3ha@- z(YD88vi)A6Z_PK_9+Gf@v_a0_~vzOR@p?`SZSXBK`$GufWkU@lL;cvNzwy}H3{o;G~Uun~`O zC{v%jG1u*^F5TEK_A90=Z?q&dlVf|9PG1Y_?I7|!uK2PY-Jy)0743jz%=V#&wyDpW zdqOeV{`tVV`DVr^C6nv=53QBY%74n?A|Cm`n)S9AZx3TX=~is=#3HmtzMaI=hQoZh z7+9BFiyrt0*5#n#(SGUR`gnFM&k!E#5GS-wo*C+p;o6Ed(lg8dKr*>!Pr)tdS&t7B zu5`6Jod>l`%$awYRsXDHN*|d8*Q>>>%RB)`6dOH`3+xp>EA%NusDn&j*C;1+DLVzPb8fMjZMKO?YizIlI8GG<@>2(4qz)0(FhqyFmtZbq4JraGgU zQdd?&Te3xeWG6f?8n*1)FoB#td+sdZv~SFWzPbJuyY{14!;GYdU@=Hahof>ZR>bt_1O#OC7X3YEwpd67-!61J3)BN|8WuAejcyE zq+zn})rHo|!*#)M*;n>LxjbH%i-zm&y)K?NHD!3Vpzrxs(P@{-++qxDKi{tKl3~lb zAQ{N$^JdN{M(6IOr0RSex3Ce|iTf z$HpsIeA{~uYuV!3f_qq=Jxx(@IiD$nwxMsj?XeQy%VIF7=sA zV9k8Hn>RI^^(8Lp80KetJ>Iv%R3w}GaZhkNdTiG<#g+BpP+&{?`eIe{k#CZ=fhVRs z&UT~IcjcR%YJ{iNW}{<1&yCa{6TTK(jm~WX&p4|SzU-|=r?vB0$PL1l-e_zkQ$m>1 d+l)?`d^S$gV#?fPbo|DA>(@=n=Wa5({sWw=N}m7# literal 0 HcmV?d00001 diff --git a/AntTweakBar/examples/sfml-graphics-s.lib b/AntTweakBar/examples/sfml-graphics-s.lib new file mode 100644 index 0000000000000000000000000000000000000000..2728b436f3fcc8a38d50838461681902e2103bfe GIT binary patch literal 4754186 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

b^}O%lRlL^weh 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

1(mL3jnNvd@*>YA>Nt_&mOo~QNZz1b5 zh!0!&0p%LQVUu1j;e8Llm7Y)~2d~rwVwlK#53t$NLvjDS7rjfSl9AywCxpX7H|mry zDt(Q+E}@y)3Wme0)SAQ8#{wN%F#|{@f(0U;5UKjoy@^=T8ckngB6$|CSv}4K${Gy>m7x~Rd@Ndp(}uh!rSn+~U6wTSu7|g4ScCjgGfw0E zRcD06C<+^no;BRhOwr&l513mEsK|P1MI0RD=;<*-3Qwo-b+-fWOQ!i0jTV}H8MO?b zHh@R-DE;{zsKPU91j~6@0MgOZ7YNyZ(V=)yGi;dyZ)3wK_4h^qCqEa2i)4eTs zxbG0dS1m=)%lV`s*MYIcdHIO^lu7Lxm(D2QI;Dy5v!Gv29Mi^@LdwAp`O($sTPu@T zu~l^Tsdqh@igvG%$n!TK?5ZU>zsmH)VmJ-Q=;yr~7{{tiRSIWuWHy^7-Ufa^`2xbS-?oxrpKzOd)|*uYj@3>D?{AV()Tp?$AC& zrHLWLzpz>oC)tiHUKeY4$KqYDcQwScb;Q1Pu&R?)(H^?2sbcR9$L`HDG5d<57)tf$ zc43lFoV2LZ@MgM!XiRFTGjyEae4B!t7|!_z>u=b0;(T3OX>(OFvXIsrbiIMOII;l* zqRvDHc>cNp-)o!|kygyqRx*5xQN6I5_OE+L!7r^3$DD}s+ePB-Gh77%vz>Rayu0BD z(o>gQ!|6AkiO0TVcc#G}fx5*$6M^LG_h^@@$(HCkEFnIO6gp&?=m5hPWC9mhBR;Cp zJGLYeGA~NFyauK<4ULz+RY6)C!t(*IELR}S6@3_JhcN?JBIb>c{&o#Yxghj3=!uW| zZSWgh$AZ&u?_m9I5abqC$TV-(@E!cBR7NDCHWNN)cssAl!rEgY3ab0Rq^FB#C*`ccX3|9v-ihr4 z-w9FxD71}oCYEKlnJbP(3IzjM%kHsH*imoK7g^pq^$#N(f zqlUR1xc)D3nPBsygZF_6JKs%}<%iNWgHmL3c3^j>rWaxhHboI@I3Qw@?(RxOn-jCq zGMp0Win>L~8W&i)-*b>J|G-eoSW(noY-aRpa!(Inu=zM$I~Db@MJp_Ha%EiN-C>J2 zQcM-}cy~^!4kad+N?80MN`^0aIMoTPC9;k)UCOEnMX*$lTXk@JgwuLXhOakJP{5;> zaZWNq7!1Xh5?&t*2_+dSGp@qm=`G#EOIT^Rt(NeRJfaCw7OJ=+(!7CohfF{he}A{{ z731Lvtm)%0IV~w{_UR=D5X<**U`jQEfX7r65w1l$2$YZp-53v0kfJrJa5}#1 zOK~K;SW7?jQUbn$2@lX6Ebs$1rCjE{rH zlSrUIWKa%{1myhM{3`=LMJs|XlD;@r^pTpQNudot0o-wprO%Q);66aqC108GluwrQ z)0o6M*&|bvS6J^{WfSVqnu|DGoq0>C$;k7mKrNMI>yd_z`0c${27J(vvgQ>clbRcx z`wGyi&MIhuy*?*y^l*85clP?{x)_s1GBvw3UBO z3wFBuU8BckDbv;Q5Fa9Q%4RiFI7nfGv0?p^8k~%$@BL2AZoF#zPO+!&mSn0Xc?SxU zINbg&*B{X4@O&tQuzF_0XK=I>?|cS&+0cY_Fqy~O6zi}Rg%A|Lst*t+sq2=0xSJK@ z>Atm8cHhaDA!vPV&0(YHCgaNu9lnhYH9i&@Gf(3oMq3+Bcs$<65aKN*n7iYC4rJ=C z*BPGj^Zp6sQ!<{$tQ(sC@QIN@*4_EYQ*s=oz$exN1cOAp%dJJJxHM7Dc(AKeYUbSY zX8?JFGn%={1qGX+k(H5<&UO_@D(Se{Kj*GZK^w0*Y%HVkv&TmgmJhk{5ORssNk{It zCoG@$(b203SB%eV%v`LevkNRwory0qeqPL&;@Fog!9%K?fCh2kNBo848sn_2Hc%R{ z9@i_xnJF&clo1mpZE02o(RvJL}h}IPJgB&G2>T6{(znG28k|60S=4@D1y`F-E}tRT`Dz= z-_S1x?l5;F2jd^FNPzPA28de&Djn^p>#6GY{s0V?=kM4ax;!L;^dRe`=4|Iv$0zO0 z(4Md`6S-$R_>y*N)Ygf9O5FgBr=XlvUN42PapQ2K0&`-LfFHbS>inh4w+pqpiSS9RXg5QY0>tPqj`M&o=nS59 zfo%$13rHyRQyjziJFBA4BP`|yI!g961wyP8r^ZPsrS#=Ce*g|(JWSS9B(gRaBnXw- z1&ns_zCz#Iu&)Noi0z`(cIWv8k?J+HZT|V)uFAQ+dVKwoJfG0*Y}RP~p*!YvS)4uO z`E;P65zYWqb}dJ~Q+4oogMv<;zr|@PEnNrY^ew>(dt>Wn{G91+uU{aLLRT(U)agIJ znjG4n@l~+h%WUyEovITco6p0lmN6VP}u*^n=Ru&qv;j(7_feW=;itGiO6IG z8NZ+@i{sguK6em)x@5~_d`RlG8DFe`my$x{i@BPN8^px({#q&agw=xag!pK38rIkt zZ_PW08m`)EC)$8NzvH8vLH7+GKD^)8C%@3-$Nm|Zs_vgfjQIQ_F*DjxOGA$>9^f50 zjlOE=QcNx;wrda4`>#kM2yz0?ccy+d4L@l-#a9%?=RQhqNtAcMNreiE*L0A8j^DsO zpF!ooZ;)FVsrB1^LLtfclH$Itl~ZGwL`bBJ;Xprwa)$atN!Qy{)qp?R~E*l#cpkx3d`CS{)XfMvb;C+ zwY+$h^=>oXD%{C*Z8k!b*nrFWVU+x#9KruYB8^TbXBW5UiR#+W-e3j;jeWPCG1XZQ zDdW&;LhGxxC{VpfrW=8%D4#M}md%f8JmsndG$R>T^(u)7GF}`lgd~OwuD}8}{F2h& zo49a|@h~h9&g=uX7Ttx`K<*FzeEPmyoK7xiw?9IHo{8Y#exEh>AS+n!FzH!;CtyDx z=KNzlu2kG_`JbNwt*8&$H(U|U2(uy ze1Rkmw<1GRfR{6@w=`}ilbwy2@n2xyp+^Pnv+_p}UW~9*;a6XW3-5LjxS_Ku*nOnRC6T79yQh(|mVFUzkhkjwl=n)eIoVM*u zxD-iKPTk1u%!CPf<+d)jbkOWR!$*b;Nv0L-lyXW+QFU2_Z9yRYtK#UXAyX4@g`+#L zSY597oh_}w`oOv5Di}y54(HoNhT>NS12w0oo%ubS4DYsi;qvJ$!fLLdKBF$1?lZgs z7?KE7n~BNQqW6*Q=}z|P8HU3iqYCr+Hm%O(`R#P4{)jxEBay;X;`LL-uRLzHkNMe; z*Te_d0Y#h=t#!{IDa^lfk%%1-@7)xb?|;4F>fHX@01~g%Y|1tUD~dP+l0cFQC+^-mBUGta zSyKDa>ktp#=+PYUN1#)}N^P|5c3MycETO}UWpxfLR2zCR_Lo_Mg~r6u6C5*ne6!># zbD2Bd#}{$JnOvd4S)4FjO^_{wkxaNqCs;73_W&{<7&>~$Ex8HY9Bw8!zk7oIKctk6 zRViK%^d|*n_I0SEjF(w_mznKs3or*(xfr7*GL;l8A8x%3(TL$lyU4{mM_QOkFquKf z-+9CDO#v4(Z!PeOp5?%qvE%e++9{D$QAkUvltK*ATVS3hH35u=-~eJ}C%$@yrT#NS z=|;x$4eEt)ki_=yMb7?J5hf^+Kw>-N{opIF;li5Ia0uk8`_5hhpDWap%dctz#+M2S z>svw{0&KZB#>E~uBr?E~45O>h9C%e{H0&7WtPJ4Y&9M&?&nXtbQpxwRFwUooXCE%d z=0{-Wq*^SD8#r4vk346>mNZ*~@b25NcR-WtyYrhI*~5A=pUqoZ87Q%(a1T6MymH46 zL0$stit)|R6w0U7R!<~5bT@9`&0K!Ov%|Fcnk0vvmF^%8;j8p;X+lH&2xZCrhZ%3O z9ffF<=Zk3rbxjX$?M#RRmN!2F^CF-w4tyL3&2e}$p0=C>;TnmB9*1X=obr&g6q^ae zx#zUIN#qDh;Qa4IkT9WX#UHt&eqjF>R9k7{ z10=f7quL23fL&P8Hss){)NvtRRSQ`FpT(IV-O)0AkP}*K2&ksB71b+;e#GqT=ttmx zp!C^depaJVgKJZrh68>lOhNnzfJ(TTWO(I5RB>vM3Aoc0NO2~NOqBz?Z%hCXN_nkI z0;RGy&Z?~;fCBokEP}+H(;pTM%7#-lrv;8q=7{57pZ~GvU39WMNGtIXm_SVh^tJqm zj1PL6QivhElIzTNzrTNsYx$T1NyT&lsi~KYt{n2>@$KR2h2Z&1au6XPC|U<@aHiB( zgHBvnQ~K1F;ui{eQ~8kUTN+bkLJ5gDA+1AaB+akmwNM65X?LJV##hQfHPN}^OyN7P z4k{8$6vcDk*_}J;!O>~gnY>FuGAyhiU0bx1hGc}k#p@pEg2OVCBH|;-_>PQj&7wmQ zWa@{uz_Pya(i#}V>9cTXj+yPz95~8pGYsMP=%zTBUIzHRCY~-JH0@Gc{QcYhFKnCM z=15FGCM-x$F3~)qe0!OE4r(|_qB>Wf z7?ko?z7RS~R?oWVNwHYMXw?6Ph{3-7{lpFA*OX?9bsI{D8UeGJy3aSn?Q)-QEo346 zbNGC|;w3D=NkU~Ts-1H+NbK@8oGcBsPe#Biw*$ZY!7FYN>S%X~g^~`21+V`iV-q{4 zaS2Q+YBwUuxE|I5r2rqkW<1J8tO!Ix8T(ymG|?N#Hp#%&dE zAtHGUQ$?y>0507s0;QO8VPd=wd}dhrc?YPnH*`;#P&4!-k8=O~i~^wc?}Rjr)3#r_ zzlm~hm>f8XCA}xK%btu5%UK;9*z4y%;$8$yfR45x#LNNfq{RDM1_uq0m-%#Z{(NIK zX?j+4@bpWZU znfZ=894qR?*IB$m`TMsh*t&*#W!)5O!ifF78XIU9fr*YhiI6GwmZEl@vDJC4dGBIZ z5+$Rkv16ovbqDfL?uS(Y{Mwb|X8Ki)g`>r&<5g`c2#Ork7!lQ*8VB86eqptCj5fr9 z$8lPqka4V>Rl&LlW=!r#Xk4E<09Ed5(6JLf8Hq)wN8aa?SWlWMpgkgTI#C9#{>Tn! z=xhly(*Uzqz@o#aynKm+)BFO~HD~akh%>}&w6kcODL$y)yZheeN}6$<)==^zg#5|0 z2eE1ARo$T5sjPZR>ol0Nqt=eTjk#FooAEovtAg}?yMy=Kv^2ut@$dJ7yZiz?i)+qq ze>Wb$@H{>KiI{u57MwM{-|Y+p%$8r^dZ#?g88z50YCZ;~xZME{zsA*HF)hU!lK&+s zSCIV&&Ur3o)|RDmJO|ydTx<>$HN7)q&)fME8K^u9gN7VL8++8FShJt96Zn z0>LTnej_FxUtYr4%|MYTg2SPH*EC%S59 ztV6B>JNzUT3QT?j;k5$Hn?Lwzo2?Czr!{0YAYsGih7dn+OlU=d)Yw1Vync^=2S&La z*cS9++voqoAd}pHl*97=u}S>1SvaFnfwOC7Z4RE-^66vr<`P2Qhm`7Uibb2 zXC7tY{1KOniI5Vk3Z!90Kkq}UN>3xD3#cyZ%kJzB|4o$edCA~<`3-fCp{<3K=_yIZ z?fKvPXJ^g6)GwDH(~~zR#N1FT$*NMLAcMW#fDxtKS{%(0{0;_?6o1D*jGO=-0DJV5 zuBC(QcU4BmFL#fxc@6?if)EoSM6lSb2;m z#KlQ7@H6Soq@q7lpA0M#p+~OSqa335 z&J=Mo1NR4nfXp50zg#95mr?C?3kG0evPc>4RFks5WlqC6}yg zPbDUr1Qo@Mx~Aw9d`<3{Wq_v}8iqn449_AnGS!|r@j|W>^b#Gw^PfEP0cj^i1(k(c z(+`*xlXM84*$7fgMX3 zvNZ!p--eRPPThTIgWh=*OVoh=|wbTgbx z?FCTwB0{rA_{NZ@PJDM~>;SlLBhR#;ki)_w99MUhx~_o6FB^;R2I5cPt*+l1S25K? z=?v&!=utADGtBa~#1t%g_;nUJ7MW7YrQ%UN_DCEwC zUC6>mH3b|6*zs|PpUz)ZY&m5{-2!ufd#=Sm@^=1@TZ;NsMV#{J50aH6;Fz4=5gXoGlK@jrJ&O7 z^B!avFloZ2VnZ+1vDI7#He;^E8&vYVsRv{1Lq|FFNF3BLEU(Db-9A$8xL*|)f;c*Z42av zc#J5Eanawmcp{nY>742!ZTZ(?w;*|_I1)mxi#R7|0rDD3FRU1b`+$f15zrQzBxu%Q zpfCFP^q=R?bUY_e{WB42&0iCEoeFX>t`6~TY3BIh{}YR|yi6zIgSc7-T*j{eEuvDl zr^=11hPf-r_Hof^L*6AQK5ksgNIFr`*;V&qgzWIg_9ek~Fl94c@{x9vi|5Bb6y)>0 zh>rifef=)w;J62(GeI*GQX#+t=A>m@*k||KmP2HOR>#-$9!YC|wsHh2L(Gykn0NGn zf<`z!1fufwfl|^7}&p(JfqONQ1@{MMh|4=#ZGQQX6eU zWaM;S3VdNoT@gjH&gofthKvLejeEPKJ(Z$VR=nt3wc}UI)8|b;eyLsW=IBd4XLo4^ z@s{glx}~efhJst(hh5XR0mR$~N8D~Fq8`)}EVLAO*tg*heEe;;^$h>aQQKl3QP)Y^Rk1y2c19+^ms^<^4FOMWFo^GS! z0j5CWL@P7%lVr(fu3CK5YFgd_)o40iL)V|xhm`Vn00=Go_MNAgIR|lodrL}=g1D)% z8gn``Q(|wQDKrv?m04=UQ-^y0%JK0j8Wq3G4weoTg31*i5@3Rn(wl;c zK2fKoGSaqbh+8VuyR}%4ES;P4`+KO6bpbwqI{LpyCrAJI5-+ZuPB(-Nwv+aBLHLzY zZ89}aL|-jxZ%n@baQ{5oI|%s{VKg%?JlUa|i>L5T)-6!g4Be~rYBcjsq^+7Y*~&pu z-QFAIQq1#*oK#+gx`hVcV4v`M-&Kfl#9ED>aEgwY)b( zaa5h*?fRtBl{w{(YIcZbx$+JZJ~B%v`ibdQYSKXvSuCkh_LAjeGo3ke`T%2Pu;)4L zpNT^<2mI=MF+>+S{o*ag?4B0@Cc(qm>jXw-VEsi>f}f!%5=tbO4wWXSd_v#JN2W4j zkJbz{umF&(*Wn0-s-ny6#Sv)c&>Wg%;FiLGKOP?cM1P0k#2Y9A7e%HsGhtH`1>0Z; zLpuTf>h9!ImrPFc&rAa)#4ipGv;VXt39aB5UnlZ8n4=g2p@xYMVyNm%*37$`L7%k^ zEL7n&40&7*Tth@Gp(C)ZI(q(F4W+w~uK;C=B?X9HNX@DyD=7}L9+Fe8Q13KAA%Tym zd%2Y+Gu`oq+yhYUx>09u6~JRohoiO;-zz$+EBiZrCE$_b)%iI}Kp@F)01mV~-b_zZ zH$z?;{MgsHy-ZEs38erCJKV~UTkODAvc49$J7CMmHP5lNtkx=e$4FdP&0?wEN$%2gy1&zvIXD)8iz(O(7+~#?Aa`{v zgruVk{N@dHdG_g-U*bcun!5&YXIoyRg}a4Ano zaL97E*sy?hT|USkpXha0tEvI}EIS7o5x;KEso-~3HEAtgw}*^GHy!goY57}=TVqE% zwdDj!g#Pr%6mL%;QdUxrZ%^FzMav)8@s6#@-%vKF1b^13NGYB9O)8%Otj@+!*-?;9 z_bRn2pzTI0;?)OQJ0$HsaOglf&(=bA1=Ac<>)o@ufir5!DRN&SRrYCerk-pHOj;_C zvoTHIdnom~mf8zo9qZg(NgifS7?kdtFGMNWUKPz(&G9WN-4V`fdPB-{qj`8u` z4~EmCO5&_Xfis(_xvM8TDo}QGj|qRuu^PVnQ@dG<(@T;0pJP$*XCMj?6wl*-s{*J_ zsw9Gfw$a?-(L0A6ItR`+Su{{@ymPQsu2S~>^+WHz+u_~+%BJA*i3I5Tobr6Y8%=`F~l9{*H zw_KTMg^-1!PTNoKxQxmheAXZJ>L-hmj=8wy^koy3u70 zGEVOfMn{^;E+`ioS3r4T^dbr@JHHxE3cF?aD6X&p= zKX4~GwYmQ7J31f{AQ45E!^I^ZBZHn~l9G6IX27Qt&da!Wh5kOw>cJfP*wEm>!I!k} z-Dz>~uv`vfH-W9%@Su}Nj@HZD1*m}A3j?lzCOcQ=GsD!uG?Mh_k^x!L84R}4Y?&&P zU|9!{;jO3iDrS;%OcLEBvJ_P_SB=|OTGc9*EA@jGGQZxPoz(BykqX=4W6`J02Lu(@ zqA;C0;s7xmOF~L2r^Ew-ZnqXhz{t1|BB(=3C&~`~b!aB27v#rA*~-JASXNk-RWmh| z@jQn|&tSDE-z1GXrBY-C_K~=1X4+vtMI?7$04_ zGqHxqSI|4m8|EqSHWT^fhfoa^1bC-CG}^lGYDNdqaco1!I`h8s@;I}LZG*nUOXV9g zCtY5~|7Lk@F{2aEsG+6HM>%N-u0>JYPsFD9j|E&3=}0+ALv(xcO{GNlZO_nw)QsDeQ)dscBs~S6}RHS)_{is5|8h7H{~&NHz1YvQj5!ixQ)nP4a!j zkIpQZr)FCiA=xCFtNr9AEoh@qfZ)ccdm%c~U5d`xj-35oW#gwm1*QiV9Zyq7l$PXEIi{2>t@?ud7UW_AOzYrRov6Nl-55p(+^ zwqhFi$*I#*nxHo<9bvkwSH$FgO3)y$`d@qr_|AbFn!$a*5lfjOnh6nj zQiWYlh0KM{NG@iPwp$y#)AdIUMXN)2#;s}yJaES7ZR2xYnP19?aAwh-fQE>0#*MsX zUr8^!!W%Poo1$DM(^oTiEu5-hw-xvQuv2A292|NJ)wG&WJ%1n;-lslD{e$I%Gmwh1 z_&~2Wvvtwh(Uj(JT*6^2En_}56Y>Aiw80Q(GWpRBR}{>>+^H zKSL7DED^5L$Hi?{<`85*42|z5}6J0xX^>A2OK$B zbq)abc2L9aWE3TB`}6xGP}gD)0kZHmito#8`{{}#iXYgusX@dv+;F;M;o%Zrc0xg? zaHT);*ERCV@J{&-WXxZ~PfK76dH?$Au-E$=9`pnAAiyU5d;c8O>NB+kIM)zu_zg4T z2`aAN5f*D8%B@oTuJHI~ug zEy-8`OlvnQ>Q;PQ&`YdwlrOC(Y|*SG6=IOE9L(lqe{F+NRMl2*|IM?deZDri^-fT` z#m}eDGn5G0NhukwREO{g{f+o=ks`+0hn&~Yh2jCQFo__>UzamE)~XRzxe3VYc=E0& z3S2VRR=DGBjdK0Dpb(`jFgnu8$-aBlg3IYsYVWYmK^_PrA{@%^eTg*A%`_mvR4@e6 zT&LMPbE`$K+x6C`&1w9a=u^nU>{la5+S{#@>t9l;?Uq0T*lPNhP+$;9NMAvH>tK@k zeQjs$jDjD%CW4t9(T&}v7!SRAU!keWs--Q9Pj zUaNto42ErE5Wzk+I>cSDmHFO5{}tm_l}`Pnhe`* zNxtca3v^2NilXQ3mDT!&T?Xe39aBx)HXB-|6+@I;UeYO1VK6#ohS=@~W=Qmaa#2I6 zPq-TZ>~eSZ?Z4Z?ftvq(egqv&c%E`f3sqc4RPFpaJwz#PqhZz<%+wu=JP8%^R?xds zwCtmDS@SbBku?tvOB&rHC_i|~tgWR76f?>uU_k9c(ewflIPjQqEyS*u3mJi+xhpDL z=o_KKFMFwb%XbNtG!Nkn6{C(}q)YmS@u}!y9#{v8Rf$*hScwpKZl}q#gOg&>XC;=? zQb}5x|Aaj?Yfn#ponAd&>`#9Ea&p9H1*~D%`jcNl?v;d-MiQ6br}P)j4(t4cD?9g` zc;oAn2zurrS1iF4z3iYkb9bkP5pzXZ>hQ9ZmZAxi-_S`$?@CnN>EGLthNj-q``#hg zpkHQcj_CI&@E5G^{m@lM_8uJtI`et)~actDFG zBxODHm;nI&0Q-rkbM|}4WnX@9NzjRQ#*#FhKlb}*>WYehmNweMT_;9+L#e#Jluy8@ zih;_oa31W(Yx*-;4g3^t;mg}`w~yXw9ZjMw7?C5#f*`!K6N0@!>&13B2~sU;?I|+R zH&M-WC;oH`#q<{puw-? zZ52)Cb4o^pQz1Bp+T6mlk@N{ft;El0(gwByGU=oAmkgAr=SM5-xA>w@qMRI!rjpeF ze>xq`I6(OQ^PP2aj)N4ViEX)Fh=Qd5-VT6DWKyUg!Re3tcuzQyW@}VT7=`TchB4eG ze#7MkLgQ-TE%r{5(+w}Sgu-6}@=q9gw+Ta_x0t=pZ>~ByjDm*qD9$88K*?PHYQdgF zk*shY>TX?&G##00MR2|XtUmwi)D%?**$gLb=x|MZIM_$(03kJJ`}73~^st|1g()RA znpu#t*wGMtx&7V5;^+6p;%F`vt83Kb@QOLjJk5v*V&>D;-0bHsi!!`KL!?)PrK4YK zH}qem%ZA%8!zF+E#0t5dHI;_f!nA2%4ib2{q)ETs8RbMi34Z) zP>Cty(ZntFGCNZD(Rf#c=4T1DAX3?IA{277wR&3iX0tE97^2^NO{;t`)gR8K9==^b zbH|tH>$XP7V3U}zYM;|6c093|ZdKR1x_O`y9EET^g2}o~?NhP8gmW7RRN?mU2Jv?QJ5|r; z&^zHgVva<1F=l!Z?6gbRExA`OqlvI10V^5dO|uxW(WGVt>P@LY&YBCwIM`YMixpHT zoC5;}?f0x!;qU=f-f=Xknr{HZ8nd~~7Vjz}@xefamEWUD=;z%G|MtD*2~;>tB0LOF z-L7%aEHifc*tnFkb+dHbGNVakZ{SiHHr))wK6*D&ec?Pfi4Z2xaUJM{XF>4J>zQx7 z`_ui61qZ{&2|fukQi#?J1?ku-2`3gHx4_o~R9EiQjJm>f$0nQz%}NQS*nINOh!{y? z10vKrU6XtAm=Xu0iR;yZUgJdqX3K;x!+F4YDO`rg%7>wzB;d|o(+b0I(yFKyvzGdS z=u(X6nRBnV!YU!_wU`LH^?ZBt9r40PSdnQ~a_7^pzy3pEl5gK1@5Rlz6zXjo*cuCh z&{HVH7QxX7LRXz`^X6W-WI-qCfh5fs=!`);%R~ho>@-L?kt|&e6XJ9d_#LV)uytSR z?}C7ki_Wy zvdS5J?hSc2b=%hAba%_H6ul=MzY`6R)t~bGHT=;ft>0-|t#CyS-($fUM-27$5bO{A zujp@1xf>k>24F!~d8_!~VBEd@eSZ=DWK}~YNO^UCd>`;cb+e=gEJMJGZG++A3@5IZ z&`GW=PZLHQP91@}Q5`uLR5*z`K!PJ!a|HiXCMkCWuZEw1oC_T!Mf)rWxLn+D;x9zYS7 z9L5ziQh~AMS{nFbG#%F)(eqN66`Wb5fVyk|pF^hKQY!QA@f-af80WUaiTv>}U(dv)z`ZNq@?yZ8NXZ9B-1~GMxLP=Z5G|}FF>$KhjqIR)K8RrN(3O>k zD_+B4$njB_ERgX&^Qnli!S;q1a>%e1O4ZAZQw-D zY?QdKT?<$~@Mz`=Qsy4rjnW(X78x(Koz{!JDgz84b$&ORO<58iq9^D5$#Y9TZm47+ z`JB&JU;pzLf|n+&Y(HI=R6<6nx&2l6V*sPD^Cy%cDVnca`RDDGLVEZ#Hd$xSS`-}z ziU?*%xNgk0nDQahW{bQtDpy80o;VS`+hAuQf?rJeCdDj01{hI_Kf2RkzyC*Y;F(Ec zf+X-VbcOmu;M1fpLkSnl2t?pgWRnO$KB?zPbeZBfvWqZtV9a5omc7>ExRW6?vK5NAX5H4&g+= z=1XiRt#XKf+lPzlPDhiLD|p4Nx5dwY^!2=i>VQTn-V5^D)ve402zBO+HkKRPYN{r)z3E?lttGJjlEjSCDdBG_ z70WJ*=*AVL`I{wo6P*{Pnq>9yu+i)l>Usql%_^(=EcMl+JQXubOt`aRosZE>IA}on zQ2L|bro}{&{^odS#c;lxM{jO9Kl9hoa(2{P%x92vIDDL) zXGIw-K<`Z%lkAwGQr6*QNNYBbiR92OV}#jg(j0_=`m+gIqjEqW+D%YU<4K6R4Y=ud zeJ*bij3&~(gE%*|=3#hi%5Rd;w>xQx`Yy&5PDN5p;XwmxYZZ_9_oPs{wM4Th)p2sm ziwoPem$%XE1uU9`F5kD(O+Vl$+yurX={T}-6bcGD^0T*pHBqZ2>K`3N3ruvE<|xgv z8s2UXXmrYK2&MrlRmA+~MFxdEJ1R>SBZY_Fv3|KuplJI5X_eOxBVR^ujw5?;~&^m4qqSdgkws63o;68aF8S-rr_6lc{LIrQRF-PO{x;B z3glgGle+I?4SGkDfFte%EIjCH^$UFsGeID9XR~IiiZ=p1T}hDaEE)v>@v`JTfU7C}QO|JLplkPSJ(ad{y!4gVD{N+%24__B+;?x(B{= zvCVrJBe*AAFFg2@Ur&zzFaNvz9!}nX*PO!%a^P2kG+Fc&=_0+J!89@P9f-P%_>02w zZk-lyc3oxzX+?L$ITg%6y$>9KC^rzUwt-O^sytx;a(fi4cJwLLGf*{pf`0HN)%=!y zV0q5$aPB))39c!7=<_ghF&Z9n}U(^9jaa7uZlM3!(y>ui4Q>aGwV`J zekTsb9K*Rl5LeaKddeo^;J`_TewBMgdUigUK0V#hJX;ZX-q0Lg3io8`n0d&>4%G(` z-`RXwE^vItu5X8EW|{#3%%BV`2z9)oMdXf>iQZ%;k*P3=Ym{pu$V4(YlhWi6|1x~f zss?q2-WtW>-1q2iCHC@ZLx|%waPn}`DoO=u&zO9_peeBWK4} zsRL^~N#4((HAT4CMqPg4ZhK#ou-+^2oQ-CJ>V#P?5P3lZi#>`D1J-s|TRu#rcM6{q zl7%3&Ae27XG|7};-U|~05rmc{zRvap3CU}4D;)cNs-lH1F%*RG)DWbZ0jI-d_uv7q zU}3`{2-`z^eIg=UYgx|dQVh4&;mg^5)6k#TLaIV_5Ik8G*G%X5V)Ky?ov3D zMr(_PP~KP?jWT}NLJ#{p4rAaDL+IELAZ_Sca3HL5`*6*P^73Z*MUD@Kt(_wwsk*#f z7t4{n9`Hcnw2Bs^FpiMn=^XHbuSl=qaOSE4pH7#k|NYGEs+fX_5{cj;)tkHBkWduW zYPX|}ndd9iYh9CK);DnJwnrn4;~$6VUMAuwR-kGojW`VO%mX8=1608Ou3#leoZ&5* zxmqlybLb-u8q?k@8c$j;7fZ??@Dxbs#&qPCrM~0KBtzI@Xg#0Nb7&t|$VyDEHcB-m(K(`_} zJHkM(y15-r>HEOd=x4V}N}q$%7hVxcI$n);OKFYQK=4tJyqK$d*lzMK-|vVY@tz{` z))w--|KX7pL6DRZ(hXffAp4wvOTE2+BLg0!?Yt1WA}1lz!(pW=>7#vhBZ``}%fSy3rQ z!;|UcRE_8C%3TvsdXybym)27#n|2vQH8aI54OQc6@-LT|l=MhubgXHw!(n17>Wh+N}fa-Wa?GcfDnF^9EcF~b`C zXnyVHfB8%tC;WYqvNR^d(s8k{{v&+{2&V5PlggI~U=@ZlAt3#7!BI~31r;8&gb9^^-sOSC20{Zv;{RYgDayq&EJzM!$f2dpP%F(mz3Pa1&Kpo z=pC4YGOW+^nQ@_z#h$nvP_A(D7UqCCkeiXE+u67Y!g-hp9QMV`R>nu?A$Zvmqjj^RkI&MZ z03*l!OR#Isi#gI?e)$~!c3sg)V5ChUomgr@;__AipF#xKs=HckC9c&$N=UVYT1_V6)t=NDltX_f+sj(K)UyVrAh} zI+DOj%dHu$*N|fRz__W{uDR9H`Ku;1Q&H*`AY$80Qk`0mCm=lM2i` zxw)VX8uE^~7_BcvP}2MGx=i7`Ep01sM&u%DWki6iQ$}(Vblt`icL3Fv1W9`xbMOZT zmx)4-qN(ZSJ*q;GZwD>86Vu-ILE;L6HY|083WpLGJj#TasA_Dq1rqFb)GrljE^A37U^JCZfg600Km!Xf>01xEQWPs%;R_9s zA6^p%?{-`6#C?|7k%QdCq6~ix@B$p(3i|Z=KKM14E6e_xYPpEyfxgOPBR%w?3$hKr zxt>5N2HBc%4E*du*APb0bFt)8obr2rD}JjY3(lDd>O0Ch36yg9lvfCV$Mn~t3UaYf z4%uu@@63+~!{laj!1=!)d@gd~;c96K0g4@Rz|;FjzPQbQG_p)^dSuWOCj zNa0gRw{2neq0;j&{jx)!d7{F%lR%3S2c(trVh)w>JEEiySOhi(tuwaRo-3fQfgcl> zsB(}^23`dwB>3!k1N0stbl}TM$dW&_K$c-hhL;wNG|HRG@P8RcKpddzv>b2Ebq^%H zSO#hHw!$Neym#e(w6#@$fMg#)8=|c2dHLfGgXL3!2;a zH1EM7)UMt*Sh})C1qq6f8QJed1^?UEG^iF{A#v zjo#9WqBsh}udY{hi(!PF{O-(8|7k3R;cu!~f4ih^@BNv+I4+zC0}RF(I`I9O$#2e7 zmR@YP+_}~3$v?F9$Z~HTW##Aat8=2l^L4Ybz!5-)7hHAo=XzN$WoV(~hXGhaBD1LI zM*zfp;-Pfd3PJdgZ_yn-1^hv6gh75y-!6()J;UF*X%@ixRZ44EFNrr*i&miMLs|b5 zMlvZ;3QsDCOo?NUOB3rgXeLN`uhJ0sgSAtK5ukj1QsfM@;*^J)wX1XM$(q@1HL zLG{r)5+>bDizPf;KJn6KH+N^98bA4uatlvPx#ORQC56hxl-Szsl0c@46AFuSgp39Zp+1UOa5bUu z>bonB8*v_xmw`@s0c-i>>-1k|V2+9%O-BgLcU=$|K{-7=Xz-o?KYL%g-bRkAJr~m# zkl3C%XMRPpCEIemXly6lJ%8$v?XsgUvg9MlS?21$7vNF=mr`kQ)X-}|GB)B(MJhY(n{k%$mW zFYX{9NR7|;-UgH)6(>>%!dF5>z=a=E(nVgeQv{RZ$q|ew$2kNzx@Q+1JOPcV>~4pI zy+M+DcpC5!uW>9O?M?&%O^J7Bkyd37R*1=;64H7|XRUb8*1dnb(=p?$Sc^ooc-aG2 z!YGC99p85k$UVfZK)lv+)WWpoOSstT2OzjUu-#<<8K!BvvIX&!gg5TcEq)H2s-~na=X_d6!pr?((P9vGs z{=qp;uwdxn&N#i{6W}<<)28hc#HWEJm|LCxC2kXguu!qkQvxUSBIzew0!chrj#FL) z^Wg#ma_tYthxQ;y_oxq##z_yZI0y@}U`2V7P9gFKCrCy~_n*H%eR}uLJM2sp!FZLn zeS`=lL@7SqPv8C1MMcRE0S58xXNO=Ny@86oIqaAS4Nghmnc3&LoSGsyU&U!b7iVe^ z1mqFEFX=%D{T+msUL020J8uxO9zx)pADcx?cas+?5?y=-xBcID`OY^u_c-_#roN=- zVDTk7y4au4VSNv&%Y%2n0fU$E@CMLvi{H92>0<(7u=jl5$IZ~z49&}8aC?g*7u}=o z0sLJ@vJHKXz!7pqd#2z+xU>S^ zA?WwR{?)-{uYXQhC z!NbVEX%NtIh*kd-{%U|6P96>>cyL*3U7XkB=oRm<;nFQGQk?!-AW@#4tpLF^dQVt> z=M^Rif-Myx`)O}T#w@+79%_@-EWB}0KzWegavPQ z;cl=W>OVseXpa6N(aTYIu#FD`0}5FgvCDyzhoY|?XYKD6g(1JDltu`5tZ@O# zxw`0`0NpbfvYkWR8JG4&L@=WC_mA;_l~H-^@dILq0yL)-i-Ifbe1X?!&=3Ts&6wP2r}lK9@8V;WWRU1u>lYF(D8c&NF%?Uk&AfA1_HNoz3sKE5@EZa_=F3vEo= z)~=d+@v4c10ojS*q&hP(6>$5)gy+)Wh!JrV4Ea0IRQiIgwAn0kZw6lzVgmX_X#i; z=im){vc2tfhEQ?{2C01B;{|o2ZW8-Oz?^jP)b7zK=H1hG zm)S5N2bs>>-42!z_abCu+rc+T*{l#Q-STOIum^#{XXS5A1~WPsUMO~y#aV6i^Cz+ICT>-qGY##tFM{n0L$a$FX(Cq4n!+&RI8 zgMGNI@U83e8}n}$+kD}zz}tzqU~q^B&m%P7u9pji}ql@1OPN8+cCJ z9b9TX;tA`M0R?z2_HoG$6Qk-^q#5zf(*7~R(ObW>@$(Ur5utDz54>e~Ad_EZvHW=( z4Jy(~9QE)faLeS_vU)$jgJjc~_C$~0<%E2GPvJN3`5uz{Rzx%2GeUB1-083I;1v-4 zEm)Ap@Hq=}Z6~4`$?Y*K5K+pjof)!Fah&cWyAiy2w5@>sb8&x9r~SdV;K9H(*w$h1 z=)+|<;SX+_ZW3-qf4 zTNRdL`@`uq(*3lxAqt;a@8ImB2lZ3AbPK&n1`M`}?Ne-H=y>mTI4ZtQDfyV1%P_C| zc>V@1p4)OXZ8OMqu~@{l7Z zu%H2R+`;3ekTSpR&!tb|=2`T_w6@WarfApxEf_?|j= zy~)}_Y+i&gr$=~D5<@nm-ls+S0z-k@0v#*%Hl#fGR{!)ICV6X^moi+R!+8v{YS?aF zbAkem1_|YGGaT_pos!aPB^4PC9udIUAqBLL3x{{9t|JJb(>s9#dCy$TLRfgGh<-aV zF(e3K#POPcyf$DH!V2I`;g<_P@;)}&v>^DO4vozVu0{>V$>a&>7+E*j2j>nXLTdm( zNU(@&GxUs!jTenAZ$O^g-f@T{v7fSY6wA;=+n$%HjhMq959HT=_6E4lW#C z2hKqNb#Rpog5c!I+}Bo|A|T|0!)p%`Q{agN5SCb603`{>4u#j@aPk5Oapj1MMC=_l z493EoAWBFI41jQ>?mav(z(h}6r_?`Q*TiuF5~m|-yL-)N9kII+KzJY6qzrl<&4+N@ zbMkn-k^lE;}MvSk;nJwVju3ye)rP)s&nN5H_$z#f#w z&Pe(0r*PT;2+twBhu^~6KC%CifDU@+Cx|3_`h+|=^a>-V71U$b?H`=I@9}a$NxD*N z0p1KHb=f;QzkUB+Fc}DFe7zKZP2Rn80Tj3xA_Aj5?Y8JqMO^-oBGR4s8 z6$%s~)~A04D+tm=4b*r}#+~BwRS@;>;U|1Xq;GGwJljTc5B= zPTDYB-A1GsAzml=9AZu0`$-~{u9K|z{6}JuqfLHET^vlDm)K^X^ul{ zCv`gsX5uxL!wZBCw7%co+)k65c9=Mj@e^Dq_B^;rOevfyv#;M6w}>`*pnD8@SWen_ z9^w=Ui!tdA5E?X@4Jl7`00i$axx4T+T(&popMiCXmqnq)aC4V{D#aRM>KvZH4xq{D zfp#JwWH5y)K!6eQSzW^MaCzP9UWGIr;r)+OoUutv+BFH9U@v0=ljY<;ha@IJ?=G;H z!gYB7feBY+tcAyZxXpzn0nsUlkD$PsvNL&xjS)>d+_Z*Y8m6Q1ET&f=JZy#M6%hL* zh}zMvPJ9ok_~8Yic~?;$0i7R0qL3h>+E|3!dtkyt&uzHtTJ4YB%l1*q-oJpoe~z57 z@Pn9Oi8SE|?dbDEK{OL6V`dx|15AfFzQYYjo-T+X%>bQ33}75q{;gR3p7zdg85d{! zqzvd~4tBH#gLjHFASXCGQycG4pic3U$oqY`YH8<<@W#Y$7=$BU5NCP(IeG@kcrSy` zogLsBKSHDVG`qY@g*RNZ00c)EHW`+Ui6eRdA%!UHkc$?noC5v=+=Ig_2wF68&WU?@ z2zH{NXl&#XM=E$G6&n$l1|MUCqmDbVnC5^jtjq7IAD)$J!l69peU$Ll{>&km}4 z%qe>eXHEyWvCPwo7j)zq4_-yaRYaU2(sN^={R58DQ?7Ub;b7qK7#f(mKO#Ie(Y zj-&acKak#1#Z7vgaN=|J>C5;%B|w4QxSW9CzYeU2>pxGsvH3?(7s!EygL*QMuFU~u zsPF)FhJ5Q#RVFA2VZO*k|BR&7QmBwf8+$zXwGcaFeEkEY>kYlNfI8@(;z8Gw)-69; zThOZjbj>or)j=Y=Bdnofj~|K^aKV9qWML=Z7vj3o>m#6WjE09$fXaDp?&2;UARo+0 zhqq47cQZ_U5OW!+%??{vSSU{miWQ3t0DSPAviI>4X^fKRcurui*FMI56`b&q)F9zH z9?%}fbm4{6HeN_0|EF1NFP?T2P+f!r(0+g|oV3TCPQ`IVf|xyCxos~42NeNPmXR|O zX7fSwFikK%*zWAZRZ2Hz5W9rr%&B7%AcGeIA0_eXl$49dpbU}WcoyM0FbBy#OMBIE zDVg4`qF{cJ94cJl0CjNG#v&iSqZoX#i;zJI>I5!3Lb1&RT!^6{-@9kU#naoE_qZ*3 zfDH@ZQ$3^rHvbA;6i5Y>XGj9r#@sdjbqWKF`~iSM5GNcIXB5gqIk%D~B)!**1Dyjn z^u0Bjl14-pATS$QoSr75?+=r4Dnb&t@UYGPAr2O8KooXDoN`}J%fq8Cp47y}aC0zF zxC`55ISYw<}JOe~rc8D(S#-1ui_b(>*~n0XtcYKL(3rfD3tuyLdf-=B~HM zb^<>xUT#3Pclgzn-L?}=xFgJ^9_>!B4w0=vE-AX2qj`$w>E8GHr(IZ+c%=ppK_sF_ z@kJa@;T;_gZXpk9n)5W@W~T8gU9KN>}15SBMOx<>XmPYm*5rx z8bb0BNe5Gqk8w=2*KR_+9>ICuM!2FM$jQzBgHu1m1zm?pM1~N)Wqcp8s>TX=-s`~j z^sD4e^a?dH7Qilng#&*X;*aNLQaxb=JGin%dK1rcAq`Ll3QN%e#~N7Gx|ir7PJ8hp zG46;Yls#bhN6n-7&s1b>}&SVSZ^uP zT3f|X<837QXWuI}b(a2UsC&oQwNvl`&mgv(qo-wo3I{H@8YK1f+gMNc5Q|F(#8vEB zVj-n;L4BmKAa1d3`5b$T_-St#6gYO7+4p2wXu=+zU>60)ISg@^k(y7*1KB#k_V=WV zD-*mFnFJ!nL$2orVo&x@;MBHzB&b7#8(^5IoCQye&E^W71BKFh%g%Y6~HL*yX@}e|*A!L%I-P3qz*W#fy(qn0;o@ zLm)UAy6}$RgWhwQ_#m7fSZZmwE%#>$?w{gmX*`ay&ns;v^u3P@>Ii&kBassym=t81 zP}bOhF05#X?BKIxzw+%y3Jk~SH31LIV0zOT`PpFh zIi4Q4P=vSh*tHJbWOls?sP~w^0(iJN>W&=Qz&8>sp|4_bNscO$iV-h*jQd4H`2rpslqo<2t$<0)%kKWpP& zp5rCo1G>i|mXF=Y?!f#<;1Qn=RAUs`9k>aB!}GTBaUlMxn+T=HTOYVu1AB-R9gZ96 zQkQ-EK+iQCM&s5Y+`c5PyfT1&!RaoL;lTPmUK#+Do#4BP367`U&(8LH>=_+URLGnj zNxKfl@d6njP7ZK(!-1ph9T!$pxNjzya>GoFqfFfC^VK z`moFG{1{Ch5M)0IC-=q0@xjr1L@BdPp1vuBdt!K23Fk#-M$#@aapQ=f@HQzf;(>Z> z%{k^gipK)fAr8*y5`t&yUV^De9Esl<1J?;GG4*Sbf6=of$-@3=nzj%dMnJV zs{#M}xHEzcW#v9e#JK=h?--AC(FAdO@5svyAly^L9f=e9UQ~SZiQtf1sskkq_Xs_v zQy^ay-ahe!A%Ny)FvF+}?~Rqy>U?6y(%%EhCzz+enX0E#W^z=p zRO-Iq%p6Gq5*0?8uLsiyWSb;u*6ku;*VWi$q5pBSD-NeiRq)6pDvERP8sQGbHBz!d zXWX^Gwc?r#G^-Zy+srC6x;ge`hPJ=|k+%ru)9-#m4C9PGu?9*g2lX+`xF-ZGwtj=Q zUJtV(){Hbh_S>7b)kdZWs!`~i3?Lx%Dt($SXq=E^d7f2M}%!w}#m9=e|%^XY!R7e43NOFTboM!5BT+ zh6u@lcM;L>xSEwhj9gRnlvVc2mv7#+Kb%j-^a!cfHm(1qC7P>PCyFjtRT%7|H<{hE ztTt6OW+FCPF%#{YEtjc=i`L3i8>7r~8ptp;({9yOGJ(!7DN7S#H0bi{qaq?&9CfW+ z8CA^&mcS2|7S!AhW?0SHiuM!pW32B)D|+Jy_l=QKDr^=jI?*hx$dS%7pT=wQqOdVf{pAqd*B6{@7ZC+y;uxRkvHa*|xx0hgwuGq2%m`qsGlNUAFZi zb(d|}MCa8tURCksa5mI_HO*JrBEOt z5K1fJur}7l5k#nxLx5N>hY$(n>_Lov%@B!7M8>+!8i4989*dORGFCBXgmNdj7NB%# zJ?+~pqn@iq&3aV9H&@20&3Zc6qgqP!%2sP=T%gG)TB?clD@r$}Rt>I%Hr+`m(VevJ z+=*1?PEIIId8D;=LcO>nyevlKcdkM$xD%tv>b#w#s@utFxSepLXK6_4vz?q8Lq%SD z?WFXpgAQBE`MWEIkGQZb-(X~p2%ETb5zM$HsM1>amTs5a{<29Ihf#UNX) zp%{QBqZp_rRtzZJm|`%v5{h9rp%`}4ieWcW47(Y{V9TQ!y&Ecq-AFO)Mv7rKMw3+x zyGg~cn^O$CX~nRcR1CX0#ej;uV%SY7hTWWE*v%-0-JD|B%_@eyrBuK__Bm(ArEk?t z3B=77se!mf6Gf10wW=zJkTp~Wsdg)=1A!<~2(nJ91W~>LrJ%7Xwcx9iV(_Ix2l%o` z3j{S{0{>%Q0l#fov5PE;f9%^<9;DJ89=*^WRas?N__9DN`0`jUR8_%V$XCQ#Kvbpl zfUnk?z!%55psEUYGQK9(2fiwy5xB06+#+8PScU|+6x}Wc1>u&(d2voh!tJ}eKBbvx zRotd??KT|~nR~=Ltuq{Epnz`-ga>>>fRvKQToPwL;lK9Hq4_?-#y;ad zH|}3^`Oe3;JFR_yBW-P>7|(4{`VMncC`9tAU7XVy{K4RflA*?3#rNK|?fKeHi$RCe zTbzqj{k>`f0$-2%Ecm~L07{Erf=@jS++33r$ZUoM?KdL!l$KJQ+k8wb6*s|C2(p>@V59c@xX7<7;7E=R*E(=Oh4oR*g9S*Sw<4gS#*OK9~Gs`@isg_y~` zZ+l&H5pISHe^_q6?J{ejTalE6bSi-OzQY+sN_Y;iwj=%f`yN*?2qf6HIKbsD%##p2 zQfnHV^?}8l1x3gfLQl&nRtm)TQN)cS7^*%{GBh7Rf0Zx>H|IEcf@{)q1n^>&AlIpK z3x`K$2S|qC^#S9#LTYbXWHbzSCXytK3#PYKe6~TCa=Bo3-7;yRiaDSq%-R2#fz;tl zn3d8eRTSB=Wdl>KSq8$n)DwS1Nt_jn0AdQEi!GvKuG_icZYfl7YK=j1H`!*N^*VuP!c~C!G(0?h6=QnIGVqWbj4vqVJ+B|B#x(eG)y(1N*nuc&cBoStLom{ZXsoi;Xrl5rus$(p9OVM z&ND3xnp@lx#z-yg(9_x(d>?RJib!+XHdbH3(;CA&yV!E~E6KaUQy>;24@9imS=zbI zQ*9=TH(vwYXKJfYh{+ z-nHL+D|h$q{(1X9ur>c|vlZ9#&j!Z(8(hILFf;Q^m>vsbJ>r_Xw05#Pus3Q~#apmU zQ*6KzTQE|(r1!}xh7Fe1+gNVxX3DtGS6V;UG3fu^($>7B+C9OLl;l zU8O#03}_?H`$iflCelwR{zb)d$GZ`}VotpK?F;ARY}s|6w3xDAMY#$ zs2n?B;1guEeKB?(BfFO`?}QgAa1!xa)x2RP-)?sBC;Q_E-rgMZwa6(iId5+MzWcWP zUo6mAa^O9oC(fXlpKp;6tb`a~yoeqBDc)M+r=`0{wvD}mm>lbGidZ0wUPY`U-IB=d zs#<$&Nr0SLIsH;zJeA|4Q`{^=wt;ws#PqP+f0!Z0!DsDsKVr@g;{l8bR2fJD06P-o zJr>qyemNCJuW@J++FbMGih2ogh)oJ(gGlC|8TXlxu`jjB$my~Stl>4%`{q1Pz!x~4_{(thq#RG#ujk=C1s0*7y)?m-QUhvJ zuoa?&i^KQN6rk5Gu>tQ716N`iB``2b1hOc`N2^J^K#y@m;b;I_`;9)g#Sk9 z^}#6dz9o?Bw6}(U#nNTPh+%W?nwlow0aGnOBok%_C(k_PcXExq)OrBzIRWCFCdjw& zNX=TAvm@NHg$c+@PVCje*WCzYv}lgF47jI^>;H%iTJ^aboDCo6`}UM9jlbH2-Vz6)_Kn714O(ZlRhT{nAoOSU^-yNpt;+sn@}YE>TKHf zfOWMpo1Br2PH?5yfHmyTao+2A<@|w9iG5^J`0+J+mh9VHPmcI?kYH4sHa?{biOaP8 z{Sz)EC#+3Q_Hpv`U?e2m&S6%p@6KU?S=n}C0MZ5gRD=<*2p^O5vDL$V7P_4X&8``{v~DP2Tcpb1N0$8$;2`-5zsOesq}%) zxF`;70P}}VgWm4m{k{C>+cNOQx~clF3?8ZPetYvq{%oprwnJi4#In6?Dr(#5%TmI) z9TFRgE0)1EHt;^QLn_1dP{Nr41XZk_n-4!K=StH_v|cZNF2*IN_NE7{sYduUFhLff zUlL7;l~uAgHT~=os?smjY0p`ea0z|~+D4er@Wi2>GkzAq84{G$lwKnX35jU4o4J&h- zzw%cQE%rO&=FE(qoy7sc8ar~#SDXl&#Uh7sxu{ly(Huq`d@650UeD zoB%C?Yqan7cRhJekKpWZcd%ffUnAWsa(R2Z(I$GbmeJcIy%De1Qvpui*TeGS+vw&K zWxbBPes*}7;P3A%?r zfHqf}icWcphm)13C#SJqF20e6gY+^xIhG=6^V{r|iP_Gsc4cyZ>CsA$F2}@L3tjKC zoDKJ5ws4K7P;C#kx5rp{7}k?zH%RMYdGURR9Nj4{e8*Wh0RcgC`IeyDaYK93_?80h zly^BxW8ARD9;a0lD@vwejSt;4H1{RrFD@|RP2)Vl(P;z5w&7`oK^-B;bWqs*>Jy?| zo=6zvqSB(B6ypKXnSC`2w@iAAE8AGw@#hUM^K1}wCdJnwQr6T#lTE{GWMNO&L73s&Sjj9W208Zr1zz(H|@QHHc@W1P$5VUlba);>c`y z(OP?OwoHHB_ynYx0h-b?j7s*z7X5{H3Zx8RY`=nY$nF9*ywL7s2?lJQ0=r$V@A?+^ zLXDZT9U2?4Z#_#?xj$aUxOMB$rY{EY4gl*!csSK~P=9f*+STSo?KK-YHLCqJlD#66 zgGJTN(%4TB05&@74co+rz4h~{md^q5A4qv4R2N>KVCmKtVkT* zKhnbv8+a9_y>A`r9ZvsU9OA8sjbY}DBFL6PY4h-&a}`{fNwq|Bgp4D|x#!Ri=bK|wt?kl|hUevAWW`S-|?h342yD)0<>E9?3<9(=)rVvuWp9A~CXHrXWi z1sUHtKYnq9*L`l6ZcW}(%ir;Eyk7gKX}Kl}cmrh*R`Qu4@r+3lRU9SIE$ug}&>at^ zcl6{NC@gxD*$v*9;St#ReUE;#yg;7GcX&LQ@#N#V)~XRh>np5_}rZPMGk z`o~N&vf6_nU;@cd_$|3Ty#IeGk~Z%EFwA$SwM!7QoelTO;b8XF`?HQXzkj@JsR4)u@$#~h!@h_%|5?HUEPep z^(6Wy)Xp_*6N(^qFl|#GuS)ZlHE=Vs*OSn{h|UdJv0Qin`+A2H+Do=*=K!sIKWe#% zOsgN4+XC|0Aog)@`t9R4Z}@#2#w+(yjrNj(miAO&BewkBm)Jyp8@H$6)hF`V5ELR( z{kGpaYAher^XT=U8}Q65{D5-C#L#x%$+Ua#6))2S>(@W>ow!|o)1VSa4d#~Qo@W%E zn%L&L4hNqP%zzXZ=U7I!drZA3Uno1A@GM_F-(JoXS(Rg(r-*`6pmhD^%AS3{k*{+! z6R_*9r^&QgZ=(Knc3rCt`OnTB5~G#-sPuBfyUeti!3Q%* zll0pQ?&SrX^Wr6GATn&y?_*cJ;ehR;dBU;iJ>7rv=oY=R=zQPBx!ZHU z!k86z8>KfJn^WU$c-|LeZulV)>`uun;KSzkw=5>haA5N!H0t|yHl#~(XFEhT;vW>4 z^i}2}W|W@m(4K@@@DuKbo6Gz!*2xX9S=wSfRl673=4sM`fqsp2=Vx>+wZXo~?ONi) zy#Ub6aW(Z9w~3?2*I{%((GMiO5wF)%0j@XeVWF^JX^5|lExb+BeEin?^y_Dbm5KLd zK2g&PUuMKu>?2Zp%g02l>+89&d2`U&T#fs`c@i3o|8`70&zsEYNF#~a4(Sbex}IA3 zIc?N+{8o*m;TO{*>o(GOwN}@bZQF&Z6Y^5<8oQNK6ScH%&w3OJ852pp6BQ7(;xGhQ zob9yOK4;26Q{}l`+(y~-4Mt);-QoJO9+n?r7Qc)V79zbK3tm4Xoh;o`D%cnXN_1Hn{lFApPYQyl)(_T%CJOTIzE;qEAgmA za~^D-08*TddcWR$`l(hb8!XXKa(^*SdKA`L7&>7R#mp>3duOpbrRnLsguRqRX)RYaIr@%jSx|ji5*?OAQrm>`KhsGtC zxSneL2@Q$HL;H(!(vqlGTVfG>ExYt46Ztigy=ZRN(j4sCoqZLLNdUOPARGuv=6dNX zrF;p7ucs2+Xsn0j#jV|X1t|t`y?(rYZUlnyh#X>D^xM1w)0J^L!2f8! zR-8-kn})d2HICakJr;$8?@rPe2b!y9b_|qNu1}B826dcxA>*Ji4>te(=Dpvd)zOeY z+o7;I2iH@}KcT_Xa9n@!O?sCg5ibmx+_px}koJL@$`t zwIpxZ9$lH$+oQWVx7X7JPUhFc^5O<^!x3Ds7q6cefm94lT7WIw#;h9;b@r!>O~>HP z+o-ji*u0I%o2$k=*!=gK%fWUmz-9Qe9SWOsa6O&!%SJ6$O5pu-@oj;$)!I(lkaQ~a zmyL=P%W!*W!+IS)Z_n0Ss4Z*dV|#Qr=k|I!)XDsMSbo{4RbKL!jVdw$-wIdxWpV`SsMrU&OL*I*EREW_SsCnos4` z89bt%yEg-tRIwM;1^^GZ!SJ^B;`-QN`|j6Z>p{+>{h#vxa`IE2yG&azPur5%h&G4q z%V4yTUeBb>TkA{+`sr`rZU>1OMC zC_}H7)FDLZWu$dh;eQb$?aV%(+)m5E zoZf~mdXw1=g+9;kTCJVm_lk?Ba{Nfg0l3<<|F?H=#81no(crcb@Wo8L5RGJ6_{w8$ zM`b?gGZFL$({jAE>{|61&wj|UgFf$B$d1a~cJp`f-lb||*IpH_?q^wENh(HE*fvGM zQY_exmAxF3wnO7mY+PBTGAEQl=fq$=l;J`GtbVh<9%eL!{Q9{Oh{kyEWiTY~_|0H8yrrN`*uXc>_w{BlvYH*Ur@lWP zj&GN4U7bSoXM-m?HZ$5s0ES{c00jRP20`P>BI}GUVZ3p8lPd031lU<~FU0&&{Qrt zy#{sfe%k<@?fo|2z+I-BxN?ivp?vsO|9MU_@M?&8m`m+sf7~!&f7|!P9 zw57zC#l&wYFUzNG6KtdLF3T_FbVjps#XH@c7e-vYeq)$0eE9Th!|WbXxm>`F&F@y1 z+b#4yZk__Y^we`;J6qA^c(ffFm*L`i#*Es4zKmr9tiN{4Iy@R{%n!~p600mmbUu#e3$XZ@+Z^zj{bG}l_myz!E^y$l}(Di77TKTnA z1{3VoO>rZTj0Mk#yi|Y|&#VP$#MME^OA%rdcwa8y!{+VAr8%&95*qb=JNDp`+}RG1 zjrg~oCi@Ak)#kJQ7wf9)BY9b?wLrFMr!E-i*GTt@T;8&Ux(=haM|vY(ucre3BDQJs z@%!1?;bdYm*_u;z!C?GQqqLq4n>PrTw7Oo#oytdWmvvp=j_i9Yuo>8|ppSMSP6IQRMI)9m?6lLQ5lCPf~P9zpQ z&DMihyiE3TGo5Omr1?Pxsfl)2$cUG+Nt?4^^Ay+%8!Wemfr0dcx5(eJ_i_^EVR&fV4x!d3*n(do1s&oHuC&yX#;3ABzKr zzryN1KffDJ5LFx9VLg1D-;V|lGk1seYCaqf;njWn?p@L2f7$5#`{Afu9GhtplHiG7_z7C$a$0>SQcqlNr-S$kl9^QQ?+OM~ebsm|4{$N+< z0wOkV&-!V!`19Mb7ndM#y-EI)+KicTtzDM4dQhC73bizEZ$Vxpp@Qu7B=j$|C`+mH z_pX+Al9OI6&P`Hes~Q!yB{QbgW2;$rFm9=cgTcDc%oBF009Q8F(9(_mDA>e*@k3K;E zG5E*0ANd)>>6Jl~E1mu#+8?8m-WOUd3-8;;D$@;W1R&j@X4KOS77TT|Q8Y4&*HNwH zcp9M?0)^UEaq23HQCrjrlM3$pe$+=egM5zOK8G4aDFz(!Po|sO`s=T_fub z!}iEub0pSNEPoMi&vK*tv$Ld5VxoN$8|tDouX;Zg?dNZNL}S=3m@caP$G;A~&x-K` z2SH!(h#03D;ZK{t4!ge=kKDo8jAsB%oZur+K9^wgZRREJJ4fYxrlHc4-f z)7xy6RwNbT9o;6$bcu@6gf8bL^XXevt*{?mm?P{Hl$kch9a=w)y5!J_F3Y=w{I zErsX#1yrB1yEFDA`kGV4Ec$etB>Lz8N%cCa4fdsmpJDH!R*i6OoIKWc74rkVw?QJs z-d^=olsDp=fM0+o$*bng#cGh{PjhURnBjOZ<;cnfFPq#C+%(^9B*5oX2_1 zO{ss|@pkYuxE;=k#s*V&zsrv<#*NaG%ds@mXf~u^6diNv% zdk%1nCoP`wsDj*;V4-?FQC)vfOzKwY*=e=+@rba?I?NXTsyurk1H>QcHRsmmDcKyK zwrD9W&B^W1x;b92x1|1rM&HsB@QZ_$M|e%SthG?L=^Sn*6t9u|mmHBT?-@2QDBJ77 z=Eh|`{qq;u6fHg0KRZ_%$xq}Ulx&PD#VxF~kt;Tm5|Jpb?pfVpzuNk4J3q`8)p zfs_|>0K0&KXk;X}qe|ZLWxl)BjT8Ha73tgDR@wl^br`kzJ=1C|+B_X=GiN*7pjFtn z9ZJ_`@OtanPrgrUpyqz@PwvuISunWJO z;5IC$bcKNa>^!L#8nG{uR?6w5CT%IyS2ge<2Dg^}>O;-}g6xEnP@cCes-?pg(h~c15GDj+}5qmaI$6Acp zjxoFn>$XGbTFhNf`~BobdxP2Xi+@c__8cQ??X1@ln)O#AetBI`I|Q%DSYK%rwnzV3 z1F@b``3oBA4F>mT=Sf~*glk_K=(3nh^GPun)u-7yb7{5!yU1w|SmU&x6y+EhyC{oi zoVW{6$L!jl6!(MCtQ_OD7x?$X#PR^+>({GY1T>d+LG#0O^87@Eyx12wM~v-etJ66) z{H9*E`6kTUb{qF$5EQnHf3!Id5a>ek?uYp&P?c`EPj_hEnp2rc@i_SA8r1R=SCprd zuY^>l@TXzvxbJ2`h(=u7Awt=SHYq00bQ>p4Uro=RxEY4Cpnr8R2a!2wYEqk5DFQms zIEl+chIyWaECI_j-)Vi^ML;5w`MBF+JFU)%?a=F^?ER~yjIZxOPG29-E?zCq`ul&p zTH1=&I|+){I}6MmQcQ#Sr^)kdFut1=vy#$HCRQuA^vx%u$yYpEmeRsjJn|rBrNG}F z@);Qx7a+@lM98MkFTC15k7u8T_qEGLyF&}2Uu3=x@Aw&uc*U|D$N^C2uwGeA<;`IE zr!;!VozdoDD<7Wb#AI)5G`l1pMA*Q+^#2R^ZrV9{^9QUt0AQ(9appZu=pBU0AVlk?f+g!t!M9-pDjc{(5xR=W^r}!rvQ>vGuyb;d?`~o})J~eM_ z=6OADnq%{%j7%T@Y{P-!j8W_T$fn$ROWuy1xBR4BIk~58$EU%xm`?}8ITH04jL6Bt zw&mo$QFiC@X+3lJ|8i8&d(E9UWZ9P?j86(fFg*)X;NiuBeOZ}q5%94Eenvd;bTED( zZ=$e6g`Ry~0bV@up}e04$bwy&uYV2Vksk@qRGYiMkk!j_HhG@jmVIoaK5F~HjP@#n z^BUIib;f7Q^w$khKpKzHlwKWF()UB2tIOC-iA2t3p1*oBn=tc-Z9i9K<2DIg%)nQ* zM_rA@ue}S42f>>tINn*_;q_m!_g+mjelfO+4{E+TWCZqgn}3zr2e0K4((>2t)n9O^ z@QlvCXj8Vx(2cE=+Mx>UFz3pNH!1<3+17!c%E_>}&0g!bRVG%>?E1@hY!xvK#$gKs zmXySRti?TBZ;f%?UJnblk4l2q#`aR;y&hpd6SJgXt#jJxUQ#q!txBsk6~-mcJkuCo zz_AQra1WjYZ*JsV(Mo}?cov)UP%q5G&5vN5bKSq4qx<}_b_m7i1lk1X`T|V4AKT@!om(E5} zP3~cZhjNbS@X_RUfVaJXMI5OJZMO3KVd{TICy-rrD%QdN<0GEmemhuQ-Nfv&=b`5C zFdQsD;jiy#_GP`Nnn*%$)?-hZ90TkdmtxB7Sr@ zV>sq#l#OgagzG8mp^NOl@v^i)RqwP+X!3A8E2sQkbH>&rj}=~3fo$EkT5cz5*E?mA zNG;Vvjc8^yO~!rX8dk2%+*%Q!-841e2%SeedPv;{Uqn3%&-R&CF)Qu&-AFfHYM()S zQOD(~Bl%H(Av%)dU45(RU{@`g3uM)%er{CUX*SFPZzECN_90?(DcB;Vft=t4rNirD ze>jH~%lw9>D_YonHRAX$dpC82&|D6F@h{+CAf21uB>WO;+Pzlp7PaH_Td0)|4)hwm zLBX!kM8ahkpZDpwJGYuGf-_72`PGJRVUyKN!B+k*Fi2ZJ(oQxiCb*ZA+s6G!!hU=6#xKp)D%;d>e}Vfx z5S`4KZ|;Urd!JqKet<1etKI2wo_;>gbcFaDP^;l&MdWY=2idD)#8~w?q5IXR!BfdD zC!?3=<#artgVaTy&f$#Qmoj?^ylln!A=ug7U1insyRfD+{18C`X(pMd&mihEQFBq|9Hl;eWPwFAMP+q=OsKQK_QMs;{OLY{x(~rdd-O zSC*Kc*g&a~FQH@>xul%TErM(0R?&{MR$@)99q?MR1HVO{?f|e6;bEIKC|^%hUANZ5 z^77u2cpNJ)sC&}44#qv^TL)v+IyN$)s8`=|5BS!>R8RNTLxJaYw^VW(t0E?zL!n$P z#sLBFK~Lc+JhwLTT+0-Vqgr3Askq%nj*r56Mv!08_oQSs7i$A_zhZ_u!2pZ2q ztL@+Nfw6(;gatrY+eH7pE{@>nB5P7xO=QVla42VX!8%4xnqX!+0{T+NC z$4m&4Z*6Xd)TN~;&`BF|1o=ACzm*@k6 z@hs_K^XAcfc?59H-#p*vg6@>)R%gSWq$kQI$yZ!f>r&i)**+yPtlcTj@8Ol`f)GQV zXH|~Nr?rB~*Gnk$G{tkFv*BbM2Lp4E{nPW!?E856$Yh8htuRlBx-V=3(FUrT!%^A0 zpJ*8ARV8attx}eZI0j(~Ns*Y5Tkcu_`$jjG#2I>k)$TGEws6ppNy+{C$l^@I(>qcf zj@=7mcfk`jn48Wk6Zk#7o6QIFG9%E_@@X`UDYy_{s$$m+1sTri>)>t!&TJ2;!h zZ9V%hfR=AFO-sa1e<3C}oAj=camU#<+Bmb@L2E@}KCjfKz27xMWj%lPQ^LklN=1~1 z>LmGj0pA!81n2;Ht*8D>Z#sPV)Wo=%(Xz3!W}e*+%kg}8Z%nK(N-$_xkIZ3^j=vM809m37@ zKk)@Sly09;oX{E%lUQo?ru3j<)8XmbM{%YzCuF}mo!~jjK#)RNjiw2Fuh*s z0wDUaJ_1XCS?63Y7B8ou{}>TFL_IE?t*$ygO}>J0yu(|hH~{)M7=K^-TeM+d;Q|8p zl6|zp3bho&@=kaWS-5u8`m=q;rsiun1X@5t<)Cxk-^B;(RU5l>>YsttD_BLCtt-&1UqD^61%?D>OHL#$pS4=l(;Cs^z z(lJ_YeUNOjBsKK8>90f^H)UK!waQdW_ET6~3Y92NBKbUg`r1gpjLUCp=vVCCmR6W> zTpja{bcWV+^U}*@6K4dqCXW}d4gZI0kCk@hz0|wkf~DUmXE+D+;~vW^2(#~n!_91T zW?vDh`6~zw?#GYvWN41$1F0Z1@@ufWk_XQ4&JX+wgOS3w`W{J;CVfavEkq+@vSo8? zkK4`%H>1)8d8p9GogRG1i(VdrXmZY(`LJ>qEH<)~&tj2B$#^UfpUlQo%F#Wa6egd> zcZ7XrQgwH%&m6FevU(reR2}pDgGFXW3I(#19N8XCpV?^`nQVbm{CPF+Hd%(c>5`Ix zP{vg~>-_Dg`P$zH0`Pe?&$=OLXg5X?&jT~L<|Qc%J>R>RFG=weShvm0{jZ+}^VVqc zFuW~Fyq5@{1}Ux&m=gOuleiwDK?0wFu#Z+5CDvrNnfDiyZ&}d<<~0$uco7oV;ETq- z#n>lU@_4;VR@#>|ztKi%>D81rFK)m3ZKd^?F_`tZIJ`b64$cNo2ZP&BCC>0BpP!%p z7L=ZsUriA&8Zl&4d__4!rcoP>r^q0(uZV?f2Sw7;}j4<>%8aYBY%DE{zpWKzjhw-$$H@~lNX*up}SSp!T)p-i2D8VvO zY(b0m?R@wJK5E~eqJ4K)*ki`xY;yNJDrZC)mz&?_CuI#X{~AAFZR-s0xd%miJ{a$q ziuoLZQXC=yocw*o4~24xxu9JfOvX4LWQN!~+bDYaE2eZD;_uDdfv_kKd(j;Lq0>C4sWJ7 z=&oSSAPMrf6Q1I5G?`4@*XdK-<_KAtxD$ty>Epm4_GPDd{o)xyUKpV&xPk&qdsqrg z&s-7i8U>|?!|4pT0q#F^G??)uW<*ur2nYWv&hd7yhklPs9#|dx@3XVwqd+DEgbXw+dsU7D1I4?%|vEwR2C9OWoIRpvRgCC zL{9&zpc8X^<9_15>I(Z)o(NSrET-A*boeya9Js`rHsw^1eRU6%ib=i%VvHrmqvY~y zG6k!m=NrRiMbq^ZXVX!au3;&WC>GuE!w`b%#gh8=`*3`Ceq9`w15jtskG?;BI-SsO zn!Hij!Kd=}GshfR4heX!yRx(;sxdorE%6HQyzG9%+ceP^{UqitThiRrlx2M!2Mwl{ zOM)z~H;rgo4436s>N_uPpYRIExliQf09heOY)hrK7vS+)1LV0~ZzP z#8qAd!afy(o-FPwTsm@c`>(dQNd9$Ma@-!{y&T-$A~KB^iq2p@xVXQE z@nz9BXu3?rk{R81vIxTUF8N#F|jL z=(KBwfDL34SR<=J;nk;!wUw*ZT&A15IcR}MZ%IV-`{+MID@^8#RCfCB-$O8=9xbxI zHJ$BGOgF_?`rS5WkAMjIKv0Lna&%`U#n3>dA$wez?jV)M45HGAL%uM?Fe zJ(f(kg124%zMg(3jIIba0Hn8sO$LjpKbU_~71-PiZ?BEL32rd(!ShX2=8Yo<)E(cY z@O8gEiScK2rbw&+4h2NWl(HS_`OJ+-GRZpCrKecU0%C^w)C{5JHQNYOBlr2F}Cb-LgxSyN~;qK_5r5T-=K~k z?|Ed7MzeivSUSrhKN@`Jz(L!Tj51&L7W#!gLIr4xG-J@1 zt+)U9TXA~TEgpG;gZu1=s+r-}x8jj>)73@qw7AD^uNXekPVNrNk}VyfMS-9t?2lXt znNg%!R)d#liKvcg5u!#F^Xx zJ+GGboaukxy?Yas;Y@~ZnZBV1D5=9iYq;d*LF1~ZrfvD{wtOPnK{O7^YFbn1?(;MZ zu4@tb=_-$lZf5SiQQa_C*`*_p5yizGNdiacZ8Rvt(i#kt=Xo)?x9?lBYmiaI#Wgq* zK21iFC{JK%@5BpC6z5eyZWpUB( zo*$jkYF?awI6aLaP;uQ$Q(u)U;;(zPw43TA>82`4d2w{w{k_=j9R5)}l8<9HczmMm zejzHzJAO}_bXABc3UTJ#7nuLFxhoF;xPI%Q+Wr1%x40dV#a+yxMWH!@N?3`HR6CeX z2iP`Q^rqo`$sQA3HbUO=;)zT)(g}t{1I~p-K&YvjJ(ai5P~F8BR^~xNQZ>{Mexx<5 zb9>(66HbSMO4|OF-wf@=9rPlLM&_Ctas4?}fA652riX)wAsWSWst z4QU-<_nSZl4&KQi;?qqzI{VlyBgU9XH8Ktc)X!`qM)5*-mrTH zGYL~O2|)XFI|bAA&o?C&^K|2K{G}L>w@uLLzD#vMeghjTUq7A9W;bLQWf0s==DW$t zShU@DABS`VR^Gv|c!GB>*%}w6FoIuU$zlbXe}%o8_&%;^z`GB3zpkZeO`Z)fg+x(R z+G!1+C%I|_PFKOYFeOhGAT`Hqm608Vl{|ryujq*orR&}wRyd9P1yznqVsr$9sj-BZ zLhXz0Q?;U|Kt1AK+y~isb-ljs6?aLUf{Kjprke2=a^zEtwGuj1W%UT^sEtvhks3$s z(-^OZ4|yyVJBk^3USVKkiNT67gbPYgPmHMjsNo^RN@p{ihc zJQZIiBix46%Qqpsef<7e_l);E1z|Gh9ir1D9P}uZ8ZP}U90=k|#;>SaI)4;N;bS!q znFe@VorGv?&!dt3mMS+ZKWCGgq2a7jjD(J7Dq9(DZfZ%mpFCjTK##)dXXJ?PPROO2 za5B-xs48#}p+6`qQ?_G>Ah40B`V&q9v_(RtP>J5Kq7#P!?fC^)O+5)xq8QM){YtLr zsD+)4s)oCr9EHc>?6w&2%##|F2;|-xhV#_bw~mwUzh-lhOAFEXTO#G9&+qzz?&8!X=6^4Wk~D z*=>n~h{wSc-YC^(2A{6v^v2b~+(2yHou1CF^6OMsT8tAq#cVPZvYN8pP6`t2@OEBt_ibKnwdgCZ zR}yHpJJ(ah1BDi$#8BSB#iOlFRXxVBmSBp*Nz0=&B!f0Yy)q=jdSxfdN(4P(N*9Ci za5jNI@@bgv(`a&6+zbbL$Q^NZ0nYa-p`2XXCv5bdr#C4Xb|A5xDLXK`Jla<*lgoap zBCrz)mu>R34Au0}W%sPx`4f^$QE=gWI_`t-er-Y~LOSU!9udP+@d+@-t>@K%rwLWn z4oj^#sBxW-R*v5OS%DpQw1!bRD@Xc%QhgExp54T7!yqQ#L1hL|72VoFfShqZS`nmj zM@eqqKroW$#R%(8#em-V(WTKff!K2ecK+p*F1}(nLOyi&-Sg}2DeoRfBb*=w>p+id z9bLFFIGar>E%*NV54XRc!VOQy;uh;!_o`jl@96I>9Q&e<*9a_-)Eiv^O$*yS+Wr&5 zBC*Nfa^runRC;vhAF(g^-yC#1)i?YNONUYEWzi!UO39Sc*12>E?r6qrQkGN`Q#X z)?R?0-E|m%0Yo&gD+GdAC5y^H!A3PD4uFi)y8> zu-axd7Vs@SC5&7H3Fa^& z5UxBGTq$O=#%E3Dz@pmUS@X|-bg?4?38T<#9 z2+E3LECfv-jdHO6U}RLD7!IIvi-12Ki0l}HfcEYGnM^9DITy#1#S~95jbMtw=`a=s zI@giWK`MCypK|4?=Blhr!4YV7Z-yH%aK+@}rqHyA?u28hKz0t{r?r*AH04rKWWvEO z$|66ssncF?F2mNSFu21N+f-Y6u^}M8nI0=AdeyuS>@I~Ovg=hXPt#fwv|3h;&E8aP z8o1tT$x@l1i8}3BVu0_r)7u-_VXL+RUo&8Bh2CvbdBq?YSlESP8dV5Cod1D_5V8T* zd}Rt>eK@BY=ZSJEMO*s>^e~#-3}Ca;yp)J>G>_?}PvZ!l4Bz4lHoTM2mq@j<(Gb#y zsI_M?M^NtkwQOyx&lvvtqL1CntKP+VAs4!;tXko!vTEU~$|}WImHj>X#!m6Zm;K&5 zFP=Ujw26J8()UF*UN1m}s3vsL(vSP^+4ECZgVhr2Dp-f1!SEG5IM1!)#4NwLVI#Dv&eFo#u){)-uM~raxo!kEy9n zBdeD9JZ&k3j5%2;|-R19a(dDcx-O_K_shJ%E-hJ#$4 z;viK-9OS|z2dReTB^vzRZU?)Xhv6I((M+u*$iv|Ak>{xC6}5udLXkn$Fj1k|!G}Xj zHT-$@)fRCxQTa^C5G$mxG{X&r}E3)6O@Y z|Dr?tsvlg*W$wFGi5Lwoydw9p=nfZtA+1%0G97BaG>%LLCd6d1ENmJn}_&B6M+y^p4pR(Tz$6O$VotZly&z7Y%PKG4}x3T4bSG$YiefFF*|@dJ(K`O)LkgFbmVGz-a1b>O^EJV3rgGLs6s z_H5FBP!{HZuk7J+vXQF{8y{k`>FQKNS)m%)c+JScwC=n0^0#ap)kv3D-QB9+SbZ|>-a%jm1$^4pU<#` z!r*W1-kaLpdl;M^H4S`K^ChbKR0+Gm^65)ZvUh*ZqE%rDk;D+uclN^X?8V=CzA+ux zi8`=XRmGTHUEFWqZ1+BD=9H0Mj+g~im0XU3D!CkSRXp=#G2PIDhg}VeZSjTu;Hm~P zckMPbB+-n?6-q&)(TyRwBnjp<&OL88J#KCxDzU67f^!ty%1S;;A-$#wqwgG&2Y99|YSX|}REvWx zwHsEe&)r7aeMK06()KfLBj(v+xu+YJv+$F4|KSGEG;&+os6VbE#6p`xAlF!IVT45P zZsLAu@i6pQ<2430)*EkIQe3vSEANBF1nN+z{yts$))*-298yK+TA+%z4mbky z9mhot*!j3Psm*;Ts ziMO)miPXiCZ@MOs+(TQ-XUViG`GN$BJ8x)tD7k*RLS$hw8!lgvz*X((JX8vo*oiwh zxfe%Ss7T$0n9V%ragzktl~UEKA+iAM%0vF3a&(_)E@~GvR^5tmf2nUSjbGQb>f6Hw zjqATX%zr!E<@@Xxl`W-6g+oJFN~$W`y?oDWss7gm@r1gK_^FJF^-PRjgQG zYj9X#vPzjnz$3EdK@&PRFp_frMM=q=4MtNn46FE*s=PC`vjC;7w4IfdCr^xsKvkj9 z8Hx0J$;zFGc2QljsX68FYiHHYR-_tX<1D@VzKt!{O)AHx=xkM}N3|;VeX7=Cd?#7o z00p#9^6UO9igSstD7~I0gcV=%E8*9Lndk|SK2gS>0+Oy(0c8BVi%e;>Fd&ZQ|3-wDHr3gHtey&s~30C)R_jk4_Eb>Z##h8=d1b{fm_4E?Q>uCq0wsbmg0KU8f^a>x zx9bEM$9*v$GEl=W8VV`FPA3nV8^|cJpS<6x>l$Ed~f?7yv*fh0pO$R`>?M0aVr?_EjNDACGJ$ z?2HSvbeJ-aLdjNCSKCxcRnRmPDQOFbc8;tI4INV_sMUfLRHJoukOwv@EB1T9EnWE> z)UsP6H3u|HGGJl%t+OJKRckSK$6tI0?}8pAK)^oLNee=`_b}1K1ho|`&5J&ufij<< ztf+SalM;CQH4PJ392RB)3SXUWjl^aMY)$gORHevLvTDf)rNtL31ndYja;A`|a!rk> zf>?K}mXK#XnphgR`*)YU{WXiAb_%UUC_PZKctoveW zRA*2`7fI4q4NCWsTf_G!)DU5Ps3iz1pBsn1Fz5i(dAx2KDt{xvz~}lIt3S@W0ySXw zY&1P&kR93tHJSmoQYlwomIPJIvY_GETVJ`@7lw?AAwpJJi1f;6D^qKttxB(kw$iaz zOO@S~^A59)^w7)i=A7OXOKk3YLMBtyn%^l1HQ^;dxw+qI}v&kG*bd0@r4>! z*JbHbQX|_$q9eGgM4azUv^lO9=MIzUjR+Sz3M=pGDrFp4)N)wYa#mOQTuae&E#ha1 z+1tHNTzr9$*NjnnU)i)d2x0bSK!yvENZYwbDMLt~N$RM~?NY*WI~y{^!Lf%)Kb|^f z>dl0AQtpF#Gvn=X>~p`xMCi@pvnE?si7*N(*Q%s;W@fzkikS7inKsoVD!XP^G}!`0 zlr59(cqOh{@lVx8uCt0rv$j=DvA)nhq3R*U9GLNOA{-P8LH0G-AcPRY2N^^aDYP;QfoW298Ka=%$BJYTldEbi zeY3D0bCb`C-zx47tKxvMqQ;x;{GqCa8f9XruTsMxinHISi~;=(WeeykaT**{2%AIK z_{hSbI7?P#Qv@yYUDw0zIU>&`G_F~Oy?PQ!_U@#IaOW=9kDbbPQ{P5;wn=&jccMw; zdbpDrLX>B}ksHDtd91G~P7mSEF#C=5o|h7jes zZ|tRqa4$QAdzm3bdG;IWA>7Lj;a+A4QJ(!qZV1&y7c~p_(nGkH9m2iL5TZOwR(c5c zvO~C+8A6ncZy*J|F~6d?T-0PNtD0LxVU@hCW9tNaU5QwrOi{dFQRTsgMb+s`IHn4| zKRj-{dm}aux|-r`kFAP$+Y$Y>4K1fyFu=?`Wz zr?q5pCN9r-tobUW+}&jy*)nD*2O_=N85p^%$$=;|6d6!i_D(~y$W+Bb#Df}PZ3Z=7 z+lS?OWO>5G6(x;M?m6&+#wd!+L?I=Zyx{zjl3JJF3Rj{jy%q09s*P(us8%(Ug#`)I zAPcl1mHRKdHNPV2FPax383@I8yh{Z?}bOcD$I$%lF=M;N)l9PN; z8v+RZl}2&D2!-6BS`=QE69kC5_}f)w{8>>~({P3*IHK4$oni5eYNL~vOXTRttSnUZ zk@BnXbeDd(OPAgU54Ma;se`1?<;py-Af`s5mKSJ~vqu3UhsG_x!*GD@BhSooDtwHW zr2kN>hYNphm>eI5R<)D$M|JLT=Iq(3F zN+T4?ABO5uVM&+@cq4^j=E`QD1!Yws6ylZs8s0O*mDq6vZOc^ymuT83CQjN#u^?AL zxx^Jzc>^hIBh8?o&hHAt^89zIePP(9<~x387_^aAYFL%)kBTA-8j0;oSR+=&pvvzL z!}2^6svTn3riKZAj~KL(247f}W5TTFJI^`kdA`Z_2##|vyjrkOQ`0QRyl1&{2zn)A zE8?1(Z{--MvVw#dtBrPCll_)8J<=Spm5Uk&``{peqq-FxRVc(Ja8&u%@h~8t)>UR6 zm8k0iE{;xWFA<)nzraSfYay%n4k^1uJ8y*!ugZk>c7@hlOd6|M7-^&gK(%(~LfAUQNkcuvSOKL` zg{G!3^eR*#P#Tr91CuCRWwL2vY}E0GqhvP$sGRH$a4&81@5z{yg|I17_iUP`3?|b{ z?3EKdkV%yMx8(_eD@@EPdv0lKf+Zkmr=6jwOozgug5y%E6cts8(73K}uOsbBlwO&P z{}hp;QXo}TQL)cOqw%|(80tP9p|S9a!m2QhB%+giU$_;kw3qRSnGlOADFr@Bz=?Po zTVtky{w}qM?=0gm-vtm>y3I!Mz4cbBFA&R?FY|U&RgwVnc9MgV#}B?N!ljNJEZ9y+ zmpbS4Kp`%Dw&}n^y42yM2a0f|=-LhGQipdImpHboN@9Lh=WY%v!7p*v=Aoq9(H8E7 zbg2_54;1!MpF%mXkYDN;$pb~WQv5Q}DdH&FHuvQ*TTE5VLtmb2g3h=lUVSC(1L6(i` z;(l3d)hUb)ffYK#R;b;NEmLWEY?<1Y+Ad=*qA>Z5vo6i`K=|o&gLDtn zk#*1@-GeG7NP?@7AYG9|lO#w73TZ@{F|L+W1ujphbVY`sO3P|+xhe%U8BCcmPRwjG z_&dolR$)Nu!$Y49wex%pR_;R;bs$HE=+(VKQ+!55aS#*-x|H~-{5U!lsaqarX&!RIA6 zIbl^)m_n49up(GYgJ-*(ov_b08LkTdzxqav?4v4&EHf!;<^&`^IokOdkum3ms8}yd z3a_ooOg3Aa?%nKdPQqtzbD}oO+Gex2xv`qTj>%AfJ!7sWC%ZGO?3p&%6?2BQF4rde z9jq>yHY#pK3Ym^s(KXrcU{d71lMu{(O0ge}HkTr}N=5~m&$}8K{AX&cY{-owi<~VF zTz;yJcKDep6a5I&SL{d`pR14&gQ`hPv~7YNMFv^i8`}gLEYn1WGOEw3P)1n;6EBU6 zqQ5gWxxPREb4_x6p+M`*S8{!!xao8g1iIxavQ2V*Ay-QVS*|Y>ahz$A>k9=ChfRLx zmwI!8Yii|5yctbfE)RcYMP$4hcsXCycg5s0<;rp~MJl%36shg8DN@U=DN<&WDbfp< zElV`j3(W7sG2Wx=PoR9=vLT9OA1Xi@W+H(7dM3-#7`~)Y_zg>iL0U_qG}Asog6601 z#C?VY@9wNVCLOV&G)+Qf2nbMVw#ec%3U5PIpfapplxEr|xS-|5b77X|Lba9kA5;5S zQJN${>|q6Hk_!M$qljfe?OZFo_nG!F7f88QUR8l1LqaSI>KaUiV3;N$Aq)CejKGi~ zA(jQT`>hbD*e_9>;6hp!uqGsXv3Hj#&VZ+f18YGVO`3IB2h!l_Zek5k;0Q0rVVMtG z`$|y>?Gar4aH5};j}!Oqm8rn<;I~86@S&rLDCmAc48aU9xRFj|D1PFKuY>am8e$bx zEoKx_ej`B8yjj2x4OolGGzS3A>i82@2D$v;(*$>(Ir8|BUc;H!R!WQ}&%Pno+?G*I zr9x z^z&Kv&}L{y!c95?k~QWse6o?LO13dCjirQxGOR{YXK|P?mP?X8A#ARa^Voo~gYVf| z%66Wu)D`ms^I#4-4(vXafKHcDWlF5`QZcfS9r7#N0A7BmVNEb zY)*;fJo2@62qf<)Z9}b|IK$(sl#mWV5msuYEXTEyUQVCkNx~X|F3FEq^{JW6wU*?w z!8a4x7tK$GO6VzBE@`?fky&t7zx-GjFDA0bVO;`uYUx4bIBu@k(D8T$xf*=Q*EP`z zh|x?>UR9BvyZ~_wG})Mp*~Zd{I)o5bh^HO)v?%{ny0B$Ps#lVU1A z9egjR>1MwV@JQff8X&W!S2y+(cX(#<0k1ee7I)8&kMzj+9X&dJi;F$@_wezlD2_&t z_iRWUjb{6_?6m0NWM6eKqWmYwsfxI$Qdi-{hIAWL^szqNAgV{V=+Q%vuI4R0ri+TGhY@#O6&S0C zB9$cm{ox#86|EgX2fL>zqD#UZ3`QezKS`9XY^EqWzzmxzFe)&;mHlTpzLB8V!o~cc zjQTv`=ux7h2(yiy)#bw{Fn+9hYA-)%TKQ?kn=h&{m)*5?yu3UhbtpZ-c$a{?PvE;x zzzq{{!vtKwOaAUG0rz~9KnS-)+>__jr{OG5K&Czp7e)lRhmQ+MX721IzP)$X+V!)+ zauJT&7$3M8;Y)CF4_%4i5$5ULST~mw{(N=i+ zX)sdKPhwzQY(a~s@8&9HYlq%@XSG9&=4Zy(x_{eIlUr8pbb{egkCRbDH3d{{*cQ)+ z(ZkbnXgj2&yGUmHUG~N7T}YM8;$j&&V7;^oKS_}XXWhETQyqz zx)Mrv)Xbn#=JMMR1DEc|?;V!q9j*0t%;l8qV`%BF_6-7rbKBVE*i?QG9@w4ECSMI3Ack)B4)BJ3UCeQl!{^|ry%1dqBsWEb~J+qqQGU^mNi9s zHXs*f>1LFeg;f0e@NWJ|cAq-G4|jkngG;1$2bc74{#|mHTqPzF{w@SJ#Y#vBng&RN zJ`8U!o@5ae%v)_EQ^~zDyikI5^Y3EHPzk;!)^C&?O^0{DCCxxrs(EWmfir;tc%{+j zjL{H7QlC0tJx0D%50l{;$&}&;vd@_s#bnCpVTu)#k*A8qR}8bgqoy}Uu24-OTd4PW zt}q3ud0-(Sqhg-eLd^hIn1a+()Iw^FUtZ_pG*N~CCw=-fojgA%F?UN=Fri#A ztz=R!`f?Bwl~V?mQW-W3&c$lBb1@uyys zc?Q3prWJgK{9Qd+D|kI$eR<&g5anrl_CUW-@)f++F;zL}Pr_&D51b+uo`8Ozy-5us zN_j@lls5rx&ADE`xI``QR1$QJN+Ot`JAgq)#M~x4+O@(Z0SsJ(({NR}oY0HW0i9f? z>AJ!rK>(8rAQx%DvR7Ue^RIBMaBJValQeTy0ydl^GsSIxr4wvFd!}?-9C92{iC4ocML#Npt zXdn-rrrVo5Ldl^C?SI3G5buc%V8m4bg0x^7(GFS7W;Bj>&89H=Gyns$$^b^6j`!67 zbRJsiC3nT-Vbxvt+u(?bswV24uZk$DYNAH&etqCP25GJ)q>c=|5o=kgKH18nVok9L z^$fItD^!AJ3zY_NWhp>4`z@drMq8+6zAH;$3}(H73``JPnCc_K;H2iaka{RwVG2^u zbPK8Hizy6dxhqWI4D1XGnW8h8-4-&%&R}L+$P}HaS^aTXetnuu=VB7#^f?OGsuotN z#Sw=MOc3*#DmWU;Re3wq*YMf1tM=vvs?EWKtC0;6^mIEN-jv+boGVt_Y;I}l*+4R( zWx6YHgW2c_hu&`#(7dYc98{YMQ_(5!2iW}LHu`P*?rvJn#4>9j3{fy#a6V6mEqIn$ zH~|cdBusV;U(R9X&<+#Br1*}2rV;jH@~fKv2pN!-Ns=h!fD#cqUimXZkPDM(S{iq@ z932s8P)#TT55fr)u~f;~K;d4s;RdQ6c>oUKV>f5uv$h^IUHN;m5-;11;8;S_N`r$a z+tk(mZfbE$l2Rzr*s~-MfF>-2e0M4sQ2!*A+6(eY`blD zx4Yf8yW8%z-T&@(x2@X8NzR*eo-siotuW>9Ll zzopDSf1Z}E-`_f~%^&p7_s?tfx6-@cc)Ec(RY8A{`jYUs(4`A+Eo++_L{?ho1pL)x z?k@P+jCg^z%0RGO%TFLs6|8QZQ(YaXoLe2#@*M~wUb%X!=@A*1&fikq>euoWtejI; z6|B_4=kW;QS5GfT`pQ3zZmOSPwJH6Ud6oWoTKG@dxHrw6xAq`(0I8 zdHJ03c`fr=+vZi2Y5f@V`4v@j=eLz1C|IfX->R|-rRvyUB_E(y_{-*21cGzh%FA2S z{DNK;K*8siSNZ1#+w}CgmF08FTFa}d=avW5aS47yzk%N$te&Ix+p02NG7YzCep%43 z%ir9fzGXDN)cw1vY~Eab18Drl{#{k(XXB6h2s(;74^))}fl+6h$t)$W`=dlDde=Dm<)sNmuX{mmy z6-+Cte;&qO#oY3F6>amX{MEEBvHn*zuMHE4jxT5|PpfHuZq>pgAs<%E_8ue!XRr(U zI$tZ|VG-C|!M3dh-;EB@`XU@yLD(nSK?wRV7f3z#0l%Um*a&@=#>HYpt z=VrtcWo!!yjzAAg0bv-;1JH)($!cJd5G#J!^R4q z!K?Y${t>Mu5}~gUXaMYO%W4<|zQvtT==Jurgft{j>!DW+gjBwD(H<=c)nDT09M!bE%;yqn%mz?1=Cabz&B8O zjU15n1H2?;=*lw77`WLh&oQ|vuWG>UM!wr=`a&tyaI+teinR4@!|a5dP-5`=qatlS z`r1)ob!q`uFPC|fT7cINA9K?UEA4)isKb>yuQUA)Z=RhR#(o3a2n4*1U$8!f;p(<%%EG zYfM-exQb9=AgucI=?YDi62{GK6dy_nou}$E#6u}{VTRlY{gV>UP)dBB!VpoI_bR-? zuvhaMFoiL%8fr*cHQ*J&IGt5ZcLhnW?jn-GT$d9ReXr298i}N4WkZ6Z>eR2oI9FxX zt7SRA&LEd`TY6JmMc1WjSrmd8R!lcaG@aqC@G56h!mAnEg1~KRdDj;nlR+w&jHb1m zpc&P2zrmcAlbE`QE4JFZ6q{HMrTCPphSo@95sj%C%pxe2sVtG1kt}nt83UUFcvO>C zW+-MLC~2!K>~KxbqKr~C6`}Ih@rW}oJ%uT|4FnyMX6VW}$j?n&xu4YnGj7%SnOSRl zR|APcaF5+;%?99}e> zKGeu;Fn$s-I8D#TdMr;$$%#S|rlTyXO2f>e^6AV)ITQabm}1t(mK)?-GZAH6s9NnH zOh?h@3Ow4;mcpZ*Vd*HQSep5#!jsbQGj$-P#inj#8aYr8p7hnMr>oeCfoFRcTWGb} zhk2C|&zp*o#3IJej7{#=2e3nKkv?!)-7+qwX%_*?w9f*#d8Pe&WG6!hzUVQ5Pe0Xh+(NC=vfrmfd#9T&U}jK zz&%R0HyKe`atgOqVs?Cbf@lc6fg}a1rjhMk7&O8tlDoM{B6DN@ zBtuB94qk%ck8Qfd*7xCVY<>PY-zM2j)6`jy&H2ufY4ejNk85l(HzTUE1H z6vfvFqWC(~#r7^?_oqmPidS?-;Zz$|^#Yg-3Xmj4NJaTt$!*p-NxpUgH?k zOb**&^NlY|YQ}~j&^C$Bczi@E1jWEmVNeMVD^ z2N8`XQN?VKyvzWQwGo?VlS~Cw9>X+iFb^b_B*Q>PM3+Dh;7ccX6k|Yyr8WaZ0G3+K z0Fe95rhlAjNLy#_*WR_3ZDKV;KLbTHvc@CoPDe;$5ml+NC^Mo)5yGL4U`|CGnd>qm z&dc=_rNgS}h?85o}}yuqda{qrT?n2)D4G@V$QQT6xXGLx2W*Jti?ip*yN+5 zB=KM{nRwLv7!2!xWHhNGf?`Z3++qqRI;x8&OKu%q%@XLS9M-d$S)7g^84z^6aU3vo zW^sy7!O@w*;f$5+;*bcixL|XU{j64Sh9L4m;0V+kb}<}ApxwNZWladyVrev8QYul0rqOhaiVi?kBp@FOO+z*sY9Vh5K`ALW z-ckF#;uW1mctxLAe8xc0-$kI(yuvHi55;GQsrGXosxBMCYs{g#V2DtqdK9lQWu_W`LCJp=7bc)+r7W3-PftpYgW>Fg0lLc+lhfrJOz5S0U<$}x=y zr4;E{Naxjj;v7hXiE|*~!-p!H~BkpWI*S4K00aG1noz}SKbF%)^~ff1y6l#r*j-mu1HO8 zLxuu4XoTfZ2w(Bm_}hHlEjZmw9T3JQLkUs<+I)SX0M0X$Q(~us;+#(hz{r03gyLp; zkE@zf^}MlL9Bc3b_>pwVochz{)bH!-WiL`Omklqj?BNxuf(Cm-Tj(go--f2(fF1bm z8x9EQcvWR%GtjqI5uKM(Lz-g>lB9CE48)x(zjlb1Pk%g1CiVKBoflvNL$) z?3U*W=UR9Tov*uHV-1Ab1JnadMe0jc08TWOKp(X)(C$;r4pn50xES?eAh)z)2%^e} zg}G4^$qdGVFkZi(cT(kag{QzyFwI>Vy|@YCcH#;Gg~42pyn z2}ipF7}y9_X&6*6CE({=ed;^OL@-W&$wCoPampR;!?BSXfV0G2oc6Mm#i^0Gqzak( zjG+pG=mI#(?WMC^mH;Dk@^P;t;2@UdUzKe)url#HATCi(sY3&V71iQM#uk3#WH$_ zGM5k*qu^A+hZ9@aZ80!LqxK;C3@vIHOA}dP;9x$|qK@D&9=OJIO0$&0$_|sw+0>{px7$O72E9SU9nEt}-myVHH-YCe#jJLj^|A4U_IiumMuu?9~J)dPgx#M%P zq2Grie&qn0Bg2nJ&gsR0hF%W7&R(QQE3(1}LO6s)o%PSr*{pxf8F zP3?#Z$!F_E;(@2xg3=FwD8=jK%;Op+T5uR#XZ)%n|hX@bc+j3#I|D_~>P>B-x?| zM?wHL(D}?@N%vJ4Vx&lflT3V~mnJ8z4^ZOJT*d5uM7wM27_V=h17&GuMu$ccD+izP zs7@75j-{uwH9WaGlyy6)K9m4`v5hpf4BU>yr!Sw#WG|cP+u4}ZNF=_o%=V&?y;vB8 z$KMHS94#!cwGTEvYAE*_JG#G@j|`Qm9Rq^R?CmhI70EJLRJ1-KK(c|!rU)ZX7!Mby z1Xd3ufao&9Xi!4q9EeFpBCbLX;Z-$Im>ZMepxl_y7(#HV=n>k#Llp037H%|GQF~$t zw6{`;sAMWF+|e1-N`xlr>|;`sF4KlmMSBdTj`kQ6;4PP2LX~bVq7p!x7gJe8FGwyV z4@g-`-JsTWac&MrwZM${w9d@ETwLW<(!OxzLgB)yx=fvGNlw$|Tk^GpVQ1IX(vCfb z=mmPJsC6P~GcfaEbLl5D3Jpb@WQl=%Xo9V@A*U=eT1QJyPoPVeC^r_3Z0i%VF5?pN zGA#jI;AO^Gx@2?==BTP&rGm+-($^Oe!-xRTo6&WB#;C>`BcD0<9m^WmX_?>)Hmy~u zXk1oN^3YjZ+n{kln1-Cu!M-kGrf#7Zx#);J5g%E}s0k@!&XjowC594qb+%FzL*~c^ z(!kW+y_Gf$Wh;d=LtQPhc2%Rs9>FQN=8Ix}@sWm2$ps@+ zVk2ZE=-MA5N)OZ(d@0nGFG?onTplsh38V9#2B~|iE@g_KPCdqoWRX}$G{#|8omvuG zeZ9dT6X!eIU?`)@jT*w10Yd<%q-xh~X_He!%*k!@rA|&8sF-i?h=FgJDs?IZbwU&b zZB7&f>|aG?^AZcPHVF!XHt7k1HjfBGQf{=_KyYY7Mi8`7qY%`ABM4fDRS0UIRS0Ug zRS0U&6@0D%yS=UGssMwz_?ox3Jo+8+XW%e4a0E^Cu|E;3Uzcn z1+!q7Yn(ZY)`nW+Y1183xBA0<$bhoSGEyh0hbd#sX9^TsaW#0Gk$amy99jodRG_;L z`hq^JZX#7q?gl^*!awFIQH5gb%{FF2J-}f2jywe=+>70aCUEE{VW_uS>0uAdr~;K9 z1R_gm{a&O`A%<`36v8DVan+VkYq2~KqtgG>9?E!AbwYiB))NI4O9T$Vbh+vvjRy5N zGtHQJrFx81*5$OVEW=0@h2am=mYVny*2tI1D1d%BWjYKA+=+e>ZjK$H0uj*AcKN>-dXGTDdb*Zu93q_?7 zH_0bDEK7uIa*QnM6rgKX#vElIPB&257*=-usA&x8?bs>=TEzZan^ZLkKwJH_m7lc* zE#8V~#t4SxT%)KwK-1)K!q(Ot^0hz(&Yra5^~6X*G#7P1ByIg+K5W+Xdr3x9Hk0Jh zRwu=$7it+zCrc*@+hzv5EmhgpnS)5Wv<$`@-NZ;VM@17rG0`qIbLP-3o%Crj5>$27 zK(k8=d+JK7E&XPh65)b>P)zEKqT4@{U%#srepS@e{E*b6Ay@^nXJBaLu^_T1*08lj zp90OB2Sy`(l`aBp%gcQgzADSPiHGTAHbF3L zP<7Pq-X1Y867jYG&hJvmn-oZ`t*=>Hq1C;BuAQ`1kz#2pBlD>;4fAmYxKHPn{Eu@W{m`8OTQn{?SokmJFr!n zTsQ3?nr`YLpDM*sJlzx|e7vtg$~6sjojQX>?1ToDc5GVxavh1X{a{Q?Yhs#%I2#{J zTpz1XLsb;9_$Czx(X`zV^QrQr;-khiA!?f>#)K`Cvb2!j&?BM7#>cqWv4B#UhHzb0 zS?hImLP|0dwIw!JEiQ#DG%C@I*cc?5Iq6LLY_`(XFQE^ZPKJ(lVPwrsEP#hhRxo z12l1>3H$gHFA`f0s;jG^y2ZiIoVj?aT`UmH%|%M47=-2lPu)wta1auvG3hY65dv-x zMd(kYwbR#%mm1Jnp2^EmFbL2I4SYO+n~ms#ure@lNYBn_22Np|!z>Y?o2MSm68HPV z`b;R^q)ZqC3`tXvITI?)$jNMQ*!u#MHxKYksPu|TzNDlHu9{;R%#Y^{af3MZ$KIKQ zi!dEQGrSIeh!r}il*Rx<-qj#9y;6Aw8qHg&1Cr7)*A}Id++>W}>+3=wJ2BN|9xE@A z*=eaDbImj#IINI(=>SqtLYXJ2yqqUR$6_bsy3VQklaern7|P1R%!Sp623{%;ibaLi zmsUsCmsXcGawg?UBN{=#s|-J438suFsD_v{rSpY=RW5mTc~HDb$r%HZQp9u?!B=%e zBN4N?wp5xiZrE>t7v5xeLqJjzNnl`4?uVg3JGM}mL8-u`&Sy11GoW!!WaLPDi#}(H zHz{Yv07K3w$ec5kX5i$j3Fc9eC$ZYJW3$FGvmN?GC=A(qRTTY8Qh=gkOcUU1$9D~3 zzp`B!+xkR%dc{#v+SFAJ1twAs1re+uP@m$xGN5QS8YJec1U$2f1&6)rfE#2eAviv! zyf8hv}zMgF&@CCysrcMfAk1wDp0vN`!tjVFZWT6{P32%lrMNBI;?nWVH%1( z4Ks}=5*C$+@*zrkHbSMbcMU4s&=4RX=|zr=mhu&jx{wAsOH*D*h~p*%Elu^>MgyI{ zu#uA%r+if-4@>t(L>{V#=4AtNgYlJ*;55CG5tOxQUdD)^#`LdY{dTfEHhF32V z0ejU&OzX@ZlMxhF7=_HMoETHQXb}P z34qyyC{5f7OWL)%VackcD=I5|tJber;agX~e${dx47wId*Iid+xXLT4%jcHO!E5^r zlHafkx zowX*zIIaqGTc^d}jAYG&c5Ch3dN!W!vmgZ{uwXn}A~1@LbexTej7ZAQ#>5AvH5Uvo z&%$uF9J8J4S<(<2*|Tx+ZKpL?h&_;D%|m-wYYtci2B;3t!gcmqW(@%;BhO>yI(d&qZurR{}kvU7Y< z`SaW3jZ4p8jyLYO=ZiLzcHrD+I9NlDbGm5DV!CJ>|8#+<p6B*}FTS(F#Z(N$H#v6CM+hodfXYV*sH@AhxHKPM` z+|x4R!g^_(84hL9JfSR_2d|PFZ;oL>HO{D5g2o*eo2YT3j#KM_W^Hd9e|H-9t^l~> zDd_g`b|i6VfOVNm`Nfx!-weuaqRI zH^<4&_rzJ8a=OM&(eyadbiFTI)SlF+>{DraoN=JeO8IR4m zm8mg3zzk}bX-pHc#7@>y;24KDCoa))47x@LQ(TqZmFpgfNp5YsN(d8&- zo4`x5k;+F&> zw{BzQRA8%(1=W}OoO+W*Id3wcDu7v+(_*~bs2~~*`}Bn}6!)A;Xfa-z6}*n#-f%$Q zZ%x&jacfqkY0W~kW)q>dcj@2anq3Jk+Hk$VqL+Yf)xAa5063wgTc<~?Vz03^fayKw z(tcJo*=WR~_v`ADH+ZteT5G^!?<$@&tTjfgNiA1{0gJt|c+$$X+K4r&WDojF%zEfs9&o9!z%b&@3C%*H zT-O<}CbwL(^;rB1tCQAV*BY>rmb#3`m{og~s#xmBq$aIg9s}0ow%0X!tV!;NR~xXh zFV`H46Sfi+i+xsZ!t`ZU63SIZ%n8t#S)qN-jFvP2^c^(YS^r8CTK2mRtFjfF(I&NQ zSD4VU-+5S-?Q%2Pq?YZoCbaB#A68{6GNWZJ8(5)TW<;9+4Vo3&rDn9G32Y+A+h4d10YNm}x?r-0|i#qfKhrW|+_>cf3tEqfKhrrkT*PA8%H3 ziNlPR^;}|wHkG3pK21J(BOuR!wi2H|FgKhY`<(V~X)Nc+o_2}>P5Cmr9wGDbZB>_c zf!BeT+9_X#&kk*lMd@q;&G=>d?C`8KYPkZht&_gen6wCFu6ashY5r-nT#kZ;&-P`1 z!ct{{B>(4@~dq$7tPuh@Xj%Bfiej>2gi(shR zn}>AfXlZm@7o%r>|%dad?=#}%X&KQkZ=*HoAare9IcWkt4HA>Y@~_yaCk z&lOfHLgg3e6d)thcys4Pb z^1YRWH@W3|(~OtAv6#^EjV9quz}#XXp}t|lOQEcu(DEHk!b?(nPAJ~%X1qxre}75B zo80pK*^D>Ie=_4u^7#8>5?+$(dP4i>YbLxD%InPWEc9EiCgGWdq)cTA ztJUunGulLqK8w=5oP;--rTc>!Z6d~=Md@Bj!kf&}{oaf=$s_N@B)sfbcB{Sq3mmTj zpM_h6kHTavn{}(C`)-ye0@=X;_CB^wY;ulNO^)XEQ53)H4FLw~uugQxj&4Wbypo?^LAJ-6d13 zITn_vPpepl&N7LmdrCzVT_sB_E6d))3Rc&)_THYxNGCojmHk+sWATLPAp_!S_Qmb2 z=V^;o;YkA?Q|@J}9kA$`Pbg@3%W5MAo_SKqv}an`Ha;$}==}j->h0~$x)v?$>VK=l zVh;`k1EEecVCIsT1>$2V5QEtxTJ)4hb%>4h(c+{6X4-mITB}FQXi0_37|miIdr*hA zvIUmFi-HE6&}-quZIx%L{dCbe7-8L*N!bQ4*w|1n}sYPo)6z)IfAO=P)#ZNy4a zpiCszuMAkNo3oy$EM%Ww8nLo(FN-tp2L)DO%L=?@+AJ1iT7y>W^aC7;KAFWg8^LVr z&60F9cc(_P<*v-pZors`i6q!#~#=ya`S#DCGS{twp8ADYp!UN^1IZGNDk zE%QTx+!@)HwZ_^?7yr)!52DT@eB{yGMKbUA7E;_lDOf#$=1zYk>z%DtANfZOOHnyReksV|Fu|1~|5xkwXQdtcQdO@JQLqD=ScktVfF2_4b|=rAqHbgv$1Qp+UkkS0KX zX;G$o^hoA~B;&qkbyghLA*DNx$aq$=kbUpg;Z4MoT~%q$T0Vst@GBgv9tXwQ*I}BO zme!Ila~!= zsmDwGlBx;C>o?&|M15LGl{-{C{!w`IBADqYoRdcWqAv>Fp<*@kS{XEDjA>yDuw93V zxjYa`+R9~&mS)wUFCT2v(8%mZm~v#jceFsQ+h#0u%LQcTsEVp-{kZdb8Z zbf#7zP9$2N5p4qM(W-2{D%vv4VeJzzi&^!M9u=*wtG6YR_2{_p_b}ND&9o) z|4s$1M>SqI6)saWt6tKfqLCsoY!*^7u171Zc8*mSiiRW6?(8l4tVUW;!Rqaa)U~uF z9UWy{hiNS33$Shn1QyOQv+fyIJ7>R!V-^cCZzqfLw5d4R%O6(dY1MEhwLC2Xrwfnt zn5V&v`+yz-zon<0hZ=D%!B3jQv zj%!T9%eHS?Jr%fCp!N9K5v@u5&a@t@(&!B?g8Z>YMap({v(hm&C@6Fa%pVDCq}O3( z+e4}>R@BvcOfyi%Bh5-)TqThF?SZaf_mGEE|0#dD6tvc8`;wkW zXq#C`$hd4)I*~7OwAyG_S1L6{##nPK#`hNl7Cv!|c595bs-IuV_DM%8)X%3xrEi6q zI%(!*O{2r0FWWCLpr$Km#^b^Q(VL8z;)7@zBU;R7*K3IX2P^G-1+A+$q=+opuC!Jw zd$kTvIiE5Q#Y}6{YGt2iz{A^(&4tUje_F|#b9HD{^i;ZOFl1aZi`8L{5i6-+6Ny!2 zz?uNNIg4^t8nGs|Tonea)=6!zawAsuaiw38)PM$cnnyRTdr&LSQDTJvMSfr2CVGgqiKazqQ^>}HYT(m zUS+_VfcCPOdq1bcs+{EY>q;Y5lEQo<*RNs&R`SF#kyuw4u_m=#mm9E>JK{u^>$66z z?8{}brWEP1CVBn3%z%|ttO*^kG@Dek3v_6UNwsR;q-R_y1OYF3=aaoD+*IJz^#W!yLBr0MlnVRShZJoV6GZ6Mr9Z?Tx%m1e5I?dt1jnUFqd z(RO(Pi%nHo_I<0bl}{m@rCr@Y7~gJN+7(_KXzLC6lP1T^+b>PoNTY98FqidoMhKTI z-;$ax;~tvEuA&HtHU)7>k6#5eE!-1{m#f1=r7r5~MFF$Lv#8M=1+TWNHyl_Qh_uvo zCcgwZ;}TjRN($m4nq4NUj1|?2$=0pYSLE2F&;8C*`z+co7dNh)+5P~|@`@X|SCVSs zxL5Irzco_+qS>APmPkwS93{vO$CHXj+099TJBrCaNWYpzm`~`9?np$=CWG-wE)APl(p(dfd10eYNbMV z!||_*NBpgk$_6K}w)Cl=OU=>en|-{-maS}9y>^{%@sh^cwaXgTtzK*RrtGlu6+DXVJ@XR&h~e8Asgq=i$!rNY9xtexkJ(ykdSN&rHXh!kW`*I8inZe;Gl9* z_mZUR6)*ngO6&0J^CdO8Psw%qPGK?5u2c6DMeHgspI==yzp|=YofieYtZeRF$d{G# zs;jw3Oa0|rQt4NFmtK#``aar_uG#)jpe?dFzoF%>{};i-62wos^!^om4+vh0m#V)IeMs<}Exmo< zdrI(9ymaaP{v6YL34CvzCB5~)IeCuht+*U>7H+z7aHq;&905V_ymJL(lXCGVUH#dL zAz9(3D_wfDUVa8V3PAkT*sFxe|I6h_279{@Y&%{m);n7TvvhtSGxSsc)eKg zFh=~OOYaKsRh}ii8Vs<{gQvfQr$+N|y7V3g&r5DW*@a;%Z4+gqyB( z>5=TRLhvv~{G`j@C3vZchhA)gD_wdA5ikclpLjT*Rew3J6v6;*y3(b$24Nn-!x-_C zE`K|~ckfx!yAD8q4W9ki^3<&I_dIxx3chst`wIfz2hR)F@${_vUv3%JYTR_COOMvA zLhzL8_|lbkE_mv6e5u9<&F>9@hj8gimtG_I+Rl<*ITGv!&v(VnVTwh1hrsiS;7eED zQwVqiJgn*P|bT z=NE!6UHNteIR zf~Q>YrORI*;(NjKZ#uqo>HPvc`*nP&+V@Rl=t=PWdL_>v;igM(KX{(e@uf=7W0Rzp z!84r}Vq8}9{Q~f;5Pa#%TZA;4z_VHKA^EiV`zCmPaF+CX5&u8H^O?19;Ib<3Rp6PY z<4aXunhzEV9+n_}($(L$!1u$mq<1wk^q=5)u92r^mA}`(^PY|`RsLvu{4sbgqKx9Q zO0Nh!Wjel8>CHqM*9#t&Ab!%7cPaRq&ywEPk)amwyhj@mTvqw}7(C7=c`}hsX6c` zU3xEr=N-Y9E!d61+kUhgZo1N?=SG+#02v=QUBs6zz0ZMXu8uEN{kago20W{EeCg7=2|S%T zzEtT^b%eq5q~Nn^kGH_{$yw5yjRu$+#GbGN3FDfMJ6-<14W1thzI64s9r1q#o@+ZP zHLkx;mtH@35`r&XdbFSZ8}Pg)_^iq+ZGtrjZo1N?Hw9sz2G3JJnSL;x63Z$32Fds&5zW-MCky3L0?#C+?r( z9>Yz|)r-3i_ZT%Dr0+4@B$i!AT@TaKF5J6u@5Mccdki<7LXP1k&F>g)%1|%vKHT5K z{e9d|;%@jXRx;eT7K0DBa^(oe0>Vsj?Vb&O+!D6mFVhwr8iFt4#+whM@8SMF?lIg_ zIaqL);r=S_@8jN!dl2_KxR2o;!!1?dFK($4e{oAy;DZ!8h-o)w~yfB=5_c zJx!xFY##^4OC9k{lW4Y>1?|ZwPvDb6r>+ZD2tL}^*jUCAGeiZusM&B^vNObtb zFG>OjV7RABYZ`w|-uWAfottl79~*Qw#TOSln+IN$AKP3706E{=aD3M_a>sGG&n|Cu z#7pFkQ}GVF-0^X|;ds0cZby9U$FZY1vDcjgk8F8TUR<0X8_q#W-VMbCNGw0}-@c8v z+Utci*%K4>HGM_yad?dj;&IF2qB)E@HUw<=Xj;jU&S%X> zv)oiv_l9D}z>ASD$+q=!hrg*g5q4IN$+J*bSIS?ZcybLIERwfo>`?4syF6=+T7m-uN*0d zWo`ky=-^G2C%nt;@kp^fbRk;Ad0=s|olwyT_IUZmn}%brxFU{3Lr(0&DWR!yt;2P{ z-O()bwvk*HULmpW0(`SJy8o2a0? zb2%d=@-FwlSR}7$>{*mv*PU25c-V1EN zv+~f;soca4huwR6hvUvMV%RxlFa44092f%bwGGW{kg1|gRclz2#OoZ$Uuo>&f`P&4 zui`uH@?s2TjhxD%kjl8im#+}n*p&5H}5($`sm7)rm@zkha0UU*XB1hSB}lE zb;frTJ9gao`JepcC%HRZEPph9;`4oIBKgqJhq;MJuHAbKSv*5LJEuHEf8<6thMZ%~ z+NK8Nsbo`G1J7cu8{Q&h(R(2JKs=lezV-5L&O}$YH1xlA+Z*0DHqTBhIpo^wz<_jn zpV(0xod&!D@A87k#quZevDjN>zjPvxvDeGIZ@mA*Ezb~Ntk#*csce(P`!9xkF;zq` z9+fZ(?_NI>vm<)PEtKVTh|5b)>lh!La7ZuUrq;4cd8{5F44@v^qTYlo?^WMWdrjn*z8ofAnaBQ^TVt*tl!TgS5D_OhWA;E}96SZ^unDc(GhxD%X@G z?00$(#;M^@{jOLiP#V`aHOtd5>`I6qVfpgVsGXWet|{^kF~&Vtfzh?M!Rgw2JMNlU zo+EJ0@{9~T6<^1ek-{h@^vEOf(a{;SEP=?z$xCu~vG-_vL$TYn=Z{FQ?RH?3LAdPwZyd^Y(PM}8&`V*)EeKJqb36rdj#j$VN5K}Dh3<2dUXmTT|IS)TVir&X+V#f6Ae(A>0^_eh2pc>sARPPiQd zPem_=(;d8Xnv^RqEAl>$dT~eJWPVI3B~rYr*o|UQwu+T(x%LF8tyW;{4cWabipvnG z)OFYQ(1J8a#vU#n{tx7<1Gihc6j|ghc$ts{`4E?lb-Q-Brb?T3Y?7K-bx;A(hvRv} zG&gG9l@DI6Pj<6-G_g1^Y`yP9!j1AR5J)1MniA1!)Qp>Ynw;0r7~gp+zVlV7$v^bi3*906vj}@oamGC`qH(HoOekP;`W!u`-|iKC5!~lcz;p6zcAik z5bu{Z-t4<&*aH;42+%Kg(S*ZYw2$O2I3#82$&se8vWGyMD#aJ}$u))Xg&nM0PbWs* zwFPeK)+Ok@@-ey2F0XRRO^(X9&>n?yU4FB?qj&+_rSYD^cuz^Zr!3yHAl|bg-gBdC z?^Lu)iM*;9otvhJi_n(&a8+T-xzUF8BfmkeD{YAV@#Drdo9w(h#_LMa1SK?K?RO3Q z29+4!SnS%nG*@0#5F5<(4sEVT+&E3HD`GMU;+|@xIeGD>5@k*%sX~drgT*g!?QPDD zHx(j7&GEXD19c=(N(buv=tN_pX6><4Inn6|qFEqb=SL#NNVfT(L*-H{maqg7QjQhl_&o)y|;2-X4rM&jP7|mkD_&we5>9&5tjo>7q4Iel$N3r*ZorL6&v-a*QLk>vDb4WQ-cSf{2F!QPp&jN1%GlR?~dXsa3fN2 zd}|TLxjX7XsTNS$uD$1xjI|FrE$hEfUWP$!Ux;EQ>`yBNh@p5nu>&Qs{SKs5=(_6* zG#F`|qwQ9eBo^Gw61&}5`H1&G_zEhYYwsfoXFTD2Eba)(vx2dqoY){lom}q$*8`7) zUafq~`+_{o((fuRKm{$JY1S2^6$3I9n(H%OFt<|_2W_ganHOq5Y z-cR!*Z_EQFNNNGfRfUylfn4Wy?VWXZ(+St!t%!2tEZ5$qT+eCG3-Z(Q0T$sz-EkYm zxV!FT^xAt?ow$A|`soGs=;f%7g2rYc#G+EM%Fh}--}TTT*F!@mU-0gW<^}IubzI7c zjg%x-9mhOWD8GZLs=#&E3aSzGZ$2B93iRugyKuXu?U~2lg6bmWK|iD6N2;h8(ex9Pfe9A>T$e9V{m# zcG2#QzJ@~}2|HgQ_a#=`Stc)Z$kQP8G&b1|4m{Ny^?8R}u^)oZb1<>B6dR%kSHJo2 zs*|q{y}$tzE_rBDDcCwwUgGd9vD@|?eFYi9M0ZFY_Uzm0l9xW` zS^7I0dhpQ$2#}xjJpSOn{p2UtoIE=8p-p~t=;&p(M=MXnPCK@g4?MEDK;F+9#iDDkkbM0Mq2qp3~J?9x}Py`W2 zyzUhiQ1?oM=Xt&iV*6mLdk!*ZJ|-16lL(@-;&u6>PI-}o5+D6zyv`k*HVe&Cf`RD8 zwi04OzU!`k!c4x=N78_MxC1r$RaApp+6fmQVem=^;hTcLInuRk4BZF!RH;ecQsCKA z7^%bb^*Q-j&!I$p0lMFVkN@_!zdiZd&>K_GkL87S+ekboHdI0#^WDVK67TSq3q|*> zFSI=oN1QQ0nY}86U)X@yLV)l-L`+!j<$Bjr_#KP4E+T&55$<^L`Ok?tLLC0 z4s||x3B}7p9QSCc_rMNvIY%#Nv-p#qC)UU}6nK^wct+N6p^fNB&Q@CxUn0f!69lCa zeNe!pKoC^{oC6HU37ipz;|31RmCt&Ptd-Xkcp8Btgu}Dp{4*-z?{K@N8K_0>f>$Dg zFieMN$9&d~--eqiw-6nsNMb{n2{3)7&GJ?@mRlwW-*D(Os?!IE{RrqKf>yh zUxVmjzx=f4SwpiYRu{0AKNUywzZqX>7p?!+sED_l;+3Y0HzqIqm|`B&#q@sQian25 zqf<$khtw_4m3xZ4A0S6XuCM$AA+85z(MmFKFzTf4{lVt9kJ7dm429kg!YZQN=Gfik1lWbLJq-didC=_ zs~{SnOp4C-eiUx-yc`=9gXoXwy@}QNtTr9$D0-hSmxaUNzC4NB%|~4__r+*@YH+tS z4=x&4ZfS)|^Q$fdNMz{;c?cclLe^2f2R9bY#l;SENjob|<=`-F5J>RlLO)}K4|6iR zet_Sp64=N`y^by=@W*gZmF|4=YxpbgDgImfQ@;+vbLCsjSO$tQsEgz=x$xf+ASG&@ zl_#)!cn+Pg6m?dOR&~>Y;fftXg7?_=Ky~*cWEnCC68jONsJkd=Ra|?>5KX?91#HR@ zG9kt(DFtt(Ahb|0wzWrc-M5Ck4Sn)K*WQI)nE0O@gU~gCL0kyTGTbGu`+h+@H*G~m zs$6?7@E$=<7VPXnB1PD7R>e-`My`vUvPG`(z9*0DYN9cmSn;l%A%}P0&NoJj8E2`&$+@5=F>pbKTo7@vTtL>24d-GjRF#tm<+uhmqXP|$x$Z5b zj6Eqoi#fi```FGY5Go)O(%u52KwkWW-LpS7I3;#!`j$NJlhNnpF)Xts{WL$0=0eI_ zd_-fgd!LQIO7$YwMDB4qcE4)deHuvrh^oEEoxl4v+x1wAX@HF^F1~;&&>ipEQ-d<0 zR@}fZ#hOz9ST}ZlMbPg;xm!)G=elbZ)*I}49mw#W^O0ewWBTNmS(k#dM*ahH%HJ%e z{v+RYHySwM+z&SdC8R%aB606MWGE45LD3uJ1K;-SJB&fOr!T(H8P6GQMQ#d^n?7(; z?kGzIM>|kQyLTY3u05-`)T!{W;AKP`VJQuaMQ0$j8lIY4UI*uSMihCWQ!e+8M6Pvx zZ{NUMky)`%awF4XpV%Vy%CXTYOy};p|EbDnBTgGnGoFLg2HrZbuz(5@nNAU=AVTy4 z{D4ZsB03cg+D*sy=fpnAqY>b`_rs6*Uj5F8X`~EafuGB9=SjEVm#b#C!u6lHG1()T z66U%{b-^o<9cwZE=1Lc_K}wr`(xpMWIq(Q=SZR)OH%FavpHtpSx=)fDwmRgRd{j=p ze5~`4d(l$!e{(SnvP9R##Zl+{U)&8hA9nHop;MSRqsTI~SmhvupO(ZoegOB0Ts!7u z^!9y)-l5RDqc^C{nb;#!OJdZ_#pGKc-{6oNoI>A{s4t1VIta1GI}{;#rZ6Wuvtdm$ z>l_%mn1zu`qD$D~$D{VBBYuYiio4Og_#Mu8*bOD-Eso7aiKttyJJl?-e03kk^XRbQ zVTkWe?=6ndALYa$R7Nx3Kob2_iR(N27~b9A`W=E?10(p2{m*mwl@4H9r@yW*{}+A} zzo6X6b;m{W==KHjEZcDNnt0u*c%9H?G#&R`6bm}ffW9_fXU7himtn9h_HaS$)U8`q z%a?jK9+!u=<(_;_q{K2()NikRWb~rgsha*7iTY!)S6_(@6^-U4>Wfe@122-s4MmF$ z7R6o}1e$Fqw#u2qb*+U|-6MtG0m?O+5S!2S=-{+&+%!z$02l4jbZ>zLfXh|Nr zQgxA?C#Pv!u)k4hh|12gKtK<3vL5zxxJf{a6g#o6B;|)Qz7&-M^^trazM8Kfn{wb0 z4T>$`Fdev2M7MOM>VkvLS=j|uF#Ai}U6NXEWxAGT`Lz5gxwkZ7|A0b0BZ(DXDU+9$ zRKB>W3iEa~R+CaFL242!2BgNdn1k3ngwa)kkOd4Lov%t>RKQjQH1P)7J>I>ccmb;T zxq%b$PooCixQpebMe;6eYW60a2cwr@g9SA}pEKSEEk@t0cpqxL1U-Co^kM{E$Y~S= z4kgIj1=T_9+o&o`%w3q2yCu25*!vDp+05_|K|d(P#xOa430(KAw(WVu^$=69q7vPh zwkz*hsnOuSLVkvC7Q2g0A$i_6qDMz;EN<3&g`pHIF6v@>S2GRsJ`Psy`<7`6QZ z^5Bkcz-&~7u2X_$D_Yw?4JdjEKO!l04ZMt0Fx*J(RQSu8@FXJ8V0`rc5AT8OfQqWV zdwGt$q#%A<2}&X#i#L{0rl^OaHjbXc5(Er13Q1vQe1LQl5$hrCm(IWKsVdtc@4oP6 z+SE8mx@DVlY-+U4`8I66i@hJoOAE0hi7fVx$h(TsJ^C;8p6Z|KIe_}h$$|s$Bh6q#?jeLQS$=)O&6mqVa@W_PcIdn9ttyPfuU9uGcEDd>l(0VzUg_I+ zzBUFK&$iF@_Ry&r=pZEGkp9@oRMt*bTSJ|LeV@|tf)i3V>e3aP0tWdR&k=qi?0H(N zqQs({#41{Lxq$o7dEVv%*8m-*%4@FjuJO3`&?XalEwH#<57mvi9y-sqFWSa7`D=25 z5Q>^zd!KUcea`a&X2lm>d)L@pdw1q~pM_L51-%Y`cVfeYzIVX0Pd)|FD1XP5)S}-$ zIc6L7F1)ONTB7MpeBovBH5Yj6F72Ndue&s{5c5Ro-XquMCz6Vxi_kw_^Y>U@e8)+YJ(zQl%#VtKtJM;+*UP?g(`cn`2P z!H9_WJEND#+w4#?uGv%rs!-rP%v7kOGa-%;5w)3*b@3a&1!%LXEQp=T-#O($%8j>_3BSUGbv4-aYVCBrmqzDMjsjUW}~U z^CHQR??tA_3-jfZK=-)zZaWUWlIKIz>C2>hMGq-)?OmUXb)v-c45%-7pM^WW-zL{N z5g%oUOp7nf-(By_9koHel)Ll2orRP)*T6<9Hu5$wIFcjnoQAq6*kK#V$%$>tN5jUp zIi(21P1Z+aLuHAD$Gs!2y9#)uLS=tR2Z~%Bv>7fg0oMMdvf6;VC zql|5>>8zzn&3o{n^&Me<#HCC`%MiRf{(=yPCn3*8Zt_8#cZlTRU&1;|JK ziABzwNIAO3wemhh^5(g|GgR?d33BQZXBk(XgY{HDQCEHnaZDAf=!jM$!Xr( z3bOp%&MUFqc@Nej@=;hJ9P~Vjs(jx2B(~(IbC6T^1bo??XU-upXB$~EvQcm@Xh^G-g8DIg#FOV5enTpR5~3g@`2c?vi_Y9mQjo?EV=$o z^1;}vU&OW}c6xfh-8MApi=8fl9$|3$==#{{x&3d&2Ir10KQZhexSD=1hr6B~u*Vx5Y=tLbQ-9I&z*cw+~c~i?Nx) zNdCNhMt&bl4IMM=UhTAFkFwMeDU9uOOHndSE8CRA2O`!|=q`7!a^h40H5j!+7>Bi8 znfHazKX~78#pr-Haf?$PyJyCUA-ij!7=Bp247`O5x}(#vsukuOb%7Y`cT15=QN$`r zJ`p~?M*f6BQ1UbEM@La>48k?=AS%Rl|9Yo<$0<2#cilfkvDPA5mFHxGJR)LYqg{iN z=kJ>Ft0F`|Ww=LY{_1mZVsN-WjlY!Kt^JD*pRt`xtfJ8ZH7DtXdd() z>$iIz9nG~pNi(0&;dlXv&Qo?g3LdrA)36AMaU7;^t2I)Es1-Tz2~{5CR9o5xb>R0|G&B9GYK(bcyD z6SqC$f{6_J&Y^hY$45!uf}MW7n!^hV@~39o7$%WpU6Gj#Cq=|po;?6pD9A9$k%9lcgFhkegnQ?W5WS zbG+$I>d!}M5lyW6x%ctJ&Yy>7V#TsYr^enX^L`S3ANvXKaQHk@1fQs3bV$m>q4&L? zgytkx{mFYeJR9NHz;@$va)Vu7jp8^wOC6rWYXQ`NKccTXF@?qJ-W!`Wd zP(JiSwt7c=)tkFl9kVBz{^WfIO;-1t`E_ri$?Dz|;3w*e>=DolLElMqNCbranCq@l zY=9NX@2^k_ngHF*f||QLsJB-cjW$u7mWzt#v~Q@cBQ{K8jIZ6U=$GJ?=;>LK26LsU zZ1tn|#{|2$*s-1|h#G`4NPZoY%D`LL8-U@&(vF;_=*-F!e1N?^@K$sOXt~i#A3`RC zSVq(!^*>cV=%_p)q&iYHQzDU>qqAdYa-vtW*jF@(-Nq3iiz=EZ|Jf~w7 zH#2MB!(8~0envmIY+^Yhtrn^Y8*$ny4m^@rTn6}Cwl-&8`rkEx4 zqq{zYTUgyP3r`r_-eLbGHHG}a`#-FFM1DqopH=TKsY>N%n45aS@MZ8*Y`5f5U2rf< zVEU`5`^Mmgxr3s20Ls_P66?NR#xxHhhwW{aB;@^N-Vfv_!V8Q78vhgjj1UD5ng5)_f%vi3^HxIr@`1lelPkOHtF8SLnA&&ezy!40`(!>eEsf& zi(g#HZAW3)rhsV)h0en>Byad~wcPdPGI`yX>yf?0VmRwy*;Qm4q<^#!X^N3is5=H8 zp+yr5qLZ!EQ{>Hd=+rhlo0~cYfyYWlvinOE?246O93+tzj%NAx%MuG-LOdx^dcylj|D}mi>O7L?ZSN;Lrp#Y+MZXhR z@tdF(xgvi11#(|uO1_4oesrrM>gZ4DszcW$jIL zMB1<6L6Lm=ohHUZsiulbY!I5L5=9dQ0}BV!Mn#~Fxgkgw`^gufXR={}}+(w(H_?>w)0Q@%1lXmuQ&F8?)gA(?!x3g3WS#rEgoT%T{k zV|O@70xYE*<8Lv&Y0`DykKkjiRqvEx8S$9zgb>#KI*n!zN17wSvmMMxrr1prJ%YVs7Ie!gg$d{=XBTJL$19;o_(VZ z*WN)`;dzEIQuF)C=C(lIoDZXt5k_zzc`}74g#?5hb_sUaAsP@61_vIAc2OfEpH;4h zR*pgMRSmt@dRQka3pckQE^-af0RW`cYG}QLIW3Bm=sy$RSrXp~t=AGM7>Di8dPzjZ zZUsk2D094j7Iy1**Ug05YfVXf{VaJ+X=2Hl_@eyy!cx}7_E*7=yq3A{`YCC&Yn^2B zURpE6tk|EyJXR(@>WW=}9FQO)FXXB(R4i0q3rY2b4e#SneLdrfy^U&5gkVXQ9JFST)a=HGiP}P6kPyj*7nW#HHf1y*=d~L_W3{2;>5jv|nCp2Dl`SNMBiPyEa z2O2L27j<0^tVVOJMROcR{qLNKimrC;eH1{|qnP-f@{rT*eH>${3>vVd(11bvRi|jb z>R{)T@2#UOVqUm~+6284+OIrK`<0gy+sU+FJDK*YjtvWvf9j6Yn7oijD&jIw>2MoL zPtu%Q3ged#tSzXvRgCrxxVX;izv1G12$1L<5;Mplm9zBeJPpgYLFe^^BIy`(UNl>B zofi#NH+%k!V)Ny#h^49hPy-@eMg1}(86MZJO(;;mx!t5Xqc}Ad| z$MzJb$IzHO5j$Phzw4J}U>w~_`jGqw=@Bc>5ZlDr4vx0nd3q3p{+s2Y*ehRTJHqME zqZ}N)A$IB_=uw8IkJiLaUBgK8VyEWzpNtL79lcgnsC?#^HHbc1$P_Ax`kKS1NAsCN zB~gFT4jVrp#uf!zb~+;-Vxrtlh(T4xd(+iaXk0l$$h@3Yrlu<4XVgqpLMPV4)bPZ^ zW7B4pE|G|I6_0&3RY@shi@oWP7j=BeUN@C-@>K?4`dv`10-F=#gVn> z5vyq3_Kxm4AF|XJyeEP7_UQE|UzXn)t%`kA(@!R#S9#y>zry=b|7G6c{!8TjSAG%u z&}~!dV+RM(fJGo5!#UNdU6&%IV%8$j#@Hvbb}s&(S->1!%Ah^Nu!K9}dD(N!bIN;U zm;K}m@_XKo@b_i;<$)9O5jq#e^OeJN8tpyAa`AI{bo8gOPu}aF@;~pN)30cwFmJVbfIbi!Slg(fB zKp%?dBa_cNy`PRUhFBDSua#vA9-JfXh4=Dq~D_Rk`np-aOgxG zw!8s(C(cN)BL*>Nw9$JeeBOHbQ6VBQMb+r_u}^X$1*oh7DSF-}sky205f+YgibiK) zrFE}qZW5MuOtbZ{lXPH0Yfgv1*twN?PloQJ11g;{FV{yvw*`YN*T6rc1WYMWj{-uO zz_*);#xg8$1&P?P|IgmLfJaqbedA{`Ll|IW0!|@n)KN!`1~8C_35k;XMMyHqiU@`-!h`~vK$#D?t-L{IgTH9Ks^#WRzgeU>6_j;?o_1=OhO0{y))_lLU_C9mw z(-@`HklNZo!VbyUWkW?R>;1M15&fiK&j7{h*GE27KkGR-0vrFaVd!wY zEih3nPk>$m+B3FT`&b+IQD6?5)_zZ7J&LGhz3&V@NKw4{6*1pfoQ=s4s^YMqeFXCs zlvpE!pQmPh)%Fz?gK)*dtQXskJDkgW?jn4JXQzWXH(Z>`{`FU=ucL327|vf9R=a_9 zpqsk6FSeq~oT|PgWU$UP4jY@*QhQ1{rpM4js!OfJe}0M`7*=$3iZgh3L_)AH6`IsG z&qFR3?Q%kIJ&>u!aq(*blt0BAj)M9f?x~`2DW@SD3#u?eEe3Tb^hG^Jn~yLlf&4D= z`gG`FpiF~gMy0G?&#n7G)QB7mEVb_rJ!n@rpI zMcRmc$JE6_x90+yxlPt)Bo1N+ejt(d?1xGc`X?g42ObAroPRqO3m@XG_n{J3R?#H% zm2%wuFH;Bfg1|HV=Rq%};yoZC1fwh^yzRf=ZYh!5^)-bLg~D4fA4WCK&a0*IdJ#^3 zpOF4*HGdYz85wlwS(w1pL(IT5@*GOSpcxo%+Tp0lmdP~PlFWjq%gL5n^({_iZH`6z zAAA<;QasnP3nj`WXJiJ?wVa7SQ>VwJWJRb&peWH?N)srGic7fy6b%qv%9Xg@%@lRs z^cj{ra7Rv?Vab8sNQD<4LGiaKME(%NCs7}g0=@koB}o09p#|yV08xVEfl&~hM0WJ; z0PK^hTSl|y>QPj8Y$0EGjp%^{`|Nev2LD8Ckva}yqSrYA)C&AuiW}FOh!5xDPPkG0 zubO=b7dgaIA$m8J;w9?7BFg%a`HQ|HJKgf?YbyxR|GabvToO|h+MPu0!W_|(FH_^y zEt|ntmsP8`{1gPelTTGGs;srBQ)y|{Us>f1FOV@4+ixo|4Ta1%sjI}^v2XL1>!Ijh zrI3hU6u!op;=EIm}1p%#{0xN619#i6onXUBdd z*oDphz)EKatrMU-*-Z0is8QEp!ESRrd@H2!S5iu$TP;gfefE?x54JAR`&HP~%D%x6 zwB(VEAz5S#azgtv6lDr!hX3^NT@-_Goy#YxL%jNz?UU(7W6oz2)Qt~70)r>Cj7Q$~ zhAUj!c-w)<6jX(aT~Z!#gvDpW(>cK<9&dNBn-}ap>ZaJI><;!&zcW;rh|X&POajpm z_H|KsYuwgX)IuAkwL>+OYB`9(oKTs^`aJbiv2<3JdN{|9=7Oddg80_2vtuGCb<1`H zErrMGp|a!yR`6u({3og+McCBH17*#TVB;N~mT-v;vuv|H&Hm%j9L&I*Y7?xlgsaEd zvg&Nto{7nw=0@7ZO+7#DGbP48bif1@cLmhUOmh}@`i4u zguvVAp^emzVg*C3NtUB^Yd%&OCxteWJy_yV5RJiWu)n>r?}P4#7~vkJntD(qXp%6GWH{tDvac5c}Xq{I2kV0^AH=GxR-+3Hv> zD8+VNDsahIEZH6WmIvz88ed}#9H}|L z4>Oe*@RS3sG%3NEL!$syoUg-|xG{$MxLbrJ)XAW1#+2Q4p-uzn27rpvp!)p6 z=Wul##ZHFXw>DfoTHI62WKds`K^3SygHclm^=Ivnr%dRpgJq}yC(F2q{fEd?ccSN@ z@?J)@VvhQH&qpJwv{y}wv9H(B`EIDb8gWhr5*F6~^zFbv&j%xrhS*pwy8&Vfd<*9u zk(r9qtq^eTs-K`zHI}1pp^O8n1f_T#ifFbl8D0yel}A4~CCKyZ;B_qmI!Oi+E5st> ze@!__fHoeb?iO`J;%uq1^!Okigob+V%I)hKa z2jo4EGx&Q@YDJ>;bt~qt)ubM^pvRVy^lD1Mt9V2B)&6w!XR!vTm8v2aLY<^mI>K|@ zYEh!M3OR+Ntd=LCgt$>X(q4i(7a(DpYPBv2|K_Q6G;6s~t@GgD5=1`H8+N?f2qGEv z>l`2LFJ01zXO{^uOyAMEx0|+5KkL9uS~{$m?7XfL8TY`LZ@3@2^G66dhE#KUQ5B%Y z(D&hl3X?JG%Q;tMSalX=C(>mc)G~S%BR$vybY2NY&M!+26{f2b|>11x@sn=k(I7!^8Nw zlqYdrj_lx4UI5j^6g6aG-fBjKqE>wwKW)HO$aR2P%Dh`}ZDcA7`Csxtk*rIhm(VX~ zieAbQ)JG9&99mG}+sUYpm#|!GgxVXS4uD$BPsgGG5hz(R6Z-YyU-3-}c&GOAE`g z4=U+(t;;8cenV|DKcF)6oU?;^zQ?>h7NXr{X&YJbMvR|A{E<2_D5&$>aoDZCBN&fF3Ihe-=V* zM;RvLRPG6OfYg%NMzzd_XDOTTN~{=+oDTu|x%fSPQTh0BF9t2of)ew`FN0dga>sCe zhA9Vv*2@$X;>k=U!ACJ1!L33c*gS;)amrXOs`U9lZDpGZp3AwTs6cI*R~O26rwveE z;O)KkO09gL0r#H?TL-hBriV({#{UEF)kGu^t+eh-dzY{D$<0c&+5jxUBy<8G&cH98 z-&mpQ*2Q1b61xLUmQ?-9I8qc7D2f`c*O465wPIl;fXY4#?WzBTh! zU`+i^lAj-Z*4@jSw`r-8CMLxuZnW~C-S~M>4bTD-JtiY(sC#<$qc`ECHBPmP#69B6 z8DP+tKtzWSpXKP>01xm<8yiYU0`CV)>(-)*oeK@<1|@`kwi!bBAQ)Dt`uxX1(pBl> zFMjpAw4E5JSY2P;2d}g7CA8!5S~;o*pLgI@>QD6rPC;)aqb~T@Z#TSTL5ypw&~tG| zKDgn!6uVL=j#LE66fWLul7~B&@+GbdnFm6#fFhGwRZtiuZ=#7<)}o< z7u@ZNOv?412py6Y$xg{aPD_6JCgI4aqt#Z(0|Ijz8y5Meq^9Dr@}Fj14*y>_{fgphZut7LlD4rEJrCujyK6 z2_-o<80{Cu*h)#j?&57vqLV>kBuDlpM>0mg$QNDf{c6|Ay4FHGBS$huEp$tuC1!D8 zzZd#_x)!`;M>0k&PTh#s^yf$S=vqIMS|nrCB44Z)I+x51>eqn_7T}+B)RuN5u}DV5 z^>t7*HO^Wr^*3C%8f5+j&VKxK8CuKSD>(w^OmN%=nM`oV>3(^^`2as1hkA$qG;r49 z&H+eW<^gcrk|X@0mvU1hoamF$M#Dd=h3Z0b!GFEGk$N7&y&;LwiW_An`rI|jZ&nMn zLYnMoPWfnL2g_V8pp@O}Z$8qcKay$=6Y_B;WQPfvmXEBKTwqY>XYJp*Lr4BnB9CQc z^86%W0#I(5f+;4>g(i;Iz^Px+u%fMjnsRc46KxG@Cydq@YYH>j%4%t#D}Fz@{liQ2 zFw?v|xr9iVuQd1`?bkTS8U0Ey`8A$py6KAF=kGuDj_%h+i99~y*S*8~bv)xlr}B7{ zUsNYrE!W{{!Oyq-f>(9FekYM>mX<<-FWwI87mX>6@p75`qNdSm`7^Erv+b;_FVy{d zPa;oXzoIQR(S$s~giQ6Ym6`{3qi3R$By zPB9_7S%$h$WYphH`E0q4TrZK`jEu)hP;$&A?li`U&Y5nLU#GJS@gvqiKj;UcudID_F64etC2e? zemjc0hWxBVKFfrBHe`*+XPJn4euYKp~F$QomjYC@*Lgw;YHL!wyx=G^5dB3dl&k;u~`vDiLrEYeJV zO*8qG&N6=kJi&}fF7)bt{Xrt9vtQAvOhag6EYeNLG=|exSJM@RlIi9FqeO#K{P z3pW@GQjayd-;%*HS^)^3`ean?_oYP6Fd=8MR&<(Xn2;$aS}pWF67sX7^ll`V1r#|u zvEXJfGErwrjslLc-JvC5V=QKv{K{sTqkyOKZh7>o|I+V}(Cy|Rx$i=J`oezsl$R#XuA%aQB_gXgib>vSaa)}AK)P!7OLcW+~ zHsA_yrD^UlWD}yu*~vg~7n_i&6)@(Fi%rP0S*Dr*;3od`estM1937P7AW0<`r zp!rvi8wj9eJZft~Mc4U(p!m zY7=rT%RGWBjZ}l5J{dJ?`-w!ZH6hoTkZVoIb66%BS8}`3ez#H&^Y0|`91}7oN(O~_ zjtTh^mZ4URYNSo?y?mFB{DMTj#Dq-KoJMP0VnUwBGOKX4;CJ`r%HQh9A4=qTCgk}h zguJC{j7LYlO(HKhA=4a=(HhH5$TW>_wG3S&{Z1k`n~+zSkef}&Ei7{*0!(3E z^((ba5A*X9xy6J`DQ*mNiwT)ZpVe|bN(#XoD9TcGHGb|I`Wqixz&V>hz$yJs|nf9GI!ug_4Bcb&)%scJBS76Hz5bWHCn@OLSD@>RI)Aj zJ#^o*XX?mqiM-l`yvBsQ+JwCJdyq3E@>&z}l_uo1CgiKW2f0ilUu8nR+JtFjA_wsvd?ua}xLLQ)FQs4C zv3;V)O+gd#btYsq!|>gyAv@l z@>Z6~p(}n_pH3XFhq+K9Z#5y`$Xe0;pRFe3AF~WiZ4>f)zH4D}+_0;a$UinABWn(_ z^N&r)C>W4A9aqAebE!Kj%*_({W)t!)CghtLc_TDt&aBVRsZX7qQ&wJ>mtS7y&Cw5H zoaxEU&Cw*zzqqU-ul(Y?yc|BB(eUhoio)WO(%ka09C>J?@o8yE*~KM=g%{_@qZ|!S zGYV(rmFMTqs>sm}cr-pPFZGt?=M|UaXvaQ^$MuUE>zi7ZG%c=gTin{T%3r^@c~M)N zqO$`nO|6SsmNp39;^mi{1&L`CYhL7UYB386wo!CRV8x0n&7#qvk$wy9%bEiX^>oH& zn=(^y8d?^wT!KR|+j3@3ojDWn5$qKW{??|&ZHQfyKPM+MCzB(kr%HWWL+k3M#SLJK zBQxt)tXvXk26)5*Z7W;-^{ZBjsPoO5rX~Jm;=Xaw;)eRA%_}ck)ZA9T80T*W{0)(K ztX$pDx@ak|i>m8=4gUIk1bD@wReWEJ`|^ghf*IkEM15(?l7_WXskvcslpdmG@Q_Xx zRq7l4)N0g=o53PW;g2*zL~>Dc^UB4-5Nn&->X$XO_}l7R8rHxVOII|s_#=X?4a15y zETM?Ox24Tju39EBkc_KfD#9E3neNa z;+3r}4XyPnTbmFOWWbdzCRNG{CgzfrE#~;N;>grR%|r2NK>9Oo)&|)MN_*yQX2$iH%tfnKHDAeK=CW5$ zB^D`!z|Dr~>WeAY3?a+*u3yr$Vz_5fd=V5aBN(!l2!Iek0-(AQIa}ne=%<>xp7)}k zE@|*n0i=yE0c3_@J?HvpXo!fZ1a4c)qE+==fkc66foSui91ngdQiEdAu!M6%l%mW4 z4XsU$gC9}knP(2Qo={Y2YgMGt^rk25D{;Ta?D}J~(e-CqY;}9-&xSI%{xo7sVhyq+ zu{7jCcBDr`TTy?4b|Bh@Y`vD1sIHsq3C$4uD6{GSgUcyB5vJ13E!tRv!5LWag>)p2 z(M%nJDjw8tLJFmc3lbG6Fv}a(h`b?gMU^&4ra-IbBoO_pUn&|PDw7f_f90wxy|N-7 zgizJ620=4xENfVNxi4@T2S}9k=&V^&|qMi88kl z>BQVx6xNlk^+smdB6I=PqE$s}ENa21=09TXC|;x~FtoL3ABAzbSEHpN>5CE@UCg4N zMskjcY0M3gkjR8Vb%Xsn)WRB4DpGGo1z4mZKRGY$0(Z2VIyEyRJu@vmasH<<$Q=*4V=>5$g`C5UOOzWbJxK0Eca#vwq2wstl4Fn~ zyJW^FR~UmF%~DjxAcrBJvM>fYibrblow`As2TVE>Ui%d`k7fi807g_@>4vmmh=N zkAPPbgB;m!d5m&b#UMxZL01fNRR8@f204nyBQeO4zk6elqw?`?404q3KZ{ZBXbf`X zZ#+#2MY*B!3(5T`MmbLmaukoW80B(fkfZvlA_h6~cVP^2R6n=GAV+q&Dh4?!m!TNs zDF59PgB+F19WlsJeYGz}xj)4y_kN6WpT!_Y?f%y>$Wc806@wg2V~#unmnb(>ekQqb zG00K9dr}N?gqIwH9JQCzVvr+$XT%^!`Ls9&Im$1-802WKydefT3g7Y=C%R}6BL|B_>nqxyM9402TOmc$_U3ObZ^kUKjC3UIUsBuB}~iQYd-{G0GQ z<2<5t=T7i0j9xROC)6)_9CCZ4tOfTu2^i=3F}F4TrZ0GPg;& z;qcCf{ymU+GfHkaybmCAC`xXq@D&5^8_48N72%8fp77N`ra{UL7rrj&uY}AoDffNx zoj48Yfgicy@Th!Dg-m9Y+;H*Dhm0>uZm9T<2i|-sL;jK*4sRvouKfYLv!Ne?%=Rd` z;qab>%=1xlLxpb<@csmu^V29~!Y;$%&4f%vl-y8wnZTGUWf%~b;qZP8xu5?49_=-G zFh;!7)6vG^M{cUs%LFNf5Hyqw%;L!&p4rK^DYR87dI~~TE zMh1c#4sREpWkcp$DffMNlV{*-OZbr+4)4!+Rt%ZbvRI5)P=^bj4>F6T+;DiG0A>Yb zDzkqWF9?~Nq}*_LZovFZ$_T{a?e{d~Ui<;PqX2meGA~~!(7w-pmW$9A!;jo>;hTwP zCqd>CDffN#RSRU+{{SAf1Dhf9c?@`Q@O(T40B*SOJ&6ZNka;tQ#gyamkJGnx$s+$E z!J{jM`{rEzo+xftmo!`!Sn4U#o+N;{6>|4WSqsaV+nE=@-wv6p^MoeJ4VSMvA#+QV z+)(w#b|lo@kf|sUc#(Jv5x(O}u_p;Xa>IqM7#*jxA=6STKB&1A{R8~S4Tnd~!Ai*78znbfKK(6Zo{o|mDxaPLygn&I{*oIG z?^DQq{R4Q^zaNMZ&oK{W9Y1oz#dj8-oh4;h5SQV?cLn4&`~V*9+Eio2i<^)73O{ng zh3`W=NP^727YI4(cMnxADL;qmg^YF`s$5e2eq#)Bgm-HUa#YUm8cJ@6{Cpqe9+R@e z#rHDu+o!$qkY3&xPC!DLb5e;1vGfu}PzpVOnH-)o;-{->o$&wlKst+_DpnZi)8)ze3+dSG- z=f84Q!{ljG(x#k0_;%%G%iHF)HZ(UZYHO%p;h%TelEx|EWzZR$u*^t>vhUe@#PzhY zrp2u*+g3LE-N{wwxGPrqn^rVkg)NKjeC!)+YHmPs<`onvYa27BPhQg6gzXBGTNbTo zP=Kn`m(|QJtgkAZom*X6TUei8QRc1i6-stquCH)*X?bCNMNyHjuv(c@Us70FTvDyn z@xS`=+_FMRD>dZ>g;gwET~eAqtGv+Xi{b&aw7RsS9ADA)7FPN4t4h7q^>Yn(a}0OB z(n|`#$cqxyXcE+DAy!>gI;*gv2K&~h)-3auVQu$1r`B}x|tJo15z4HSVF(ou#~FYy84K{=w>Jb8Tk<- z5!+~}!5jo;kPOF1Fg4>K_$;K|Yf9R^t`aeqWe+zopSPm4 zygCByEuB+1Tfd`c!t|uc5B1yfimI}DA5yB2fyzqDqwjL(MBNpY7S~i2M)_J;UJ&&- zIvSMNGTV}$xwXahvn%QftMZY#qX38x(bDSN*#>T5Rc^6CPGqR4NOOcmETSS*UQu0& zh(yInk55@7F63Qletm9v@$5pSs0MkH%T!SXa!b`*rKket(jvn*GAW2ANtE2;Qsj0a zsu;{tlv`Fhd#(h8Q3a(Ns-UnIA*^Ru_7xsgmzJX;hkH>1t0Z8 z85J;MBdhD)YmCD3{E7l9X&NKHV)pF9e8Ti8QAsgWGMJMfw>H}Rxdlk$>ba<|IJi^= z(~lf=Gs#8s=$@)!P3HgRelXtu>pglqhVTr&AB;aZ{DYqlzW;xf|L@ixj5qlHhr&Nt z{{O!>=AZws+hcJ4AACPJeuJM6z8{>Q2Hy|H`=RH9<^Q+ue<;5HN%(wJA^zVuOPtj< zB7UTOlvEx)#&O(O=kQ2B^qe&ZhSwL*DeB+j2CVDxlzxNVKzsKGhmQX1yTri{V!XG& zsL2so$}wbRqk90ilknSSWdBEZG~^ov_;|$)DxN8<9O6|n;^ly%rXybQg7`On@ybG6 zzhP<>u1A<^$Mv5~ZN>E;Ol`yUbEdZA+Rs!suKSsK1=mlR`T*CDm^y^(`%ICa?=h7C z>K&%spx$IE71ZlY<$xk2gb&nRG0?g6d&v8>nZP+79XuOm&0W z$Ncj@LEX&MR!}sZ6|ZaqwS}qepj4*1L2YL06;Pc_eE{k@rVfF+mMMC>a2-?hQM)Ud za)VmUR4OPMX(N3>tzyaxY6VjZLD7Uzys`=u&5*<^?VvDU0%|L$MNDl2Me~dC%63qf zGSv-==APq~S3uP;^#Q0VrVfFsV2XB1&t@tCR4G$#P_#l4ucU&?XDSC&4pUxG7c#XF z)C{Ipfx3XHc2G14jqrh*%G5ScQ<&NgDute^#Q2UnK}fDrmiqNAAyM) zrV>D%z?2&lO$Z@;ppIuM9ilHFSHvqBpeWD8E7_pvQ=PCbs6R7R0BSr^CtfK5bsST( zK_xJX7t{ontEQ*Sn*)lbH;@VuIXc>9BJ17`Dvzn3f}(thQ~*U2tMSUCpzwzue{z`R z_JZ*(%l#45*GyG*jls!xhtw8FT6f33I`wsbqI$IFZzEEUI-lw3y4VujZL#)s> zH3nzfrM-6Kuv%~n4txo(yG6l)bOWlAVGo?IzOL>S=jC=;X2b2- z27BUyyW={#1D~XI_m4QKJNWhhz6^bQ*O=fJHk?9k3$J_ZU+PGFefd$f58t|;+lx^1 zZViMFPMpns5^m^p9|w-+UT;Ha!;YCdYinw1jvSC58OL!m_NwJd<#HuNXX7R>w|PVO z@G{Q4a1%_Z+(wm-62ifpUh;kWWVtT}m@33apFE=xI!mzjxq=tgl#< z5tQJHn!S^ zu;9e?YzC%}PTM;V`m<}*fTK>m#)g=lsK(2)F~osO2z_vmE%=2c@K?3WQK@}Z++N>T z=pa0tXni97i8!1eq3BUDUEs9XOcJr-lgeE9)b=~-Ar7^A6!z!%atc@AGtmj&<@Or! zkj{?7(Ioo3JXk;icRAN(W?O7AnO%x*d{ydT?C0Jy)(AVAP_7X*w7k8uvinMUV z03M68CFk44U@8Zx?i#mqGM~AhIZ3R zmQC9ivcqRO&JgD$gi0KoamPzJLLisTvN&fJdHz&&Y^692DUtyA3V1x7pg`y8I`~ve zJpi@7$H|y9s z`vyE3ICcGqUGxuS#8!o)J?bh^Iz+ajvVv5g(qIj(w?XS-DC^m45$-51+6fUw9EjSq z!&z_oQ`J0s)*k;kS>O53%sSdSg3fX5Rr`FX6-KK`8$wBA>CBQnwyZpR>%nubvR}G@ zO_T{Z;RqP3y$p$PIDB36JPtnXuJd3YKl9I3%j`JQph~S#)VSKZw8Lowo%>d&!;3OS zbv@BFx?`XJcskV%71d@(eAj54Yk=zNANZzz);0FFF`JX(!2#L&622y$RKLd-k8M53 zOTGM6ee#4FL~>U75q~d-C;0c&dx)F%EXw30gf632{YToqtR6Zal+NI>Yru68BaPs9<6fj?UN(hg=FRo|yt z!x?-Tvh7(o(`gS8GZp_?T@#&;$HfYtd-wIiwXGaT;FXMt4U&p3iD ztK1gAIgS?X6fBfFU?w;_Z-pY_o`_QzUsyBZ3EU|tpz0|h$4yie`TQmIeSa!>SM+_} z`4jh`{uVyI)jx*hCkRf~x2qi#4iU=!I1wf1byJaJ)gpV?k&Mu_o?#4~f8wR{>ldKl zO-lPCXXN0ssdUs#0_wa3L`a>`XQLvnaD_qlke95%YT~2(gSj|(7b%1j3UqvQ4U}4# zGM;<9R1#duk8pJ|?-pDI?>C_8@N;oRBA$K};nBjocsd5HvY;rWv|)S-=<`#zl;DE_;%7^IwSrljRQ#?gL z()o~sx^TKu>s@ZqP6tTLM2k%krSSnNAs9(?9IFBBjfceTIKh_KE)FtgqL55QLm6TLL4gvS-Q=+Zza70f>7sCpB`^*Kask>+UAzOo0CcebI66;w!^ejy%DtoE zJ6X|nU=tofGJ(<;2i4=WKzQW|jhl}+rOIQOK)R?GvH)i-CHEFUQdHeP2Q?pdb19Q? z6+Ak`WC8Q&`|El;Lp$rJn`xDOt$C2a8IbBfIuAQLw&Ow9*p7Y9j{8C3C|O@k9ZthN zn&5ZrB&DbEQ~Dj^-w6KKek?U`VpqAP{n%Rni1uT10>|y749(Aid*YnWOi-y(`UAXC zUjJBqzUP>=%W+QHK*u}&^nSa{7h9c=|Cpei4wPmH^~NQUE@Nj=s?a# zBa_y>pf?%1^HIUdXmHv!7iiJh7anzO>tn?b52rKOc^}k}J^T|q$(oE{}&WB%a zwD!PO&K=)lte2^(5XNd`YdLrI!C-GwmYUn!_#fGe#__tnK4Dww_FBRAf_F9)YMhdY zvl4AtJ=fTRdk1>cUc(8#ckfnrb63d?O>!uq>{^ATeW)MMPkMNB4jQDi!{JRggFwyY z;ChTsiz01x(^jz6+pfozn}(`ziKWuJJR#Ek_5{)K+ZWnI60)t|K{`EuwOJ1tx~6I` zbh{GJpX+!na0LBGM^#GCawR;+;#-b$wFDvtUg+d7W`GX*bopd=m+CEbY^c^I4|NqG z3wC3vQG}ht&6Q^0M?ns@g}eLe9`Ub-|DB{@tPcyg_-GSRsgb1x^;=M)dZT)u`tzcv ze-wAPfepnOO>5YOKK1R+cm3(;FZs_4ZzTIk+xgu{kl;~YD>|>g#c`L`jbxomdqHBz zPZXV5L_>cO6dD*E2S}==@x3Iz(#6WuI`*s*N73e>Q5OC0+UhFxZMA4lxH{2Ng?6hF zwE|5v$k7LniYQr%ssm?Zv^&Ro6j>#~C(kb1V>@*;)p%&Dg1r{Yf;sg(?!hG)5W*BC zpoA$1wh=!vfQ2V4uoI2LwBhg6xx9x2(8cZGdP&y#d3d14BO7(lCZqNYw87^QYa>OX z&WpxQWHj}9?mN)of3->K1a&utYvHvPIT2u|%(5?VB&83$4FeQ})+DX3bv^qh`&JvC zrJ(fIiBp6)9gtr=b(K$2=s?ON-i}fZ8E|&CgG(jU8MqQT%dX~4az3L3yPpmooxEnL z^YP83HQ));zrLa*H~!%?BQcDoDFy_a%BInC2vS`Zlb}5&L3l&aLI;v(U^rSbrqDM! ztL7|LYn(>w|CIYyu^^l6QgMOP6B9RiMz|S@5X;Ab1549{DbKS41ev>0S6?q7YX)PaFLpq{6cnq2%^!0I&WVQ%EDT-F`>*D8DvV`MhhSFZjX$rkCQK z&%BNC109a#R-a?z2EQFx;E&sUYG?PQ{xQL|Hj95meOmYYUerVhYTq8@nQlwibxs!! zcJ`mZW3KjNZt9_o3XJY5v54&Y_x6m_16I&kuTTvZvaFumb@4z%aC~t0K-MdJ;*>Q9 z>USc{%KYA}S5}X1ziQz0fNf9SfTD3{;2D`j)Il$BBbbjy&R}SQET)rSGc#LS%i}>eaJVd(Yo&)~mfCr|PwZ>Tu|$Jyb!hGz^TnLYIF!nfoMM0+*Rg z9V&M8&o&vDxYJ?9Vz#0`g)HblllmLNf|@ZL5ENaH&JMI6Yy~u(JE_ErvG=sBse$pq z{kC8a&O<{)Y;Au>mu0^5@oCP-&q?_@P>5h*q>RZBu!|z>DbeinBJ7FL>_lddO8JL> zZ0BLl+t-dnj|2nqZeX1Qb0@0#vsGu6R}Ho!K!X$THFQ!q#LegfF58$|zFMl9_#SR?un@=-hc2S>1WzRQ; z382WJC!~C3Ok$BiiET(?kwJ-VNaF9!pn+N>ZC70ODt}(K*MCv=3jZ0|W&TsM7h`~x zAIL;#-AMGl9PSR_&c?Py74Me$p)Z#^0D_H~ioU!gJ9376%IrzFzkuuXMWASG=u$R- zqVbQ5yHa9MP2slvgEta9)+{!Fkm} zAV(2}0aIn_qO6DjK7zo=yoi8ea+n56mElK{-B>Q=&ae8?;A*xD^%YLxF12~NmFLHZ zJXVHmXiAGxL;1DrNYZ3Zh@9#@kv?k(F~XvD$0=U z&`IzvI7TZZC8axyTC#xJl}>1&>i)*yl&Rjs%Y5yl{Y;BuxK; zeQ|_6B^bp>cf-hBjRUZ$j&XKAYRBXo zm2~w@euP}(~e>)KD1fNahJge>v%|dCv46?O# zB1a>4&`M))OpcZd*p85p`FL0Z#!=c)WfqkIkbx!JkO7c^CEJhzkbz|e_?`@mV|x+# z&cgw%q&`Zfh*V+d>EgyyB~0m!t{Kt>F#Vg=C#=|ll8L$@*H*_pe6}R&g$rq%70OR? z1`8pO)kk&Zx)hpYJe9^_%IhEX932rZ2qt$X_{aC*REjLNV#2Yo?I@h|si9ayS3GHGPq`7!F6AZj7CC|#}12s^qlqzZw~ zPYgS{LKfAR6solKuT=9rnQLu+pIVfiS(F3t+5+zF)2zBDTw=p?l_%204;2*%a60uS zSd@*`&K$M80QoL#>kivCgs}3HgC*HuQH}*iiX%HB-DO1pD}}C3RL6jo0HS`whu01a z%v`WxUpoviKQxBR9Thk-PGAgx!mfP)$AF_eoym+}(L!*z`NsD!_<@phN7-1_XU}@I z)q{cA<}cB*90zuL$XXvU9()s{E>!PjN#XQS&WE43mL;aW)_HjKjQ){Y`9<0~pRpx$ zoe;jt(*3b5?sniPS>J6wp>53J-4<@*_E;44t*kd&Uq?fo?%Yx1XzY9qTQ&0C&K>O= zb7(SnckqLeU0X@hJr4eQx*YMCiT694&+KdGZn%O4=rKonAdnOI5$x;QKpmBw(3r-) z>qJ@y^Yztrs_7{ac=F;01|Kt=k53(^r2?sZuC>r&Rp+ftHG05kH7)dKbytfY1Q9%1PR7asa!Zt+wf(Y9XaW`Tu zItmjy2gu%(|3rtuNn@AMbWeO9zg!bzC!v8xkApf1h%F*J`iPYx8#oO}F16C-e7G{9 z%DJO^S~XoVoSi`d_0%CdHd&}r_(*S zv*zriwNMIlW%v(Ky_%P0)f5^1KMJqB>PU>T^_mNTaHvi-*DlA?tOMp)l5-4VCXi%; zfvJ{_ZM5!%!uZBe8Rkn9j=YVV3Cst)zfcv?&@~#nB{5=<&SsnD4fuU z+4o)D*Mi*xb^_S0Mzt`Z(OL+bmQ7Y>pxjtVN+l1IW{8Pv898`$%}d|KPmw^9sT}D^@Lk07EwtYOKBe} z)1y=L-_<*IcHWI}A3=$yz(orEWbw0e8HpE~S ztuSe|)}HP#Xk#M?cOj53+{=Nm54*;q){jGlq9+kJ4F*D;FAda}4;l*qR22GPGa5)m z+inW(#o+9DP}HEi`2HzS@yczuQt^ma?!r~f#?nf>80^syPYeam2lY71y#$IDeBzb2 zKs^G=rF;eI_sn|?-apJ#CCnrSo{gY{AAV56j~hVEV%?vD@-np>l<n!YOocFmEW(I1HIY|86CB#z?*i^7i!7aPhP3( zmjOPrWmTx9VD;2+siMXno>jmtS|)=L-a^yTX$LDqEz1P*Gc*f~+BWkcTK-&}Bj+n8 z>UIrYYqN+L2V82gLn4tS#iXt@BMW}-j>faG638+FYB|;TOC@LW0sXsz>f)Zi5FT#5!LVX;e z;DvG&cfwhC9;pZSBQbu#swx&D)|V*$GqAdPDy^=bC~`8}8S}_v(8SZce34fyq@D~I zF&jpB=>im2)HiVG^#T`_tWCA6H(n2pT9qF1Ca59m=!Qx#tJ_O*r_coswIjP1B6`@R zS>g(nB(NAtAv-PfuLv=0-}I?-UA5{J33X}R*kE{g^)ye%kD%Bu&J>5q@}A0aq$XE`@3o zYHs3{t3mB&svVSg&!H2Pkoyg&Px0fX!-WU29l;Gt+`Xkn$CU+Ws zE^bOi=c1}%X`p#gtCF{}d5KbSS##4Bfd-}2k0UG=13^(fggjbxj7-G5^!vCUsrYzJ zG(p|L1;2iYsH-<^g`n1;+|YrW%Cy72&<3X-;!rY^bXqxev5qFOxZ$lE<1VE1^Eb4P^@ zEm6;h@%5o{3=|ji(xUod4k$rtn^NL&lUfq;O7>I_m2#d4or?feC(ek&~ylxEb@ zG*SA7I-WocW18x#`>065)|1p%dOk}C`DUXSCS%}*{D6hyS=Ay-6wroFR0jjWqa*7V ztT|)ALnTGolfS^yKLJ;3e*&(y{?WL`HTLDtQ!LJ1sJEQEFu(5HQSBKY%3l(iwTu$Z zmyBcz&GPi+m$dntE~5m@cdN6!;rv8;U{`&!Su9D5TxC4&^+_zM)q~G^dgt>l-%4T@erj8{CMY)mCbc+^c0Pg5gQ zIw&j4QCKo?M+Mp@8$oKBIagC#g`E96N;$S}XZHgCEESV>2Q2<<8=;bR}05(${fmFALMq{Om zXm}j5$bQAC5k*1J`&%PvQ-+Q1IWH465g~|Y>_iBNEgxE6gThOWUfLR|Z1_7x{2pTP zt}FJj!}C+z`_!L$ZpQx_^+C@A_+MK`%?mZhX#-CZ8aFxW3+mLYRIFBfhE4}BzI{Wh zEw9mP3r66Hyu|t$ZDv7t0BlTFOZJpt6dRM(l07k+jmc`T?briAi`4L%Cl;=itLPLI ztfD(R-$H2AKvXM>vR35WRf~OK$!ek7xeKEW%n>IogPbB}Gt@FShTI-6v*fHiru7rC zC!|fSaYv>ghkz{_8!DOvedn&qv9v`@z{*Co#*H@CQyJ}(ggp@;t2e>D@_Hrpg?lvtew>Hcb7&*ph9S z`h&4C^*2rK2pG=T9Tk|3k6L1XeV8DL)hg323b9&6Y(tR5Y89~!LHhnB_S4(19;t-$ zN1~I0(Nebs>E`umv-6Gv4`9DKY_2}#p-R__bip1X9}-M!Nzt(QPeNI9p$z15 z2hhnma5NHR;B@X#S$k{>NfuBn`6W146_gqjyw+NKb zoefIp&W*^`gA%&efw~*Nc;!}H>+o|a^oo$1{k;%ZF>~}MP(tGfsGC`C9BM(qI}6kk z;KeJGL5W$85>T^Pt_GBt-&qJsXw=UsswynZm|kBzd#<;nz6#%aDfB64E?c5tzQS8o zfo~#Jmx4o%zKC`P{*O>5bDMiILO`1X?9|>;C!x)aF6bdqEg=Q{qs6vXyv0N_)Y01m z&doY!h|K|ud0l@hFQ`Us4k(SV4Vwe7ntCp(BVJIAl0J#q<5E8JkHdm+o15&RTsxZ9 zgGW#ZX^X%`>MT!YF5b?%7V9Ja@2X(AEJh*Vx43puP97)k5)cc5Vf> z`iBfRMn$xvh#IsXSP40Y3bc6}mShhuf|5PB2+CT)v<(X{-Re|roVUM#jKOXV8iQ_TL9lCKd#KXU$IgrpJ#8lr>zupgB zbeYiPVDavF$fpfFLoAGokh){Nb&>6YkvaQ=7^7oJKe#6$IN)o2ixw(4ILi~{vaQb@ zx~?4(A)fERUM&P<`(DP+pQc%Z+^!xgJ`N1O~15*n4+6 zp~tE4y_?GZ8>>Uw5@kvYiVSt85H2_6tU=4%95JrDghhMMO+fv1v0>K+(jvD6aaHq5 zklzwvJQpUSX(vWP6}E9O25b<@ajmpW5TFRXPF)nsbCVKoSbXhf%vxP}EG z!H*}tVNFQzF@92W49h}-kHr^vqv{>qX!XVipT#gI{E|JL_5!2d0qFo(@?zeOl0$I09_oc(;r6^51)8MHFeQfj*?k|BjcOO>Ka z?gG+wRLIU1@*cfyolN~Sr02h=Iz)EGd$^i_rxNy*nH|l$v-54p1joc_RcW-{eyF_u zkLO34XFP0;6Z!FX|3QAFnsvz1n?PJ-$EdAXR9;=gMs75)Q5T1D6N7(9b)$)OcG3uU z=*-E>TClTo$CDd#Xnfm;rQ5W9X@?uReok6_HkQMaEPktV$4iZ`?nj#8K_f~|(we_E z29H@+k9@)o@cz-3qXmkPA#a#jCVCCu{^U46m?YKFQ{ouEwE|24WNW> z2Pm-^M9W};dNe})F+w@e2)&6|VVMq;2*G`z1WGq3(b;+tl;~_70VTqch-OpFcX>c< ziuR#es7y2b4Mkx`B`YM9g1WJUIzhg+tN_q5sK78dauL2*Vq_wB0 zJ{;fk+7rUB9FIHzf6<#0uMr0@Zt6h@HG037JN;EGDwz9Gy>=eNr#R5BSO_e& z*xlLv2N2lNb{N;-+9bQ*(TEuURJv}S8ZUOM-W;npJ+sc{AJZ7Ry(0%|G-qB+3+CeO zOSQrsyfR%`Gdg%>j^f<-AmQyO#v*#1!@28A=dS%JpF4M4Vaxj5pOCVf8;%OJA9oNG zrpp`%MPp`(-H)|;e7~U%kM5L@#*0S|e#CMj0MNq14{43{CsF&*sDc5_BkweZE*?#f zG{Iu5O;=#6IYz7poVyNLzjp3e9-sBKKi=BY7|M(1sEq9B_2cdQ{XGXqoYBAGMKT!K z=)h(Wh#U4vUascO>Fidyx3>CnwX_=VCMDEX@;iKT)CDh4HHY%5dE=Y^Eb6DLa^eyJ zl9Qx;#cqI-1rt$v`zPaxS~5rVR`0QmW4rbrhu5n|J&p3iVW8(2Q={q!9QO2{7T!VW z&B<9O78=ng5SCWUizz&+8cqX-DAY9Oav+)G`C~xYpj^r_@F*X~^Jj+UG4FX?Me+G7 zs2=7W!d1+gWUooDV1n4@ zh^m=7npVXSOdgz$635Si+2ub?c)Tj zeUxFnWQE_JosTt;#n{PPXulQWdVzx2*+QBMTSBFLEihC_qiV6d;Oy)~TJ~E*^IefZ zY7xF1Pt@8}F8cULfDa2$%M2UY%z&Gw zzwrzf%0av9p9pFHc-ltva51W$7w$N63^wYI$Lk28I=fn)3fx3>eFj^czfZK>E(%eo zb1MukElqu=myrM=p0Um>O2rCyg-yMMMKVL#y9J46ez#2>msRTt#0ycL>GNb2rMAAt zaovM(X{o439z)0PoE_BgVm#P!4*v7FIkUp%>^uo~nI#~`6S2nO?4ZRR%3~1y4nY+8 zObc{}2(&h~JdtFJ9o&J`R%P_DXDGZG;?B;0l2T8X9czQMKv)`BfH&^ikG0W_FHqT4 z5=ZNYxTy#f1iP)fAg-u~o`}c4wAa46-=C}=VjhhjkrltXAIpD_QAh-riXX`ZMo{#z zq}sj?RzQVH-+e&E?Du%+a+ZGr3bcE1Q%j%`gvW|TtiW@YMWOQU_SP-~j8@cT*C)BR z7SVTCif2Ha1dY_Zih^8HO&_Tc?sU#dXy`Hn9;zJtcC{v19UUs0Cu+##-ZKDPhETfr zBWYAyxs;XQQBCJkD3NpUi{}r@?O`6hsrerBKEPG*j(`#`g18{_KFiTt4Wj&rJ zgAz|^ri#KCuS|&W>OqMx2P4$;pk@OpUik~CQl|b1s)(svRG&XW7~_>9P*m@`l=%@J zw!%x^R3#(h{7hwP>h$#K@D$$Q(P;c1p*R!hp1zJYQps72kC9JlT5|TD6$)(&vnn}_ z4U7C!Qd8lFYnpfsoG4O%(d48bcvY^g-Z=GjKGG zbLRi{1JSIJ!ufQ8BN?L>$y+Vs=po#xAKmr5u0@GRj%18lRC08`YPQxM)U~c66*!VH zYEcQaS|-v%xEq=-3h7$3T0xFvj9TcpLTds&gv+`icZ;sITQHF_gSG77SS>WmMy~Ry z;9a`bA;IKtaT)z0d8@@CpC7sP={I#PCnY8v$r!aLpI9vv26C-ccU-J%Q3r+`$r!b; zQw&-zdI*-N)@tkSh;R}49lF={!%(R0*^D}Pm@Yf%+Nj%18lRLFG8PdT{y zZC#715ppDB)S`T=Ypr~5MUSpU-92(7W7HZCj@3e8AouIZe|PIz^-_yuj9O%KtA+UF zte;)7T-WN5S|nrCqV(0R@x+?VM|G`-q!!5-wP@kUYN0$#?wZXaABa2Jz)6l|j9OGi z^mzUIA2dfHg_W-*K{7@yDvwqRl{<2;@4alRu5}Vs7;q$G)S@~~&l~$sy7d%Yi$>Yx zNXDpj0ytI+mc?A{nFBNvuVdBe$w%Ei9l} z;}=qkWQ5$hPF(SiXCwu9YpdNXDq;21l=ZfBnd0GznS=o23@X7`0&NsCcD( z{-+mpt)ECOk}+zXZqQo({>y*TwVsn&BxBS%gS9AElk=^AEh>axNG*~vYI(rX)9b!7 z9@(t>l|)St9LX59&ICu-`eghAH|kmiQj27aT4%AAR`)LX(YI~7RD4N=NXDp@&RW!?AoqC1I5Y)Xy>Xk=A{nC=if&YnDt&S~Mj)EjlTwRhj9SxK zORL!yFTAZp*ZM$ek&IF60@l*X*Nv%(_v%^+c07b58KV{&9)wV9&CkAuKHjW_@FJ;2 zGDfXT*3#OP>1~fZs%tHiS|nrCnqknoBY0o6uGJ;ANXDp@WzgDq+K0$RS_mJMS|nrC z$~I^@_MQ5Ku0=0OkRutR)`j5cJ=mi;OE1#34oNMNF={~wTADQqXU%^`*E((#9>S4~ zQEMhRRtxoq$^E7E`nz)t)X&Ei>sl+N z7Rea3@>oj?;h}3rMwQB&q!!5-wend@8cUgZS^Qz$uScX7$r!Z?SW64x#GhL}(6wHb zS|nrCDr7CKRQ~*iQG0Z)uca2r7`2L6OUv`0{iZQ0&nL?0l8jLcCWGZi;7Ts>zb0Xlj~W7L|>T3X#Z`pkD;*0nyCS|nrCDq}4zUSIz4aa8JB zS$4<*L^4LLa@NxF#_hlU2n2CZ#9?QiK?Pf9J4F>0ZsfE?w*m0Xv# zcD}ClvD6|NqZX=KXvxP)=5e8ubS;nMxGBI73;I0@jSN{)ytefgGFMRl#I;Lu43I%g(0)UzZG ztl@81>!%>XU4oz0aud^v^7e}DXm%{}t`b`0E>YZ=HIwsoMZ~!jKQVUDWG~^lu4v?W zEOQ54@q2gas?|F30*O42k?~l$Tyhj}M7-7-IMKc%(+~1}p2_zGEJOV(3ZZZ6?f=ky z-z&SnV$jeR0mz$86n~#xOUVkXu*=g^Jxx zp^Z_`DMcP^cW0S)Zqk(|w;Kky|6aHyQk@U(v8)@v1AKM{cn1ZQvPw zZ#DT&^`g~+!oW|i^*wQq?)y6Fm!Ex)j#t2h>^C7(N?9#`mdK~gz35*$@@9#=+JwBu zguL2>j7}SnKat1}{eAvx?0c!cifk&s|J-zv2;12fGcV z7ReZU!q*$LYOk4&npR8UUrQ~LF=~Zbi&_S9|9bVo-|AX@Qj27aT3f);=Pv5rddI43 z{Z(p_j8W?b*3w2~Pb>G&)wSX&LEuOxPN~15ZDp(0sfC@5I9nm3uO+=)cUz^7BfcPk zo%xIto#&BVpoM_43;p53a$PG=`c5)NzkUpkzLs?9w$f}}t6pl6478$-CclZb=&_b- zLZ&>1%mL)15TN{g>Yw&qu1jAnk#81xEDHG+6Y|X_on=nJmE2?VpGOs>A>SjBZ#N;|0a;_cak~lmPL@G|WB0|JhySS~ZU)J;L zzoiz*7<2f~S&Q0jaz9x`uWxDf#!09{$dQau>t1m5GMIYbBQS=hMKupOk}+!i0vx?& zJ9JMq%&ckoq!!5-OVfR<6`dB_OcuMJWvKj8{A<5_=Adq|RTBArVX>&v^h*=+{U+oG zScZBaFpTocj%%Wjua(FTFftx1TO~&U#~6!W;i)m*A29j#YnGupko*cxZ)?+Iaj!)F zHTxA^+x*6a{A&~PgDgY6iZP)6aM*paj{KNJevpyT1EGPoLSZ4Tc)C%ZGsH{lrEJ3! zAp;KgQm7n9IBB@yQ#&IZs+9Q5&Io5J2_+(2#1Xagrv|^GWBOZ?;k9fiuzS!H(}!4Q zIj$sg^BGU)=`sCIB0t12jYfW$wW9ObLnh?yEORQZa*^bi^VlPJYV_;(CchqK8G4=ZL{QHh{o*^_ zuiF2^-n)QDRb74K=VXS-03&CVQKCc%GH8^5!9+|6}2w}wdDJ)z0cf|4EX)~ zfBw(&|DJC@nUi()UVH7e*Is+=>)BhS{4~!+jBWWfi**T}##?=RoM(KPH`W zcVo0HcBqtl8D#_u-&TFpS`eeF2N|7kZhw`$v_G2n$JJPb6ECqo7Ast)hvmQTh{k$W zjYT-|u@13V+(zP7eg0eP z+Z%oLtt&S+w$!(;yrZ!_K43-j@;24~mRstrmio*ro2Ss}Dl09q6xtlOmnrT;f~uk#d%e|D>h)CGpc!frM)T+ zJEzFyayVRId11ZFUgUJe2bWqL)?!zQ*Xgpf(<1)2;;`sbr#M7NqSR4ZW_Npl zS2%8hr53xx?(*RHx)_xBe)0 zia)N>LoFN*h}lyN*#JGU<^$7S3Jvm>LDHiz<3(BMuoSti#df>ZH3oBx0zj(8Zm+A@ zRRF0nvg6kS;1$6#l{oF5QFx;gM}>#*tv0WH6yDgRofezbTWEFK)V!a&S~x5=cR`V( zv`8f!!5*h-6xu8zmVF_nED?ue&WGzN3z;K8Q^uwG*XrSX0%q}V} zEh%$&d3te{0lBpn6%|866V?WFGYai4XK{($;wUIBaxWU2-&~v91DoJ-1H)<`C){Z- z@|M|4&v)7=|>shYH2(}c)pt#iQa9V*^SyfbqPUonO7;@xs z78kvNoog#DDk$*UoEEFcyQpGJAM?gyyRE?MD03mav~-*lDG zgOU_mh%{Q~@#T(ec?ydQ&>^-)5W@!~$MHjb(lS@6)8#FSAX+_cs1Ri@zEA456nVXc zcAK>X^>uuMf`YPn!C;Zga$aLXf<*VnTHs{3i4BRzQsVV^3s5dVOk_j6mO{7P18pd< z6xd)js}^Bw5G}>}dJH7$*R}dEeqms1+q%}qHs4Ab(A2N>uNmXHcIBC={ zV1X;vEN`t}(Xt%VW9+@Xv2Fdz6^#VPd8omBY!i;qyu7`+{#O5r)r~%(p1rg+(mytu z!isZ!Q(I$W6)NV+wJXDsI2Mb)axEBuKZa=(KQ=KoUt zz>cW3x2Z(~V!pTQDAv3zBVc|lI@{P4(iez6A)6m_6)$>r6D(_7hI4@QxV2=!=!YPlez4Uw{FUEbE- zSbtl~rq<^6Fzp3ir^90}wZS&CW6f3i5KO7R#kO*N1h1^H45PtfmxZ5u9#@SQxNId3 zM;XipKMg%DFvo3oVBlF&1{-Mg&`}j}!MTOrl2SXm(ikr;sd;_V zIw~cqwp5bz7E_$$%_=0;lIp>dg@I-27Pz+)*!E97!IY^0OX(^ynlGp0Eg?Y`wOp(+E}_ELw-UE(aV zj2U}i5QkQ+pv30oouZf{U*fm|p37;smfA}(^p8IZCJryR&{bSk=qf4YSkY?3cxyrF zsoEdWiz3zrKn<*=XoboeH-x#K4<&SaN-&8sKQ4)EH>M7X3ei^67uj(^H(*e1x1+Oc zVc%)?gB-gVBezKzYX>bzv^=iCBZ3Vw!Ef@0hxV|YQkGVDvsQv4j8u#X^E1Y=?BB0Gg> z@q20%J&Q5ZG8&II9qjuWc(h>E^EL2j^7N&zfk*ru{~CC-R`kcOf%gd3B~Aiw*BnHE zy9PgtV6nt*pC$i%{H~fyP}HRvy~|>kp(up%aVzlJR9q4779->wv(cCEFf%M{{+jf5 z1Mji(&|3m}KLL(z9#Q8De~iDFsde(FDe^)Uhu+Dt@{O6!CO^uD6L_^MZlZh?0&h8R zexTw}`6QCdOTamP9(ok~7d)n32LO)JO+@c<;LMG|8&A%=5&uRNhv<<@L~j6iZ=HwU zCNT5?aK1U8(>fP_4Z!im;El)MERfj(obRi6RLv9d_iNz1a2|SQ#D5hypMMQ{$=Bmk zYW&D0DqjkoiASZ1r@?z7{%!|Or;3+|9@Z;y@-PmA$pQd31;0e}F2;iMZ2ZV2qSuPB z>wxp9ibop=64CnvI3wqwmy7rlv4mcTAGvdtM-6bARJ=s|c|fBTINd7Vx#af;;Cy@@ zdUUqPY2a9M7<=s4`$YMD1~@ONc!~Ic?eBXcKVu+{BV)8$=S(`x9_JSMd_@=LVU70jDUB(>quBE(OjS6)zFJ z1_W#X&T(oW;K;rv;_rf+abOC5Q0m7~Z&WkGEx%hhzIR7{gy>uir44gFD0|R$1 z{wjcTtBRM1Khl>L;M^U9mngq7a2}4q8?SsfgWeB-Gs6M^?p*DM(}MO0KXQrqt3udv z3$}{kNA6tmJ7U4%BlwX^M34Fdf3iTQ3kZwjCCcw5z_}_0Z@m280UDXW`H6~muKXSY z&WGor*9LkYsW`+RxkUWc6`~)BA2|`f@%Y;c|Bb-;A_gxJJ*^e}82rd3q9-Bj3KfST z;*p5nT;Sb&9(uHi#R;6HF?fmS-3FWuF?i$UHy!jkf%9V(FXZCC=cg9}&UaP3MD#L2=10JJOT{}^c?<#P%k$8?7x|rlM)>{;&fhfr zOC-NLFk0G)AGt*QZAZZUz?ojn@yH$~qW2DP235R7^vHaF4xG#yPA`(*QT=urZ`o8F zj+waMUJAUWDsG~5=YYsQ)GGR`<<4{&~P9(rVVe+HbZze%ZLqZEFL@@of9wThRBzl#vRUd17L z#$4e z2H-rtoRMRjycoSvdPZUTqc5qz z%TRF>m2WZVEdWl3ig&K^xF0x=pNF0X^!{7L;kig$9=`-$?|JAE-!FYldM^X--Sf~3 zg5F<&v$}zEcP@SL11A`RH=e#+3o`erIGkeQ{2l<_k@L`-0V1z|O?saJFR3w_kMZ~; zaTtKJPQ}yUJyHD#0q48tp%+5@9|0%3iKlxmeQ^P2p^BGC|1v=4R^Z$dgO`ZEhk)}$ z4BmM8Ed{+_sW_a&#Q7Zoo^%_>O2pqh1YZgqr;2y3{4NI0>hsWB26}$r{4NGBQGWjj zoKIr##>?*&pmzp1)0zRmor}LYz{ykb66JRzXxLR8Mi7rg{5=P}SI$E(5Aoju&P6LZ zwR6?CRN!R9;Ek8x%Ry!Va4KW)67jbbIBR0?#-m5=#|GeRkHJes?>^vsKL&3+dOt@7 ze+ry$uIBlr?Z=7eJrA7Us(6XYL;`T$*vjd>d=7dq?}Yusk6a>p$vW6S;C#HB z<5Bybh`;aOCkVg9k6a>pDF}N;#bJneB%=2^@cwijdIrS*_-oQT1H6gf;;AO$?=l2W zRdG0GV*cg=@8(qA6*w&qa(dcx(7PWvkE?iz=nW(Oe*@>gu$D&- z<|ZM39|Gqy6)#K=OM=&_yP@1gg*RP^hqbio$~4kDk9zl`tKp_4Rf8>qw6c6#Bkj&; zUqV{|e4APu=UzWAYu*i`U)SBbs(nctR>YTMKgAl~k`+x&^Wc|5chz1=CrnQP`K$Z+ zb7twv6>aO<*ERXl(kre>^R)U_u332pc6y{)aSZj!7A#o{ARzdBb7@OKyTDe(=Qgaw z%6sd&c3=C7ww0~ExhvN;trM&chd|#h%;l@zbLq>NILN@A053+ zcs&{K{lE1_y1*95@Q=YUvFV+@aijm^h0*!H`UGJ~h(~sQym%Uf;cwh9EdosAgi#%! zv$Ux#B5A}rl1vi9Qt^LudK9KXSXzQG+^xY5F&!O`(wKm-^l{=*m=0l7KBMC$!!H?O z<2i~)myNsef4q1TNGRhtil+z7W%xfj9)-~{>J16Pj0mId+j#Nl&fb=B!YB{?HW~n< z9HnOhFVu$|O_Sa)Mi|Y5j}9Z6SDZsGGZ40GoOqO88p3ub2%Cv8GN+@{qj*;$?4bl< zvk>-3f-p0}9!n558)1)+6GrJ@g|H{a2_yTcOXEC-`6M$$j>3}D_?mn;jQW$rKZWTL z)`0)vFp5VyO<@z$;`2c9XzWM7i8BS^5dMeb0c4KoPD0pW{2woDGQwU?5H=}|-?lk! zJcPY5PCVk%0GjW{gk1pmZTu+g0)!dGC@&QD4t`YMry$IRF#N?i%D;p#7XrrP#fUI> zg0Kq_<{c-DXkLV{s&T^LB}_%w!bD+dg0Lh(m+KcFg$kiks1mA$8le`q3N6AxZ;OQ`!cw75 zsD}+(F5D`tfKE5!puF2)n^p>|gw?P^YlOA9Yok@TU1$^91)ty-)(ab8XEq6U2zSD! z+$C%g?iMB85W0k*uua%5>=0z!maV{cgz!1{y|5Ga3EvX-z$QE(JScn{_5Wev zKZNg~u76kfp71E@_4jdzzzedTFzc7G$bVPVjcnNjp72I0;DsH2F zO*n>IYu^xlhYQNyf}X!4{9ZT?{r`jTp72NEec=P)L*Y-tpCctK3V*=?I)B53CWFG? zg(2Z1;bY++YH6+zJ`qmh61UHU&vA>#{|KjWZ^tkz%`?Im!k4%m{9nRZVFXn~6q7`J z&MZz4bz-up7bl97M3U%a(I8$RP7x*1C|)RDBu*7g;>F@6;xsWuyi~kQoGzw{my1`3 zGsHA;rg)_|OEinK#jC`t#dPr+@mg_?m?6#;=ZV*enc{r$dNE7P7H<$2h&PHkVy<|T zm?!3oH;dm8zXuur0LKSe!~(HUw2C&-E;_^qA?F_pPSGV6iN#`x=oU-GGSMS?#d5Ji ztQ4!nYOzMF6&H$&#BYj=#UI2%x5|0dH#2D%sKvdp8x;0 z2LDdZ!*S1TQ7|j2+7w}oRS{rUsJ9YtS#Y2NYzr<1RIN)mokag>GDe96hV4+qgY{hK z?LOuewoTFSe-Gl;L->DeKd^%&VnH}3Nvs})Z3+2tdxCyLj734~{QrVY`S*&C3P)R7FBxdoGVD+^cyeDZzk&T-u53!EMOXIm^=H?I> zpdEl{)S+YJ3hHa>SY2Gqa(O@A=Q6*?@T8-LbgW-*W{@5@%`DUcXbpp22Gq`=G<2{x zGH4^ZwZAx%6MN^(&Bi-t4gk8q+$E{PE5K{A(EJEQxk^y)RmZiDC?r$J zVW2YFwi{vcJ@?b|!H4kdn}|3r{CF|U;{>UYm~-NpEJ%CBz;J4fe_E(OlXq}KbJnq) zx8vUVqNF;h`{3l>zQFM1{#l`d2?%pbd&@OhJv*0+bvp}^fTQhwUqAUEJ$n0YJ`Hkr zB~S3?c==P+$OnIMeFd?1@tWcM+Wg>;yj^VIF>Tsi&b5*VSf?C?|1?C*9;}%KDgHAp09q-rd1tK7;1-Jlyjq1zv!M zv{$$D#n(?9pujmVDz63Jmjc66a9twqVH`RZ7@oL6A2M`@@?AqO1coR1Z$bPEaECG{ z(3Ob5r1ncXzwCJMA>po9L++mmq15k$GF+PDL%o4vgMSjP0yIJL!q9}k@MQmTypplP z6`Y|W0rV%T^xMCFsla_iW>TGwX2CLn$eeZ`fa+G zRdX13RpNi}$d*e&4Q3&f-yLfCnGhHhH6xmjgGcWE$6Yf{zr(NI{DiLFJlK0;2Kdz+ z)EozrGVK3T@857GuMc89L0qCDO&&%vDFTxCBh@Fm4%*PS6gjFyI9DUu(+%?kHA-fA zs{jlOAa>+j;lD^J(&B2%Fty%cW1mv4RSpjVhs}->GS_)3Q%-Oe1;)6AfWri(c!Hc7 zBj5YJu@6=aLqVdGif5Ff8E>&}DPH0zY9cHW#pV;pk8(InmRlSMBZmG=P~h~*q^!V? z^G*gW*4>I1qy!^dqx_QUV5r=jdmmNI+R!G${_i7L+WI!0%Bx&R16t)(*^wFhk`w!q z9s82cUT__#?65IVcDR%+`N5I9P+lw-wanYwOeU9su$G-Pdc*aU4vVi`ab$+CY%j~H zEf1%x)MVFI$PS*e?8sIe`6`<1$XCj2wOn3Gjf>ED+JQrvNM7o8IHc~fV))8suB@K= zy1uKBJ(7b7gZwaLi9jSp9!h(1IMf({HUr|Swmkwp7J+^ifqoN#1|rZK5$J;m1OS~+ z?nJh|kT<((8PzHWcp;?*2E4qSLbvl`YAaEG%Z171*soQ7D<_ZfacX0{LS=Lma{P1HK4qH)OUSB{2C z4RV#)fEL0ihghp<7i7Oyw(F(9KT#JehbD#|XGTI9k@hA9hNnwg10Wt4p5fb~uo%jj zIsXcLVhH^0tIm-QM3F-Oji-EJAV~DIf#ECsSL4d$yf>x51Mt|HwDWMs2PZquoRqq1 z@otv#C8?_v(9k<*Uj6#O!KA@&;FX$Fyl4mM3f`MfAyH}DRpftA9J~Vm)zsga^M}BY zq4!JhW{@xRPh&|TPev&~*kJks6o)W5NUi(KgqDN0-ail9KxNMLw^w4Ex?h&hO-0GY8O8M-I}>BEq;x6FVR!#9NB zsR@teJCcW%DvlIQuTo|TykN+CXMK|LPVo4S6f}D&M05R3%82p`BMXz5qB$(>MOWno zZQz86%a>C??*!44hLW4`NZKJudut4uF9JiN|1ioljdezGWpBuCz#YlROjHb8ZD&VD z&>ET+qm`mYN^uygsjH<8_Mqi7`TsQ3i=h2fF?cvNXM~8BIFZvLiJ1u0u}R^r45DdX zu8lQ-cx_z zcL7eulqeEtpD69q+6f80$Uf?lk}=^`ekys#I5L~bLU~QCGA!-I_4di-xRBXU;mtb5 ziU9&ZpLM3Rx7Lt#BzSDgw9t1bvb1-zLErmVeV|vId^+#N&7a7cdZoW^QQyS~4B^LH zJCYpuft$ddw48#(vU+gY`npuvfp$qRI}EbJC_7BDBSm(k*2>>t2_q0!D;v~H%B6j8 zQ`s?Yq~HON!R6V~w!;8$$+EtjH)Cjm(Hqg@*642|VCT_}zl$ATXr%2VW@+C`(%z#x z9EMPVDE<7PT!tIAwIR1&Gv}bURxUHDxkX1D+MxF@3N1k|y`TFMO}`Ue^gQSvE{HY? zVApq9s3x^S<&QDOBBm`}yr?hYtCI6wIi!b<>-As+6~N28Pt-R9%L5Lk`xI{`!XLuV z#0DOe2@@u*1xyJpZMSpKfajvEx<6w zI%LNl*pe!Q%2I2Ujj6s#<&l02vB)K=@&+z(i@R>z0;}(%!T0y@Ghq@xHf1;7V%>M~ zLiQK5s+H>?Ev-_Tih8YAJo?}fXXis|4xi zCn2`9RoXDKDJXG+AXBtIfxhC=26{E+k^U(wPJpIo~C$Gl-D&U1AiB# zt~=lbz_*wl*Wn`b0L{ord%fb$Olj}Jq(Bc6(Dr_)pZq#rM;MUTFPDGSc6_KRufN?Z zJ)c6@y?^2uxMdyy+JPPo;^pB8wVKu1RRSzS z`6^+RRvmesK&hDnhf-in+{y-hB^!oi9fNHp;T!G?9`PCTUTQ<_9LaN<+H`quwkIhs zDbCc8O+O;r9uN?T8FS^G^{-IdK$Spx6G_#E zDPZsv@`DPgB`m2+4&}DnupYK=9*`>45JorC5s|04N~pq`cv_PcV)HYk9A%e-^P)sp}!9Q} zl8qtczGh_UVtEoL$@~B0=#` zBbdG)Z`|akL`HgJLYN;1(6xqh^U)4FGJ~j{b+;UI47GR#~H* zRCHvaD625`CTgHe6zi7fH^g_JKfXcgeQ6I|ekC^r;FlC)mdn3L}6pUh1kxOlbTFJo}q(JQ} zsX9?NVW|_%JA?4R;wHE9;paiTLw;NILdc=_P4Pl_`mo7Fi({ZT{krfpULO@zv@our zP&ly6++jSC9WSrTT=lhPe^ba{E|1JC>B;|y-_zBzBU$#Cd>Q!~U-EvE%A&rI$y~t^ zrG1Bq6-L89J7gdf2Ucb|-=fO>D|k;9c1}U@Yp?I=I^wJEIHU0|QeK=>X3Q%ywQF}eQu>rKJ$fW- z4Vu9~Z&KFrotw_q?p!pYe3|!FTgJ{y(V);I*V&!rBe_tbHbdSk$`|cSp@#l2=Ph}Q zQLZuVs7u+|SHBd~iVpowZ4#9XR*kvCaEsN2V|ZoVpR6Of=<;aI8`^`%YuBeBit?qj z&)Agr+Io$&??q}CJ`w#N!-hhkwO(o88M64Rgj!hCByRW7ZK4XnP3j!<&5p01!TV-P zjUL^jj`QAvj-_7>wZt0%A6*q*Eu8bHj& zvO^ym#=3X$f}VuKplWGW4~ms{=lXOAi?%G(Lx^=B;05!etX6-jjxSLLky?u$LOpd2 zsmD>*N7M2Y!^CP^lxli}B(HUUWmM6>2n;9Dl(C7A^JdUc}!mMrM-tEk%KePZ6(wiAQjq`!IwjC=HR0s+If~thqS$r7^QMeM8$vGI24vL3e>ljwhQN_ zFnb&d(?J0xL2D4#quoZ4L(*zHq}UA@Xw}MoJ_kev7QhUU-yr+h{DU706*Q%)@0$+} zxCtx)#7*GsfOs|T0Yuf-gl!!-{hL8peN!PS2p)qrB=9~Ujr2cac=YK2?+yML5T|z* zkQt#^j)N}q7Vla>Jk$bc77KMmLR%uCTLE3kLU%+$p8&+`?Y;;E6oEeH#UI*E+7yVn z5B!patRu2sc4=joo|zr$D8#x?@xpp>B-NU%Q@O2r*=N@JFQg6~=_dTObtE)q1VRA= zk~lynZfH`tOIC#G&0h#8nI@U_!UskFKLTHf)wR;L<-kU5%0Nk_hqM=BaA=L#2z2z3 zrWE`bI82v#?dLWk*M}adMhYIKK(Y{F)1apiY3~Us_-mrA3A}&zoPMe6O|S|Dmx5n_ zHPpou&*Q%!TlGl8ByFQIiAf_;b@vWS!8M%6^q3kS4L>XeOA$_nzeK-YBbVqyruliF zDgEtvA@`kzIcM48LY~cRZchtkCwHDD(X?NT>9DjWxs%F6S+8$WvK>wGd^QY8$~)M0 z6hbwTNZ^zA0&%E(CT(4U8i9D`{X`<=}Esv$|ak}EYB3yW zNv^unu>NW?xk`~WjI4#CiM-AP#qyddUby0I-t>WU5m(@f>yoPJ*# z**Fut#whOdNC`_q>>uNJwc$Vqyp(@^{zEFK0jr)cl)_ZB4rXrNvyPKZ?IQ*CdzJrT zmiIX-7j?#F-;}(Ud{=^68f#+m`g|8R$=g_QqaTsGQQt1f8}&nzn&j`1XOnzIpg)N$ z^~a+BU@Y%6?aWQl4nW+nkWt|f85Is0khU5Mh?|{%0piAnR+M>YVFbDr5I0`$0lEs5 zbi!W%&1TRAsN3Ag(Jpi9eDKaUeRB^aOfm5h$0@+cLgz=1BQ0A0Q{Jx3`nZ|4cZVQ4 zxdo$$XPyKO6GJmW)oSbXwE1Pk*-u>|*_tU^^Y>E+Ue>?@P_?ugWUEoOnq=!{InaT4 za-fSnpTHAJWA-Xt<~KkA3YJkmU`@kb*pUG%4C(d4fHi}790<_#j`2!0^}wN23>Il* zV?x0gHAgEDH8rxIuJnoNkN+7&0XCpb?t*!?rNXZ z_1^%Ro8eu}Yej9dkjC<#F|hqG!jkbD*#0t}zyU;)mZ-}k1KXpTmPfTeubiMffT#ZivSRhAU3c=$)z@1||5!4Y3IWO)dnW>|A)Yi)QIfl>A6h61EM%Gp(-a*|P^ z^t7NgLs6*rB`a)pwU1_2E5oyRhqTHGjP71oy14TY=|YU$bd>!RrQNrRPqdIisI(p>fmNnLW|q7c(JpPC$YwbxAY!lE zBGy)yhXO3c&{MVv@KdLMY5xdkinhckWi6UlM@=vyCwU0+hMw9FhR0^+3IujOa|kq9 zh3z8KsOat*Y{XVVMhhDpSwCGl913&+MR{wttjC0AXD`LWgs1;x)+r!lhn}He z+9Lp&(V9RtDsNg%xXo1M;h&G)34sAEZGdQdQwh)=--^-$321C)LwV>KtsWk+Bbt2V zDTOhHOyr|Y4r-C1p-BUbV^XldGjxk3#sGgMe!&}_m77C~1->xAYDJfIxTZh8T;2qWBRWG!P@Ey zWzUm{5(>~HLrr)R#iZgphOSVQCx}gyM09# z^pV;MY^^Dy?=pZc{7kIPqqc%C|6UD9C)_|!2+YJ5a`{pKWtJP0A4VWDUEJ@@2s8un z$e@^nn*ecxMGKD{Z+pa#3>No04(LZL#&zJ3$87*aGb$$R_z0Vs-vHu9OoQ4?U3e_y z1EO}=B$NZ|>cu6=s~YoC znDzvF))zy2d)8mel^dmL*v-^8SFK;@8EHvl(M@`aYDn7$${y15X#E>t)dF0prOnA} zLJBDhPyQLQ44j~%L4_wBSGhk`&6J;FX|fs=!6gN(sFt6iYQ?w@95U9+Pmy=s(nV};mbW2O zAqx)Cd?<&gW5yvGm2zkyAZl7nY#Smk@ZIpD!J3KTP=z*O>pdL9qrS>v=Jz_DJO(Kb zhsZ8)=<*0e-5%~o-4zbq8iD)~2t))@X#BzPO-GaQg1IU|*+JD!@h(#eX~#_(ildpZ z!qplrlkcM7DQw1DfT!L&@+Q=UZ^pX>Xj4H($2Je~jd!g$fSe9yCK6bC4Ld$lMib+F z7oa|{C0+1c5$?kE_^_amu6Xt3Bga5~z>!W7>)7@oio|Qk9F->m%ZQrM` ztV42_nM7ErJYs$W|7(;!b=j5~C%x455#m(WDtXF2%69W1Afcn0g2tk=|75uAcj_=T z1pAnd{ustLN7i2+s?iSV__(1-xwc7ev8B<_=AbsOx9uN09oX)76!@0|`Pll4LuL6* z$~ASff{eFaW1w)!1Dr*SSW2oL(R1HU+!BEpe_dEhNqvPy67khn>MAQV-d+>kfwzu)5bi2%?r!498 z&^X%~tK>c(7)o5n)b#i6;Vr3UA z`>dBwfQrz0h=}#6Xi7gqDfe}Y zsVw{#h0BffPE`_>$%b`7j7Ifd*^!~>A~h(g42hYe+#7mmxKWwIWtR)C8X$1S@cP@Xwi+nS;`LT5~E*YsHpWSom4=yfC6dx z@&+7CTFNE0;Vw&fEgzu?xvD3&sKrnhHDJlHJMAVAp2PUG0pfhNs(hL7pD#Jk|0K3c zmv7x>;?XKQNR1p9L>H&o4p8j&wqC`^`n zM_yCDP2^!gVv^^IN}6-Y zpVVz&;{~jgw3zc1`!cj+H5gdJmG|4smx*{xSKGq3sgHkL>e_`!z>LX&QoRfVqT?0 zUjh4d3Dn%{r38Us8k(e3rq@=J+2&&yB<>{+gJFtk4u_TPD^iI`!Ayh?O+#vG)(}w& zPKPIDP_Z|l%G=7>(8~)SKDtt9yNj1;vlRS93)5aJf0tAvN`s5%b%cT2bfBjwB?fs9 zwP=Jg*6gq1QH z586$kJFBFw_rZ}8pps((RZ2||rx|Okfhza`4|98v1FH$XX^758Ev#8J`E<%r*yuEj ztZ31{e|1u(N_fFl;NjLTSt(fCP*RunA?LLMUrvo2d=!-y@CVo;Q zl~7NyiQDMd9%jHP`%{K0^V59K=Fj!*?>Lj@o6vD)u73iE4n5g%li+_6gnd6EO6o33 z<>b&KO5me#{$MgR$T}g=-YK4G*`5Lom@4eQ5X$14u>Vs0>v(1f;s`!X;II~JS%GJk z(Q8B!w28??=71!k1Qy27zor}Bf^zZzMaVk#`G5H?3j63(A25vkCQ&<=7O`fhKrzXG zqhiO_5MSmhZ8MPxhmtX$rj(|vn!von6JzjJX(2}@x!N#vaYW4~Hz{^o6K3YXhr+t~ zv`Y0jh=z8tR}`%o(ag$C(mto92`NDP6hem*s$z#SSn$iv>Iv0m0?5ZNrvi<14(AM2 zHorVDU<+62l%WO69v?`^wV6s_BLU8AMcGV%Cr8=S!GiLYzz!Bb7J^37 zFO0bIIwyS}IMZumv@`P-egCBF> zWPvOw>=piB&w?tmj^};3qt4s!C>Lq}B6c@h8mI?@Z`6E+%Dtq~iWu^mLarQiWDRnS zQ7(&2*5qKDm0Y(_uB-B0k~f6qlj?N2W}&j3#d4YDvMTr*lxpk%NmK0D!fIYB*QLvK z8FF2wT$e4^<;ZpUi~DXwB8^~&_pE}Pb@at9V}fm9j4FjR_PjFWYEcS}3bp{Ew=CmZ z7_VL~*DGFwTy9V-M!CSqGD`&=>sB!uH`DB8yKet#1ohqA(uIR`duFfh8X1`&bf_KB z8L_bduj5i;5>Z$eqoz3~WNprG3 z4s>^52qT8>wIS8E>(C4tYRW_VB9ky|C03iaov`ZK^!052(b7I;*LF7Fd0#fD$a`o9 zgVLEpa3GCf&b1s!p_lt;)lS|sjHl9RWJq7(S&x;2KB`N{@H640h*;J`cq13yWJ}*X zVe0;fZ#Fj2)JWZ}H`Pkr8!yp(syUmtQCnZPRfcQc_7oeX-!xGjuc z$KB;v(IVYN|Ilgjp$q0sqF%Vts@HrLGQ8INFJteQMzjDXLB2-1|De1`+i_6bafx!F zT$_R~qhwENT~ol4B%(Zsda0U3k}!!$yo)7+C9~lJfG|JIOY>y#l>cIwWy30w8gJeg zLJwH!$N0zqL}JgxhLl8sm*%_(ZRjMN%xHIPEXOoOtI3ZxOeeAdm&+h^m*+q}n@pi9 zd>CD>zZ+ZThNfb1rxz0yj0M&c_Ro;^O+jn7WonaBlca1xydzDRwZ?j^=PZ!}H(5w2 zD#m4$Fmq5BxO*56Sv@%pum2LIzu)2IYX#^}BrE-cgu*6a2+zbmFD9;eerW!S98`h1 zJ&cxO!63xfS|jaiO==396}J?jJf!Y7E0u-%+R*0LhC@rHj?mUF>@L`HVYSi>rjJS8 zRn=dG+^^}EDi`KW!{(hLZJtN#H+1BQ{^USEHYKzs)i0Lz>5-wevcRPMO!+C&W-FG?p4yuW$biZIr9Z-tM5WB9ABK{ITPT+Dic6e9hf5s4) zK(U#?Nq_k28lkg{sPX9Ek64_*N2!%c9od0rD0O@RhfgxOZqkn1Y5Kc>q7JljWT^Cn}O{o zvdaJqV`>_(Xp^wU>AS^yQ_80x)rFZ zM!BR4i}aXuF!1hcH9C(e=!=<@K2^10_xS*|phGMp*|HqDCSP`>)4b0B_Ag*95L+MjKL$=2Of#jVEhe1i z6Nah)(RMWxoAmt|gWiT8DTN7V%HVuK1|{Q3g>GW~B_4V!-g)TyNGKu*v~>xF9-RVp ze>Zy%e3VY&80gf(nv;VlGWt8H>mWi588iW!b&z_)SqGJ)yJ(lPIO_H^%UBDaE6%SvR$DgVed}o=Z>(LDXmrQg^nSIyh{T zVK=Rb4bCM$nkXEcMNle1ml8xqW>6xC=F11EOW#eVdhkm;y00VXQ-Wp@^f!Xi3Hk#; z)S3^zPEaO6M+l<+(IAanyVD5zH9<28`YA!A&x7A5$V||;37Sn1bpX1rA}Bx*EdUH{ z?w&&b{M}^KhSqk|jOWm8-6%IClAkiTEe&-HxZw)w5}7@CZr; z`?a<>puYJX`&lR2mm6~8o4#oq=1Y4!2vb!Qr8n??5}LHjr0%vP!q@zQdO!G(PyPjU zi9%Scg4XqKWmK@`_kAhvu(azYWNyx3<>=|(GqTr*vLA$9vPs+LAs~jdIP`Izo6ez!ePnwP9?uCu&BtrmKXCk)vU9lvX?` z935b!y$}dew8i!_(a6mRi*-9LhN7y&9nQz*& zt;UQz?fhW5i)Q6&WQC@@)vpHnonApRPg6%*;Y>tM%`tuC zIvVYYQ8@2HAxGoP8-=rH+#h?(M8iGyN(ylDL zJb{fMbI6nUgEaD(foiAS&PLi&z?fepR)?D-P!06!sTpQP*Y-z zfsqO5)}jym1xugJ!b-tUDID4s!_|8{3Zuj6N`W^~J@CO1Hq>Y}^M;Z%S0F>9viT!U zDL>G!4V)J9eo4C2_FI;dUX_`LQ1kZx^d~>L_Vge-AVG7G&0NC#25(ULj2B%c`Hm~P zTpmLE67uspDXsQWRy-#m5Y5_QP2E?kgs_~r*rKm%^_n_#$iu-%p(@ay5~@KXo|4BJ ztF~vyNb)#DKq)|ir(-4fb7YEmd_ttW`t+K4B!Ls6a%*C(2D|M0=}Oj8c{vX)69$Eb2Q&;$B3Nq%{BLh zG4fswYdy9y6{uVXhPBczS~MCZW{ef2dru&09LLcr_X?+K3XDvY?(c!Fz;v4~NZ4GoVssvu){jEYaQ))XsieB_k6O3*~qFbyoV5cb>54$&JO5W-vU>~R^K zG!BEOIHt-VaRw&cjHKpVbyu@CP7|n|XdreuH=4C6(Tv2i_AolbV`aAvY>bxOVqy)W zFvXRoaiu65&6wgEVOo6O9MxYr(It)j%QTwC1foVF#vniiO zb%Sy-Hh=db*Q4`yCzpgNyqD58G?9H-KomKT!&>y}hH+xU^*uuq*sg!dRD@+-L&;o; z{ujrX{7hm*7wox9d-`oz2cpy{tNLN0Fo#wg<^3-R3Sa78GbJATujE~$Rdf}6GKo>6 z>JTMJbLYyG)9=WmqW+Zpu^xJ}(1BwaHJC49k<))eQ+;!essurb)xdN%YD{lWXOUv~ zZ6GoZtuiINzC?`2b5KAi-@pJ71-r#v%U6~{n{z~1N_36ji@D+NKoJDm)c`E6lx4+a5u(LCJ5K=0YS-YrQ=Z^#rx z5Vpm_fa^y~sxuM`r~Byc=EaQ|#4%QFVMCz785qLaq^%bqufZdm3%9HZ^qeL8OwtJU zFoV1K`mZ)$Ks}GDZ5SzU({K75Ll4xFZ`}QRjgJ}RaEDhyil^TR;oEt)IWu@n(QT2S zUbfH%t@0xKOu`1$$`sKIVT?WhEC0Kr;=f8GhD&59Mx1WZlrgdo&69RLjsXwiqjP2; z-_ZT^F6((jQzu1KHF7JDm4pv5dp6TY*!g)|Db8IJm7NUV&^cOS9t7j?6<>N_i&pSm z$?C`Hw=rQ)x;0wkuLN>dPr_i@c}WMk%qCiXY@|wv`3|yh?xg4wE#;Eazn^}r^Fxf? zMmi5NhG-*1j7r}}Somh%Vc0T(=}~-e8-k^7XbmE1_S3w2-hP^Pmjc(~37MwOIovr& z6DMk4`n50A-ZX7(4$;1FLV_SuX!!$Fl-+6Msr^l$*C0bZ;IozaRPEO)BI+NlIh1SV z0&IKhN9wr+TB++f;*wB%<*jVKMnCuh6f(*gtx@Fdr>tnB&^*d!Xa@-;cL#Bc;|Kr;ItczJ&oRpcW+tgs$5avqnru1=5miMz zgY4y}vMC1~IE2&bFo(1cR1iHS>&VV)rS4v7@07{CnD?d0nL*k`oPWCg0!-P=RR9lm zk;j+qvne9Y>r+I0sD*HxyoXtxP?w$#<)g?$i}Od?uO>vA#=&MfoOPj|%%{ehgLFiO zni=TV5GHM2nMyOTP>F=kKGaRR~8 z{b*XFFCZ0t*&6f04*E+!*8xR9{=Y6P0a4V%ITZ2#Y3@SQg6YVYPIwp)Enez`iO?VP zNC45U{J+3oC)@<+&kTA1(1#2viNkNcm1cx-v-2E{2maGaVdrvJVts1vPYn*2(&f=9RkFuyaR|+`6?1>#vqT= z%Z@;{2qXjIaUTW5;~tEJ9*aO9MxaR;`f_@60r9vtKs;_!By@cQ3PhmY5$Lf9^vekJ zTR@!NUjT7>T1-vw)Jzd*W(1lSfo_RF?g+FJ5U1Axh|~Kl5_%Qpia6yWKpbxwAddIL zNa*F5A*+P$nuN80Rxs$%2s9809gIK=u)Ogk)5#@(xEB8>AZi0m!ao6B#%jedAX?ne z310!al=;zlk0}h&0-DAkJ)lb%WB_zAgN%So3^D=YR8j!Z{%L$20O%qHr2)E-LFNcv zI-q~DbTcA;nSefLe%TSf96+BjzkEQSGROkxB!g^#K4Fjx5PdGD6WoA4W{?-qM+~Y0 zG{m5Vfat?R>;wWd$e?9_IQI>JPB6b_K(tJx6IuZMl|ik5B$f{!ARc351lkN}3JdK3 zM4vS3gf2j|jY22vh~VvtK)V4=W}){3n#7=o08M1jBY^0%Yn|{IpkxL;4oJtKCjd=g z(361Zcmkd93qYK!rz6mQKpGbMY{ahzP!jVy1W07iVL-H|uM=JdG{W+G6wp})y#a_* zej5<=#&p8FfM~a`PIw>Cmkjzdpf4D70?-)-eFTWdJsE-i8G(iY4Kuv20G(zK9bC&+Ao_MoC*%NnmqGb}e$OBapm!K# zi$E?wZ!7wy2lQJ8Jp||#20a4kWd=P4=p_a{ z4(LS&JpqUoJ9Wa7fDSY07k~yB^faKo4B8Kfr|~SHe&*K$=miEH0(6K$hXM65=w(0$ z8FUm-FN59y#Ob{qf!+nw!$RK&LPa%Z9gYQBMPoKdL)At2W?1!#*K6ePMG+XV){FLv;z;jQc z?H7FWlwIbBfE{|^F}$B3q6+r@$WJq0|K;K1F*^?t%|4}z`RCaU?SD~D(nm;-!TWR{ zHgE~PNr9I%GWXff#*f<{2RV8B6GW6p#0a}<5|~t6M)_U}RlFwo+YCXk+(!mhDQd>x z05fPAfiojg7cJTbezOZt?6p3M=czs%w=)1hsc6QseyTU*bkmAks<*PH99{iPw&<2h zs}r=1LfVVbU6brwi(iYh7hf>-zOSRB1E0rtO1&TGusuq8-ff&5JSFnb}JR&dnf^RMHjiYYDN3{L9! zK-{s*d=Rp!!KRNKY>Ehf-HmNc7-VMpZ>z!ibqy>Q-$75FC3Nfr5;9fNrs!sMT8#$j zNDbpB+Ht}Y3Lb?rU^)3x>>ySicmppX+l3?Y_8mx4ew2z*RU0I|jHg0#mQpYusuXyx z1HC%2t+*!i>zFNmhn21nZRZO;$^I#>OmG(H$%HtvX;55c&Y@kCG=8)gkO>RUVN$#{ zrP(!620~Lcsd4RTRD?g)s+FYYS&*k$d_p{H%_zqA~ zk^9XH!KqxE&NmC?$S$_?W3lXI%X(BA^>TAso$N}Hy{Y{cy+|?&s{+cMMR%r$Hl)bT z98MQlH0zj>bv)-Gnho$(HswB424H=0?nAV>85>u_Uq7W(KyoP+;Nx-dQL#$IT(TLz zbbJ#fhDofqF$yg0d z!8;A2@%}FU&3R3(NmUNY&U{r>^ZHbUlIu77reG`jl$7@50q17ST?qltW-Y7q7>j57 zFT&H}H{>oc=lFGa=KD-E9St4Hjvh#elU-;I9N%zY42_cI3~ zm!ljqFe#o1rc@IJ4@C6h07T7EY~O`E@<}Z-y+F$*G$=+6S4RMvSNMuosvwu8`nO=S zBgC3~b*_3XW{KMwwjA_i>?QQ)LZ4M+(m>TeX2t zM55iN502dZmQrSn#dH|40HUHItNB30X}8FcR}}*2HNa#oL}JU7FXn7EFTv!=AwBq; zirGMUixx-L$~6YxrC2|EZFuqNw{b!mEnB45MU)BW(ej;Kh=-6&I_g-pAhel}%F)C+ zq_nfvBwP;*%QsljMIf7)UlSl|I84GFfPTcFp8=x%#U|kuK*tyrY9P#bGYQWDqRA|i z@E#!AyJHe2qSkPz8qf+BqcH;A9f5X7pdSLdl2Q2-&`bs)nvjek;RpDy5hk-nEe#>+ zw{>VESYvkZG5E<|qq;+!w$P9RBh1ldC_Ki1g^}nZZ;V8k3uDnmDZp}@ar9j08H(IK z86w2?Ya<<|$KudNByvDyjy{r9Z~0KBP&C?WDeKzj;piom#w^gl-W6lWR4nbojJn^5 zFigGi;I^T`A<)G3aJajxKX4Z$K5&4w5%XVGn*h4wDYvfXZAUj{{^SiGP?FI6zF$ z2HpmogioyCgfh1NQ`d(xEDhMb)=W{^!&^~9JK0je8&y`K#*Z){UQn!XHuj{l;-yA< zsD3f6K)I)YS1;dQs-7)~9rngLc3NeW?U@lGyfEFIZ7MufMYz;p*0oB3e&l_^r>$h< zfXf_RdlRo$v5^epN223EcqA-dKz01O{j)(0XL_PC8~vKVi<(mhMc+kPN7TDU~q8oOA%K$y>us8aS)r8)HEU9Tt8& zjt64ZvCYsqAZucUc921f@m$VWZUhu9k=yY`POILWyo@oAgBg*aL2)%;_X+EVDq;R% zp!x1y6@Z|3J(87 z-RwH<|8v%PIsq}lnYCf>~<22bHj5by&#ZlWo6oYzO(ZC!<34=}lGS{CQ` zq92Mk%<1ac5!qahX~+SWBRX*EcSmFZqSE^cZ&ZNzoS4-}GRbPutL2X4i_x^PK&k5> zPy^4?q!)Tkzs3{ax1d?U0hQ`Uc5GG~pFiTOIVt#KLb!)&uCk5RmBSi=mQ3|^!I$Y1 zPQ42IMLv|oF<4q6VJGap{g*&V%_#&ScLYw50%bJu2 zn;BS{Du0i7SN5_eosNi{9e|JU`48zUp#^}R#m|HrJHrN!BuCjc30ou3gAwQ_5eNY8 zrsOV3y##{RZ;}Pe3f!qZZ)L;P{cG4bNF!L98khU#WoD8Mp^=eBnAgzOxWc!-k>ZoD zMob|v&dqCRyw!i3xsp6V7&!OFg@<3l)fiQr;qlwacqsYIYin5UTh8A#_=mgh)Tni{ z*4A*^U&4uxMRL%Hk4)iTzkS-g)vKc7AGOlt7!HG`p?HZ#)F%TzWQe0aPWVvy zM}4Z{V^Mv0K5m206LC0q!e=2w5sh^pd`Q)!K0k!dM!ZISXg(kvL;0u=&B>&rwT}AG ztX?|u7xkgJNlTm$9ogwqeK?2I!0w3n%=0yF^nqV;NDdOqXD}M;KhWWDNP@W)JTh?7 zSiN96@1P*k9Igpr+(}GdVkuK6LnHELO%QJX>zS*glzl2?!x+k#0v<)#ForTR0-Pmy zlD4(4Z+tjPd6!Cg3Zsl*fldMAE)Cj3Zf~4VY#qe*RZu3)CzsMZ`^QnOdqIswIM6z7 z0hlzXM#M{F${3zWlQm)?o>XIhwe!rQQJ&vdDPI`j`SW-VW748s?V?MTmMpXcQh?p zWG8nqODmQ#rmRL$zIY5}+8VFHZMvM^sl|6SM=4*YQl7>rQyRCZKHSpArbV?kJ{Qx* zq(xsRXvA4~lHl+8&g|*Yw2D>AmyXE=4GiKbUpj^|2m!~eQg-f{{biIgePc{+`WVWo z@QtTDeGFy#0zxCw7XU;iKkM(%MF@+zRVwAnBl4k{JMKo8@)huoPwVnAY0Y3bXYr)E zH`2bgHk#JGD&-kta*@VjQSAuxHDe6rnGB~DPqM^a_tgA0iv3?I<(ZLOJd-dNS28-W zY0Vsy)+~mTizk)x^eg|24r`dR!z$%jEUj4mp|XpY&#W<&XEPjXZ;8z5PmUalQhr~h zJbMh~tHw~CJ%%!jCQ_%d4cXJ@UszclrTn={`D#Yl>@J&6+Hg0rM6q-N`A}|`#QI#H z37?8MpZV}{#roWs4WDeJ$x@HA3F!!lm&Vm&c)o_=kQD+^;rjlCG4@A8<`3=~Aq}#M zmGl2%?OoubD$e)uv)Lsqu&|4+5H*zutD=bzOu)oNSs-izLf9lEfdbiZNhHW6Cc6@B zxVedP7^BvfPnnYa_P?eN=Jsv;YiOC)nTXC{}4(nWzwe9x8v z-}t!F6XLp>V=e+c)y(0qk44w3#Wh1RUmcCBG%hX#P?jdR+?L?7Ey3mC1ed?Yx#)9@ zdieNMT%C}L@fi(2 zuxL5$75-yB``7*6PRh16VE&`f%#gF(OT1~ zie(rWwG`5l8kuVom~-G7&wOnHGxZH-QzPzFI88^#vKaG&k~x<%!&`Yqx`@_9n!~c% z_2dC_cKf;xZt=0_CdBUMn0dHUS?rndc3Uj=7iC=TXzZ`Y#jY2i*C#Mf;h5WSr##%ce`ZIFxmz+%NnrNyQ2NnoN&@p# zj;X_)%=kwei(|~TWZ^nBfq5D{;&Wqa0`qi^xgB>CuJFOFsNiHHGfFZ~Phif2Z#?t# z1m+nWLmD!fKi`~wQ;a!RGS5h0_5vHvJR^ZQpJPaGBuU3*4)nyB=Sk-L1m*%BN}td9 z3CuK_pylFD_3+6r#{VP6e6wVpnZP_Nfq7;E^Nk$y253o3zIyPFHpiGZNahBQV_|b}b@A&+=F(Ixw95aN7V7^PC?In|VP<|ts=Om<}5Quo@ISI^Mt1;2n)=Bqk z-T1?BjQKgqJU4;am%uzXff=d{Vy8_6Vt%pcnq{mvUx!E8j_%#4^R=&RKDl zCd36L8<;yyG+R@Y!pm-k+JXme&KoFx%M(&DA0F|kC{JKsz%kS-QvO_d`u7N=F<&Z~ z7YJtE3e^vJs6n`s`TWD5{#%5nr|V@X!o=6!g>Z?NXF-BIi#R47camb_|LCusYw|3T z%!`CPy1DS;1m;Bv%oQ9%U$Ugm_~Y$YeimcCSu$5}W_T;NNf)wH&S0T5>XLR=y8Q5s zPgg}k?3Eld1$Sb5fAM=@)6(^XWUh?H{=8vaOE{0dAFE7=YbnRjNQBCXwagh^vAF&z znU_Z6`j25;%M#*Rnh@7=jyVr^GOO;&xhWRc*OGZTk4rzERskEIW6Kkmt2u`HZOXB_ zvhf&FOt6tLks=OLoxqIf&tk4lU|tc2@t&!>JjU#h%qtR@YvMxT0h?S@lk_WHD>;U~ zn>8A?k5x08mnL(nWM0Xc;jN@g7X>bqM(hhDxZo3T(h$a9AE;ZiY;~=0A{YId)y;4= zo3xH*ezgzXs^C?WC6b3Q@u8pqArz&A%tN(TL0~P^1{sPl@u613#jF*B(m3(4S7V_b zkf8_@A8HK`H5_*`KY#n^A7i1Olc5MB;y)%`ME>aO&st#O>(9!BvY<>dn`m?WwLZh%=vZjjgRZr zgt!_whGy|()@<6=5{s)uGB+fof@To$%nb?5yiYS>NZ{r-e)IP+<|@g2TLSZs5}0pG zV5Yf`*~EK1*nU)Z=9e+%b&|O;fq6p$b7KPYMvg%i@OrqpYPN2ssY>RJ3Cx=km^UUc zZ{`@N0=!Ij%RL4V7`N6DseaAx@O8rT|eI? zneRwozLSU2=f)ig%v(9;65L7V;zuWS#$qjnD6G8AK*@W zI~@O~>uIYb^W6!|_ardioxpr=9AoUg zWd13S9V@q46R%N}B^Yiflo;K+fcckG?=oZvW@K?LX>bvSWacZtx!BW;V&F0{8!q2K zc@xYOS0;kIpm&*w!c@lSU9Ke;b+|6nwUgkoQty&OJb7_0*>LGbvx>%*lLMEh^)3@K zC*l}doXZ3dO^hYy zYqB8W<#8_AV6H^{h+!te7en$(n$w z@CH=JmM;|uk**ZIOV%XRI#T&!5>7(w^p#+p3u34JTAd5x z`YhfBsi41Tr^6uj|HQjM<~QS9sJ!TpUd2LDBitMBf*jiw?*f@$jCaY#+amEUkeQBm z>X;$(@8Vq`Gwq%0Fp%(pI2Wov^hS6LlLHC2#k)YlP`nEyTp#ZO3D?HEK*Fkc7f49Q z;dF69LOQ^wb3v}sSqGg9WTu0MF&C=gbc9pq0-5Q!sLlm4kBWDJ%yiO1hshRiGwEC) zGre7;bAilV7+`cRkeS}r(z!rpdcQ~K0-4{^yJTlV=2zogATy0#(NNi$keS{O(YZk8 zKgYXdi^IJ-3}pV59y5{pjoJ$Y4{tl!nUH6#9+OS|b5*ybI*H zKHdfLWW~E653h`OfrO*tU66+t=v^jKd#AVlD5dfHj6WlnxP79ZCXCega||6qJ`c9P z?iuv+*hrl%N7(z7G``Y;o-c09MF3@4f=fe!%iVDA59Poe#lX!k5|}Z$ zLhKhw{|`<)wJ?VMw`Bfh0`sqUC_VEp6PO?7nCX)FfrW1@k1>BOnIBGIek6hU;RNPK zIVK%w|Hv`7;0_f^dHukQni%t6B=a9R zGrW~H>7u{|D{s0L@@L^2U#5Rdi0e-r^BwL`yp#)0KXPF#F8XvLnLj0@;?Ho6XZ}+H z^Itfo8+V$&YA)l*zkr+O6WlQXwq`i;|Pdp&``lwAHt z5aPUNdwg@J&nlR8W1;7!RqJb4Ovzndvn&t?nKsokW9r$(pEUWT!S^Ol566ao9@26wWMCURM%9kTJB%5 zWXrhe^`#<6)lgei2mVC2`ruM3r8uAZ04SH#E%#TgS+;h0 z&6=CyNTQBYNU9Z8OO{vF`MD_do+%TiaM$X!YXbgNki_H3_2i1+OX_Y4uC9XnvbDiA z0Vys|vBoIU=EuQq5rTUL*VI4=q=(WS^P}v#xvFkWR61npiY4_jFU3}@vls^;po z%Y&;>I$)3`rTD$`{P}pE!@aaxmpyB$Z)W~f-;JL7>NT=D@$96a{4WbuFIiS4YPBr# zRW!9x28ewwI;Y)|5%MC zwLHPWA6T(ASdWt9By)nR&LZJuvU*9NE}ok^FI~D85h4?cQ8vrZ3RsI;z9dkktH?s& zWi`wFb!%ld%XHQS*9gIQ?)F}fYSt{TYCuUYS?*t3UCrw#VlD~5WwpN;&VoU}M8;96 zRju|{*Ht0AW8fJLfx0Ej0^T|lx8A+v<{D&w3`eBXQTNYwD_OC&4#g4!`n2ST$d|8O z6USRzwW?}KeU*%ls=vTdO_ymwcEsprG}I&tH-r8pWunMcRX6jRMCn9MtXj2JwgM3a z0x3-=|Yio7I4Bl|hC|)~-Lz`$(j}|v{nf!W%j&g$CudG!{`9GHXZt+bUoh1VE)?`ECecXz z$mnIkx|+ax-^eIDu!okHV$)MZL9kWHV15wEan9cL~>MOs_upI5hJO+9Ka z`aB@!@E*&L{wz>ayK23bM-!*{@(c53PMzW5e=#X;pw7;l=_@FhSuo2(e@7|K>sqh3 zz&Fi1_ePKW>q>FH7~yBloHM&{Mxi%ONziE=BobcymnMQ>+`%0->S*^X z_GwvjmOIaklHgKaAZKN;9REn0;vHnY;wo9cCa|QzKclX0ZJldEW@c8l;woKJv$|Gv z%vH%ZrA2axMl+PsvJDqwB0oB zp0)X(AHbVfG|hw2zvoELw3hTVEgI;}V23uJEYY0rgJt(wIFI6(razNH*alo>GsqS* z9>wF)pPV6|F}Mz#g-dhzD)sYN!qF`ME8t9CdJ=O~j|1`Q-ex0r;u|6{^i0NxZyazp z^utH_QgDuZmB7{Z!*?0@ZaYW5M}T{_AHI3ud;T2xhGMbe2ee=TW5U&2{$b%%xk6$H zN5&}s76Z4sA3n;zb?3-;4{(q4!?y!`PXe=~fF#2z1TG`_HUV>w#2KZR&RjeQOv+4R z6KiHhd>Oz@mN+B6CUAHqh7;mu#J3N)x6gs^17KFn5^S`lXT;YC%v};^BwsGV-!CzO z(U|X5;QreW-`_!U9GHi16l{IT_ZMJxNt}^J{L#cvm@}lyJ#E^VsjQIWo+~@u9RU&-%Ir7afL_5Mo#wfjM z@T-#;!jUnO?>^uj>xYkq+o#Ww?@z$B_QN+4eEWcTSBEo_uLGFVI$Uq%L3>>T=HjL^ zMtlze_mspM=aK2M+@Cq{JD?M<+S|3e1H0oQ|i%NIo|(H|lV`$rk`kDKL9=I3vEpz`U=+^~U!l z_)Y-x4pkhOzUs?>A7Y0G7a61UlJ_Xw*6VOwKHZxj6yAy}Br)_%#^cEJ^rp8n;2zTP z^_GsC5dOEo*sv>1hU7EKml42RuEX`lM=C_7#1J1DBfcL2$NJ%;c?EsDL~o4vb^y1h zA3i!qdgvVaz9by>TFDrd+f?`smKYAi%}Bl*fm_%QUoFDZ{_g8K9OpZ$9t;8QzY?Rx zYg7+D1@4rNueWl02qc!pm5^ zpQi&?qT}l=-svD&49ufCoKgP$L1Oxg_wT^HqT}l=Ug{oS1?DnRq+$BXzwy9K(cyaI zqv2&HFc0Z)M)m5q!2Df@>y3|w-kreMD`A0&%6C?I41(Wuj*<(`8N`LzXoQ94rj!-3z$PXTyK2T-u@4m zuXH#gzSF=AS&9HKCS1MoQGa!T#1M{*5nnTKKkJ8Y6v96O%*#5Q5#JtQj_7c`$w%GZ zdlEykkul=CVHw`{#6`v^y*cokFEJd5n-Sl=z&+Xz-=zruhjZlH58Tmy_^t)thrpyR z7t%%blC#=5wYNNp5lGqZo`s|SU|w&yUfS_L5=jD#_g&keuFB!&ZVGva#( zxD);G{Sx83&XMmYs}$uoxX2jEN7IvMfU&IRus-$s3}7ZpoDtt7(0GAq)ZvWMdj~N0 z>u|mGYxFI*M}cut2Mj~;8u48M%s3scH@-B4&yg5dxiR9K58R4=_(p)C?i~5H0{1{a zeAKT!c8+{+0e8F~z7+6%1I&PsOo6*^pRe59AGkQh#gn~{8*fV-z3zRM8) z!E@w$8Mp)Iz<1;v`Mw8^&HHR<8KI?~%s$SV48Kf-qK6@ z-#x&jHZ(Qo^Am~di|^0Cg!|!3 z1K)mNI&?Ur{QDM|0UHqj#z?-&@Uu${2jXVLcO!5M`{ASG1XbtA_cU<-=!fqj@U@*I z-!b66?1#?}zEi*~ppFZsull?im<Z9rUPjQB`j+q#($F=NE{%x3&uEnH-b_(sF8eKR3q z#)$9uW~>X~B4fli27cx(91^`5@m&twB#AZR%L9w&9Qm4n`)NOXq)$G4j(qrK8(!S^OG-8!5RUs4Efl;R>o`O+I-72H#S*&=btcsAmD37CKN!$KY7rNbHV znVRusUtDC2(o1UJ#lZYThcn{)6)?}}aJ|X50({$n8FdH6+V}qS^}x)LI3xLJ-?SW< zmnF`EXCwJO0;aPczL_M{o!IliMW(OvT@1`>i8GQf4IJx$`MC~fB;T)r`Lhn!TmJ0; z-;2Q1Z-oV>uk=0y%u^C)B;ROo{2iD#bvPsW-Ua3>9j-U|DF03alc$n&edphNU{*++ zk$gUI)B&?g;`&POr@)-*hwsPWvuwlu2QD&wmG6_lJTGxZ^1Td>2rye1r|a`P<|Dv7 zD{)4ASAgbuV2>jR59y9j-U|{sxXrU_OwzzRIH;80+0UTEqT|>dSe+EY;zR+~fte(6M)HjYjR%;eI-F5@R{_(g!}XSb=kHz45({@K*ryox~03gKyj~@IC}CGDi7#6Z{H*c~;{3 zD&Gh&hx_3x2H!itjDLt??Yn(U2c|^gjO3$gycn3TC9bdW@}ghjD{#2T81d0}iL!zD z&BFrMSAX>lFy==D&WLX!yoUlaP2&2>zcOH|`{AQ=Ew#YxJO{qRz`WlNUn}@d0Q1bF zu)y@y-+%Kc()();Gt57#&qIO9kvKD+jp}n5FxCC=eT49}z?3~E;!W;@?>=B2lQs1m_-uT7hg3n|I*=% z^6yPxKGxxSYi|vZ=__Drp5fy4Dc_yI{9NLU5#K@D0X~QF?a*^Qy!d@r^z=S2PuW{yeU_R`JZyfl( z0OkjOhXtlD`K|!wS{<%8`Mltm3e24n*Oz<`0rONpd{ZIN-+}3Tj*Hi)9x-`4`g~ku zjLL)ROBpcFNL*j?g@HLJaYlTUy+?t$X9vaFx1RGlFds^s5nm@bz98K5oUYGxsi7~R z+;EXG;=3MxR{*nIhcl{wYk=9P!}V6a)a`8rX3~okYu|eIEMR^paYpjJ502%)+UZI%5=XDsUMR+gH4k zfVo-XjN%=F_%=z57PV2l+kpFp#2Up*`TRIAJrZY>&m_+kyR{g_uTi{L0+%bXeZ@N+ zn1?0K0!pKNZj%@-cB6Rz4crG3YZUK5czh1bx337c=scj8bJuQ68g8VC1B?;h$M7o! zW^y}+_1VrFfY~Z>MtsyQ-v`XBJ%Vo#evI1D<8CE}&}ZIoWi0i4UlMaD=z5Bx3xrb34^ z;#&bsgAUi*I8y+=+kx4q!x{1Y8<-DtIO4-6OUCET@J=nAJ#Y5RY1fU$ZTg&fqtmE8 z74yG)jXJjcx<&JjuR2a2Wx0uepR9fneefl)zP9S>YsO`bn|Su)+NCS&7uDe_RQSr8 ze|2C{bzmuM6|yVZh9RCS+Af__vkaf0TU#AS8(Vy3+T7Ye&FY%l z@X4~Y>G-x-4L*wqn1NZab_#s1R(^l)MN0mlVTvhjpu&D)R&w^4l&e0(j0Rz6=VGRr ziq$MccjZ9r#-LijTYNiAF@TbxAY_K(f*{er^yltnV6yfd_&gCf4>7kkCW~NQNA%I9P#iE?bR%IO zsFbmQ%bL|nx{0S{xl3uWCAkl*8<750i)Hx1Pr{!j1y59PX+gz}NfID$5WJ+cjD2O_ z{zkcddw2K~2Rjn}+`-!H&$hFD_GkB-!|w3Kd+pDDV}JHdw#wz~dMo^{!+d~!89wGP zzXquJfcv$JTm4-}%;5^PR8ePG7BA$n&5Oo1z(Lkad2D6u%dA%SzPf=sdU|>`RYXe4 zcc#IE{l~mF+%am%elvLvNZ%LQV={M!zAyzp^e+_BPXbIBGyl09cjWazHq5-oz31Xq zNRV$adoAi`z1(=Ri-P? zWdoxF>0)ni!8Nga{6t(4+HH-LK?ouC3fN-8Zo(6_HVBJ5{pD6oSd>g)Jxav3eiyCS8Q%6=8 z+m+SkPj9PO7_o1EtJJ=Im;KoY`!syQVSlzGd>r?E132~*hxwJPE^~OX1}ABn=mwLd z4CGmP9qgiEQ`Om9Qp%1ag>O;4;nl;^b+q|tP*my;9}Aph$`CH`6xgGE1IjI< zJZtYxY7y)WG__AJG4D0E4%uh!Y?+5YztAZgU8{+j+&g~J;;4fpqxBbgun$y_0o3E9 zHg^Uu$ffF>=W^Lw?uQ>QaYqCWDb1}xdvhmjX^opS=h-e-^WLC6ceX2ysu^oT{cuFe zStHzgf;M!wCFn-DW2}y~VORPd^S{E~maIeWJ@#Mj@>eWg z$ae9*$xpGvSd?MBxC&txZM7_GZ%eJSyjm?xs#b@og{dtKInR^E_04Z(xnLya#-xy9 zf&mWKK*heZU^7g%vx3abzt@_|r zkW+1Eg?1%19SwevwYOuy#d||<^#DGM6OqFOa59^536W6OciEfn z#50k&_p#07SFZX}gDEWqmUcvDQdFN+_1W4zsQV_RVE4Vj_JwAN5~O6c8IwZPRf z`=cCMDcO z9fL9CCPVfl_9a`L+ESR-Qky1n8kuuqV-6oJJZanJVZdm$Qd^vF2}ROE@3*?Y2|8Gc zwC@k3G#v^$L+w=A-QPF9Rk6^&gX%Yg#{h;-C`rwMTUP60UX{Lv7a5Df|HO$xRg3on zXu4b%4_=J6+hX%zh~2y6rt0cyN@^0@7d}49ypJV6n7->^ch?cs>tx|{=&OaP+(q@K zh`jc4cCLGH+e4h+zBAuj!YZsKqB(|Ir-Y8Rs$QFY=iGvlBHl!~gTubFd{&82&_b@ ze&1sDr-j;VY`PT!gu9cg)ns;~4K+M`686HR&U~vWFwVZcJP(j!kscKiZl9aSN^C_^ z_T3KEYvt+kLx{kMxUuOrq`TeA$4&drA>ntE)j}sLvHI1r6hJ)?inJf6LY=&@ zErRV)?uMIk58Ys(-SOYw;x0O`&}Y^%Ry!ZkV+b(WoBoMj2AzzP4KFDz&pMiQBC98K z%AziEIo6Hoas7-!+qbXCQ&%DB(BYd~HzcEE$#wz?z&mUzDu196oss?7U7=Q&ig^Hg zO;rC+srsJ^e=*8@s$&U;&(F+ zlvVEV#uByA%JzXFHI%Ca#@M&d&tqklVi}~Hd96NaKLSt&)WA@CTDT_}4YFFjA$&TS zbyuquNuuxOKvuF|Mr2yA0VI)0+bGuxF?T2ulY@S5=1q1{f_eS8&W zoLQ}EGAfViMdfm$#p$XQj|B-&Fj;W<6Ru?b_m4z<%0#^owq>x1=0ktKN!ad#?NNkq zDu0BH8k19Lg-wJw6m_#;^rXB_R;;l7k=tyrVXGBx4%nXNHYaRPaT{(5eH{${aanm2 z_yg>s_M(J6sJBUh>!1@@n-4W+xP7S`u3!a~Y^IaVTn;5;DC&@v`R3!t((|rte8^wu zI6IO-6yY6tBnMV%6=JX_<&+G?N`|y%Ik&(pK=l1kSTMhV1S>-g7Nv1{sKKf8%WAn3`VnE8E_55buV1^gwA+240zdtu%T11y+AeyIq>-cSXh{vJ*F!b%<1?f z#aD!x9aqIvOeB!uPMI<*s+u!G(>IbsNVpNU0sOM!j-y7n#Gpdinso?rLea6XJsrvJ zT@WT5I%%pO@H{0a)D0V-@@zRtt4wtRo~NJdg&pe%m=GUJrd~47Wo@yzARp;>DZV1A z3nUjVu?`X1of=sM%9vaMJds>xzP5!=Ou&wTpE`S6)(H&680f{&uVv$)3O}z&H1t=h z*O5iox~D{!z8 zazH>2f^mf0oUtJyblQZ59+(ez`*x45`uYo%`t#Wc`}RF6FN~sWJRJOoasLazbT+_i zVacq}A_mM5bTKG@7*#9_EBx%0#gSTwBbxT@QQH%+iKe|bYJ)}jl5Q{qlqB9f$v3gF zPzI)m?4xE!>V74&vYBaUBlZ;(-p3mW>X%fd0HM(XbKLS`<|r!bIfR_U1YsPo2XQ4U z+MiUR&_ARb43rf9djNMaQd{{#1(n%CVziMu$O~*?WXmb8H4fzU6u#5Z2;fO-Af9e? zwb-`0!)5iuSY~dSC14M=THN8fuPbC|_C^KQAQwi)A^>TKqH5m+8yT(fy#YIKd=^BV zEczQZjiO5CQAOA+Ev5_5G;J-U04cedfng%TZ+U#k4n>{D6;<-Sk!~ z2x*G8aX2d;n|n=Qa0u%hyC8ex*Fxi>%pjvJbR2`7H$FbI3!KkpF5+F+R2y$Q9$U|` z2;ncG8;lm|hp=nmvJN50RU+gVv|%e+pM@3KsE60ZXF|LTv!5u zsyUofPvyk1`O2r9nyZ&W_4jvqtrT&fjNP#rp3E~g)O{vUfNUI39WK(E)_f>1gx94a zsw`Govj`4&{tU)JSnsD$>a4MW3z)}(etQ^IEmSKKil(3KxMc%E>Ta^aKl6Sy|8q!q zR;WRcNrD%dFL0q-;7TB>^-JW6d~U=#=dI>8tXrXp?~fC|=>J{( zOBg!gKnkQ!D=IJH@;fkbUL5gPP}7B#e&#_SkrG%GUZe19QOvxJcEK)di^yG{CRG|` z>a_n?snP;=F4Z6|jz!DPbVP&R7sc}?)V0hL?U2*sb2ybLSfJE0m>O`` zYt)3f1_`|c4Jbm{eId{8K;UZrCrEg-KHRCdFd=#}BhHT8%_ENXE(@sev^1@;)dH7BUFH&6sFN z>P-XFnEFe&Q=f!o(!dZl0{xAd&B8DZ-!XhXNR#d&Ywm3+fx&DhA`E_owg7OFI*egC zlt(j1(wpV)SP{)M3)fpMY|G>DfRuwVGfQ#T6;z;c6&I{jisfu}w=HrR5EM)dI9E#| z?dNJvxKdfMDiB<&DU&w!4&sdriVLbOYiU8R5wakMDZ`+h#^R*)&sdxn$Pkp%WUdtf z<>FvzU$G)uu1kfsP@BcwRY#p0 z)U0Iwqb*Owy5>Q=Z<`#KglGaV8U&J=gH3bN`sNUbOhA!=RC&p0iJ8hNs6e51W5H!E zvvW;_dUHo$NJ+V-s!U{aF~+5oQX*S2?stD%e<>U0el>vkvmA~}w4o?CkkasN-G8wr z?&tMjk%$zriggvQCb$Jl;#r5XIwA2OR$ya32dj0GS`3FItb9W6<~EvwJGm`W)GV6C zkg;$T7D|F(MB7D8rHu<>pp7?c=%l57pxU(UZ$NWlF69AZ!v{#pbDT#%G(-cC?YS4w~ zXE1#BQtV{2D!HaoCZ=jMVc|WSljlwy7)Xi%vKy=9vQQIYCUjj~s9I;%q1>{{Kn_i> z!XG7L5@dyy)<7)c(FQA@7crkxQ;RBljgLkOicgz`R7K-MPqTQ-`hwckYnKJ*A*ojP zmdyax7m#WjJ~qI-r3sJBst(3Rf`x_$bucTSHFGCfY_O!jf+~e=B^5gePPNE_bzrr~ z$~>v+R2x?|d7^1@Nk*(0DauMNL@E0$^g%b9VGVt@sH7~b)7@5XZ~C1Xan7;157?U? zg0(s~ldX5K1y1CF4OhyhAz9d%TF5>`>kUgO>^q%B&4*|@X20u)6u!XHVmU~YN@n>A zKWQxRm4(g09Kiw#7sKw&JXafw(Lzjydp`ZpX9aAh9;h-yLlVfbdi zW`oZ>S2n_=0+HF0y^obzS+Ui;FFisPgkr%p*8bd}(7Wc)Nle7(kE5fW%tmPEHs@gc zWN&`Yy!n(Vcs_DFGlYdN(rnWZ+|_Xjm^010#BwG{jIBZJiPL%~Fs{(&R^V+WR_Z|J z6tm$dbeB)6ruODr5fum=?yu_#*$f9OwfWdI3zh|3MO-Px1hTo9FvtUJG1_+yM|EkaN=qTO zE9`f^gL2(gVA}kyc{6gL`2Ze6tx1Gu$)Pp}a`_mtE6-KHy#JHd+05H5tx%P|Bdhys zK=SN&79u!iAYKcV44dO9N)o<@jMF0Pz5f;>M~RCb`m@;SONgFhpII{W%}cg!d>DfJ&uFHBT6& z>hOCg-qiF+`e7_Cz?oJbCkL=gW5O!EtnIm+}6ngJWXt!&~ zYihXzyBgT>kuz#H#A<*zPK9(bVXKVVU{RXs27|Rn{=1F~kD|m3(%!TQZnP&vicS#y zZBjLkN|cocFU;!6>Qpya{8>lUptV9>tYjTpsFvE$`*|!ZllhRQy)7AguuJ29h5d(} zs&_G~d;f+c_Llp=#w7L?s=E7CJf3v#!{b4YtNTC1ltQeM6NC%J4$WO$Hm<*L6=;Ky z5(5u96zopt&Pv*tPUoJ`74wCd4l@*0Q;w+?f~-tJIpW9&Me-=YpzZ?Pc0&~Y4VsCy5MD+MKq<6Gu`0e#-K3%5D8rfeNf-Pdsw5T7H% zu@Qg;7;2^t`}S6MxTVyDNK+c`g}kA44vT*Qmzp$m2#QOrM%~G!=BgYj*=$XDpN6Ga zHW0^J)>?|hh72pS6_>IjT){CPL51^`ay#_ZPuM^S3hhoaf1-|GtomuCj8A&RG8xTu zg^kn}Vato!U{T8H2BT?vcZo9MH7Rg4KY@X*zA@1GQ6`=w=*w-;mxq@~{T+Qc&VY2$ z7XQKsX;2hiXs?qvZ%ljrF=q~amctM5W$i_lQKv_v!en>29o>+!xu*wRkrS8I-sHg; zQ=MCoWWRe7jWz`qswuT7M5V>zb$?k7)L3>L8Fj;GtU;dd&WTVDY2TULVhgv- zaJcupplrt3Zce_)HJhEPTj)N{zFl`UuWbzLxTw*ux$|7JH9E1`%bblOHqx8K!+!G`Kbs5=QE@{o0&0L~WKn})-K&NmFg zFISMxU_gP^(AcicLAQQ}@UeZ^5hv5kwKkq>9=k*e?@Y5EE2B$bs zJNX$7wIEH!nTCQC-iXr>iVV6QZXOaL#T0%hn~LLBn7!jsu1k)PI7%OxM`JPJzzi1s zp{F(@CTqZ1R#waxnrQ|#d`Bt36%n`3!for4X!1e?+T0_Fze0hnAswOBj8;P}2Ng#g zwV~t^LL@td2w*6S$^0P})??-DVki;)6d|7Fh$7wx;H-m%chT-MyrsgsZZO7El62t$ zEKy^^M?;Pa>t0v^EX5KaDT@yFWyi(oUG8shO=90NQdQH+%x^}wyKF7C8{FTjH(D2S zB2*ak0_aH=@Z*YN;3G+H#RXw7%Mpj_{>CNaY66BR-8&*SRA*xv9+Ge|1W*u$zU?r7C zu~})?w7O@x>aE*M7_8J;X*?fCA~+e6n9R%i0GN`SAZ(qhqMptlWwmZwa%S7q9*iAY z@XJIf1Q!Jo=_h#4wy9_O2)^g6;D{2j*QeNDHrb!M1#+9i$E-uzVDI4;h#@N5__O5r z*I7hnL3C-9$f6OQ(JW^%YU==6%4i2Rnv=*F$vE2n@>DbAfdUYv{9dE{E?!6+Na9AL zq))g&8=&#jM)lR%&ZmjYi;B^f=Nh5}Mzb>ON)t3&yS6}yjl1BbA+Oc64FG=yYO~ks z_FC$PvSHgSR`MXn_JLH_{nxa@PEl6kLS(2EVj}u~JZ6g6N)bD-#XS&FwahZP3oZ3- zR_H`GdEv?=XyZ;FmPWDl>Oi*^ycD81I+AgGdLMRHP$Ld)yXDNbBGiaoh&lP8jk1_XbD?(*D*O)&tiaCkWJVQ&fIX=ziV7e~Nq9PViMYKORlh>GC zRK{VX-W*H4miQVwPq1dJ(2x$PyLiTP{rWba|P5`nx-Dcy@{`ay8qGABJ9+UY=Z=dJC_T*fU>5$7I#OL{sfdJ* zUwrt?;Zr#O9mcadQZx^m{Rjh@VS2b=P#$s4eoGJDMInvC$x@)vZn_2;@VlP$S9h!q zk66|9Zu-81$IUn&HWIP2a7`;-p;FAAPC8E4F+=E-zXjD|-#6jvpea z+2@B(9sV8xt>#zKzc#x&lG9%?f1U28{D6XVawKNAM=^dm{g|^ESJ( zOL-?N>|pwvP*bR37+=c%A{Sa>=H@pNFHsKw&) zp(N?tzU4Oy=Ued02TU-NO-9d$$ zj=)hZid04N6QRzFN+T@i^HBXtL%9xpFM1ThsS}3gXj5>B2}x&oxs44euL>Xd^bGK!WW!^;Y| z<25WTGMv7{I9Ar4%rn+YRa4>Y;Tvq>jTR!Vh>%7Z%g?cdfl1;k#Q2~J=R(f#-3ex9 zH(E$ROldv=aY<3N1saeR+Wo36qhvUQ_+PSiAA3dE(M}PQuy<3dXGsTQ%W9~lOqo%7rLN`e>LTd!CIUG3r@!?~t+pkVXbK#D( zKP7U7vWKP8wwZWp${9WXfcu(L8Ep;dr8*SdvaygkYzG?Y%uwp# zZX`Per}|A)G1Vk49o)O#!rE$r&uB;?WX*t0$V&3ZWDVenWHrmSIDyN`D?O%TV8n8o ziUakrdPp%+{iAXabvX@BWJGJm%m0D{Vbjt2cFcU_e>1y|rymTTN@3y@Gj;DPOy)i7 zledJ)hS!+T4{l7}a-5!6I6`cE){0+}j*L6XiVlI5G#-UEAh^W_y(JCMAWX!VJctix?q?sT!6`sY&X6&oWdF4eS zNK~j9JPd92^Ty^xNurE>@;EY-Q3!>@+U(09Z3WOQ^|BIqf)BD~z*D`>k2xkyG{$T{gOE(}+|vB8|q+FE=j*0T*~kWEc{gI$z< zzHV(Tf{U*#ddgU24dk&FWwpk+QwK?`PJTv0*x;nhrW=fz$B!L$9y2i@5(`P-2%RzA zI$~Q=6Sfz(nnIt`EG@Ll1lM(+X0^7Nl$@jr`_Ec=NoNZ(unpq2d4i2Ho_4*@qugaZ zxdm2ietIk@;{VC_QAWvtz;m-e69e-@^lnr=WX)Brfr08&3%wVKp-#RXNuwPZEqFyN zIQn@Ct>SGB4hbeBkeU=xO}LTEXzm;fyG(>7Nkx~0%&-IofS@Bu1zW(Znj%`nW6lb^ zLIkE7N4SM9%@LUHz}5}Vau9p9qXd8 zwiNV?*%KJXmBN;y9u^+6FWALPLu;1Q8pt&AFw`t*dz0%c+8IjPt~ zEDjHz$Y`?vA{K{`8TG&s+KpE+=2t`p0!RRnhuR91Cf*|=C@&_gOL$XMZ>s7|Q@t+L zJ682(sNPJ~o2`0Rsoq-E8&JIss<)9-`&932)jMyiw?g$USG_CLJ2oRG^^PWf-^%Z_ z&7;zHLGfZpf$Ggsy_3~D?&Xd@#XW+^b+R?!NpBwKvSHD^q?|QWVg-+R@}N%nt$}25 zYELHC4tct;eS$L+KVbJ$2C^inKiw^|lfTmjXYMKAazG~g+j)sloC|pti+rM*NY%lq z%!4hK?JEe#%>aIXlFP^YLDauR5R}eCdFGYltvKvH;?+nxG30K;k@`ItqA@UhgNg&S z?_w%?k5!!}-o1>gR}Amn6$w2s&iw{NNfA1gSo5HXws50&HDiL_#Knu%k3U8QwP67Z z6MroOslUT%Z8mi>q?MV<%Em%3uoa6&R94>Z9ZPh)hM-SE3TTuUkQ407k3YJ2(gC3e=6`7yq-8idCg0@N!``m`YLb6fx4DvCmdeE`|ac zb;fG_ha-2*e4L`VxcR7Th&YdRqg6%Ih2B=Iz2br)g}R!B6Lf%oH0V2(YS?HP zbt<>OCelmog7QeT%pG{b15z$#voGNR(>v@CQ`KR^P^*?}Wu&Vakqe`Iutdjw{3$(p zRCaL|UPp0m7Q<_2AS2hiC~!sWJq?~=w%`R^Gc1>Fisn?L8w@BQ~{-yJEY=88czKzvM}P)G*j!AjVW|u5!%=G$Kjicqtmxu zffZ#$l3L1EWZz4t?MBjS^6S_xgr9Zrh5o3!cZCDHZJRgdo?B;W(3F zD=yM9*2cbU?&N2K1C=FmX^E>xc{oK`j%8>P*?}$It2UoLKX@I>FF<%lv9`#m>~OF~9YVWP+PyY<{59R!P{Ohc2%skanmnNUvZ18A z;iW&k%jQ=LvF0B;#1YeesPsi&;ECGi!bbCqWQBGWgl%Eewlr$HIckGNckDwX_!v)a zH0P+MM;IOD6B~e}3lT)*6?GwGL{PMF9#|ZlXzoD~4^)EI9mIhm1}C;6OXUmXeAyA|HwE`qp!Ud`b-q@!qW!bxxmX+$S`Y~!K2gO;o>;~D8=mwP>r*Xz@OoJ$>ee7m z5Zav?Q7x`*p7SOrX={c7>*N6e%jD!BcA;HX;y{;}g8?9$RvDwqc2L(dBQ!D-v&dEI zfv7f^(T$V&g2x&9ESox<$>?wf^GLC1lTDfG(N5uc>`lK%JTdJPTS1O$mRyZbZ(Q6O zI+n}>6k6z5`(?B+F@RR8(ZW-*TC)yS=h8kiZT>s#cl*JEWm|SD&PE_wXP8Y6vqfPG zd?&Mc_(dbYjy}~34|9G+=NG}_wBM72fGv4p+A&V)puJambHITQgE%(~#7j^f3tr{N zDKQcov1I_3iSap;?N2{|#AUGd^j$?hxK4(zC%r4ZgEys8>YXx0s{&f~By?Eq%Y$b` zdRw;kphpkwPTg|y%qDy~#s<3CP)u>;q2r2loT@Z`OWEg(4PQR=N|Qy8OyZy?fMf-% z#u9?m))r?DT%G1O)OoMa&TI}=a2_9;mxN|JiO|9G`2qS_|MW=!I#{p=0k&Bp~1Bms*D zq$ep0A}uyokwn3nP&n83XLzl2X!QwBs>Nk*roDs~r%S%OiP!CrL@fkzUct$*z>_8T zEYEQamnX_MR&)IzDgu^YAwuwnv{9LhCTx@O!Wq*gn}Y8dT+PRuXuRAxNQb&pu#U7C z=k*puR$61;5fe^x{ldSPCk1|fI;ydN&tGW!OsE{fmIwLhl!8-P1RL#gI+bm(3E$sF zZU2bcj>0BFz@nVOg+Rz-aghBa&tpi&R}^U)jW=+yCa=w<9T6%UI$I#hC>2j+w3UZ5 zT6jyS0f)p#<9ifTOKohJ>>$Kk9C@Qn$|;I=&Jm$0Sxfy1ZAvLylZs-&YvA(e7mggE0W=>~lY`gOfw3}YxsP5%#H+Ep9qw1DTdp6; zlC?3MR`D)@R4>v{!=R6+ncGc;7_(f9@lsZVR{cOyVR7%TA4T!CICI^H*E!iG=KX46 zn)y|XY%Yv(v^*F)@i7Km9%P6UU#iom>}foSOy^^xV&y5Le6m6{&E4q40TJCa0b;2) zs2g4C#xy9N@soFLaM#|!8Y(i0G$0$Bk;a#f_`o$pu{Y7VvyyG2?9c5F9mn?A1!d^S zQy`0CzmwWv?5iC1=Tvg;akX&Y?d3_unhrya2BGZD)P4~I#>DeY$2*DSxw)p6Y?C|a zvfr5k&&{V(g69|c?A!B`%sBL<)gT*dJ5J?of6jqEeO(bRxIHLi+(*TzfL8#SC znD0A=*q_6SD}U(O<~#E;=`9@D88Kmga{#-jr|_YNB>QvgOgK1{hP6?gKEMr!AUg(D zK)NYApsr`;t^oHt;H0XclD-{a^gS3pJvBTkCj6)L0KB{FM|0iEQ7H1{k z(!UurXpqS?Xi!p;*=(^47?7MiaG=#X9pNrPxhE^LVEX~LQ3O=2ocwKbu@X&3yr_OS zl|R9j%5l_^FXA@ZOu3NT{sCJGx3$7HlG}E}HiFyetjq=6_D|TH-1Zu57jxUcVLPAO zC^4Vo3IEYMh_Aez2Ol(H3`=6i%Xkq!6(6R%tVElG@h>;TEx@Ph7vNK|08cHCx+Kxw zXinxrWTKN=fF~gaS5}oVLJYAeiZ{cLmX*_2G3^ zZIk*Y9IryK7@7#+lEMz+TZZ_AVOcTlnArH?EGTAlFf8LGPh12E6m;AZ`zzWKYMu+< zldxuW>LSr3<#V{Gq(RV9t~eFSf>n99sgm;#sL3o_W?#VEw}KB@tvo^DK4C-C=v7e=12 z1g^nXWuzj4v&++=Ok1%T>~#bV%asmI2GfrSt1^s9a9tboT)^#oHod(#$p zvFTWa3*1I4i!(E@4r1j!p3^6n9?;kDdP3Wd9(D$M1tPb)F)ts%t8|Fiwpv^=UoY&lGZ_0zUM9x}gRMN@>6fkW0U`2qbPk;>ymot#O zWxvUag?}1fL+_ss?ZMH4jAN#lLRXq3;=WNdWV&)TSVmH)8tc?xYvax`cmjVrFQgj|Uh29#(`n#@f!ye$}4njs+N zK=6F~bCJs&m~;8$M)Jmt)A*N-eM=mx)Hf;D!#@+*7T8g@cc4MDoGAK|i!5i2!n?V@bfR(Fj#@~~2AZ@Q$TCj|vDRx*q4(2j%!Sy`9#$QkGIR?gdMl69b zEP^9#p=0*oP{f1|Brt$aZDLbb){Xj#g|moU!RBqAc0F*$1X)M#9Xa{^F39IpUcz%G zw;hh!{s$YqJ?&Id5l*~fQ4Sj|cZvRDEo@}W@?%8BykhhI0&5W3r-4En7tv87TVSwG zJoNQN(MOxuh58UwP9+0(A`($dBz_oeW3rq_fz~{$Bw+H_T}@mm0a!;{G1QWWi9!uRuGjaVwRst zjiR+Ze?B=?;O(t+`jKFE`aGcjDdpy${y z?SU*}w7DBL(kYzEBe;u#ifI-v!Yx)jAK?kv1&vO8E9_>TclgQ*pUlc-SInP~3@abj zU@s}-3oh~iyRuTwGBNmYW#cHuRXU87Qd}BM=2+~tL0t7(zGS+9@8JnyNxKjV5iH6Q zT-1`Z-lA3(rHf9<^2)-#X5)P9tr8pwOJ!{+OTHK)$`L&~P7?*3CED~)j^Cl(E?VNm zb`NBvW0_7=Sp_fhxB?@5R3B1l3c)#0|4}b!3(|vv%_*lBNwtz;SQ*BmJthSMw^Ukt zPGbR%&pC)*Xj9RMZ80A!sHx*kR>r_a334iQmQs`fsZ-*8{}61;F@!pm-@^7N?^J2c zB34!};b{;qv-~7*P-c!Z)J^YhrLf`c78m6nt-c0^QkO&XOEi9G1aI!Ga%Gg!CR`^z zeK|L_?0}5PWVSycXEO9UA#%ZCZ>Co~kOPj`rZqo|U~g`P2fbGPZA;_8CR1B}lG2uM#$~}ZKzTVCa?+L~y+)QwLZft2 z?027mjjB9^OkuX$VMSZh3W_g^K*-C1r&h=X&?2X0KnJyPr@i@n0-$a3ltf2Pk&^9L zq5Otofu<2Uo`hrHSkX)+#VKepztvI74u?-!x6T`HB8vl-B(kK0x(94c9gjzIU~!w} zhRs{^ZlKr9@gGk(BP}iQKaeJsy#+U#ab>nxZqT%ZJS;2+pq1kNO}z1j2_%qsQ9X$k zg0W~!5wsx!Gj%%|2+tyHKO_yGbdV5v<4s#V_ayke`Zm)hEDtrxr$uvSfoa`94;){6IQD~ejHzKA#S|31&m*|R5; zh4=luzxO|%?8%%t-}%ln&)nzCoT2=Qybd>!hv{U9v0%d2Ea27$|NF?DZdZt$e5{*0 zy!2u{OuK;~-#X_a&coOV?ATN(zX}Q2jkMnimbeUxE)6ut&%@1;ZgeFvF$nSSsaDP% zM&(Mg06bOM5uRBYTZTmgr74kaM{C-~OG?6LY@a*S}wh(=#s;7rLTeztB}JY(kSX>Jz%U3$`}a)xEIIhmgtG3yKaQYi&s_ z`O&mJd^Ib?pRuOoa7T8Z=pAy)VpL4f)w#f9yi&|dn!U8#(i@l~8(2|2hG*%k@x9l% zs0=X;@N^11gifj8O>s_iFV|yCn|Ab4Eh#i;JN986Fh8z{&f-EWqZ-%In=7R&jZeK= zBW$8eusLRfMWgWp8DoUAm181DIJ|@ct046Ci&243#pi&X744O&b7Yqt6)&x^^2vAN zGQle4H$5ZIq{*-EijM63;KHt<2uZxyCdtIRdb8t}4L9mji2fsYtl)x0A3V;!jwLhR zKcYfHt&DVWvXHS?khrI=A?_m^7SmHwJ?_e7gI%y#4_0IJ>DA|CP=ks2A!Eo*6=SM~ zW^y6YCpEClWqm+ZZ#X}CiCp@kub7DK@&oY_pZj`LHH6ct>>>}Q1tNPJqGKzgE9Kg4 z^i7~E6ly7_EHP4J@RbpH#v>ljfxIG9Qj!VV!?4jhPp`HgHc@O3#B8u=@8O5Miewb; z$hWbw(AlDC2|aZV36EI0VzENILruR}T_0Xup-+fn3Lg{qC8?WQ(|K_A6TM<0FG&pz zYcH4*C>LEP41B{AF|5){J<&>hH6tThkcSA+D>-kVotIXX;(Oq-?1}%eei3RqS4`i| zm@~cX5HVc`n}{i8Q?YR47TC<@mWm}J2P5WDZ{?U$pYjVmA3but(Wwu?LOqAEECxAu z;G~`8E!=nS)%2f?o_rLADMgO#^!`U}woo4yTF*_RuDe`J7VER{jDsIOY0ZdND}ar9 zv|epKY^HeBa}Y)>1igdBL!Q9WUMyCi0zjP})Rg#sd8)oDwf*w6cJEIAcP;%UrQq9) zdmaAon*S@v*%mvN_H;)+flG8%YRf?VxsfknOHt>?N$qQ}^~v_t?`T1d>>=?7Ar|3| z0u%+v5QRZ_@>>>#hCVbr6(5fbc2#h;sCxzg<4rr{I{wcY3hXVnvb0q&i^>!e**&E$+w|s}S#HdCf5? z=?<&DX{{R8{#}AC<{l%N(2H4=x_aWA_Qo`QJr0*Ss@Xz=^@3C+Woz z=vZDFDfQ8Ya6|bBXCnwiA6w%?UtFbiDTDfGdkJmiSA3OuFz&uZ?I5a)Vf>V6Xf%UU zWqYI1{>L;=F%4y7EcvRy<_<1pvHcyi%wrQ?6LxRlMnr2xZ;2u^A6wOEVxYYuS-x=R zPNeJ|j;)Xrtap*5XjL+zjtRB8SagLUMQyZbf+IQ^4V;KGe^;uDdVZqfnGM@osLjit z#@_=G@u^g}3EPFuEzL`Chn^r`NheOWb#Y`OpQdBU*cbY@D0I#Mi&=^ONGc^b7SD+3 z3u;_D!skJ@F=brEifJTK$6_IzeoSVdG@71{V6ZwA-bH8a64*%nUab%|(QSi;KfXeV zW0OhrJd0Dx6DknEMHpx}UbzRTGH+iQ=e7p|yD)(E(1wE4*lGsq{a}H{;ZVvVu?nMd z*@dE@7^`9NF^`d7wHMnEo)q1+CvUV(YY*CvIQCr1z3(*r8s!A&*76^de>KX>-)CS%WoXz@QwZ>Hthb#iry#C`+)xH zZZW|!uPYnz6bZQiwu7vx5Nt2A4Ho`pEYcTkNivs-1FR`TSnO1kwR`4%)J*=)@BqC+ zEDyj&;bI?_FW^lFDbpF_8%3lr#Y-fqR5~%l*(d?uUM?2-v@utuNLzftB((_RBdJiuD#4U*axF-eFKp zd+Ed-NhV$f(wwLHqL=zlqyc>Xo;C2M(7^xrMI-qW6~t(;k#V3nka>?8xqYUk>&aAL zUHB9{zFdW+o=!PYidV>yXYg%d>>LQAgXw7Z?$h_|!TQQ*#VDZ^T0(pl_(VulLsHjY zgh|aQ8RN{Pe{q+8rbIqER$0ExDe^BSzmOc*&W7Z0w|z)ZoZ3V~GklF?nau#v$9D|S(*RAx8^{3q zy%^tm%L47Lsip1Sv&sxoq#c9zBfjo7S~Jq_dJ9*r)V{Ah?MGqjlDa8Ix8FspW=1`1 zi?-r}Nfi?j3$GmwF1k7P@BGJBPe#@>#J5L2`k^wgEXk0}7n3Y}zP=~g8XIhQxwDF9 zFeUB)E_Ty9`QJ3iA=FK^p0NEQX6u6OQ%-gpa*%j>CTt>E=*5DWKsl7hVC*uR9T5pc z>EqIiXWNU%;EPmPG2+pOVCvvGG`FtR7ge@jZo_LF=-Lw~jeK;xvTT`8)-|ZgDM1cm ze@VD6MM`WIqOZ=*@1j=aN}ryOr1*(ut^iBl*otv^=Ee=U{sgZt z@Gi=rG3NP;M;R`9!6-?L2LKsq^mv@qiCTa%UgpF!D zVcQt9-5j&s1DlyJkKvAtaoogF)(L-|$J_P>PZ}fs4)^9a0Ya|DE@XT*6857xPJB&^ zW;jr@dGH;Ghvy=V{r_-BXc*e=xKY2M4i4>EKf|Z)oV9HotD7QFL%4p9USEy<2zAJ= z9#jMFod>8MkmU$*7E^!uo-h`}yJ9bw(T5EWa_^*NX?P7FDnXPA^xW|wJRBLq%11R# z`;a`fI3Xms(7m&NZM0vlUV)R=%9CpGg1Z*Gw84R6YGx*bCt8j}z;KpGt_xjqyfqI) zaFK7Wflc(Ls4FgdVvoXRcFJk_7UgMUwfXm~HzW|g6zYSl#-d;!t$IkO{M=4Ueo^O8 z+R;R*lllRM*pX*^UE^?1^C}{s z`UBZc(F>~aEn=GB=JmopRwl+k-20=2B&+n(qJ#8Y>}7Lc?+p?s4M*2tQ9bXp#h39h zp-Nv9r&m3+W~2c#HzP@%l^H@$0Hn1S+AvkG;0eK zL4BnRqacEt@Ho24zt?Qs~qo8~BVP*#ot?P&!>P9?HMQ;q>1@W&>ZGQU5x$vHf zRhFeLf55c?pXr*vi(2@FU2!Weki8@8Q+@hE%Hf=mn_W+h0gAVKL+}87@)fPDtjB5I z9Hsauy=QnFFhndh+T@4^ol%U=lS2JOnqsp_csh;OF6fZcOGQNH&|xHSrlB2(bPcPEPWuCC8mD-|BL{=W`WZ))FnOvM z;B^z$5R~+`y9ne)Y-XiK*R`ibE={#bm%AX^Z@CQr9X65F-@``JPhRZ;WO}g}=Q7yD zJJ2X>X0<|tH!{XNtDBRbnn~<3!l#E{z%w*dcv0rw+yVPt`1Q7nMD#S{_mZHT_{xy? z@q!`mCmJTdmpLo3w?yc7LHb10yjc31?+8=>%!kf9`Zlt!X+CvgxdKWNbCn0mmnA6( zSNM!tbb5WebRE216|Wx?Ko$ zOmKem0t_yNpr|d3S0F+qMieMrL>rw2+k1$em(Rr!FKwD*ZhFl2a?Hoqu!+p$g+DQu zLN6|bZ6s`hWk$@6j{h=?DNUv!ccDQR-)$LUWGI*X%CLS;9Ug14mXq}nz0S&pD_-$n zItdGw^p`~OJ4O{#H#)M&0krxM?}UU;D20ao^LZ!wa0HUfnUaR7UX7wnLwm1Q44V*c zbP!gAz*m}(NMYMBLq2?Uf(4`14zUBPxDaFm$SX7{-J>=!XN+%A5W#2;c>ru8<~Hy}P7dyC14WbO^28cHogv8Lf< zMj$po^3tgIdBmD>6fc-E(RH)SO9FWBE2@UbGk9YXo`y_53VF;!Q|jo+V{?l9EEB!f z9aAZWQG`8;rkSt<_9mgYaSwuCcjE|ZNP@b>Lvw1_{TFJiZK*7ifzT{e8ZWD(%13_| z-9hiI-~7lk0Y1F#-7QKSR()5L#^%<%@Icl1C_M@5yLr_pg)*ejuW_^)@2*5i=3of2znaOJ2^yy}}-Gv{`;%`ph2n(kC zSVFG*-EDt_QysY@zK&R3ioTz_?RvOQq|I1ABTHWTjPN>K%fhR-=B3;4X`03WgCx}QUzM8vlMXQx;2#}V~w(zk$(T_YVEBJXZ2 z@3RpOSXOUTR_Lw)MUHX~d($%%3pu^r+Y_om!~{1DeMFU=37Z&J(P)v>;njA-CMK?F ztSM};XdmG>6h9j5{~LsUVAd~IPN@7++hXcGOb+fzcP~tlgZ&Bl9B(AfWA5Xez;@5_S4kN$tb609u>QBBkQu}YT=c7Ue-h` zOoV5Ig2j!XNk7sboa7f&SjmL*i$yt2GuCgTe9{TOnfkW$dkMBV{cieKl(m-T{;?+; z%VS>T0HN{t5*or+{v46xzIB@b^k(At`Nt4?XkhGh7B<;FHW6I3v?+4jx$f<@Zhq&2 z!%(K_NS~^t|eWV zPbAhJ6(wrFlrLweS_OylDrhzJfbaJRh=C4ng2_zHpH z{v6yXkZ8$VK9u>K+DT0_)?-Gjaz^bpuh&K^XTaGPcGl_zGisv+#kflf6=oit)Rfkm zlX;MrUHjZST^{@HTK|jd`+W0SZPYob&bj{7TD&c<{pK~C>wpvKal(ywiX-Kz=Kp7D z$HWpfP^ZPV{y2>i;t)ee@MCVadNn|M=?Ab1~sGXCS`23G^L=99mp+1s=qZEbfUremnL zok5FHu|yr!r3apjI@Lone>7n&R*%A>W#i|>&mlYS^(P90j{BjV=d>SZ6qU9N3Y169ScNhyW1!H;VP!9ATCs9;ef5YvD>OP_)~;pO)>MT?j~PR3!ew-I zbIp>_>KZs8g@LhgdrP-5GrGFwvhdRMa&mwgfw?jE%&?4ZuC5AIi94tsn6>iJxpy9= zWR-?=MusrNh0T@tkt_Qm2d*qh3gI$3RI@h3?hk1-d%^5#~Pxq!UDBx^mHsZV5OPF9#H513k=R5lN7lOYGI z6wjRsGtG`znVkwV^$_f~^Kd0|wR_L6P3Fbq1k+bx?gv*Zb6W+0fYx$ZQ$TA2qb%+v|6+cx0J z)K;wNTGcD66b1s;zrJHJ9 ztIX#r%;}7wdVtJ!`v;Gj%wr{Uy24B~n3XwQVWvU6-9~9mDR@(#^>O*ROfnA#v$YJ4 zP?(1+%o&U+#g%CGKC$~YQ|4uoIYVJawbeuB42Agu#!${D<2>)$xVo-YGGCxDj|A4L zjSCd!QH)uPE1A(*pKUW`rccn28Kp4)1g=)*Q3~^D#`th0bNq$JQAJ5Y?Llc7tuWIp zl$Ck3!aRmC)Y6lgv;EBfn9QA$d5pq57Fa9u7=?KpW2o*Tno|}(zu#p3n`9ox%;`nN znSgMggM1}x!G@;BrOQ^JA3>&P{voh6^l?h)S&aEPd53Ynof9xa|44?Or7%-p(aM~q zFjFgOw;?;Sapqlts!L;&;0#$Q0qhRmZS^JFkv%c&n&EAwQ9c?x5=LkHWgd8^T7Gng-y z%u^I*>L**7rzp&{0MBllhb!gID_%>Fn9K_$^Ce)m>UpZde2K!G%^2z@SO?10tp2p0`^J6I|J%}Iq!dbR(p8SK$XPU9N z3#?@F6#Y=kWo6D&m?@vwZBe@7w|4Ek_f6)9C3C*QOg()obH2h%V=cRlrj03e*48hC z8p%dxw`49)Pz8AIA8 z^Z2#^#HTRGOqI;#3iE6{waQ$sFwbGkFd~9+C+$FHF_=pv^Bje_0$3~a9EBN`0x;A^ zC39fSAI>+KYb0}}!aNsPD|4m7Otq!mmP52KeO4d;&}3dKndd3YluxY8^AzU!j9H1R z4ZqpVQ_#648yQ+xMP|NWj>}OC;A*$^dG)63vum1nUc&l1Mu;!5%?`REPZlxHwi9OSCVQw>*B^PP*T zkev<9|3vyCj8&c*_T|Bq!XmRok*5}}b{pk$!mO)&;<$;XX>~HSLY_FyQ`xu1v{qrR zV+@sgV%|5o8v_eN4w_XXQ>QT3!_~@Mr!XVi0Yfzv@r@on_A8Tltz=#%nB&rPIr};V zS27cPB5VZNL(lp7;0jyQ#%N6D; z8AG!iBx!fjJlNk= zjGJ`p!QKHJee- zzb<_d#+nbWVqfv~d_;-G)r_I?OD5x^mSJWrzLm^ZEBe_2tW`f(E6h>GPzyrl4$sh$ zCi8$~;Tlz#x8i}7IjS(DX#|GqWHM=cHe{I07f5DZVZH`fE3>XJw=;%TgpnD4r5-m= zk}a9r1#{e+k!yjq+b&~2SaC3XSYK0~3hC=wMIKatJ>`5GaO%VMtI~F#$y_Iy zuV?1qikcNmR#J&1Hgr>>yQ*S*vRmf4*b7GVZIfvR_0q2=3g>qJg&rd*&`pJBWy6gC}sYo!c2W& zEAuZEX3~S*7DB~9eDi)WVVueQfn>f-VZL2qzD;4igE2l_$^2^MAvC#$%-xdt4u$zn zV68IWp)miNF@ta=bL&JO>Kudl^c3OxYlZnPJg_qVT4DYTW2k;6^X{Ne&^a}jhfC() zD9mUcdNBV+VZNI&skjo~V|w}+lX<*kzFT4box*&#!u)&2U~tRk_%&}M0~#{tOXlAz z%=fUb_Z=k1@vRef{Mw`trX`1f#tmnIBV_|D-VUQ3#ed`#TsjNpc;%Zr=ct`5no;Lt);j zFz--g-o=>3lDYf0jd3aXwPfC$_60CoM|5af= zz?e*2(M{5xe{MmC$vnGCFdtBuUuIwNwdetb`56=YtCK-xTJ9 z3iIC?lYuMg;Lpnk7MjclCG+1E=2sNvzbnlDU<~yesh4}ouJ9_8`F+X!4~6+vh4~)} z^C8AuL0A0xrMy&PGJh?Z4=K#ADa?ly=GPe$lFWI|qc@t&$)~^>=5>Yn4Y*qK#_J06 zn~d?{YQyj8u@_uqG7px_Zz{}hv9I{N@utH3He*oTv-#q()6X`U$4KV473O!?S3L9E z3iG>+DPUfFT{C%Ioyj~^GQX=Zzo#(2t1zPpfyM?)=40Ddpy=4-U9n_-Uty*i%&O=2 z73L2a6U3EDim&a0e3N;;Wd2ZL{-?tHp~Czx#uQ2BIeEu^G?|x5=6@;7A1TcLQkV}j zhUz*p1wWnpn900aG9Ol$KL*ySjl&A_CyY6VXkq?Vb12}$^4^a{!U^3USa-DVg7+JLnX6z;my|x zX6hB>H`mnQf%b#Kj4GgqHhxf;k28h{lJWap=Zj%eW@leG!5mkZyWwip^Kpfllwh|} z>885wjl~a)G?|A;X3gfq)A-fAHue>tpEX+__>W&Toy3?6;7ZJk-~R0clQ~l|Cn?N! zg*i!Kb}%LztgvVkcbwBV?7*+@(%(F2GT$zlU0}B64cbO!)rL!9?$4O%V5PkAc-2o+P3G;Axj&e#+MpdX zR_6W+vxhN0u)?C9yJYHElldvh>`|EMtI1YokHS2VF}uJ@+PLtXkq?{9f0N7u!EDtA zt(mnl4^)`Fj5!yquxPJ_??N?3HZt!?X0NTMHcnTVy$bUn#u$2jWW&wNP3B{gc@UVb zGM}L^4^o&@854knq>X_i7@ms&bIRCdZj*V8WKL6<&sLbz6y_m}839&Uw7;glbFs-hLoyFh zn9os|hbYWG#0qp>xZ!;<-2 zg?X65e6GTr&KPt+IR&Q$uAFQ#UnQB-73T94=5&R5IAbW+!J^$V=XG>I$VTQ?$voWF zQyU``=HUu+24h~uH3eMP?4FfpGH;j684C0H3Uh|Sd;w#q*Fh;b_Jg!6llfW6d;yrP zbsc@6!dh=!pfHbOOd42W(I)-k_#%_}eaSou%+`|f6NPz{!aSNWXt0_2QP-o$CKLvl zFD3J6TTkW-73R?j^BBh54<0Jr=eB;l+GOtQf)mUbTTf=%A7ItS7=?KpV~jGm_v7?N zli4Sk$0^L23iCLHIg2r$K299(Q+JTu2~v7ft4I6nb&IOXft} zZI|-cX$^2Dg>@+A65sc`2(H$&$Wk;mo-y;lL8-j;tW$@W8k;FKHr__5Oz(wTYC=Gf z>6z{ml(5DtVNGNV^;IaWJM(jQnPJV7VNJC4WS*ojPgIyEGv-{d!qQ`;uuL*fR+#+? z^JIm23S&k~=E;w4Z!%>LN#-dEGi^V%YJQ5sd!Q{YiZ_~vXei_W~ zOXhrqxj!+Q^0Z8EQx%yR{E+#0ia?2GhA=9(pL_@X$IxmNljjJ3D( zQ$?P+iahffvj;pB)A@hB;|Eio`y}&x8^<(Go(1fS$~u`v!x}40d3H-*gt5xAP?2Z8 zBF`em+z3|6hfm%4LtKmYret1Z^Yvg3D$I)%=EaPe3s#c*N6)9|2Ed8U=aPA`ttWGp z!n{~vzKk*Nfr(m&=Xc&Z(`5cZGGC@JFHx8;Q<$q6b1zs)=EBlHE;gA@=?^EEYFp2I zSfemkE6lZwSqlH8XGc>T2AyzXGgva$+IliCRhVlP=DHX&@lDvjE^cgffn=@&vo&wj zE6jBY^D@Sunr4|NzOoXXISPZ!6v@2I){}X;!n{mjZeYwq;2}MKv*v5C8O%kJxj|uG zp)fZn%#DoMk1Lh;jd#3%7+gx;uxzLGJ+z(!%_ z+<#4{8T#)f^GaLKR9>YpuT+?uEzAe|?(><Y7SV`s=IxalZl=*teyh&mHnZmqD zVU93{dj8bH{`DPu&}6<}GDn!1#)B)G#5ZR&t*3rAD`7>Hu-X_yd6i=E)|kItVurO( zhSkPl#gA&QQkdHm=BpX=7+5J5sizIcqz;_ed?cB#w)K>Gi^6=h!W?DHQ7}<;oiUh>WJ&k!UwNa+>_sn>jBe{G^EC>yt}wSV=0W%;J#V`I z&>E8&Cp)rfxAkPcR$*>en6G2Z2VkH&;nF{)uQHj(N#^Sm=Ia&a>lEf281n~Qsg@jf z-Nv^~=BbkT28H=Xh4}`B`6kA^4_0)OwfhF#wB2MbmdrOP%-a;^n-u1o8H1w8DQKOi zT`HMxR+xXTFyE{&|AH}8erXVS@3uWfrp#+3^Dh+UTNLJBD9pDq1}|1QKNojg{+h{r zlVrXX%ozQ}wO_wvUzFx#R$cG~$`s`-GLK1Lgt4|?zf$D6Rgvd5#u($=+!2urO?h6F z%(vNk%5yvWk`1T!`kPm+H|2Rx`XY=~o;wtIZd2sB^91rZ2XKV7I~93;&A$4H$J*-G zKHF`|GgSH_j8&ey6nXAcClz*mP&d8(u@!dT_GTao8C ziaftNfjsLZ^Y0XSe$T#)^t$+-rRkT^^A4C?p}rYKE`|mR;rOUj~IBKnKNIK%=anGe^i+7Q<(2(42F(eBaM3? z^ts9WrewY!%vNnYpfKOBFh9tcQ*rGB_ElRJ-eNL;E}0)xWPV6teo$eiIcU3$#-~&Z zOn7o+#ANO_5Kb`LZCp;{^!%{Gyj@{_gfag{W~K6TuwrVv$vjvxKLTc}HXc=&A5oYe zV@x(!VbR{bVa#(TbB1JoOkw_$!u*)Ryn``?l6mizKkjcU~MQEYOY@ztZH5os%i{|s_+?UUe#LG6mG1} zuV2eIxi$3-hCRQbsj1nxDPPqb${fcuE5Z$-rtw*9udZJ`KI^i}=?Rv?sx}g4OJm# zD`>cUWnEEIRW;ycHEZe{K>!)zopY*}gt5#X8g=zPhTR9$!vuY7W*n z)(fcV)EpKuHC<|&o12T(1$ySb{drM9Vg1yc!$8=6AFrOox#!P@!|@&HnL31U$T zRRqJ0^-G$nYl2Jas+w0+A$&@ns?d@;tY^MLWQ>-}8$)$9Ew~M?u4xX{FR5yXBMAlZ zu}FMVG90Q2w%}1swfPWSYF3475aW0^2@_$)VPXyxwOq(3#bRcp z81h2{JIPc5YGzGyV}0XNk&HqiOP0r6r%ny#W(UVin4VKIEpNuOS=q}4d}?}5PPSAc zOH6?o3NZpV?hB+axDQTmtgaEI!*K24RE$qmvgk31I2#CmQkn=3c>V6#Ytpo;f->Q$pQt`HpPU@odqow zRW&XRS1qjxPR}!>oLEwrJ2ST^KRX2eB~WFH$pi&r@%}O=`gFQIxMR|dM<7eu~1EO zZPgM{Fjg=oxD?N2QRYY&)nC?J)qHudqNcfp>m`|4^XQAI!9oZf)6MMWaLsI-z8<`^ zaVhHIAlVK5Ov}m6D=aFSmN#u$b_h5+rG4t88U_kY$;6siGP9_tIA>;&2@{!_s+dst zG6;v5Q`w<1Oa(vAeI=J5`9Q`UHJ!+8v2-jE?L;t-i+WRwsOt>Z+`5`2B2F=vCT#ho zOkp^1f=+7^1;udWstVP#m94A>wTuj*0(A$f!MHjtjl>ZV|G6WVcP1;eX!UfI-8)yz#15;6y!6VaKF zIb#ktka!~R%Or{EQiKu{s$(@tOdy_7y5%=Ftw8&apct9cxU``rm{(t0%kogSX;oE2 zL(`JjZ7r?qC0Rw6N;KSLZwWP5%XVDeV(t=6HY6&dc0S+efbbpqMCPOEji^RMBJ;yC zj*559YohKT zpfWG>`elkI*QhPjlc1;vFRKrs%4Q9iPpG2l^}&*c8q%zVrrHRJf)tXKgI+^d6*_FX zoNFsyCxQY?YNaB)Bvx42muLz=OYKLH7|~^dW*Vy+I1*GD02 z(h^*Xu2V~}iVk~0!-FnxJ@TZPTvP_F_t1PxO@1>P{do6FNlU8h+WL^!G-%M z94?2(w;~r98ElE@;vrs!i)h;OWCqM@u18a(1)CsJP&{fxFwlURBjcW;V4xDYEL>Yl zo@P}oL7qZ4DNs^QeO_^_lF_(dG;2m)ZeDS5PBt~`V`a}L=7&06il5Bs(~I+S@`{SH zm(#S=psA+2b9` zWY(lST!d*i5FHP6xavcf2bZAJQ(vQH$2(D{K|aXN>OF&3^KnMKKWjlBpE_vP zf>B-7j1gY2uC`@mL%1cT?fjy^%;ITz)3c|JrIWp-@~mDl5Du?J9YQB4iKMKphmE?+ zW+*GFmgAx6ZkD`D*M`7n6dzPHR8ZneMxx@73s9(ry|aGfiwgIw5)4cEnbB1fJravo zbiv|%B5}BfPJ<5)N9LP+M27FVpH5lFyfca>TB-OPVbo5PGkUG@41e)CBM(Obh<*fQ zwQ61_TDZ0)ShIE|b%|upc3j}nlAKvHW@S&!3ig_2t7|bhkl>Q+{JdGY`7=v$vyCIg zre@(3v#CbuvIZ)WdkNaG*qA53U`GCo!h(DR7h^b)XPG^v|FQW6#rb)~C572j({uBC z6<37WSc8sERl{;4;F9c_xp}$Mawy!mQ@mnwPj5lJ5UW6fd^@ea5km}4shE zv12Dq%$k&$HF12LBdlY`j2S;3ZWoOkH%>fR+_%W))<$2~RImwi`%^HpMJE273A#_k zufdpBCI>QoJ;n~Ca^ZmYWUy@Rfy>rB)8gML5SI8-jn@j~0F$ka$&TNxL~fJu8w1=j ziKQ7?pC_<*blhAc;b`jr_rUCsIGXp%_8{E2Z!Qt;UHm$L`8B=NgCTe#zNdistHdSZ z`vDIQ0rPhf42Is?B;qT=MD+ritcFR%w-^G|0<(vfWxxM_Fbz&x+$znCi(3W`Er9G4%nK)~vv!K+6K^*iv)+lX0UnM_<(Qw&}8EEeo14 zorV5Xa7AcAZAf%=N8`an?KBTQj}J|f$RqZM>(E*COPZTnnrcJ7jI#56B`ZVqE9$R6 zyXDKpgc<7HW|F#hgEL3_hXpH3NoPUkt5a%42%(ogrYizgcJ zc2OoFWHRRyVWY>wc6Q7*JZ8g7G5Hjh*qJG$O){i?J_pA!N6+BnYWXNY|8czl$8w1` zzM+iB2A3Aj(B0AgdZi;;;lM+j)UB7eqQx$~(i5%l=mp+rKF+|(>{!^<*0Db6n?riB zt6V?F{m`Md{h<+hg|qD-Twm9d-4E^dcZEjdP#tesX?Y;-0P!PkoPOgClpDu!xp4BR zSHsb_;qkf~XNt!{FLB~HXuZ-Et-u+;9vp_NS9+rr5CFHX@>1g@LOR07i^FOcc5Of` zX=>f8U5_ih%F(pcnqJ&=r$5R5JKNW$JVDy+{I~tca64}8d^A$$zmtxfLASOiD8*m? z_mNZVolj7*>Bn&TQj;nn^hH#EB+>S}j=MpXXJ^*_~DyKpe#yD6RBc731y_!C+; zMEtM69cepAXV&7JHgD_rw*C6v);_*-+6!#{JuP1SA0z2tcA*3?)1lg=h{$1^{YU$M z@%gsi4bMR>nH@Nl(c1;3r{Y-QO8d(|XD!pp0>ev;YePv z{m=sNb)|G3u}`XS(t%v9(Vb`mFSJWSNjk)DvQb5Vc4)t5VlWYOJmy?u${%WuVYV-#cX(> zQJX+-;gaOJ$JEwQZlr|tWFGYIj(XE^QvFakLjhfMmSUPLzrL;c14r4W*elm8)BCv} zn(6dE2L-%_1I$LXb??a?n4~91?a0c}Tt{nv{J-^^?zV#=$H?#WS8-=Qpxdc{c1Fvc ztz%I}J!N{i3y1p|#Wb2rGC;dHM>ynxCZR-E7u6J0Gr6D29~kNAjvTYQuf72la(8+g zTs6JXrO$NL?#=Zi;V?Snz=m`m@~;=^oa(-|4nUFGtq$b#w(i!Y;?Zeh2vO3smC##*U4zeb(wU2(_}=Ke5bwK39vPk4Y$XuQz`iykyS06hWcRm!#Wwehwjty6Rj*C*-YiOiyB)baX5uP?6|0lsxXhN z!0sYX`l-}V=%-T~u{WQ31zI%uF76!^qxV3>(F&*R9iVkA#*uVRG=p?zI|(JKqLHu> zL$WqDW}6VRT^h3$$85C7PWXUDTTT}k>RyqdYLTj=0A9zdzX z;NJWf*r;v_(D{^eBV9PG(bxHXa_5i9e2k+D^?)~gYTIYw0So76b_65OOzCo8b0s{r zedfNV1^>4e40J!WFVfi^`L<7m`|9loyE`54_%X_`hrN1%qdhOxerp67bhrLR=kX*Q zVp;;XGi|qygu~0nQGsQNCV{j)7cJeCK&5d`FCT#12cbw8WSl9;QrXBOc~Qznh0#g} z9Ezd^PPhf4=-D6?wXIh?9pF4(zku~3Jpa(RsV#1 z>drZ(`t$nU!z4KpiB18g#dvxU2T*eJ*~k6RTSq+Kyn!=R&xstdp=hL`=VTAMB2zU0 zya;F%d3Ikr9sd4|AJrRZM7y~?_qnh6JDeUTSw`-Qyx2YRNP89)taPY&%#l9VL;qtY zp*G)|yoF+drqX>4Rn7L#MOC|T!$4a&9S0Bxwmx_8aNlGku20*N+*$xNq;Fl+ZGZ9L z2YnB18FFM?+h^-awz@`cO?K~i&AsD*{crB4gC2pT1 z>dT;0Un9G1k4O~+QR&FP^o#pky0SIlMq#NUvf+PV+qqwGPa zeYZb_6ba3aa$nPN9Mv@*B>a-K2XLj% zv{!oyS1RzLi%I3ht4%WTw6ZRDC|L)+&ZQ!?>_<=Z8a^?|yRvgt{WEf-lhzLEg+h|};ar)-6e{354ow5VkG^OIGBe0%^BVcaG}q?Jw+yfVg23kpG=vCTTUTUb=|Tv0-=I zIJhjrk9c_7@i;V9i@xC>Au1iedPmp~vAGbD2Q#qGp&w zHztnq;m9S=Dsx{&W=a9^0dJCd)4m^30U9z#i3G;QGRIF1(J0-@>{6KfGlohg)c{Yw zw(cgA`Bu1)>2GLbJjMM21Wdk!HmE-ESzM?#I6dAalYAvvTu5V^@Qd-VeyDz7c`W*& z8p9fk{u~RcwZvjE)0vWxKbtd zf7#?w`dUqV6N6HYqGZT4Y}>h*8ZZ*sZ1Sk;i?2pRljnh718e63NX=ak#erV06(Ak7 zz88)goB2P<<(XqAOd7);D3?FZxx7!Qru|C>)LSn9fhHp2O)t3|b(rR*NsKtt+dTX; zczzFX%W1L%<~;m*n}?^zZ_zYLoJmv~z6Y+KPXLY55T6G0ok)SZt z9ZJOKfpUDLAecmaqw(wlVCG6(67Cc6H2||t;u7&Kh5xI7`Ap)HPQYgyhFMtr$Ry%B z4bRR3W^^1bk$e+@DU8GQ_THuneDr8}v}-vj1+Dv&UQOT?E6Ol};mxA;62F$_{g0Bz$ zC6eztVD6N-M11eU{~v&fW(d9$m5w<{Q{VKBrZ{U&}7WRzFiB;s@8+3CQX9fwO4-x0t}h{N?3 z-#>sa2bfPJ?nLoD4ov?GNxH=H4Z^cjU`EH`63I6an8G+*Z}QCpUl}lejKd}3`x7wF z#^HM7O9tOd5(6unM0~FR_s^5?QStuwf0OS_6sGg3K*1zRUpJodsGU*bl1RR3;3_)_ zA59-F045}HCraNfz}#{YzJB2Qjl>utCX(*~;GR4QA9Zi`0`o~6E)n0?z&PlA1WY3R zx$vw%FoWZ8iTKii$%@1EmS1QnbBV-IxMULX%?EDzN%&5O|1dCH<8X=iwgGc@9IiL{ zyx@CKVn{YJiTHK{ckm>9q`xrFm-J@TQ%z{(~O-w@0fkH(KoBKhbw z!bFK-ATEjceh%F4Pr^sTvF*UT5{FB~_YN@sj>Gj9U+T7e3(SZ~LOO~^BEGS}F16PTMM?nLF|9$Cx`IrYxy~HI-k73|w0p{m%xJ2>&H89)b zaJ|KMAo%_a%nK5CqWHcG%oiu&n+v}0BnDPCiR3H8VBj(u5WpmgFO4r7fLRrXOT>32 zFnSy=QG9O(<{pVVQGA~O=J}KGk$kTJ^LiXEk$fKl^K~4qH~DC)^EfbPQ^N^!qWnAp zm zC6e!1U|xyC^(G&cU;5(uh)ZCBIZ^uhfte|BiR9Y|jyb@*B5^0G?|%g5)TtC|;`~hM zdj>G$CGJG>%>d@75|>E6OTkwS%pc-#iS+jz1h;KMB<0USUd>?`%8<_NbraNJKISrUH ziA%)S2Q&+SsfxoT(%*7mu8hO=Rz7GIZW}ORs%T(R@Jqz^1TfD_Tq61UL1C`|^X?3$ zJ0aijnb048WD@aFeVPr-6%u!%^tcw7J5Iva9|ZRTvtt$qdqVks0LDcH3MP?!BfvKZ zn2Q4fcOv~ofVoNH67f-dZwKa8i91nzj{x(1555zrS?f!u2m~Bgs11MkB{PY@@NmBW%mYm8#}sEf3e4z}G7n+SJ1Y^Sl?F4#o4qzMsj z2W+R}m&|LXLms`<5zTQ#lcG*+7K$c!MYU)){Rf1%E6{(#41fj8j@|x!p|kXWqe34O z9Y?!&K#@cwOpziMS)6NllK%$@zc&9qz$^7j;3MD&JNG8j^I(_%rEpR-Imp2dm0ra1 zGW0muE8u(i!QN~q{nrOX11x>OtCu3=RK3&{4W#MQJy;~_h!)Z!dpNtIh3U*Xg*}UQ zh^#*RXyLI_&vi_)>oe2mRA7Ott9f2q$LcweE7LSR*QwVz+FP8V^DFgd_2Y-h7xo>1 zK2^_6D=nMTeSlWgcVG>uE9l;Q7d?JapmKc?JC@RhGJr2-obyPUp6kH^VkdS#2+(0H z7xgkjc!A*c>ba>FUT0{mp6dfqUy}&oyXMG^DMeV@|BMr>O`|rDITqrk3li(katIMS zxjISUMbQiRA(R69`D`Brfhk$MS{bgSWv{jd*AZ;{Gp@tg_8P8~^j`evY&xOCB)PNc zJlv;f742)B`tu@Q1-?iMBCoGWhu9^q(sI(1v)ouG?OfDFb-M_Ue2Y+E;l<$eU$hd) zEhTp(GtuFW&t`G6Q9rDfL zL>pOF-i_@;5C-@@jP`%7zZHHTYjqcO(S$t(=+)-NY_Moc=>n6aIXv_qbDLBOXvG&@{*~dGdcfnaaD;R9La)Er8TRXI zQ!@`vs&Kh)-krH0%inMA^gkCqudO@m(F1Az3Qzb;eU$=jjy>+i>-%8D}G zqi@^}YguXc0c@Ik#)Cxg>izYcxk&U=M506W`d;K63foNjLfnzD^Hwd z86d&y=y{)5ys=qBR0^3Ls1UHp4BH_Wb@c~^5<;|kl<&OSP+Y0Fiu4@^8yRCMTPf^D z`Z`aPzLgB@nZC5S!qxVMC4J}5>(a}s=OAgXtj_!ld%FhfUn*%j9%=eze40kO7KpSu zjM9c386ruseGfHO)D~Q%Kf4gb{x3sEj6@aBf>e|7Ga4U~lwMx2ERytU+?z>y8}8zh zbOG*Dc!LPGK_JhPs^)j0_V8n)h9^+>815@sD(D!i{;_T7i|{IBGH=_#aGyU@)~5`f z266j5>A)SLiMlu3XIJ*AcFHR0v?CO|)uPu@zKC8WGD>^?g2!>IMTbON9ZX+Y(S8*r zt^Nu>5Q@NV5aglg*oBn*$hTcSAgBO&`QW8fU`y6E;Ob+yYjJhrm#p1{s}Dbs;*^ic zq{w_+#rD#2lH8N|1_~$WsZn)rrobuFrM4Y)Z~h~0CShBjXs06U=Xxsj^^PdC(40z% zf}LjY=~@XG1aw8uq;xO#@@CG`c&(*s`k`0HVnXsAe2 z;t|DC=!$f1HW=^X&W4{|OW{&o3%khwD5C@2I}52Z;PlU!+tQ~tl0C4S>pE(A$WVfl zS&mbsutqv5S8iDTlfYyh}`Xx_1T~?w#4mQCB)DG9PxLI7-pLJE%VZ z(S2nBXf%~5@js0?@ZU%OjZ6q3lQZ{c9z2pvRh{0KQY!7zX00)l0YVBHCqQ?dgRwC+`|9 zpHrz1!QMbrW^Enq-g6LhSNjZ`yPdLX=4bwQnlGZAw)t7Ies^(cf^McJl`V4^HD~H1 z`hrWpRY`Kouu_p<&bY#k{TD#*`bZoRphchx!3m?^|+z_3(*Kq?Pp+TDC z2=s022MUUy_1*tcsK2i1g-(QzP2OK%r(dNr>e*XBwFL=a<2Qq!D6{rBt zFYp+B#69}=OsQA+@C4h!V^t#MGB59zBoT%1eh!36EDf2&H$7qvD&;a~=`wAZ2R}zZ z3`fmd>ncw1< zBEJMMuZuz_7m-99Yup*;URb!Y;O`yekHKc#%+KuoDTey9hW9pfHdPWqgJ%S40N~eAfO7I~=f2P)UwS5-)$@O}^SAR=i;Uu*q^ZDX( zoJ;|f4^D;f--ANUi!c^)b&)!Sn(u_oR5LZVR7{})R`Ua}iv|YC=hREH0!AO)$=x+m zdDKrKW3)1lz|KBhdNyTQS81IOb%3Z1^#h1eDg;68HX2r^?u^dx>V=Nzj8u#=IuECG zzME1RotB185$#v_9?u5ZSAQfe1R;kbI)Kwqw2*kD&7%v9sA0sMNQ$loEY$N55qLW=1V+B7>#EM#d2NdDv65XpT2pni|P=+BjaK zdSD!14lt-(pX)`hHk*k;10%W4?y##;|2DEWTa>i(jLqka7gdX% zpVrnP>h)k&$YZqSj=lM$K}~;2);Ja7>l~=TsDe2IkG{swt5K#Q?Ra?@J)CX0#J=*B z#2XvM#2LxR=|lA(>FBE%yk|Opizlf4czjyHy$=15UXZoSCyUn?C@S>f5)`kgddU<_ z`RJ$V^L+YWnZLa_t+Wy!rtk*1CE{MICp1XkE1%Q+3O;?1m+o3PzbhKnu(!91l0cNV zEZ8WYdGWa*yxw6OE<6)R|81J6p^w8ZG6m_+!^1!sJx8#MI$MMgiDhJVv8e}T4EfL~ zTWNZZGxOlZEus3$LW3`E2!)%%!`x5j401nR>TP#)wC4pfA|1XiJtzIv%-th*yC2HI zzV6vw?bCdm8*&f`86)q|1SXC23(%Ltmpu+u=o8!zeSvw2k|W~g$h{|{%+@=Ey$hBDN$GS|7=K7drDP(6G0rnQBX!tHB|+-)zA zb78g~$aC*FC(`MQ?Dlnjn~YCs_|I{-J%oo_gAVtOBmO3byX`jIx}R!t`kS2YHtLYM zpQ@|&*HydQekN|}{B?EV%iT|X?Eg62?0)JK|0m()TZVvm%OYE?`>CL_Ho6F#@#j`= zS(LOjyKYOdb4$f3Tk`E&O9pN!c5JQWe#^#BY!zE7#1t9^o|uGmp#8 z_tQ6G+&e04?uTBE&e71J9}+p19Xj)fg9g}{9sa|6lDqd{J{>)>kR63<5qFoJUCB@` zCP&&F~Yy3xA zTFkaqbb*jmv9@-N{%qu3xBkk=10!FLeD7J^=Lrgjli(#To6%qz!dj*oGpdLu&-bFM zvPTyXmp6kD&R z!$w(7XoQ{$jfiuZ&Si~2V9ds2(#%q+EaFOq5W;WIN`+n~pi)5_T%oT@YdgBj2Zz-o zBAvr4BbO&@7(YKfKzwD(z2oxl-4A_d-%B5o>GZT6UGp|3y&y{L`(H`Ce@wiVFe)l9 zcSbR*Ss5;%zC?u!m2Y91zt|I=ps)4OG^f`x%{f#|bEf+%Qc=egX84QKFmV(Z<*)FC z`Z0;YO`uQ;RTpIJ z-02YSUxZRntSe9riut;-K;}_dSyLl&3bf|bb37P)?OD`CUA+bP3C7Vx2ZN6-@qc=c z14axYsor-oWqS#Ro^gC5^b(p6p&3sM0LMi3J4(xpIa3NRnKD^)?4n>7g;9W?m%sIp z6HDAe4$Jt4fyVEQdWNb`8$$sbjW!Wi=#`^5E@<2;^s!~JnOb@{QC~e<&o2~BjhmaA zkaLmvibWR}D?>(_we3rp8eFbuU&u*Keor|sBe$5uGy_3Ke04#*U4z6(KFozf`S`kr zv)sL{Yx5f+Qn!cIwY6)0*IDpn_PvHN2_+ykq2eVN(~vS9GzTW8c20qXdN#?tot^qL zBDn^_MutiinNpElwrCPI4m+aLFvXLT9G&JwFF3Q~XlF|JjH8{NP@i3t@xJM#<}7qt zWS{d$|IPb%QG#FIXBPz(+2=Ug=?mE-`;v}!X48Kknoce=b19fOQ^6rpmgL5f1Q4S2 zksw2~`9d_2PkKbHKd>i@+G1-!blZDCbS^5oQ`D-_CuKqd_@gMC0PGO{Iyk?J=9Wg` zCn(O5vWkVTSPEthi*Bu98Tcj!;yoNqeDvqiQCfzHGN?B;a7Sizw?%MICCJ5?*l-p( zZw=*OqpRqMw7QTa_(C9t?PalHuj|N}n1#^sWx;%BDF&l>3ujPxd6a)9vWxjbC9@-H z529?N9qFQi8FxqHt$yMGd<3JXv7IVcQ3qtgwuYmd2b*{oGat6q?6w*Mq^>3Z47YO#BqQJs*PJrwA8;sJUUn8y<@6+^Z>Xy<(RI=qmon9B_1V-9Tho2WPP#u`L+6lD+-snELo2`8cbV7 zd)y>)z;TU_BmHulU#1$Kzfg4Hh25l-?ftZbiy%f9G3LNLbum?IKNbn;#p%IfsJE>3 zw&tO`jmBKEI@lfcl08K1^@s8+LDk9unIj!ncK-Kv}_{n*mjx}h4jJ8w7%-N|2(5bd!Z zSMXmEZ*VQ7`^T++oyP}W3%bVu-%PPgrG{yMC?_6Ai1vlYNnY__qI%A9t)o!ZOWr4_ zh>2};SDk@JN*Q{pQqQ>q`!b$bk0;nRxAh(Bz3ZlAW-@-ECyhHVGJBH~iOE^vcST}G z;dsQx)LjW`?j=|aPu0V|K{#!xK4U@+6l8t56spda_Jom~s7d`g%>SHgs zu!UEQb&eO+)aqLr3lEjMtaKfdgB|DE^6?x8HosPgUlzRN*(f06orVVl7kF$_jfEA=8j~;tm@mMI0*?mh$D@NMJu|JPRVvW%%VHeb%90Yk`Z* z%51P$aRWIb*R(vmj%y)5YZ(vDAh*f77EMJ9i$NJEn*em1rL)UquU$-KfCsUxgX%19 zqWU9+Py-k}1rj|_UZKy-HH0_>eq_)>C~*@Yl;x2?K+T8}FA}7qH!}?gFo=!}Dn2{J z)k$tVg8lpX@F_)!%nsx>zOolQ=`*oR__FKm)UNm4d0)Ce?|LWI{h8i%PET;E#*Owt zu5)_ynQ40dhW1Z7GB*hAUSK+M-fa`trA3F$!K0l_b5e!}*(DI0dLCXjcohj|BM;fE zJ!~Z;77JqB600{5pd|94Z!Da7>3VR}IvyJ%M*bjmgXB6J+nrE=I*cON8_(6J<_1?{ z`s$5fnkj1U&~JQC6os=cJ$4Lbd@Xl7XXb*hY>Z|o`b^*&d)=JB&B17yjhfF576;mb zdQG-oJ6|7pV{m_D@El|CnlU zC0jLHI}LVfgiU^o#|yIDfhDE87X%OD@{31na`0drZU@mAvYjtm$@eGHbg!7TK&NmJ zgDM7dU;EEMsdwcRX9SBgeX)CR7wa6*b-;rK)-`ET9iOkAJM!x%Kmp<%a4dDz3`N2F zv0IYMmWZKH@6z|`&x=QEBA5CH5TF>9rpCSuMMLJM2)feP;C4uh_ksr@Ev}-pxQd&+ zS$ah-T5Tp5jecV>D?y^aT^cJM3jI5f5RrjnJ8QAMgQvGxK(HCOO41*3!RzL2_-O=p za;3TsE-5q~PWZv0y@3nG0ihut#)uczEYDjz5hm-wnD4q73ue10M7FosyA!JLM58-8 z*w|B<&>iPv*mCH89spNqph$ON8SB}AO*CvPK%lHm^F2|Kf@!<&iBIr=wE{EvG(5Qc zwCkW7LLl!`y{qfMz??4k4tEdwNomJOt|_#fcien0Yqt9!F*=G%&@FTI+~CKkxgtF1 z%tt?)z}!GSOu`icnLl!t{&#f!fZDA>d)tT!E8B^FM)2>^H$)ee0-{!KIfI0AT5i4} zwQO!+L)9d(vhY|BRwe|~_FyU!6Gfxs({^mUS>#g&cuS9*JFyw!sYaw>4BB{d5}j@p zPw7ZKo#H9GVvbTA36aVzQSyJN3@=IfPzrv%Tec+>h~AB$?A|)5b~Qr?sPsMps#pl9 z5^v;0Y=;~%qap(_4V&zcd0ECTJMsw?nRu*F8knnBXT~|rn2#r#sqrylK&@S{5E~^E zy4iTfh&HhYu5)quwNbcdGr}G#TvC#(giA^i>Uonc$`5l*@&WFKAl5+D@OI%Ib83t` zXiwOt+W0X%z*Y!VvGHxVdvL+0G*Aw{Qq-LnGj4P{&Yduft%QzMJ%kOvwSn1a5+l(B za@j0U6%(Kwa}vrdgtsb+BA8?sG&Xf8-YVfU`3c=ZhS2dx6rgNs|A0$2wGi5XY-${;WK+8lF4@3- zpKx)2GMgIT)@M^oQO^mVN2q9O-q^e8cuYS?rJ3H{;Sb1u!igBB3wX?fMu68zjR`DX z2~8LK=+(gRYome6hATxR7jhnPi3O1MqD%)(#1N4}92Nyi?ZOf%72yTfjD&>LT~s|k zvOgi|5RnvpZtj}SHe2p?q0~sWO8x@?fL&wV$SO;F)^28d&bNz zm+cu-y00fO@s1i^4hyj0bHYMys%gRwvDZ8wBYSE*R|rqg;IstUyq`c>%2xd{T(VVP zio)Y?>erUwSGMXK;F7JH8g8X)FI;A;<~JTz0s2>jicN_O3Q)Yf)Pn?sz$~RWb%7j= z2yyx^kXFq}h|swnNKqj`BZ2Z7{TeK5AVqBgbge~zMyvw#XxG~V-AD6!^dp?S_qy|r zB$}cAQrGJPb6$d)dB{=s5%*t2n_OL@A7p!!^3(l}`;btS?uY*1ze5i=WMx2|9-u~Q zOY7qZDTLU6+WPt#sqL*#NJ=3JAS3^K4U5zJzdP z+mOxh9k^sOoQYN;n_(MVvKihAmu!3#bJFz>xXfnAPlK$&l}gnAd%~5Cx_{wHF8-fX z4EZf~9-DFMLVgP2EW6!*S;HL$WjF-TaHfpHf#FsYb7A_7!d_FzzC_8d8O~YS+l4ZBBwfi9xnQsQrqzPoY{K`jzk8B%f+kC8baU$sL zsVCD$%+^G-4}ZBOY^FY1ArC=X_FDEikfnxTYb|rD(CxZXAy3aA2RUr8TBsc94&;*@ z$myb7tjOFtbi0P(moV4u|Hn)dd67aMDv%K@_S$L760?>M5$xqN)RC6xb*?&45_s3_ z-=k1f5*jCtG=7ccLvxoA1RuLfS8gHL)ABpgqI7iQa5QQ5T=)$<3o`(@3Zgj$$o9J6 zvp75QDGp>lzi_*_q9C8of9nnGN*KsbD@O*9?L1TJ*pV|F$fpY$${oU-esJ0f6ZtiT zd^(WrJo6!+9r<(za;Bge%U@jgJhf@3iOl&2O{PGmYmn>=aP`f_neelxmFY-}QqC;- z{nuS@=>?}MvoJg605z33K$j$IvMaK57(l0Lb<_Jy*oCA_pAE z=Ls6tKFv9M0)I7;TNUzo4xY~kt-S`%b0CYc(8ZD>08Q7&vl1r0|A!qnz|XOoHiH-(%lkP)oCuY5H4*k#KY zfn#kgxsJ3%-*=UQ63J;FfAfw4Gp#Qb@>r3URjTJXkjFZZ^92p_Lgba7yn56`_OqkH z+e?GbSMA8-9mo?B$mIFU!EZfaB447A zCpdVX=s=#}K<2iC+l7i0JU_K}on?%hu8=QrATy74o-c7AbH3zuu}oMR-#EV%RZ8w@ z<|*V!4&+M_YDb>rK)y`Sc=1cTA2eT|W+GpukS}u}Pj(<*=0FY!8jh9ZdD#`kkDJKX zDddm?d5VZ-ZOY<( zQOHFOC^u(k*6r+N(XY41G&2l5qy#wh2rUwUbsiM&}MU*SNW=Rm%~fjnQ(2q_KMlfNGGOB4A{ zg*;y%BUpP-`DpO5x9|l5$J!3(JJMPxXxPGCxZb%4&q5O=|Aazb=*UH_19_nXd6A%L z;xDe|b1y73k$V*KA_sDvh-Kw@kpp?LpyBF?Jh$H)K5Qbtq>vXoke4`+7dw#a1Sp>(B;`qub2zilEPR>(^Q^6^is;>z8g)>21W z%LI++t#JKu<(PeDS|@Tc4ztXWi$?g`k(W7;mkXNyTg#aWdAS4mDhKj%2eN1fOMmxOa zlB=+wB=3VEdi83Sq`o>w}MTLlegfHZ%f--2#xAkS0Ctq$Zi(AsOT)qxxlH0<>> zKfCd12pa==g+h)vkfWfrBS##_s|3xt_$A(-GyigyiF}hnUgbbu?Lc1TK)y!MaP>sw zv8~~?Ci1-s`5FiE8VB+<4&-YEjnONIuHA--4AY?bjY7UwAk$}`^3mX9m$cU*)LuT< zI?@8upb;s;_3V`FQZuc$74q6dS{`F^=Sb^%M_OwgX{{49=it|c>%qzⅆ+kD&%z{ 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

g%sQI1N8-ili}q`>PMim%Oh*$9`1vHRy(c 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≺~ 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 z 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

i#iX~WyvFlK^lMH z@NC#r^5oYFIRiKDSXrFZNn3F@8i=fDTE4cisbO+IC%(>{igSv~r%o%gzc5ub!tGrJ zMZOxI>*}zTFAgtXyC~c!)^Z-{jK+2P!9mYTa_lQJgW;92ALG09GANor!+T7pBl5{ zF}^sAH;fl+iLBFb0*Cl=9lj(sK|{s`chYt4nrK^c4Qb1d_ObIK-9nKEtW zlnFEAj%9X#^`(o@#gg<8W;sw=>X?q|5~)*6{_^IA<~4E}EuX|$Ro#mgg`1YIml#$o zUn>X1#t@D6aVPr3-ZQ66m|9garD|f?_%Z4`2^}+?dK{3va^>p9M(k+inN?NOrcT4L z)_uOGi0i0AWz(u=R+djiPaOA^MH~oY()4K)tEQGuna*>t$ z27%_PY79fr7O`?s$1kIv>pnzhBqF+a&BZtgnx2T^s0*GYjVLPHu5a%H8-k@zigiD* zUA71=Y)(R?Gr)~rgN_9)Usrx`OlA%1|NP?Fh#SwRcJ)uvlR2&R9Q-gr1DdSVt{Bp; zOqG>YAslQzmB-2RMYqm4)bdG)fI7(96%VIKW}GvvynO0}GI=kqJu%-_FKJoXC>fyp zXQv)cD4Q~Q`m`AnXH=HOUZam6C-2b}!9bj9eEOJzm`Qc2@u=c6O3n~CPc=SHPBlIS z6N?Sd<7kqdYJ9a`)l&%EJx(>gD*>16RAVZVXV_CDO_=PIs2sSBPXmYL5@Tu_II6$% zfwO-hlk1mdNls(sY%G9CE@wnxsMmX)K6Vu_H))&?xMZiJJqr6D0Mo$bI2dM;7vHyl z`GLlH@x6*P{0x{YnQ$0RON7t$E{yiWas7~s>Mr9I?&HAyQDeQrJsdo5q{;U$;LM;3 z*o%*=fP*x~j-prmrU5rU1s_-BmjZL6#&Nde#di-dzfHln9|VsB^8jDY!mz#wpKHcM zd(LE+^Hr?NB&*LX_cdwYSnpfXz;QabDH+bS&cY~hW)=bN7LD~PkBPwD3CwO6&MW`^ z0Zhg)va4BkvU>k5xa9zIs|)AF_Y+{Yxp2w&okHi#c}u&?WyboL09EqwA{he|B0OIWT!> zHtI00uU^+&P&s3E-!tn>qs$nDOc;ijA44*j8(cddq3njE?Za+RhI*A~8Xp@&Ao6)o zMwT%QjbKoQ-xvmOgE9sh!&ZUA%)u2fhAk5+;mSiJ7zTesOn=Os6&}V!%_rv&lbn9x z8I+NOziKVnH0VdUC*o~BWq$+wC|urI!gfh|5Y`YjA~et%v<(_`4Bqn{i!-R*3XDq$MKNSPe^Rt!qbU67x&EY zLG=r`sm7SswbUB4bkiOqbLmIXBX_m_`Rz@eH^6?}472Gq;#-DCez6f2OC!Hv%<<<+ z^=FIvvlV|1R95&}eqkLt%if)exU>XufYhe0JK$WSj}61;F8soRMaXJ|eWkb`flKXE z<>rE*oK&Vo0)IL2&Q$*VPW+#QS!&|_Rjmbtz|xD?d@TcY!;6SA%=w{0PumTtl)SkuqL#$5RV zA-Amzmbu$z7ar|OvHql?m{b*og`vJwhmi_9=L?r^`eepL$$mr$pFup1s+PMAyOwje zO)ES)vlFL~;d{*8Ophy)FQW=D&=CSHdaiHSzX3uOLGHGlb=V26P94hK_91ANqVCSL z3&>o$=}Z5{+-)6o;o-Qq2g};c@0bYBH%WyneoXjjd3x`#+-*G)8Ea+%_H7r<#F-U- zlOL+b=-OV*-TX5o1K)n+VN*LBWA3&tYv+Z#)|SpRbFaD<7S;lPX%BYj2P0XR9q|xr z6AlofA4&VgCW?uCQ?KL1L>;gXL^Bp>V|viz>KJ!f9Kxz(v) ze)+BfS^8bL$397MtXpB7yDeN;pkmIii*mO;XSE9ZGcUef7YRr_5-hK~3!%48D)6gF z3LFuUCl;ag&piP!qg+E1bK3?;ASg+FXq>AIIkX^c(`GFLp|hDg$Nu2upO{vlu1yO~ zMDN$YY8RU3YpJC$`z@noI)&PUeJvG{qe~7f9XG#l*4lCHn+xv-S3-TW^Wg_zM3tLc zs5qx8n7X}jo#snVt7}J_uOqa6kY=)>LD`u z>cXobXFlKd0_%3}H9R4)WS10S#gl=)1-KjTXp$8PP125ue6Wq96i^o;CHyEwMfrG$ zSG11_)bccn5E^}zlo3k6_IMq6@wt&letiSZY=s-x(k{za>a}}exQb%)4?lot@ zzGPQ>#ZyV5$t}n2R~KG~V(^G5hu@D7Qy@0xw!MbK3(%Y^{JCw9!3NRhz<@TGm+9(z z?0g-o*r_9UupbTtj=Ew8PI)v{fNyy1nw`7tH&Uw=4%V9O1mciPYY@$0y1GFQliZ(_WsJpL4T*dk&&hU{ z!S~K;z-)C~nGKkl!u5xa>+6ndFC?xC1dSjHf-f?Ia?GfbxMN;P+y$?s6_CaVZWE*u zk*G&8K0(o*@S+ydK-7N~zhfb(FiIgQmf4QPwxw9EfW!ejX#4<@^7~szhruq(=zyfs zmV@4eD-2o25J<{y1|$`Og^-lr%OG(=o@IQ~!9C@;{smH=xW4DO9*2%t`8^Ag@;d>N z3S+I~dMza7m&2oSebRA#2a@u;$8kLhgRo*A2TA!I4@vpG)N$qhJ5Fx1j9VSory!|3 z9SU7R<s#zSf$k9-7NyIfBnhbrq`b5b178+l6``dcM z$JbixmZ+vMsUT#3813(#R6sx7lk)kezM+frGnEg_)8lZluDj3tROy@oJAMurgqDo2 z!K?+)-NS_=>uRk(@M}g130h3+#~J8%N4CsqJFtPrCx||RPx*p8%5tRYl$08e%oL(Rkl92zL&C>tU^pCcMLoeJ4Im3U|D1(Hmv(L#QnR9}IxEAx_TpNED%w zxotaOH*P^;*l$f7VfiD|=jT3Hxh(g=+T}&hwQkRd%)!V1VQYiGw7cmjo-0$FX>*`u z6r*(c;VH|qNY0Oi9x<|-2bS3Lw48`c%%DJxY^k@dxdXm4XN2qQFCuTe8x}jvq4+M7 zlGTZH;b^9uAngqch!lkgQPlT^Y+!Zt^w*CEXkX)?ZYT)xE%>Ct`4)owag}07w?O2!r_!nZrh^*lWiEnq z8EQ>y!V>FuB%fog3bj6w-T6gkWYz54Z8ZydJSx&)ZO{GXOPSASezK#o-d9@VZyLBD z<{t-=p|R)TyTduC6#6^nX>5CW=m#t3s-tz=-Y3xpoZ>Pq^V!l*ng?wix+RcVIUC>j zmVVOo4;Do0`#!X81-#-<)|J$)y30&t7EY*T{-YnA8j8$V)?HcE9A17t&QN7F!|6OT zrnOh*q4$j7FrQi+ueuEOe5@VOU0Fbnkr{l%mvRqMJ3(i%9aa(|K$fiaE4q};i9WuHsILYMXtXkTMKd?KD)=R-CAR-Be4Klbj_=Znl3lUbpRR2=a>Q>fHenO{u=Jy+ z%~xZ-W@}%>#QS0&7275k|8eem?TeUrUo7lQ>2atatmwFtowqi3>c4^!`61j{7BQPY z;EBp+%;qn6S{P^ZIi5Dg*&K@6b4Q#FM}_<1Z20x}&N!PTuvv&J7S?(^an2aC;c_f( zV>aK%(`9isJkR51ZG+r!y`W^DnCau1Crf3^Z(DDODX-h%gC^T35Lf)dgSIhXqw3@v zaW?J^z<&6Q-z=Ifql!Cp){{)%qqwu2&e*thX)N>un)x7v#kc`uHv=d1qx#sC#M!vx zGY|~%@j0kZd=3^2U+i*9b$ineJ!;TQd*p!<^fPc~Bo_cA%NQvo+V=($V8%%mY_4A$^$H3uOAJ8!?QYk_WDeF`uHDgNoVpVwwt1?686l ze=z%2yF_tPqxMBid>_R;&*YEMi22@{lYKE?=W1WX#QUOR6zfG7J(6*M%vV_ZA|~D! zwPCN#&o^sd#Ha#)P}{_MfUZ6^&&1jAlMU=d0s~C}LwCIx=X5+i=YxH6o_cnsZzAr< z2BUE4g&0#P(Y&FnV+e1LSn-QkSQ#9GVDcp_ zH}g@jjc4}yFqv8eb8_xY4~>X12Q_o-!(?@M6hlkQF{%^sVfFpQxIi$r;_>#r5&L6d zRp_t^`lRC6KFkGu@@KeU*n2P)@gFJFY3AX=3}@p)ZPPau$H6r|6~iSgzAgBlZdM;V zqkMYh)KEoLnf+p1?ab2KzNVK|hR&H8s+?3+rr(#3KOHa3<1iD_*tFgN_KPlQSk@>z z^Oi1eT)70>;b4hnBeMAIUEKQe7(|Df8V zsP`jsf2?~K>nv>RUDVuI*@SJ0Ds=I~?Tv2O#P#8(MT^547Tdl$3%OsZvp#04wy#PA zxFMQ58JDbFDY21Sg|4VU?JrHbpVnm=T8-qzh_RipX4&ed@U)3;+lk!asH4_^tXkaC zv^;!q!{XJeFI?Vel)0^zH7>qTJCu!a<+j?`$r!5w!4^|{lV-f-s>b!)4?SbHd#|_i zC>thqJwGE9nqD<|Le+#aHMfte;A1K#hpMV3S4}D75D0 z&Vo^+$BsIq`1In@qg<8{M->;JaRxSUo_^*iwT-iY`#AHATYtZJ+TGB~s8rJ=?&IV@ z_D5%s5=hd0oY2H&PmM;%pJe+usc`+=>1Y*N_Ps4Zf8g>=$RoIQXsi#G&tFQJL1e_IF}kg?^Fu?z~yPI#4iw-kQl!;zzqlH+Zsp3 z-fO?u0bsH?GlKErqXH8E=0!bg6+R=h&^^G@|A)BFgyV^vCBQJ>la&Y4`+JQcjz;pu zHSMAu!|6=Gd8Oki;9k{OuXHf~-c6J5-@pw}%MqUWLRB$WV<3w0ir)#qosoi%N@Q7@ zd~<KnXLh#8qYZ2IG%$&e!JGR7{;;Q#pOwDWgt3WB%;Mi`L9vyLfbQ@!0vz zOD|e^$^}h})+|GxIA0Hz1VJ;Jrg{%9yK8X6l7wnNPNU;$JtWx3HZ+tXyvQ1YaQ1LfolDXUX!fTA*8o zXR7KXcNOZA9_ba7Xz_V(|Ax_b>_kUDV68*# zKwUF`<&&z0N`@+k8iqQTAKfjr5tXniI(NQQ%d%)FBsH@l8k)^|$eKAf8bY-^D>`>t zv^4`YnD{)Ta;{0|MNE9TzvoyuNaE-EqjM!A5t|Pf8*6YRU`;k7I7A*b z7f&I-JpPAq+flaA7gwNYZ^*mX|NQ1#uSX9&UUBKL=-8RH zTI;?b)}23zX7^m+k76Z0I?3$0AO}(otR~Sa5S^6MGs%SHkM8Pu@y)jmJU)PXKrS_L z4@Qk>Ljd+K*!F(0&!K%V`c%*Jw!I6V7k#qlRYdR=#pL){0YCZe>k3vFZ|t$2>G?Wa zLlmzgcZ+~MEYZ9bJ|r)&!q>9|FEc$L8GzuF(P)SD45a+mI^TF3S&+a(5PtSVgMt9P z*9Wv?(n9&st)Q!hVu#|!4GWF%0Etw4WuV^Wh?cE|OpKUycd!0yc;m*#VE8)g?)d8Vj=;9+)G-XsCjKc#ub?KyJJY+v1 z$bb#hxy7|jAa}FF>%pnyQG-2BPnBs?b6ldav;Q2(7#-Qyu&Mfbj$qR(x3-5f(CHFM z{fWl*Q3Y9i01ZE;?V}SuwkP#5U3}nHR<;;wz^TiZ9JGG3(c6oq7^7@y_Wag>FE7QkWOT2NPw2%p>OdpjLn#l0xnX&ZP6_gk*62@jPbjkGb zE;R{%W2Q)pf{A;z!OEEFW3`~EcrCm&7M3U|upM9&Ff5lQ$kAMdMPJI;IX*`}6BF-C zy+*N9u=as>q0rdA8nrKClwFIq;h*^BP(N(qm&FG3S%On9P1XR(>iNNW2ZPiO>k8P= z@TExx&(jz+3Qw#l^d%>3urHIn|BemYmBAcwY}mdGR(8jR?M!x(IX059Y_N{anZ%sv zwi!#CW8F3+6)nv1HHy^K&1e(9;Lr5M=Z4oS8_wZ~zPSC)Mfju5E&4BC*~I5_4qP&Q zAL4G;MGeKD2XPhPQobM<;7Dn zX^2sFD`3OUDHhguVDna-4PVSL?lH_OunFK&HtreoAmC!>&5k>;8wG8L&Zz?pU*g2) z4|63x=e=Iy1cU)y?aX@2DQ)H>wZNA+@ywk0#4~%n#IbwGp}(1g24^#m)&gJR#4{h- zhuP~Tj@^^q^Tv1Hi!smB%zTLx&wN-P=Dsf}4i}8geCV)zOb_fhw`k$;KFmyGd~O`B z2T^sx4ZGu5Dc=X4jyRi_U{j1MhS`Uwg^rE89x`sRdU##=YinaMJcOMt3^DKwa};cN zGHi_b96a6U*sOr07aT)nld391GjRSu8K#uuPmj$h)%s#X1FY4$Ys2)$=H^8gG{S4~ zbU8Pm1P8B_l~tEdESr0t(SWt+MJvmSwXvT|mW~x0JTF}tZfR~@0{^oT{Fj$cpFFwj zJY#%KWB44bf;Tpmah`0`&z(NKAII_uwc`tG<;P@3mrXAlU8b>BI1`?0ksegZoxR8^ zn^s>m3t_~Q30kamxH=O`ma1GZ#$)lhPl6^)>=O#|kI*D>@&Hd?y*6pW`r7vii`g^2 z*qvprQWO`RqB!fq@eRe(r9jRtFE5YF@!~RAj4DRnlezGs<*OhzhnJL<0Xkti{ugVP zMeCEh6uV2i%$=*Fq%_AT0mMptRGILfw|ezO@x>z%LSmpVwS*g0or@vL%O}o_)!Q+4 zy=6Hhl(a4br=WFd^&u3TUA0HEQJgkv^ccOsjHM{7JKO8gqvg@L+3V4xMwgU~8AWTZ zN6*f<4eQajK8x)PR9j%&dL5r%z%^z8C6`HZt^hT=ta=v)VzTv5jve1k#9}N2ZB8CQaONY2r>y6IYZb?zA*iG;uX) z;_A}G%}W#4kS1<%nz##+;S$~#4nsF^A#j^DmU?=!_p+SZ-VDrL8V5yPy?>PPvakt{ zVuHAD2j*oLpY$)Tl@|i}j^jOGvKI2mevfL8(=k5I1Op2ZCtNf#o^#w!2$%ExlNVw& z0T&I^5$o4td<=KeLc>^$i>5!^x`l>uJuVstmn0oOS%}|7!$qUxr}d3kxJ<_%78=Iu zxM;l6!S$uTEi{aMxM&<)lK0vN79#%^2~6YqzSrif+W;^}YMfKPN%&3!W_$|1Lhwxn z<|2(_J@9&eYXS4U6nsqYk2D6N7%#qifctF$2F8U)8yL++~+Cy zxKfdIz9iGRd8KzKa3^Z459nm)<{S(AQNYY{;k@|f1GCbF^Ws|z%uOzw7vB$nx!;9L z#>e{iJB_gu?8UbOxR+D#vA(^PCf_^2{WA@|FVf^Q7NafUqVXyZ+8?1Y0>sTLy+;C9 zl!A}_+UaTXoekWK6nrd?xoPq(2Cg{;AIF8u)8vZ)cS{PsA>g|+O}+9X74u?jss~yl6^vN!M*`&Yvb1`99Ljv zo}4hAo3MXMV-(W6{yhuan;PpCKl1HKlka`tzDR>Fd%Ybq_1CL?91Pr%8tWB5wvXe} zXO;ukyW3V^XE}Uf>={!AJdSN1A+30rzSOKBo6wVE*aCd8PLY zU=F!NrNXOx$u|_3<6Sr}zSDpi@4|WI-(+CwTsSYjMZkQ+g-gcA{JT_RR7$+--$vlB zOTowG((k6pcL#9yrQl=#@>^iubm6?xy9bz0T)1TEk{4`CzUjes01s})Dr_*5w~gz^QeH z#`9Y)D6C|$w0^=x7+s=VLZt zLl-U@whyTX2{_JE&H-j-3S2&Li-EZ!4czs>{4x=jWL>2Tm=`t9tG+OOuWJlMF<$lM zZQ%Zqf{*$4IWTosC@v@elEg0p%q<${6~Eb_xf7U=(%?I3Blh{=qVeKm{La~E7`Ne~ z=`ViIZA3qbi^hv@7~J05h_P!EQT_LmLxDL_e7b zIqaJ%wLbju%D-cPIn9MjmVZaV|2U0NjNW{;z%5O|$NIY_O}-Z3+EVbbe6LND??&K$ zoPuu*`0fMdFD{%{{(S(^)&g;1#Wo?zLUV$49xdkIIr^kF)$ChaLLkZg0DkkQlUWuD8`E~3f!I)d~6^8Op`D7O6aJ#XuQhz zNVuJ(F#^QRD}EKg%}&9W1^@MF@+|=_oPv+*G#h}q+J*Cq-;Kch*o8}09ue@}2h6yu zAi!ke^5Uxl<^qlL%D>_8{|${HAB`8^^}yYkg6|ag|9P5xuK@R63ckhQ`xh{ETNtzc z_0tQ1xm4r4(whyAHjNQN+`Q6zHE`cg!FL+`{}`B;TsSYjH-Y)P3zw{Xhl1}DjY$>1 z04hTPD+G*JdO2S>8JISW8-Qo8_-zBGI|U!Zd0t~6it*xm0l2qQ@G(C7(&XC@oNucN z(<{B?J6K~B(mTBY;0jXkvA;h#O}=QVJ>X(DiQQt+`n8q(xz1g<3oAM@`DV7}$T zdByL0!2HaGOO}6A!S?_$?YLkvaCz|sfl(jRd*|Ol@PDf2A|H(x-8 zS?t1j@m&PWzXtOKTr^(!NBiL#BS74|_>KdvBn2Pi_jO?ET{thkWx%X=;gY47>k;1s=0O+E zi?0Ki=UljCeAI_t(HMwgy!ieM-2N1N)Q3I;=HzP?7xUALZwxRME?lzsaeSKr%!MwT z7hel7Z7y6gK0o-b)fg2+@A%yW+)q;QG5_vQlkXwmcBbHCdwU^Gz8>Iqr{J3bzJH|2 zS9TrVOX8yOY9F)UcAmxv5I3*#xEHubQt;)#{|;bYaN)f8UIS*I3zw{X*`FTJm{jrW z1upkn3gwkv_E*DzDRSYw;&(bQ6J5Au@#B1LrpBa--z?zHPr=9hTM5j17tSkw-vs8{ zE?lzsv3-1BV^YQMF5rHXf^RfP9tGw@7tSkwp8_-R+bUGA@?d`u)R3O?rF zRAA~{IIs9E0_GbooaA4U_p6s`j2*w&ernrBeQ$L|nz+_vxP<*{)H|;N?pqq$U%&f3 zV1DMpC94Nh!1n+!y&Bh_o^$B+IKc-OjaRv`-k+i|0>sTLpNoMjOTl+C{7(TU?815R zZ2;yP7cN?bpB!RZ9JX!@oNF5&4o+GcM|xn1?C|a z&Wmq5FfX`p$@q={-)q1eaN)f8jPK$d5-u9A{($xQ2w-MvoYRhy>?>FdOmhl8w%5xw zhT+n9#jg#x@1)=x4ga?T^Sle^#rG;OdtJC>`N#J0Z;fHxXuSA_d=GOjTr^(!Hwtbe zfmxt&{pH^`fZ3FS?*#B!z})Y`dByK{z&z!`B}*^M_a$Hkejfr%fAKpSm{T>*E4|af zF%}s4Mbi{~w*dFk6nq?yeho~I3+I*Iw}JVG3zsatkAUxUU>>>^0u0wlz4+b&=0lD1 zN-y*8Q(#WJjcon*FXMoj?7}6BABVphVE(3Y{guaOz#M$L1nXJY^Z0?bb|E)&nfmoSf_zVQSw&%1E3 zc~tEC&>(Ps2PX4J5MVNJ2`=G#)1zTO6qwUBPNg^bceCSxnHi5u`rYigz?`pfPPhr* z*XASKwZMEk5tn4#|1mHRYMfVj3<6(=#y}L~RUXd(_eL6gyVK-509@9ORhVA!n*`?o zFm)Pd;@K;HR{(Qu3ceHI{}x~#bK$)Bb^#N0;gZ$ASHSlUFu(r^1eh#bUVNVbbI{!a z^K2h%zlQ>IwhQOQR|U*m7cN=+$ag+4?Jk@b-%Y^$#Dz=7_cHkI2j;4us&w>M9=`bs}g-e#+{abEEo2EHx8{J_O0`Ilroe*lRDjk)Htv57!AHXz#RE&2r&JX?>Jy4Yn&G!%eMxY z?`m9s<+~l27gF$z1K(@F9QGT=PSq=~{_hxIPIKXs^{0cuF%Fn1E}R$NY+#nSaLM>q zfNvErJsOvdXW>iI{~i4R)|YY7IQg8={{`SS1DJY^bILcNzd97SCXFE0*>|XpTOik2m!{4UlQDLz>H7CC28k1z%14{uX@#pur31T z1&wp+Rg!%E6quZC5zRXrvrOwanbbG-iCH!9}g}Xhc8Jzodiss z#`%Cv)?W>S{UTs4(KzyX)vIfOxlQAI9(>IIyMcMwh4bR;0_H^*E?NBU1mEkxY}^h3 zroZ{`BfvbZaXw&^@lj2C8JM;%vh~l$lk=a~I4`~`aJ&l4agPg~l!sS(&jecS-}k7?lh5SX*N89P;CXhEK z`6lVF&ID$X#(C9Kz9*>$X0^ukS5I4kxjvEa{N`pA6Ln|$63xZ{>Pwn99Gvd)dw{mC3@yi7lo!_#wVL5(zU{QE=Q(48F@r8@| zd#?Be+vVZrvI=#cz5718ws_@g{B&s}esQ3@;IuycYg$&}=K{3H1aQT~%JMnWX5)7U zzcxJ0A0OO;Y?)&Ghd(}8gCAL4b-{o9^Mn2V_#mqas{xDBkBdW40j}}5!~o!hDFa|5 zL0*7jxRv4BXvmLg$nO%;4#w?;VY;8~c$C3@Bd!8mG&ZIdzo+I8S^Ia>vO9}+Ye)Td zQ-0Ux7CZ&zw`REMNgN4q49Bo6NiHXmS(0c@|N0{7B?s5-;>t+gDH3jCP90xf>-^k? zs%v6@2ktR8W-bkxevB*TLR;gfV#VCQS0vmdo&4Ji!@p&`X`>>;jygUvbWVoE_yzwR$k|4>$b0C(EKr4! z4e2ploB;C&PvXs^c+58N!*HrhrFajZsD0ssYUQEzaZ?pEJ7mQ;5Rzi#pbp(#a~DFQ z@!^M9_?Igm_z5qtb@7n|G3q~3zR>b}|Dy@^X@*0GRi zOydyY;anw6l6L`3PVyH;!XF7WBYw0X8oOA0I&JSMkWZ4GDUjIh@5)jAZd%My<;uUr zQT*9yw|#!1{izv+K&UM!qkMmf2bH5%ATqd54$(k6hRohXByC z^E-xVtt>1k>BX-_=0&N3^7kkC8@6+d=mK-xWrc;gSAG+=drj2rVCjb7TJ<}StsC;p z_DZuU!!oQf52;{OrGM3Eul%TIT47%6$3xeBJ@>(l@NM)Kw((DoG`60J#@-WO??ILZ zYzq^C?L8cJ6Zr$E0X#)N*qaGpbb&Fc6tQU9*idghv0z^7TevsWBWfeNtZSLyfb$1M^Kb>=C1~e=KJq``mH&@P{#OQp z%P;N9y|NNjZO-1T_9cae^^ezkN_&!J_RT5`mD$$rS0^&Rk(ULp?Lv;{UUdy3ko({k z+>z_;{DU7WWuBs3_dKK?RWaC>cf#`ZX!I(^Mi&TwdXzQd1KjiXumU)Mm=j`+aD!5g z_|;SX{Azj2Kqi=B?VX9@f(JWlc2d^e?UACo?ZYH5!WFbgeU^b^d5Wj$~Z) zN`~E20Q>oc+6tL~--h+aEDSutGJ1^m!id6Zp&5genXtgHm0&|(4W{_6^fA_Iots@)fZnv{ zQC5HaR`PuOlqg1*XntWYmn+_P88$vu+4cEaT$ zNtF6a{#RwN6BWw}H$#qkND_zsvLzh`)Y#VEKJ}m`=x#H2a|`koUAWzpvQ(4eZ*n6KM}(49ZnRFR^Z=;Jz3k8E z*A=nT1S<+FiYf}rIzP_f@OuzK`5i8!y*abAr%5R~76xz=kRr*}hLCTF}$S$&F z3s=Rc&(mZhRZVXnwro2IZYHL_wJU>OruMe(@UsYfn0`7%0QUu@UEza5s)NA1jlBlC ztTJ2`xT+k7X@yl7{gy;z_-uW=3jOw1*VCx0(RlRt_%Zw1I;vI6r~x8lprVLq?T2lF zZ975)REs=kP>6mIszwH)&g8Ma6joc$NX*sP(TyR2y_svmx&v0e_D6TZR)CRgOid0$ zr|D;>nO|+~#2BM`epMY&#)Z+_IEr*j#U)?#gNEph9Ive%(HliuxKVV4+unlRjw@vf zQSW5gh?u_rUrK*I(w`^M_e}qz96PONljHyrG`9UpW`N{H#NW0nd?+$tEC$iBvyhYd zs#c()o(1d}mH6lfvE;AlRjF5L$1l`N>Z_xYeCt`zj?K`yAdzGiHekve%aQFlGF^iH zo&)v$vckM^4>LmT_wyb;L#qqcAVh7Dl&w?Xk+a)+QC_G6)rfP>EbCb~6-Y1*^{tpj zn8qF8xC^6h(BO*2og#72{2`<)BL`hU8Lptg-)X;HTuUL{Cax18-6~QQr0HA`L1EiZox*5{VB7GmyjUwIQNY6r2ap3@~;u36gO7?Et?J z=~+lBF7G+gbhs$K^C2m|HzEC0e7ujl@=an!AB(gK z(vKhojVmFI!WA@b!JSM&;~v~k6X{{xmFpiMDc3h0*AE@nOz3LLH3&)hErg`}j&)q8 zIIim;4a5~RT5&%E%UW5+-H=pHJ`PEx{AEZg&G+bFm9qvSA8Ow1$MWl;yS7mf7BvnRF&;?h}coz4Od@}y**nJ4; zB(eJl_YoqE%(lxT7VMqEWBo&to ztWrIJHWxIGbfmG6PLR;ff^?!tWsr^+sRGi`B2_`k6R8=}0+D_XX+ET&@e-tYBJF{6 zp16JhiDefwzJydO(y$yHa3>{w45T@NYld{4NWX`q`5-C2y^s{&hmaIs9)>-|ay}$g zCw~DcAYtrsT#;1c1m0lKOgY-1y&Q_(|Y8`nWP6uFsg+yN;l(tVI- ziqrw=YLT9UbiGJcd9Vu)@{)jmZNvT?tB4-1Mg6++=f!1Ju{@Z2gIZQZJBTx3;!Q|Dd3=~!7aA+g8^kZA?oRQORJ}h%%E+3ZxE=6e^uQ}|p8!tqy z7v}|xfCNcXbnW;#sbJ|{L$;1*Zvao2ookXcBc5wJR zyT1@QRH`*$r9+&HRXvoMYvJEcfYd0s)Z1}Pk( z>|TBw3Ya(Im40#l)2smXddEx>6A- zlHTx0>l=BfP_17w&jWiitmjHUZ5ql)uKP|7X6`I~c5QaUeLgZbjPBqcny<^99YTf_ zpCz=Yq$%nb)h4MGeoJ1_M3TRv`Hq5hc1tjlBe6E9>dSXkh&y}5RmDn23V&`FSCwCF z9W4j%rjwP$Y-2J@USM;yW|*11`1fq-l)$=NaWml7QCgMLtmcNk4JNf!B$~ae%2g&k zmcLU;3}d&}yCh)mg8ZqtL!maU&S)O~`lEAAGz}X2{YHi~6li=3`vH&vpd_Kh#kv}m z>|ZD21a(eyE>~dSH)nf*9*qLIv%gdojFaJP%wZ&ikQogjHaQZG!V|8-=n$mk6UR(V zWB+-gKgTEgbEHy?`hb^O(Er^maS-Zu8TUizjX{&rmIU9SPE_{N?LAA2|a7l(fy zI9L!F$UvGu!Ub7rzbs4a7WXLU|JQOlF%{gv?XD2HCA+GnBok|bula9ZttR9mk5o+< z3rW=kwq;clra)3PVJ4(lO_+@*cP{@cA%6dlRM^C9{8U8~-At|5_6yde#O)WukXjmh zg8*x1wo$#cqA>GZY5A;b@aNpA4oZLiKY2kuK))a#m@1T9FF=NlOi%z4Llrx_+rp$K z{TRNBWGNl&SVBXq$u!^ZwG#Z~&`hInj*P4l_FU^U}_ie@WP~whynYFf_+G z-o)8%lD6{*aZZxEKAo&nlz%Mmk3+D{>IDq7G7cZlwe4Cvl-m&kb=KLDuT5^+;ML0P@6>(2`U{#Qi7?DvuGp!(t$^IeAJ^yV_Vw=Mhw?#*uQeHvIa*2 z)?_Y~`Xg25)`459{Mwg2)5~Dffte$|ycIX>ae(S3yBzu|Zzl;wOu0BuML|yh?0nQ9 zqd~b!eg=}}=Mon}sS}AAw%mnKia;V_m5xK6gpe4AX4};+k;IwpdI6-&kMCgDN9z2z zT!q%3n)poxVS}miZ@hT0(K4ugGD}fCh5s$duuILZSy#n;*`D~yzSEMY@B#63q*FRd zxLQ1UtA5{dNYkAW-6%egS*>RqElMMWuD@~pU?V)lD)UFQ+*rSdF;J0fDX_}@gtQE? z+vQGe6aIH(hFRZbl?g>lzU@B4EcLex0-N=mH9^tug>KB;3TG*9IM#Pj1usJu1r4@$ zC2e#h2u6fAG2HEgbuN`;cbh?bVIPVX6!N19MXI>ngJ!tgsn5U@%pJ-vnwV;H5kLIp zL_%zJfk>6#8n|_KVG#begaSLt1{>Q|*L{kn8KBjw9|=v;Jk)8kE5;F)Px9>$R*;?Q zA$%Y%%MM4jlvX8X)_V!LlZPm%++kc6>j+_3kUY6ZrHeJvka}b{5tVE#`Pu-PA<6Vx zy7~5;Hc}PsZ|m5QQ$4FXZVMVqBsPAXro+rK21%H|u_^8GYv9&E&DLRC^0o|~Cvo7G zJQ_O=4=WGx+F~U0h0GU{>*c}!9lbnJ&3RO!DJhV2A_ex}$DJgLvpx3O3Eb7c^E1lX zqo;k*_N+^&7E^D|sDrwQ+Q*D*>sZS&Qm^h?9}jRE*>wWq7b~RE%y5`2gZd2=QHK?t zgH$j$)I>9?qQhD{&9;tp@k)l>^}a6Nl0S<-w+b=xKJCK5paNQQH^Az+<<$i8%P_uGl0VwfEx_yl08`hwvg?ElR}C>##yA?xgOU8qRx?rzRl2)QI`N zx|DI4if(_S>k<8=h%=?+DLO`cF`tqzb`|!+%85;K){|^s|C6bRy;t{CA?aelA|Nra z5mS;rf2@rkt3BKNV-*QTFb-zpFu28Q^=&V#J*?LHu&!voH7;`2pebzlFRc3~6m3pl zV~uu<<{hB_e%+2-;-F%uVuB6$?+q%GY)U7?L#W&S>REP64RmpT71exIV)pdNj`TE} z026@Z%4W4fl;>fh)y1URW2H{EQ7ZuN?q;4Mz;-Wd0`_hfN3hGPc;g0WN12gY(`qs! zYfNi$UVUk`*>Z5C+>8Vw6HGL3Yl>MqxMg6(XIn(d{kF)kXXpsn6Xk`ma58GGHU7wG z+&sd`VK^awETC$C3+()k9YVF88O$svtZXUGMhOcY!frZnTw$j~RZC^Fz0hPU94l1Z z`fJCl6(niT#4$E`iwlb{-5Ej_V^_F~#W69KRDP1ja)T2E=%-zzvS%LfBBs?w{8vU@ zQ;)h^VyqZ#G4krEy~n6)*WGsUmVWZSEqKG&ScYrnzrL7#ww2}>_$%?b@v=hGkU>6R z?GK-b-PwVrW3fNG#>#8!U3*Af&5D52>}sT9v_5Xmi);vXSLU(n*imsd7Vzt#YafrN zH*w(&IPOn~gd0ABQYOPVL~?wagsYWv$YSiWctjjIC{^ZQ;XJl`sJl|CUw5S}Aa_?v zVb^!jG8WXyn$51Eox)aQVP_^N>#$E-ufJovJJqV9E-XW2SRW&$bF3M8bJ|y#t)B#% z4zlKOcVcj_8Ch8vq|E@>;3dXOMcwR*@-n+JyF*1!RcF4av{uj+bwe3r?nNqtO_|n3 z#tw6Yv4GmyJS3Gl)s4smje1D$;!>5hRYw@_TV+{bhf4kmQ#V57HF9BKq&SkLUKf;f z*ba2^+wgW9kO3{^cU~~wypLK2N`oOwF+YW^NR@UAu zT)XjdV!i!x0x8UitT!7X#Vl6luo@qzSH?z)3I+$0VVF{Q&r67NtbHCEkaDbve(bsZ zu&(u)TiIp-zgPNv^B~c8iaJYs z)@8Pj8P-0-x5B9Ip7=S#)b-FGndsj;0=#6KxVsG6&yIeTv<1>TA~DAr5D{+pxdhjBxbDT(f$Ixg+|t919c{R{Aw%^7GMlnLFT*ykf#Vu- z)(t3a2Dp`Hj<&u_NUda?XeBflcks#Bxeouf5)t+YlMVKGkpVTk%*SpQOn$j2u>B;}AvW zv#L$`MlX^D1y8yd<(uPCO#2`g4PLcMgBc>e`2i8Od~UpAuwg~5k6MnlD)IH|Q;Ovb zdoFKMud}`kzm3hXP=2`DGZfx~MggQJaH%oFu7y5b3yG0eC1#?6V>j7+8}VOJaO`D; zV`Hr8C^#%KniIquvoeobJ%+ceQoMP!w;W*X!DBFdNN*P2x~ex5dta{aV%k+9v4CP3 zK8l<$S%y!NTcqjt>pr;BwAB~0q(k??7^1gu-I41Rv3xy2cz9FmY23>w-=Zd}B34!? zsWu|TiMs68N=C*7VHcep#5f6}uL@=+s9;VS0*NXZbF~}mFO0UMg|Yug)WW6{0b^@n z(At=~|6J2JM~G}4tM#)l?VhwUue7Uq7*wNBjovYhcM?w>*-`&d54%>RI$(rnwSE?8 zo?d5d2$sGHP3*JQkCpm4#~LB(=Ny;%Imgc61u^xrWS1zQrB5|D#BHy(6h!KSWEz51 zDh9gcXvY=rk#=MmaWP>vn2b~ejbkCbESa|ek{WB5LW)(ANAN@gg-uq6s$8l6uZ}G< zT*N6<*QJi?YW7iG9h*E+X7kX$LRAg5o2BjMH>tv+(=BWd-qJ^pHElh%yP{1}oJ5zs z5Du{+;Rb<8)`%`!BPmErAl=eYgpunD!vGn_0s)NCB;h))JUg$QEFnhV$^tjl@t95@~*LF4n9y1)LO5!oLXmHZrCp+ z*W{Fb)I0!hIrj!OUcwiVrC(y;dCuyw40!?iMuS-Ut@1qRQ<(H;$jiGUtrmlySC_8I zY0d&1pIU-LeC(4dc2NC-$Xw(Y-XKOoIUM0=EV;8&94wvU)e^~S%Pd6gk=~dK3PEDC|BP&;5uzYbtV^b53>}d`!DJv7dci?Wf6K0h%2v`d4i#`#5GsP(kcf3_U6qBrx4I<5H4S%HteC5c=RTQCn@Lu;>FQS5F$ zl8T~@hw8Vq^-`?UoMzRSdr!fn?e9?esL|yj2|Sz8rol>O++&RiWvIPgmhnt06V11) zF7u^X)%GZ@mgqJFF)AOq!z?wN_^{@y6}l2gT!+K=JC4L5MyZI4At@Cxwj2X1;}zau zFmskh^tj3|u4LBBCjCHnHr-3>ou!7XNOq*bw7O%{JvC|*W_NBr!(j%KV{YSBj0wG?r9q3dW4Fe`AO*)YmcHG zH*urKsxI1%qeOJc*304-hJ(bSEwE~Xvs^`6iz2GgWi%3HbTZ2KJzc(oT;+={)K$EA zLRrr7EXjFNlt4{Jb}{#Z295~eiA$&|))rZkbbDUBKe z;$}4*vQ^>>A{(5ZWP=QAUqy4mPMH(H@-8klkc=TI%mDpP z3atF>lAbeHGmay-f1xWa{YrP4Qx&mlyi+Dv#6$1aFTm`d`G2X!zu3zfDQk=oROqLq;@ zT&TW8vUXU{wjGdnT|xH_lXi0(*qBc^H(c)QDzjv)A0Qn6y`g1OZ$h)}JG!jI=wddF z;^=akGrE{f?0q6*oiTyEkDAXp!%b{_;Rh*dd}$Bf6FV~hD)y%P^qkTq>>LO5W%7fkI z^6D;xud(yCl(Xs-=&HjFbgqx61E@&smAJ;9B_I183MpuC2~MdbR5(;Mv!;Kz2M>Rwz~;%sZoc9xcjt-7h$QT>g@E^#;hQD9G7UHwWki9|*F%&!vC|4qfX zSR#U&@BJM^tfo{*?z=Ko#7SbyGMOV%>Y6e|aI7iQ;}}^}R=0#3RxfR6TD0ndM$f5{ zyQYNVD4fXEi1q)Zrl{Dlro>{GSX0Wu{=ZXG=6#ir{%_Wl*%A><&GGtYzqP$C{yi?= z;$rx`&OYw3J2cDIht)XDnRRUVwBJ%NK=LzdAKU!LHLwF23BfT3`nY}Z~$8?t_vZl?zIt;T5W8feqWODfiGEta%$`4;xjfr zz+;?Ym1g&$K9}1h(%QzwIQ;jl*=HAoSFbKuxq8(F&JsYn!%CA7u}y9e$!=nH*bH{F zxUhX+B@#R8cQD|n-q%Ljz3&KZL7%bS_ZIPKWBE53KDJnKwS(tkuTs9)HgR+_Ts%j8 zP7U+1EQhgQo$yxj!irvJ^lzV(GfNNtk!q|gccL+a8qOdG)U=<{nraetZeP1r&~zZihmZ;4I)7>8gVg;eeyLF^l!MN82brH9QzY{ zIF?hkfm!W-Yer68+pZR~U1>xt)g|5luzD}AY%WEq*eOZQ;OanA}v%>WS)wyIzO66#n@ z$XNzO;moQF>E48^g&{8PInI^XUlJ&K4(CE;ej2w^s@?oqd(Q77^*QqzFhz*W2w-9! z;JLSX){BB~AIUcaM(LlL=YX~#>T3^=?lcET4R`>56>LIGU!dIJD$| z-HQg$iH?xf*KlDWdfuS!dGXGhUGE6A(7C(GX?qyKZg(VY#2O>cGHX&E-jgq>!TQ;( zP_53k-LRFz#(WL=r60BgBFjwJL`GOM^CHXrdxzu2>N1=i8#xuWrNu2nA|v(=imbvR zfO(~B{Meql%x}#xH(nAj+9#UUzjNFEh7he@e5h7!mJV#Gwr2V1*fMO(xq&U`1u!+9 zV(utM1qxtS>z;c6F8zkTWuUdc)_PV&w9?!%H-Pt7AlNYhKukutny*~mC``K)I!m*$a#38saY6V;|wmsdK$Y#9)lV(uLTtI~`XGcs^*W@L&V zdtLEC&k ziBthQHRSP|ZZ+i1gQSK$mZBQ+E`p?nyf#RFsj-KnPA!zWHU<(m+6ImD9Vyk&_)7^t z)_q>IXw7NOjp6@j-1~`evP->BBnXE6t$=Cd%ggP%;F7IR&P=HJ>`q$uRq_1?`pP}w zX)BJ5RsA3%h`;n4e+zdo4wInQsGuWfTT}g!fruz;>h!#E=Q1AUtfN!Sal;T5thZoeHl9#P z+ouLvI|BIj*S~ex)&M`9LemfY+Bf#RKyKTo$P=WbbUkYDUS`&0V{8NLxrAwDm44jP zh^<5$*Q31-LA9>6{;&fZWL2Kg9<3#8`Ny6cXz^PiKN!P{(3tofwAi{s@K6@>uysaY zOI2VC#DrYq1qdk5C$iPkR<^esu_>A0tldGCq~6DV7%L=qUG%!rJ@l8 zb7Htzv0#}3JJc-=Y^L_2*2H}5tZA5sebi=EWMV#wXc=4=a;L6*_!p{=1Qs~T%WNz) zu?=@f-R5HYV^ieH z1d2WeVnLjK$41c}{9SuaD>ka;L}mmdwSjqD@?`<7Mr4Bqb#$dPodc;16%vY%BXL6U zE-oB>hx-#E;bz>)8w@6=GUenUc6ckg&(HJXdE69UYvfovi=O?c^K;|^68`Gm<4Zrb zGXtt34#L@m^MiKUoB5zq7QNZ|Sq3^Zo{i3T-UYK(_+m=zhMdw3c4k;-SRdeEOztKa zD!GSc%d>8e?NmQQcB=0yIZ(R6wNpKxyAA3iBY42OA0u}m5}*=%rX$UTL@h2TlLqCw z)^WYrksuhq#D&TS?N6P6_NHV)ZAk}bR`?DwQkera7K%0c-fVqv(I(`EQz=4foKQH# zsoi`CXnoSriC|VmbSflOL=cQB-e7#jKn8C7MQ42uSH<(@P|38`;O^Je6{dso6c)==cLcI>}aSmca-_@v64PMU)5@mqC|t%#GKO1=209iYifB^W&w`M z6h!|dU@t(CLHPo=;c&AbR%NpW(p^$s*F#d9h^gNzI|#-HxY!F}H=|6A-_!ZUFAPvq z^Q=5|o>e}!c$=jkhxOUGm>Z9qUs%wx6mc%J>H*UAHO_rROC{b=LYuXha+2&w;T{z< z`aG!3ha)|CNKX|$@{&r34*f1xLj!?l@h1pe!J{|}N^$aV_$Xw)I&{3I4il-MGxb6o z_wGPjASu4Uz@8FK$|W3?KW918Y)EQH%=a9-UqMnMRtF^ZoND#p4Lq@O4KT8qb;jQ% z&k&ATE4^XtyD#)5+-ft>@oIm??USQTFVUW3TBGCi>-? z28T2JLLhogb)={Cf$jwXSAUN#+WM0^o%y-up~%c&)WFHr(T2|>8v;BnmR}X)s5AWz z84b?Ls;v0%H8{o-7qDiEA1-*X|c-%;h(h$ohtProkXS(}Vf4nhlnh`)vq;Gw$C zn`NF*%a@RB6^f$(Pt0QM3&9;<3~LT*SV45}*aJY#9Q%;;0svQ$(DPt}01JzAS*g)z z_Js^;M5wN2j+*zgZ*P4(56^TcaOyF9U^xJFmkUXZje0>^4oU54Vz10PsA9-Li5ZVw z?P9^xFSDT;y|xFIu9r%dw!vR@(tjWK9gjo z?9{mweEF(gef=Nyz63tX;{5+zvOs_c0ip&$4H^_hAt9h(lx#u*2@uEu0To$7vVlNI zVzS}zKr}#ER`94=wVt)syY;B|1)>~9#iJfby=y&!cNK5`-{+Z`eUEuJyD0sAn*N{0`*2Q8zk)eHrkTv2PT7 zCG4Ye@w2ZQz6;n_2j4pO1>sxEzUA;;%szT-GfX+!WQZQo+?Q=6T6ifHTND;Ot%PfYqC?kz)a5#K66v!tpPk6DF>C!F+O6+j*fmeSK%pg~f| zn@-#2Jiwj2k!DDyC>cm0CQ6KIp86=(GoMEuG3_mZ>LP9AD^=zTyKK~Pk|;7wjIWe0 z)oVl=S>QKw=))%}c~}HabP}hAABN3Epv}!ejQFXuv)Gr2SbF{`{#;xV!U7yiwK>m* zqcbY;YjnQm8g9IXaUD=5lWJ$gvcM*b09=6OAX5AENTe!h)dYP6lujs;icfY$DB2Al zWLCm2j_?zf6why}TwFN^zx)?Pb)^TXeuhn2D(gDbVP=f#r8*Tqry-tr4pW&zd}uN~ z(bl}ETVAe;Cl)$JY5^_!h)&66#p%D@d3mOn@ANSkhI_uHjG;JYUZXv*?w$~ z0Cw?M7~)>RJXFA~?4ybbv5#o3#0x_K+@V|-%MrupjGSlpdy&LSxD-Ah6Zs{EL+A}o z-GMxlxqMX(3mb>lR(D&n0?mht+gB5)3=Ykp$MVXMq18<|P+Ala(!h9LAg|306+gU5 zXI(rhCwMNg#nT7tkN;A&CU|Hwj9loj<|#ssK2Z+H5vG$d)bbOi6qDegcPGvAsqmI=*yB}F^lfEwgt1F?MTnW!^xw_7 zz?3?ZMBoTxmm>RPN_{%`uc$Va7R_ME5ymdn4I!q~wbT2Rm{Jds2pnPTQr!_^N{#u; z@as&emk~#fFm|aP2r;F0e^7X{DfKmpz!AnSMeW*@B8(|TU(qE;7`qfrvQ4Su=RX0Y zDh>L=206mmrD)JHrR=plNlFpME=4WSl(N?{{YVNq!q}x~95AKqwM>t~B}W*$6pf9h zl)aX>Nh!kErO57>QubQ@T1pYdE=5N)rj)&w>4$~L5ymb>Q%qCpq!}q_e5&Ndlgi1i zIHh<;ihCuZjO_bP{@9eF2h@=xj6JOb5MrifuVq@>k|T^=ifpebRsZ)DFcM0`P0~Xc zyA)YfQ|cc#cS9FcQoE#wFm@^0CNrfTDD8{pqon$fae^a^UFsl&m{N^59DzYXNzvnI z$Pvaa)gK|I)LY|Jno^l7E?8_z(N~Dc5ymc+h7eP#`?1%+AgMCU zmQsYVOAWM1*-K-tlp>5>>M)xWKESE8E|F4%u}d9}5K}|DwRu!Z5ymc+Zj-WGoA;y? zVeC?aY*Kb>(~|}+IKtSajzEa1q1|pAC#48um!h3GQ_7yNN-0GcyVPKtls#Xoq!eN7 zQb*aO?D?WoMskF)OC606Q$xEIeL+eQ#x6y(15?Ug8sA7M!q}ybu}RtOVHyqoaD=f- z9g7e%ExSFWH3>Pw*rkRd#FVmI?4?qQFm|b7HYt37Q?2(8Qi?EksSJdeY1wO8T!_W* zw`fwCHYs~8?~-W|25DJ-{(U%02|J13k@)PL38sdh1NGrPp56>SML2oh% z<5);hXCaKpYrf<$EIjE=Br^i91dkZA=rcK0K69iLVW6{Ro;eaB2_CYX9=!fF>!6cN zsWYS$VFc49k<^)o=a3@xpE6*Fkwo#xQP@QiM^pBczUJDKT?{mz~o2Q7J_j zyA%ctsWV|`_x<5vGp!e;6k+UAqis^-7wtH~l=?zS5yoCV09nfCi)oKcHKlsfL=}!O z_O!AQlHgILagA~7)27rADMc8&)QK!bU6jgDI8_?CQi?DlY`P2)ErHNMOGvHfz6g@y zl)K1+p_~Thw9HK(N3p1Qi_R1>oL6Ml7CweCV)l!#-0r?4Picd56UjV=TPDeGiJBIz zMa=Rc>=-RAA7gkNfv@c5w~%dB8uV*Lv$QYWRlN){K%deWuWs)z~;A@k)e|Jg^`$!sdDMIbcB^q-X zV-$1sxw|Zuzg#kxY0TvsbD72r6N%J4cqeCX^NS?&RE>EWuy&oNYRnakQB^gfZRg2m zXUZm8gqrlJcBW+2LIiA|9ed4hb8k2jTy;1be^FxpTZa#-^tzj(e8C7bAn9p z6pi^*VC|)GipD&XF|;Bkmz(%87A2}Tjg!nXHRjWRwKLDum}fCYnbfUU)>um8Y{@)J zWA7#ca;k8 z+sDBwgd}+0!h27=?CxVoWgy7p>5ht}K5B*>hmhH}kWz#+MnbIPX*EL4+3Cd>Z=7q^ z;6mACs|-jT()4UOUVQayXi&G1qF$^EBr9 zj8VNiW%mLEsP?GW(={=xi8+y zos&8d6Kci0T{17yn6WA2DCb2Q^Ag6mmxi|&rDhmQH0GrUwb$Shjrk15ka8Zp&b#QU zXHA_4O6D^(<})?sGc@M2BFyj@_O>xmGM}X}pRF;Ur7ExLNYJY zn9l*$UK-0Z=H-lWFO5ee^Ky;(T#b3T#(Z8o%>RUX+jBzjLX_9%B#{3(Nd6mYznlb2j>>hjlMN1#V#bI`lj0= zj-1^hWy(d*I*s`PVC~H7H0BE#qfC6^HQ&8#>Wqu#>@L)pFVdJV)R-@3j2ap3^WK{! z^TitTZ#CwNHRekg+iI2_|!< zWWG#e{+-5rnZ|rMW8B+wi)6lBW4=OTzFcFzk};CPxV>+W?@XPqkil1K%)i%|uhf{Y zVvL%BjQ;uqY=Nlue6M7_N-$eaX0K)`RXg|qr=+$^DZb>jR@=dAz zQxFVC7`xOR2od|(l$KqpTuKo}mJ5T#XIHX@Q3=rREyHVlP~s15Zpbs zw8}ZenbuzsYPSjZXldQc825aY%CzparA2L(r0n^+PfP1wEv@?*(+}^Io0j{&LA9%V zoi5Y5U#p!5H0Jv?<_8(m74PKwzWU9JCi8`o`9Y2OAzvs+4*(nu*v+8WZtYXZ_$`HYs_02<6eWFR7ApU)tLW= zP`l1sHRf%M8G&~XUd9=>&N6jAK{9XCn4e}TtL@#UF+anYId~`L^YX%&6svNcCz+qo zn4i^{pV64NGbR!5h4ei@;5=9e_)R~XZm z2;koT^7bE0ov)Q0=oO9mRbcJRuV~CW7$cQ4KJwnP{7;11ncvlz-(!p_=WAYH1QVs0yJ6-`?mdn9 zUkJ4`zo#+3&lqJz_dm7?1HNKzIFfkL$~EQ>5Nch#H%Ci6>!iI=W! zJ4@pugxZ-u)R@~C1JlXQzMpUvB?#B1F=P7fU~bcxKW2>TgAWfZK*6ZeIQnSfHH?on z=1&l6*ZE_O`BTP7qh{oHIU3zdF<(4{c=2r_jrlW#+L=Gqn9(tS=|Ti>_WiN%juD}s zYs_CD!p{7;#*7LBhW45~c-i-RPeM;8_oc@CZ-m;Jztot&VoZqM@%rbwi=n3~jVFg9 z2<|J5`D=vQnZMGQcQfWNB7j@4XZu2vdDSoxx?5xZ1`&4V-5T?^jFH(k&i`!96()11 zOu_uE#{8Ye{H@0PJ!7iyPGykfnTcvwrSXAe{$6ALL1X@2WB!pbs&}us;Ohw{^R2@X z3HPJM{1Za$rSYT2yoWJVpdP%|^{p9bGXEr*_h`%nwlnY1nCa*}!6T=JM%_{G`%LDW zvXB^@$CHKcX6v2*aBlbF#+ViZ7IATgydX#;Dd}KmY1~0uqDk>v1yEH^A(5+E-)Vza3`3 zWZqw6K0ssMUt^}{UPT+xE|<&)YRst`^MM+3KgM)Np5ZZ4R=7bCPJQCg#E@;gJVawYMq?hLG1E80 zqV<%llMHspYRp45=3_PHVT>6F26!C%W2Z>wVH$IW#ym`8&SVU+lCzKI*GlG0kF(Vc z*O)Uk<}Ahx1S_%I_w+uH%vl=q2#q;QV;;#EwTpGqxd&Wj*5I*YkQm%Zk5lL4H0F^S z^YM&vpH;4v%*SiYqcrB@HRjQbai3NGRWgs(m`~7{M{CU4j5!#2h6i`UzlZv&JvZba z2rk>>ER7R2=4_4mB*wU}`nOBwlQiZr8uLjSa}HxvIrp2h`2bVrvRu*_Hvl|NoqZZ} zj>eqJ7}dM&YsUNYnAphGnDaE|T#b1wV^H`0!fH7r~ z`I&p0YfR>s@TV*D2?7p#smDYOL=bMPOJSDrLEiH^@~zj+)OSiL!U&DpY&^ugpE7UEOd)d-vK|tV@;Q!{%O|1}>3KiZmip>{{`oeQ z5}sBenF+&rKMspdgRZtl@_rmGYTtrtk&sL(=WVtSs-8!zA)|;V0|ib}Tw)^#lOGAO zu106FhVHAR%cX`hJ!#O;+D}hosbsLi!)~V5GG{S{x;m6Irkpo-u9^33l6jWL$?Vsd zXKBo{8KbP$5nH}E#boX`h1D@;Ys{4z^K6ZI4r7i61w6)8FP!~?$y_Fx=V;7T8uJ{D zxtcMpV5QP%%e#A+$-F``S2HuBjhAJJVWc@qo_d{qwO*~IRl^us>%n7eOL^!9Gp(;A zbB)KzJXd3`(U|8kCLgSni*T2EjF{vjH?c(gpXYHh*J{l3H0Jq?p}8(u_8a$K`8$(2 zB$?+kGg+hz7$BNWlT;T@_GMsb_l_{!<})+UEiXl!i8;2^Fq%1pFx(5o#Uf(?BojQ{ z5l6YHs(i} zugo;d`F=2ytM@o-uz{tL5l2$w>a`kdWQ_Y7r1w-I)#!0DpRO@CYRpZHQKP5*#zKW; zZqk^WHRdLbImj4vMb4LfXS+o*2Q_9I3+;U{s4*{MOlQgb=Nq3ycT_#)4#~VoV_vK= zFVdKoFvfkv|3We^(U_NN%u6)pGZ;f-J3M%X*9)hbI^Q)7L2zeyoHcl+#(ajxd=_Jl zf;=&IdjF7hCiB?o2!cDy<77TtV?Ik`UdEV%AWzJTcD?er$^5_!1i>xyIGNAUn3rkH z%NavGh3c*CvimU@s~TK(GJ@cidz{SYYRtA&1OzhD@@BSZ(GSPU{E=z+=qb zdb(vMbEcG9<8f*j)-+tB<^6ods5Vyd(zo9kk-R@4na|gl*J{k?Ys~8yL(^F*f$w*8 z*=;g^CYjf1%ok|P>ojJXizj&8XBT7qNDS^mkFzu`(wHyQm@j6`Balbs8Ql)Q=1R7GwkH2rB zrR4KxBM9y?k5lL0Y0Q^t%$GBUb_2+E%zflyB%*rCWwQ|kce#g{X^xbIiNFM4NlMI- z-kmL;Sw|Q#M;eYf(&dH~b3!GoD2EWnI!C$!JoY)#<*XsV#zl}KcZG+gEHk1jS;{&i zGNnF(ln+vj!GEk#=7<@Q8FD>B$eAJEBZOumX2`TEY6B|7+H-%;sVjRpY}O4J>N^2R z?oLRN`@P3m7gw|@?=pCtI{!gqzFuR#fib18m`wue@b4_pcSfw`k0_YRtE2%(pS-NKn9IB!nOQ!eqX8zF@vh zW4>KuzD;AkgE7?VXpM9EeG4q>f{Z%Be1~AR?5_NorD!fnQo;#agVhbB$c_^Ry9bsh z@cf0PQV^%wi0P}AX%U9@9Ps52$$KYD9fD8r7@v$fWQHlVOiB^Pp4MF~rTVh{X+Kv= zDZ<#L?q;cOt{UDgr3hn}x`(9(NGbc%e*Pw<2qSXcCPNG(O@?$|2vK%vMy=--6rNc= z6l@)d{>o{od{OKjTAkj@n4S~~XaA<{Q8KN2J(RkY`96*LUXA&F8}pEN=RI!fx=1qL zuQ5NMG2gE-KggKz(3jfI+3zJ!Gnp@w%nxeJ4{6K~YRnHaM$O_b-mxXiWWHB2Kddo7 zqA@?LF+a+f*Pt)8{maubjy0Kokj#&2%#Ufzk7~@1Ge+5{hbLe2lgT`-9*My{?n!gh z;ChYuagBL{jk)T!KUr$lnEpJL2YkSFFJHtlDz*fo;*DUErP#{87VyqPg0zzUDyfBA;HOr7tQ%$qglEgJJ? zjd?3$+~*0C8j%>>R*$nZ{-!Z+)tI+2M(MnM&7ZrQI^QFiw`t5zYs}j;=4TkwmsErM z_d{=VHkrSa%+Gk7IzOv1Kcg{kXUqX$g~xcS?~Qv*=6g>^5Zrc;lleJ~dAr8^JY(E@ zcUdzN8_#RZFKEoqYs@b)W)LXgF&YN!>|^S@P%^)$G5=j-eoYvs8*q z3;!&>G)R#n49yD6+1EQPbtvNCF*+rDWvTaUDMc82TJN%y%KN)rFIYzi;burF!q}z$ z$x{0PX68#toi3#aW0!i5rPS=J@S%6mNR`wYDMc6&cDoEQTf){4$jro0z`9sFI&yf|!bRc6ctNs6P|NUSA)xlzTh;y-bTRR6b@q{Dh@cJKPi8x!bI# z`=k_M>}h?q}1><-*bq|E)29sWE@W825JADw)61n7`JT zztWg@GiEgM1CMdvAm4MUyztxv$-G-*{zhZotucSgnBJ1vH{tFzCiBOV`CE6E#ub@ETzV;?cp!a{+^i$-6ExafRs4LAA!(X zyeKXEvk`ubXlPn3<$FN#5Jt6Ckih-KQhmh-KWpmzqLdtZaGS&Z5ZpN6k(7H%O0bLrBshAdgc{0 z9HBABbty#{yHuxkq|(k}1r5U3`$YmvS$mwwsdY5>G9~~DvV6ZgVdAHzK650qw^JH1 zTUtVAmQpQ&W-{JR==|(jrBr7~QOTfBAcW>EBE(u6U6{vO7befUQi?Im)B9}x$G_Kw z{a%X&=&I#Z@K|%2$e4bhfX6X!@k!=Hky8tEH;p-wb82O#-xf^pEJwSdaiwwCYcdV| zGv-Lg{8jsV<}Z% z)N_*}^;L5Y>51Dzkm8;@oUZav3X~Q!w2YoTnTN(fa(}$=N36aP#4h<<@t-gvtN-sVeX$X&W%J-S%Aq@JLrJPe( zYJkKq`)1JvrhJdpBA76OsSqJl&O#q+InyuYitq0blGX)gE{+NbDaJ5m4~#G5M2MB= z0Op}wB;aMYb)QHn!q~0Wfh)~V3hTBr2mYY86rzC2kn z_Y-w$>B|Rc%>A_f)t@o$V{W5l?yoTq(3tyc%m*{(2IQGmqoI$x&r|hh7*9y%gP9pt zVl=uSp1NchBxSb}hiGXXtfh4*WBwx3>U(e!>KZ}pcFVL5)pC)hF(0Zi4`fUsn27I+ z?B{x#%;%pkQW&UmkvS3pge56^E)LVu8mOgpIAcD6JdI6RAD8~yOzUx(*5O(%(lzG8 zHReH#c>}Ce7ky7Vx6Wjqx(-2bgEZzNH0D7X^O1}>5b`jf#=oZBI@Dx78oij@ks9-0 zjrmB8`6$Lrf;>FN#B;ts%w#T;%tr}ki{(F>rIa0`k@_fRCOwu*siPs4Kmo>jgpef> zAyx}8gn5oZ9HmZ{#N_!-N-+kp`2NO){Lc^}R*QWM^H_Vg;Ia1ZV;Mtp5=v{+Ia{Wi zIXzu6AFGw&P>uOmtqg}TCJn4qI~#TlJIG|dRWc9Lm@_oyVH$HLV`xTAC7JZ$ZK)>n z7m_(sV;-(CXGUsg%SDDU8IAJQjDQ{1(;hK#u1U6 zB82ZG_q2s%0`onJVGjQDjq%J3Xg#Wj2;mYNeLUhOMMA8(IG*)U<#S=~Kd=LaAa=cf zEB+HkgbkD-6fQ!J*Fq+0Au}T(X;P|L3;A6ngqW=wjzU5SkzdzZbnkm>RoZw;os=Ss z(B~n9kOdH}#cBaYGtX6sLvJvsVAA}I$RKBKYA#)Kj7$DJl3B4L2C*r@^GH*o)wLaN0Eoc4t ztWOH!M2hf4e9y?V2t)H#bC<7xrC{#4)qVWd>q||kx1|(eRId~}+v8YDwP*WT|86No z7`xPXmZJU#k95k{?RO%8Fm|azmQwR@`&oZ~DMc8&RFO@}{>whcNh!iW%2FB=Sc+O3 z_0tU}Z=7W6S}vssV^3=$OR3VZ|FX{lDMc8&)FhUoeFtR|%(TvtQiQ=D+;3%w+2(Jz zgw%TI_e=$n;drxJtzu5=N`z8Rc<`L3x0>juBu}yEr8JmW;uFd>=qEixBI4tb}<~ z$rIM(SqG^`bWd{zvK}FYz?l8ZdxiL=CNrcEA;WE$^AS>E3;7#DmLSCJmEBOZvuz70Tq#PGTBi9+Ol4Y5ONBL_)7&g%45OSe z%GQZc#rzw|Oc*d*q^7nb^@fxpOedq$@A1vp9RFCKKcmDqzHnU0Z>u_2yp)dgzeA#AFhJ1-s_)C)A#S8`3o zD5mNFHMH9R z=T*i*>n{&h*EYlftgN2j(j2U*4b;V>Ew#0Hv7D`V!E+lLs^`?YmI4YoNcKkbqd-GV zT)3Lb+Pb)auyAqV{DqZG)x_#nsCFG|>)kL@8UytU8>&@C8d_X)>p)3E>uhXJRAXZt zDF&Nb>RtPcgUvs=p{fbLpYCdabZk?gv97Wz9`KyndTIM(9Qpb93!n>dRI0Dx3Vlrpnr2vrmrx z<+(F*bMtdWeb)u*=LY9R0~X1q<+3G=(=fWNY3i7(SfIrfha1R3rW zq}p(m8!k#b!;LeNrl_shkPLqj#{bG-gGDhLiN8D$6T z*VkO*^Pzrc6jS5z*VF}Dngi8F4xxfeA?$!nBxO+BQ*kxW7ME85WjSoo zZf-Ff6^t*7D(h;i{f(7PXujxd{(7tla2Xs{W@%%PMpRo)_O7amOrxD)uS|O{c1>#U z%Ab?sc2QN?SXouel@Lc+$i|do(@z#InMbOJ>VRyAG^sJ0q=~}t!R5Jc3XMidG1A$T zk^>DXg&vt940IILOe|F6@grI$Wd9&bQIcE4h9nASg<}kmO^*dFal?H~616~0-4|9a zQ449kP*uH*$4a(>I{;b9=Age;jtDXOL!p_Dzo@>s7Iy2GHRW8GZ8dQ3i}p&j%k(y^jB6@Vb3E{K>lDQMgiJ~DK0F@E6&X; zt}vz1sl_-Sv8uAIyH<*7PO4H){#lhmW{28sAq_RI>8Qr2(n0$dbwAvP&L##lUonkn zn9I1up||?|SgX|eGNcp8GPEEYg-POwqW+$fmy=!=Xl`g}stT0A23CyY857bMO7Kj8 z!!pHeCqEV*jnRr98w-!gl@*`v&lNjy0m=kbDa}%gF-sMr`_!W0`Z5CfP_tQ{0*qa< zWa_-8hQ$Sug~})t*4U}JZn6}CwT}Dp1cmRIf?JJJ=5VG}(vCT~Z&b9kk}zqIZXbZ? z^qh=hnCHb zyKK@FUxawsk=rRg%AbF%xxnya1J>u5)W}3tQ^?7khKVrNznFho1gZaLhz6QoC6*dd zc>Gg&E#sdTsKZ{PqD5{vQ&@mR<&P9+42@+mDC#&g_M_)<-qFaZoy%s=l9>Hs0fy;` z-PmRLa;aPJS`CGmAHe*wVW}VHac;opXa|;d!ppzn3>YVSQ_1il+fkEZBa|+dR?+Hb zAC&93TI^FJQ;`Coxkd(zxk#TaI^_@p0KxEQDXDe_29#A^saaOMq@MbeLUZR@{}`|s3SENg*S=43f(Bs##)+bfJxE~HjS2xRgVh!)P|2JBU@?5f??OP>AWQ`EB zjk3KmWu;<&DOL(%ki;aqu@XDz6_Hhyv|azbc8dpY|76i#!_LOSOZEHPv6n0$7nDecWP8p*@W}`4pht?t1a6H z?Bb=^i0)8j-TnyP(dvSibCVY0Zbb*F1Z?=zYQJMGxoCIMU-oM$x3jyt4;BKvhda8X z&Pe!lSWT~Jo7>#Ax9s`Psm09~>}un}NoAdV8;obju{JSqB!DFXmKbWO5zpa(zqoQq z2Qd#5JDhEREsJaw6pJfk9b%)PquF3fIlCT0#p*e7Ve|S-cMi zPC6W&Q(3iOF|Ks`8yfi(41_T+R*0d1&*A~k$Y@WX{nNy0{xZ^8SJ|p)^Ww@zb>9?+ zmN;@!N1c(w?2cr*E#nRqVMkJ(uLDfW93Ht3AkUg{V%%{~0Bz-uW95#dd!*ot=+2^k za2@;PTlW2kd`CM1QMLycBHCFC(lLJr%9*Ivh>^D$Zd!QCn}8}j#vMS|WS&{2V@#;U z_w8_luyH938u+uF_{%#Jsz?O_<0_rfS+6GU0~_wA3myJ?(xNDGRfFzy;Fe!;9HRj4 zR`bm;>-BBEqRpZ5_C2lv+ivad-Bnr~@!-axdF4fi^8|RZn@K79;CC+I3&5E#5CJ;O|7*ih3_E zNMrIJm1^&54Y~^|%cAxdXof~0Zl|h?ht{58xfo{|L{NKJJDazJ)lFc_ZPB^{Hr-kltze)&x{LG%l6 zs|gbKtAy%;U$iT4k(*%gTqSIOiZ2U=udMx?SvxHev|DZJ9(4SZc^48IAL5wDyH~@$ zDnb9m0DqspLu?+#Ub=Ryd8xYU)zI+kIa;*)^TK}HM&X!yuC^LQ z8an)wni}}~>zJo>fG$eYijLU@e=X+rzQnQ*Iw6n4<2vRstDIx1Z!4oO=HWnBpI=*36QC=E`mR2mUic#i5z312+JiTp;!KFv8*!(iwoLKR7kMs% zXHa2XU5hV(pFyW3u{X!)*#P3Jhu8vf*&h>4mo7J_x4+NT?)GdvYp8@p#;qmGx#9#|<}fQT zazssa%?LCi+RBqVzO?z+&Ymr898wzoskPPG(--!BOU^%8Y|5!qop_$AASTM<%ZEyh z*xQyQMT+AoC;Wi7U$SGzO$<{K`E9!y=wv>%@k$0qOjYoea!Qc*)qcr7scrpMET0#X zQ)pIMq=&XwZ+Qi1?dm(>d=QIq`xg`f?}Ae0`RP!oYF@hdj^e%{P0#$#&}M)(Fb{{; z)pdcUeX22t{rKMZIC{88q2SNr#A+}K&~rZab!x$;rE~Cfng#rr#C=W9HQKy%;XdU} zAE_#JpEHjDb4&f=+WPAMKyip3EX|{1y47BfgQdja9p&jw>g(LUaF18)(ALEG>M~u_ z5IeoRA*!}=iB>cb-OSPfsNJKGjEIf>by4X0Jk5PD$H#USoyF5ex_H2U z2e?^-@eb3oNaKM1e1cJ2xd4y-rx{cSX)Zj=v}U8iu@@q1rm8Mb*9Ja4t#q z?sOSza``hR{39oNYLR&S_J$ryJL&QVRGcg4y_-#{wQ%I&`{Ugk+H+^~NTS-#;X zd-xd^aV^Vvn?fD+M}`vTv{cN!#4ss_`Tr34J}nga`z@$Wmo@(0RT|8DWQ|WV>7O&( zNArzcYDh>-edDZ?Odrkpg;_TD6YWcrcqaUg9Y<}>FIoWIUQoHGWaG~fPt{3H)jB)E zp1b=zF>rbdp8M00CMTSa|4$|-nffIvHA3RskiX2<(l>hLuYc@oLq%P~KaJ1r_o`FT z0-a>t_1QZkhh`$S0j;A+PKGuX(g?;I)<3T_`KE)qoH@)Z+^P6aq?4XO_pKa1 zgh2XZ!DqYq^PfrHvG4aEOT>27p*p{;6hp#hF#y1Td+7|J0%^S~+TM7S@)3&Kf_)IAu~^Zr+rFi9Rvu%}LKMo{G0A zIU|D&4LKw08tUh&pSHH%z})NH1m;<8RPMF3&2sK#NuV6?8$MAAg5uN<@#y8mzr~{m z%RbF>j1g4M77pjaUr;zh9SrRZt70OfwT9@U2MciRTk0zYJnjL|u8q938H>EVAxRMC z&@Ye$nu54o5l;iBV@u1Ci(@x6+NxO1!DL!UsUs|Ic*oMV365V`>rhW3igUwKYvRAw z6JI;|Kl`1Y`09zL>SFLH@J*O9xv->Q@_66E%Ep{b{Pj-lU%to016wd~UT ztt(wUnwPqIu)fx9AA?Rd!f^!fb2iAavNX>DngUo};=2X$tS+IiI6; z_sds#f` z&fQU7bH#RT>{E8K9DD*KjBaGwLEk8dS6bf*i(l3;pzTev&T0By$>ub+G}BMlS1pLE zr<1{w)?sWzeLek>yLmgz`P=Ndc>uTb3@3R>v;%$R4%x@nUaSZFlOZe*1i5)y9<3qD zuEN%8MG=(Y1`Y0*TCl~U=tRWS%BH!2Ai6t;pcB()%Y@pt8&Xyk8`n|9miKpvO=xL6?-LUn;-6lBsR&-PV4eL zPqKx$#LdMa9zuZTf}QVu(%tFnVeLHAjnd{vqF`RuK8!8BL(iNHOCOR{T90u7;rl~) z!j0`)ayU$kG9YM4aK{q8D6__VB2a#yrn03@JRv;NwCD$i>0%z|F~epHxJ|0;`;WII zBaUA)Z2D2|KxKV65pI4JBS`!pse0bG_@uZC;Mj`T4s0w*MGDQ@DqTtp?cdh?+#qz= zHNwKJPLb)T*b=PHh%G_#a99g5PlelwvK5nHq7-exDotCUOjQpXZ%NI5$Q&gi(;n{L zkaQ4#jmH6_)wa-Z7+; zWpx(8UTWc5jC;%BEaSbDcUHjOi`#2wZ{=wM!u4V=eoWqkT^AD%+%mDmTbg!lHRg5o zEerj4Mi~Fl0Dg-U7H;93mYT@#8~UQ$OcuA$#ryCIT;k$yEMrcN<)Nf)#2qj2x?#Ex z%go9ck!HHg;iEE-%NUt4e7G4#zRZk_nDMsnWJrs~RI zr5WA}-n*T+m(6hsKFJJWkw^apH!=i5nItE-Oyl@p0m^6936Sp8vTtl3=<~VVS>Pie=BfTNo*&4PD?JC z?X-VM2)`4UMH2{=GY;GZz})7q1_P5Nagq9U;TsRk^cZ~U;Hv~? zrNmJ?;P&FecLOl@#Nea+J}NQrvWv#|1aL3J;G^>TN1S}G1NU(ZzWuBW{e1@?LFLKfNs6Bt}BZTRq@p*C$qc>jUqVe@X zTz`pSAl{%Sh(G%enaq?9I7mUG2 z_Gww1eCGmpQ4BuP@Aq-?-2&W$G5E;-ZH$v|3vjQ-;3NIs0p>FcE?Rwj2Tb>g5P*wT zA2f`oNDKq<7LBhIxXKuO)Ls_E$=3kfIWhRC|Ayk^`#o^C#o!}*b#I(}j{)~=3_faq zug1x@6S%fG_`Zsh?;GF}CqV(YX!V|F>o}Gy$F~);=pYH=5;5|Ved)5&w=qwh6gTMd!hA04`9+IuD$u>C}0X> z@KODiNerb+E?WCL8MxXQd;=lh49q1KTr|FGfcdip=QbV@-vhwxu;8Ncy$j5j7MvR& z%@2N*7tgWr2jAs!^4$a6#u$7w-*_fYz88UeHwIr%@O=!-_ZD2V^6Oj%`-~U4X!bdT zxI=-tS>oE;FWCgl%Q5&41K(Q`L+O%>re7zVvh|TCZPD~Q7V-lkr*TXdm9Gf6lVk8z zfuahSO%m7M{NOcUK8nG2Ao%_*F+#iO`R#$pSbv(3!9~mOsfZf{%yNl~%-3AzLw5u7 zL<~Mk=V^(dbjd}lk7s~;Jq91?^M0IsyMX(_$>(xz)nyv16?rrFMI%9cZra@q=UDHP zemxzyX!-36+~E=%tv-nF*f{xy1D6+r?@;hfij!{vaA(HgBm1&4PQEa3zmLJ!2YfdI zbH4=_t^76s^SlM;X72}rZznK6Sa8w!x>Oj(0eF#%Rv*Nd228F67maTsFsE8@Zu-%D zBOo!9F1cuY3xPX31|N;TzloD?9dOsg;G_DzIZnPm1NT@AKAPHZiIeYu>4tFxUgVr?!6d%)IUB2 z#xp~(QMp9ZuLm&wEjTy*XuKUHF@iBV-(cWI#o(jz%L8Vz1s6@f8Nkf5;N0{hz9wLn zS#Z(#Rs(an1?R>`+kSrlW|zdZH~tzYV_yOyv4~hKr=@*e^LBaSMU@R^q5X^Z3@xKoVs~^VpFy z1@1J7ZLj^!1!l1Y=T;x1!FMh&4_R>0>i0=t{%*m!@zHwW4Pd&S zCNj~Ue!YPiXu-Mh9R!*oz!X?;(e#@FjNgKD;~NRST41h`xJbRZ&98uYA_iY3_?`yl z$2jM$)IxrJ0xM+OSfC*S| zZhXVR*8t4*5*JwyI_B+UhaLxJn+0di+s%6qDZqUQ%#RXB{f%*sdkTjjy!RaJCE-QR zgBNh?#XS#`FB##Zfhn@%w0jCP?w12IQ{p-aJ`Fbj;f=tY@5H&-gX@5~Q{sev?&pIK zNermjMXQf3z`Ys=-#c;geMUH1;KD`IZ#?3<15+w-?b(B+z=UG(y#~JD0<*B1QZ)=3 z-=gLB7GNHfxM=#l4Ec?~ToE9)_U+XMV4jz_XncLau~TB05O2}+`vkb3V(=XR`NSIB zk-&=_r5lZJFfgMmIJf>b2=aNr%(dX6@tqFLxfWbBzA!L%T5!?$9s=fX7MvR&ncKeu zlQkC}I4@qz=a>)Cy!cdL7D`-#!a3$c#~?fm%>5GA37>^M(C-gz17@ehMXTR_kbe)D zpDcW=pNqZfGY|EK7dg@|n!P#^m=cLI^|M{~HV%b+H88CbC-if-S8IW}+K$ug(0<^% z37Ef1Tr~a2UcCU!ClY7sr2Mrt^H#F1mhHzrBDNEOC_IX!Uy{FohBqt^8;_ssZK<3!mF~MD@E4m^&n{ zz52Z$n9X*aYyCbC%o`FHO+TvNAAm_+01sSy^?M93CrVs<^*aujB@)+O{ayylpJMP) z{oV=8Zi#EJeh;m~c#apjX!_CmV>B>L7F;xYbrvw^TX1gn>Jub%889pAIa#9z{zbD_ zUjXB65V%OWIP4Y8Hx2`4xWq;3!(m^jU5%3%!6@yEgYOtbo&ww|C!YgH>0SxUtr8b$ zFAf~Fmo32jGX@{wz5yns5gxcmK3w|cU|>c`T(o+lVKNVxnk2XwEQL`Za6S`5*MitN4uhWtB@GtBggj2(GIBmnt;2;$>+dPx_1Nfgv7PiuHFLX z2PdCPdr4k|vcQX6d-ZWNFk>Z-@*Ax_rUNrK2Hz);KOGqVVoKFAFLBZDH^BT(;-cyI z1~{$<=A0!=*X}&_VPLjNTr|Ek(7Xi9R~B5f{O$p!*HV#gG(H+O`T^4_aglcAlHcor zxhn?W{@{BUnCC3GX!^Yd%tscSo83JSeE$Zf#~EfmqVeqy%peQSjn4;~VZbyT`5gTy34B)rbBn}9+Pwouc5Ji6z{@V$JaHRvZ%S;W|2o#SsbKgLm>y>eE>XYk z^Thpu8Dz(4^N4Ps83xQKiHoGm`7qbXWH%-OGcOL@S-@QG#5wYD5cqBfW|PFVmyhRw zdCQK|^3fT59|7~J6X!V3s|M~{U`{&=9=J%mcNu5S1ZJ%h=dgcdCvOAh6^VGcwoj$oQ==2ubc*sQeaM(I38E&{<9+=BY?XCm}ex8 z+p~f11KLx?|@yRW{D6t!kcG7Qk=jH3!o0 zi`&84s+r}DO?c$q(1tnljT4L$dwWp*U5#E~?6$-c`CnXH)zr}3P!miWTy|92l*VA~ z!rC)x>*uD8ZCKb?TNh|D=2TXvRo2mWr0G|nNh5ZNc<;hPDm5!ooI+>_Ps1w*FLr24 z)STQfK7=pFD=HuZaX!43V;h!8dg4W4a8^!A)B0KI;Y0XxywdO@r!W<3^V1Vc!k>RY zft$O~dwA2VC%gvPuPg9M;nKMrK90nH(_IB`7tZee?4!gUWFOu%N0$9syt;6~+`v8s z8j2@ApltnIw&Hu{9Ce)yMFmHWnEr&9L!(2=ypY)1~CIc@RyTd0KX_D|1 zUV=LvK5`x-ffczA{;ozCY#S+<2*|10`5XLQ4USTIR#DqIiX_)0hNq@`S9fO^?WvGc zu)o9433%6*c-AEPR%~tgcE}S9Wh;Pa#k@m7lf#qJlfao+5e}k7mzJq)CL^004*={< zyhMfu!bi?)?8iJbr{wfvle`D0JIOx<$%f7NkF8O9qdp{@$k|8uAo3MX4)sPSBd2Ok z<>*rZ@=*C?ZO!h~>yiy?Hb^XO-jP$-f5YF^$XY+z)9cdpoFsKYtNRuokmLrGjyII3 zB`Ng!Nr3Xxz0m8TJMk%8;tgH&SN0@^E_#4GzNFB(kH7Yy9!90^=hG)65ioW-;ugwhPU-essU9X<>4zR!Ie9M z4HeVs_6LO5k^abW5{2M@;>xYPRxCo}`m zAlOR*r02^!J_(6&k~h{~L;t3S&q_}Vp@p^-hPQJv zE7vbN$@C7NCjH^<;a9UhW<==E)X=lGhPd5_xIcuhp`H*%7EcTJSh+RW6Y8gxfLNHM zQ1;3_!Tph&v{E$Il(O)4L=9#(|EyD6pG>B1KY!0Wa2VCs(|bvEXb}A`MJG&0jikZc zr&g4dqSOYY!&nb4ErWGI?`4um*`Uxw`G_*H6jIdkL7QDY31uyd8Qh5|v+58Jx};i) z@kc1KABKVy<)hdl>h3j21#*Oz^5k=RN2d<2L2@ji%si|{@W zuP#O_-Vb5lI=ml@SBh~h-UqO6zXaUHg0G8lAbbb0Zy0?2*mo~{sqEVV-+}CV4n86A zY6N!}##Vu=f^QGPQ;aj=`-y$6@cjs17vmlHgr*8z zD)>$Swu|vQ_yqH{@JVL)h9NeEYS}oN-_3zr&3I5`?3|xza%Xju@d25|3rWLGVLwmF z__Gr~BNE?*lL#}4R^=Z4JQQR!-SZe-h}Kw(7ZipY$nn?02jvmpl@4Z&E9K|T#&H}^ z6Tz-Lk0<`FMjGO~vM&QZn!9#2eDEcKy{l0IUr+YUhOZa<8sST3-*Wi+uF=wI0z*BgMHlefn5RHha%#5Oi4})Q6j^F-hD%lh(@l?~WSPzw z(_Z9Q5s3-Bnyk`Y5TrEty8MpzeYhp06h z8G<>CgU9BmHP9-s3on-gET@_p0V#eShf=Z&*hk^YsTFXN3?Mw21+fA?JuduTBKW!p zek#JK&vimWAvY5-Vo_8PZ6AV!o%;~Zl`<*R)hNXxB;jOkeZ-Ei$UDtTIi1*xyf+~v z`shF=px!N3if6`8@?KPu<%-1Hy1qB-$`v2c6l;PAf}>5_BGg$EiEdpl*5FQp3nBVYr3y4q_r5i0sKx< zLhc%tq6I}4VbRtHz1dxZoj)L4cpNQl$9w&}xFyR)iT)8HqS%j;WY}?Fwi|>Bvi}M@ zCn5NEi-?5{Yh9o0TAqKlAjFX1EU1 z*yTYRLbR&i%!R-TIrkc#77#M*g^A0T_BL92t}UXC0P!jK6-%jF1DM_Orj!z@PA4h; z6#SZn`b)49dYOeDfWgS&c&7oTDWd4%@eYM=u>?)##~3Y`M%d^RhoM zi}%EYaxH1$+(Zg)>9h8a>7-(Kiwp^V6`JgwwK42tv6cZUezG?^v85;2!q0{C1Z7)z zvX@FL*hO$7a@IyFThTa)SNN7keDD|{dSfTH$leoKw)PqH7oL0f4wWRL3xx`kWY0NF zN~)gok&ul#5{A34!5Rbdt4oqM`Fb0ez>_;x(sY)?;-}HeQ07fFjDx}+F1P)tfou^U zf?wN;>;M!?cA>MdK5~>!DpW8#ag|gE<{qlx)KTP%S|rvW*&Bl0*Cdy(>9;y{b?;NT z-O#QhIblF>oFoJyqw4`#Ti2$95?)AnLF@)N2icV7xAtz3rCmWW$mYN&2HAZ0#2{M= z-{p99F)HwG4zj1>QvzOU0Q-s6a2h5`COiB;yqc#sznqP777kPi|`K zdNC|Gt#&B`qMNn~L4d85a2|G^GeS*?;f&?WV1yDv72a@@H`M427p2b1F7>wb2<3W1 z$)P+isv|tXo87ymd&r{#Lb-{`OSMGnJ#y+C;8Zi6P8H$C#L#fOMM)=#(kV$a6Dmz? zK^SJxG7PCIFQrjNZ*W-aaUIU)v|xP2P>tPlYCdGqM1`vfq3YKGp<8={(R=}MZAsL9 z+*?uuOUcGdJ&v4eWtaPuzOS0tf=fNXemtko+aP2s6c{p|D zo<;jjFQ1>RdPZ_NmlurEsi9>lo5!Wn6n<0w7%a|a!O{=HCo!)a3g1(B2|Z~lPp%X1 zz+kJ9(=EqV6WY_~(?`!rX;uSZ3RZ?GLpEk_ZtfKR2FXtgPfne-w%*(NZE{mLd}lO- zVWG_%s>41cLOLS^tHzgxY%YOaNKM$7u(@Q&w$g+bh4BoJOBu2m+dq`0(72SQgz!RR zlXtLjn%E>x7bId|?z8Ew&-My` z8wz|DI(t{^Pd_d4hCgdNEbLEx;I><7$!rPwz@cECjpKtET25HEK>{k~jtR2yB z?PSkx z;S&~hWyD9DAs2D%!|;iw^9+2V>GVcJ7rtTeiNT38%`+nEBv-I3rEwX2DTWU|tMgeu zz^~SO>OXOiQ~wX^{M&wF95F{|fe`P6Lqhzb&Z^`@tQay?7@3fZSwEV9UdX;e_^xJO z34B+wF9_dN>{|`r@7YHsHWCS3hS%+QJ%!g`C`Max@f)o_fTgQ3Uu>_U&#qh_9E@p+ zSlJ}nw;o(3Tu4*S9N;lV(;Hl8@z1!4$!RoJrbBLRkMpkFqvo@{{Gp!Mh(*JpD?8@2 z=_pCki8s%XM?vNZmwNeVGt>nm3paHkO`9U7*&{A;*t6lnzKf;Hg&xb#>1~8}gmG9Kip!h#j-iOF{!x=;6_^lI9OsA z$}2hCZPsa_87MKatw~LcoZ6%BWc22N^-Wf?G>pURN$6S_+-V?BDa9w8Fww_SHOvgy zNOODYDPmG_BtB8+=`5}AKbZ=3AnZ`pzVTe z7v>dhi>5D+<0VppC*nS3B#jY2vX8Qr2ophLknU&<_=0g{!M@+;~OyKM=|@%{<7uJ`Fj$6oG$IL})$7)|U zH}@y|s_?LwHLYjDo(~I`d)to1sQ4)?B^knAF!26O=nawvlWp6_axZ4RYiIGK*Beei zr`tF^;ia-tH7JM)?Xnb{lJwu?%{C(XPWC`}Plpsutr2z2> zr8O;TS)Iy-1ym98N%<3_izt^ygo$#Y%YI_Sfya26-rzbJ-Pml=u`REu!@M719~>9~ zuacxUnRS^>#G7w|~g`uIn8giYC&MZ8TB`dPlhd-ac2jjn-36x+SKsHu1 z2O{zsv|lN5Lj;594bCHpju1q2Yb?BJ`r0KPtPhHeHOameFW}bMW_f!CYdA0OaZ~n$ zMkY}rw8S98M6Ro#QkY&G=8I`t*7~)RlY}9L=D8`Gb9t#)f~z&Dt8+>FG^xFIRPW`D zCz}0sF%ChJBUl-lKZ#yXeOlx+T>ROG_+Xf80y2Zb4s?TW6myU<5~~Ac4r!LJDhH98 zqc~#9VtKOMquED5KVB5)F%D*m48(}tuc#+G1Q91Yxe*$oQZAoEiL{J;v4@oLj3dP+ z*cf?83DnOG&WkaoK#CnTzhWDOjKJj$4koR{2t!(#BMdhNgs39*!LOXqjz$<$JLgH( z7_i4ZBJ9;*?HtQy>`hAl$+4%D6+z4Q#?ev&T>7d+)&F@MN_Db`eX(200>)8Gskbpw zOVNLan$x)s@8)ang^ZRCfJ&$l$(_3L2IT*Q_7apIA5vaNx6REP23Tgj8K6BmtlE5qezo0I0bW9Mv%>sB_XRVE_GbZ zzJ-;I!|}*i=+{OD zOL>wsN4aX1<567;`RyIOkl>k%j81tGue} zu!QJPxS3o?+ZkB6d>EWGzrSe;Q^>GMQ#cr=Fg0QdlgJbvg9@3+6*7;Mr4TZO8T5gJ z%fqiuM`#_c&n9y~xCfuccMhMK*w#N>4uge#7;pGn7=irs#_*EFwIzw!8(S9e)@HL8 z7GtqDT#!0?2HA=w-nJg24}qZ=14FSaF??ETIDxh%TlOb7Xg0NVi)?;|5-1+leDuV` zmcJCN8auuhJKAH5$ zC7U(TJGviK!SVuUargwIwRU1MZmi%WJaJ9GHOX`kj-ep=9?z&#l6$TE4rPLzWG{h5 zYoo#{GDi6kPAji)m+Ws^0@%b|z6AEW56oOe_?b=PlI3_p;jo^;aN?+wlUowQC5d1R zR>HW_=aev6`w|HFOo26%lUEleub!0*Ft`BV;%^Ib3cZ~vbm0X0O2$LN$w;8(Kq7?7 z;h(UXNqVoGh$h~aDbz>-voqZ;X0nt6mFj9gnQgU(D;R*SY5%FXxa}{M($kR_#KfiAr9_ayrY5GHK;bohi#p9$Xvj;)1H%q#2R6E^)E z_{6sKzu==wE-6NLywe?-6oW1d2|NE!_=I(*qf8ODKRTlbn+cx?qZ3OJb}oERfiuO3 zH6CnX?M#yaA)BMFPjfRd9y~4bQopFOuC_YOGA`h&k4=@qhNit97anCsGC5n>hc}y} z^tW?NB7A#0E|_!NzcU9>KY+5?AO91Kbhh&kAtr8vW-bk!28|NHcHFKc+Tco^MsvCF z;#5pvs3G6wp&RlohlcxRmn4Nh>vi!4`b=L6vF_cz8$K}n2~Jm2>6{gjrI=@7@Band zYkNT+cEEI{WPjCiba};mkD3W-!n; z7di*^SpebT2ygC2d;H+GBJ5XT(x_(RarW(LCqJDMO4pA-eln4tVjP!1F{R^xliZO< z;%T{;2ZI)RRA(R;4_iczMd4?$Ru$7R^~PqonEB(bL)NbK`Y0xiX3xUTyCkJs2BLh% z7`|!niTeh37-7GLPZ)yL@KJ*l8$jD|h1QB)_P$hf+BR8c8A!^9+Vf#Y$5#$rj5}5t zSc1?-7L~5x2;ho@u?vfDyjEUvkOA~pP&?gA11EO<&D>B6#|hO{o)=m4mLreio*uGBc8a2fAoXH$FpBIxWWh2zOo&F35%mT;yg{+jIlq(c8kwSW z5=@9e2JT}P#RERn7!Q%p-*`(gn-FQEBr>BEJ`g%(Qg$;aG9Vf$Jt0I-;80#g8ngp! z)F1mp0&T7jAmU-?&i6&jytjG(k>hEE&*)*r#x`$snFd z54Fw>g*fL;^2 z)%#HP!K2mU(}z47Jsg5pQ6Pr5Z&?5McXR+@oS$E0Bqj|cOS`}1)ZLrom`mjff3IHi zFrs%7W)*$0kJv;WX>6rl<=3dMor{Px-rlzF1|y0c30fE^}K{{yR-i6J86{axz!H9 zmGviQsTHJpXhlLUI;eH3u-SA)8j~YTie~)*c#28I!AWI>;4z%Km&_PjT2!|}iokXA zo<_l|Qd0(kFi6YtG8^jgrj)+1A2wc;6rH>xM;N5NMJJ`m5ymb>X9P^CvlgrcQswJ(DMc8&6xjq* z%3jNpr4(W8Qq%%XDSIuqNh!kErO1AmQubQDOG**OE=6OhDP^zaEmDdwb}6z5rj)&w zKa)~~u}jenJyXhF%Y$TL62>k?7TuIOcZMI0PnG;+=^>0=ikAi4D-osTK5_nsrc|qx zB8**%Mtw6adoAA~r3hn}BCBXhHNLVOMnY*w_e04M#x6zn&Xjudfqv+MN{V)i$Pvaa zMQasPYE{`lG#@2JJ4@sUW0yJ_A*NLGJtt#2tEA}e9y!9;rH(;}DYd<*WV9(ot0!`V zu}jfR*_68Jy@f$jszXW<#x8ZNO=@+=?aijtDk()6yA+LVW?IXRIrA^3)VorOFm|cq zZBoOR-?+q-I+#o~9AWHI0fd-o^*{Yi7$jAOxl)QScBvC=QuflAC#48uml|Y~!Udd4 z>sBd67`xPo2r)IZTbn;fDZ<#Lf;K6;wRulU5ymccl1<8PZ4RM<3yv^$sgn_6YG}6` zqofpJ>{6%Lr0n^smQsYVOAWS3+4FU+lp>5>>QtMQJzoz?DZ<#LPP0kbt>{ZqiZFI5 znjN^6#y%-U7`xO^o0Q!i259hyBaB_@bcC2`+3n$EDMc8&)G(Wr-C|!Nr3hn}I>RP~ z3pmw!e=em6W0%TCh^e8ymcQubQjEz=?lq%1F?8^Kb-PU1C#AJLB& zD-92&sSw-p(!N)g5`g#knAOxW22|M`@e*2_|gFm|c4ZBpYGcb{WQ zeJrI2V=o_oEamfY<mX{LaAP?wYl)3Rs67{B9n1xc@el!A|63MWa&e4g zE^sgx0&8b3a4;7!hE@mU#%v$A+SK_}$z0@M9uKUYxyZp>%ov)VlRNvd*SbvRa>-om zV4eW1ow?Y-41);F3HbKlbNk*iV6au4E|ts^nHkaA{W3(faBIm=LaaTliH@`;GbVmo zk4fgqMq1lk(<*VKHQABY6viluk-OeF-^|xe89as4vgTr{gL#UBxs)-~CFozw?vmDH`853XUBWUUbH`~EnjZk}Ao$X+r!x&}xH{ZDI8?!WOCG#8y zbB%*}j)S?DF{HBxpKEUZ$qOd)_at+zgSpPZT5>>dGFZzLrvi5lp!Q;AIye9?PoaDumig{!&NDFJsJ6_$IctC-(hP z@nZaw%*z~gdNoT~N3>-Q=4%+E+Tp;ieJ`8Lmq_Mo9L((w=4%|x%NcV5zCHNZXTn<~ z^Ku9C3J3FY2lKT(Fb|>Z!d>fN{vJZ@<$SG!c_m}iye@h~c!yaUx@2DIV2(PNS2~!l zV~iSw-}tPLZZdy$j|I+%apVEz$fRBPFIO2J-}c?TI7 zxF0!~e~eJO&OdT6-_97t{L_yaQn1AYE{)vP6PR6KmzVofcTTJGP;}8jVr-S(}gxYn!)4_Z>TcIKZunD1pw{8{BcB=fxv z=KCDX_d1yGXN>BVPn}SRf>AZNd=Mhx?sqW%0-<)D?{_diz!=%Qw1TwL-ZYs%K9P8F zUfaR^e+acRKj2_~kTGiR_sm-_!>e?jeG>8F2gw}F46V~mkir7hh5;v$pz zGs*mzgZWnu=Eoe&zh(>!9J}j3x(>!hmGe?+=5W7uF#iUjcAbCiV1Ar2HTWjJ4A0Du zOy)VKAqehq2lH*JM$9`=2eWj5Z`_9 z`DXjOZ$-Ii0)g1c*;7AH{Y|E_j_Xx44waSqeOcF32e3P^9+-^Y2A@`&s7f&J7 z&itf<`Dw;b4#?SOJ4M4p=+h47KOn-+{4_HY{+%;u|3mE~QOJIT2p5p;<@jtowSge9 z*F

5kj5J3~5G)&lYkAVc032O$ceWVfH#O1BS;+jdFy{q7XDaGxh5XjH=b2Izk?H zgsgUiyyggb-w08;IAKJrhNF!TO5J)s>KQ=Iy}0)_-_c*`hu2_BDZ<#Lp0!Dd)Kt$6 zODV#LuqGq*fDF-XA=bMvtC?A~AN!uw{ZeYRqy4O5DIdO3dF)m@TIO1WoA*KN%pXYR zwGQS^ma;Ohbuh1Ej2zmv*CyR?sLDCk$~ml#w$8!)oP&9tgLyq;)JPOMal%I?bE9Nl z?_l2GU|#QF-pH84@J%K5`>FR`ZZbbDnKwF^H#wL$I+!;z<^;)XU;Vu!nKwI_G5w0M z0Gl1m&-cJQcqAg>o_8?+5utY5^1Orj1;)gmXD*V=FF2TAbTGf*VBX4@zW640)SL}i ziKw3P`I#bgtAqJZh_LIt)xrD{V^rI)&r;@`C754wFu&|ze#yc73S*`S3hkWVFF;0> z&RL^H@GB1HR~^i+IGA5!Ou1zK<8NE%n#|F&Meu75=07`_Uvn^bF(w1w9(*qQ)uv{X z`LlBn1lQ$Y?nbD+oVy&%uQR3}5y08+e?5~cLSJ_*ydo~&Y1Y+oRue-w>y~s;$YtH zVE$_l% zP0YK-{u(nA)l)tVAqeho%uK$beEKFA0LnUNdmmx;wEpHuYX@USdc+yx`wn06Lo=;9 z$-IM^F+Uuhjow7RC_qxeM*JEWdOsIoQZ>em!W$A1Z({n5)wEU)Aq_44F9(J|FaX=|ZyxD+>_>x5vT!cZAxR_c)j_EdYj=OvIe> z{&6>$%zKIu1ox4Hc`rik%pWZ(VE&RZw0iR5)9=LpgZWW9FPF?; zGBcvJmt~0NNb4)a+SB^dk=8#M6Th{5ESdl5VE)>{{7(n-H;lpbm)(hV=b;i*F6PMz z#WxP-{VYX&*dqkBZyd}NWuC4%Yw}nWs$xEEsuc4C5N5Tjw8XWShQ=qMto=QOF|@#@ z)WgRve9&a>TPm1S9L!`%?aV0-W-nuOL80BW?$6sz=4T|c*TGCL;IcD&9n5KrIR(t{ zXsP<|(M?rpgyr-q&B07BptduoIhfNKGlE$0`Oy;#XPV60D-Z;i?g>yiTb{D%$5I)H zBPrp?zLWb3QrxD2QBvZBWPg_O1EX{|eg0`I%#VaqomNMxMSw;>LzL<{4p;DKdqy8O z!;~5(r3hnBD}$v}8?&F`oG7ITW0#_zB}w)4Lpn|k=SV5S*rg6(sVpgFKf`&clp>7a zyhDa)T0n+8X$h(K(3=Cz)In-%;R84=l`o1-chsqmF^5njoc&Zxw@l0Dq13H?ho0=Q zw-%p+`7j&vkay-=Mu(FtIXUex2lGG&^I;BVKV!y&g4)g%@A<%{N})(H`yI^m>r!@| z{SM|M7(=sqYN0<0WMczTG1p1vBOJ^}I+%}eFlRF6HL#M-mw)ij-6r!hk~!1COfQ79 z>zwIeKAJHD!AkDaC%5%6nFm&h(4#$pm>N9B!F;rXIg2qzfC3(E`@s8Pj8$oLN#-mE zGrfV%u5*@y`8dX$B$=DC-Z;!;z8rm)+;N^*o$1+4JM(c4=75cP^lcp$i@ixQ2OP{N zIG6(t=0S`JLo=$u#?P0nF?Bxnd<4M_^03a9A6`F^rI0KR)A?d&hjP-m%keP=fj_PFhUq1hZ$vpD{A;lQP;$<5MAtyqtefcEjv04ei zV;u)iX3SBLr?l)R4Nk#KmE6f5&b!6(pTbh{E&nn|Q8^OEZXpM=lpk@bt(m^tWm<$G zi)31U`mME8&+(9gM@vclM~*4=TPZ~tds?Tll*;=%eQ&hPjcEo>jxctqAuM$;;>;0E z>AFiw5ymbxl%8)jKbOoS z1hb_b(puN;Nt3T2MeUF<_WGjLwA*tfhhGE{IKoi*nC5>>MWLu-wx+WDZ<#LMzd5Fv?smn?eHooMHr#=&t!<%4%b*h>OJ&U zK$Sl#5&I0}Y)(t%i(*GO>hv7O#BYaxk!hXd2~aL9?J(EDe2#;83}fQA!>=Xt7zgvY z4(2fq=JObHHu3|H_QXk{t!614I}1T@=Xqjv&T}xI=U@&oW)Hp(0!QDC`YMxoo@5RQ zX3Hp(&r)iXc~Sr5iV!n{LQ9)X-#F>+3BX=qZ)e1)(U==Ug3_{|!5hmwR9|MDD&Oy_ zi3Mj=fl)0=gp6Y;ve@MAz3J;lQ~o6>MHs=o&k00NN<*drZLGy$ZVUP>U?o$yDydVX6k+UA z<9m==D5VHvZ@tAVW$hOtr`9od0%ItXWS@R`&LnL1D1Ck@nJ0Jx#B6B^6In{N1e$M5 zFj~S3QfeZksASN3=ZjJmA=c8E#5~rzFnNYaDaJ6*OoWgVA=Z96*^yJhW6fy^W8zzN zT{4$=IHwj1FvY=K;^<9N8AC6&qJ4*Ht?wOfDMQITRWMu1u#}}#8B%YWYLwxMdJw^t zdSq|P$-zDbr9f%fdsCUAp{h4C^`-?(qY(x*Xc?`_S&G^rxhwZAzR{GrPD&9*aBe_I zI&eZCYYkQ~kF^HPTs*W;NHK=fxv7EwXd=YQGmUxT_ol^*gcM=y{i2ek;`gTSODV$G z`$d(J7Ch{P&eqm4oiXuS%WIN(x+f6BJj1~}-O*akXUra?%QJ!x%RW`5jGa5le7=ME z0tfT?4(1CPvklC&t{iyL)hKP%CT?v)5Zr~HSe<7&m@jlNU&NRI^|dYlX+1y zg5WOl#4^uvFkj?g4l{-t9NCJDoeyQ2%)gV&VF&YU2XolLT+JACMbtL>9Wm-awf38ejV;;iZ zVGFU^mif#~^5ho(_Pq|pqG`X8QiM?!N$kbdvsC;QS*MgD4E1GmCcJ>9&}g_W?t66m zZ_Kp*ETsrzPirAdk+p#*=6UK5r4(W8QVlE>e=lyolp>5>Y7t8*8)e^%JG2$a!x6?V z)o7ElKTkbWN)ZN9meOcqDRfTG*P8P?Clf-r2~vtM_OzN=N|lEFdFpB@MHsu(#VplF zrX|u)X|+iy!icb_3^Ci!&n+SK9(uo(k``Q6Yuv(V)gpr0>hh-BPBYO@NuCx@fHbs> zu&pe0n3SSfN{i7iwo0j1NQw6UxkVqL$srLjehG|qw2CnEP%smcc129)Go%z_5UXir z2q7mztn-#O=20b27?URgsnsYI*>fph1b|!2QpdqZsZTle;h&hLafbvg_Hb!fW-?10 zX)QKN<8esMMpatUl6PH~vQz-+P=EFwKOuxa(tQjmniVYds4^VeCZf!c?<0iv_C$!a z3@>5kk%*)6-@okr6ND^%zX>TS6~=JzDU11!3>h}3)u^pYnTND9ooY#~Qi?EW8y2a{ zdXU;Ir3jOv?ZH)EUU*z6oLw3kUtCl=W$MJSp*hvHd1qEPG&I#zN9vmz^Md*LAuSw6 zaF|2GC3UT>)${7KyqczlhU!RNC@&bE+*C8Cy0tD;EPn84MDbWeM=oi0ja<~!SQn{o zxx`Jlv29UZOMQ)7bfkWfJGIcS)lC+;aEoe$R&H?-dT(I3wf<5F&81`#A)A})T570R6JuNFH!a~B zNDkWERNoj$lD4@inQS%G%}s`|rGDQ0WN=WguBEY>Ybrr8)z)z{Nq}mqNhaC(bxV^e zm74mx#z_5K(LNI-Jhy&nU2PJiNP2EVQ*|<0&S`3DsBUPUU!4SPxFS+p-;@Nfx^_WZ zYh-SHT|+Y3Qd>(F%h^g6Jg=##c20fVQb0jR$li#4RM#{&Dcs!Z`i7){uy9G?!o}4s zwZs~)Q0+R_H^#$EZLVuv)Ksf7f?sS&0woP?Y-5Yzs%~yhf-BO}))=?X#IS{@G}W}= zU6*kUkQ3Wd*W6HDlMHxHeWSGf3Gy?iZeG0nRMgcitgUa6Eup5ZB{8V3F>bTAGv#F) z!<;bfW%-4n(y;}h3uvG`D<*Q(*bsuV>z3BkHPcXOisX+iQ$pn<<4T3gv++9Gn5fWb zPKL(KaDC(4rcg*E5iZY(K{Bv>MBLEf`Jue*{7_*&4dr6Y7MckmGdf0b5lw2vLURM#ppn_{b5TkGdhU#^*7-4c$pRM$sZLvr-5$e)p)Uyv{AyMceF z%MCa|Hl^^mrshk+G^)nsE6p#!e*#m9g%{N=sv)?R7cOa9j44R+a*G&GjWj$#zDOSv zxz@UHb=y+2wNgoiE9xTQnx@7`b$w%9OQ;9f6!{ukIDzY@u9mtOHLljCww9W@Qq)w{ghf~+G2D>hmOC~9jw(qC4;Myk+`lZrx}XPO zIfhrXle)!l)UMHZr`Oj;=A#H@S75~0!eUYmvBh3D$@)#f2w4jR&pp{JI7#Ditj%hwBIdOCD)`=$3-^RLvx9!gE z#nTqvX_qrJY)xSvVB8H@QXiSmd-$QsIrX@uhJ8-l$*OKJrlMimW8$e^!fle`Qd-nt z#iCX&Rc1QIT?b=h8{2W*h)b%M_8xOFsW;jRm^Wi5qD0)1?k)Qez0fjSN;~e|g@oNm zE@}V z!4YxZ#hQ@iB+Ce1>(R-nSZ&4@;#i3FfQ<=_qnkWrWlf%@G$1a;G3y3fKABnUd}I11 z4j&fKX%{+9Q6(a{T8C$gVcB3YkM7_;8uDu=0Zatgi_L~4rOI*S6h|#AB~mgLr_l1N zM8ve}mU(p%aS{!;O%^qW!}A&n>RY)YM&f*m3@XII)ok;!s;&hO%#4_eLzxC-THVrd zO-(Je_Rz6)^RU<($)%$Ztsz_9xaj$yPYD#^nw7_XM755sN8&aKnn9ZBwp2H^(jy>q zaS|87I4j%`%Bic#Ca13Xg03y6i)@s9z72&c&Lugcc*CNC56^{ZpSQqvctf7T6l;qK zm=ngt%Hu1v>5&|V^_&p)GYk3YhXXlvhiNxAKFezG0O-&nxxf+}nWJMpJk>nVb3uaS z01y8VNqABnKkd_7wjPq0;`X|ElRA#l)bzhC`W{bf3UgvJC5iWKY^TJ;FlOoVd_wF$ z|K6*zFX728P5iV?ueoasemJ1}Y=FFY1E zZ6b+Jy^32i5adyf&gyVs(p-nA;!Y-d?^+t!>V-oy&(~_@Muzo4h+bV0z11Y=75;Q$s*G&KlM;SN^UA|9we05+Hxs0Sk|HWk7%unZ2V)g^f4 zBWZXrkZdbI?04Ymb6R2AWUHAU{5DC0!?9BT4rplupl<&B>c-lJx|VNMV-Sb&q)-tZ zFfA7RIh@#BJl0HSO~38bA}yE9!NZ0N`4te~HaQo4>m`f6Ro>v4s#3poX4;x+Yg~ez zq3@tL^74v$y}26OCeAtcriD{4oGw9SI@OZ=y~w=mUOb}H!!5n*rZJA_8jpAP>d6!~ z$!W>OkI#k+<@BMK?B?|1JrS5s+zp9TH`dgR=#5V%O%O|Lykeqv-4w;mu>AZ9J>LuE zZIs~$G$mJC58?56-ur;3$C%uUC#k|S@Cpw1$#`CNubf`=ZtE{!z0*5x{GeUJ;2W(3 zhMyO4CDjY@P97X{=sjnZv6CN@ld6~r5bXnEg<8{4SKXWPCC@R23opjP8}HcYO%rXL zGU>e!+ltedaud1dmy+-ZVUFPc8^Hgy=eG~!E{7Pv#Sq=lG!Jhcs%vS%hBtAE zn+M^u9C7MpVrGFH#2>BeE^fmUOucMy;H>=r zXmG%ZtOM&2bY4xqLG0V^3T!;H9etkGEPP1r-&35AqN&YO+N*A;iv;m7z;}^O5a;dU zzM2xVS=+w+cawa~cKmmih;1YKJ4%IWh+pey9Y?>7ra-S0buycyup?0w#lx^8))jU4moT5@VMe~8j^rJ8*j%AH_esCT-_Z!;9f{Y?_^fxJJLOh ziryKkiryI`i{355EP5BjcxSk^XmLE%Q9joA;c=r?(Z`K6UetQv23o#kk>1*fQ_H<< zoo3quzzZXL-~M|NCs;AiIR>QvRTn)Zz|TVbzxYx>|sQsmu4(|1mJMXBzr0%{r zs_nlspO$%xbJbzYTS{=Fvvgu{{`d(Y`5wuZN=o_z#EQed`rcYhXYzk{UXW8ggAa0gU)k` zr}Nb_^_Eu~kP)JTGT2wOgo+K-Z2OB6)J+ugB@TEkQVH&>h_@;za&g7KP6CNSINq!h z?--annqMnG>6MRkBq)9p#1gFbXDvZ;W7ZL3?#T8KWy_FYqK#o&uu9VwC{uNYjkly` z-M|eOx4<1V7X8t9 z=+~JIsi6)a7N5nEI0H1eeIkJvVWf| zwz3W&n~qvN5UxD@Y*$_oKkgcC#;+dIn>_HgV07t4_(fFXm7{JyktI&Bi0=_qxNXWW zh{4E;8I7cE#$8qL#>4bKV|dP}5dqT;A2E9PsO&SdM_2<9Jv=*m)TmK`!05AcMvJJ~ z{U>`K^W6D|n#rHur)eL^U*sKDOK(eET&I4V_a%649jC73-~K-QjCI|dwt2w{6>}>* za|_g!_#4uEW34|lPN4(v`7##g%MMw87MpOSPQOA;I~X5w_-$V;q-C#;yvy#N+CW*^S5;rbM-1sDMlaj-IXNno+NRx;izVsHUp>1;Vp7b%<%o|l08tHkoS>cco4hi`Y1e4hZ9DpTl*?_fgRg!$0 zfa^}ccLMm{0meIC)Gf6GxB5KAMEmH+ce^8FFGw-WI61K;~e@_j_OVtn98 z54Za0FEI?nms|ZF4%|rz_%a}WMv{EFz)ecPcNq98ljNHR+>!)*>EOFMNxmp>KTg1R z6!`7|=4pvb!8Mm(%({olWh*dmN*uLYbA1$S!6iFCzP|+KkO|_N_!w7P9jO*U{GEmG zLBO0RaiV_Jy3FLGai$oU8FrjpmzlVJz|8?>p~M;Kaz0EPrF#`HcO-#(6qqfsxH$QE z8!mh0=^*lt_J2liKBMl*55jTc{u?e<@YU#ftQ^d-(P|IH~}A(>pzp^`x>}|Cy6vg zeZ()nBPB*4-SayLxDg5XZpzfOF~B@uBiJs+pMd6^U)=_4NWr{gn4XV&+#Q zzj}eD4PPj5ln=N5n+wc%iR-EV)&X;g#2Ni4rrjTnbUJ|fg~W;Si{F2L1dE^fQu z0?gI~IO@Nz1M`{0nfmcQlC6LAZ_u=(@gXPlbJp*1hzkNUR^oc5fz?wJI9qrkTjm~SjN zH~rEVX<8;e&oB_Vefq6*cdaB=Nfq5|j-yz`ZmKb>1 zx#{;laGxjOqkiaVltl868=n_Azr?zg-|^r$E=j&~fh$SCNBT`qlJ5fG79`*!dml-X z?-Jmm3HY+XcMC9`64z7x{u!9}6Y!l1zP-R4-2@LDm9txY1c4c8!NqHT{UCpy#1J1j zH@@+}O;5mg2;{4ixOjZ$g6}qo zftQ^d-%G&#H34557#6_V z0L+~U_-MWLfW#!y?@8b`C*bQ3l2?-C+Xmd81bjz=Z(ovp1F)((UaqX%>VxJ(ry8p- zkz=>|CIC*V5z0_m2d8G#}cZB;S#(nsy34 zUX%rFc4pE^-&Dmj0AjSpXVgWHxIZa3HUAo-_^iulQ`mM{g%=MKe!Z^?0oq4 zVPiNTH;1WT@;o*Mmx1t+z=RUusGUv&ra1}Ra$xR`#l=~#J`T(}iF2!u3z6;%z?|9! z51f(TID8iZvryvP_@;rQ4VX?kMw&781E9nM)l^V z-yy&pXTinOZw%xION?N2=c@%Sl7Nre+m%W3wF7rc0zN9gpC-w7FK~}1!S_s(e9r;* zY7%^JC&~9W;66*hcLr60VU_5@y*|zWE>B|J`Y(k~NRn?Na2F)t%LiX=l6?08_uB+~ zG{1T_Nxn|tUQWQ54ZgR4IrtKI;CiwzCjc{C;@rxQ)szQe%R49qnaoLhdc2j(XhT)grl z{qC2TMEQLfxTh2Fk$&re>9XM5^!qC?A6szo^cx7ie*!b$GNB#Sn;YLzz?^Eq#p5IW za)2qc;N1A80u#32;_;mTzItG;v*6tLZUyFE3(k%25nx`l;N1ASf!S%n#p9##?GuTC zmz^8mm%#PETwvV#$8bdZB}O3K>!T33$^?A09~MrMZw_!R3HZi=@A4%1o(1m31bkue zbptc{3X$8M+TU1U$}PBf^^p#mnGz!y-OH~QxJUv%%I}p)@~r{xPqBP)_S@fx;p25m z%sx8V@wb87Y2kBgSDyfrdZoy%Tf3Tw=!1coE^$4Ls|$g-ECJt{;9CLAlNOwte(QjF z#e$1hZ|&gQ22Ax;A|E~J*9OcAiF3>ENuaqAn8z(RH~pRg<^>Bbo_>_yE?^E`CiLs6 zogN9yDHdEjzVVnXq21M?G!bIb2YMBER|>sM>+s2^~Csa=`NWR2R@Y1d#4 zj1M^@-I#Uq^@uA5<`s#fag5t(D+5WC9nIH#RC!jHlC8y_tD<>R2)IIt?Wz2x0u#32 z;+0=M`06D_CGA$f4+8gO0zT4bU6Opy0rzSGzSF?>HZc8`3+;N!??7NqwBX|9m+JF$ zi4lzMcI`~y3KQ@R0m)QgF16s?%5OO^w_0%V^g9`RcLKA{f^*}00hnzTTs%I~ZwD{~ zSBTv9RDQ<-bGilR#&;Glb1XPF{ThI|+=6rCyB3&VS#WNAPXV*Vf{Vv@60-R!Fkf15 zZhYQrF-O3M9F95Am-oEO(_d@0}4w8QWr=f+3%kp;|n3(k$N447&QE}nkW zKNbRWn+4~_cNZ{^T5$3BNblcE47}{z_?`rAa{@lf?<>IUx8U6P`mNNoqwpcuQ~8|; z%oGdGjc*1p^DVe|`6c~YfcdEf=f?L7V18%8#p4?RzBRynB5|p>X1Y=WlX4x1;oRz%@6$<)K+5uq!*?`rrzOERGD*I%z?CQ98xN&s z0&|bV^<)pW0P{vHUrak7`S&D7Yp45x89);cIJa^>8*xVg zQ*Obz@y!IL!Gep|?q37nVqhkBP^#jbiyL1AnB@}ZrXTf(8zhDa@#V&MGjKmkz&8}~ z4*~OM3(k%2FTm`z;Ns<%?8aBXoP2}Oj`HEgmkmtFf{VvTLoq}`Y}zdm3B7F;|&s*lrvsj}eQ^qUP#vjrEAFATm* zf$5ewqhH3%+i73La}(x6_>eQ~bIiP*^cxP$MG|M&zc_a2VqmV8IJfqE6!>&t?zQl7 zeq-!G25_r@StoHljSGJT<}(Xlym8@p@b$kL`%UC2?-$N8{>RU_O;Nqu%1w$6?>cSu%Xcx$%)59|}yX#2M`+ z4&NQXJd}Ws?CEcT*<-=EwdZ}nq~Ai?x$8&kbE>1hR0GI_5=hm+3kX8hkZizG6Rh)A6 z`~Y?cA98Nx%ytNvizLp-M;!ew2IgvsbJLIQ5HR;z_}tpnDquDy;F|>9UjpXXA96O# ze8kZ&7nn&B=cXU=RRVLj#P!tf9|vY#0=@@9@B%PPZx{Lvz#q$f8ze={%-NSsITtrqVgF!{*-{Ti6HcAR6J zruuvym{%pvO}{MQb^_Dq=kUN8xH$dyC}2*NI1jM#=3%oDo&(G+5@*y$9KNT3*^+>d zn$xSmwB7>`oKbIa_-+Q~XA)=A&$4ez(}#zE8FMewX@}qsKZg<1&sQUSBQPuP6F9OD zcz=W}XAwr|qb1^HIrHWG*5{k0=@6`|+2l4;P;s`u2%1yk}% z3M&Q$sD$_8LmNmFG|!>)b^R zr_XDtZk}IX(>k-f4!`5oS{J}?CPwOOW>(CvZmt{FG-rW!jyC2{Pl~4X+~fH4)d2H$lzOg94=vx+_QjC34CQu(XqD~X zE2vMO9LxY`dX*jtrk9qLSM5NQ*1pcCubMv(gZpwgL*Ic(o zGSW1JoYL?^`1@)(tIzffxJ|H83%9zDanV<+>Ohky)%S9hZJ^19hFSwD<>M=S{Njy5 z@Np#mn(iBT(@>Y#DMPwx8YOWI`%H}KqwIJ%mO5V_8*Uihg9e)sW}6}2!^DCqHk4|m z#FTD}Vemm5MCu%3M8d;vKOA{Nd?mhwGMTurD?_pI@P{%h;r#|bVM+PAr8RXhgiVdE z$}3Gs`6F%e7IkU$LC(YZ!&6f5_tiGA>`scHBKQ)YGz6nNAwu*C)!Y%tE`S)+uD(~) zDOc}jsA^B7pX#1oQPF*X7mPH73r3o3onmkYnUR!AWkoWXn`{X;Qz9UzYG)`%a}>iZ zQNx8~&pmY%gRX-OT6y(G2%|AR|NQgfdXsU@_V&l?%?LOZtDfOG52LF(oSK)irLk~W9+UFmv`7%XcyJpAn9R(@-J5kj74Gg)#gzN-l zx_&v#BjLuUuFc)o(ueCpzm`zY&exG~m3~fi%tpQ38=bb%8(x1cnJR78+H}gc;o5hn zBg;NWWOR6g-C03g`Af^YX9hEvuzg+n+6;@tzpBp1fV+`9LOKhuI)$`e$c zp&gThBfF;sv+)T*qJSIC0!{ow9i0Za58uV2Cr~qI z4WFeBk5;~6z_q`Gw|hrN(~(_~pbv@qtOORZ&1-fZpSn5siJkc28|2=BUYIdh zh;^!d)Ng5YSVI2wP)unxEwgPz76%|^(w1D=?6s!b1MA;@G@ zqM+LZB0o6%DnmUG9cs-`JfchxWhOy%SR$e<5M?DnG%yiS07L;r1Z&j(TxRaR0oTm= zX8-=Ty2ze%Umo-g_#GX*70(^jGxFv((D+VdC;Z!Sn`!tMJ#ZRd70^xyA-AvQFo9m@Q(x$T&|NP{^; zIR|zf-_f)m{a~j8a1ZF120+GE>hwMH8pDd<&A6%~YqOLPy~Qk|4p@=gFGM6~x9t?s zvrGtD#y-yyS&-aw+Sg?68X{mFO&)=iJvXk#7<~g6eYx1gbCqmr|ulhOg3861g<9|`VgMMhU`a7@>v4Cqx0 z!-4oU+qy}eK9`Q_9+%#|9q7SOe{lD>jHtXG3aX*eNg2ERZ*{-*`mX+Ob>VN=~XCwDr|rU=vwU zIeq?LuyoshI0^%?8|lx0<#W(P7o>?m{Z1OsbMK@X$zoZP&peEaU1=S>Gpj#BQD;9w zFa@}l04w%Kyt(@#LMHdE0n7ivfdf{&j=!9I&g$G5KGjZzMx`B-d}SRNc*+?u;E96Z ziDWVckqx27FyM(-$i{Z_h=ukXd~?%)Csub;-K0|l8BjEmnL#gKAp}=h!LrvUqb9O~ zB2z2&w}l-VAaIH!5LHbRCeU@KTEz!DknNqBJ3oQ})cfu{8Iyj!@2-3C`7J(gxKylY z_w8R8J>(glI=#@oA(Pol+c)@76#nUESsYJgahxoRtZ$_(l2y(!C)HWe7!!wPwjtB( z?%m_Py6Ew;`0_K2@>9)?CgEsq{ZN++`pD*HNhT%%iw#|Y2HFuma#w1{gr00EPX}b1 z<@Tw+kh)72?Q?!A+RFd$iWV~!Wf;xbzRqgKWIT0k>Mmox-(46}uHJ);a>cYHIFP!` zVdw>!FbwDdgV9(9i{2u-&+~6?>PDB@iZ-3W@#q-bVW|5IhM>6e+B%F&BawrVF=&Xj zh@}csJCS^rB|pY2P3AqmM5aX|HVq5AqqGD&O3Nr)ltcH}4CFkk>jqla8EvvFP>edz6?>Q+PX zn95QWZP>b@l$V#2RnJP=t?D$Zl4Gx8% zxS}@LV@5>VFpZ8izb=gfQ&o$_wPu_LI!D7pWxMdl7L=@X7(v6LW9Zj;A|;v_Mv|^V z(d@EKbG z1=`nnb2}s6=;&Q3Ijf_6qv4Eb*cT1^)jIJ9)U#CDS&w;;cEFbQ(Denu+LV>oZUk=S zwPf~J-bphNW;cjqd`q ze`97VC#jcZbnl=&B$}e`O5v5&Y;28B?&56eFTAH|3)n#%71g-8eKQ#z#p7@U4An`fAu znR=mykeQGHCo@h4BQ(?xB1Y69Isj=6lEK7=xY01I!E*gYr6+NgS~)9;a~dQRXA-4B zP0W(_`T7gpcT%I5ysFuap=NiH+3rT8-IbxV11O*@x~q{MnZlxli9e=$g-Hwj!6b=hK}{wLJ&x^yyKSnAWRWe>(El}$uUgmj8Jo$Vk#6&G_X^n%_1gl4m5WOpz?_+ z8w~(DWh>U}6e;?{e>QtxWp(WU+eqyBR~n+~Jz$G&kfiX##XiFS&*rVAv=9lPUE zHf`8lw1(@Yo_nzp1s z^DHzX?xd)h!CW&#Q7Zw|%E)s4k48&rU!T(cP3ijY@ro4s_%2_8q-Vl%+(kW0b*a(% zhOo6uja22T^6xBPKlLvzUz9uwID?84xy|ANmh(PqcgnIBYx{2Mtw9t4O+9ok?T-(} z3Y$p4o6hYw19|gvZpq-$J;#yQpG6XA$r+_`ut3A)T*#I?t9@NytxtOcS}cY^^=ov0 zV+mF=er+LqBJ3%{cMxJk*d)Vuhv7Rp75D0Km8Mn0w+BAI7BPJPfKSL4d6n-*!`Ef_ zPQc1b;Bs+OPWWCod|w&95!gErvC9qLFAZO2KTZ3PH8>f*RY*Hc%Z2ZE?3)6gkZm%2 z*BHJZ8oqlB--GZy0a?HHd-#6KzApG4XFgwlJj2Akqu>+FCmFtBhVLB1Hx<6eSYn0| zR%`g~H+)aPC(?ZmK9TOb@QHM@aA!=UI}SdPZmZ$D5k8T|ZSXzHsXYjvD1(#?C2=Tx zB8>oiB8@!wL>f!r6KVVuK9R;2!}mUXB8@am0E9$7d_rO#d_v;KhHs1E`@-;L;~;}z zSq7hwxCuU?)m`ujt$qieV15ohk=pS%)F&jS8oq__3BK##6Sy5lY$k5e3W;LFx76_6 z2cM9A2tHA2o$x(}7Mi9Vf|CNGWuFY+I)wSPk?`Hlv3c+v!L9D62JUIYw+FtbSfUJf zw1uw~zO5|#Dts@p?*sUr5jY&66}bBh-xr3j1b0V8Y#n@}wZ8!07M6VnzSo%VVCt(Na+tcuE5w@}%??(DF*NL}&4!Q0ioRMid`sE4 z48BX)cN2VsPwi+K+Oc%#?|mTrZz*jZUTowD{VUa2zh>7B*{_L zPv%%kX{rrJr!{Q9WJdy;{h$d1*bz^;Oj6O90ty>QMWLUWE@8XaOy}#6?5TU0H2}L^ZlI^OVUv=gFF@#Yq*`xos+-b_p*J2797%ARQWNaHi;i=8<8LYSfh?kw%u$Sr%E!_Htvx*5tfHb0`o}exb`@L!gA`d^kWyhH;ncOxV$F#u*7br` zQ0|Wm)i2IO^KJiznzC1E?UbF#nm}0U^k;Bp30*iA!-9DhWS(4chPUP!d#z1A-_yHU3{C8(|;oy%Hz|4=G zYECY)wh=5*Tu+QhHCUREjAz)>Y~gL#o@uc$BPE5GUQF zg2%`tR8sp`sCx&kp}QhD$wqneVAnH~j>owOeJxVrVqifJ3Ku!TB3??Ufku@BH6`>@ zTBr-%wzC9o$Ga3_Dq!za$l7QuHol1|fT#ww0g z&VcVogfS!hrlU3!KvAXfgym?K!Xp51OWsBfN+CNVgG5;mt#> zCm8sPAWik3f+`_*C}OyBWMLjbh1o$d@r%;iy8T}(O01h?QPTWH6lDQ?qA1JY6Gd4C zpIMX_;>xP#$uVjU$k|lJRTW#+p4RvOHT|$Imimo`Pv}QxQ0PaCEur63_)Pt#;mWGt zP@x}sMU~r$YpR3T6W6h4f~j8nYGpVOn|gjHlHf{0t;31$vs5~X57j>lA<-^RU;>&p zh?Dtr-YIS>DKeG(Q04Cj&|PAUQy5-tprSny!~+-~<}x;?Yu^52ZB}6RG(o z<>!n-?4S-DWtW@lQ>P8BH5rwu*|gC z1XbG48-V0(f}DyD7e$2uS-3wjm24}iGEk-Snn;IkiPOz+vJ0CdBdU<-pd{?-noKgS zo7=Vu%P>xotETY=ljB4LxcwEl|AbYJmz0#}*=|v|ouWgcCZ7ycK%p ziv5cZo?fxQr+ThW6j}Q^?}gDT{TqrhY5uXk;5;nD=&_KKa3u!rVepv-iRK~XQnZ7) zB);Husglw;UB7x72uD2opB>Iv(kD0UQ)fT>M$^L4S@cZMg-Bu$Xw3EbnM}*XTm#=& zi1oeG&z|L%3oyNi?ppeXbmneoP0{xuUzPfl%*u{NZ~GU%mVUTFjhnsxUEXLz&`%+K z5Q2s0t3x*M4ffQ|)D5LWwv?s5EasJ<8?phXYN)KDMgEpleUY}_J6OAjkBLA{Di<$Q z@@uo;Gy7({p>R5znN(n~_p!h$A9O>>qC51DW=GS6X~Ov!>7#}&X7$8DMNQ7bkBDKv znTfuGB0WTCs1Kj6U*cWyS=({kX>vB97x~anI>v0sy~MX<;EK;8>3Z6(H2siW@8KBk zQnm7>&K6zj4M(%7fzWzD)E?EGS&!o>D{v`t^*fLgt<-nB+>Fl93)3sA^pB>uzc4`m zB3k!R^orf>-+Z&!tADg>kRImaeh+^BH+{>WcK+#u+&{G*vWkY1A!~BGmZWx!JgQ@g zXMt9>q41xSrkseUM+?(;4F)f<748VZ)~_%8X9~w63cY_7p*!^}cI$0B^ouf9ys1l260y zy_wo9dB*5M{k@A&V0znb?vELImDgC(EYM`n+fc-YXo0pKw`Ez==c$z(kJ3xi=D{b1 zrxk|pCisrw*r(tVUG}KY7(U zQ2kXSf%-eB&n-u(NgTSa!x4_c>4OAW2mCRdHH_L;7VAfw5=XPI7`{{3NBb*5_C?^M zyWMHpO88D6=y6Y;6XX9+&n;&TT+bpMd<^wB*zx{qcQ2u6aa0+Nf$P0N4W|wC zj3AjXKEvQIrwELF+*aDxWpxgM)OI5er{Rhi#gp*3xg_!sXFyZwhGcr;L2H#}4+)+K zdK#!ip$(AeV>>}RO*9yB2j6XNL0!u=)K6CNaSqdsYLFUutB`yjkZ8^mY!DJGu^+|7pZHDuA%y(>KcvA)=B!R&W8|otsF&%l;|m3pX~SvI-%L?RVPf9#7k{- zSr)o1N+XMmNT$_@oCqyw`fcyi%7|QHqx-i_grd8K=}<@FRB`*2L0?OTUSv#B*-!*& z{uM0>tSs{BFU(?VP4@XZ$fmKHq7l$6^#qirP#hPA>tG~V)jQai4&VLkGawcZ4Lvt; ztPj3hY&g2B+t4(xz9wAP($du8`V>COj~#LSz{bGAKjt7(D7jY%2zAJ)nd*#SCi)UK z@_XP+=9b~lBn~BwTZ=y2TJ&`i3-vXtqXOa^dC63b{sJn8jX?Yx%<<}r4r_?|ItM

+uZicFc&;Sukh|V9Z!D!9cGQJ)&SgM46ny2 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⁡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

qB5kk4QlnzNG)4m|729Sm8Wjl}-E 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�@3{h^liPoA1%v^rx8W>YyX0= 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ƒ`)s|Q>m$^rO$a&b)u5h64fl3l<+_R9a<=V86_uuhp#`?BClc@6rKL& zoK`%Yk%c1xv3Y&}r=9lg{|FpOC;iAg=|B5gV>YzKESLH2q0M-ZWi6qgt2)sA8YR}; zgdMkKhc?$jB@t4lu6!A&MQH~1VqO8B6|wkL)}nu^&y9NN>3=%ji18(>=^xCu-pyOnsjhvW@I+Sg`QS(azSB>l? zeJ)Xp1P(tV{z{s}!0fCwbA$PzB=ZWc8MD%83!9qIL4;_~*U$%{9BW?BKW3#-XGA^k zxxFD)^O&k$%}UF`OgtF+aK6n-gJfJ@PyjE(s8GzGQ}^f6E!82cdA3~04nA}~vtOoR z8vH0SRM<59%H-sx0W3kEcx&!m5sS`8|4V$m>TV;MW%Y|sGe1hjQdazH z_33X^A3w`T-8;)=hq>eum$BG2bVY3cOZ;09s)Y**T9kp{$#9TE8m^}=6(Qsc*_WtQ zQHsMHo*1=y`G&>u>FejTNnH=~LnYtP1^`5mGY2NX#``Su7r*Qsc%FlK5yO`OIAQ~M zEqz^)yaZpP;Y;7>b3xCO_0gEHjyfhd2IP8>*f1uKRugog zV$h(W5GB?T5aE#3u0$(D4WxRS$+;RL0YaPy7`oTllnY-!+AHvd-x|ug5mXzaU{jcE7=D7%TrS>tPhty_e1Y?Ax zjt9dN#K5s4yNfm1fwfu3%+?`XGB$+Ij_%thC|vs_Qx6(a7i92@O68 zs2~*2?9f7ZM8yg%Nz_3|FTu~$9aM|C7U=ZX!&k=wX*YKv@T44_y>%lG<>qsO`h-S< z)6dbM#85O=5=cliazdlQX;=IFk!wiyz5xlO8A~7(qQ5WVr{QnOUp$UzJPR^_l87`Z zZA#sNOit2ipuEe?`;(Cd)(eOX%p+wX(x;0LFE~s{#KU^{l9upyPHz4<#N=)GalXEm z0IFt9c3)p|Cb!*b!L~bSfKhW{K+_EHOyw65vV(&Zq-8qIB22btrKj?&bTt~B7=xNZ z)x7rrrJDD#pw#>?4V={c?{%P_byH)#15_DCO&)`0qSSTKZBeNebpa?kKG|bbg1U(% zt`1U9f}&fqJjSY^-zP!8-9aj~1v(grA1=xRr6l4pL!>$hLqI*s9fv^B?|D!v275p~ z#ZNn-WmXc!LF)P-^*kso0ZL0?Za_(7gSv=wC=XOQQzf8OxOah45}QFOiFo9RqD}#& zIx!=Hl=Tjv)qSzLHKZ5nT?|A*cdFt*oz1!A2~sq?oWrrOw+R;;gM-uL;T@RfZsWa> zF)74ZOi_rXOnE`gWeS8b6Ddi=cN={d!VElVw7b#^N;gJ#S9DKPbyt+;qS>LhJB~q9}>(3T6oOeczLk%T`3a2z4^hv(83G zx_p@D9pqlt_RSnqCjPof)o7rtu8 zZ)0(h>U$6)I{4-rD-876%gmqA5ND$a&NAOk1sFBKtE$se_nIH3epENml~dRMg#4Vk z%oFrM(_~w)>tJoHF?b19Z5Fr8z|=_D3Ik2^OSl`Akg4*{$0i62D-L2pn1TCT(X9OD?bR*ej(imfE!v$bU$icV^mOjlkvBZS= z7BJ>VZA;yac4-;#sa;w^;n1868}Y1ABYp)vB14*nL`+32$%dj`a-&f~Sm-a7!K(}* zPRbpd$MV6p$gPbn&B4v%u~0_zx`Cu_)RffXYqYkC*MsK5huKFTAcJ1JqKQ%M$0MjP zYnQ>+ZYgW>$q+v>Yu67-q&7r61WMKKO`wz=XaW6Eegi=%i!dkXw*r(km|5=_#57&& zk47w)aeQfKSLA^T)o;Kz>PYv=qAXz?s^6C|MVY#sDGFI-#3wv8O8PUF?(SKr4ux= zTs;(=_QF99ekm8l30T2l*6f*-XKph`B$@+wM;L7o`@w%aRHo8wRX5D&n-#n>c&~M5 zu$gM+CH6c-V+*KrQu_DU3i7Sq2$t@{=AJgtjY`v!e%UUw$boOHlWqq<

O9$Kw4 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 FKO>19*X#04?y=pbZif| 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

xqn$FGhe_8RKywadh|c!<3Ydfr%1 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%0As*-}NbYWEyC!am}>@gICPzemNL)mwjEF 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 z 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

xbkNFjFJoYx1@)(}i=t~$f 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�T- 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ƴy9hr(@bNH1D@JSt(H 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%0D4R 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 literal 0 HcmV?d00001 diff --git a/AntTweakBar/examples/sfml-system-s.lib b/AntTweakBar/examples/sfml-system-s.lib new file mode 100644 index 0000000000000000000000000000000000000000..e0e79b9a2254f829dcb052ba194a32376d246945 GIT binary patch literal 357904 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�rqXbq!(e_6sXFs^gZX*J_}i96lKFXq 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 literal 0 HcmV?d00001 diff --git a/AntTweakBar/include/AntTweakBar.h b/AntTweakBar/include/AntTweakBar.h new file mode 100644 index 0000000..24ff223 --- /dev/null +++ b/AntTweakBar/include/AntTweakBar.h @@ -0,0 +1,378 @@ +// ---------------------------------------------------------------------------- +// +// @file AntTweakBar.h +// +// @brief AntTweakBar is a light and intuitive graphical user interface +// that can be readily integrated into OpenGL and DirectX +// applications in order to interactively tweak parameters. +// +// @author Philippe Decaudin +// +// @doc http://anttweakbar.sourceforge.net/doc +// +// @license This file is part of the AntTweakBar library. +// AntTweakBar is a free software released under the zlib license. +// For conditions of distribution and use, see License.txt +// +// ---------------------------------------------------------------------------- + + +#if !defined TW_INCLUDED +#define TW_INCLUDED + +#include + +#define TW_VERSION 116 // Version Mmm : M=Major mm=minor (e.g., 102 is version 1.02) + + +#ifdef __cplusplus +# if defined(_MSC_VER) +# pragma warning(push) +# pragma warning(disable: 4995 4530) +# include +# pragma warning(pop) +# else +# include +# endif + extern "C" { +#endif // __cplusplus + + +// ---------------------------------------------------------------------------- +// OS specific definitions +// ---------------------------------------------------------------------------- + +#if (defined(_WIN32) || defined(_WIN64)) && !defined(TW_STATIC) +# define TW_CALL __stdcall +# define TW_CDECL_CALL __cdecl +# define TW_EXPORT_API __declspec(dllexport) +# define TW_IMPORT_API __declspec(dllimport) +#else +# define TW_CALL +# define TW_CDECL_CALL +# define TW_EXPORT_API +# define TW_IMPORT_API +#endif + +#if defined TW_EXPORTS +# define TW_API TW_EXPORT_API +#elif defined TW_STATIC +# define TW_API +# if defined(_MSC_VER) && !defined(TW_NO_LIB_PRAGMA) +# ifdef _WIN64 +# pragma comment(lib, "AntTweakBarStatic64") +# else +# pragma comment(lib, "AntTweakBarStatic") +# endif +# endif +#else +# define TW_API TW_IMPORT_API +# if defined(_MSC_VER) && !defined(TW_NO_LIB_PRAGMA) +# ifdef _WIN64 +# pragma comment(lib, "AntTweakBar64") +# else +# pragma comment(lib, "AntTweakBar") +# endif +# endif +#endif + + +// ---------------------------------------------------------------------------- +// Bar functions and definitions +// ---------------------------------------------------------------------------- + +typedef struct CTwBar TwBar; // structure CTwBar is not exposed. + +TW_API TwBar * TW_CALL TwNewBar(const char *barName); +TW_API int TW_CALL TwDeleteBar(TwBar *bar); +TW_API int TW_CALL TwDeleteAllBars(); +TW_API int TW_CALL TwSetTopBar(const TwBar *bar); +TW_API TwBar * TW_CALL TwGetTopBar(); +TW_API int TW_CALL TwSetBottomBar(const TwBar *bar); +TW_API TwBar * TW_CALL TwGetBottomBar(); +TW_API const char * TW_CALL TwGetBarName(const TwBar *bar); +TW_API int TW_CALL TwGetBarCount(); +TW_API TwBar * TW_CALL TwGetBarByIndex(int barIndex); +TW_API TwBar * TW_CALL TwGetBarByName(const char *barName); +TW_API int TW_CALL TwRefreshBar(TwBar *bar); + +// ---------------------------------------------------------------------------- +// Var functions and definitions +// ---------------------------------------------------------------------------- + +typedef enum ETwType +{ + TW_TYPE_UNDEF = 0, +#ifdef __cplusplus + TW_TYPE_BOOLCPP = 1, +#endif // __cplusplus + TW_TYPE_BOOL8 = 2, + TW_TYPE_BOOL16, + TW_TYPE_BOOL32, + TW_TYPE_CHAR, + TW_TYPE_INT8, + TW_TYPE_UINT8, + TW_TYPE_INT16, + TW_TYPE_UINT16, + TW_TYPE_INT32, + TW_TYPE_UINT32, + TW_TYPE_FLOAT, + TW_TYPE_DOUBLE, + TW_TYPE_COLOR32, // 32 bits color. Order is RGBA if API is OpenGL or Direct3D10, and inversed if API is Direct3D9 (can be modified by defining 'colorOrder=...', see doc) + TW_TYPE_COLOR3F, // 3 floats color. Order is RGB. + TW_TYPE_COLOR4F, // 4 floats color. Order is RGBA. + TW_TYPE_CDSTRING, // Null-terminated C Dynamic String (pointer to an array of char dynamically allocated with malloc/realloc/strdup) +#ifdef __cplusplus +# if defined(_MSC_VER) && (_MSC_VER == 1600) + TW_TYPE_STDSTRING = (0x2ffe0000+sizeof(std::string)), // VS2010 C++ STL string (std::string) +# else + TW_TYPE_STDSTRING = (0x2fff0000+sizeof(std::string)), // C++ STL string (std::string) +# endif +#endif // __cplusplus + TW_TYPE_QUAT4F = TW_TYPE_CDSTRING+2, // 4 floats encoding a quaternion {qx,qy,qz,qs} + TW_TYPE_QUAT4D, // 4 doubles encoding a quaternion {qx,qy,qz,qs} + TW_TYPE_DIR3F, // direction vector represented by 3 floats + TW_TYPE_DIR3D // direction vector represented by 3 doubles +} TwType; +#define TW_TYPE_CSSTRING(n) ((TwType)(0x30000000+((n)&0xfffffff))) // Null-terminated C Static String of size n (defined as char[n], with n<2^28) + +typedef void (TW_CALL * TwSetVarCallback)(const void *value, void *clientData); +typedef void (TW_CALL * TwGetVarCallback)(void *value, void *clientData); +typedef void (TW_CALL * TwButtonCallback)(void *clientData); + +TW_API int TW_CALL TwAddVarRW(TwBar *bar, const char *name, TwType type, void *var, const char *def); +TW_API int TW_CALL TwAddVarRO(TwBar *bar, const char *name, TwType type, const void *var, const char *def); +TW_API int TW_CALL TwAddVarCB(TwBar *bar, const char *name, TwType type, TwSetVarCallback setCallback, TwGetVarCallback getCallback, void *clientData, const char *def); +TW_API int TW_CALL TwAddButton(TwBar *bar, const char *name, TwButtonCallback callback, void *clientData, const char *def); +TW_API int TW_CALL TwAddSeparator(TwBar *bar, const char *name, const char *def); +TW_API int TW_CALL TwRemoveVar(TwBar *bar, const char *name); +TW_API int TW_CALL TwRemoveAllVars(TwBar *bar); + +typedef struct CTwEnumVal +{ + int Value; + const char * Label; +} TwEnumVal; +typedef struct CTwStructMember +{ + const char * Name; + TwType Type; + size_t Offset; + const char * DefString; +} TwStructMember; +typedef void (TW_CALL * TwSummaryCallback)(char *summaryString, size_t summaryMaxLength, const void *value, void *clientData); + +TW_API int TW_CALL TwDefine(const char *def); +TW_API TwType TW_CALL TwDefineEnum(const char *name, const TwEnumVal *enumValues, unsigned int nbValues); +TW_API TwType TW_CALL TwDefineEnumFromString(const char *name, const char *enumString); +TW_API TwType TW_CALL TwDefineStruct(const char *name, const TwStructMember *structMembers, unsigned int nbMembers, size_t structSize, TwSummaryCallback summaryCallback, void *summaryClientData); + +typedef void (TW_CALL * TwCopyCDStringToClient)(char **destinationClientStringPtr, const char *sourceString); +TW_API void TW_CALL TwCopyCDStringToClientFunc(TwCopyCDStringToClient copyCDStringFunc); +TW_API void TW_CALL TwCopyCDStringToLibrary(char **destinationLibraryStringPtr, const char *sourceClientString); +#ifdef __cplusplus +typedef void (TW_CALL * TwCopyStdStringToClient)(std::string& destinationClientString, const std::string& sourceString); +TW_API void TW_CALL TwCopyStdStringToClientFunc(TwCopyStdStringToClient copyStdStringToClientFunc); +TW_API void TW_CALL TwCopyStdStringToLibrary(std::string& destinationLibraryString, const std::string& sourceClientString); +#endif // __cplusplus + +typedef enum ETwParamValueType +{ + TW_PARAM_INT32, + TW_PARAM_FLOAT, + TW_PARAM_DOUBLE, + TW_PARAM_CSTRING // Null-terminated array of char (ie, c-string) +} TwParamValueType; +TW_API int TW_CALL TwGetParam(TwBar *bar, const char *varName, const char *paramName, TwParamValueType paramValueType, unsigned int outValueMaxCount, void *outValues); +TW_API int TW_CALL TwSetParam(TwBar *bar, const char *varName, const char *paramName, TwParamValueType paramValueType, unsigned int inValueCount, const void *inValues); + + +// ---------------------------------------------------------------------------- +// Management functions and definitions +// ---------------------------------------------------------------------------- + +typedef enum ETwGraphAPI +{ + TW_OPENGL = 1, + TW_DIRECT3D9 = 2, + TW_DIRECT3D10 = 3, + TW_DIRECT3D11 = 4, + TW_OPENGL_CORE = 5 +} TwGraphAPI; + +TW_API int TW_CALL TwInit(TwGraphAPI graphAPI, void *device); +TW_API int TW_CALL TwTerminate(); + +TW_API int TW_CALL TwDraw(); +TW_API int TW_CALL TwWindowSize(int width, int height); + +TW_API int TW_CALL TwSetCurrentWindow(int windowID); // multi-windows support +TW_API int TW_CALL TwGetCurrentWindow(); +TW_API int TW_CALL TwWindowExists(int windowID); + +typedef enum ETwKeyModifier +{ + TW_KMOD_NONE = 0x0000, // same codes as SDL keysym.mod + TW_KMOD_SHIFT = 0x0003, + TW_KMOD_CTRL = 0x00c0, + TW_KMOD_ALT = 0x0100, + TW_KMOD_META = 0x0c00 +} TwKeyModifier; +typedef enum EKeySpecial +{ + TW_KEY_BACKSPACE = '\b', + TW_KEY_TAB = '\t', + TW_KEY_CLEAR = 0x0c, + TW_KEY_RETURN = '\r', + TW_KEY_PAUSE = 0x13, + TW_KEY_ESCAPE = 0x1b, + TW_KEY_SPACE = ' ', + TW_KEY_DELETE = 0x7f, + TW_KEY_UP = 273, // same codes and order as SDL 1.2 keysym.sym + TW_KEY_DOWN, + TW_KEY_RIGHT, + TW_KEY_LEFT, + TW_KEY_INSERT, + TW_KEY_HOME, + TW_KEY_END, + TW_KEY_PAGE_UP, + TW_KEY_PAGE_DOWN, + TW_KEY_F1, + TW_KEY_F2, + TW_KEY_F3, + TW_KEY_F4, + TW_KEY_F5, + TW_KEY_F6, + TW_KEY_F7, + TW_KEY_F8, + TW_KEY_F9, + TW_KEY_F10, + TW_KEY_F11, + TW_KEY_F12, + TW_KEY_F13, + TW_KEY_F14, + TW_KEY_F15, + TW_KEY_LAST +} TwKeySpecial; + +TW_API int TW_CALL TwKeyPressed(int key, int modifiers); +TW_API int TW_CALL TwKeyTest(int key, int modifiers); + +typedef enum ETwMouseAction +{ + TW_MOUSE_RELEASED, + TW_MOUSE_PRESSED +} TwMouseAction; +typedef enum ETwMouseButtonID +{ + TW_MOUSE_LEFT = 1, // same code as SDL_BUTTON_LEFT + TW_MOUSE_MIDDLE = 2, // same code as SDL_BUTTON_MIDDLE + TW_MOUSE_RIGHT = 3 // same code as SDL_BUTTON_RIGHT +} TwMouseButtonID; + +TW_API int TW_CALL TwMouseButton(TwMouseAction action, TwMouseButtonID button); +TW_API int TW_CALL TwMouseMotion(int mouseX, int mouseY); +TW_API int TW_CALL TwMouseWheel(int pos); + +TW_API const char * TW_CALL TwGetLastError(); +typedef void (TW_CALL * TwErrorHandler)(const char *errorMessage); +TW_API void TW_CALL TwHandleErrors(TwErrorHandler errorHandler); + + +// ---------------------------------------------------------------------------- +// Helper functions to translate events from some common window management +// frameworks to AntTweakBar. +// They call TwKeyPressed, TwMouse* and TwWindowSize for you (implemented in +// files TwEventWin.c TwEventSDL*.c TwEventGLFW.c TwEventGLUT.c) +// ---------------------------------------------------------------------------- + +// For Windows message proc +#ifndef _W64 // Microsoft specific (detection of 64 bits portability issues) +# define _W64 +#endif // _W64 +#ifdef _WIN64 + TW_API int TW_CALL TwEventWin(void *wnd, unsigned int msg, unsigned __int64 _W64 wParam, __int64 _W64 lParam); +#else + TW_API int TW_CALL TwEventWin(void *wnd, unsigned int msg, unsigned int _W64 wParam, int _W64 lParam); +#endif +#define TwEventWin32 TwEventWin // For compatibility with AntTweakBar versions prior to 1.11 + +// For libSDL event loop +TW_API int TW_CALL TwEventSDL(const void *sdlEvent, unsigned char sdlMajorVersion, unsigned char sdlMinorVersion); + +// For GLFW event callbacks +// You should define GLFW_CDECL before including AntTweakBar.h if your version of GLFW uses cdecl calling convensions +#ifdef GLFW_CDECL + TW_API int TW_CDECL_CALL TwEventMouseButtonGLFWcdecl(int glfwButton, int glfwAction); + TW_API int TW_CDECL_CALL TwEventKeyGLFWcdecl(int glfwKey, int glfwAction); + TW_API int TW_CDECL_CALL TwEventCharGLFWcdecl(int glfwChar, int glfwAction); + TW_API int TW_CDECL_CALL TwEventMousePosGLFWcdecl(int mouseX, int mouseY); + TW_API int TW_CDECL_CALL TwEventMouseWheelGLFWcdecl(int wheelPos); +# define TwEventMouseButtonGLFW TwEventMouseButtonGLFWcdecl +# define TwEventKeyGLFW TwEventKeyGLFWcdecl +# define TwEventCharGLFW TwEventCharGLFWcdecl +# define TwEventMousePosGLFW TwEventMousePosGLFWcdecl +# define TwEventMouseWheelGLFW TwEventMouseWheelGLFWcdecl +#else + TW_API int TW_CALL TwEventMouseButtonGLFW(int glfwButton, int glfwAction); + TW_API int TW_CALL TwEventKeyGLFW(int glfwKey, int glfwAction); + TW_API int TW_CALL TwEventCharGLFW(int glfwChar, int glfwAction); +# define TwEventMousePosGLFW TwMouseMotion +# define TwEventMouseWheelGLFW TwMouseWheel +#endif + +// For GLUT event callbacks (Windows calling convention for GLUT callbacks is cdecl) +#if defined(_WIN32) || defined(_WIN64) +# define TW_GLUT_CALL TW_CDECL_CALL +#else +# define TW_GLUT_CALL +#endif +TW_API int TW_GLUT_CALL TwEventMouseButtonGLUT(int glutButton, int glutState, int mouseX, int mouseY); +TW_API int TW_GLUT_CALL TwEventMouseMotionGLUT(int mouseX, int mouseY); +TW_API int TW_GLUT_CALL TwEventKeyboardGLUT(unsigned char glutKey, int mouseX, int mouseY); +TW_API int TW_GLUT_CALL TwEventSpecialGLUT(int glutKey, int mouseX, int mouseY); +TW_API int TW_CALL TwGLUTModifiersFunc(int (TW_CALL *glutGetModifiersFunc)(void)); +typedef void (TW_GLUT_CALL *GLUTmousebuttonfun)(int glutButton, int glutState, int mouseX, int mouseY); +typedef void (TW_GLUT_CALL *GLUTmousemotionfun)(int mouseX, int mouseY); +typedef void (TW_GLUT_CALL *GLUTkeyboardfun)(unsigned char glutKey, int mouseX, int mouseY); +typedef void (TW_GLUT_CALL *GLUTspecialfun)(int glutKey, int mouseX, int mouseY); + +// For SFML event loop +TW_API int TW_CALL TwEventSFML(const void *sfmlEvent, unsigned char sfmlMajorVersion, unsigned char sfmlMinorVersion); + +// For X11 event loop +#if defined(_UNIX) + TW_API int TW_CDECL_CALL TwEventX11(void *xevent); +#endif + +// ---------------------------------------------------------------------------- +// Make sure the types have the right sizes +// ---------------------------------------------------------------------------- + +#define TW_COMPILE_TIME_ASSERT(name, x) typedef int TW_DUMMY_ ## name[(x) * 2 - 1] + +TW_COMPILE_TIME_ASSERT(TW_CHAR, sizeof(char) == 1); +TW_COMPILE_TIME_ASSERT(TW_SHORT, sizeof(short) == 2); +TW_COMPILE_TIME_ASSERT(TW_INT, sizeof(int) == 4); +TW_COMPILE_TIME_ASSERT(TW_FLOAT, sizeof(float) == 4); +TW_COMPILE_TIME_ASSERT(TW_DOUBLE, sizeof(double) == 8); + +// Check pointer size on Windows +#if !defined(_WIN64) && defined(_WIN32) + // If the following assert failed, the platform is not 32-bit and _WIN64 is not defined. + // When targetting 64-bit Windows platform, _WIN64 must be defined. + TW_COMPILE_TIME_ASSERT(TW_PTR32, sizeof(void*) == 4); +#elif defined(_WIN64) + // If the following assert failed, _WIN64 is defined but the targeted platform is not 64-bit. + TW_COMPILE_TIME_ASSERT(TW_PTR64, sizeof(void*) == 8); +#endif + +// --------------------------------------------------------------------------- + + +#ifdef __cplusplus + } // extern "C" +#endif // __cplusplus + + +#endif // !defined TW_INCLUDED diff --git a/AntTweakBar/lib/Readme.txt b/AntTweakBar/lib/Readme.txt new file mode 100644 index 0000000..c54c5e1 --- /dev/null +++ b/AntTweakBar/lib/Readme.txt @@ -0,0 +1,2 @@ +These files are part of the AntTweakBar library. +http://anttweakbar.sourceforge.net/doc diff --git a/AntTweakBar/src/AntPerfTimer.h b/AntTweakBar/src/AntPerfTimer.h new file mode 100644 index 0000000..bd969a6 --- /dev/null +++ b/AntTweakBar/src/AntPerfTimer.h @@ -0,0 +1,56 @@ +// --------------------------------------------------------------------------- +// +// @file AntPerfTimer.h +// @brief A performance (precision) timer for benchs +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: No cpp file is needed, everything is defined in this header +// +// --------------------------------------------------------------------------- + +#if !defined ANT_PERF_TIMER_INCLUDED +#define ANT_PERF_TIMER_INCLUDED + +#ifndef __cplusplus +# error This is a C++ header +#endif // __cplusplus + + +#if defined(WIN32) || defined(WIN64) || defined(_WIN32) || defined(_WIN64) + + #include + #include + + struct PerfTimer + { + inline PerfTimer() { if( !QueryPerformanceFrequency(&Freq) ) MessageBox(NULL, _T("Precision timer not supported"), _T("Problem"), MB_ICONEXCLAMATION); Reset(); } + inline void Reset() { QueryPerformanceCounter(&Start); } + inline double GetTime() { if( QueryPerformanceCounter(&End) ) return ((double)End.QuadPart - (double)Start.QuadPart)/((double)Freq.QuadPart); else return 0; } + protected: + LARGE_INTEGER Start, End, Freq; + }; + +#else // !_WIN (-> LINUX) + + #include + #include + + struct PerfTimer + { + inline PerfTimer() { Reset(); } + inline void Reset() { gettimeofday(&Start, &TZ); } + inline double GetTime() { gettimeofday(&End,&TZ); + double t1 = (double)Start.tv_sec + (double)Start.tv_usec/(1000*1000); + double t2 = (double)End.tv_sec + (double)End.tv_usec/(1000*1000); + return t2-t1; } + protected: + struct timeval Start, End; + struct timezone TZ; + }; + +#endif // _WIN + + +#endif // ANT_PERF_TIMER_INCLUDED diff --git a/AntTweakBar/src/AntTweakBar.rc b/AntTweakBar/src/AntTweakBar.rc new file mode 100644 index 0000000..07ae955 --- /dev/null +++ b/AntTweakBar/src/AntTweakBar.rc @@ -0,0 +1,83 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +//#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Franais (France) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +#ifdef _WIN32 +//LANGUAGE LANG_FRENCH, SUBLANG_FRENCH +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +IDC_CURSOR1 CURSOR "res\\cur00013.cur" +IDC_CURSOR2 CURSOR "res\\cur00000.cur" +IDC_CURSOR3 CURSOR "res\\cur00001.cur" +IDC_CURSOR4 CURSOR "res\\cur00002.cur" +IDC_CURSOR5 CURSOR "res\\cur00003.cur" +IDC_CURSOR6 CURSOR "res\\cur00004.cur" +IDC_CURSOR7 CURSOR "res\\cur00005.cur" +IDC_CURSOR8 CURSOR "res\\cur00006.cur" +IDC_CURSOR9 CURSOR "res\\cur00007.cur" +IDC_CURSOR10 CURSOR "res\\cur00008.cur" +IDC_CURSOR11 CURSOR "res\\cur00009.cur" +IDC_CURSOR12 CURSOR "res\\cur00010.cur" +IDC_CURSOR13 CURSOR "res\\cur00011.cur" +IDC_CURSOR14 CURSOR "res\\cur00012.cur" +#endif // Franais (France) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/AntTweakBar/src/AntTweakBar.vcproj b/AntTweakBar/src/AntTweakBar.vcproj new file mode 100644 index 0000000..53655cf --- /dev/null +++ b/AntTweakBar/src/AntTweakBar.vcproj @@ -0,0 +1,1025 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AntTweakBar/src/AntTweakBar.vcxproj b/AntTweakBar/src/AntTweakBar.vcxproj new file mode 100644 index 0000000..81960a8 --- /dev/null +++ b/AntTweakBar/src/AntTweakBar.vcxproj @@ -0,0 +1,490 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42} + AntTweakBar + + + + DynamicLibrary + v110 + false + MultiByte + + + DynamicLibrary + v110 + false + MultiByte + true + + + DynamicLibrary + v110 + false + MultiByte + + + DynamicLibrary + v110 + false + MultiByte + true + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + ../lib\ + release32\ + false + false + + + ../lib\ + release64\ + false + false + $(ProjectName)64 + + + ../lib/debug\ + debug32\ + true + + + ../lib/debug\ + debug64\ + true + $(ProjectName)64 + + + + fxc /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)AntTweakBar.tlb + + + Full + OnlyExplicitInline + true + Speed + ../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + true + + MultiThreaded + true + true + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + + Default + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + false + $(OutDir)AntTweakBar.dll + true + false + $(OutDir)$(TargetName).pdb + false + true + false + + $(OutDir)$(TargetName).lib + MachineX86 + + + xcopy /y /f ..\lib\AntTweakBar.dll ..\examples\bin32 + + + + + fxc /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc/T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)AntTweakBar.tlb + + + Full + OnlyExplicitInline + true + Speed + ../include;%(AdditionalIncludeDirectories) + WIN64;_WIN64;NDEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + true + + MultiThreaded + true + true + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + + Default + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + false + $(OutDir)AntTweakBar64.dll + true + false + $(OutDir)$(TargetName).pdb + false + true + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + xcopy /y /f ..\lib\AntTweakBar64.dll ..\examples\bin64 + + + + + fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)AntTweakBar.tlb + + + Disabled + ../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + EditAndContinue + Default + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + $(OutDir)AntTweakBar.dll + true + true + $(OutDir)$(TargetName).pdb + false + + $(OutDir)$(TargetName).lib + MachineX86 + false + + + if exist ..\examples\debug32 xcopy /y /f ..\lib\debug\AntTweakBar.dll ..\examples\debug32\. + + + + + fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)AntTweakBar.tlb + + + Disabled + ../include;%(AdditionalIncludeDirectories) + WIN64;_WIN64;_DEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + ProgramDatabase + Default + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + $(OutDir)AntTweakBar64.dll + true + true + $(OutDir)$(TargetName).pdb + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + if exist ..\examples\debug64 xcopy /y /f ..\lib\debug\AntTweakBar64.dll ..\examples\debug64\. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AntTweakBar/src/AntTweakBar.vcxproj.filters b/AntTweakBar/src/AntTweakBar.vcxproj.filters new file mode 100644 index 0000000..afd8448 --- /dev/null +++ b/AntTweakBar/src/AntTweakBar.vcxproj.filters @@ -0,0 +1,217 @@ + + + + + {f83ca079-8ea0-4739-a811-1271c1da7b99} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {9fa95835-d0ac-461f-9e15-970d83af4629} + h;hpp;hxx;hm;inl + + + {87a5b5f8-eb1d-4589-96fd-f8e516fc15e7} + + + {d4d938bf-b5f6-43d3-896f-a3fff1885877} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Public Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + Private Header Files + + + + + Resource Files + + + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/AntTweakBar/src/AntTweakBar_2013.vcxproj b/AntTweakBar/src/AntTweakBar_2013.vcxproj new file mode 100644 index 0000000..12a9d21 --- /dev/null +++ b/AntTweakBar/src/AntTweakBar_2013.vcxproj @@ -0,0 +1,495 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42} + AntTweakBar + AntTweakBar + + + + DynamicLibrary + v120 + false + MultiByte + + + DynamicLibrary + v120 + false + MultiByte + + + DynamicLibrary + v120 + false + MultiByte + true + + + DynamicLibrary + v120 + false + MultiByte + true + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + ../lib\ + release64\ + false + false + $(ProjectName)64 + + + false + false + $(ProjectName) + ../lib\ + release32\ + + + ../lib/debug\ + debug64\ + true + $(ProjectName)64 + + + true + $(ProjectName) + ../lib/debug\ + debug32\ + + + + fxc /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc/T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)AntTweakBar.tlb + + + Full + OnlyExplicitInline + true + Speed + ../include;%(AdditionalIncludeDirectories) + WIN64;_WIN64;NDEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + true + + MultiThreaded + true + true + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + + Default + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + false + $(OutDir)AntTweakBar64.dll + true + false + $(OutDir)$(TargetName).pdb + false + true + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc/T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)AntTweakBar.tlb + + + Full + OnlyExplicitInline + true + Speed + ../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + true + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + + + Default + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + false + $(OutDir)AntTweakBar.dll + true + false + $(OutDir)$(TargetName).pdb + false + true + false + + + $(OutDir)$(TargetName).lib + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)AntTweakBar.tlb + + + Disabled + ../include;%(AdditionalIncludeDirectories) + WIN64;_WIN64;_DEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + ProgramDatabase + Default + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + $(OutDir)AntTweakBar64.dll + true + true + $(OutDir)$(TargetName).pdb + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)AntTweakBar.tlb + + + Disabled + ../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + EditAndContinue + Default + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + $(OutDir)AntTweakBar.dll + true + true + $(OutDir)$(TargetName).pdb + false + + + $(OutDir)$(TargetName).lib + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AntTweakBar/src/AntTweakBar_2015.vcxproj b/AntTweakBar/src/AntTweakBar_2015.vcxproj new file mode 100644 index 0000000..0f6f33f --- /dev/null +++ b/AntTweakBar/src/AntTweakBar_2015.vcxproj @@ -0,0 +1,495 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42} + AntTweakBar + AntTweakBar + + + + DynamicLibrary + v140 + false + MultiByte + + + DynamicLibrary + v140 + false + MultiByte + + + DynamicLibrary + v140 + false + MultiByte + true + + + DynamicLibrary + v140 + false + MultiByte + true + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + ../lib\ + release64\ + false + false + $(ProjectName)64 + + + false + false + $(ProjectName) + ../lib\ + release32\ + + + ../lib/debug\ + debug64\ + true + $(ProjectName)64 + + + true + $(ProjectName) + ../lib/debug\ + debug32\ + + + + fxc /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc/T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)AntTweakBar.tlb + + + Full + OnlyExplicitInline + true + Speed + ../include;%(AdditionalIncludeDirectories) + WIN64;_WIN64;NDEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + true + + MultiThreaded + true + true + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + + Default + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + false + $(OutDir)AntTweakBar64.dll + true + false + $(OutDir)$(TargetName).pdb + false + true + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc/T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)AntTweakBar.tlb + + + Full + OnlyExplicitInline + true + Speed + ../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + true + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + + + Default + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + false + $(OutDir)AntTweakBar.dll + true + false + $(OutDir)$(TargetName).pdb + false + true + false + + + $(OutDir)$(TargetName).lib + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)AntTweakBar.tlb + + + Disabled + ../include;%(AdditionalIncludeDirectories) + WIN64;_WIN64;_DEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + ProgramDatabase + Default + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + $(OutDir)AntTweakBar64.dll + true + true + $(OutDir)$(TargetName).pdb + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)AntTweakBar.tlb + + + Disabled + ../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + EditAndContinue + Default + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + $(OutDir)AntTweakBar.dll + true + true + $(OutDir)$(TargetName).pdb + false + + + $(OutDir)$(TargetName).lib + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AntTweakBar/src/AntTweakBar_2017.vcxproj b/AntTweakBar/src/AntTweakBar_2017.vcxproj new file mode 100644 index 0000000..222453a --- /dev/null +++ b/AntTweakBar/src/AntTweakBar_2017.vcxproj @@ -0,0 +1,496 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42} + AntTweakBar + AntTweakBar + 10.0.15063.0 + + + + DynamicLibrary + v141 + false + MultiByte + + + DynamicLibrary + v141 + false + MultiByte + + + DynamicLibrary + v141 + false + MultiByte + true + + + DynamicLibrary + v141 + false + MultiByte + true + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + ../lib\ + release64\ + false + false + $(ProjectName)64 + + + false + false + $(ProjectName) + ../lib\ + release32\ + + + ../lib/debug\ + debug64\ + true + $(ProjectName)64 + + + true + $(ProjectName) + ../lib/debug\ + debug32\ + + + + fxc /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc/T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)AntTweakBar.tlb + + + Full + OnlyExplicitInline + true + Speed + ../include;%(AdditionalIncludeDirectories) + WIN64;_WIN64;NDEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + true + + MultiThreaded + true + true + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + + Default + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + false + $(OutDir)AntTweakBar64.dll + true + false + $(OutDir)$(TargetName).pdb + false + true + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc/T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)AntTweakBar.tlb + + + Full + OnlyExplicitInline + true + Speed + ../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + true + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + + + Default + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + false + $(OutDir)AntTweakBar.dll + true + false + $(OutDir)$(TargetName).pdb + false + true + false + + + $(OutDir)$(TargetName).lib + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)AntTweakBar.tlb + + + Disabled + ../include;%(AdditionalIncludeDirectories) + WIN64;_WIN64;_DEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + ProgramDatabase + Default + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + $(OutDir)AntTweakBar64.dll + true + true + $(OutDir)$(TargetName).pdb + false + + $(OutDir)$(TargetName).lib + MachineX64 + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectVS /Fh $(IntDir)TwDirect3D11_LineRectVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E LineRectCstColorVS /Fh $(IntDir)TwDirect3D11_LineRectCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E LineRectPS /Fh $(IntDir)TwDirect3D11_LineRectPS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextVS /Fh $(IntDir)TwDirect3D11_TextVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T vs_4_0_level_9_1 /E TextCstColorVS /Fh $(IntDir)TwDirect3D11_TextCstColorVS.h TwDirect3D11.hlsl +fxc /Od /Zi /T ps_4_0_level_9_1 /E TextPS /Fh $(IntDir)TwDirect3D11_TextPS.h TwDirect3D11.hlsl + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)AntTweakBar.tlb + + + Disabled + ../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;TW_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Use + TwPrecomp.h + $(IntDir)AntTweakBar.pch + $(IntDir) + $(IntDir) + $(IntDir) + Level4 + true + EditAndContinue + Default + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + res;%(AdditionalIncludeDirectories) + + + $(OutDir)AntTweakBar.dll + true + true + $(OutDir)$(TargetName).pdb + false + + + $(OutDir)$(TargetName).lib + + + mkdir "$(SolutionDir)$(Platform)/$(Configuration)" +xcopy /y /f "$(TargetPath)" "$(SolutionDir)$(Platform)/$(Configuration)" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AntTweakBar/src/AntTweakBar_VS2008.sln b/AntTweakBar/src/AntTweakBar_VS2008.sln new file mode 100644 index 0000000..fe13245 --- /dev/null +++ b/AntTweakBar/src/AntTweakBar_VS2008.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AntTweakBar", "AntTweakBar.vcproj", "{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug|Win32.ActiveCfg = Debug|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug|Win32.Build.0 = Debug|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug|x64.ActiveCfg = Debug|x64 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug|x64.Build.0 = Debug|x64 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|Win32.ActiveCfg = Release|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|Win32.Build.0 = Release|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|x64.ActiveCfg = Release|x64 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/AntTweakBar/src/AntTweakBar_VS2012.sln b/AntTweakBar/src/AntTweakBar_VS2012.sln new file mode 100644 index 0000000..2483db1 --- /dev/null +++ b/AntTweakBar/src/AntTweakBar_VS2012.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Desktop +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AntTweakBar", "AntTweakBar.vcxproj", "{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug|Win32.ActiveCfg = Debug|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug|Win32.Build.0 = Debug|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug|x64.ActiveCfg = Debug|x64 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug|x64.Build.0 = Debug|x64 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|Win32.ActiveCfg = Release|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|Win32.Build.0 = Release|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|x64.ActiveCfg = Release|x64 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/AntTweakBar/src/LoadOGL.cpp b/AntTweakBar/src/LoadOGL.cpp new file mode 100644 index 0000000..9c260c3 --- /dev/null +++ b/AntTweakBar/src/LoadOGL.cpp @@ -0,0 +1,545 @@ +// --------------------------------------------------------------------------- +// +// @file LoadOGL.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "LoadOGL.h" + + +// --------------------------------------------------------------------------- + +#define ANT_NB_OGL_FUNC_MAX 1024 + +struct COGLFuncRec +{ + const char * m_Name; + GL::PFNOpenGL * m_FuncPtr; + COGLFuncRec() : m_Name(NULL), m_FuncPtr(NULL) {} +}; +COGLFuncRec g_OGLFuncRec[ANT_NB_OGL_FUNC_MAX]; +int g_NbOGLFunc = 0; +#if defined(ANT_WINDOWS) +HMODULE g_OGLModule = NULL; +#endif + +// --------------------------------------------------------------------------- + +ANT_GL_IMPL(glAccum) +ANT_GL_IMPL(glAlphaFunc) +ANT_GL_IMPL(glAreTexturesResident) +ANT_GL_IMPL(glArrayElement) +ANT_GL_IMPL(glBegin) +ANT_GL_IMPL(glBindTexture) +ANT_GL_IMPL(glBitmap) +ANT_GL_IMPL(glBlendFunc) +ANT_GL_IMPL(glCallList) +ANT_GL_IMPL(glCallLists) +ANT_GL_IMPL(glClear) +ANT_GL_IMPL(glClearAccum) +ANT_GL_IMPL(glClearColor) +ANT_GL_IMPL(glClearDepth) +ANT_GL_IMPL(glClearIndex) +ANT_GL_IMPL(glClearStencil) +ANT_GL_IMPL(glClipPlane) +ANT_GL_IMPL(glColor3b) +ANT_GL_IMPL(glColor3bv) +ANT_GL_IMPL(glColor3d) +ANT_GL_IMPL(glColor3dv) +ANT_GL_IMPL(glColor3f) +ANT_GL_IMPL(glColor3fv) +ANT_GL_IMPL(glColor3i) +ANT_GL_IMPL(glColor3iv) +ANT_GL_IMPL(glColor3s) +ANT_GL_IMPL(glColor3sv) +ANT_GL_IMPL(glColor3ub) +ANT_GL_IMPL(glColor3ubv) +ANT_GL_IMPL(glColor3ui) +ANT_GL_IMPL(glColor3uiv) +ANT_GL_IMPL(glColor3us) +ANT_GL_IMPL(glColor3usv) +ANT_GL_IMPL(glColor4b) +ANT_GL_IMPL(glColor4bv) +ANT_GL_IMPL(glColor4d) +ANT_GL_IMPL(glColor4dv) +ANT_GL_IMPL(glColor4f) +ANT_GL_IMPL(glColor4fv) +ANT_GL_IMPL(glColor4i) +ANT_GL_IMPL(glColor4iv) +ANT_GL_IMPL(glColor4s) +ANT_GL_IMPL(glColor4sv) +ANT_GL_IMPL(glColor4ub) +ANT_GL_IMPL(glColor4ubv) +ANT_GL_IMPL(glColor4ui) +ANT_GL_IMPL(glColor4uiv) +ANT_GL_IMPL(glColor4us) +ANT_GL_IMPL(glColor4usv) +ANT_GL_IMPL(glColorMask) +ANT_GL_IMPL(glColorMaterial) +ANT_GL_IMPL(glColorPointer) +ANT_GL_IMPL(glCopyPixels) +ANT_GL_IMPL(glCopyTexImage1D) +ANT_GL_IMPL(glCopyTexImage2D) +ANT_GL_IMPL(glCopyTexSubImage1D) +ANT_GL_IMPL(glCopyTexSubImage2D) +ANT_GL_IMPL(glCullFace) +ANT_GL_IMPL(glDeleteLists) +ANT_GL_IMPL(glDeleteTextures) +ANT_GL_IMPL(glDepthFunc) +ANT_GL_IMPL(glDepthMask) +ANT_GL_IMPL(glDepthRange) +ANT_GL_IMPL(glDisable) +ANT_GL_IMPL(glDisableClientState) +ANT_GL_IMPL(glDrawArrays) +ANT_GL_IMPL(glDrawBuffer) +ANT_GL_IMPL(glDrawElements) +ANT_GL_IMPL(glDrawPixels) +ANT_GL_IMPL(glEdgeFlag) +ANT_GL_IMPL(glEdgeFlagPointer) +ANT_GL_IMPL(glEdgeFlagv) +ANT_GL_IMPL(glEnable) +ANT_GL_IMPL(glEnableClientState) +ANT_GL_IMPL(glEnd) +ANT_GL_IMPL(glEndList) +ANT_GL_IMPL(glEvalCoord1d) +ANT_GL_IMPL(glEvalCoord1dv) +ANT_GL_IMPL(glEvalCoord1f) +ANT_GL_IMPL(glEvalCoord1fv) +ANT_GL_IMPL(glEvalCoord2d) +ANT_GL_IMPL(glEvalCoord2dv) +ANT_GL_IMPL(glEvalCoord2f) +ANT_GL_IMPL(glEvalCoord2fv) +ANT_GL_IMPL(glEvalMesh1) +ANT_GL_IMPL(glEvalMesh2) +ANT_GL_IMPL(glEvalPoint1) +ANT_GL_IMPL(glEvalPoint2) +ANT_GL_IMPL(glFeedbackBuffer) +ANT_GL_IMPL(glFinish) +ANT_GL_IMPL(glFlush) +ANT_GL_IMPL(glFogf) +ANT_GL_IMPL(glFogfv) +ANT_GL_IMPL(glFogi) +ANT_GL_IMPL(glFogiv) +ANT_GL_IMPL(glFrontFace) +ANT_GL_IMPL(glFrustum) +ANT_GL_IMPL(glGenLists) +ANT_GL_IMPL(glGenTextures) +ANT_GL_IMPL(glGetBooleanv) +ANT_GL_IMPL(glGetClipPlane) +ANT_GL_IMPL(glGetDoublev) +ANT_GL_IMPL(glGetError) +ANT_GL_IMPL(glGetFloatv) +ANT_GL_IMPL(glGetIntegerv) +ANT_GL_IMPL(glGetLightfv) +ANT_GL_IMPL(glGetLightiv) +ANT_GL_IMPL(glGetMapdv) +ANT_GL_IMPL(glGetMapfv) +ANT_GL_IMPL(glGetMapiv) +ANT_GL_IMPL(glGetMaterialfv) +ANT_GL_IMPL(glGetMaterialiv) +ANT_GL_IMPL(glGetPixelMapfv) +ANT_GL_IMPL(glGetPixelMapuiv) +ANT_GL_IMPL(glGetPixelMapusv) +ANT_GL_IMPL(glGetPointerv) +ANT_GL_IMPL(glGetPolygonStipple) +ANT_GL_IMPL(glGetString) +ANT_GL_IMPL(glGetTexEnvfv) +ANT_GL_IMPL(glGetTexEnviv) +ANT_GL_IMPL(glGetTexGendv) +ANT_GL_IMPL(glGetTexGenfv) +ANT_GL_IMPL(glGetTexGeniv) +ANT_GL_IMPL(glGetTexImage) +ANT_GL_IMPL(glGetTexLevelParameterfv) +ANT_GL_IMPL(glGetTexLevelParameteriv) +ANT_GL_IMPL(glGetTexParameterfv) +ANT_GL_IMPL(glGetTexParameteriv) +ANT_GL_IMPL(glHint) +ANT_GL_IMPL(glIndexMask) +ANT_GL_IMPL(glIndexPointer) +ANT_GL_IMPL(glIndexd) +ANT_GL_IMPL(glIndexdv) +ANT_GL_IMPL(glIndexf) +ANT_GL_IMPL(glIndexfv) +ANT_GL_IMPL(glIndexi) +ANT_GL_IMPL(glIndexiv) +ANT_GL_IMPL(glIndexs) +ANT_GL_IMPL(glIndexsv) +ANT_GL_IMPL(glIndexub) +ANT_GL_IMPL(glIndexubv) +ANT_GL_IMPL(glInitNames) +ANT_GL_IMPL(glInterleavedArrays) +ANT_GL_IMPL(glIsEnabled) +ANT_GL_IMPL(glIsList) +ANT_GL_IMPL(glIsTexture) +ANT_GL_IMPL(glLightModelf) +ANT_GL_IMPL(glLightModelfv) +ANT_GL_IMPL(glLightModeli) +ANT_GL_IMPL(glLightModeliv) +ANT_GL_IMPL(glLightf) +ANT_GL_IMPL(glLightfv) +ANT_GL_IMPL(glLighti) +ANT_GL_IMPL(glLightiv) +ANT_GL_IMPL(glLineStipple) +ANT_GL_IMPL(glLineWidth) +ANT_GL_IMPL(glListBase) +ANT_GL_IMPL(glLoadIdentity) +ANT_GL_IMPL(glLoadMatrixd) +ANT_GL_IMPL(glLoadMatrixf) +ANT_GL_IMPL(glLoadName) +ANT_GL_IMPL(glLogicOp) +ANT_GL_IMPL(glMap1d) +ANT_GL_IMPL(glMap1f) +ANT_GL_IMPL(glMap2d) +ANT_GL_IMPL(glMap2f) +ANT_GL_IMPL(glMapGrid1d) +ANT_GL_IMPL(glMapGrid1f) +ANT_GL_IMPL(glMapGrid2d) +ANT_GL_IMPL(glMapGrid2f) +ANT_GL_IMPL(glMaterialf) +ANT_GL_IMPL(glMaterialfv) +ANT_GL_IMPL(glMateriali) +ANT_GL_IMPL(glMaterialiv) +ANT_GL_IMPL(glMatrixMode) +ANT_GL_IMPL(glMultMatrixd) +ANT_GL_IMPL(glMultMatrixf) +ANT_GL_IMPL(glNewList) +ANT_GL_IMPL(glNormal3b) +ANT_GL_IMPL(glNormal3bv) +ANT_GL_IMPL(glNormal3d) +ANT_GL_IMPL(glNormal3dv) +ANT_GL_IMPL(glNormal3f) +ANT_GL_IMPL(glNormal3fv) +ANT_GL_IMPL(glNormal3i) +ANT_GL_IMPL(glNormal3iv) +ANT_GL_IMPL(glNormal3s) +ANT_GL_IMPL(glNormal3sv) +ANT_GL_IMPL(glNormalPointer) +ANT_GL_IMPL(glOrtho) +ANT_GL_IMPL(glPassThrough) +ANT_GL_IMPL(glPixelMapfv) +ANT_GL_IMPL(glPixelMapuiv) +ANT_GL_IMPL(glPixelMapusv) +ANT_GL_IMPL(glPixelStoref) +ANT_GL_IMPL(glPixelStorei) +ANT_GL_IMPL(glPixelTransferf) +ANT_GL_IMPL(glPixelTransferi) +ANT_GL_IMPL(glPixelZoom) +ANT_GL_IMPL(glPointSize) +ANT_GL_IMPL(glPolygonMode) +ANT_GL_IMPL(glPolygonOffset) +ANT_GL_IMPL(glPolygonStipple) +ANT_GL_IMPL(glPopAttrib) +ANT_GL_IMPL(glPopClientAttrib) +ANT_GL_IMPL(glPopMatrix) +ANT_GL_IMPL(glPopName) +ANT_GL_IMPL(glPrioritizeTextures) +ANT_GL_IMPL(glPushAttrib) +ANT_GL_IMPL(glPushClientAttrib) +ANT_GL_IMPL(glPushMatrix) +ANT_GL_IMPL(glPushName) +ANT_GL_IMPL(glRasterPos2d) +ANT_GL_IMPL(glRasterPos2dv) +ANT_GL_IMPL(glRasterPos2f) +ANT_GL_IMPL(glRasterPos2fv) +ANT_GL_IMPL(glRasterPos2i) +ANT_GL_IMPL(glRasterPos2iv) +ANT_GL_IMPL(glRasterPos2s) +ANT_GL_IMPL(glRasterPos2sv) +ANT_GL_IMPL(glRasterPos3d) +ANT_GL_IMPL(glRasterPos3dv) +ANT_GL_IMPL(glRasterPos3f) +ANT_GL_IMPL(glRasterPos3fv) +ANT_GL_IMPL(glRasterPos3i) +ANT_GL_IMPL(glRasterPos3iv) +ANT_GL_IMPL(glRasterPos3s) +ANT_GL_IMPL(glRasterPos3sv) +ANT_GL_IMPL(glRasterPos4d) +ANT_GL_IMPL(glRasterPos4dv) +ANT_GL_IMPL(glRasterPos4f) +ANT_GL_IMPL(glRasterPos4fv) +ANT_GL_IMPL(glRasterPos4i) +ANT_GL_IMPL(glRasterPos4iv) +ANT_GL_IMPL(glRasterPos4s) +ANT_GL_IMPL(glRasterPos4sv) +ANT_GL_IMPL(glReadBuffer) +ANT_GL_IMPL(glReadPixels) +ANT_GL_IMPL(glRectd) +ANT_GL_IMPL(glRectdv) +ANT_GL_IMPL(glRectf) +ANT_GL_IMPL(glRectfv) +ANT_GL_IMPL(glRecti) +ANT_GL_IMPL(glRectiv) +ANT_GL_IMPL(glRects) +ANT_GL_IMPL(glRectsv) +ANT_GL_IMPL(glRenderMode) +ANT_GL_IMPL(glRotated) +ANT_GL_IMPL(glRotatef) +ANT_GL_IMPL(glScaled) +ANT_GL_IMPL(glScalef) +ANT_GL_IMPL(glScissor) +ANT_GL_IMPL(glSelectBuffer) +ANT_GL_IMPL(glShadeModel) +ANT_GL_IMPL(glStencilFunc) +ANT_GL_IMPL(glStencilMask) +ANT_GL_IMPL(glStencilOp) +ANT_GL_IMPL(glTexCoord1d) +ANT_GL_IMPL(glTexCoord1dv) +ANT_GL_IMPL(glTexCoord1f) +ANT_GL_IMPL(glTexCoord1fv) +ANT_GL_IMPL(glTexCoord1i) +ANT_GL_IMPL(glTexCoord1iv) +ANT_GL_IMPL(glTexCoord1s) +ANT_GL_IMPL(glTexCoord1sv) +ANT_GL_IMPL(glTexCoord2d) +ANT_GL_IMPL(glTexCoord2dv) +ANT_GL_IMPL(glTexCoord2f) +ANT_GL_IMPL(glTexCoord2fv) +ANT_GL_IMPL(glTexCoord2i) +ANT_GL_IMPL(glTexCoord2iv) +ANT_GL_IMPL(glTexCoord2s) +ANT_GL_IMPL(glTexCoord2sv) +ANT_GL_IMPL(glTexCoord3d) +ANT_GL_IMPL(glTexCoord3dv) +ANT_GL_IMPL(glTexCoord3f) +ANT_GL_IMPL(glTexCoord3fv) +ANT_GL_IMPL(glTexCoord3i) +ANT_GL_IMPL(glTexCoord3iv) +ANT_GL_IMPL(glTexCoord3s) +ANT_GL_IMPL(glTexCoord3sv) +ANT_GL_IMPL(glTexCoord4d) +ANT_GL_IMPL(glTexCoord4dv) +ANT_GL_IMPL(glTexCoord4f) +ANT_GL_IMPL(glTexCoord4fv) +ANT_GL_IMPL(glTexCoord4i) +ANT_GL_IMPL(glTexCoord4iv) +ANT_GL_IMPL(glTexCoord4s) +ANT_GL_IMPL(glTexCoord4sv) +ANT_GL_IMPL(glTexCoordPointer) +ANT_GL_IMPL(glTexEnvf) +ANT_GL_IMPL(glTexEnvfv) +ANT_GL_IMPL(glTexEnvi) +ANT_GL_IMPL(glTexEnviv) +ANT_GL_IMPL(glTexGend) +ANT_GL_IMPL(glTexGendv) +ANT_GL_IMPL(glTexGenf) +ANT_GL_IMPL(glTexGenfv) +ANT_GL_IMPL(glTexGeni) +ANT_GL_IMPL(glTexGeniv) +ANT_GL_IMPL(glTexImage1D) +ANT_GL_IMPL(glTexImage2D) +ANT_GL_IMPL(glTexParameterf) +ANT_GL_IMPL(glTexParameterfv) +ANT_GL_IMPL(glTexParameteri) +ANT_GL_IMPL(glTexParameteriv) +ANT_GL_IMPL(glTexSubImage1D) +ANT_GL_IMPL(glTexSubImage2D) +ANT_GL_IMPL(glTranslated) +ANT_GL_IMPL(glTranslatef) +ANT_GL_IMPL(glVertex2d) +ANT_GL_IMPL(glVertex2dv) +ANT_GL_IMPL(glVertex2f) +ANT_GL_IMPL(glVertex2fv) +ANT_GL_IMPL(glVertex2i) +ANT_GL_IMPL(glVertex2iv) +ANT_GL_IMPL(glVertex2s) +ANT_GL_IMPL(glVertex2sv) +ANT_GL_IMPL(glVertex3d) +ANT_GL_IMPL(glVertex3dv) +ANT_GL_IMPL(glVertex3f) +ANT_GL_IMPL(glVertex3fv) +ANT_GL_IMPL(glVertex3i) +ANT_GL_IMPL(glVertex3iv) +ANT_GL_IMPL(glVertex3s) +ANT_GL_IMPL(glVertex3sv) +ANT_GL_IMPL(glVertex4d) +ANT_GL_IMPL(glVertex4dv) +ANT_GL_IMPL(glVertex4f) +ANT_GL_IMPL(glVertex4fv) +ANT_GL_IMPL(glVertex4i) +ANT_GL_IMPL(glVertex4iv) +ANT_GL_IMPL(glVertex4s) +ANT_GL_IMPL(glVertex4sv) +ANT_GL_IMPL(glVertexPointer) +ANT_GL_IMPL(glViewport) +#if defined(ANT_WINDOWS) +ANT_GL_IMPL(wglGetProcAddress) +#endif + +namespace GL { PFNGLGetProcAddress _glGetProcAddress = NULL; } + +// --------------------------------------------------------------------------- + +#if defined(ANT_WINDOWS) + + // --------------------------------------------------------------------------- + + int LoadOpenGL() + { + if( g_OGLModule!=NULL ) + { + return 1; // "OpenGL library already loaded" + } + + g_OGLModule = LoadLibrary("OPENGL32.DLL"); + if( g_OGLModule ) + { + // Info(VERB_LOW, "Load %d OpenGL functions", g_NbOGLFunc); + + int Res = 1; + for(int i=0; i0); + *(g_OGLFuncRec[i].m_FuncPtr) = reinterpret_cast(GetProcAddress(g_OGLModule, g_OGLFuncRec[i].m_Name)); + if( *(g_OGLFuncRec[i].m_FuncPtr)==NULL ) + Res = 0; // Error("cannot find OpenGL function"); + + } + + _glGetProcAddress = reinterpret_cast(_wglGetProcAddress); + if( _glGetProcAddress==NULL ) + Res = 0; + + return Res; + } + else + { + // InternDisplayLastErrorWIN("Cannot load opengl32 DLL", false); + return 0; // cannot load DLL + } + } + + // --------------------------------------------------------------------------- + + int UnloadOpenGL() + { + if( g_OGLModule==NULL ) + { + return 1; // "OpenGL library not loaded" + } + + // Info(VERB_LOW, "Unload %d OpenGL functions", g_NbOGLFunc); + for(int i=0; i0); + *(g_OGLFuncRec[i].m_FuncPtr) = NULL; + } + if( FreeLibrary(g_OGLModule) ) + { + // Info(VERB_LOW, "OpenGL library unloaded"); + g_OGLModule = NULL; + return 1; + } + else + { + // InternDisplayLastErrorWIN("Cannot unload opengl32 DLL", false); + return 0; // cannot unload opengl32.dll + } + } + + // --------------------------------------------------------------------------- + + namespace GL + { + + PFNOpenGL Record(const char *_FuncName, PFNOpenGL *_FuncPtr) + { + if( g_NbOGLFunc>=ANT_NB_OGL_FUNC_MAX ) + { + fprintf(stderr, "Too many OpenGL functions declared. Change ANT_NB_OGL_FUNC_MAX."); + exit(-1); + } + + g_OGLFuncRec[g_NbOGLFunc].m_Name = _FuncName; + g_OGLFuncRec[g_NbOGLFunc].m_FuncPtr = _FuncPtr; + ++g_NbOGLFunc; + + return NULL; + } + + } // namespace GL + + // --------------------------------------------------------------------------- + +#endif // defined(ANT_WINDOWS) + +// --------------------------------------------------------------------------- + +#if defined(ANT_UNIX) + + int LoadOpenGL() + { + _glGetProcAddress = reinterpret_cast(glXGetProcAddressARB); + + return 1; // "OpenGL library is statically linked" + } + + int UnloadOpenGL() + { + return 1; // "OpenGL library is statically linked" + } + +#elif defined(ANT_OSX) + + #include + + static void *gl_dyld = NULL; + static const char *gl_prefix = "_"; + void *NSGLGetProcAddressNew(const GLubyte *name) + { + void *proc=NULL; + if (gl_dyld == NULL) + { + gl_dyld = dlopen("OpenGL",RTLD_LAZY); + } + if (gl_dyld) + { + NSString *sym = [[NSString alloc] initWithFormat: @"%s%s",gl_prefix,name]; + proc = dlsym(gl_dyld,[sym UTF8String]); + [sym release]; + } + return proc; + } + + int LoadOpenGL() + { + _glGetProcAddress = reinterpret_cast(NSGLGetProcAddressNew); + + // try to load a symbol + if (_glGetProcAddress("glBindBufferARB") == NULL) + { + // remove the symbols underscore prefix (OSX 10.7 and later) + gl_prefix = ""; + if (_glGetProcAddress("glBindBufferARB") == NULL) + { + // fail: fall back to underscore + gl_prefix = "_"; + } + } + + return 1; + } + + int UnloadOpenGL() + { + if (gl_dyld) + { + dlclose(gl_dyld); + gl_dyld = NULL; + } + return 1; + } + +#endif // defined(ANT_UNIX) + +// --------------------------------------------------------------------------- diff --git a/AntTweakBar/src/LoadOGL.h b/AntTweakBar/src/LoadOGL.h new file mode 100644 index 0000000..613473d --- /dev/null +++ b/AntTweakBar/src/LoadOGL.h @@ -0,0 +1,397 @@ +// --------------------------------------------------------------------------- +// +// @file LoadOGL.h +// @brief OpenGL declarations for dynamic loading +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_LOAD_OGL_INCLUDED +#define ANT_LOAD_OGL_INCLUDED + + +#define ANT_GL_DECL(_Ret, _Fct, _Params) \ + extern "C" { typedef _Ret (APIENTRY* PFN##_Fct)_Params; } \ + namespace GL { extern PFN##_Fct _##_Fct; } \ + using GL::_##_Fct; + +#if defined(ANT_WINDOWS) +# define ANT_GL_IMPL(_Fct) \ + namespace GL { PFN##_Fct _##_Fct = (PFN##_Fct)Record(#_Fct, (PFNOpenGL*)(&_##_Fct)); } +#elif defined(ANT_UNIX) || defined(ANT_OSX) +# define ANT_GL_IMPL(_Fct) \ + namespace GL { PFN##_Fct _##_Fct = _Fct; } +# if !defined(APIENTRY) +# define APIENTRY +# endif +#endif + + +int LoadOpenGL(); +int UnloadOpenGL(); + +namespace GL +{ + extern "C" { typedef void (APIENTRY* PFNOpenGL)(); } + PFNOpenGL Record(const char *_FuncName, PFNOpenGL *_FuncPtr); + + extern "C" { typedef PFNOpenGL (APIENTRY *PFNGLGetProcAddress)(const char *); } + extern PFNGLGetProcAddress _glGetProcAddress; +} +using GL::_glGetProcAddress; + + +ANT_GL_DECL(void, glAccum, (GLenum op, GLfloat value)) +ANT_GL_DECL(void, glAlphaFunc, (GLenum func, GLclampf ref)) +ANT_GL_DECL(GLboolean, glAreTexturesResident, (GLsizei n, const GLuint *textures, GLboolean *residences)) +ANT_GL_DECL(void, glArrayElement, (GLint i)) +ANT_GL_DECL(void, glBegin, (GLenum mode)) +ANT_GL_DECL(void, glBindTexture, (GLenum target, GLuint texture)) +ANT_GL_DECL(void, glBitmap, (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)) +ANT_GL_DECL(void, glBlendFunc, (GLenum sfactor, GLenum dfactor)) +ANT_GL_DECL(void, glCallList, (GLuint list)) +ANT_GL_DECL(void, glCallLists, (GLsizei n, GLenum type, const GLvoid *lists)) +ANT_GL_DECL(void, glClear, (GLbitfield mask)) +ANT_GL_DECL(void, glClearAccum, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) +ANT_GL_DECL(void, glClearColor, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)) +ANT_GL_DECL(void, glClearDepth, (GLclampd depth)) +ANT_GL_DECL(void, glClearIndex, (GLfloat c)) +ANT_GL_DECL(void, glClearStencil, (GLint s)) +ANT_GL_DECL(void, glClipPlane, (GLenum plane, const GLdouble *equation)) +ANT_GL_DECL(void, glColor3b, (GLbyte red, GLbyte green, GLbyte blue)) +ANT_GL_DECL(void, glColor3bv, (const GLbyte *v)) +ANT_GL_DECL(void, glColor3d, (GLdouble red, GLdouble green, GLdouble blue)) +ANT_GL_DECL(void, glColor3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glColor3f, (GLfloat red, GLfloat green, GLfloat blue)) +ANT_GL_DECL(void, glColor3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glColor3i, (GLint red, GLint green, GLint blue)) +ANT_GL_DECL(void, glColor3iv, (const GLint *v)) +ANT_GL_DECL(void, glColor3s, (GLshort red, GLshort green, GLshort blue)) +ANT_GL_DECL(void, glColor3sv, (const GLshort *v)) +ANT_GL_DECL(void, glColor3ub, (GLubyte red, GLubyte green, GLubyte blue)) +ANT_GL_DECL(void, glColor3ubv, (const GLubyte *v)) +ANT_GL_DECL(void, glColor3ui, (GLuint red, GLuint green, GLuint blue)) +ANT_GL_DECL(void, glColor3uiv, (const GLuint *v)) +ANT_GL_DECL(void, glColor3us, (GLushort red, GLushort green, GLushort blue)) +ANT_GL_DECL(void, glColor3usv, (const GLushort *v)) +ANT_GL_DECL(void, glColor4b, (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)) +ANT_GL_DECL(void, glColor4bv, (const GLbyte *v)) +ANT_GL_DECL(void, glColor4d, (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)) +ANT_GL_DECL(void, glColor4dv, (const GLdouble *v)) +ANT_GL_DECL(void, glColor4f, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) +ANT_GL_DECL(void, glColor4fv, (const GLfloat *v)) +ANT_GL_DECL(void, glColor4i, (GLint red, GLint green, GLint blue, GLint alpha)) +ANT_GL_DECL(void, glColor4iv, (const GLint *v)) +ANT_GL_DECL(void, glColor4s, (GLshort red, GLshort green, GLshort blue, GLshort alpha)) +ANT_GL_DECL(void, glColor4sv, (const GLshort *v)) +ANT_GL_DECL(void, glColor4ub, (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)) +ANT_GL_DECL(void, glColor4ubv, (const GLubyte *v)) +ANT_GL_DECL(void, glColor4ui, (GLuint red, GLuint green, GLuint blue, GLuint alpha)) +ANT_GL_DECL(void, glColor4uiv, (const GLuint *v)) +ANT_GL_DECL(void, glColor4us, (GLushort red, GLushort green, GLushort blue, GLushort alpha)) +ANT_GL_DECL(void, glColor4usv, (const GLushort *v)) +ANT_GL_DECL(void, glColorMask, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)) +ANT_GL_DECL(void, glColorMaterial, (GLenum face, GLenum mode)) +ANT_GL_DECL(void, glColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glCopyPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)) +ANT_GL_DECL(void, glCopyTexImage1D, (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border)) +ANT_GL_DECL(void, glCopyTexImage2D, (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)) +ANT_GL_DECL(void, glCopyTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)) +ANT_GL_DECL(void, glCopyTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) +ANT_GL_DECL(void, glCullFace, (GLenum mode)) +ANT_GL_DECL(void, glDeleteLists, (GLuint list, GLsizei range)) +ANT_GL_DECL(void, glDeleteTextures, (GLsizei n, const GLuint *textures)) +ANT_GL_DECL(void, glDepthFunc, (GLenum func)) +ANT_GL_DECL(void, glDepthMask, (GLboolean flag)) +ANT_GL_DECL(void, glDepthRange, (GLclampd zNear, GLclampd zFar)) +ANT_GL_DECL(void, glDisable, (GLenum cap)) +ANT_GL_DECL(void, glDisableClientState, (GLenum array)) +ANT_GL_DECL(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count)) +ANT_GL_DECL(void, glDrawBuffer, (GLenum mode)) +ANT_GL_DECL(void, glDrawElements, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)) +ANT_GL_DECL(void, glDrawPixels, (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glEdgeFlag, (GLboolean flag)) +ANT_GL_DECL(void, glEdgeFlagPointer, (GLsizei stride, const void *pointer)) +ANT_GL_DECL(void, glEdgeFlagv, (const GLboolean *flag)) +ANT_GL_DECL(void, glEnable, (GLenum cap)) +ANT_GL_DECL(void, glEnableClientState, (GLenum array)) +ANT_GL_DECL(void, glEnd, (void)) +ANT_GL_DECL(void, glEndList, (void)) +ANT_GL_DECL(void, glEvalCoord1d, (GLdouble u)) +ANT_GL_DECL(void, glEvalCoord1dv, (const GLdouble *u)) +ANT_GL_DECL(void, glEvalCoord1f, (GLfloat u)) +ANT_GL_DECL(void, glEvalCoord1fv, (const GLfloat *u)) +ANT_GL_DECL(void, glEvalCoord2d, (GLdouble u, GLdouble v)) +ANT_GL_DECL(void, glEvalCoord2dv, (const GLdouble *u)) +ANT_GL_DECL(void, glEvalCoord2f, (GLfloat u, GLfloat v)) +ANT_GL_DECL(void, glEvalCoord2fv, (const GLfloat *u)) +ANT_GL_DECL(void, glEvalMesh1, (GLenum mode, GLint i1, GLint i2)) +ANT_GL_DECL(void, glEvalMesh2, (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)) +ANT_GL_DECL(void, glEvalPoint1, (GLint i)) +ANT_GL_DECL(void, glEvalPoint2, (GLint i, GLint j)) +ANT_GL_DECL(void, glFeedbackBuffer, (GLsizei size, GLenum type, GLfloat *buffer)) +ANT_GL_DECL(void, glFinish, (void)) +ANT_GL_DECL(void, glFlush, (void)) +ANT_GL_DECL(void, glFogf, (GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glFogfv, (GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glFogi, (GLenum pname, GLint param)) +ANT_GL_DECL(void, glFogiv, (GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glFrontFace, (GLenum mode)) +ANT_GL_DECL(void, glFrustum, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) +ANT_GL_DECL(GLuint, glGenLists, (GLsizei range)) +ANT_GL_DECL(void, glGenTextures, (GLsizei n, GLuint *textures)) +ANT_GL_DECL(void, glGetBooleanv, (GLenum pname, GLboolean *params)) +ANT_GL_DECL(void, glGetClipPlane, (GLenum plane, GLdouble *equation)) +ANT_GL_DECL(void, glGetDoublev, (GLenum pname, GLdouble *params)) +ANT_GL_DECL(GLenum, glGetError, (void)) +ANT_GL_DECL(void, glGetFloatv, (GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetIntegerv, (GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetLightfv, (GLenum light, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetLightiv, (GLenum light, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetMapdv, (GLenum target, GLenum query, GLdouble *v)) +ANT_GL_DECL(void, glGetMapfv, (GLenum target, GLenum query, GLfloat *v)) +ANT_GL_DECL(void, glGetMapiv, (GLenum target, GLenum query, GLint *v)) +ANT_GL_DECL(void, glGetMaterialfv, (GLenum face, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetMaterialiv, (GLenum face, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetPixelMapfv, (GLenum map, GLfloat *values)) +ANT_GL_DECL(void, glGetPixelMapuiv, (GLenum map, GLuint *values)) +ANT_GL_DECL(void, glGetPixelMapusv, (GLenum map, GLushort *values)) +ANT_GL_DECL(void, glGetPointerv, (GLenum pname, GLvoid* *params)) +ANT_GL_DECL(void, glGetPolygonStipple, (GLubyte *mask)) +ANT_GL_DECL(const GLubyte *, glGetString, (GLenum name)) +ANT_GL_DECL(void, glGetTexEnvfv, (GLenum target, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetTexEnviv, (GLenum target, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetTexGendv, (GLenum coord, GLenum pname, GLdouble *params)) +ANT_GL_DECL(void, glGetTexGenfv, (GLenum coord, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetTexGeniv, (GLenum coord, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetTexImage, (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)) +ANT_GL_DECL(void, glGetTexLevelParameterfv, (GLenum target, GLint level, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetTexLevelParameteriv, (GLenum target, GLint level, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetTexParameterfv, (GLenum target, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetTexParameteriv, (GLenum target, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glHint, (GLenum target, GLenum mode)) +ANT_GL_DECL(void, glIndexMask, (GLuint mask)) +ANT_GL_DECL(void, glIndexPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glIndexd, (GLdouble c)) +ANT_GL_DECL(void, glIndexdv, (const GLdouble *c)) +ANT_GL_DECL(void, glIndexf, (GLfloat c)) +ANT_GL_DECL(void, glIndexfv, (const GLfloat *c)) +ANT_GL_DECL(void, glIndexi, (GLint c)) +ANT_GL_DECL(void, glIndexiv, (const GLint *c)) +ANT_GL_DECL(void, glIndexs, (GLshort c)) +ANT_GL_DECL(void, glIndexsv, (const GLshort *c)) +ANT_GL_DECL(void, glIndexub, (GLubyte c)) +ANT_GL_DECL(void, glIndexubv, (const GLubyte *c)) +ANT_GL_DECL(void, glInitNames, (void)) +ANT_GL_DECL(void, glInterleavedArrays, (GLenum format, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(GLboolean, glIsEnabled, (GLenum cap)) +ANT_GL_DECL(GLboolean, glIsList, (GLuint list)) +ANT_GL_DECL(GLboolean, glIsTexture, (GLuint texture)) +ANT_GL_DECL(void, glLightModelf, (GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glLightModelfv, (GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glLightModeli, (GLenum pname, GLint param)) +ANT_GL_DECL(void, glLightModeliv, (GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glLightf, (GLenum light, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glLightfv, (GLenum light, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glLighti, (GLenum light, GLenum pname, GLint param)) +ANT_GL_DECL(void, glLightiv, (GLenum light, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glLineStipple, (GLint factor, GLushort pattern)) +ANT_GL_DECL(void, glLineWidth, (GLfloat width)) +ANT_GL_DECL(void, glListBase, (GLuint base)) +ANT_GL_DECL(void, glLoadIdentity, (void)) +ANT_GL_DECL(void, glLoadMatrixd, (const GLdouble *m)) +ANT_GL_DECL(void, glLoadMatrixf, (const GLfloat *m)) +ANT_GL_DECL(void, glLoadName, (GLuint name)) +ANT_GL_DECL(void, glLogicOp, (GLenum opcode)) +ANT_GL_DECL(void, glMap1d, (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)) +ANT_GL_DECL(void, glMap1f, (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)) +ANT_GL_DECL(void, glMap2d, (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)) +ANT_GL_DECL(void, glMap2f, (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)) +ANT_GL_DECL(void, glMapGrid1d, (GLint un, GLdouble u1, GLdouble u2)) +ANT_GL_DECL(void, glMapGrid1f, (GLint un, GLfloat u1, GLfloat u2)) +ANT_GL_DECL(void, glMapGrid2d, (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)) +ANT_GL_DECL(void, glMapGrid2f, (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)) +ANT_GL_DECL(void, glMaterialf, (GLenum face, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glMaterialfv, (GLenum face, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glMateriali, (GLenum face, GLenum pname, GLint param)) +ANT_GL_DECL(void, glMaterialiv, (GLenum face, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glMatrixMode, (GLenum mode)) +ANT_GL_DECL(void, glMultMatrixd, (const GLdouble *m)) +ANT_GL_DECL(void, glMultMatrixf, (const GLfloat *m)) +ANT_GL_DECL(void, glNewList, (GLuint list, GLenum mode)) +ANT_GL_DECL(void, glNormal3b, (GLbyte nx, GLbyte ny, GLbyte nz)) +ANT_GL_DECL(void, glNormal3bv, (const GLbyte *v)) +ANT_GL_DECL(void, glNormal3d, (GLdouble nx, GLdouble ny, GLdouble nz)) +ANT_GL_DECL(void, glNormal3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glNormal3f, (GLfloat nx, GLfloat ny, GLfloat nz)) +ANT_GL_DECL(void, glNormal3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glNormal3i, (GLint nx, GLint ny, GLint nz)) +ANT_GL_DECL(void, glNormal3iv, (const GLint *v)) +ANT_GL_DECL(void, glNormal3s, (GLshort nx, GLshort ny, GLshort nz)) +ANT_GL_DECL(void, glNormal3sv, (const GLshort *v)) +ANT_GL_DECL(void, glNormalPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glOrtho, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) +ANT_GL_DECL(void, glPassThrough, (GLfloat token)) +ANT_GL_DECL(void, glPixelMapfv, (GLenum map, GLsizei mapsize, const GLfloat *values)) +ANT_GL_DECL(void, glPixelMapuiv, (GLenum map, GLsizei mapsize, const GLuint *values)) +ANT_GL_DECL(void, glPixelMapusv, (GLenum map, GLsizei mapsize, const GLushort *values)) +ANT_GL_DECL(void, glPixelStoref, (GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glPixelStorei, (GLenum pname, GLint param)) +ANT_GL_DECL(void, glPixelTransferf, (GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glPixelTransferi, (GLenum pname, GLint param)) +ANT_GL_DECL(void, glPixelZoom, (GLfloat xfactor, GLfloat yfactor)) +ANT_GL_DECL(void, glPointSize, (GLfloat size)) +ANT_GL_DECL(void, glPolygonMode, (GLenum face, GLenum mode)) +ANT_GL_DECL(void, glPolygonOffset, (GLfloat factor, GLfloat units)) +ANT_GL_DECL(void, glPolygonStipple, (const GLubyte *mask)) +ANT_GL_DECL(void, glPopAttrib, (void)) +ANT_GL_DECL(void, glPopClientAttrib, (void)) +ANT_GL_DECL(void, glPopMatrix, (void)) +ANT_GL_DECL(void, glPopName, (void)) +ANT_GL_DECL(void, glPrioritizeTextures, (GLsizei n, const GLuint *textures, const GLclampf *priorities)) +ANT_GL_DECL(void, glPushAttrib, (GLbitfield mask)) +ANT_GL_DECL(void, glPushClientAttrib, (GLbitfield mask)) +ANT_GL_DECL(void, glPushMatrix, (void)) +ANT_GL_DECL(void, glPushName, (GLuint name)) +ANT_GL_DECL(void, glRasterPos2d, (GLdouble x, GLdouble y)) +ANT_GL_DECL(void, glRasterPos2dv, (const GLdouble *v)) +ANT_GL_DECL(void, glRasterPos2f, (GLfloat x, GLfloat y)) +ANT_GL_DECL(void, glRasterPos2fv, (const GLfloat *v)) +ANT_GL_DECL(void, glRasterPos2i, (GLint x, GLint y)) +ANT_GL_DECL(void, glRasterPos2iv, (const GLint *v)) +ANT_GL_DECL(void, glRasterPos2s, (GLshort x, GLshort y)) +ANT_GL_DECL(void, glRasterPos2sv, (const GLshort *v)) +ANT_GL_DECL(void, glRasterPos3d, (GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glRasterPos3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glRasterPos3f, (GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glRasterPos3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glRasterPos3i, (GLint x, GLint y, GLint z)) +ANT_GL_DECL(void, glRasterPos3iv, (const GLint *v)) +ANT_GL_DECL(void, glRasterPos3s, (GLshort x, GLshort y, GLshort z)) +ANT_GL_DECL(void, glRasterPos3sv, (const GLshort *v)) +ANT_GL_DECL(void, glRasterPos4d, (GLdouble x, GLdouble y, GLdouble z, GLdouble w)) +ANT_GL_DECL(void, glRasterPos4dv, (const GLdouble *v)) +ANT_GL_DECL(void, glRasterPos4f, (GLfloat x, GLfloat y, GLfloat z, GLfloat w)) +ANT_GL_DECL(void, glRasterPos4fv, (const GLfloat *v)) +ANT_GL_DECL(void, glRasterPos4i, (GLint x, GLint y, GLint z, GLint w)) +ANT_GL_DECL(void, glRasterPos4iv, (const GLint *v)) +ANT_GL_DECL(void, glRasterPos4s, (GLshort x, GLshort y, GLshort z, GLshort w)) +ANT_GL_DECL(void, glRasterPos4sv, (const GLshort *v)) +ANT_GL_DECL(void, glReadBuffer, (GLenum mode)) +ANT_GL_DECL(void, glReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)) +ANT_GL_DECL(void, glRectd, (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)) +ANT_GL_DECL(void, glRectdv, (const GLdouble *v1, const GLdouble *v2)) +ANT_GL_DECL(void, glRectf, (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)) +ANT_GL_DECL(void, glRectfv, (const GLfloat *v1, const GLfloat *v2)) +ANT_GL_DECL(void, glRecti, (GLint x1, GLint y1, GLint x2, GLint y2)) +ANT_GL_DECL(void, glRectiv, (const GLint *v1, const GLint *v2)) +ANT_GL_DECL(void, glRects, (GLshort x1, GLshort y1, GLshort x2, GLshort y2)) +ANT_GL_DECL(void, glRectsv, (const GLshort *v1, const GLshort *v2)) +ANT_GL_DECL(GLint, glRenderMode, (GLenum mode)) +ANT_GL_DECL(void, glRotated, (GLdouble angle, GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glRotatef, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glScaled, (GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glScalef, (GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glScissor, (GLint x, GLint y, GLsizei width, GLsizei height)) +ANT_GL_DECL(void, glSelectBuffer, (GLsizei size, GLuint *buffer)) +ANT_GL_DECL(void, glShadeModel, (GLenum mode)) +ANT_GL_DECL(void, glStencilFunc, (GLenum func, GLint ref, GLuint mask)) +ANT_GL_DECL(void, glStencilMask, (GLuint mask)) +ANT_GL_DECL(void, glStencilOp, (GLenum fail, GLenum zfail, GLenum zpass)) +ANT_GL_DECL(void, glTexCoord1d, (GLdouble s)) +ANT_GL_DECL(void, glTexCoord1dv, (const GLdouble *v)) +ANT_GL_DECL(void, glTexCoord1f, (GLfloat s)) +ANT_GL_DECL(void, glTexCoord1fv, (const GLfloat *v)) +ANT_GL_DECL(void, glTexCoord1i, (GLint s)) +ANT_GL_DECL(void, glTexCoord1iv, (const GLint *v)) +ANT_GL_DECL(void, glTexCoord1s, (GLshort s)) +ANT_GL_DECL(void, glTexCoord1sv, (const GLshort *v)) +ANT_GL_DECL(void, glTexCoord2d, (GLdouble s, GLdouble t)) +ANT_GL_DECL(void, glTexCoord2dv, (const GLdouble *v)) +ANT_GL_DECL(void, glTexCoord2f, (GLfloat s, GLfloat t)) +ANT_GL_DECL(void, glTexCoord2fv, (const GLfloat *v)) +ANT_GL_DECL(void, glTexCoord2i, (GLint s, GLint t)) +ANT_GL_DECL(void, glTexCoord2iv, (const GLint *v)) +ANT_GL_DECL(void, glTexCoord2s, (GLshort s, GLshort t)) +ANT_GL_DECL(void, glTexCoord2sv, (const GLshort *v)) +ANT_GL_DECL(void, glTexCoord3d, (GLdouble s, GLdouble t, GLdouble r)) +ANT_GL_DECL(void, glTexCoord3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glTexCoord3f, (GLfloat s, GLfloat t, GLfloat r)) +ANT_GL_DECL(void, glTexCoord3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glTexCoord3i, (GLint s, GLint t, GLint r)) +ANT_GL_DECL(void, glTexCoord3iv, (const GLint *v)) +ANT_GL_DECL(void, glTexCoord3s, (GLshort s, GLshort t, GLshort r)) +ANT_GL_DECL(void, glTexCoord3sv, (const GLshort *v)) +ANT_GL_DECL(void, glTexCoord4d, (GLdouble s, GLdouble t, GLdouble r, GLdouble q)) +ANT_GL_DECL(void, glTexCoord4dv, (const GLdouble *v)) +ANT_GL_DECL(void, glTexCoord4f, (GLfloat s, GLfloat t, GLfloat r, GLfloat q)) +ANT_GL_DECL(void, glTexCoord4fv, (const GLfloat *v)) +ANT_GL_DECL(void, glTexCoord4i, (GLint s, GLint t, GLint r, GLint q)) +ANT_GL_DECL(void, glTexCoord4iv, (const GLint *v)) +ANT_GL_DECL(void, glTexCoord4s, (GLshort s, GLshort t, GLshort r, GLshort q)) +ANT_GL_DECL(void, glTexCoord4sv, (const GLshort *v)) +ANT_GL_DECL(void, glTexCoordPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glTexEnvf, (GLenum target, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glTexEnvfv, (GLenum target, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glTexEnvi, (GLenum target, GLenum pname, GLint param)) +ANT_GL_DECL(void, glTexEnviv, (GLenum target, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glTexGend, (GLenum coord, GLenum pname, GLdouble param)) +ANT_GL_DECL(void, glTexGendv, (GLenum coord, GLenum pname, const GLdouble *params)) +ANT_GL_DECL(void, glTexGenf, (GLenum coord, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glTexGenfv, (GLenum coord, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glTexGeni, (GLenum coord, GLenum pname, GLint param)) +ANT_GL_DECL(void, glTexGeniv, (GLenum coord, GLenum pname, const GLint *params)) +#if defined(ANT_OSX) && (MAC_OS_X_VERSION_MAX_ALLOWED < 1070) +// Mac OSX < 10.7 redefines these OpenGL calls: glTexImage1D, glTexImage2D +ANT_GL_DECL(void, glTexImage1D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +#else +ANT_GL_DECL(void, glTexImage1D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glTexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +#endif +ANT_GL_DECL(void, glTexParameterf, (GLenum target, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glTexParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glTexParameteri, (GLenum target, GLenum pname, GLint param)) +ANT_GL_DECL(void, glTexParameteriv, (GLenum target, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glTranslated, (GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glTranslatef, (GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glVertex2d, (GLdouble x, GLdouble y)) +ANT_GL_DECL(void, glVertex2dv, (const GLdouble *v)) +ANT_GL_DECL(void, glVertex2f, (GLfloat x, GLfloat y)) +ANT_GL_DECL(void, glVertex2fv, (const GLfloat *v)) +ANT_GL_DECL(void, glVertex2i, (GLint x, GLint y)) +ANT_GL_DECL(void, glVertex2iv, (const GLint *v)) +ANT_GL_DECL(void, glVertex2s, (GLshort x, GLshort y)) +ANT_GL_DECL(void, glVertex2sv, (const GLshort *v)) +ANT_GL_DECL(void, glVertex3d, (GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glVertex3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glVertex3f, (GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glVertex3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glVertex3i, (GLint x, GLint y, GLint z)) +ANT_GL_DECL(void, glVertex3iv, (const GLint *v)) +ANT_GL_DECL(void, glVertex3s, (GLshort x, GLshort y, GLshort z)) +ANT_GL_DECL(void, glVertex3sv, (const GLshort *v)) +ANT_GL_DECL(void, glVertex4d, (GLdouble x, GLdouble y, GLdouble z, GLdouble w)) +ANT_GL_DECL(void, glVertex4dv, (const GLdouble *v)) +ANT_GL_DECL(void, glVertex4f, (GLfloat x, GLfloat y, GLfloat z, GLfloat w)) +ANT_GL_DECL(void, glVertex4fv, (const GLfloat *v)) +ANT_GL_DECL(void, glVertex4i, (GLint x, GLint y, GLint z, GLint w)) +ANT_GL_DECL(void, glVertex4iv, (const GLint *v)) +ANT_GL_DECL(void, glVertex4s, (GLshort x, GLshort y, GLshort z, GLshort w)) +ANT_GL_DECL(void, glVertex4sv, (const GLshort *v)) +ANT_GL_DECL(void, glVertexPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height)) + +#ifdef ANT_WINDOWS +ANT_GL_DECL(PROC, wglGetProcAddress, (LPCSTR)) +#endif + + +#endif // !defined ANT_LOAD_OGL_INCLUDED diff --git a/AntTweakBar/src/LoadOGLCore.cpp b/AntTweakBar/src/LoadOGLCore.cpp new file mode 100644 index 0000000..2daa573 --- /dev/null +++ b/AntTweakBar/src/LoadOGLCore.cpp @@ -0,0 +1,539 @@ +// --------------------------------------------------------------------------- +// +// @file LoadOGLCore.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "LoadOGLCore.h" + +// --------------------------------------------------------------------------- + +#define ANT_NB_OGL_CORE_FUNC_MAX 512 + +struct COGLCoreFuncRec +{ + const char * m_Name; + GLCore::PFNOpenGL * m_FuncPtr; + COGLCoreFuncRec() : m_Name(NULL), m_FuncPtr(NULL) {} +}; +COGLCoreFuncRec g_OGLCoreFuncRec[ANT_NB_OGL_CORE_FUNC_MAX]; +int g_NbOGLCoreFunc = 0; +#if defined(ANT_WINDOWS) +HMODULE g_OGLCoreModule = NULL; +#endif + +// --------------------------------------------------------------------------- + +// GL 1.0 +ANT_GL_CORE_IMPL(glCullFace) +ANT_GL_CORE_IMPL(glFrontFace) +ANT_GL_CORE_IMPL(glHint) +ANT_GL_CORE_IMPL(glLineWidth) +ANT_GL_CORE_IMPL(glPointSize) +ANT_GL_CORE_IMPL(glPolygonMode) +ANT_GL_CORE_IMPL(glScissor) +ANT_GL_CORE_IMPL(glTexParameterf) +ANT_GL_CORE_IMPL(glTexParameterfv) +ANT_GL_CORE_IMPL(glTexParameteri) +ANT_GL_CORE_IMPL(glTexParameteriv) +ANT_GL_CORE_IMPL(glTexImage1D) +ANT_GL_CORE_IMPL(glTexImage2D) +ANT_GL_CORE_IMPL(glDrawBuffer) +ANT_GL_CORE_IMPL(glClear) +ANT_GL_CORE_IMPL(glClearColor) +ANT_GL_CORE_IMPL(glClearStencil) +ANT_GL_CORE_IMPL(glClearDepth) +ANT_GL_CORE_IMPL(glStencilMask) +ANT_GL_CORE_IMPL(glColorMask) +ANT_GL_CORE_IMPL(glDepthMask) +ANT_GL_CORE_IMPL(glDisable) +ANT_GL_CORE_IMPL(glEnable) +ANT_GL_CORE_IMPL(glFinish) +ANT_GL_CORE_IMPL(glFlush) +ANT_GL_CORE_IMPL(glBlendFunc) +ANT_GL_CORE_IMPL(glLogicOp) +ANT_GL_CORE_IMPL(glStencilFunc) +ANT_GL_CORE_IMPL(glStencilOp) +ANT_GL_CORE_IMPL(glDepthFunc) +ANT_GL_CORE_IMPL(glPixelStoref) +ANT_GL_CORE_IMPL(glPixelStorei) +ANT_GL_CORE_IMPL(glReadBuffer) +ANT_GL_CORE_IMPL(glReadPixels) +ANT_GL_CORE_IMPL(glGetBooleanv) +ANT_GL_CORE_IMPL(glGetDoublev) +ANT_GL_CORE_IMPL(glGetError) +ANT_GL_CORE_IMPL(glGetFloatv) +ANT_GL_CORE_IMPL(glGetIntegerv) +ANT_GL_CORE_IMPL(glGetString) +ANT_GL_CORE_IMPL(glGetTexImage) +ANT_GL_CORE_IMPL(glGetTexParameterfv) +ANT_GL_CORE_IMPL(glGetTexParameteriv) +ANT_GL_CORE_IMPL(glGetTexLevelParameterfv) +ANT_GL_CORE_IMPL(glGetTexLevelParameteriv) +ANT_GL_CORE_IMPL(glIsEnabled) +ANT_GL_CORE_IMPL(glDepthRange) +ANT_GL_CORE_IMPL(glViewport) +// GL 1.1 +ANT_GL_CORE_IMPL(glDrawArrays) +ANT_GL_CORE_IMPL(glDrawElements) +ANT_GL_CORE_IMPL(glGetPointerv) +ANT_GL_CORE_IMPL(glPolygonOffset) +ANT_GL_CORE_IMPL(glCopyTexImage1D) +ANT_GL_CORE_IMPL(glCopyTexImage2D) +ANT_GL_CORE_IMPL(glCopyTexSubImage1D) +ANT_GL_CORE_IMPL(glCopyTexSubImage2D) +ANT_GL_CORE_IMPL(glTexSubImage1D) +ANT_GL_CORE_IMPL(glTexSubImage2D) +ANT_GL_CORE_IMPL(glBindTexture) +ANT_GL_CORE_IMPL(glDeleteTextures) +ANT_GL_CORE_IMPL(glGenTextures) +ANT_GL_CORE_IMPL(glIsTexture) +// GL 1.2 +ANT_GL_CORE_IMPL(glBlendColor) +ANT_GL_CORE_IMPL(glBlendEquation) +ANT_GL_CORE_IMPL(glDrawRangeElements) +ANT_GL_CORE_IMPL(glTexImage3D) +ANT_GL_CORE_IMPL(glTexSubImage3D) +ANT_GL_CORE_IMPL(glCopyTexSubImage3D) +// GL 1.3 +ANT_GL_CORE_IMPL(glActiveTexture) +ANT_GL_CORE_IMPL(glSampleCoverage) +ANT_GL_CORE_IMPL(glCompressedTexImage3D) +ANT_GL_CORE_IMPL(glCompressedTexImage2D) +ANT_GL_CORE_IMPL(glCompressedTexImage1D) +ANT_GL_CORE_IMPL(glCompressedTexSubImage3D) +ANT_GL_CORE_IMPL(glCompressedTexSubImage2D) +ANT_GL_CORE_IMPL(glCompressedTexSubImage1D) +ANT_GL_CORE_IMPL(glGetCompressedTexImage) +// GL 1.4 +ANT_GL_CORE_IMPL(glBlendFuncSeparate) +ANT_GL_CORE_IMPL(glMultiDrawArrays) +ANT_GL_CORE_IMPL(glMultiDrawElements) +ANT_GL_CORE_IMPL(glPointParameterf) +ANT_GL_CORE_IMPL(glPointParameterfv) +ANT_GL_CORE_IMPL(glPointParameteri) +ANT_GL_CORE_IMPL(glPointParameteriv) +// GL 1.5 +ANT_GL_CORE_IMPL(glGenQueries) +ANT_GL_CORE_IMPL(glDeleteQueries) +ANT_GL_CORE_IMPL(glIsQuery) +ANT_GL_CORE_IMPL(glBeginQuery) +ANT_GL_CORE_IMPL(glEndQuery) +ANT_GL_CORE_IMPL(glGetQueryiv) +ANT_GL_CORE_IMPL(glGetQueryObjectiv) +ANT_GL_CORE_IMPL(glGetQueryObjectuiv) +ANT_GL_CORE_IMPL(glBindBuffer) +ANT_GL_CORE_IMPL(glDeleteBuffers) +ANT_GL_CORE_IMPL(glGenBuffers) +ANT_GL_CORE_IMPL(glIsBuffer) +ANT_GL_CORE_IMPL(glBufferData) +ANT_GL_CORE_IMPL(glBufferSubData) +ANT_GL_CORE_IMPL(glGetBufferSubData) +ANT_GL_CORE_IMPL(glMapBuffer) +ANT_GL_CORE_IMPL(glUnmapBuffer) +ANT_GL_CORE_IMPL(glGetBufferParameteriv) +ANT_GL_CORE_IMPL(glGetBufferPointerv) +// GL 2.0 +ANT_GL_CORE_IMPL(glBlendEquationSeparate) +ANT_GL_CORE_IMPL(glDrawBuffers) +ANT_GL_CORE_IMPL(glStencilOpSeparate) +ANT_GL_CORE_IMPL(glStencilFuncSeparate) +ANT_GL_CORE_IMPL(glStencilMaskSeparate) +ANT_GL_CORE_IMPL(glAttachShader) +ANT_GL_CORE_IMPL(glBindAttribLocation) +ANT_GL_CORE_IMPL(glCompileShader) +ANT_GL_CORE_IMPL(glCreateProgram) +ANT_GL_CORE_IMPL(glCreateShader) +ANT_GL_CORE_IMPL(glDeleteProgram) +ANT_GL_CORE_IMPL(glDeleteShader) +ANT_GL_CORE_IMPL(glDetachShader) +ANT_GL_CORE_IMPL(glDisableVertexAttribArray) +ANT_GL_CORE_IMPL(glEnableVertexAttribArray) +ANT_GL_CORE_IMPL(glGetActiveAttrib) +ANT_GL_CORE_IMPL(glGetActiveUniform) +ANT_GL_CORE_IMPL(glGetAttachedShaders) +ANT_GL_CORE_IMPL(glGetAttribLocation) +ANT_GL_CORE_IMPL(glGetProgramiv) +ANT_GL_CORE_IMPL(glGetProgramInfoLog) +ANT_GL_CORE_IMPL(glGetShaderiv) +ANT_GL_CORE_IMPL(glGetShaderInfoLog) +ANT_GL_CORE_IMPL(glGetShaderSource) +ANT_GL_CORE_IMPL(glGetUniformLocation) +ANT_GL_CORE_IMPL(glGetUniformfv) +ANT_GL_CORE_IMPL(glGetUniformiv) +ANT_GL_CORE_IMPL(glGetVertexAttribdv) +ANT_GL_CORE_IMPL(glGetVertexAttribfv) +ANT_GL_CORE_IMPL(glGetVertexAttribiv) +ANT_GL_CORE_IMPL(glGetVertexAttribPointerv) +ANT_GL_CORE_IMPL(glIsProgram) +ANT_GL_CORE_IMPL(glIsShader) +ANT_GL_CORE_IMPL(glLinkProgram) +ANT_GL_CORE_IMPL(glShaderSource) +ANT_GL_CORE_IMPL(glUseProgram) +ANT_GL_CORE_IMPL(glUniform1f) +ANT_GL_CORE_IMPL(glUniform2f) +ANT_GL_CORE_IMPL(glUniform3f) +ANT_GL_CORE_IMPL(glUniform4f) +ANT_GL_CORE_IMPL(glUniform1i) +ANT_GL_CORE_IMPL(glUniform2i) +ANT_GL_CORE_IMPL(glUniform3i) +ANT_GL_CORE_IMPL(glUniform4i) +ANT_GL_CORE_IMPL(glUniform1fv) +ANT_GL_CORE_IMPL(glUniform2fv) +ANT_GL_CORE_IMPL(glUniform3fv) +ANT_GL_CORE_IMPL(glUniform4fv) +ANT_GL_CORE_IMPL(glUniform1iv) +ANT_GL_CORE_IMPL(glUniform2iv) +ANT_GL_CORE_IMPL(glUniform3iv) +ANT_GL_CORE_IMPL(glUniform4iv) +ANT_GL_CORE_IMPL(glUniformMatrix2fv) +ANT_GL_CORE_IMPL(glUniformMatrix3fv) +ANT_GL_CORE_IMPL(glUniformMatrix4fv) +ANT_GL_CORE_IMPL(glValidateProgram) +ANT_GL_CORE_IMPL(glVertexAttrib1d) +ANT_GL_CORE_IMPL(glVertexAttrib1dv) +ANT_GL_CORE_IMPL(glVertexAttrib1f) +ANT_GL_CORE_IMPL(glVertexAttrib1fv) +ANT_GL_CORE_IMPL(glVertexAttrib1s) +ANT_GL_CORE_IMPL(glVertexAttrib1sv) +ANT_GL_CORE_IMPL(glVertexAttrib2d) +ANT_GL_CORE_IMPL(glVertexAttrib2dv) +ANT_GL_CORE_IMPL(glVertexAttrib2f) +ANT_GL_CORE_IMPL(glVertexAttrib2fv) +ANT_GL_CORE_IMPL(glVertexAttrib2s) +ANT_GL_CORE_IMPL(glVertexAttrib2sv) +ANT_GL_CORE_IMPL(glVertexAttrib3d) +ANT_GL_CORE_IMPL(glVertexAttrib3dv) +ANT_GL_CORE_IMPL(glVertexAttrib3f) +ANT_GL_CORE_IMPL(glVertexAttrib3fv) +ANT_GL_CORE_IMPL(glVertexAttrib3s) +ANT_GL_CORE_IMPL(glVertexAttrib3sv) +ANT_GL_CORE_IMPL(glVertexAttrib4Nbv) +ANT_GL_CORE_IMPL(glVertexAttrib4Niv) +ANT_GL_CORE_IMPL(glVertexAttrib4Nsv) +ANT_GL_CORE_IMPL(glVertexAttrib4Nub) +ANT_GL_CORE_IMPL(glVertexAttrib4Nubv) +ANT_GL_CORE_IMPL(glVertexAttrib4Nuiv) +ANT_GL_CORE_IMPL(glVertexAttrib4Nusv) +ANT_GL_CORE_IMPL(glVertexAttrib4bv) +ANT_GL_CORE_IMPL(glVertexAttrib4d) +ANT_GL_CORE_IMPL(glVertexAttrib4dv) +ANT_GL_CORE_IMPL(glVertexAttrib4f) +ANT_GL_CORE_IMPL(glVertexAttrib4fv) +ANT_GL_CORE_IMPL(glVertexAttrib4iv) +ANT_GL_CORE_IMPL(glVertexAttrib4s) +ANT_GL_CORE_IMPL(glVertexAttrib4sv) +ANT_GL_CORE_IMPL(glVertexAttrib4ubv) +ANT_GL_CORE_IMPL(glVertexAttrib4uiv) +ANT_GL_CORE_IMPL(glVertexAttrib4usv) +ANT_GL_CORE_IMPL(glVertexAttribPointer) +/* +// GL 2.1 +ANT_GL_CORE_IMPL(glUniformMatrix2x3fv) +ANT_GL_CORE_IMPL(glUniformMatrix3x2fv) +ANT_GL_CORE_IMPL(glUniformMatrix2x4fv) +ANT_GL_CORE_IMPL(glUniformMatrix4x2fv) +ANT_GL_CORE_IMPL(glUniformMatrix3x4fv) +ANT_GL_CORE_IMPL(glUniformMatrix4x3fv) +// GL 3.0 +ANT_GL_CORE_IMPL(glColorMaski) +ANT_GL_CORE_IMPL(glGetBooleani_v) +ANT_GL_CORE_IMPL(glGetIntegeri_v) +ANT_GL_CORE_IMPL(glEnablei) +ANT_GL_CORE_IMPL(glDisablei) +ANT_GL_CORE_IMPL(glIsEnabledi) +ANT_GL_CORE_IMPL(glBeginTransformFeedback) +ANT_GL_CORE_IMPL(glEndTransformFeedback) +ANT_GL_CORE_IMPL(glBindBufferRange) +ANT_GL_CORE_IMPL(glBindBufferBase) +ANT_GL_CORE_IMPL(glTransformFeedbackVaryings) +ANT_GL_CORE_IMPL(glGetTransformFeedbackVarying) +ANT_GL_CORE_IMPL(glClampColor) +ANT_GL_CORE_IMPL(glBeginConditionalRender) +ANT_GL_CORE_IMPL(glEndConditionalRender) +ANT_GL_CORE_IMPL(glVertexAttribIPointer) +ANT_GL_CORE_IMPL(glGetVertexAttribIiv) +ANT_GL_CORE_IMPL(glGetVertexAttribIuiv) +ANT_GL_CORE_IMPL(glVertexAttribI1i) +ANT_GL_CORE_IMPL(glVertexAttribI2i) +ANT_GL_CORE_IMPL(glVertexAttribI3i) +ANT_GL_CORE_IMPL(glVertexAttribI4i) +ANT_GL_CORE_IMPL(glVertexAttribI1ui) +ANT_GL_CORE_IMPL(glVertexAttribI2ui) +ANT_GL_CORE_IMPL(glVertexAttribI3ui) +ANT_GL_CORE_IMPL(glVertexAttribI4ui) +ANT_GL_CORE_IMPL(glVertexAttribI1iv) +ANT_GL_CORE_IMPL(glVertexAttribI2iv) +ANT_GL_CORE_IMPL(glVertexAttribI3iv) +ANT_GL_CORE_IMPL(glVertexAttribI4iv) +ANT_GL_CORE_IMPL(glVertexAttribI1uiv) +ANT_GL_CORE_IMPL(glVertexAttribI2uiv) +ANT_GL_CORE_IMPL(glVertexAttribI3uiv) +ANT_GL_CORE_IMPL(glVertexAttribI4uiv) +ANT_GL_CORE_IMPL(glVertexAttribI4bv) +ANT_GL_CORE_IMPL(glVertexAttribI4sv) +ANT_GL_CORE_IMPL(glVertexAttribI4ubv) +ANT_GL_CORE_IMPL(glVertexAttribI4usv) +ANT_GL_CORE_IMPL(glGetUniformuiv) +ANT_GL_CORE_IMPL(glBindFragDataLocation) +ANT_GL_CORE_IMPL(glGetFragDataLocation) +ANT_GL_CORE_IMPL(glUniform1ui) +ANT_GL_CORE_IMPL(glUniform2ui) +ANT_GL_CORE_IMPL(glUniform3ui) +ANT_GL_CORE_IMPL(glUniform4ui) +ANT_GL_CORE_IMPL(glUniform1uiv) +ANT_GL_CORE_IMPL(glUniform2uiv) +ANT_GL_CORE_IMPL(glUniform3uiv) +ANT_GL_CORE_IMPL(glUniform4uiv) +ANT_GL_CORE_IMPL(glTexParameterIiv) +ANT_GL_CORE_IMPL(glTexParameterIuiv) +ANT_GL_CORE_IMPL(glGetTexParameterIiv) +ANT_GL_CORE_IMPL(glGetTexParameterIuiv) +ANT_GL_CORE_IMPL(glClearBufferiv) +ANT_GL_CORE_IMPL(glClearBufferuiv) +ANT_GL_CORE_IMPL(glClearBufferfv) +ANT_GL_CORE_IMPL(glClearBufferfi) +ANT_GL_CORE_IMPL(glGetStringi) +// GL 3.1 +ANT_GL_CORE_IMPL(glDrawArraysInstanced) +ANT_GL_CORE_IMPL(glDrawElementsInstanced) +ANT_GL_CORE_IMPL(glTexBuffer) +ANT_GL_CORE_IMPL(glPrimitiveRestartIndex) +// GL 3.2 +//ANT_GL_CORE_IMPL(glGetInteger64i_v) +//ANT_GL_CORE_IMPL(glGetBufferParameteri64v) +ANT_GL_CORE_IMPL(glFramebufferTexture) +*/ + +// GL_ARB_vertex_array_object +#if defined(ANT_WINDOWS) + ANT_GL_CORE_IMPL(glBindVertexArray) + ANT_GL_CORE_IMPL(glDeleteVertexArrays) + ANT_GL_CORE_IMPL(glGenVertexArrays) + ANT_GL_CORE_IMPL(glIsVertexArray) +#else + // these extensions are loaded explicitely by LoadOpenGLCore + // because they may not be avialable on non-OpenGL 3.2 environments + namespace GLCore + { + PFNglBindVertexArray _glBindVertexArray = NULL; + PFNglDeleteVertexArrays _glDeleteVertexArrays = NULL; + PFNglGenVertexArrays _glGenVertexArrays = NULL; + PFNglIsVertexArray _glIsVertexArray = NULL; + } +#endif + +#if defined(ANT_WINDOWS) + ANT_GL_CORE_IMPL(wglGetProcAddress) +#endif + +namespace GLCore { PFNGLGetProcAddress _glGetProcAddress = NULL; } + +// --------------------------------------------------------------------------- + +#if defined(ANT_WINDOWS) + + // --------------------------------------------------------------------------- + + int LoadOpenGLCore() + { + if( g_OGLCoreModule!=NULL ) + { + return 1; // "OpenGL library already loaded" + } + + g_OGLCoreModule = LoadLibrary("OPENGL32.DLL"); + if( g_OGLCoreModule ) + { + // Info(VERB_LOW, "Load %d OpenGL Core functions", g_NbOGLCoreFunc); + + int Res = 1; + + // Use wglGetProcAddress to retreive Core functions + _glGetProcAddress = reinterpret_cast(GetProcAddress(g_OGLCoreModule, "wglGetProcAddress")); + if( _glGetProcAddress!=NULL ) + for(int i=0; i0); + // Try to get the function pointer with wglGetProcAddress + *(g_OGLCoreFuncRec[i].m_FuncPtr) = reinterpret_cast(_glGetProcAddress(g_OGLCoreFuncRec[i].m_Name)); + if( *(g_OGLCoreFuncRec[i].m_FuncPtr)==NULL ) + { + // Try to get the function pointer with GetProcAddress + *(g_OGLCoreFuncRec[i].m_FuncPtr) = reinterpret_cast(GetProcAddress(g_OGLCoreModule, g_OGLCoreFuncRec[i].m_Name)); + if( *(g_OGLCoreFuncRec[i].m_FuncPtr)==NULL ) + { + #ifdef _DEBUG + fprintf(stderr, "AntTweakBar: Cannot load function %s\n", g_OGLCoreFuncRec[i].m_Name); + #endif + Res = 0; // Error("cannot find OpenGL Core function"); + } + } + + } + + return Res; + } + else + { + // InternDisplayLastErrorWIN("Cannot load opengl32 DLL", false); + return 0; // cannot load DLL + } + } + + // --------------------------------------------------------------------------- + + int UnloadOpenGLCore() + { + if( g_OGLCoreModule==NULL ) + { + return 1; // "OpenGL library not loaded" + } + + // Info(VERB_LOW, "Unload %d OpenGL Core functions", g_NbOGLCoreFunc); + for(int i=0; i0); + *(g_OGLCoreFuncRec[i].m_FuncPtr) = NULL; + } + if( FreeLibrary(g_OGLCoreModule) ) + { + // Info(VERB_LOW, "OpenGL library unloaded"); + g_OGLCoreModule = NULL; + return 1; + } + else + { + // InternDisplayLastErrorWIN("Cannot unload opengl32 DLL", false); + return 0; // cannot unload opengl32.dll + } + } + + // --------------------------------------------------------------------------- + + namespace GLCore + { + + PFNOpenGL Record(const char *_FuncName, PFNOpenGL *_FuncPtr) + { + if( g_NbOGLCoreFunc>=ANT_NB_OGL_CORE_FUNC_MAX ) + { + fprintf(stderr, "Too many OpenGL Core functions declared. Change ANT_NB_OGL_CORE_FUNC_MAX."); + exit(-1); + } + + g_OGLCoreFuncRec[g_NbOGLCoreFunc].m_Name = _FuncName; + g_OGLCoreFuncRec[g_NbOGLCoreFunc].m_FuncPtr = _FuncPtr; + ++g_NbOGLCoreFunc; + + return NULL; + } + + } // namespace GL + + // --------------------------------------------------------------------------- + +#endif // defined(ANT_WINDOWS) + +// --------------------------------------------------------------------------- + +#if defined(ANT_UNIX) + + int LoadOpenGLCore() + { + _glGetProcAddress = reinterpret_cast(glXGetProcAddressARB); + + _glBindVertexArray = reinterpret_cast(_glGetProcAddress("glBindVertexArray")); + _glDeleteVertexArrays = reinterpret_cast(_glGetProcAddress("glDeleteVertexArrays")); + _glGenVertexArrays = reinterpret_cast(_glGetProcAddress("glGenVertexArrays")); + _glIsVertexArray = reinterpret_cast(_glGetProcAddress("glIsVertexArray")); + + if( _glBindVertexArray==NULL || _glDeleteVertexArrays==NULL || _glGenVertexArrays==NULL || _glIsVertexArray==NULL ) + { + fprintf(stderr, "AntTweakBar: OpenGL Core Profile functions cannot be loaded.\n"); + return 0; + } + else + return 1; + } + + int UnloadOpenGLCore() + { + return 1; + } + +#elif defined(ANT_OSX) + + #include + + static void *gl_dyld = NULL; + static const char *gl_prefix = "_"; + void *NSGLCoreGetProcAddressNew(const GLubyte *name) + { + void *proc=NULL; + if (gl_dyld == NULL) + { + gl_dyld = dlopen("OpenGL",RTLD_LAZY); + } + if (gl_dyld) + { + NSString *sym = [[NSString alloc] initWithFormat: @"%s%s",gl_prefix,name]; + proc = dlsym(gl_dyld,[sym UTF8String]); + [sym release]; + } + return proc; + } + + int LoadOpenGLCore() + { + _glGetProcAddress = reinterpret_cast(NSGLCoreGetProcAddressNew); + + _glBindVertexArray = reinterpret_cast(_glGetProcAddress("glBindVertexArray")); + _glDeleteVertexArrays = reinterpret_cast(_glGetProcAddress("glDeleteVertexArrays")); + _glGenVertexArrays = reinterpret_cast(_glGetProcAddress("glGenVertexArrays")); + _glIsVertexArray = reinterpret_cast(_glGetProcAddress("glIsVertexArray")); + + if( _glBindVertexArray==NULL || _glDeleteVertexArrays==NULL || _glGenVertexArrays==NULL || _glIsVertexArray==NULL ) + { + // remove the symbols underscore prefix (OSX 10.7 and later) + gl_prefix = ""; + + _glBindVertexArray = reinterpret_cast(_glGetProcAddress("glBindVertexArray")); + _glDeleteVertexArrays = reinterpret_cast(_glGetProcAddress("glDeleteVertexArrays")); + _glGenVertexArrays = reinterpret_cast(_glGetProcAddress("glGenVertexArrays")); + _glIsVertexArray = reinterpret_cast(_glGetProcAddress("glIsVertexArray")); + + if( _glBindVertexArray==NULL || _glDeleteVertexArrays==NULL || _glGenVertexArrays==NULL || _glIsVertexArray==NULL ) + { + fprintf(stderr, "AntTweakBar: OpenGL Core Profile functions cannot be loaded.\n"); + return 0; + } + } + + return 1; + } + + int UnloadOpenGLCore() + { + if (gl_dyld) + { + dlclose(gl_dyld); + gl_dyld = NULL; + } + return 1; + } + +#endif + +// --------------------------------------------------------------------------- diff --git a/AntTweakBar/src/LoadOGLCore.h b/AntTweakBar/src/LoadOGLCore.h new file mode 100644 index 0000000..8aaab1e --- /dev/null +++ b/AntTweakBar/src/LoadOGLCore.h @@ -0,0 +1,403 @@ +// --------------------------------------------------------------------------- +// +// @file LoadOGLCore.h +// @brief OpenGL Core Profile declarations for dynamic loading +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_LOAD_OGL_CORE_INCLUDED +#define ANT_LOAD_OGL_CORE_INCLUDED + + +#define ANT_GL_CORE_DECL_NO_FORWARD(_Ret, _Fct, _Params) \ + extern "C" { typedef _Ret (APIENTRY* PFN##_Fct)_Params; } \ + namespace GLCore { extern PFN##_Fct _##_Fct; } \ + using GLCore::_##_Fct; + +#if defined(ANT_WINDOWS) +# define ANT_GL_CORE_DECL(_Ret, _Fct, _Params) \ + ANT_GL_CORE_DECL_NO_FORWARD(_Ret, _Fct, _Params) +# define ANT_GL_CORE_IMPL(_Fct) \ + namespace GLCore { PFN##_Fct _##_Fct = (PFN##_Fct)Record(#_Fct, (PFNOpenGL*)(&_##_Fct)); } +#elif defined(ANT_UNIX) || defined(ANT_OSX) +# if !defined(APIENTRY) +# define APIENTRY +# endif +# define ANT_GL_CORE_DECL(_Ret, _Fct, _Params) \ + ANT_GL_CORE_DECL_NO_FORWARD(_Ret, _Fct, _Params) \ + extern "C" { _Ret APIENTRY _Fct _Params; } +# define ANT_GL_CORE_IMPL(_Fct) \ + namespace GLCore { PFN##_Fct _##_Fct = _Fct; } +#endif + + +int LoadOpenGLCore(); +int UnloadOpenGLCore(); + +namespace GLCore +{ + extern "C" { typedef void (APIENTRY* PFNOpenGL)(); } + PFNOpenGL Record(const char *_FuncName, PFNOpenGL *_FuncPtr); + + extern "C" { typedef PFNOpenGL (APIENTRY *PFNGLGetProcAddress)(const char *); } + extern PFNGLGetProcAddress _glGetProcAddress; +} +using GLCore::_glGetProcAddress; + + +// GL 1.0 +ANT_GL_CORE_DECL(void, glCullFace, (GLenum mode)) +ANT_GL_CORE_DECL(void, glFrontFace, (GLenum mode)) +ANT_GL_CORE_DECL(void, glHint, (GLenum target, GLenum mode)) +ANT_GL_CORE_DECL(void, glLineWidth, (GLfloat width)) +ANT_GL_CORE_DECL(void, glPointSize, (GLfloat size)) +ANT_GL_CORE_DECL(void, glPolygonMode, (GLenum face, GLenum mode)) +ANT_GL_CORE_DECL(void, glScissor, (GLint x, GLint y, GLsizei width, GLsizei height)) +ANT_GL_CORE_DECL(void, glTexParameterf, (GLenum target, GLenum pname, GLfloat param)) +ANT_GL_CORE_DECL(void, glTexParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) +ANT_GL_CORE_DECL(void, glTexParameteri, (GLenum target, GLenum pname, GLint param)) +ANT_GL_CORE_DECL(void, glTexParameteriv, (GLenum target, GLenum pname, const GLint *params)) +#if defined(ANT_OSX) && (MAC_OS_X_VERSION_MAX_ALLOWED < 1070) +// Mac OSX < 10.7 redefines these OpenGL calls: glTexImage1D, glTexImage2D +ANT_GL_CORE_DECL(void, glTexImage1D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_CORE_DECL(void, glTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +#else +ANT_GL_CORE_DECL(void, glTexImage1D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_CORE_DECL(void, glTexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +#endif +ANT_GL_CORE_DECL(void, glDrawBuffer, (GLenum mode)) +ANT_GL_CORE_DECL(void, glClear, (GLbitfield mask)) +ANT_GL_CORE_DECL(void, glClearColor, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)) +ANT_GL_CORE_DECL(void, glClearStencil, (GLint s)) +ANT_GL_CORE_DECL(void, glClearDepth, (GLclampd depth)) +ANT_GL_CORE_DECL(void, glStencilMask, (GLuint mask)) +ANT_GL_CORE_DECL(void, glColorMask, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)) +ANT_GL_CORE_DECL(void, glDepthMask, (GLboolean flag)) +ANT_GL_CORE_DECL(void, glDisable, (GLenum cap)) +ANT_GL_CORE_DECL(void, glEnable, (GLenum cap)) +ANT_GL_CORE_DECL(void, glFinish, (void)) +ANT_GL_CORE_DECL(void, glFlush, (void)) +ANT_GL_CORE_DECL(void, glBlendFunc, (GLenum sfactor, GLenum dfactor)) +ANT_GL_CORE_DECL(void, glLogicOp, (GLenum opcode)) +ANT_GL_CORE_DECL(void, glStencilFunc, (GLenum func, GLint ref, GLuint mask)) +ANT_GL_CORE_DECL(void, glStencilOp, (GLenum fail, GLenum zfail, GLenum zpass)) +ANT_GL_CORE_DECL(void, glDepthFunc, (GLenum func)) +ANT_GL_CORE_DECL(void, glPixelStoref, (GLenum pname, GLfloat param)) +ANT_GL_CORE_DECL(void, glPixelStorei, (GLenum pname, GLint param)) +ANT_GL_CORE_DECL(void, glReadBuffer, (GLenum mode)) +ANT_GL_CORE_DECL(void, glReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)) +ANT_GL_CORE_DECL(void, glGetBooleanv, (GLenum pname, GLboolean *params)) +ANT_GL_CORE_DECL(void, glGetDoublev, (GLenum pname, GLdouble *params)) +ANT_GL_CORE_DECL(GLenum, glGetError, (void)) +ANT_GL_CORE_DECL(void, glGetFloatv, (GLenum pname, GLfloat *params)) +ANT_GL_CORE_DECL(void, glGetIntegerv, (GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(const GLubyte *, glGetString, (GLenum name)) +ANT_GL_CORE_DECL(void, glGetTexImage, (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)) +ANT_GL_CORE_DECL(void, glGetTexParameterfv, (GLenum target, GLenum pname, GLfloat *params)) +ANT_GL_CORE_DECL(void, glGetTexParameteriv, (GLenum target, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetTexLevelParameterfv, (GLenum target, GLint level, GLenum pname, GLfloat *params)) +ANT_GL_CORE_DECL(void, glGetTexLevelParameteriv, (GLenum target, GLint level, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(GLboolean, glIsEnabled, (GLenum cap)) +ANT_GL_CORE_DECL(void, glDepthRange, (GLclampd near, GLclampd far)) +ANT_GL_CORE_DECL(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height)) +// GL 1.1 +ANT_GL_CORE_DECL(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count)) +ANT_GL_CORE_DECL(void, glDrawElements, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)) +ANT_GL_CORE_DECL(void, glGetPointerv, (GLenum pname, GLvoid* *params)) +ANT_GL_CORE_DECL(void, glPolygonOffset, (GLfloat factor, GLfloat units)) +ANT_GL_CORE_DECL(void, glCopyTexImage1D, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)) +ANT_GL_CORE_DECL(void, glCopyTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)) +ANT_GL_CORE_DECL(void, glCopyTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)) +ANT_GL_CORE_DECL(void, glCopyTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) +ANT_GL_CORE_DECL(void, glTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_CORE_DECL(void, glTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_CORE_DECL(void, glBindTexture, (GLenum target, GLuint texture)) +ANT_GL_CORE_DECL(void, glDeleteTextures, (GLsizei n, const GLuint *textures)) +ANT_GL_CORE_DECL(void, glGenTextures, (GLsizei n, GLuint *textures)) +ANT_GL_CORE_DECL(GLboolean, glIsTexture, (GLuint texture)) +// GL 1.2 +ANT_GL_CORE_DECL(void, glBlendColor, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)) +ANT_GL_CORE_DECL(void, glBlendEquation, (GLenum mode)) +ANT_GL_CORE_DECL(void, glDrawRangeElements, (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)) +#if defined(ANT_OSX) && (MAC_OS_X_VERSION_MAX_ALLOWED < 1070) +// Mac OSX < 10.7 redefines this OpenGL call: glTexImage3D +ANT_GL_CORE_DECL(void, glTexImage3D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +#else +ANT_GL_CORE_DECL(void, glTexImage3D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +#endif +ANT_GL_CORE_DECL(void, glTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_CORE_DECL(void, glCopyTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)) +// GL 1.3 +ANT_GL_CORE_DECL(void, glActiveTexture, (GLenum texture)) +ANT_GL_CORE_DECL(void, glSampleCoverage, (GLclampf value, GLboolean invert)) +ANT_GL_CORE_DECL(void, glCompressedTexImage3D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)) +ANT_GL_CORE_DECL(void, glCompressedTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)) +ANT_GL_CORE_DECL(void, glCompressedTexImage1D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)) +ANT_GL_CORE_DECL(void, glCompressedTexSubImage3D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)) +ANT_GL_CORE_DECL(void, glCompressedTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)) +ANT_GL_CORE_DECL(void, glCompressedTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)) +ANT_GL_CORE_DECL(void, glGetCompressedTexImage, (GLenum target, GLint level, GLvoid *img)) +// GL 1.4 +ANT_GL_CORE_DECL(void, glBlendFuncSeparate, (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)) +ANT_GL_CORE_DECL(void, glMultiDrawArrays, (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount)) +ANT_GL_CORE_DECL(void, glMultiDrawElements, (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount)) +ANT_GL_CORE_DECL(void, glPointParameterf, (GLenum pname, GLfloat param)) +ANT_GL_CORE_DECL(void, glPointParameterfv, (GLenum pname, const GLfloat *params)) +ANT_GL_CORE_DECL(void, glPointParameteri, (GLenum pname, GLint param)) +ANT_GL_CORE_DECL(void, glPointParameteriv, (GLenum pname, const GLint *params)) +// GL 1.5 +#ifndef ANT_OSX + typedef ptrdiff_t GLintptr; + typedef ptrdiff_t GLsizeiptr; +#endif +ANT_GL_CORE_DECL(void, glGenQueries, (GLsizei n, GLuint *ids)) +ANT_GL_CORE_DECL(void, glDeleteQueries, (GLsizei n, const GLuint *ids)) +ANT_GL_CORE_DECL(GLboolean, glIsQuery, (GLuint id)) +ANT_GL_CORE_DECL(void, glBeginQuery, (GLenum target, GLuint id)) +ANT_GL_CORE_DECL(void, glEndQuery, (GLenum target)) +ANT_GL_CORE_DECL(void, glGetQueryiv, (GLenum target, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetQueryObjectiv, (GLuint id, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetQueryObjectuiv, (GLuint id, GLenum pname, GLuint *params)) +ANT_GL_CORE_DECL(void, glBindBuffer, (GLenum target, GLuint buffer)) +ANT_GL_CORE_DECL(void, glDeleteBuffers, (GLsizei n, const GLuint *buffers)) +ANT_GL_CORE_DECL(void, glGenBuffers, (GLsizei n, GLuint *buffers)) +ANT_GL_CORE_DECL(GLboolean, glIsBuffer, (GLuint buffer)) +ANT_GL_CORE_DECL(void, glBufferData, (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)) +ANT_GL_CORE_DECL(void, glBufferSubData, (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)) +ANT_GL_CORE_DECL(void, glGetBufferSubData, (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)) +ANT_GL_CORE_DECL(GLvoid*, glMapBuffer, (GLenum target, GLenum access)) +ANT_GL_CORE_DECL(GLboolean, glUnmapBuffer, (GLenum target)) +ANT_GL_CORE_DECL(void, glGetBufferParameteriv, (GLenum target, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetBufferPointerv, (GLenum target, GLenum pname, GLvoid* *params)) +// GL 2.0 +typedef char GLchar; +ANT_GL_CORE_DECL(void, glBlendEquationSeparate, (GLenum modeRGB, GLenum modeAlpha)) +ANT_GL_CORE_DECL(void, glDrawBuffers, (GLsizei n, const GLenum *bufs)) +ANT_GL_CORE_DECL(void, glStencilOpSeparate, (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)) +ANT_GL_CORE_DECL(void, glStencilFuncSeparate, (GLenum face, GLenum func, GLint ref, GLuint mask)) +ANT_GL_CORE_DECL(void, glStencilMaskSeparate, (GLenum face, GLuint mask)) +ANT_GL_CORE_DECL(void, glAttachShader, (GLuint program, GLuint shader)) +ANT_GL_CORE_DECL(void, glBindAttribLocation, (GLuint program, GLuint index, const GLchar *name)) +ANT_GL_CORE_DECL(void, glCompileShader, (GLuint shader)) +ANT_GL_CORE_DECL(GLuint, glCreateProgram, (void)) +ANT_GL_CORE_DECL(GLuint, glCreateShader, (GLenum type)) +ANT_GL_CORE_DECL(void, glDeleteProgram, (GLuint program)) +ANT_GL_CORE_DECL(void, glDeleteShader, (GLuint shader)) +ANT_GL_CORE_DECL(void, glDetachShader, (GLuint program, GLuint shader)) +ANT_GL_CORE_DECL(void, glDisableVertexAttribArray, (GLuint index)) +ANT_GL_CORE_DECL(void, glEnableVertexAttribArray, (GLuint index)) +ANT_GL_CORE_DECL(void, glGetActiveAttrib, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)) +ANT_GL_CORE_DECL(void, glGetActiveUniform, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)) +ANT_GL_CORE_DECL(void, glGetAttachedShaders, (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)) +ANT_GL_CORE_DECL(GLint, glGetAttribLocation, (GLuint program, const GLchar *name)) +ANT_GL_CORE_DECL(void, glGetProgramiv, (GLuint program, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetProgramInfoLog, (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)) +ANT_GL_CORE_DECL(void, glGetShaderiv, (GLuint shader, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetShaderInfoLog, (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)) +ANT_GL_CORE_DECL(void, glGetShaderSource, (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)) +ANT_GL_CORE_DECL(GLint, glGetUniformLocation, (GLuint program, const GLchar *name)) +ANT_GL_CORE_DECL(void, glGetUniformfv, (GLuint program, GLint location, GLfloat *params)) +ANT_GL_CORE_DECL(void, glGetUniformiv, (GLuint program, GLint location, GLint *params)) +ANT_GL_CORE_DECL(void, glGetVertexAttribdv, (GLuint index, GLenum pname, GLdouble *params)) +ANT_GL_CORE_DECL(void, glGetVertexAttribfv, (GLuint index, GLenum pname, GLfloat *params)) +ANT_GL_CORE_DECL(void, glGetVertexAttribiv, (GLuint index, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetVertexAttribPointerv, (GLuint index, GLenum pname, GLvoid* *pointer)) +ANT_GL_CORE_DECL(GLboolean, glIsProgram, (GLuint program)) +ANT_GL_CORE_DECL(GLboolean, glIsShader, (GLuint shader)) +ANT_GL_CORE_DECL(void, glLinkProgram, (GLuint program)) +ANT_GL_CORE_DECL(void, glShaderSource, (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length)) +ANT_GL_CORE_DECL(void, glUseProgram, (GLuint program)) +ANT_GL_CORE_DECL(void, glUniform1f, (GLint location, GLfloat v0)) +ANT_GL_CORE_DECL(void, glUniform2f, (GLint location, GLfloat v0, GLfloat v1)) +ANT_GL_CORE_DECL(void, glUniform3f, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2)) +ANT_GL_CORE_DECL(void, glUniform4f, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)) +ANT_GL_CORE_DECL(void, glUniform1i, (GLint location, GLint v0)) +ANT_GL_CORE_DECL(void, glUniform2i, (GLint location, GLint v0, GLint v1)) +ANT_GL_CORE_DECL(void, glUniform3i, (GLint location, GLint v0, GLint v1, GLint v2)) +ANT_GL_CORE_DECL(void, glUniform4i, (GLint location, GLint v0, GLint v1, GLint v2, GLint v3)) +ANT_GL_CORE_DECL(void, glUniform1fv, (GLint location, GLsizei count, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniform2fv, (GLint location, GLsizei count, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniform3fv, (GLint location, GLsizei count, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniform4fv, (GLint location, GLsizei count, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniform1iv, (GLint location, GLsizei count, const GLint *value)) +ANT_GL_CORE_DECL(void, glUniform2iv, (GLint location, GLsizei count, const GLint *value)) +ANT_GL_CORE_DECL(void, glUniform3iv, (GLint location, GLsizei count, const GLint *value)) +ANT_GL_CORE_DECL(void, glUniform4iv, (GLint location, GLsizei count, const GLint *value)) +ANT_GL_CORE_DECL(void, glUniformMatrix2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniformMatrix3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniformMatrix4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glValidateProgram, (GLuint program)) +ANT_GL_CORE_DECL(void, glVertexAttrib1d, (GLuint index, GLdouble x)) +ANT_GL_CORE_DECL(void, glVertexAttrib1dv, (GLuint index, const GLdouble *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib1f, (GLuint index, GLfloat x)) +ANT_GL_CORE_DECL(void, glVertexAttrib1fv, (GLuint index, const GLfloat *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib1s, (GLuint index, GLshort x)) +ANT_GL_CORE_DECL(void, glVertexAttrib1sv, (GLuint index, const GLshort *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib2d, (GLuint index, GLdouble x, GLdouble y)) +ANT_GL_CORE_DECL(void, glVertexAttrib2dv, (GLuint index, const GLdouble *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib2f, (GLuint index, GLfloat x, GLfloat y)) +ANT_GL_CORE_DECL(void, glVertexAttrib2fv, (GLuint index, const GLfloat *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib2s, (GLuint index, GLshort x, GLshort y)) +ANT_GL_CORE_DECL(void, glVertexAttrib2sv, (GLuint index, const GLshort *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib3d, (GLuint index, GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_CORE_DECL(void, glVertexAttrib3dv, (GLuint index, const GLdouble *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib3f, (GLuint index, GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_CORE_DECL(void, glVertexAttrib3fv, (GLuint index, const GLfloat *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib3s, (GLuint index, GLshort x, GLshort y, GLshort z)) +ANT_GL_CORE_DECL(void, glVertexAttrib3sv, (GLuint index, const GLshort *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4Nbv, (GLuint index, const GLbyte *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4Niv, (GLuint index, const GLint *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4Nsv, (GLuint index, const GLshort *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4Nub, (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)) +ANT_GL_CORE_DECL(void, glVertexAttrib4Nubv, (GLuint index, const GLubyte *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4Nuiv, (GLuint index, const GLuint *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4Nusv, (GLuint index, const GLushort *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4bv, (GLuint index, const GLbyte *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4d, (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)) +ANT_GL_CORE_DECL(void, glVertexAttrib4dv, (GLuint index, const GLdouble *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4f, (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)) +ANT_GL_CORE_DECL(void, glVertexAttrib4fv, (GLuint index, const GLfloat *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4iv, (GLuint index, const GLint *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4s, (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)) +ANT_GL_CORE_DECL(void, glVertexAttrib4sv, (GLuint index, const GLshort *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4ubv, (GLuint index, const GLubyte *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4uiv, (GLuint index, const GLuint *v)) +ANT_GL_CORE_DECL(void, glVertexAttrib4usv, (GLuint index, const GLushort *v)) +ANT_GL_CORE_DECL(void, glVertexAttribPointer, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)) +/* +// GL 2.1 +ANT_GL_CORE_DECL(void, glUniformMatrix2x3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniformMatrix3x2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniformMatrix2x4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniformMatrix4x2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniformMatrix3x4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glUniformMatrix4x3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) +// GL 3.0 +ANT_GL_CORE_DECL(void, glColorMaski, (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)) +ANT_GL_CORE_DECL(void, glGetBooleani_v, (GLenum target, GLuint index, GLboolean *data)) +ANT_GL_CORE_DECL(void, glGetIntegeri_v, (GLenum target, GLuint index, GLint *data)) +ANT_GL_CORE_DECL(void, glEnablei, (GLenum target, GLuint index)) +ANT_GL_CORE_DECL(void, glDisablei, (GLenum target, GLuint index)) +ANT_GL_CORE_DECL(GLboolean, glIsEnabledi, (GLenum target, GLuint index)) +ANT_GL_CORE_DECL(void, glBeginTransformFeedback, (GLenum primitiveMode)) +ANT_GL_CORE_DECL(void, glEndTransformFeedback, (void)) +ANT_GL_CORE_DECL(void, glBindBufferRange, (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)) +ANT_GL_CORE_DECL(void, glBindBufferBase, (GLenum target, GLuint index, GLuint buffer)) +ANT_GL_CORE_DECL(void, glTransformFeedbackVaryings, (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode)) +ANT_GL_CORE_DECL(void, glGetTransformFeedbackVarying, (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)) +ANT_GL_CORE_DECL(void, glClampColor, (GLenum target, GLenum clamp)) +ANT_GL_CORE_DECL(void, glBeginConditionalRender, (GLuint id, GLenum mode)) +ANT_GL_CORE_DECL(void, glEndConditionalRender, (void)) +ANT_GL_CORE_DECL(void, glVertexAttribIPointer, (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_CORE_DECL(void, glGetVertexAttribIiv, (GLuint index, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetVertexAttribIuiv, (GLuint index, GLenum pname, GLuint *params)) +ANT_GL_CORE_DECL(void, glVertexAttribI1i, (GLuint index, GLint x)) +ANT_GL_CORE_DECL(void, glVertexAttribI2i, (GLuint index, GLint x, GLint y)) +ANT_GL_CORE_DECL(void, glVertexAttribI3i, (GLuint index, GLint x, GLint y, GLint z)) +ANT_GL_CORE_DECL(void, glVertexAttribI4i, (GLuint index, GLint x, GLint y, GLint z, GLint w)) +ANT_GL_CORE_DECL(void, glVertexAttribI1ui, (GLuint index, GLuint x)) +ANT_GL_CORE_DECL(void, glVertexAttribI2ui, (GLuint index, GLuint x, GLuint y)) +ANT_GL_CORE_DECL(void, glVertexAttribI3ui, (GLuint index, GLuint x, GLuint y, GLuint z)) +ANT_GL_CORE_DECL(void, glVertexAttribI4ui, (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)) +ANT_GL_CORE_DECL(void, glVertexAttribI1iv, (GLuint index, const GLint *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI2iv, (GLuint index, const GLint *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI3iv, (GLuint index, const GLint *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI4iv, (GLuint index, const GLint *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI1uiv, (GLuint index, const GLuint *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI2uiv, (GLuint index, const GLuint *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI3uiv, (GLuint index, const GLuint *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI4uiv, (GLuint index, const GLuint *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI4bv, (GLuint index, const GLbyte *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI4sv, (GLuint index, const GLshort *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI4ubv, (GLuint index, const GLubyte *v)) +ANT_GL_CORE_DECL(void, glVertexAttribI4usv, (GLuint index, const GLushort *v)) +ANT_GL_CORE_DECL(void, glGetUniformuiv, (GLuint program, GLint location, GLuint *params)) +ANT_GL_CORE_DECL(void, glBindFragDataLocation, (GLuint program, GLuint color, const GLchar *name)) +ANT_GL_CORE_DECL(GLint, glGetFragDataLocation, (GLuint program, const GLchar *name)) +ANT_GL_CORE_DECL(void, glUniform1ui, (GLint location, GLuint v0)) +ANT_GL_CORE_DECL(void, glUniform2ui, (GLint location, GLuint v0, GLuint v1)) +ANT_GL_CORE_DECL(void, glUniform3ui, (GLint location, GLuint v0, GLuint v1, GLuint v2)) +ANT_GL_CORE_DECL(void, glUniform4ui, (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)) +ANT_GL_CORE_DECL(void, glUniform1uiv, (GLint location, GLsizei count, const GLuint *value)) +ANT_GL_CORE_DECL(void, glUniform2uiv, (GLint location, GLsizei count, const GLuint *value)) +ANT_GL_CORE_DECL(void, glUniform3uiv, (GLint location, GLsizei count, const GLuint *value)) +ANT_GL_CORE_DECL(void, glUniform4uiv, (GLint location, GLsizei count, const GLuint *value)) +ANT_GL_CORE_DECL(void, glTexParameterIiv, (GLenum target, GLenum pname, const GLint *params)) +ANT_GL_CORE_DECL(void, glTexParameterIuiv, (GLenum target, GLenum pname, const GLuint *params)) +ANT_GL_CORE_DECL(void, glGetTexParameterIiv, (GLenum target, GLenum pname, GLint *params)) +ANT_GL_CORE_DECL(void, glGetTexParameterIuiv, (GLenum target, GLenum pname, GLuint *params)) +ANT_GL_CORE_DECL(void, glClearBufferiv, (GLenum buffer, GLint drawbuffer, const GLint *value)) +ANT_GL_CORE_DECL(void, glClearBufferuiv, (GLenum buffer, GLint drawbuffer, const GLuint *value)) +ANT_GL_CORE_DECL(void, glClearBufferfv, (GLenum buffer, GLint drawbuffer, const GLfloat *value)) +ANT_GL_CORE_DECL(void, glClearBufferfi, (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)) +ANT_GL_CORE_DECL(const GLubyte *, glGetStringi, (GLenum name, GLuint index)) +// GL 3.1 +ANT_GL_CORE_DECL(void, glDrawArraysInstanced, (GLenum mode, GLint first, GLsizei count, GLsizei primcount)) +ANT_GL_CORE_DECL(void, glDrawElementsInstanced, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)) +ANT_GL_CORE_DECL(void, glTexBuffer, (GLenum target, GLenum internalformat, GLuint buffer)) +ANT_GL_CORE_DECL(void, glPrimitiveRestartIndex, (GLuint index)) +// GL 3.2 +//typedef int64_t GLint64; +//ANT_GL_CORE_DECL(void, glGetInteger64i_v, (GLenum target, GLuint index, GLint64 *data)) +//ANT_GL_CORE_DECL(void, glGetBufferParameteri64v, (GLenum target, GLenum pname, GLint64 *params)) +ANT_GL_CORE_DECL(void, glFramebufferTexture, (GLenum target, GLenum attachment, GLuint texture, GLint level)) +*/ +// GL_ARB_vertex_array_object +ANT_GL_CORE_DECL_NO_FORWARD(void, glBindVertexArray, (GLuint array)) +ANT_GL_CORE_DECL_NO_FORWARD(void, glDeleteVertexArrays, (GLsizei n, const GLuint *arrays)) +ANT_GL_CORE_DECL_NO_FORWARD(void, glGenVertexArrays, (GLsizei n, GLuint *arrays)) +ANT_GL_CORE_DECL_NO_FORWARD(GLboolean, glIsVertexArray, (GLuint array)) + + +#ifdef ANT_WINDOWS +ANT_GL_CORE_DECL(PROC, wglGetProcAddress, (LPCSTR)) +#endif + +#ifndef GL_CLAMP_TO_EDGE +# define GL_CLAMP_TO_EDGE 0x812F +#endif +#ifndef GL_COMPILE_STATUS +# define GL_COMPILE_STATUS 0x8B81 +#endif +#ifndef GL_INFO_LOG_LENGTH +# define GL_INFO_LOG_LENGTH 0x8B84 +#endif +#ifndef GL_LINK_STATUS +# define GL_LINK_STATUS 0x8B82 +#endif +#ifndef GL_ARRAY_BUFFER +# define GL_ARRAY_BUFFER 0x8892 +#endif +#ifndef GL_DYNAMIC_DRAW +# define GL_DYNAMIC_DRAW 0x88E8 +#endif +#ifndef GL_VERTEX_SHADER +# define GL_VERTEX_SHADER 0x8B31 +#endif +#ifndef GL_FRAGMENT_SHADER +# define GL_FRAGMENT_SHADER 0x8B30 +#endif +#ifndef GL_VERTEX_ARRAY_BINDING +# define GL_VERTEX_ARRAY_BINDING 0x85B5 +#endif +#ifndef GL_CURRENT_PROGRAM +# define GL_CURRENT_PROGRAM 0x8B8D +#endif +#ifndef GL_ACTIVE_TEXTURE +# define GL_ACTIVE_TEXTURE 0x84E0 +#endif +#ifndef GL_TEXTURE0 +# define GL_TEXTURE0 0x84C0 +#endif +#ifndef GL_BGRA +# define GL_BGRA 0x80E1 +#endif + + +#endif // !defined ANT_LOAD_OGL_CORE_INCLUDED diff --git a/AntTweakBar/src/Makefile b/AntTweakBar/src/Makefile new file mode 100644 index 0000000..6bcb8cd --- /dev/null +++ b/AntTweakBar/src/Makefile @@ -0,0 +1,102 @@ +####### Compiler, tools and options + +#---- LINUX +SO_EXT = .so +SO_VERSION = 1 +AR_EXT = .a + +#---- Release +CXXCFG = -O3 +LFLAGS = +OUT_DIR = ../lib +#---- Debug +#CXXCFG = -g -D_DEBUG +#LFLAGS = +#OUT_DIR = ../lib/debug + + +CXX = gcc +CXXFLAGS = $(CXXCFG) -Wall -fPIC -fno-strict-aliasing -D_UNIX -D__PLACEMENT_NEW_INLINE +INCPATH = -I../include -I/usr/local/include -I/usr/X11R6/include -I/usr/include +LINK = gcc +#LIBS = -L/usr/X11R6/lib -L. -lglfw -lGL -lGLU -lX11 -lXxf86vm -lXext -lpthread -lm +#LIBS = -L/usr/X11R6/lib -lGL -lX11 -lXxf86vm -lXext -lpthread -lm +LIBS = +AR = ar cqs +RANLIB = +TAR = tar -cf +GZIP = gzip -9f +COPY = cp -f +COPY_FILE = $(COPY) -p +COPY_DIR = $(COPY) -pR +DEL_FILE = rm -f +SYMLINK = ln -sf +DEL_DIR = rmdir +MOVE = mv +NO_STDERR = 2> /dev/null + + +####### Files + + +# name of the application: +TARGET = AntTweakBar + +# source files without extension: +SRC_FILES = TwColors.cpp TwFonts.cpp TwOpenGL.cpp TwOpenGLCore.cpp TwBar.cpp TwMgr.cpp TwPrecomp.cpp LoadOGL.cpp LoadOGLCore.cpp TwEventGLFW.c TwEventGLUT.c TwEventSDL.c TwEventSDL12.c TwEventSDL13.c TwEventSFML.cpp TwEventX11.c + +# build object list from source files +OBJS_1 = $(SRC_FILES:.c=.o) +OBJS = $(OBJS_1:.cpp=.o) + + +####### Build rules + + +#first: depend all +first: all + +all: Makefile $(TARGET) + +# append dependencies to this Makefile +#depend: +# @echo "==== Make dependencies =====" +# makedepend -Y +# makedepend -a -Y -- $(CXXFLAGS) $(INCPATH) -- $(SRC_FILES) $(NO_STDERR) + +$(TARGET): $(OBJS) + @echo "===== Link $@ =====" + $(LINK) $(LFLAGS) -shared -Wl,-soname,lib$(TARGET)$(SO_EXT).$(SO_VERSION) -o $(OUT_DIR)/lib$(TARGET)$(SO_EXT) $(OBJS) $(LIBS) + $(SYMLINK) $(OUT_DIR)/lib$(TARGET)$(SO_EXT) $(OUT_DIR)/lib$(TARGET)$(SO_EXT).$(SO_VERSION) + $(AR) $(OUT_DIR)/lib$(TARGET)$(AR_EXT) $(OBJS) $(LIBS) + +.cpp.o: + @echo "===== Compile $< =====" + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.c.o: + @echo "===== Compile $< =====" + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +clean: + @echo "===== Clean =====" + -$(DEL_FILE) *.o + -$(DEL_FILE) *~ core *.core *.stackdump + + +####### DEPENDENCIES + +TwColors.o: TwPrecomp.h TwColors.h +TwFonts.o: TwPrecomp.h ../include/AntTweakBar.h TwFonts.h TwMgr.h TwColors.h TwGraph.h AntPerfTimer.h +TwOpenGL.o: TwPrecomp.h ../include/AntTweakBar.h TwOpenGL.h LoadOGL.h TwGraph.h TwColors.h TwFonts.h TwMgr.h AntPerfTimer.h +TwOpenGLCore.o: TwPrecomp.h ../include/AntTweakBar.h TwOpenGLCore.h LoadOGLCore.h TwGraph.h TwColors.h TwFonts.h TwMgr.h AntPerfTimer.h +TwBar.o: TwPrecomp.h ../include/AntTweakBar.h TwBar.h TwMgr.h TwColors.h TwFonts.h TwGraph.h AntPerfTimer.h +TwMgr.o: TwPrecomp.h ../include/AntTweakBar.h TwMgr.h TwColors.h TwFonts.h TwGraph.h AntPerfTimer.h TwBar.h TwOpenGL.h res/TwXCursors.h +TwPrecomp.o: TwPrecomp.h +LoadOGL.o: TwPrecomp.h LoadOGL.h +TwEventGLFW.o: ../include/AntTweakBar.h MiniGLFW.h +TwEventGLUT.o: ../include/AntTweakBar.h MiniGLUT.h +TwEventSDL.o: ../include/AntTweakBar.h +TwEventSDL12.o: ../include/AntTweakBar.h MiniSDL12.h +TwEventSDL13.o: ../include/AntTweakBar.h MiniSDL13.h +TwEventX11.o: ../include/AntTweakBar.h diff --git a/AntTweakBar/src/Makefile.osx b/AntTweakBar/src/Makefile.osx new file mode 100644 index 0000000..418a379 --- /dev/null +++ b/AntTweakBar/src/Makefile.osx @@ -0,0 +1,97 @@ +####### Compiler, tools and options + +SO_EXT = .dylib +AR_EXT = .a + +#---- Release +CXXCFG = -O3 +LFLAGS = +OUT_DIR = ../lib +#---- Debug +#CXXCFG = -g -D_DEBUG +#LFLAGS = +#OUT_DIR = ../lib/debug + +#BASE = /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks +CXX = g++ +CXXFLAGS = $(CXXCFG) -Wall -fPIC -fno-strict-aliasing -D_MACOSX -ObjC++ -D__PLACEMENT_NEW_INLINE +INCPATH = -I../include -I/usr/local/include -I/usr/X11R6/include -I/usr/include +#-I$(BASE)/OpenGL.framework/Headers/ -I$(BASE)/GLUT.framework/Headers/ -I$(BASE)/AppKit.framework/Headers/ +LINK = g++ +LIBS = -framework OpenGL -framework GLUT -framework AppKit +AR = ar cqs +RANLIB = +TAR = tar -cf +GZIP = gzip -9f +COPY = cp -f +COPY_FILE = $(COPY) -p +COPY_DIR = $(COPY) -pR +DEL_FILE = rm -f +SYMLINK = ln -sf +DEL_DIR = rmdir +MOVE = mv +NO_STDERR = 2> /dev/null + + +####### Files + + +# name of the application: +TARGET = AntTweakBar + +# source files without extension: +SRC_FILES = TwColors.cpp TwFonts.cpp TwOpenGL.cpp TwOpenGLCore.cpp TwBar.cpp TwMgr.cpp LoadOGL.cpp LoadOGLCore.cpp TwEventGLFW.c TwEventGLUT.c TwEventSDL.c TwEventSDL12.c TwEventSDL13.c TwEventSFML.cpp + +# build object list from source files +OBJS_1 = $(SRC_FILES:.c=.o) +OBJS = $(OBJS_1:.cpp=.o) + + +####### Build rules + + +#first: depend all +first: all + +all: Makefile $(TARGET) + +# append dependencies to this Makefile +#depend: +# @echo "==== Make dependencies =====" +# makedepend -Y +# makedepend -a -Y -- $(CXXFLAGS) $(INCPATH) -- $(SRC_FILES) $(NO_STDERR) + +$(TARGET): $(OBJS) + @echo "===== Link $@ =====" + $(LINK) $(LFLAGS) -dynamiclib -Wl,-undefined -Wl,dynamic_lookup -o $(OUT_DIR)/lib$(TARGET)$(SO_EXT) $(OBJS) $(LIBS) + $(AR) $(OUT_DIR)/lib$(TARGET)$(AR_EXT) $(OBJS) + +.cpp.o: + @echo "===== Compile $< =====" + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.c.o: + @echo "===== Compile $< =====" + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +clean: + @echo "===== Clean =====" + -$(DEL_FILE) *.o + -$(DEL_FILE) *~ core *.core *.stackdump + + +####### DEPENDENCIES + +TwColors.o: TwPrecomp.h TwColors.h +TwFonts.o: TwPrecomp.h ../include/AntTweakBar.h TwFonts.h TwMgr.h TwColors.h TwGraph.h AntPerfTimer.h +TwOpenGL.o: TwPrecomp.h ../include/AntTweakBar.h TwOpenGL.h LoadOGL.h TwGraph.h TwColors.h TwFonts.h TwMgr.h AntPerfTimer.h +TwOpenGLCore.o: TwPrecomp.h ../include/AntTweakBar.h TwOpenGLCore.h LoadOGLCore.h TwGraph.h TwColors.h TwFonts.h TwMgr.h AntPerfTimer.h +TwBar.o: TwPrecomp.h ../include/AntTweakBar.h TwBar.h TwMgr.h TwColors.h TwFonts.h TwGraph.h AntPerfTimer.h +TwMgr.o: TwPrecomp.h ../include/AntTweakBar.h TwMgr.h TwColors.h TwFonts.h TwGraph.h AntPerfTimer.h TwBar.h TwOpenGL.h res/TwXCursors.h +TwPrecomp.o: TwPrecomp.h +LoadOGL.o: TwPrecomp.h LoadOGL.h +TwEventGLFW.o: ../include/AntTweakBar.h MiniGLFW.h +TwEventGLUT.o: ../include/AntTweakBar.h MiniGLUT.h +TwEventSDL.o: ../include/AntTweakBar.h +TwEventSDL12.o: ../include/AntTweakBar.h MiniSDL12.h +TwEventSDL13.o: ../include/AntTweakBar.h MiniSDL13.h diff --git a/AntTweakBar/src/MiniGLFW.h b/AntTweakBar/src/MiniGLFW.h new file mode 100644 index 0000000..57c9f61 --- /dev/null +++ b/AntTweakBar/src/MiniGLFW.h @@ -0,0 +1,109 @@ +// --------------------------------------------------------------------------- +// +// @file MiniGLFW.h +// @brief A subset of GLFW definitions needed to compile helper functions +// implemented in TwEventGLFW.c +// +// notes: - Private header +// - AntTweakBar.dll does not need to link with GLFW, +// it just needs some definitions for its helper functions. +// - This header is provided to avoid the need of having GLFW +// installed to recompile AntTweakBar. +// - Do not use this header in your own programs, better use the +// glfw.h header from the actual GLFW library SDK : +// http://www.glfw.org +// +// --------------------------------------------------------------------------- + +#if !defined MINI_GLFW_INCLUDED +#define MINI_GLFW_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + + +// Key and button state/action definitions +#define GLFW_RELEASE 0 +#define GLFW_PRESS 1 + +// Keyboard key definitions +#define GLFW_KEY_UNKNOWN -1 +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_SPECIAL 256 +#define GLFW_KEY_ESC (GLFW_KEY_SPECIAL+1) +#define GLFW_KEY_F1 (GLFW_KEY_SPECIAL+2) +#define GLFW_KEY_F2 (GLFW_KEY_SPECIAL+3) +#define GLFW_KEY_F3 (GLFW_KEY_SPECIAL+4) +#define GLFW_KEY_F4 (GLFW_KEY_SPECIAL+5) +#define GLFW_KEY_F5 (GLFW_KEY_SPECIAL+6) +#define GLFW_KEY_F6 (GLFW_KEY_SPECIAL+7) +#define GLFW_KEY_F7 (GLFW_KEY_SPECIAL+8) +#define GLFW_KEY_F8 (GLFW_KEY_SPECIAL+9) +#define GLFW_KEY_F9 (GLFW_KEY_SPECIAL+10) +#define GLFW_KEY_F10 (GLFW_KEY_SPECIAL+11) +#define GLFW_KEY_F11 (GLFW_KEY_SPECIAL+12) +#define GLFW_KEY_F12 (GLFW_KEY_SPECIAL+13) +#define GLFW_KEY_F13 (GLFW_KEY_SPECIAL+14) +#define GLFW_KEY_F14 (GLFW_KEY_SPECIAL+15) +#define GLFW_KEY_F15 (GLFW_KEY_SPECIAL+16) +#define GLFW_KEY_F16 (GLFW_KEY_SPECIAL+17) +#define GLFW_KEY_F17 (GLFW_KEY_SPECIAL+18) +#define GLFW_KEY_F18 (GLFW_KEY_SPECIAL+19) +#define GLFW_KEY_F19 (GLFW_KEY_SPECIAL+20) +#define GLFW_KEY_F20 (GLFW_KEY_SPECIAL+21) +#define GLFW_KEY_F21 (GLFW_KEY_SPECIAL+22) +#define GLFW_KEY_F22 (GLFW_KEY_SPECIAL+23) +#define GLFW_KEY_F23 (GLFW_KEY_SPECIAL+24) +#define GLFW_KEY_F24 (GLFW_KEY_SPECIAL+25) +#define GLFW_KEY_F25 (GLFW_KEY_SPECIAL+26) +#define GLFW_KEY_UP (GLFW_KEY_SPECIAL+27) +#define GLFW_KEY_DOWN (GLFW_KEY_SPECIAL+28) +#define GLFW_KEY_LEFT (GLFW_KEY_SPECIAL+29) +#define GLFW_KEY_RIGHT (GLFW_KEY_SPECIAL+30) +#define GLFW_KEY_LSHIFT (GLFW_KEY_SPECIAL+31) +#define GLFW_KEY_RSHIFT (GLFW_KEY_SPECIAL+32) +#define GLFW_KEY_LCTRL (GLFW_KEY_SPECIAL+33) +#define GLFW_KEY_RCTRL (GLFW_KEY_SPECIAL+34) +#define GLFW_KEY_LALT (GLFW_KEY_SPECIAL+35) +#define GLFW_KEY_RALT (GLFW_KEY_SPECIAL+36) +#define GLFW_KEY_TAB (GLFW_KEY_SPECIAL+37) +#define GLFW_KEY_ENTER (GLFW_KEY_SPECIAL+38) +#define GLFW_KEY_BACKSPACE (GLFW_KEY_SPECIAL+39) +#define GLFW_KEY_INSERT (GLFW_KEY_SPECIAL+40) +#define GLFW_KEY_DEL (GLFW_KEY_SPECIAL+41) +#define GLFW_KEY_PAGEUP (GLFW_KEY_SPECIAL+42) +#define GLFW_KEY_PAGEDOWN (GLFW_KEY_SPECIAL+43) +#define GLFW_KEY_HOME (GLFW_KEY_SPECIAL+44) +#define GLFW_KEY_END (GLFW_KEY_SPECIAL+45) +#define GLFW_KEY_KP_0 (GLFW_KEY_SPECIAL+46) +#define GLFW_KEY_KP_1 (GLFW_KEY_SPECIAL+47) +#define GLFW_KEY_KP_2 (GLFW_KEY_SPECIAL+48) +#define GLFW_KEY_KP_3 (GLFW_KEY_SPECIAL+49) +#define GLFW_KEY_KP_4 (GLFW_KEY_SPECIAL+50) +#define GLFW_KEY_KP_5 (GLFW_KEY_SPECIAL+51) +#define GLFW_KEY_KP_6 (GLFW_KEY_SPECIAL+52) +#define GLFW_KEY_KP_7 (GLFW_KEY_SPECIAL+53) +#define GLFW_KEY_KP_8 (GLFW_KEY_SPECIAL+54) +#define GLFW_KEY_KP_9 (GLFW_KEY_SPECIAL+55) +#define GLFW_KEY_KP_DIVIDE (GLFW_KEY_SPECIAL+56) +#define GLFW_KEY_KP_MULTIPLY (GLFW_KEY_SPECIAL+57) +#define GLFW_KEY_KP_SUBTRACT (GLFW_KEY_SPECIAL+58) +#define GLFW_KEY_KP_ADD (GLFW_KEY_SPECIAL+59) +#define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60) +#define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61) +#define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62) +#define GLFW_KEY_LAST GLFW_KEY_KP_ENTER + +// Mouse button +#define GLFW_MOUSE_BUTTON_LEFT 0 +#define GLFW_MOUSE_BUTTON_RIGHT 1 +#define GLFW_MOUSE_BUTTON_MIDDLE 2 + + +#ifdef __cplusplus +} +#endif + +#endif // !defined MINI_GLFW_INCLUDED + diff --git a/AntTweakBar/src/MiniGLUT.h b/AntTweakBar/src/MiniGLUT.h new file mode 100644 index 0000000..8459264 --- /dev/null +++ b/AntTweakBar/src/MiniGLUT.h @@ -0,0 +1,142 @@ +// --------------------------------------------------------------------------- +// +// @file MiniGLUT.h +// @brief A subset of GLUT definitions needed to compile helper functions +// implemented in TwEventGLUT.c +// +// notes: - Private header +// - AntTweakBar.dll does not need to link with GLUT, +// it just needs some definitions for its helper functions. +// - This header is provided to avoid the need of having GLUT +// installed to recompile AntTweakBar. +// - Do not use this header in your own programs, better use the +// GLUT.h header from the actual GLUT library SDK : +// http://opengl.org/resources/libraries/glut +// +// --------------------------------------------------------------------------- + +#if !defined MINI_GLUT_INCLUDED +#define MINI_GLUT_INCLUDED + +#if defined(_WIN32) || defined(_WIN64) +# define WIN32_LEAN_AND_MEAN +# include // needed by gl.h +# define GLUT_CALL __stdcall +# define GLUT_CALLBACK __cdecl +# define GLUT_API __declspec(dllimport) +#else +# define GLUT_CALL +# define GLUT_CALLBACK +# define GLUT_API extern +#endif + +#if defined(_MACOSX) +# include +# include +#else +# include // must be included after windows.h +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +// Mouse buttons +#define GLUT_LEFT_BUTTON 0 +#define GLUT_MIDDLE_BUTTON 1 +#define GLUT_RIGHT_BUTTON 2 + +// Mouse button state +#define GLUT_DOWN 0 +#define GLUT_UP 1 + +// glutGetModifiers return mask +#define GLUT_ACTIVE_SHIFT 1 +#define GLUT_ACTIVE_CTRL 2 +#define GLUT_ACTIVE_ALT 4 + +// function keys +#define GLUT_KEY_F1 1 +#define GLUT_KEY_F2 2 +#define GLUT_KEY_F3 3 +#define GLUT_KEY_F4 4 +#define GLUT_KEY_F5 5 +#define GLUT_KEY_F6 6 +#define GLUT_KEY_F7 7 +#define GLUT_KEY_F8 8 +#define GLUT_KEY_F9 9 +#define GLUT_KEY_F10 10 +#define GLUT_KEY_F11 11 +#define GLUT_KEY_F12 12 + +// directional keys +#define GLUT_KEY_LEFT 100 +#define GLUT_KEY_UP 101 +#define GLUT_KEY_RIGHT 102 +#define GLUT_KEY_DOWN 103 +#define GLUT_KEY_PAGE_UP 104 +#define GLUT_KEY_PAGE_DOWN 105 +#define GLUT_KEY_HOME 106 +#define GLUT_KEY_END 107 +#define GLUT_KEY_INSERT 108 + +// display mode bit masks +#define GLUT_RGB 0 +#define GLUT_RGBA GLUT_RGB +#define GLUT_INDEX 1 +#define GLUT_SINGLE 0 +#define GLUT_DOUBLE 2 +#define GLUT_ACCUM 4 +#define GLUT_ALPHA 8 +#define GLUT_DEPTH 16 +#define GLUT_STENCIL 32 + +// timer +#define GLUT_ELAPSED_TIME ((GLenum) 700) + + +// functions subset +GLUT_API void GLUT_CALL glutInit(int *argcp, char **argv); +GLUT_API void GLUT_CALL glutInitDisplayMode(unsigned int mode); +GLUT_API int GLUT_CALL glutCreateWindow(const char *title); +GLUT_API int GLUT_CALL glutGetWindow(void); +GLUT_API void GLUT_CALL glutSetWindow(int win); +GLUT_API int GLUT_CALL glutCreateSubWindow(int win, int x, int y, int width, int height); +GLUT_API int GLUT_CALL glutGet(GLenum type); +GLUT_API void GLUT_CALL glutSwapBuffers(); +GLUT_API void GLUT_CALL glutPostRedisplay(); +GLUT_API void GLUT_CALL glutInitWindowPosition(int x, int y); +GLUT_API void GLUT_CALL glutInitWindowSize(int width, int height); +GLUT_API void GLUT_CALL glutPositionWindow(int x, int y); +GLUT_API void GLUT_CALL glutReshapeWindow(int width, int height); +GLUT_API void GLUT_CALL glutMainLoop(); +GLUT_API int GLUT_CALL glutCreateMenu(void (GLUT_CALLBACK *func)(int)); +GLUT_API void GLUT_CALL glutDisplayFunc(void (GLUT_CALLBACK *func)(void)); +GLUT_API void GLUT_CALL glutReshapeFunc(void (GLUT_CALLBACK *func)(int width, int height)); +GLUT_API void GLUT_CALL glutKeyboardFunc(void (GLUT_CALLBACK *func)(unsigned char key, int x, int y)); +GLUT_API void GLUT_CALL glutMouseFunc(void (GLUT_CALLBACK *func)(int button, int state, int x, int y)); +GLUT_API void GLUT_CALL glutMotionFunc(void (GLUT_CALLBACK *func)(int x, int y)); +GLUT_API void GLUT_CALL glutPassiveMotionFunc(void (GLUT_CALLBACK *func)(int x, int y)); +GLUT_API void GLUT_CALL glutSpecialFunc(void (GLUT_CALLBACK *func)(int key, int x, int y)); +GLUT_API int GLUT_CALL glutGetModifiers(void); +GLUT_API void GLUT_CALL glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); +GLUT_API void GLUT_CALL glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); +GLUT_API void GLUT_CALL glutSolidTeapot(GLdouble size); + +// GLUT exit problem workaround (see glut.h) +#if (defined(_WIN32) || defined(_WIN64)) && !defined(GLUT_DISABLE_ATEXIT_HACK) + extern void __cdecl exit(int); + GLUT_API void GLUT_CALL __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int)); + static void GLUT_CALL glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); } + #define glutInit glutInit_ATEXIT_HACK +#endif + + +#ifdef __cplusplus +} +#endif + +#endif // !defined MINI_GLUT_INCLUDED + diff --git a/AntTweakBar/src/MiniSDL12.h b/AntTweakBar/src/MiniSDL12.h new file mode 100644 index 0000000..36c968d --- /dev/null +++ b/AntTweakBar/src/MiniSDL12.h @@ -0,0 +1,339 @@ +// --------------------------------------------------------------------------- +// +// @file MiniSDL12.h +// @brief A subset of SDL 1.2 definitions needed to compile helper +// functions implemented in TwEventSDL12.c +// +// notes: - Private header +// - AntTweakBar.dll does not need to link with SDL, +// it just needs some definitions for its helper functions. +// - This header is provided to avoid the need of having SDL +// installed to recompile AntTweakBar. +// - Do not use this header in your own programs, better use the +// SDL.h header from the actual SDL library SDK : +// http://www.libsdl.org +// +// --------------------------------------------------------------------------- + +#if !defined MINI_SDL12_INCLUDED +#define MINI_SDL12_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#define SDL_MAJOR_VERSION 1 +#define SDL_MINOR_VERSION 2 + +#if defined(_WIN32) || defined(_WIN64) +# define SDL_DECLSPEC __declspec(dllimport) +# define SDL_CALL __cdecl +#else +# define SDL_DECLSPEC +# define SDL_CALL +#endif + +typedef unsigned char Uint8; +typedef signed char Sint8; +typedef unsigned short Uint16; +typedef signed short Sint16; +typedef unsigned int Uint32; +typedef signed int Sint32; + +// Subset of SDL keysym +typedef enum { + SDLK_BACKSPACE = 8, + SDLK_TAB = 9, + SDLK_CLEAR = 12, + SDLK_RETURN = 13, + SDLK_PAUSE = 19, + SDLK_ESCAPE = 27, + SDLK_DELETE = 127, + SDLK_UP = 273, + SDLK_DOWN = 274, + SDLK_RIGHT = 275, + SDLK_LEFT = 276, + SDLK_INSERT = 277, + SDLK_HOME = 278, + SDLK_END = 279, + SDLK_PAGEUP = 280, + SDLK_PAGEDOWN = 281, + SDLK_F1 = 282, + SDLK_F2 = 283, + SDLK_F3 = 284, + SDLK_F4 = 285, + SDLK_F5 = 286, + SDLK_F6 = 287, + SDLK_F7 = 288, + SDLK_F8 = 289, + SDLK_F9 = 290, + SDLK_F10 = 291, + SDLK_F11 = 292, + SDLK_F12 = 293, +} SDLKey; + +typedef enum { + KMOD_NONE = 0x0000, + KMOD_LSHIFT = 0x0001, + KMOD_RSHIFT = 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LMETA = 0x0400, + KMOD_RMETA = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_RESERVED = 0x8000 +} SDLMod; + +#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) +#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) +#define KMOD_ALT (KMOD_LALT|KMOD_RALT) +#define KMOD_META (KMOD_LMETA|KMOD_RMETA) + +typedef enum { + SDL_NOEVENT = 0, + SDL_ACTIVEEVENT, + SDL_KEYDOWN, + SDL_KEYUP, + SDL_MOUSEMOTION, + SDL_MOUSEBUTTONDOWN, + SDL_MOUSEBUTTONUP, + SDL_JOYAXISMOTION, + SDL_JOYBALLMOTION, + SDL_JOYHATMOTION, + SDL_JOYBUTTONDOWN, + SDL_JOYBUTTONUP, + SDL_QUIT, + SDL_SYSWMEVENT, + SDL_EVENT_RESERVEDA, + SDL_EVENT_RESERVEDB, + SDL_VIDEORESIZE, + SDL_VIDEOEXPOSE, + SDL_EVENT_RESERVED2, + SDL_EVENT_RESERVED3, + SDL_EVENT_RESERVED4, + SDL_EVENT_RESERVED5, + SDL_EVENT_RESERVED6, + SDL_EVENT_RESERVED7, + SDL_USEREVENT = 24, + SDL_NUMEVENTS = 32 +} SDLEventEnum; + +typedef struct SDL_keysym { + Uint8 scancode; + SDLKey sym; + SDLMod mod; + Uint16 unicode; +} SDL_keysym; + +typedef struct SDL_ActiveEvent { + Uint8 type; + Uint8 gain; + Uint8 state; +} SDL_ActiveEvent; + +typedef struct SDL_KeyboardEvent { + Uint8 type; + Uint8 which; + Uint8 state; + SDL_keysym keysym; +} SDL_KeyboardEvent; + +typedef struct SDL_MouseMotionEvent { + Uint8 type; + Uint8 which; + Uint8 state; + Uint16 x, y; + Sint16 xrel; + Sint16 yrel; +} SDL_MouseMotionEvent; + +typedef struct SDL_MouseButtonEvent { + Uint8 type; + Uint8 which; + Uint8 button; + Uint8 state; + Uint16 x, y; +} SDL_MouseButtonEvent; + +typedef struct SDL_JoyAxisEvent { + Uint8 type; + Uint8 which; + Uint8 axis; + Sint16 value; +} SDL_JoyAxisEvent; + +typedef struct SDL_JoyBallEvent { + Uint8 type; + Uint8 which; + Uint8 ball; + Sint16 xrel; + Sint16 yrel; +} SDL_JoyBallEvent; + +typedef struct SDL_JoyHatEvent { + Uint8 type; + Uint8 which; + Uint8 hat; + Uint8 value; +} SDL_JoyHatEvent; + +typedef struct SDL_JoyButtonEvent { + Uint8 type; + Uint8 which; + Uint8 button; + Uint8 state; +} SDL_JoyButtonEvent; + +typedef struct SDL_ResizeEvent { + Uint8 type; + int w; + int h; +} SDL_ResizeEvent; + +typedef struct SDL_ExposeEvent { + Uint8 type; +} SDL_ExposeEvent; + +typedef struct SDL_QuitEvent { + Uint8 type; +} SDL_QuitEvent; + +typedef struct SDL_UserEvent { + Uint8 type; + int code; + void *data1; + void *data2; +} SDL_UserEvent; + +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; +typedef struct SDL_SysWMEvent { + Uint8 type; + SDL_SysWMmsg *msg; +} SDL_SysWMEvent; + +typedef union { + Uint8 type; + SDL_ActiveEvent active; + SDL_KeyboardEvent key; + SDL_MouseMotionEvent motion; + SDL_MouseButtonEvent button; + SDL_JoyAxisEvent jaxis; + SDL_JoyBallEvent jball; + SDL_JoyHatEvent jhat; + SDL_JoyButtonEvent jbutton; + SDL_ResizeEvent resize; + SDL_ExposeEvent expose; + SDL_QuitEvent quit; + SDL_UserEvent user; + SDL_SysWMEvent syswm; +char full[56]; +} SDL_Event; + +typedef struct SDL_PixelFormat { + void *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + Uint32 colorkey; + Uint8 alpha; +} SDL_PixelFormat; + +typedef enum { + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_RETAINED_BACKING, + SDL_GL_CONTEXT_MAJOR_VERSION, + SDL_GL_CONTEXT_MINOR_VERSION +} SDL_GLattr; + +typedef struct SDL_VideoInfo { + Uint32 hw_available :1; + Uint32 wm_available :1; + Uint32 UnusedBits1 :6; + Uint32 UnusedBits2 :1; + Uint32 blit_hw :1; + Uint32 blit_hw_CC :1; + Uint32 blit_hw_A :1; + Uint32 blit_sw :1; + Uint32 blit_sw_CC :1; + Uint32 blit_sw_A :1; + Uint32 blit_fill :1; + Uint32 UnusedBits3 :16; + Uint32 video_mem; + SDL_PixelFormat *vfmt; + int current_w; + int current_h; +} SDL_VideoInfo; + +#define SDL_INIT_VIDEO 0x00000020 + +#define SDL_SWSURFACE 0x00000000 +#define SDL_HWSURFACE 0x00000001 +#define SDL_ASYNCBLIT 0x00000004 +#define SDL_ANYFORMAT 0x10000000 +#define SDL_HWPALETTE 0x20000000 +#define SDL_DOUBLEBUF 0x40000000 +#define SDL_FULLSCREEN 0x80000000 +#define SDL_OPENGL 0x00000002 +#define SDL_OPENGLBLIT 0x0000000A +#define SDL_RESIZABLE 0x00000010 +#define SDL_NOFRAME 0x00000020 + +#define SDL_DEFAULT_REPEAT_DELAY 500 +#define SDL_DEFAULT_REPEAT_INTERVAL 30 + + +// functions subset +extern SDL_DECLSPEC int SDL_CALL SDL_Init(Uint32 flags); +extern SDL_DECLSPEC void SDL_CALL SDL_Quit(); +extern SDL_DECLSPEC char * SDL_CALL SDL_GetError(); +extern SDL_DECLSPEC const SDL_VideoInfo * SDL_CALL SDL_GetVideoInfo(); +extern SDL_DECLSPEC struct SDL_Surface * SDL_CALL SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags); +extern SDL_DECLSPEC int SDL_CALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); +extern SDL_DECLSPEC void SDL_CALL SDL_GL_SwapBuffers(); +extern SDL_DECLSPEC void SDL_CALL SDL_WM_SetCaption(const char *title, const char *icon); +extern SDL_DECLSPEC void SDL_CALL SDL_WM_GetCaption(char **title, char **icon); +extern SDL_DECLSPEC int SDL_CALL SDL_EnableUNICODE(int enable); +extern SDL_DECLSPEC int SDL_CALL SDL_EnableKeyRepeat(int delay, int interval); +extern SDL_DECLSPEC Uint32 SDL_CALL SDL_GetTicks(); +extern SDL_DECLSPEC int SDL_CALL SDL_PollEvent(SDL_Event *event); +extern SDL_DECLSPEC int SDL_CALL SDL_WaitEvent(SDL_Event *event); +extern SDL_DECLSPEC int SDL_CALL SDL_PushEvent(SDL_Event *event); + + +#ifdef __cplusplus +} +#endif + +#endif // !defined MINI_SDL12_INCLUDED + diff --git a/AntTweakBar/src/MiniSDL13.h b/AntTweakBar/src/MiniSDL13.h new file mode 100644 index 0000000..c32a6d3 --- /dev/null +++ b/AntTweakBar/src/MiniSDL13.h @@ -0,0 +1,428 @@ +// --------------------------------------------------------------------------- +// +// @file MiniSDL13.h +// @brief A subset of SDL 1.3 definitions needed to compile helper +// functions implemented in TwEventSDL13.c +// +// notes: - Private header +// - AntTweakBar.dll does not need to link with SDL, +// it just needs some definitions for its helper functions. +// - This header is provided to avoid the need of having SDL +// installed to recompile AntTweakBar. +// - Do not use this header in your own programs, better use the +// SDL.h header from the actual SDL library SDK : +// http://www.libsdl.org +// +// --------------------------------------------------------------------------- + +#if !defined MINI_SDL_INCLUDED +#define MINI_SDL_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#define SDL_MAJOR_VERSION 1 +#define SDL_MINOR_VERSION 3 + +#if defined(_WIN32) || defined(_WIN64) +# define SDL_DECLSPEC __declspec(dllimport) +# define SDL_CALL __cdecl +#else +# define SDL_DECLSPEC +# define SDL_CALL +#endif + +typedef unsigned char Uint8; +typedef signed char Sint8; +typedef unsigned short Uint16; +typedef signed short Sint16; +typedef unsigned int Uint32; +typedef signed int Sint32; + +#define SDLK_SCANCODE_MASK (1<<30) +#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) + +// Subset of SDL scancodes. +// Note: some SDL scancodes seems to be wrong in the original +// SDL scancode header file. +typedef enum { + SDL_SCANCODE_F1 = 58, + SDL_SCANCODE_F2 = 59, + SDL_SCANCODE_F3 = 60, + SDL_SCANCODE_F4 = 61, + SDL_SCANCODE_F5 = 62, + SDL_SCANCODE_F6 = 63, + SDL_SCANCODE_F7 = 64, + SDL_SCANCODE_F8 = 65, + SDL_SCANCODE_F9 = 66, + SDL_SCANCODE_F10 = 67, + SDL_SCANCODE_F11 = 68, + SDL_SCANCODE_F12 = 69, + SDL_SCANCODE_INSERT = 98, //73, + SDL_SCANCODE_HOME = 95, //74, + SDL_SCANCODE_PAGEUP = 97, //75, + SDL_SCANCODE_DELETE = 99, //76, + SDL_SCANCODE_END = 89, //77, + SDL_SCANCODE_PAGEDOWN = 91, //78, + SDL_SCANCODE_RIGHT = 94, //79, + SDL_SCANCODE_LEFT = 92, //80, + SDL_SCANCODE_DOWN = 90, //81, + SDL_SCANCODE_UP = 96 //82 +} SDL_scancode; + +// Subset of SDL keysym +typedef enum { + SDLK_BACKSPACE = 8, + SDLK_TAB = 9, + SDLK_CLEAR = 12, + SDLK_RETURN = 13, + SDLK_PAUSE = 19, + SDLK_ESCAPE = 27, + SDLK_DELETE = 127, + SDLK_UP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP), + SDLK_DOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN), + SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT), + SDLK_LEFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT), + SDLK_INSERT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT), + SDLK_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME), + SDLK_END = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END), + SDLK_PAGEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP), + SDLK_PAGEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN), + SDLK_F1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1), + SDLK_F2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2), + SDLK_F3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3), + SDLK_F4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4), + SDLK_F5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5), + SDLK_F6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6), + SDLK_F7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7), + SDLK_F8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8), + SDLK_F9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9), + SDLK_F10 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10), + SDLK_F11 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11), + SDLK_F12 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12) +} SDLKey; + +typedef enum { + KMOD_NONE = 0x0000, + KMOD_LSHIFT = 0x0001, + KMOD_RSHIFT = 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LGUI = 0x0400, + KMOD_RGUI = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_RESERVED = 0x8000 +} SDLMod; + +#define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) +#define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) +#define KMOD_ALT (KMOD_LALT|KMOD_RALT) +#define KMOD_GUI (KMOD_LGUI|KMOD_RGUI) + +typedef enum { + SDL_NOEVENT = 0, + SDL_WINDOWEVENT, + SDL_KEYDOWN, + SDL_KEYUP, + SDL_TEXTEDITING, + SDL_TEXTINPUT, + SDL_MOUSEMOTION, + SDL_MOUSEBUTTONDOWN, + SDL_MOUSEBUTTONUP, + SDL_MOUSEWHEEL, + SDL_JOYAXISMOTION, + SDL_JOYBALLMOTION, + SDL_JOYHATMOTION, + SDL_JOYBUTTONDOWN, + SDL_JOYBUTTONUP, + SDL_QUIT, + SDL_SYSWMEVENT, + SDL_PROXIMITYIN, + SDL_PROXIMITYOUT, + SDL_EVENT_RESERVED1, + SDL_EVENT_RESERVED2, + SDL_EVENT_RESERVED3, + SDL_USEREVENT = 24, + SDL_NUMEVENTS = 32 +} SDL_EventType; + +#define SDL_ACTIVEEVENT SDL_EVENT_RESERVED1 +#define SDL_VIDEORESIZE SDL_EVENT_RESERVED2 +#define SDL_VIDEOEXPOSE SDL_EVENT_RESERVED3 + +typedef Uint32 SDL_WindowID; + +typedef struct SDL_keysym { + SDL_scancode scancode; + SDLKey sym; + Uint16 mod; + Uint32 unicode; +} SDL_keysym; + +typedef struct SDL_WindowEvent { + Uint8 type; + SDL_WindowID windowID; + Uint8 event; + int data1; + int data2; +} SDL_WindowEvent; + +typedef struct SDL_KeyboardEvent { + Uint8 type; + SDL_WindowID windowID; + Uint8 which; + Uint8 state; + SDL_keysym keysym; +} SDL_KeyboardEvent; + +#define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32) +typedef struct SDL_TextEditingEvent { + Uint8 type; + char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; + int start; + int length; +} SDL_TextEditingEvent; + +#define SDL_TEXTINPUTEVENT_TEXT_SIZE (32) +typedef struct SDL_TextInputEvent { + Uint8 type; + SDL_WindowID windowID; + Uint8 which; + char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; +} SDL_TextInputEvent; + +typedef struct SDL_MouseMotionEvent { + Uint8 type; + SDL_WindowID windowID; + Uint8 which; + Uint8 state; + int x; + int y; + int z; + int pressure; + int pressure_max; + int pressure_min; + int rotation; + int tilt; + int cursor; + int xrel; + int yrel; +} SDL_MouseMotionEvent; + +typedef struct SDL_MouseButtonEvent { + Uint8 type; + SDL_WindowID windowID; + Uint8 which; + Uint8 button; + Uint8 state; + int x; + int y; +} SDL_MouseButtonEvent; + +typedef struct SDL_MouseWheelEvent { + Uint8 type; + SDL_WindowID windowID; + Uint8 which; + int x; + int y; +} SDL_MouseWheelEvent; + +typedef struct SDL_JoyAxisEvent { + Uint8 type; + Uint8 which; + Uint8 axis; + Sint16 value; +} SDL_JoyAxisEvent; + +typedef struct SDL_JoyBallEvent { + Uint8 type; + Uint8 which; + Uint8 ball; + Sint16 xrel; + Sint16 yrel; +} SDL_JoyBallEvent; + +typedef struct SDL_JoyHatEvent { + Uint8 type; + Uint8 which; + Uint8 hat; + Uint8 value; +} SDL_JoyHatEvent; + +typedef struct SDL_JoyButtonEvent { + Uint8 type; + Uint8 which; + Uint8 button; + Uint8 state; +} SDL_JoyButtonEvent; + +typedef struct SDL_ActiveEvent +{ + Uint8 type; + Uint8 gain; + Uint8 state; +} SDL_ActiveEvent; + +typedef struct SDL_ResizeEvent { + Uint8 type; + int w; + int h; +} SDL_ResizeEvent; + +typedef struct SDL_ExposeEvent { + Uint8 type; +} SDL_ExposeEvent; + +typedef struct SDL_QuitEvent { + Uint8 type; +} SDL_QuitEvent; + +typedef struct SDL_UserEvent { + Uint8 type; + SDL_WindowID windowID; + int code; + void *data1; + void *data2; +} SDL_UserEvent; + +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; +typedef struct SDL_SysWMEvent { + Uint8 type; + SDL_SysWMmsg *msg; +} SDL_SysWMEvent; + +typedef struct SDL_ProximityEvent +{ + Uint8 type; + SDL_WindowID windowID; + Uint8 which; + int cursor; + int x; + int y; +} SDL_ProximityEvent; + +typedef union SDL_Event { + Uint8 type; + SDL_WindowEvent window; + SDL_KeyboardEvent key; + SDL_TextEditingEvent edit; + SDL_TextInputEvent text; + SDL_MouseMotionEvent motion; + SDL_MouseButtonEvent button; + SDL_MouseWheelEvent wheel; + SDL_JoyAxisEvent jaxis; + SDL_JoyBallEvent jball; + SDL_JoyHatEvent jhat; + SDL_JoyButtonEvent jbutton; + SDL_QuitEvent quit; + SDL_UserEvent user; + SDL_SysWMEvent syswm; + SDL_ProximityEvent proximity; + SDL_ActiveEvent active; + SDL_ResizeEvent resize; +} SDL_Event; + +typedef struct SDL_PixelFormat { + void *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; +} SDL_PixelFormat; + +typedef enum SDL_GLattr { + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_RETAINED_BACKING, + SDL_GL_CONTEXT_MAJOR_VERSION, + SDL_GL_CONTEXT_MINOR_VERSION +} SDL_GLattr; + +typedef struct SDL_VideoInfo { + Uint32 hw_available :1; + Uint32 wm_available :1; + Uint32 UnusedBits1 :6; + Uint32 UnusedBits2 :1; + Uint32 blit_hw :1; + Uint32 blit_hw_CC :1; + Uint32 blit_hw_A :1; + Uint32 blit_sw :1; + Uint32 blit_sw_CC :1; + Uint32 blit_sw_A :1; + Uint32 blit_fill :1; + Uint32 UnusedBits3 :16; + Uint32 video_mem; + SDL_PixelFormat *vfmt; + int current_w; + int current_h; +} SDL_VideoInfo; + +#define SDL_INIT_VIDEO 0x00000020 + +#define SDL_ANYFORMAT 0x00100000 +#define SDL_HWPALETTE 0x00200000 +#define SDL_DOUBLEBUF 0x00400000 +#define SDL_FULLSCREEN 0x00800000 +#define SDL_RESIZABLE 0x01000000 +#define SDL_NOFRAME 0x02000000 +#define SDL_OPENGL 0x04000000 +#define SDL_HWSURFACE 0x08000001 + +#define SDL_DEFAULT_REPEAT_DELAY 500 +#define SDL_DEFAULT_REPEAT_INTERVAL 30 + + +// functions subset +extern SDL_DECLSPEC int SDL_CALL SDL_Init(Uint32 flags); +extern SDL_DECLSPEC void SDL_CALL SDL_Quit(); +extern SDL_DECLSPEC char * SDL_CALL SDL_GetError(); +extern SDL_DECLSPEC const SDL_VideoInfo * SDL_CALL SDL_GetVideoInfo(); +extern SDL_DECLSPEC struct SDL_Surface * SDL_CALL SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags); +extern SDL_DECLSPEC int SDL_CALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); +extern SDL_DECLSPEC void SDL_CALL SDL_GL_SwapBuffers(); +extern SDL_DECLSPEC void SDL_CALL SDL_WM_SetCaption(const char *title, const char *icon); +extern SDL_DECLSPEC void SDL_CALL SDL_WM_GetCaption(char **title, char **icon); +extern SDL_DECLSPEC int SDL_CALL SDL_EnableUNICODE(int enable); +extern SDL_DECLSPEC int SDL_CALL SDL_EnableKeyRepeat(int delay, int interval); +extern SDL_DECLSPEC Uint32 SDL_CALL SDL_GetTicks(); +extern SDL_DECLSPEC int SDL_CALL SDL_PollEvent(SDL_Event *event); +extern SDL_DECLSPEC int SDL_CALL SDL_WaitEvent(SDL_Event *event); +extern SDL_DECLSPEC int SDL_CALL SDL_PushEvent(SDL_Event *event); + + +#ifdef __cplusplus +} +#endif + +#endif // !defined MINI_SDL_INCLUDED + diff --git a/AntTweakBar/src/MiniSFML16.h b/AntTweakBar/src/MiniSFML16.h new file mode 100644 index 0000000..672896d --- /dev/null +++ b/AntTweakBar/src/MiniSFML16.h @@ -0,0 +1,220 @@ +// --------------------------------------------------------------------------- +// +// @file MiniSFML16.h +// @brief A subset of SFML 1.6 definitions needed to compile helper +// functions implemented in TwEventSFML.cpp +// +// notes: - Private header +// - AntTweakBar.dll does not need to link with SFML, +// it just needs some definitions for its helper functions. +// - This header is provided to avoid the need of having SFML +// installed to recompile AntTweakBar. +// It declares a small and incomplete part of SFML classes. +// For instance, many non-virtual methods have been stripped out. +// - Do not use this header in your own programs, better use the +// SFML headers from the actual SFML library SDK : +// http://www.sfml-dev.org +// +// --------------------------------------------------------------------------- + +#if !defined MINI_SFML16_INCLUDED +#define MINI_SFML16_INCLUDED + +namespace sf +{ + + namespace Key { enum Code + { + A = 'a', B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, + Num0 = '0', Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, + Escape = 256, + LControl, LShift, LAlt, LSystem, + RControl, RShift, RAlt, RSystem, Menu, + LBracket, RBracket, SemiColon, Comma, Period, Quote, Slash, BackSlash, + Tilde, Equal, Dash, Space, Return, Back, Tab, + PageUp, PageDown, End, Home, Insert, Delete, + Add, Subtract, Multiply, Divide, Left, Right, Up, Down, + Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, + F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, Pause, + Count + }; } + + namespace Mouse { enum Button { Left, Right, Middle, XButton1, XButton2, Count }; } + + namespace Joy { enum Axis { AxisX, AxisY, AxisZ, AxisR, AxisU, AxisV, AxisPOV, AxisCount }; + enum { Count = 4, ButtonCount = 32}; } + + typedef unsigned char Uint8; + typedef unsigned int Uint32; + + class Event + { + public : + struct KeyEvent { Key::Code Code; bool Alt, Control, Shift; }; + struct TextEvent { Uint32 Unicode; }; + struct MouseMoveEvent { int X, Y; }; + struct MouseButtonEvent { Mouse::Button Button; int X, Y; }; + struct MouseWheelEvent { int Delta; }; + struct JoyMoveEvent { unsigned int JoystickId; Joy::Axis Axis; float Position; }; + struct JoyButtonEvent { unsigned int JoystickId, Button; }; + struct SizeEvent { unsigned int Width, Height; }; + enum EventType + { + Closed, Resized, LostFocus, GainedFocus, TextEntered, KeyPressed, KeyReleased, + MouseWheelMoved, MouseButtonPressed, MouseButtonReleased, MouseMoved, MouseEntered, MouseLeft, + JoyButtonPressed, JoyButtonReleased, JoyMoved + }; + EventType Type; + union + { + KeyEvent Key; + TextEvent Text; + MouseMoveEvent MouseMove; + MouseButtonEvent MouseButton; + MouseWheelEvent MouseWheel; + JoyMoveEvent JoyMove; + JoyButtonEvent JoyButton; + SizeEvent Size; + }; + }; + +} // namespace sf + + +#ifdef USE_MINI_SFML +// we also need some the definition of sf::RenderWindow to compile our SFML example + +#include +#include + +namespace sf +{ + + class Input; + class Drawable; + typedef void* WindowHandle; + namespace priv { class WindowImpl; } + + class WindowListener + { + public : + virtual void OnEvent(const Event& EventReceived) = 0; + protected : + virtual ~WindowListener(); + }; + + class VideoMode + { + public : + VideoMode(unsigned int ModeWidth, unsigned int ModeHeight, unsigned int ModeBpp = 32); + unsigned int Width, Height, BitsPerPixel; + }; + + namespace Style { enum { None = 0, Titlebar = 1 << 0, Resize = 1 << 1, Close = 1 << 2, Fullscreen = 1 << 3 }; } + + struct WindowSettings + { + explicit WindowSettings(unsigned int Depth = 24, unsigned int Stencil = 8, unsigned int Antialiasing = 0); + unsigned int DepthBits, StencilBits, AntialiasingLevel; + }; + + class Clock + { + public : + Clock(); + float GetElapsedTime() const; + void Reset(); + private : + double myStartTime; + }; + + class Input : public WindowListener + { + private : + virtual void OnEvent(const Event& EventReceived); + bool myKeys[Key::Count]; + bool myMouseButtons[Mouse::Count]; + int myMouseX; + int myMouseY; + bool myJoystickButtons[Joy::Count][Joy::ButtonCount]; + float myJoystickAxis[Joy::Count][Joy::AxisCount]; + }; + + class Window : public WindowListener + { + public : + Window(VideoMode Mode, const std::string& Title, unsigned long WindowStyle = Style::Resize | Style::Close, const WindowSettings& Params = WindowSettings()); + virtual ~Window(); + void Close(); + bool IsOpened() const; + unsigned int GetWidth() const; + unsigned int GetHeight() const; + bool GetEvent(Event& EventReceived); + void Display(); + private : + virtual void OnCreate(); + virtual void OnEvent(const Event& EventReceived); + priv::WindowImpl* myWindow; + std::queue myEvents; + Input myInput; + Clock myClock; + WindowSettings mySettings; + float myLastFrameTime; + bool myIsExternal; + unsigned int myFramerateLimit; + int mySetCursorPosX; + int mySetCursorPosY; + }; + + template class Vector2 { public : T x, y; }; + typedef Vector2 Vector2f; + + template class Rect { public : T Left, Top, Right, Bottom; }; + typedef Rect FloatRect; + + class Matrix3 { private : float myData[16]; }; + + class View + { + private : + sf::Vector2f myCenter; + sf::Vector2f myHalfSize; + FloatRect myRect; + Matrix3 myMatrix; + bool myNeedUpdate; + }; + + class RenderTarget + { + public : + virtual ~RenderTarget(); + virtual void Draw(const Drawable& Object); + virtual unsigned int GetWidth() const = 0; + virtual unsigned int GetHeight() const = 0; + void PreserveOpenGLStates(bool Preserve); + private : + virtual bool Activate(bool Active) = 0; + View myDefaultView; + const View* myCurrentView; + bool myPreserveStates; + bool myIsDrawing; + }; + + class RenderWindow : public Window, public RenderTarget + { + public : + RenderWindow(VideoMode Mode, const std::string& Title, unsigned long WindowStyle = Style::Resize | Style::Close, const WindowSettings& Params = WindowSettings()); + virtual ~RenderWindow(); + virtual unsigned int GetWidth() const; + virtual unsigned int GetHeight() const; + private : + virtual void OnCreate(); + virtual bool Activate(bool Active); + }; + +} // namespace sf + +#endif // USE_MINI_SFML + +#endif // !defined MINI_SFML16_INCLUDED + diff --git a/AntTweakBar/src/Readme.txt b/AntTweakBar/src/Readme.txt new file mode 100644 index 0000000..325ec10 --- /dev/null +++ b/AntTweakBar/src/Readme.txt @@ -0,0 +1,12 @@ +Under Windows, it is not necessary to rebuild AntTweakBar since a precompiled +version is provided in the lib directory. But if you want to recompile it, +you can use the provided Visual Studio solution. You'd also need the DirectX +SDK (http://msdn.microsoft.com/directx) and the path to the DirectX shader +compiler fxc.exe (included in the DirectX SDK) must be listed in the VC++ +directories. + +To build the library on Linux, open a terminal, go in the src directory and +type make + +To build the library on MacOSX, open a terminal, go in the src directory and +type make -f Makefile.osx diff --git a/AntTweakBar/src/TwBar.cpp b/AntTweakBar/src/TwBar.cpp new file mode 100644 index 0000000..9507a21 --- /dev/null +++ b/AntTweakBar/src/TwBar.cpp @@ -0,0 +1,7771 @@ +// --------------------------------------------------------------------------- +// +// @file TwBar.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include +#include "TwMgr.h" +#include "TwBar.h" +#include "TwColors.h" + +using namespace std; + +extern const char *g_ErrNotFound; +const char *g_ErrUnknownAttrib = "Unknown parameter"; +const char *g_ErrInvalidAttrib = "Invalid parameter"; +const char *g_ErrNotGroup = "Value is not a group"; +const char *g_ErrNoValue = "Value required"; +const char *g_ErrBadValue = "Bad value"; +const char *g_ErrUnknownType = "Unknown type"; +const char *g_ErrNotEnum = "Must be of type Enum"; + +#undef PERF // comment to print benchs +#define PERF(cmd) + + +PerfTimer g_BarTimer; + +#define ANT_SET_CURSOR(_Name) g_TwMgr->SetCursor(g_TwMgr->m_Cursor##_Name) +#define ANT_SET_ROTO_CURSOR(_Num) g_TwMgr->SetCursor(g_TwMgr->m_RotoCursors[_Num]) + +#if !defined(ANT_WINDOWS) +# define _stricmp strcasecmp +# define _strdup strdup +#endif // defined(ANT_WINDOWS) + +#if !defined(M_PI) +# define M_PI 3.1415926535897932384626433832795 +#endif // !defined(M_PI) + +const float FLOAT_MAX = 3.0e+38f; +const double DOUBLE_MAX = 1.0e+308; +const double DOUBLE_EPS = 1.0e-307; + +bool IsCustomType(int _Type) +{ + return (g_TwMgr && _Type>=TW_TYPE_CUSTOM_BASE && _Typem_Customs.size()); +} + +bool IsCSStringType(int _Type) +{ + return (_Type>TW_TYPE_CSSTRING_BASE && _Type<=TW_TYPE_CSSTRING_MAX); +} + +bool IsEnumType(int _Type) +{ + return (g_TwMgr && _Type>=TW_TYPE_ENUM_BASE && _Typem_Enums.size()); +} + +// --------------------------------------------------------------------------- + +CTwVar::CTwVar() +{ + m_IsRoot = false; + m_DontClip = false; + m_Visible = true; + m_LeftMargin = 0; + m_TopMargin = 0; + m_ColorPtr = &COLOR32_WHITE; + m_BgColorPtr = &COLOR32_ZERO; // default +} + +CTwVarAtom::CTwVarAtom() +{ + m_Type = TW_TYPE_UNDEF; + m_Ptr = NULL; + m_SetCallback = NULL; + m_GetCallback = NULL; + m_ClientData = NULL; + m_ReadOnly = false; + m_NoSlider = false; + m_KeyIncr[0] = 0; + m_KeyIncr[1] = 0; + m_KeyDecr[0] = 0; + m_KeyDecr[1] = 0; + memset(&m_Val, 0, sizeof(UVal)); +} + +CTwVarAtom::~CTwVarAtom() +{ + if( m_Type==TW_TYPE_BOOL8 || m_Type==TW_TYPE_BOOL16 || m_Type==TW_TYPE_BOOL32 || m_Type==TW_TYPE_BOOLCPP ) + { + if( m_Val.m_Bool.m_FreeTrueString && m_Val.m_Bool.m_TrueString!=NULL ) + { + free(m_Val.m_Bool.m_TrueString); + m_Val.m_Bool.m_TrueString = NULL; + } + if( m_Val.m_Bool.m_FreeFalseString && m_Val.m_Bool.m_FalseString!=NULL ) + { + free(m_Val.m_Bool.m_FalseString); + m_Val.m_Bool.m_FalseString = NULL; + } + } + else if( m_Type==TW_TYPE_CDSTDSTRING && m_GetCallback==CTwMgr::CCDStdString::GetCB && m_ClientData!=NULL && g_TwMgr!=NULL ) + { + // delete corresponding g_TwMgr->m_CDStdStrings element + const CTwMgr::CCDStdString *CDStdString = (const CTwMgr::CCDStdString *)m_ClientData; + //if( &(*CDStdString->m_This)==CDStdString ) + // g_TwMgr->m_CDStdStrings.erase(CDStdString->m_This); + for( list::iterator it=g_TwMgr->m_CDStdStrings.begin(); it!=g_TwMgr->m_CDStdStrings.end(); ++it ) + if( &(*it)==CDStdString ) + { + g_TwMgr->m_CDStdStrings.erase(it); + break; + } + } + /* + else if( m_Type==TW_TYPE_ENUM8 || m_Type==TW_TYPE_ENUM16 || m_Type==TW_TYPE_ENUM32 ) + { + if( m_Val.m_Enum.m_Entries!=NULL ) + { + delete m_Val.m_Enum.m_Entries; + m_Val.m_Enum.m_Entries = NULL; + } + } + */ +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::ValueToString(string *_Str) const +{ + assert(_Str!=NULL); + static const char *ErrStr = "unreachable"; + char Tmp[1024]; + if( m_Type==TW_TYPE_UNDEF || m_Type==TW_TYPE_HELP_ATOM || m_Type==TW_TYPE_HELP_GRP || m_Type==TW_TYPE_BUTTON ) // has no value + { + *_Str = ""; + return; + } + else if( m_Type==TW_TYPE_HELP_HEADER ) + { + *_Str = "SHORTCUTS"; + return; + } + else if( m_Type==TW_TYPE_SHORTCUT ) // special case for help bar: display shortcut + { + *_Str = ""; + if( m_ReadOnly && m_Val.m_Shortcut.m_Incr[0]==0 && m_Val.m_Shortcut.m_Decr[0]==0 ) + (*_Str) = "(read only)"; + else + { + if( m_Val.m_Shortcut.m_Incr[0]>0 ) + TwGetKeyString(_Str, m_Val.m_Shortcut.m_Incr[0], m_Val.m_Shortcut.m_Incr[1]); + else + (*_Str) += "(none)"; + if( m_Val.m_Shortcut.m_Decr[0]>0 ) + { + (*_Str) += " "; + TwGetKeyString(_Str, m_Val.m_Shortcut.m_Decr[0], m_Val.m_Shortcut.m_Decr[1]); + } + } + return; + } + else if( m_Type==TW_TYPE_HELP_STRUCT ) + { + int idx = m_Val.m_HelpStruct.m_StructType - TW_TYPE_STRUCT_BASE; + if( idx>=0 && idx<(int)g_TwMgr->m_Structs.size() ) + { + if( g_TwMgr->m_Structs[idx].m_Name.length()>0 ) + (*_Str) = '{' + g_TwMgr->m_Structs[idx].m_Name + '}'; + else + (*_Str) = "{struct}"; + } + return; + } + + if( m_Ptr==NULL && m_GetCallback==NULL ) + { + *_Str = ErrStr; + return; + } + bool UseGet = (m_GetCallback!=NULL); + switch( m_Type ) + { + case TW_TYPE_BOOLCPP: + { + bool Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(bool *)m_Ptr; + if( Val ) + *_Str = (m_Val.m_Bool.m_TrueString!=NULL) ? m_Val.m_Bool.m_TrueString : "1"; + else + *_Str = (m_Val.m_Bool.m_FalseString!=NULL) ? m_Val.m_Bool.m_FalseString : "0"; + } + break; + case TW_TYPE_BOOL8: + { + char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(char *)m_Ptr; + if( Val ) + *_Str = (m_Val.m_Bool.m_TrueString!=NULL) ? m_Val.m_Bool.m_TrueString : "1"; + else + *_Str = (m_Val.m_Bool.m_FalseString!=NULL) ? m_Val.m_Bool.m_FalseString : "0"; + } + break; + case TW_TYPE_BOOL16: + { + short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(short *)m_Ptr; + if( Val ) + *_Str = (m_Val.m_Bool.m_TrueString!=NULL) ? m_Val.m_Bool.m_TrueString : "1"; + else + *_Str = (m_Val.m_Bool.m_FalseString!=NULL) ? m_Val.m_Bool.m_FalseString : "0"; + } + break; + case TW_TYPE_BOOL32: + { + int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(int *)m_Ptr; + if( Val ) + *_Str = (m_Val.m_Bool.m_TrueString!=NULL) ? m_Val.m_Bool.m_TrueString : "1"; + else + *_Str = (m_Val.m_Bool.m_FalseString!=NULL) ? m_Val.m_Bool.m_FalseString : "0"; + } + break; + case TW_TYPE_CHAR: + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + if( Val!=0 ) + { + int d = Val; + if( m_Val.m_Char.m_Hexa ) + sprintf(Tmp, "%c (0x%.2X)", Val, d); + else + sprintf(Tmp, "%c (%d)", Val, d); + *_Str = Tmp; + } + else + { + *_Str = " (0)"; + const_cast(_Str->c_str())[0] = '\0'; + } + } + break; + case TW_TYPE_INT8: + { + signed char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(signed char *)m_Ptr; + int d = Val; + if( m_Val.m_Int8.m_Hexa ) + sprintf(Tmp, "0x%.2X", d&0xff); + else + sprintf(Tmp, "%d", d); + *_Str = Tmp; + } + break; + case TW_TYPE_UINT8: + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + unsigned int d = Val; + if( m_Val.m_UInt8.m_Hexa ) + sprintf(Tmp, "0x%.2X", d); + else + sprintf(Tmp, "%u", d); + *_Str = Tmp; + } + break; + case TW_TYPE_INT16: + { + short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(short *)m_Ptr; + int d = Val; + if( m_Val.m_Int16.m_Hexa ) + sprintf(Tmp, "0x%.4X", d&0xffff); + else + sprintf(Tmp, "%d", d); + *_Str = Tmp; + } + break; + case TW_TYPE_UINT16: + { + unsigned short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned short *)m_Ptr; + unsigned int d = Val; + if( m_Val.m_UInt16.m_Hexa ) + sprintf(Tmp, "0x%.4X", d); + else + sprintf(Tmp, "%u", d); + *_Str = Tmp; + } + break; + case TW_TYPE_INT32: + { + int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(int *)m_Ptr; + if( m_Val.m_Int32.m_Hexa ) + sprintf(Tmp, "0x%.8X", Val); + else + sprintf(Tmp, "%d", Val); + *_Str = Tmp; + } + break; + case TW_TYPE_UINT32: + { + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + if( m_Val.m_UInt32.m_Hexa ) + sprintf(Tmp, "0x%.8X", Val); + else + sprintf(Tmp, "%u", Val); + *_Str = Tmp; + } + break; + case TW_TYPE_FLOAT: + { + float Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(float *)m_Ptr; + if( m_Val.m_Float32.m_Precision<0 ) + sprintf(Tmp, "%g", Val); + else + { + char Fmt[64]; + sprintf(Fmt, "%%.%df", (int)m_Val.m_Float32.m_Precision); + sprintf(Tmp, Fmt, Val); + } + *_Str = Tmp; + } + break; + case TW_TYPE_DOUBLE: + { + double Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(double *)m_Ptr; + if( m_Val.m_Float64.m_Precision<0 ) + sprintf(Tmp, "%g", Val); + else + { + char Fmt[128]; + sprintf(Fmt, "%%.%dlf", (int)m_Val.m_Float64.m_Precision); + sprintf(Tmp, Fmt, Val); + } + *_Str = Tmp; + } + break; + case TW_TYPE_STDSTRING: + { + if( UseGet ) + m_GetCallback(_Str, m_ClientData); + else + *_Str = *(std::string *)m_Ptr; + } + break; + /* + case TW_TYPE_ENUM8: + case TW_TYPE_ENUM16: + case TW_TYPE_ENUM32: + { + unsigned int d = 0; + if( m_Type==TW_TYPE_ENUM8 ) + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + d = Val; + } + else if( m_Type==TW_TYPE_ENUM16 ) + { + unsigned short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned short *)m_Ptr; + d = Val; + } + else + { + assert(m_Type==TW_TYPE_ENUM32); + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + d = Val; + } + bool Found = false; + if( m_Val.m_Enum.m_Entries!=NULL ) + { + UVal::CEnumVal::CEntries::iterator It = m_Val.m_Enum.m_Entries->find(d); + if( It!=m_Val.m_Enum.m_Entries->end() ) + { + *_Str = It->second; + Found = true; + } + } + if( !Found ) + { + sprintf(Tmp, "%u", d); + *_Str = Tmp; + } + } + break; + */ + default: + if( IsEnumType(m_Type) ) + { + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + + CTwMgr::CEnum& e = g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE]; + CTwMgr::CEnum::CEntries::iterator It = e.m_Entries.find(Val); + if( It!=e.m_Entries.end() ) + *_Str = It->second; + else + { + sprintf(Tmp, "%u", Val); + *_Str = Tmp; + } + } + else if( IsCSStringType(m_Type) ) + { + char *Val = NULL; + if( UseGet ) + { + int n = TW_CSSTRING_SIZE(m_Type); + if( n+32>(int)g_TwMgr->m_CSStringBuffer.size() ) + g_TwMgr->m_CSStringBuffer.resize(n+32); + Val = &(g_TwMgr->m_CSStringBuffer[0]); + m_GetCallback(Val , m_ClientData); + Val[n] = '\0'; + } + else + Val = (char *)m_Ptr; + if( Val!=NULL ) + *_Str = Val; + else + *_Str = ""; + } + else if( m_Type==TW_TYPE_CDSTRING || m_Type==TW_TYPE_CDSTDSTRING ) + { + char *Val = NULL; + if( UseGet ) + m_GetCallback(&Val , m_ClientData); + else + Val = *(char **)m_Ptr; + if( Val!=NULL ) + *_Str = Val; + else + *_Str = ""; + } + else if( IsCustom() ) // m_Type>=TW_TYPE_CUSTOM_BASE && m_Typem_Customs.size() ) + { + *_Str = ""; + } + else + { + *_Str = "unknown type"; + const_cast(this)->m_ReadOnly = true; + } + } +} + +// --------------------------------------------------------------------------- + +double CTwVarAtom::ValueToDouble() const +{ + if( m_Ptr==NULL && m_GetCallback==NULL ) + return 0; // unreachable + bool UseGet = (m_GetCallback!=NULL); + switch( m_Type ) + { + case TW_TYPE_BOOLCPP: + { + bool Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(bool *)m_Ptr; + if( Val ) + return 1; + else + return 0; + } + break; + case TW_TYPE_BOOL8: + { + char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(char *)m_Ptr; + if( Val ) + return 1; + else + return 0; + } + break; + case TW_TYPE_BOOL16: + { + short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(short *)m_Ptr; + if( Val ) + return 1; + else + return 0; + } + break; + case TW_TYPE_BOOL32: + { + int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(int *)m_Ptr; + if( Val ) + return 1; + else + return 0; + } + break; + case TW_TYPE_CHAR: + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + return Val; + } + break; + case TW_TYPE_INT8: + { + signed char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(signed char *)m_Ptr; + int d = Val; + return d; + } + break; + case TW_TYPE_UINT8: + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + unsigned int d = Val; + return d; + } + break; + case TW_TYPE_INT16: + { + short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(short *)m_Ptr; + int d = Val; + return d; + } + break; + case TW_TYPE_UINT16: + { + unsigned short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned short *)m_Ptr; + unsigned int d = Val; + return d; + } + break; + case TW_TYPE_INT32: + { + int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(int *)m_Ptr; + return Val; + } + break; + case TW_TYPE_UINT32: + { + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + return Val; + } + break; + case TW_TYPE_FLOAT: + { + float Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(float *)m_Ptr; + return Val; + } + break; + case TW_TYPE_DOUBLE: + { + double Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(double *)m_Ptr; + return Val; + } + break; + /* + case TW_TYPE_ENUM8: + case TW_TYPE_ENUM16: + case TW_TYPE_ENUM32: + { + unsigned int d = 0; + if( m_Type==TW_TYPE_ENUM8 ) + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + d = Val; + } + else if( m_Type==TW_TYPE_ENUM16 ) + { + unsigned short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned short *)m_Ptr; + d = Val; + } + else + { + assert(m_Type==TW_TYPE_ENUM32); + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + d = Val; + } + return d; + } + break; + */ + default: + if( IsEnumType(m_Type) ) + { + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + return Val; + } + else + return 0; // unknown type + } +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::ValueFromDouble(double _Val) +{ + if( m_Ptr==NULL && m_SetCallback==NULL ) + return; // unreachable + bool UseSet = (m_SetCallback!=NULL); + switch( m_Type ) + { + case TW_TYPE_BOOLCPP: + { + bool Val = (_Val!=0); + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(bool*)m_Ptr = Val; + } + break; + case TW_TYPE_BOOL8: + { + char Val = (_Val!=0) ? 1 : 0; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(char*)m_Ptr = Val; + } + break; + case TW_TYPE_BOOL16: + { + short Val = (_Val!=0) ? 1 : 0; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(short*)m_Ptr = Val; + } + break; + case TW_TYPE_BOOL32: + { + int Val = (_Val!=0) ? 1 : 0; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(int*)m_Ptr = Val; + } + break; + case TW_TYPE_CHAR: + { + unsigned char Val = (unsigned char)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned char*)m_Ptr = Val; + } + break; + case TW_TYPE_INT8: + { + signed char Val = (signed char)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(signed char*)m_Ptr = Val; + } + break; + case TW_TYPE_UINT8: + //case TW_TYPE_ENUM8: + { + unsigned char Val = (unsigned char)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned char*)m_Ptr = Val; + } + break; + case TW_TYPE_INT16: + { + short Val = (short)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(short*)m_Ptr = Val; + } + break; + case TW_TYPE_UINT16: + //case TW_TYPE_ENUM16: + { + unsigned short Val = (unsigned short)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned short*)m_Ptr = Val; + } + break; + case TW_TYPE_INT32: + { + int Val = (int)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(int*)m_Ptr = Val; + } + break; + case TW_TYPE_UINT32: + //case TW_TYPE_ENUM32: + { + unsigned int Val = (unsigned int)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned int*)m_Ptr = Val; + } + break; + case TW_TYPE_FLOAT: + { + float Val = (float)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(float*)m_Ptr = Val; + } + break; + case TW_TYPE_DOUBLE: + { + double Val = (double)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(double*)m_Ptr = Val; + } + break; + default: + if( IsEnumType(m_Type) ) + { + unsigned int Val = (unsigned int)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned int*)m_Ptr = Val; + } + } +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::MinMaxStepToDouble(double *_Min, double *_Max, double *_Step) const +{ + double max = DOUBLE_MAX; + double min = -DOUBLE_MAX; + double step = 1; + + switch( m_Type ) + { + case TW_TYPE_BOOLCPP: + case TW_TYPE_BOOL8: + case TW_TYPE_BOOL16: + case TW_TYPE_BOOL32: + min = 0; + max = 1; + step = 1; + break; + case TW_TYPE_CHAR: + min = (double)m_Val.m_Char.m_Min; + max = (double)m_Val.m_Char.m_Max; + step = (double)m_Val.m_Char.m_Step; + break; + case TW_TYPE_INT8: + min = (double)m_Val.m_Int8.m_Min; + max = (double)m_Val.m_Int8.m_Max; + step = (double)m_Val.m_Int8.m_Step; + break; + case TW_TYPE_UINT8: + min = (double)m_Val.m_UInt8.m_Min; + max = (double)m_Val.m_UInt8.m_Max; + step = (double)m_Val.m_UInt8.m_Step; + break; + case TW_TYPE_INT16: + min = (double)m_Val.m_Int16.m_Min; + max = (double)m_Val.m_Int16.m_Max; + step = (double)m_Val.m_Int16.m_Step; + break; + case TW_TYPE_UINT16: + min = (double)m_Val.m_UInt16.m_Min; + max = (double)m_Val.m_UInt16.m_Max; + step = (double)m_Val.m_UInt16.m_Step; + break; + case TW_TYPE_INT32: + min = (double)m_Val.m_Int32.m_Min; + max = (double)m_Val.m_Int32.m_Max; + step = (double)m_Val.m_Int32.m_Step; + break; + case TW_TYPE_UINT32: + min = (double)m_Val.m_UInt32.m_Min; + max = (double)m_Val.m_UInt32.m_Max; + step = (double)m_Val.m_UInt32.m_Step; + break; + case TW_TYPE_FLOAT: + min = (double)m_Val.m_Float32.m_Min; + max = (double)m_Val.m_Float32.m_Max; + step = (double)m_Val.m_Float32.m_Step; + break; + case TW_TYPE_DOUBLE: + min = m_Val.m_Float64.m_Min; + max = m_Val.m_Float64.m_Max; + step = m_Val.m_Float64.m_Step; + break; + default: + {} // nothing + } + + if( _Min!=NULL ) + *_Min = min; + if( _Max!=NULL ) + *_Max = max; + if( _Step!=NULL ) + *_Step = step; +} + +// --------------------------------------------------------------------------- + +const CTwVar *CTwVarAtom::Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const +{ + if( strcmp(_Name, m_Name.c_str())==0 ) + { + if( _Parent!=NULL ) + *_Parent = NULL; + if( _Index!=NULL ) + *_Index = -1; + return this; + } + else + return NULL; +} + +// --------------------------------------------------------------------------- + +enum EVarAttribs +{ + V_LABEL = 1, + V_HELP, + V_GROUP, + V_SHOW, + V_HIDE, + V_READONLY, + V_READWRITE, + V_ORDER, + V_VISIBLE, + V_ENDTAG +}; + +int CTwVar::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = true; + if( _stricmp(_Attrib, "label")==0 ) + return V_LABEL; + else if( _stricmp(_Attrib, "help")==0 ) + return V_HELP; + else if( _stricmp(_Attrib, "group")==0 ) + return V_GROUP; + else if( _stricmp(_Attrib, "order")==0 ) + return V_ORDER; + else if( _stricmp(_Attrib, "visible")==0 ) + return V_VISIBLE; + else if( _stricmp(_Attrib, "readonly")==0 ) + return V_READONLY; + + // for backward compatibility + *_HasValue = false; + if( _stricmp(_Attrib, "show")==0 ) + return V_SHOW; + else if( _stricmp(_Attrib, "hide")==0 ) + return V_HIDE; + if( _stricmp(_Attrib, "readonly")==0 ) + return V_READONLY; + else if( _stricmp(_Attrib, "readwrite")==0 ) + return V_READWRITE; + + return 0; // not found +} + +int CTwVar::SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex) +{ + switch( _AttribID ) + { + case V_LABEL: + case V_HELP: + if( _Value && strlen(_Value)>0 ) + { + /* + if( IsGroup() && static_cast(this)->m_StructValuePtr!=NULL ) + { + int Idx = static_cast(this)->m_StructType-TW_TYPE_STRUCT_BASE; + if( Idx>=0 && Idx<(int)g_TwMgr->m_Structs.size() ) + if( _AttribID==V_LABEL ) + g_TwMgr->m_Structs[Idx].m_Label = _Value; + else // V_HELP + g_TwMgr->m_Structs[Idx].m_Help = _Value; + } + else + */ + { + CTwVarGroup *Parent = NULL; + CTwVar *ThisVar = _Bar->Find(m_Name.c_str(), &Parent); + if( this==ThisVar && Parent!=NULL && Parent->m_StructValuePtr!=NULL ) + { + int Idx = Parent->m_StructType-TW_TYPE_STRUCT_BASE; + if( Idx>=0 && Idx<(int)g_TwMgr->m_Structs.size() ) + { + size_t nl = m_Name.length(); + for( size_t im=0; imm_Structs[Idx].m_Members.size(); ++im ) + { + size_t ml = g_TwMgr->m_Structs[Idx].m_Members[im].m_Name.length(); + if( nl>=ml && strcmp(g_TwMgr->m_Structs[Idx].m_Members[im].m_Name.c_str(), m_Name.c_str()+(nl-ml))==0 ) + { + // TODO: would have to be applied to other vars already created + if( _AttribID==V_LABEL ) + { + g_TwMgr->m_Structs[Idx].m_Members[im].m_Label = _Value; +// m_Label = _Value; + } + else // V_HELP + g_TwMgr->m_Structs[Idx].m_Members[im].m_Help = _Value; + break; + } + } + } + } + else + { + if( _AttribID==V_LABEL ) + m_Label = _Value; + else // V_HELP + m_Help = _Value; + } + } + _Bar->NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case V_GROUP: + { + CTwVarGroup *Grp = NULL; + if( _Value==NULL || strlen(_Value)<=0 ) + Grp = &(_Bar->m_VarRoot); + else + { + CTwVar *v = _Bar->Find(_Value, NULL, NULL); + if( v && !v->IsGroup() ) + { + g_TwMgr->SetLastError(g_ErrNotGroup); + return 0; + } + Grp = static_cast(v); + if( Grp==NULL ) + { + Grp = new CTwVarGroup; + Grp->m_Name = _Value; + Grp->m_Open = true; + Grp->m_SummaryCallback = NULL; + Grp->m_SummaryClientData = NULL; + Grp->m_StructValuePtr = NULL; + Grp->m_ColorPtr = &(_Bar->m_ColGrpText); + _Bar->m_VarRoot.m_Vars.push_back(Grp); + } + } + Grp->m_Vars.push_back(this); + if( _VarParent!=NULL && _VarIndex>=0 ) + { + _VarParent->m_Vars.erase(_VarParent->m_Vars.begin()+_VarIndex); + if( _VarParent!=&(_Bar->m_VarRoot) && _VarParent->m_Vars.size()<=0 ) + TwRemoveVar(_Bar, _VarParent->m_Name.c_str()); + } + _Bar->NotUpToDate(); + return 1; + } + case V_SHOW: // for backward compatibility + if( !m_Visible ) + { + m_Visible = true; + _Bar->NotUpToDate(); + } + return 1; + case V_HIDE: // for backward compatibility + if( m_Visible ) + { + m_Visible = false; + _Bar->NotUpToDate(); + } + return 1; + /* + case V_READONLY: + SetReadOnly(true); + _Bar->NotUpToDate(); + return 1; + */ + case V_READWRITE: // for backward compatibility + SetReadOnly(false); + _Bar->NotUpToDate(); + return 1; + case V_ORDER: + // a special case for compatibility with deprecated command 'option=ogl/dx' + if( IsGroup() && _Value!=NULL && static_cast(this)->m_SummaryCallback==CColorExt::SummaryCB && static_cast(this)->m_StructValuePtr!=NULL ) // is tw_type_color? + { + if( _stricmp(_Value, "ogl")==0 ) + { + static_cast(static_cast(this)->m_StructValuePtr)->m_OGL = true; + return 1; + } + else if( _stricmp(_Value, "dx")==0 ) + { + static_cast(static_cast(this)->m_StructValuePtr)->m_OGL = false; + return 1; + } + } + // todo: general 'order' command (no else) + return 0; + case V_VISIBLE: + if( _Value!=NULL && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "true")==0 || _stricmp(_Value, "1")==0 ) + { + if( !m_Visible ) + { + m_Visible = true; + _Bar->NotUpToDate(); + } + return 1; + } + else if( _stricmp(_Value, "false")==0 || _stricmp(_Value, "0")==0 ) + { + if( m_Visible ) + { + m_Visible = false; + _Bar->NotUpToDate(); + } + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case V_READONLY: + if( _Value==NULL || strlen(_Value)==0 // no value is acceptable (for backward compatibility) + || _stricmp(_Value, "true")==0 || _stricmp(_Value, "1")==0 ) + { + if( !IsReadOnly() ) + { + SetReadOnly(true); + _Bar->NotUpToDate(); + } + return 1; + } + else if( _stricmp(_Value, "false")==0 || _stricmp(_Value, "0")==0 ) + { + if( IsReadOnly() ) + { + SetReadOnly(false); + _Bar->NotUpToDate(); + } + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return 0; + } +} + + +ERetType CTwVar::GetAttrib(int _AttribID, TwBar * /*_Bar*/, CTwVarGroup * _VarParent, int /*_VarIndex*/, std::vector& outDoubles, std::ostringstream& outString) const +{ + outDoubles.clear(); + outString.clear(); + + switch( _AttribID ) + { + case V_LABEL: + outString << m_Label; + return RET_STRING; + case V_HELP: + outString << m_Help; + return RET_STRING; + case V_GROUP: + if( _VarParent!=NULL ) + outString << _VarParent->m_Name; + return RET_STRING; + case V_VISIBLE: + outDoubles.push_back(m_Visible ? 1 : 0); + return RET_DOUBLE; + case V_READONLY: + outDoubles.push_back(IsReadOnly() ? 1 : 0); + return RET_DOUBLE; + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return RET_ERROR; + } +} + + +// --------------------------------------------------------------------------- + +enum EVarAtomAttribs +{ + VA_KEY_INCR = V_ENDTAG+1, + VA_KEY_DECR, + VA_MIN, + VA_MAX, + VA_STEP, + VA_PRECISION, + VA_HEXA, + VA_DECIMAL, // for backward compatibility + VA_TRUE, + VA_FALSE, + VA_ENUM, + VA_VALUE +}; + +int CTwVarAtom::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = true; + if( _stricmp(_Attrib, "keyincr")==0 || _stricmp(_Attrib, "key")==0 ) + return VA_KEY_INCR; + else if( _stricmp(_Attrib, "keydecr")==0 ) + return VA_KEY_DECR; + else if( _stricmp(_Attrib, "min")==0 ) + return VA_MIN; + else if( _stricmp(_Attrib, "max")==0 ) + return VA_MAX; + else if( _stricmp(_Attrib, "step")==0 ) + return VA_STEP; + else if( _stricmp(_Attrib, "precision")==0 ) + return VA_PRECISION; + else if( _stricmp(_Attrib, "hexa")==0 ) + return VA_HEXA; + else if( _stricmp(_Attrib, "decimal")==0 ) // for backward compatibility + { + *_HasValue = false; + return VA_DECIMAL; + } + else if( _stricmp(_Attrib, "true")==0 ) + return VA_TRUE; + else if( _stricmp(_Attrib, "false")==0 ) + return VA_FALSE; + else if( _stricmp(_Attrib, "enum")==0 + || _stricmp(_Attrib, "val")==0 ) // for backward compatibility + return VA_ENUM; + else if( _stricmp(_Attrib, "value")==0 ) + return VA_VALUE; + + return CTwVar::HasAttrib(_Attrib, _HasValue); +} + +int CTwVarAtom::SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex) +{ + switch( _AttribID ) + { + case VA_KEY_INCR: + { + int Key = 0; + int Mod = 0; + if( TwGetKeyCode(&Key, &Mod, _Value) ) + { + m_KeyIncr[0] = Key; + m_KeyIncr[1] = Mod; + return 1; + } + else + return 0; + } + case VA_KEY_DECR: + { + int Key = 0; + int Mod = 0; + if( TwGetKeyCode(&Key, &Mod, _Value) ) + { + m_KeyDecr[0] = Key; + m_KeyDecr[1] = Mod; + return 1; + } + else + return 0; + } + case VA_TRUE: + if( (m_Type==TW_TYPE_BOOL8 || m_Type==TW_TYPE_BOOL16 || m_Type==TW_TYPE_BOOL32 || m_Type==TW_TYPE_BOOLCPP) && _Value!=NULL ) + { + if( m_Val.m_Bool.m_FreeTrueString && m_Val.m_Bool.m_TrueString!=NULL ) + free(m_Val.m_Bool.m_TrueString); + m_Val.m_Bool.m_TrueString = _strdup(_Value); + m_Val.m_Bool.m_FreeTrueString = true; + return 1; + } + else + return 0; + case VA_FALSE: + if( (m_Type==TW_TYPE_BOOL8 || m_Type==TW_TYPE_BOOL16 || m_Type==TW_TYPE_BOOL32 || m_Type==TW_TYPE_BOOLCPP) && _Value!=NULL ) + { + if( m_Val.m_Bool.m_FreeFalseString && m_Val.m_Bool.m_FalseString!=NULL ) + free(m_Val.m_Bool.m_FalseString); + m_Val.m_Bool.m_FalseString = _strdup(_Value); + m_Val.m_Bool.m_FreeFalseString = true; + return 1; + } + else + return 0; + case VA_MIN: + case VA_MAX: + case VA_STEP: + if( _Value && strlen(_Value)>0 ) + { + void *Ptr = NULL; + const char *Fmt = NULL; + int d = 0; + unsigned int u = 0; + int Num = (_AttribID==VA_STEP) ? 2 : ((_AttribID==VA_MAX) ? 1 : 0); + switch( m_Type ) + { + case TW_TYPE_CHAR: + //Ptr = (&m_Val.m_Char.m_Min) + Num; + //Fmt = "%c"; + Ptr = &u; + Fmt = "%u"; + break; + case TW_TYPE_INT16: + Ptr = (&m_Val.m_Int16.m_Min) + Num; + Fmt = "%hd"; + break; + case TW_TYPE_INT32: + Ptr = (&m_Val.m_Int32.m_Min) + Num; + Fmt = "%d"; + break; + case TW_TYPE_UINT16: + Ptr = (&m_Val.m_UInt16.m_Min) + Num; + Fmt = "%hu"; + break; + case TW_TYPE_UINT32: + Ptr = (&m_Val.m_UInt32.m_Min) + Num; + Fmt = "%u"; + break; + case TW_TYPE_FLOAT: + Ptr = (&m_Val.m_Float32.m_Min) + Num; + Fmt = "%f"; + break; + case TW_TYPE_DOUBLE: + Ptr = (&m_Val.m_Float64.m_Min) + Num; + Fmt = "%lf"; + break; + case TW_TYPE_INT8: + Ptr = &d; + Fmt = "%d"; + break; + case TW_TYPE_UINT8: + Ptr = &u; + Fmt = "%u"; + break; + default: + g_TwMgr->SetLastError(g_ErrUnknownType); + return 0; + } + + if( Fmt!=NULL && Ptr!=NULL && sscanf(_Value, Fmt, Ptr)==1 ) + { + if( m_Type==TW_TYPE_CHAR ) + *((&m_Val.m_Char.m_Min)+Num) = (unsigned char)(u); + else if( m_Type==TW_TYPE_INT8 ) + *((&m_Val.m_Int8.m_Min)+Num) = (signed char)(d); + else if( m_Type==TW_TYPE_UINT8 ) + *((&m_Val.m_UInt8.m_Min)+Num) = (unsigned char)(u); + + // set precision + if( _AttribID==VA_STEP && ((m_Type==TW_TYPE_FLOAT && m_Val.m_Float32.m_Precision<0) || (m_Type==TW_TYPE_DOUBLE && m_Val.m_Float64.m_Precision<0)) ) + { + double Step = fabs( (m_Type==TW_TYPE_FLOAT) ? m_Val.m_Float32.m_Step : m_Val.m_Float64.m_Step ); + signed char *Precision = (m_Type==TW_TYPE_FLOAT) ? &m_Val.m_Float32.m_Precision : &m_Val.m_Float64.m_Precision; + const double K_EPS = 1.0 - 1.0e-6; + if( Step>=1 ) + *Precision = 0; + else if( Step>=0.1*K_EPS ) + *Precision = 1; + else if( Step>=0.01*K_EPS ) + *Precision = 2; + else if( Step>=0.001*K_EPS ) + *Precision = 3; + else if( Step>=0.0001*K_EPS ) + *Precision = 4; + else if( Step>=0.00001*K_EPS ) + *Precision = 5; + else if( Step>=0.000001*K_EPS ) + *Precision = 6; + else if( Step>=0.0000001*K_EPS ) + *Precision = 7; + else if( Step>=0.00000001*K_EPS ) + *Precision = 8; + else if( Step>=0.000000001*K_EPS ) + *Precision = 9; + else if( Step>=0.0000000001*K_EPS ) + *Precision = 10; + else if( Step>=0.00000000001*K_EPS ) + *Precision = 11; + else if( Step>=0.000000000001*K_EPS ) + *Precision = 12; + else + *Precision = -1; + } + + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case VA_PRECISION: + if( _Value && strlen(_Value)>0 ) + { + int Precision = 0; + if( sscanf(_Value, "%d", &Precision)==1 && Precision>=-1 && Precision<=12 ) + { + if( m_Type==TW_TYPE_FLOAT ) + m_Val.m_Float32.m_Precision = (signed char)Precision; + else if ( m_Type==TW_TYPE_DOUBLE ) + m_Val.m_Float64.m_Precision = (signed char)Precision; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case VA_HEXA: + case VA_DECIMAL: + { + bool hexa = false; + if (_AttribID==VA_HEXA) + { + if( _Value==NULL || strlen(_Value)==0 // no value is acceptable (for backward compatibility) + || _stricmp(_Value, "true")==0 || _stricmp(_Value, "1")==0 ) + hexa = true; + } + + switch( m_Type ) + { + case TW_TYPE_CHAR: + m_Val.m_Char.m_Hexa = hexa; + return 1; + case TW_TYPE_INT8: + m_Val.m_Int8.m_Hexa = hexa; + return 1; + case TW_TYPE_INT16: + m_Val.m_Int16.m_Hexa = hexa; + return 1; + case TW_TYPE_INT32: + m_Val.m_Int32.m_Hexa = hexa; + return 1; + case TW_TYPE_UINT8: + m_Val.m_UInt8.m_Hexa = hexa; + return 1; + case TW_TYPE_UINT16: + m_Val.m_UInt16.m_Hexa = hexa; + return 1; + case TW_TYPE_UINT32: + m_Val.m_UInt32.m_Hexa = hexa; + return 1; + default: + return 0; + } + } + case VA_ENUM: + if( _Value && strlen(_Value)>0 && IsEnumType(m_Type) ) + { + const char *s = _Value; + int n = 0, i = 0; + unsigned int u; + bool Cont; + g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.clear(); // anyway reset entries + do + { + Cont = false; + i = 0; + char Sep; + n = sscanf(s, "%u %c%n", &u, &Sep, &i); + if( n==2 && i>0 && ( Sep=='<' || Sep=='{' || Sep=='[' || Sep=='(' ) ) + { + if( Sep=='<' ) // Change to closing separator + Sep = '>'; + else if( Sep=='{' ) + Sep = '}'; + else if( Sep=='[' ) + Sep = ']'; + else if( Sep=='(' ) + Sep = ')'; + s += i; + i = 0; + while( s[i]!=Sep && s[i]!=0 ) + ++i; + if( s[i]==Sep ) + { + //if( m_Val.m_Enum.m_Entries==NULL ) + // m_Val.m_Enum.m_Entries = new UVal::CEnumVal::CEntries; + //UVal::CEnumVal::CEntries::value_type v(u, ""); + CTwMgr::CEnum::CEntries::value_type v(u, ""); + if( i>0 ) + v.second.assign(s, i); + //m_Val.m_Enum.m_Entries->insert(v); + pair ret; + ret = g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.insert(v); + if( !ret.second ) // force overwrite if element already exists + { + g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.erase(ret.first); + g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.insert(v); + } + + s += i+1; + i = 0; + n = sscanf(s, " ,%n", &i); + if( n==0 && i>=1 ) + { + s += i; + Cont = true; + } + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } while( Cont ); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + break; + case VA_VALUE: + if( _Value!=NULL && strlen(_Value)>0 ) // do not check ReadOnly here. + { + if( !( m_Type==TW_TYPE_BUTTON || IsCustom() ) ) // || (m_Type>=TW_TYPE_CUSTOM_BASE && m_Typem_Customs.size()) ) ) + { + if( m_Type==TW_TYPE_CDSTRING || m_Type==TW_TYPE_CDSTDSTRING ) + { + if( m_SetCallback!=NULL ) + { + m_SetCallback(&_Value, m_ClientData); + if( g_TwMgr!=NULL ) // Mgr might have been destroyed by the client inside a callback call + _Bar->NotUpToDate(); + return 1; + } + else if( m_Type!=TW_TYPE_CDSTDSTRING ) + { + char **StringPtr = (char **)m_Ptr; + if( StringPtr!=NULL && g_TwMgr->m_CopyCDStringToClient!=NULL ) + { + g_TwMgr->m_CopyCDStringToClient(StringPtr, _Value); + _Bar->NotUpToDate(); + return 1; + } + } + } + else if( IsCSStringType(m_Type) ) + { + int n = TW_CSSTRING_SIZE(m_Type); + if( n>0 ) + { + string str = _Value; + if( (int)str.length()>n-1 ) + str.resize(n-1); + if( m_SetCallback!=NULL ) + { + m_SetCallback(str.c_str(), m_ClientData); + if( g_TwMgr!=NULL ) // Mgr might have been destroyed by the client inside a callback call + _Bar->NotUpToDate(); + return 1; + } + else if( m_Ptr!=NULL ) + { + if( n>1 ) + strncpy((char *)m_Ptr, str.c_str(), n-1); + ((char *)m_Ptr)[n-1] = '\0'; + _Bar->NotUpToDate(); + return 1; + } + } + } + else + { + double dbl; + if( sscanf(_Value, "%lf", &dbl)==1 ) + { + ValueFromDouble(dbl); + if( g_TwMgr!=NULL ) // Mgr might have been destroyed by the client inside a callback call + _Bar->NotUpToDate(); + return 1; + } + } + } + } + return 0; + default: + return CTwVar::SetAttrib(_AttribID, _Value, _Bar, _VarParent, _VarIndex); + } +} + +ERetType CTwVarAtom::GetAttrib(int _AttribID, TwBar *_Bar, CTwVarGroup *_VarParent, int _VarIndex, std::vector& outDoubles, std::ostringstream& outString) const +{ + outDoubles.clear(); + outString.clear(); + std::string str; + int num = 0; + + switch( _AttribID ) + { + case VA_KEY_INCR: + if( TwGetKeyString(&str, m_KeyIncr[0], m_KeyIncr[1]) ) + outString << str; + return RET_STRING; + case VA_KEY_DECR: + if( TwGetKeyString(&str, m_KeyDecr[0], m_KeyDecr[1]) ) + outString << str; + return RET_STRING; + case VA_TRUE: + if( m_Type==TW_TYPE_BOOL8 || m_Type==TW_TYPE_BOOL16 || m_Type==TW_TYPE_BOOL32 || m_Type==TW_TYPE_BOOLCPP ) + { + outString << m_Val.m_Bool.m_TrueString; + return RET_STRING; + } + else + { + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + } + case VA_FALSE: + if( m_Type==TW_TYPE_BOOL8 || m_Type==TW_TYPE_BOOL16 || m_Type==TW_TYPE_BOOL32 || m_Type==TW_TYPE_BOOLCPP ) + { + outString << m_Val.m_Bool.m_FalseString; + return RET_STRING; + } + else + { + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + } + case VA_MIN: + case VA_MAX: + case VA_STEP: + num = (_AttribID==VA_STEP) ? 2 : ((_AttribID==VA_MAX) ? 1 : 0); + switch( m_Type ) + { + case TW_TYPE_CHAR: + outDoubles.push_back( *((&m_Val.m_Char.m_Min) + num) ); + return RET_DOUBLE; + case TW_TYPE_INT8: + outDoubles.push_back( *((&m_Val.m_Int8.m_Min) + num) ); + return RET_DOUBLE; + case TW_TYPE_UINT8: + outDoubles.push_back( *((&m_Val.m_UInt8.m_Min) + num) ); + return RET_DOUBLE; + case TW_TYPE_INT16: + outDoubles.push_back( *((&m_Val.m_Int16.m_Min) + num) ); + return RET_DOUBLE; + case TW_TYPE_INT32: + outDoubles.push_back( *((&m_Val.m_Int32.m_Min) + num) ); + return RET_DOUBLE; + case TW_TYPE_UINT16: + outDoubles.push_back( *((&m_Val.m_UInt16.m_Min) + num) ); + return RET_DOUBLE; + case TW_TYPE_UINT32: + outDoubles.push_back( *((&m_Val.m_UInt32.m_Min) + num) ); + return RET_DOUBLE; + case TW_TYPE_FLOAT: + outDoubles.push_back( *((&m_Val.m_Float32.m_Min) + num) ); + return RET_DOUBLE; + case TW_TYPE_DOUBLE: + outDoubles.push_back( *((&m_Val.m_Float64.m_Min) + num) ); + return RET_DOUBLE; + default: + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + } + case VA_PRECISION: + if( m_Type==TW_TYPE_FLOAT ) + { + outDoubles.push_back( m_Val.m_Float32.m_Precision ); + return RET_DOUBLE; + } + else if ( m_Type==TW_TYPE_DOUBLE ) + { + outDoubles.push_back( m_Val.m_Float64.m_Precision ); + return RET_DOUBLE; + } + else + { + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + } + case VA_HEXA: + switch( m_Type ) + { + case TW_TYPE_CHAR: + outDoubles.push_back( m_Val.m_Char.m_Hexa ); + return RET_DOUBLE; + case TW_TYPE_INT8: + outDoubles.push_back( m_Val.m_Int8.m_Hexa ); + return RET_DOUBLE; + case TW_TYPE_INT16: + outDoubles.push_back( m_Val.m_Int16.m_Hexa ); + return RET_DOUBLE; + case TW_TYPE_INT32: + outDoubles.push_back( m_Val.m_Int32.m_Hexa ); + return RET_DOUBLE; + case TW_TYPE_UINT8: + outDoubles.push_back( m_Val.m_UInt8.m_Hexa ); + return RET_DOUBLE; + case TW_TYPE_UINT16: + outDoubles.push_back( m_Val.m_UInt16.m_Hexa ); + return RET_DOUBLE; + case TW_TYPE_UINT32: + outDoubles.push_back( m_Val.m_UInt32.m_Hexa ); + return RET_DOUBLE; + default: + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + } + case VA_ENUM: + if( IsEnumType(m_Type) ) + { + CTwMgr::CEnum::CEntries::iterator it = g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.begin(); + for( ; it != g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.end(); ++it ) + { + if( it != g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.begin() ) + outString << ','; + outString << it->first << ' '; + if( it->second.find_first_of("{}")==std::string::npos ) + outString << '{' << it->second << '}'; + else if ( it->second.find_first_of("<>")==std::string::npos ) + outString << '<' << it->second << '>'; + else if ( it->second.find_first_of("()")==std::string::npos ) + outString << '(' << it->second << ')'; + else if ( it->second.find_first_of("[]")==std::string::npos ) + outString << '[' << it->second << ']'; + else + outString << '{' << it->second << '}'; // should not occured (use braces) + } + return RET_STRING; + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + case VA_VALUE: + if( !( m_Type==TW_TYPE_BUTTON || IsCustom() ) ) // || (m_Type>=TW_TYPE_CUSTOM_BASE && m_Typem_Customs.size()) ) ) + { + if( m_Type==TW_TYPE_CDSTRING || m_Type==TW_TYPE_CDSTDSTRING || IsCSStringType(m_Type) ) + { + string str; + ValueToString(&str); + outString << str; + return RET_STRING; + } + else + { + outDoubles.push_back( ValueToDouble() ); + return RET_DOUBLE; + } + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + default: + return CTwVar::GetAttrib(_AttribID, _Bar, _VarParent, _VarIndex, outDoubles, outString); + } +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::Increment(int _Step) +{ + if( _Step==0 ) + return; + switch( m_Type ) + { + case TW_TYPE_BOOL8: + { + char v = false; + if( m_Ptr!=NULL ) + v = *((char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( v ) + v = false; + else + v = true; + if( m_Ptr!=NULL ) + *((char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_BOOL16: + { + short v = false; + if( m_Ptr!=NULL ) + v = *((short *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( v ) + v = false; + else + v = true; + if( m_Ptr!=NULL ) + *((short *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_BOOL32: + { + int v = false; + if( m_Ptr!=NULL ) + v = *((int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( v ) + v = false; + else + v = true; + if( m_Ptr!=NULL ) + *((int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_BOOLCPP: + { + bool v = false; + if( m_Ptr!=NULL ) + v = *((bool *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( v ) + v = false; + else + v = true; + if( m_Ptr!=NULL ) + *((bool *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_CHAR: + { + unsigned char v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_Char.m_Step + (int)v; + if( ivm_Val.m_Char.m_Max ) + iv = m_Val.m_Char.m_Max; + if( iv<0 ) + iv = 0; + else if( iv>0xff ) + iv = 0xff; + v = (unsigned char)iv; + if( m_Ptr!=NULL ) + *((unsigned char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_INT8: + { + signed char v = 0; + if( m_Ptr!=NULL ) + v = *((signed char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_Int8.m_Step + (int)v; + if( ivm_Val.m_Int8.m_Max ) + iv = m_Val.m_Int8.m_Max; + v = (signed char)iv; + if( m_Ptr!=NULL ) + *((signed char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_UINT8: + { + unsigned char v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_UInt8.m_Step + (int)v; + if( ivm_Val.m_UInt8.m_Max ) + iv = m_Val.m_UInt8.m_Max; + if( iv<0 ) + iv = 0; + else if( iv>0xff ) + iv = 0xff; + v = (unsigned char)iv; + if( m_Ptr!=NULL ) + *((unsigned char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_INT16: + { + short v = 0; + if( m_Ptr!=NULL ) + v = *((short *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_Int16.m_Step + (int)v; + if( ivm_Val.m_Int16.m_Max ) + iv = m_Val.m_Int16.m_Max; + v = (short)iv; + if( m_Ptr!=NULL ) + *((short *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_UINT16: + { + unsigned short v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned short *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_UInt16.m_Step + (int)v; + if( ivm_Val.m_UInt16.m_Max ) + iv = m_Val.m_UInt16.m_Max; + if( iv<0 ) + iv = 0; + else if( iv>0xffff ) + iv = 0xffff; + v = (unsigned short)iv; + if( m_Ptr!=NULL ) + *((unsigned short *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_INT32: + { + int v = 0; + if( m_Ptr!=NULL ) + v = *((int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + double dv = (double)_Step*(double)m_Val.m_Int32.m_Step + (double)v; + if( dv>(double)0x7fffffff ) + v = 0x7fffffff; + else if( dv<(double)(-0x7fffffff-1) ) + v = -0x7fffffff-1; + else + v = _Step*m_Val.m_Int32.m_Step + v; + if( vm_Val.m_Int32.m_Max ) + v = m_Val.m_Int32.m_Max; + if( m_Ptr!=NULL ) + *((int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_UINT32: + { + unsigned int v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + double dv = (double)_Step*(double)m_Val.m_UInt32.m_Step + (double)v; + if( dv>(double)0xffffffff ) + v = 0xffffffff; + else if( dv<0 ) + v = 0; + else + v = _Step*m_Val.m_UInt32.m_Step + v; + if( vm_Val.m_UInt32.m_Max ) + v = m_Val.m_UInt32.m_Max; + if( m_Ptr!=NULL ) + *((unsigned int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_FLOAT: + { + float v = 0; + if( m_Ptr!=NULL ) + v = *((float *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + v += _Step*m_Val.m_Float32.m_Step; + if( vm_Val.m_Float32.m_Max ) + v = m_Val.m_Float32.m_Max; + if( m_Ptr!=NULL ) + *((float *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_DOUBLE: + { + double v = 0; + if( m_Ptr!=NULL ) + v = *((double *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + v += _Step*m_Val.m_Float64.m_Step; + if( vm_Val.m_Float64.m_Max ) + v = m_Val.m_Float64.m_Max; + if( m_Ptr!=NULL ) + *((double *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + /* + case TW_TYPE_ENUM8: + { + assert(_Step==1 || _Step==-1); + unsigned char v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( m_Val.m_Enum.m_Entries!=NULL ) + { + UVal::CEnumVal::CEntries::iterator It = m_Val.m_Enum.m_Entries->find(v); + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + else if( _Step==1 ) + { + ++It; + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + } + else if( _Step==-1 ) + { + if( It==m_Val.m_Enum.m_Entries->begin() ) + It = m_Val.m_Enum.m_Entries->end(); + if( It!=m_Val.m_Enum.m_Entries->begin() ) + --It; + } + if( It != m_Val.m_Enum.m_Entries->end() ) + { + v = (unsigned char)(It->first); + if( m_Ptr!=NULL ) + *((unsigned char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + } + } + break; + case TW_TYPE_ENUM16: + { + assert(_Step==1 || _Step==-1); + unsigned short v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned short *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( m_Val.m_Enum.m_Entries!=NULL ) + { + UVal::CEnumVal::CEntries::iterator It = m_Val.m_Enum.m_Entries->find(v); + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + else if( _Step==1 ) + { + ++It; + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + } + else if( _Step==-1 ) + { + if( It==m_Val.m_Enum.m_Entries->begin() ) + It = m_Val.m_Enum.m_Entries->end(); + if( It!=m_Val.m_Enum.m_Entries->begin() ) + --It; + } + if( It != m_Val.m_Enum.m_Entries->end() ) + { + v = (unsigned short)(It->first); + if( m_Ptr!=NULL ) + *((unsigned short *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + } + } + break; + case TW_TYPE_ENUM32: + { + assert(_Step==1 || _Step==-1); + unsigned int v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( m_Val.m_Enum.m_Entries!=NULL ) + { + UVal::CEnumVal::CEntries::iterator It = m_Val.m_Enum.m_Entries->find(v); + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + else if( _Step==1 ) + { + ++It; + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + } + else if( _Step==-1 ) + { + if( It==m_Val.m_Enum.m_Entries->begin() ) + It = m_Val.m_Enum.m_Entries->end(); + if( It!=m_Val.m_Enum.m_Entries->begin() ) + --It; + } + if( It!=m_Val.m_Enum.m_Entries->end() ) + { + v = (unsigned int)(It->first); + if( m_Ptr!=NULL ) + *((unsigned int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + } + } + break; + */ + default: + if( m_Type==TW_TYPE_BUTTON ) + { + if( m_Val.m_Button.m_Callback!=NULL ) + { + m_Val.m_Button.m_Callback(m_ClientData); + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return; + } + } + else if( IsEnumType(m_Type) ) + { + assert(_Step==1 || _Step==-1); + unsigned int v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + CTwMgr::CEnum& e = g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE]; + CTwMgr::CEnum::CEntries::iterator It = e.m_Entries.find(v); + if( It==e.m_Entries.end() ) + It = e.m_Entries.begin(); + else if( _Step==1 ) + { + ++It; + if( It==e.m_Entries.end() ) + It = e.m_Entries.begin(); + } + else if( _Step==-1 ) + { + if( It==e.m_Entries.begin() ) + It = e.m_Entries.end(); + if( It!=e.m_Entries.begin() ) + --It; + } + if( It!=e.m_Entries.end() ) + { + v = (unsigned int)(It->first); + if( m_Ptr!=NULL ) + *((unsigned int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + } + else + fprintf(stderr, "CTwVarAtom::Increment : unknown or unimplemented type\n"); + } +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::SetDefaults() +{ + switch( m_Type ) + { + case TW_TYPE_BOOL8: + case TW_TYPE_BOOL16: + case TW_TYPE_BOOL32: + case TW_TYPE_BOOLCPP: + m_NoSlider = true; + break; + case TW_TYPE_CHAR: + m_Val.m_Char.m_Max = 0xff; + m_Val.m_Char.m_Min = 0; + m_Val.m_Char.m_Step = 1; + m_Val.m_Char.m_Precision = -1; + m_Val.m_Char.m_Hexa = false; + break; + case TW_TYPE_INT8: + m_Val.m_Int8.m_Max = 0x7f; + m_Val.m_Int8.m_Min = -m_Val.m_Int8.m_Max-1; + m_Val.m_Int8.m_Step = 1; + m_Val.m_Int8.m_Precision = -1; + m_Val.m_Int8.m_Hexa = false; + break; + case TW_TYPE_UINT8: + m_Val.m_UInt8.m_Max = 0xff; + m_Val.m_UInt8.m_Min = 0; + m_Val.m_UInt8.m_Step = 1; + m_Val.m_UInt8.m_Precision = -1; + m_Val.m_UInt8.m_Hexa = false; + break; + case TW_TYPE_INT16: + m_Val.m_Int16.m_Max = 0x7fff; + m_Val.m_Int16.m_Min = -m_Val.m_Int16.m_Max-1; + m_Val.m_Int16.m_Step = 1; + m_Val.m_Int16.m_Precision = -1; + m_Val.m_Int16.m_Hexa = false; + break; + case TW_TYPE_UINT16: + m_Val.m_UInt16.m_Max = 0xffff; + m_Val.m_UInt16.m_Min = 0; + m_Val.m_UInt16.m_Step = 1; + m_Val.m_UInt16.m_Precision = -1; + m_Val.m_UInt16.m_Hexa = false; + break; + case TW_TYPE_INT32: + m_Val.m_Int32.m_Max = 0x7fffffff; + m_Val.m_Int32.m_Min = -m_Val.m_Int32.m_Max-1; + m_Val.m_Int32.m_Step = 1; + m_Val.m_Int32.m_Precision = -1; + m_Val.m_Int32.m_Hexa = false; + break; + case TW_TYPE_UINT32: + m_Val.m_UInt32.m_Max = 0xffffffff; + m_Val.m_UInt32.m_Min = 0; + m_Val.m_UInt32.m_Step = 1; + m_Val.m_UInt32.m_Precision = -1; + m_Val.m_UInt32.m_Hexa = false; + break; + case TW_TYPE_FLOAT: + m_Val.m_Float32.m_Max = FLOAT_MAX; + m_Val.m_Float32.m_Min = -FLOAT_MAX; + m_Val.m_Float32.m_Step = 1; + m_Val.m_Float32.m_Precision = -1; + m_Val.m_Float32.m_Hexa = false; + break; + case TW_TYPE_DOUBLE: + m_Val.m_Float64.m_Max = DOUBLE_MAX; + m_Val.m_Float64.m_Min = -DOUBLE_MAX; + m_Val.m_Float64.m_Step = 1; + m_Val.m_Float64.m_Precision = -1; + m_Val.m_Float64.m_Hexa = false; + break; + case TW_TYPE_CDSTRING: + case TW_TYPE_STDSTRING: + m_NoSlider = true; + break; + /* + case TW_TYPE_ENUM8: + case TW_TYPE_ENUM16: + case TW_TYPE_ENUM32: + m_NoSlider = true; + break; + */ + default: + {} // nothing + } + + // special types + if( m_Type==TW_TYPE_BUTTON + || IsEnumType(m_Type) // (m_Type>=TW_TYPE_ENUM_BASE && m_Typem_Enums.size()) + || IsCSStringType(m_Type) // (m_Type>=TW_TYPE_CSSTRING_BASE && m_Type<=TW_TYPE_CSSTRING_MAX) + || m_Type==TW_TYPE_CDSTDSTRING + || IsCustom() ) // (m_Type>=TW_TYPE_CUSTOM_BASE && m_Typem_Customs.size()) ) + m_NoSlider = true; +} + +// --------------------------------------------------------------------------- + +/* +int CTwVarAtom::DefineEnum(const TwEnumVal *_EnumValues, unsigned int _NbValues) +{ + assert(_EnumValues!=NULL); + if( m_Type!=TW_TYPE_ENUM8 && m_Type!=TW_TYPE_ENUM16 && m_Type!=TW_TYPE_ENUM32 ) + { + g_TwMgr->SetLastError(g_ErrNotEnum); + return 0; + } + if( m_Val.m_Enum.m_Entries==NULL ) + m_Val.m_Enum.m_Entries = new UVal::CEnumVal::CEntries; + for(unsigned int i=0; i<_NbValues; ++i) + { + UVal::CEnumVal::CEntries::value_type Entry(_EnumValues[i].Value, (_EnumValues[i].Label!=NULL)?_EnumValues[i].Label:""); + pair Result = m_Val.m_Enum.m_Entries->insert(Entry); + if( !Result.second ) + (Result.first)->second = Entry.second; + } + return 1; +} +*/ + +// --------------------------------------------------------------------------- + +enum EVarGroupAttribs +{ + VG_OPEN = V_ENDTAG+1, // for backward compatibility + VG_CLOSE, // for backward compatibility + VG_OPENED, + VG_TYPEID, // used internally for structs + VG_VALPTR, // used internally for structs + VG_ALPHA, // for backward compatibility + VG_NOALPHA, // for backward compatibility + VG_COLORALPHA, // tw_type_color* only + VG_HLS, // for backward compatibility + VG_RGB, // for backward compatibility + VG_COLORMODE, // tw_type_color* only + VG_COLORORDER, // tw_type_color* only + VG_ARROW, // tw_type_quat* only + VG_ARROWCOLOR, // tw_type_quat* only + VG_AXISX, // tw_type_quat* only + VG_AXISY, // tw_type_quat* only + VG_AXISZ, // tw_type_quat* only + VG_SHOWVAL // tw_type_quat* only +}; + +int CTwVarGroup::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = false; + if( _stricmp(_Attrib, "open")==0 ) // for backward compatibility + return VG_OPEN; + else if( _stricmp(_Attrib, "close")==0 ) // for backward compatibility + return VG_CLOSE; + else if( _stricmp(_Attrib, "opened")==0 ) + { + *_HasValue = true; + return VG_OPENED; + } + else if( _stricmp(_Attrib, "typeid")==0 ) + { + *_HasValue = true; + return VG_TYPEID; + } + else if( _stricmp(_Attrib, "valptr")==0 ) + { + *_HasValue = true; + return VG_VALPTR; + } + else if( _stricmp(_Attrib, "alpha")==0 ) // for backward compatibility + return VG_ALPHA; + else if( _stricmp(_Attrib, "noalpha")==0 ) // for backward compatibility + return VG_NOALPHA; + else if( _stricmp(_Attrib, "coloralpha")==0 ) + { + *_HasValue = true; + return VG_COLORALPHA; + } + else if( _stricmp(_Attrib, "hls")==0 ) // for backward compatibility + return VG_HLS; + else if( _stricmp(_Attrib, "rgb")==0 ) // for backward compatibility + return VG_RGB; + else if( _stricmp(_Attrib, "colormode")==0 ) + { + *_HasValue = true; + return VG_COLORMODE; + } + else if( _stricmp(_Attrib, "colororder")==0 ) + { + *_HasValue = true; + return VG_COLORORDER; + } + else if( _stricmp(_Attrib, "arrow")==0 ) + { + *_HasValue = true; + return VG_ARROW; + } + else if( _stricmp(_Attrib, "arrowcolor")==0 ) + { + *_HasValue = true; + return VG_ARROWCOLOR; + } + else if( _stricmp(_Attrib, "axisx")==0 ) + { + *_HasValue = true; + return VG_AXISX; + } + else if( _stricmp(_Attrib, "axisy")==0 ) + { + *_HasValue = true; + return VG_AXISY; + } + else if( _stricmp(_Attrib, "axisz")==0 ) + { + *_HasValue = true; + return VG_AXISZ; + } + else if( _stricmp(_Attrib, "showval")==0 ) + { + *_HasValue = true; + return VG_SHOWVAL; + } + + return CTwVar::HasAttrib(_Attrib, _HasValue); +} + +int CTwVarGroup::SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex) +{ + switch( _AttribID ) + { + case VG_OPEN: // for backward compatibility + if( !m_Open ) + { + m_Open = true; + _Bar->NotUpToDate(); + } + return 1; + case VG_CLOSE: // for backward compatibility + if( m_Open ) + { + m_Open = false; + _Bar->NotUpToDate(); + } + return 1; + case VG_OPENED: + if( _Value!=NULL && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "true")==0 || _stricmp(_Value, "1")==0 ) + { + if( !m_Open ) + { + m_Open = true; + _Bar->NotUpToDate(); + } + return 1; + } + else if( _stricmp(_Value, "false")==0 || _stricmp(_Value, "0")==0 ) + { + if( m_Open ) + { + m_Open = false; + _Bar->NotUpToDate(); + } + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case VG_TYPEID: + { + int type = TW_TYPE_UNDEF; + if( _Value!=NULL && sscanf(_Value, "%d", &type)==1 ) + { + int idx = type - TW_TYPE_STRUCT_BASE; + if( idx>=0 && idx<(int)g_TwMgr->m_Structs.size() ) + { + m_SummaryCallback = g_TwMgr->m_Structs[idx].m_SummaryCallback; + m_SummaryClientData = g_TwMgr->m_Structs[idx].m_SummaryClientData; + m_StructType = (TwType)type; + return 1; + } + } + return 0; + } + case VG_VALPTR: + { + void *structValuePtr = NULL; + if( _Value!=NULL && sscanf(_Value, "%p", &structValuePtr)==1 ) + { + m_StructValuePtr = structValuePtr; + m_ColorPtr = &(_Bar->m_ColStructText); + return 1; + } + return 0; + } + case VG_ALPHA: // for backward compatibility + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + if( static_cast(m_StructValuePtr)->m_CanHaveAlpha ) + { + static_cast(m_StructValuePtr)->m_HasAlpha = true; + _Bar->NotUpToDate(); + return 1; + } + return 0; + case VG_NOALPHA: // for backward compatibility + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + static_cast(m_StructValuePtr)->m_HasAlpha = false; + _Bar->NotUpToDate(); + return 1; + } + else + return 0; + case VG_COLORALPHA: + if( _Value!=NULL && strlen(_Value)>0 ) + { + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + if( _stricmp(_Value, "true")==0 || _stricmp(_Value, "1")==0 ) + { + if( static_cast(m_StructValuePtr)->m_CanHaveAlpha ) + { + if( !static_cast(m_StructValuePtr)->m_HasAlpha ) + { + static_cast(m_StructValuePtr)->m_HasAlpha = true; + _Bar->NotUpToDate(); + } + return 1; + } + } + else if( _stricmp(_Value, "false")==0 || _stricmp(_Value, "0")==0 ) + { + if( static_cast(m_StructValuePtr)->m_HasAlpha ) + { + static_cast(m_StructValuePtr)->m_HasAlpha = false; + _Bar->NotUpToDate(); + } + return 1; + } + } + } + return 0; + case VG_HLS: // for backward compatibility + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + static_cast(m_StructValuePtr)->m_HLS = true; + _Bar->NotUpToDate(); + return 1; + } + else + return 0; + case VG_RGB: // for backward compatibility + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + static_cast(m_StructValuePtr)->m_HLS = false; + _Bar->NotUpToDate(); + return 1; + } + else + return 0; + case VG_COLORMODE: + if( _Value!=NULL && strlen(_Value)>0 ) + { + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + if( _stricmp(_Value, "hls")==0 ) + { + if( !static_cast(m_StructValuePtr)->m_HLS ) + { + static_cast(m_StructValuePtr)->m_HLS = true; + _Bar->NotUpToDate(); + } + return 1; + } + else if( _stricmp(_Value, "rgb")==0 ) + { + if( static_cast(m_StructValuePtr)->m_HLS ) + { + static_cast(m_StructValuePtr)->m_HLS = false; + _Bar->NotUpToDate(); + } + return 1; + } + } + } + return 0; + case VG_COLORORDER: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + if( _Value!=NULL ) + { + if( _stricmp(_Value, "rgba")==0 ) + static_cast(m_StructValuePtr)->m_OGL = true; + else if( _stricmp(_Value, "argb")==0 ) + static_cast(m_StructValuePtr)->m_OGL = false; + else + return 0; + return 1; + } + return 0; + } + else + return 0; + case VG_ARROW: + if( m_SummaryCallback==CQuaternionExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_quat? + { + if( _Value!=NULL ) + { + double *dir = static_cast(m_StructValuePtr)->m_Dir; + double x, y, z; + if( sscanf(_Value, "%lf %lf %lf", &x, &y, &z)==3 ) + { + dir[0] = x; + dir[1] = y; + dir[2] = z; + } + else if( _stricmp(_Value, "off")==0 || _stricmp(_Value, "0")==0 ) + dir[0] = dir[1] = dir[2] = 0; + else + return 0; + return 1; + } + return 0; + } + else + return 0; + case VG_ARROWCOLOR: + if( m_SummaryCallback==CQuaternionExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_quat? + { + if( _Value!=NULL ) + { + int r, g, b; + if( sscanf(_Value, "%d %d %d", &r, &g, &b)==3 ) + static_cast(m_StructValuePtr)->m_DirColor = Color32FromARGBi(255, r, g, b); + else + return 0; + return 1; + } + return 0; + } + else + return 0; + case VG_AXISX: + case VG_AXISY: + case VG_AXISZ: + if( m_SummaryCallback==CQuaternionExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_quat? + { + if( _Value!=NULL ) + { + float x = 0, y = 0, z = 0; + if( _stricmp(_Value, "x")==0 || _stricmp(_Value, "+x")==0 ) + x = 1; + else if( _stricmp(_Value, "-x")==0 ) + x = -1; + else if( _stricmp(_Value, "y")==0 || _stricmp(_Value, "+y")==0 ) + y = 1; + else if( _stricmp(_Value, "-y")==0 ) + y = -1; + else if( _stricmp(_Value, "z")==0 || _stricmp(_Value, "+z")==0 ) + z = 1; + else if( _stricmp(_Value, "-z")==0 ) + z = -1; + else + return 0; + int i = (_AttribID==VG_AXISX) ? 0 : ((_AttribID==VG_AXISY) ? 1 : 2); + static_cast(m_StructValuePtr)->m_Permute[i][0] = x; + static_cast(m_StructValuePtr)->m_Permute[i][1] = y; + static_cast(m_StructValuePtr)->m_Permute[i][2] = z; + return 1; + } + return 0; + } + else + return 0; + case VG_SHOWVAL: + if( m_SummaryCallback==CQuaternionExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_quat? + { + if( _Value!=NULL ) + { + if( _stricmp(_Value, "true")==0 || _stricmp(_Value, "on")==0 || _stricmp(_Value, "1")==0 ) + { + static_cast(m_StructValuePtr)->m_ShowVal = true; + _Bar->NotUpToDate(); + return 1; + } + else if( _stricmp(_Value, "false")==0 || _stricmp(_Value, "off")==0 || _stricmp(_Value, "0")==0 ) + { + static_cast(m_StructValuePtr)->m_ShowVal = false; + _Bar->NotUpToDate(); + return 1; + } + } + return 0; + } + else + return 0; + default: + return CTwVar::SetAttrib(_AttribID, _Value, _Bar, _VarParent, _VarIndex); + } +} + +ERetType CTwVarGroup::GetAttrib(int _AttribID, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex, std::vector& outDoubles, std::ostringstream& outString) const +{ + outDoubles.clear(); + outString.clear(); + + switch( _AttribID ) + { + case VG_OPENED: + outDoubles.push_back( m_Open ); + return RET_DOUBLE; + case VG_COLORALPHA: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + outDoubles.push_back( static_cast(m_StructValuePtr)->m_HasAlpha ); + return RET_DOUBLE; + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + case VG_COLORMODE: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + if( static_cast(m_StructValuePtr)->m_HLS ) + outString << "hls"; + else + outString << "rgb"; + return RET_STRING; + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + case VG_COLORORDER: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + if( static_cast(m_StructValuePtr)->m_OGL ) + outString << "rgba"; + else + outString << "argb"; + return RET_STRING; + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + case VG_ARROW: + if( m_SummaryCallback==CQuaternionExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_quat? + { + double *dir = static_cast(m_StructValuePtr)->m_Dir; + outDoubles.push_back(dir[0]); + outDoubles.push_back(dir[1]); + outDoubles.push_back(dir[2]); + return RET_DOUBLE; + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + case VG_ARROWCOLOR: + if( m_SummaryCallback==CQuaternionExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_quat? + { + int a, r, g, b; + a = r = g = b = 0; + Color32ToARGBi(static_cast(m_StructValuePtr)->m_DirColor, &a, &r, &g, &b); + outDoubles.push_back(r); + outDoubles.push_back(g); + outDoubles.push_back(b); + return RET_DOUBLE; + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + case VG_AXISX: + case VG_AXISY: + case VG_AXISZ: + if( m_SummaryCallback==CQuaternionExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_quat? + { + int i = (_AttribID==VG_AXISX) ? 0 : ((_AttribID==VG_AXISY) ? 1 : 2); + float x = static_cast(m_StructValuePtr)->m_Permute[i][0]; + float y = static_cast(m_StructValuePtr)->m_Permute[i][1]; + float z = static_cast(m_StructValuePtr)->m_Permute[i][2]; + if( x>0 ) + outString << "+x"; + else if( x<0 ) + outString << "-x"; + else if( y>0 ) + outString << "+y"; + else if( y<0 ) + outString << "-y"; + else if( z>0 ) + outString << "+z"; + else if( z<0 ) + outString << "-z"; + else + outString << "0"; // should not happened + return RET_DOUBLE; + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + case VG_SHOWVAL: + if( m_SummaryCallback==CQuaternionExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_quat? + { + outDoubles.push_back( static_cast(m_StructValuePtr)->m_ShowVal ); + return RET_DOUBLE; + } + g_TwMgr->SetLastError(g_ErrInvalidAttrib); + return RET_ERROR; + default: + return CTwVar::GetAttrib(_AttribID, _Bar, _VarParent, _VarIndex, outDoubles, outString); + } +} + +// --------------------------------------------------------------------------- + +const CTwVar *CTwVarGroup::Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const +{ + if( strcmp(_Name, m_Name.c_str())==0 ) + { + if( _Parent!=NULL ) + *_Parent = NULL; + if( _Index!=NULL ) + *_Index = -1; + return this; + } + else + { + const CTwVar *v; + for( size_t i=0; iFind(_Name, _Parent, _Index); + if( v!=NULL ) + { + if( _Parent!=NULL && *_Parent==NULL ) + { + *_Parent = const_cast(this); + if( _Index!=NULL ) + *_Index = (int)i; + } + return v; + } + } + return NULL; + } +} + +// --------------------------------------------------------------------------- + +size_t CTwVar::GetDataSize(TwType _Type) +{ + switch( _Type ) + { + case TW_TYPE_BOOLCPP: + return sizeof(bool); + case TW_TYPE_BOOL8: + case TW_TYPE_CHAR: + case TW_TYPE_INT8: + case TW_TYPE_UINT8: + //case TW_TYPE_ENUM8: + return 1; + case TW_TYPE_BOOL16: + case TW_TYPE_INT16: + case TW_TYPE_UINT16: + //case TW_TYPE_ENUM16: + return 2; + case TW_TYPE_BOOL32: + case TW_TYPE_INT32: + case TW_TYPE_UINT32: + case TW_TYPE_FLOAT: + //case TW_TYPE_ENUM32: + return 4; + case TW_TYPE_DOUBLE: + return 8; + case TW_TYPE_CDSTRING: + return sizeof(char *); + case TW_TYPE_STDSTRING: + return (g_TwMgr!=0) ? g_TwMgr->m_ClientStdStringStructSize : sizeof(std::string); + default: + if( g_TwMgr && _Type>=TW_TYPE_STRUCT_BASE && _Typem_Structs.size() ) + { + const CTwMgr::CStruct& s = g_TwMgr->m_Structs[_Type-TW_TYPE_STRUCT_BASE]; + return s.m_Size; + /* + size_t size = 0; + for( size_t i=0; im_ClientStdStringStructSize : sizeof(std::string); + else // includes TW_TYPE_BUTTON + return 0; + } +} + +// --------------------------------------------------------------------------- + +CTwBar::CTwBar(const char *_Name) +{ + assert(g_TwMgr!=NULL && g_TwMgr->m_Graph!=NULL); + + m_Name = _Name; + m_Visible = true; + m_VarRoot.m_IsRoot = true; + m_VarRoot.m_Open = true; + m_VarRoot.m_SummaryCallback = NULL; + m_VarRoot.m_SummaryClientData = NULL; + m_VarRoot.m_StructValuePtr = NULL; + + m_UpToDate = false; + int n = (int)g_TwMgr->m_Bars.size(); + m_PosX = 24*n-8; + m_PosY = 24*n-8; + m_Width = 200; + m_Height = 320; + int cr, cg, cb; + if( g_TwMgr->m_UseOldColorScheme ) + { + ColorHLSToRGBi(g_TwMgr->m_BarInitColorHue%256, 180, 200, &cr, &cg, &cb); + m_Color = Color32FromARGBi(0xf0, cr, cg, cb); + m_DarkText = true; + } + else + { + ColorHLSToRGBi(g_TwMgr->m_BarInitColorHue%256, 80, 200, &cr, &cg, &cb); + m_Color = Color32FromARGBi(64, cr, cg, cb); + m_DarkText = false; + } + g_TwMgr->m_BarInitColorHue -= 16; + if( g_TwMgr->m_BarInitColorHue<0 ) + g_TwMgr->m_BarInitColorHue += 256; + m_Font = g_TwMgr->m_CurrentFont; + //m_Font = g_DefaultNormalFont; + //m_Font = g_DefaultSmallFont; + //m_Font = g_DefaultLargeFont; + m_TitleWidth = 0; + m_Sep = 1; +//#pragma warning "lineSep WIP" + m_LineSep = 1; + m_ValuesWidth = 10*(m_Font->m_CharHeight/2); // about 10 characters + m_NbHierLines = 0; + m_NbDisplayedLines = 0; + m_FirstLine = 0; + m_LastUpdateTime = 0; + m_UpdatePeriod = 2; + m_ScrollYW = 0; + m_ScrollYH = 0; + m_ScrollY0 = 0; + m_ScrollY1 = 0; + + m_DrawHandles = false; + m_DrawIncrDecrBtn = false; + m_DrawRotoBtn = false; + m_DrawClickBtn = false; + m_DrawListBtn = false; + m_DrawBoolBtn = false; + m_MouseDrag = false; + m_MouseDragVar = false; + m_MouseDragTitle = false; + m_MouseDragScroll = false; + m_MouseDragResizeUR = false; + m_MouseDragResizeUL = false; + m_MouseDragResizeLR = false; + m_MouseDragResizeLL = false; + m_MouseDragValWidth = false; + m_MouseOriginX = 0; + m_MouseOriginY = 0; + m_ValuesWidthRatio = 0; + m_VarHasBeenIncr = true; + m_FirstLine0 = 0; + m_HighlightedLine = -1; + m_HighlightedLinePrev = -1; + m_HighlightedLineLastValid = -1; + m_HighlightIncrBtn = false; + m_HighlightDecrBtn = false; + m_HighlightRotoBtn = false; + m_HighlightClickBtn = false; + m_HighlightClickBtnAuto = 0; + m_HighlightListBtn = false; + m_HighlightBoolBtn = false; + m_HighlightTitle = false; + m_HighlightScroll = false; + m_HighlightUpScroll = false; + m_HighlightDnScroll = false; + m_HighlightMinimize = false; + m_HighlightFont = false; + m_HighlightValWidth = false; + m_HighlightLabelsHeader = false; + m_HighlightValuesHeader = false; + m_ButtonAlign = g_TwMgr->m_ButtonAlign; + + m_IsMinimized = false; + m_MinNumber = 0; + m_MinPosX = 0; + m_MinPosY = 0; + m_HighlightMaximize = false; + m_IsHelpBar = false; + m_IsPopupList = false; + m_VarEnumLinkedToPopupList = NULL; + m_BarLinkedToPopupList = NULL; + + m_Resizable = true; + m_Movable = true; + m_Iconifiable = true; + m_Contained = g_TwMgr->m_Contained; + + m_TitleTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_LabelsTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_ValuesTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_ShortcutTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_HeadersTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_ShortcutLine = -1; + + m_RotoMinRadius = 24; + m_RotoNbSubdiv = 256; // number of steps for one turn + + m_CustomActiveStructProxy = NULL; + + UpdateColors(); + NotUpToDate(); +} + +// --------------------------------------------------------------------------- + +CTwBar::~CTwBar() +{ + if( m_IsMinimized ) + g_TwMgr->Maximize(this); + if( m_TitleTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_TitleTextObj); + if( m_LabelsTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_LabelsTextObj); + if( m_ValuesTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_ValuesTextObj); + if( m_ShortcutTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_ShortcutTextObj); + if( m_HeadersTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_HeadersTextObj); +} + +// --------------------------------------------------------------------------- + +const CTwVar *CTwBar::Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const +{ + return m_VarRoot.Find(_Name, _Parent, _Index); +} + +CTwVar *CTwBar::Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) +{ + return const_cast(const_cast(this)->Find(_Name, _Parent, _Index)); +} + +// --------------------------------------------------------------------------- + +enum EBarAttribs +{ + BAR_LABEL = 1, + BAR_HELP, + BAR_COLOR, + BAR_ALPHA, + BAR_TEXT, + BAR_SHOW, // deprecated, used BAR_VISIBLE instead + BAR_HIDE, // deprecated, used BAR_VISIBLE instead + BAR_ICONIFY, // deprecated, used BAR_ICONIFIED instead + BAR_VISIBLE, + BAR_ICONIFIED, + BAR_SIZE, + BAR_POSITION, + BAR_REFRESH, + BAR_FONT_SIZE, + BAR_FONT_STYLE, + BAR_VALUES_WIDTH, + BAR_ICON_POS, + BAR_ICON_ALIGN, + BAR_ICON_MARGIN, + BAR_RESIZABLE, + BAR_MOVABLE, + BAR_ICONIFIABLE, + BAR_FONT_RESIZABLE, + BAR_ALWAYS_TOP, + BAR_ALWAYS_BOTTOM, + BAR_COLOR_SCHEME, + BAR_CONTAINED, + BAR_BUTTON_ALIGN +}; + +int CTwBar::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = true; + if( _stricmp(_Attrib, "label")==0 ) + return BAR_LABEL; + else if( _stricmp(_Attrib, "help")==0 ) + return BAR_HELP; + else if( _stricmp(_Attrib, "color")==0 ) + return BAR_COLOR; + else if( _stricmp(_Attrib, "alpha")==0 ) + return BAR_ALPHA; + else if( _stricmp(_Attrib, "text")==0 ) + return BAR_TEXT; + else if( _stricmp(_Attrib, "size")==0 ) + return BAR_SIZE; + else if( _stricmp(_Attrib, "position")==0 ) + return BAR_POSITION; + else if( _stricmp(_Attrib, "refresh")==0 ) + return BAR_REFRESH; + else if( _stricmp(_Attrib, "fontsize")==0 ) + return BAR_FONT_SIZE; + else if( _stricmp(_Attrib, "fontstyle")==0 ) + return BAR_FONT_STYLE; + else if( _stricmp(_Attrib, "valueswidth")==0 ) + return BAR_VALUES_WIDTH; + else if( _stricmp(_Attrib, "iconpos")==0 ) + return BAR_ICON_POS; + else if( _stricmp(_Attrib, "iconalign")==0 ) + return BAR_ICON_ALIGN; + else if( _stricmp(_Attrib, "iconmargin")==0 ) + return BAR_ICON_MARGIN; + else if( _stricmp(_Attrib, "resizable")==0 ) + return BAR_RESIZABLE; + else if( _stricmp(_Attrib, "movable")==0 ) + return BAR_MOVABLE; + else if( _stricmp(_Attrib, "iconifiable")==0 ) + return BAR_ICONIFIABLE; + else if( _stricmp(_Attrib, "fontresizable")==0 ) + return BAR_FONT_RESIZABLE; + else if( _stricmp(_Attrib, "alwaystop")==0 ) + return BAR_ALWAYS_TOP; + else if( _stricmp(_Attrib, "alwaysbottom")==0 ) + return BAR_ALWAYS_BOTTOM; + else if( _stricmp(_Attrib, "visible")==0 ) + return BAR_VISIBLE; + else if( _stricmp(_Attrib, "iconified")==0 ) + return BAR_ICONIFIED; + else if( _stricmp(_Attrib, "colorscheme")==0 ) + return BAR_COLOR_SCHEME; + else if( _stricmp(_Attrib, "contained")==0 ) + return BAR_CONTAINED; + else if( _stricmp(_Attrib, "buttonalign")==0 ) + return BAR_BUTTON_ALIGN; + + *_HasValue = false; + if( _stricmp(_Attrib, "show")==0 ) // for backward compatibility + return BAR_SHOW; + else if( _stricmp(_Attrib, "hide")==0 ) // for backward compatibility + return BAR_HIDE; + else if( _stricmp(_Attrib, "iconify")==0 ) // for backward compatibility + return BAR_ICONIFY; + + return 0; // not found +} + +int CTwBar::SetAttrib(int _AttribID, const char *_Value) +{ + switch( _AttribID ) + { + case BAR_LABEL: + if( _Value && strlen(_Value)>0 ) + { + m_Label = _Value; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_HELP: + if( _Value && strlen(_Value)>0 ) + { + m_Help = _Value; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_COLOR: + if( _Value && strlen(_Value)>0 ) + { + int v0, v1, v2, v3; + int n = sscanf(_Value, "%d%d%d%d", &v0, &v1, &v2, &v3); + color32 c; + int alpha = (m_Color>>24) & 0xff; + if( n==3 && v0>=0 && v0<=255 && v1>=0 && v1<=255 && v2>=0 && v2<=255 ) + c = Color32FromARGBi(alpha, v0, v1, v2); + else if( n==4 && v0>=0 && v0<=255 && v1>=0 && v1<=255 && v2>=0 && v2<=255 && v3>=0 && v3<=255 ) + c = Color32FromARGBi(v0, v1, v2, v3); + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + m_Color = c; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_ALPHA: + if( _Value && strlen(_Value)>0 ) + { + int alpha = 255; + int n = sscanf(_Value, "%d", &alpha); + if( n==1 && alpha>=0 && alpha<=255 ) + m_Color = (alpha<<24) | (m_Color & 0xffffff); + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_TEXT: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "dark")==0 ) + m_DarkText = true; + else if( _stricmp(_Value, "light")==0 ) + m_DarkText = false; + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_SIZE: + if( _Value && strlen(_Value)>0 ) + { + int sx, sy; + int n = sscanf(_Value, "%d%d", &sx, &sy); + if( n==2 && sx>0 && sy>0 ) + { + m_Width = sx; + m_Height = sy; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_POSITION: + if( _Value && strlen(_Value)>0 ) + { + int x, y; + int n = sscanf(_Value, "%d%d", &x, &y); + if( n==2 && x>=0 && y>=0 ) + { + m_PosX = x; + m_PosY = y; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_REFRESH: + if( _Value && strlen(_Value)>0 ) + { + float r; + int n = sscanf(_Value, "%f", &r); + if( n==1 && r>=0 ) + { + m_UpdatePeriod = r; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_VALUES_WIDTH: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "fit")==0 ) + { + m_ValuesWidth = VALUES_WIDTH_FIT; + NotUpToDate(); + return 1; + } + else + { + int w; + int n = sscanf(_Value, "%d", &w); + if( n==1 && w>0 ) + { + m_ValuesWidth = w; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_FONT_SIZE: + return g_TwMgr->SetAttrib(MGR_FONT_SIZE, _Value); + case BAR_FONT_STYLE: + return g_TwMgr->SetAttrib(MGR_FONT_STYLE, _Value); + case BAR_ICON_POS: + return g_TwMgr->SetAttrib(MGR_ICON_POS, _Value); + case BAR_ICON_ALIGN: + return g_TwMgr->SetAttrib(MGR_ICON_ALIGN, _Value); + case BAR_ICON_MARGIN: + return g_TwMgr->SetAttrib(MGR_ICON_MARGIN, _Value); + case BAR_SHOW: // deprecated + TwSetBarState(this, TW_STATE_SHOWN); + return 1; + case BAR_HIDE: // deprecated + TwSetBarState(this, TW_STATE_HIDDEN); + return 1; + case BAR_ICONIFY: // deprecated + TwSetBarState(this, TW_STATE_ICONIFIED); + return 1; + case BAR_RESIZABLE: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + m_Resizable = true; + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + m_Resizable = false; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_MOVABLE: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + m_Movable = true; + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + m_Movable = false; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_ICONIFIABLE: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + m_Iconifiable = true; + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + m_Iconifiable = false; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_FONT_RESIZABLE: + return g_TwMgr->SetAttrib(MGR_FONT_RESIZABLE, _Value); + case BAR_ALWAYS_TOP: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + g_TwMgr->m_BarAlwaysOnTop = m_Name; + if( g_TwMgr->m_BarAlwaysOnBottom.length()>0 && strcmp(g_TwMgr->m_BarAlwaysOnBottom.c_str(), m_Name.c_str())==0 ) + g_TwMgr->m_BarAlwaysOnBottom.clear(); + TwSetTopBar(this); + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + if( g_TwMgr->m_BarAlwaysOnTop.length()>0 && strcmp(g_TwMgr->m_BarAlwaysOnTop.c_str(), m_Name.c_str())==0 ) + g_TwMgr->m_BarAlwaysOnTop.clear(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_ALWAYS_BOTTOM: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + g_TwMgr->m_BarAlwaysOnBottom = m_Name; + if( g_TwMgr->m_BarAlwaysOnTop.length()>0 && strcmp(g_TwMgr->m_BarAlwaysOnTop.c_str(), m_Name.c_str())==0 ) + g_TwMgr->m_BarAlwaysOnTop.clear(); + TwSetBottomBar(this); + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + if( g_TwMgr->m_BarAlwaysOnBottom.length()>0 && strcmp(g_TwMgr->m_BarAlwaysOnBottom.c_str(), m_Name.c_str())==0 ) + g_TwMgr->m_BarAlwaysOnBottom.clear(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_VISIBLE: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + TwSetBarState(this, TW_STATE_SHOWN); + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + TwSetBarState(this, TW_STATE_HIDDEN); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_ICONIFIED: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + TwSetBarState(this, TW_STATE_ICONIFIED); + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + TwSetBarState(this, TW_STATE_UNICONIFIED); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_COLOR_SCHEME: + return g_TwMgr->SetAttrib(MGR_COLOR_SCHEME, _Value); + case BAR_CONTAINED: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + m_Contained = true; + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + m_Contained = false; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_BUTTON_ALIGN: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "left")==0 ) + { + m_ButtonAlign = BUTTON_ALIGN_LEFT; + return 1; + } + else if( _stricmp(_Value, "center")==0 ) + { + m_ButtonAlign = BUTTON_ALIGN_CENTER; + return 1; + } + if( _stricmp(_Value, "right")==0 ) + { + m_ButtonAlign = BUTTON_ALIGN_RIGHT; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return 0; + } +} + +ERetType CTwBar::GetAttrib(int _AttribID, std::vector& outDoubles, std::ostringstream& outString) const +{ + outDoubles.clear(); + outString.clear(); + + switch( _AttribID ) + { + case BAR_LABEL: + outString << m_Label; + return RET_STRING; + case BAR_HELP: + outString << m_Help; + return RET_STRING; + case BAR_COLOR: + { + int a, r, g, b; + a = r = g = b = 0; + Color32ToARGBi(m_Color, &a, &r, &g, &b); + outDoubles.push_back(r); + outDoubles.push_back(g); + outDoubles.push_back(b); + return RET_DOUBLE; + } + case BAR_ALPHA: + { + int a, r, g, b; + a = r = g = b = 0; + Color32ToARGBi(m_Color, &a, &r, &g, &b); + outDoubles.push_back(a); + return RET_DOUBLE; + } + case BAR_TEXT: + if( m_DarkText ) + outString << "dark"; + else + outString << "light"; + return RET_STRING; + case BAR_SIZE: + outDoubles.push_back(m_Width); + outDoubles.push_back(m_Height); + return RET_DOUBLE; + case BAR_POSITION: + outDoubles.push_back(m_PosX); + outDoubles.push_back(m_PosY); + return RET_DOUBLE; + case BAR_REFRESH: + outDoubles.push_back(m_UpdatePeriod); + return RET_DOUBLE; + case BAR_VALUES_WIDTH: + outDoubles.push_back(m_ValuesWidth); + return RET_DOUBLE; + case BAR_FONT_SIZE: + return g_TwMgr->GetAttrib(MGR_FONT_SIZE, outDoubles, outString); + case BAR_FONT_STYLE: + return g_TwMgr->GetAttrib(MGR_FONT_STYLE, outDoubles, outString); + case BAR_ICON_POS: + return g_TwMgr->GetAttrib(MGR_ICON_POS, outDoubles, outString); + case BAR_ICON_ALIGN: + return g_TwMgr->GetAttrib(MGR_ICON_ALIGN, outDoubles, outString); + case BAR_ICON_MARGIN: + return g_TwMgr->GetAttrib(MGR_ICON_MARGIN, outDoubles, outString); + case BAR_RESIZABLE: + outDoubles.push_back(m_Resizable); + return RET_DOUBLE; + case BAR_MOVABLE: + outDoubles.push_back(m_Movable); + return RET_DOUBLE; + case BAR_ICONIFIABLE: + outDoubles.push_back(m_Iconifiable); + return RET_DOUBLE; + case BAR_FONT_RESIZABLE: + return g_TwMgr->GetAttrib(MGR_FONT_RESIZABLE, outDoubles, outString); + case BAR_ALWAYS_TOP: + outDoubles.push_back( g_TwMgr->m_BarAlwaysOnTop == m_Name ); + return RET_DOUBLE; + case BAR_ALWAYS_BOTTOM: + outDoubles.push_back( g_TwMgr->m_BarAlwaysOnBottom == m_Name ); + return RET_DOUBLE; + case BAR_VISIBLE: + outDoubles.push_back(m_Visible); + return RET_DOUBLE; + case BAR_ICONIFIED: + outDoubles.push_back(m_IsMinimized); + return RET_DOUBLE; + case BAR_COLOR_SCHEME: + return g_TwMgr->GetAttrib(MGR_COLOR_SCHEME, outDoubles, outString); + case BAR_CONTAINED: + outDoubles.push_back(m_Contained); + return RET_DOUBLE; + case BAR_BUTTON_ALIGN: + if( m_ButtonAlign==BUTTON_ALIGN_LEFT ) + outString << "left"; + else if( m_ButtonAlign==BUTTON_ALIGN_CENTER ) + outString << "center"; + else + outString << "right"; + return RET_STRING; + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return RET_ERROR; + } +} + +// --------------------------------------------------------------------------- + +void CTwBar::NotUpToDate() +{ + m_UpToDate = false; +} + +// --------------------------------------------------------------------------- + +void CTwBar::UpdateColors() +{ + float a, r, g, b, h, l, s; + Color32ToARGBf(m_Color, &a, &r, &g, &b); + ColorRGBToHLSf(r, g, b, &h, &l, &s); + bool lightText = !m_DarkText; + + // Colors independant of m_Color + + // Highlighted line background ramp + m_ColHighBg0 = lightText ? Color32FromARGBf(0.4f, 0.9f, 0.9f, 0.9f) : Color32FromARGBf(0.4f, 1.0f, 1.0f, 1.0f); + m_ColHighBg1 = lightText ? Color32FromARGBf(0.4f, 0.2f, 0.2f, 0.2f) : Color32FromARGBf(0.1f, 0.7f, 0.7f, 0.7f); + + // Text colors & background + m_ColLabelText = lightText ? COLOR32_WHITE : COLOR32_BLACK; + m_ColStructText = lightText ? 0xffefef00 : 0xff303000; + + m_ColValText = lightText ? 0xffc7d7ff : 0xff000080; + m_ColValTextRO = lightText ? 0xffb7b7b7 : 0xff505050; + m_ColValMin = lightText ? 0xff9797ff : 0xff0000f0; + m_ColValMax = m_ColValMin; + m_ColValTextNE = lightText ? 0xff97f797 : 0xff004000; + + m_ColValBg = lightText ? Color32FromARGBf(0.2f+0.3f*a, 0.1f, 0.1f, 0.1f) : Color32FromARGBf(0.2f+0.3f*a, 1, 1, 1); + m_ColStructBg = lightText ? Color32FromARGBf(0.4f*a, 0, 0, 0) : Color32FromARGBf(0.4f*a, 1, 1, 1); + + m_ColLine = lightText ? Color32FromARGBf(0.6f, 1, 1, 1) : Color32FromARGBf(0.6f, 0.3f, 0.3f, 0.3f); + m_ColLineShadow = lightText ? Color32FromARGBf(0.6f, 0, 0, 0) : Color32FromARGBf(0.6f, 0, 0, 0); + m_ColUnderline = lightText ? 0xffd0d0d0 : 0xff202000; + + m_ColGrpBg = lightText ? Color32FromARGBf(0.1f+0.25f*a, 1, 1, 1) : Color32FromARGBf(0.1f+0.05f*a, 0, 0, 0); + m_ColGrpText = lightText ? 0xffffff80 : 0xff000000; + + m_ColShortcutText = lightText ? 0xffffb060 : 0xff802000; + m_ColShortcutBg = lightText ? Color32FromARGBf(0.4f*a, 0.2f, 0.2f, 0.2f) : Color32FromARGBf(0.4f*a, 0.8f, 0.8f, 0.8f); + m_ColInfoText = Color32FromARGBf(1.0f, 0.5f, 0.5f, 0.5f); + + m_ColRoto = lightText ? Color32FromARGBf(0.8f, 0.85f, 0.85f, 0.85f) : Color32FromARGBf(0.8f, 0.1f, 0.1f, 0.1f); + m_ColRotoVal = Color32FromARGBf(1, 1.0f, 0.2f, 0.2f); + m_ColRotoBound = lightText ? Color32FromARGBf(0.8f, 0.6f, 0.6f, 0.6f) : Color32FromARGBf(0.8f, 0.3f, 0.3f, 0.3f); + + m_ColEditText = lightText ? COLOR32_WHITE : COLOR32_BLACK; + m_ColEditBg = lightText ? 0xff575757 : 0xffc7c7c7; // must be opaque + m_ColEditSelText = lightText ? COLOR32_BLACK : COLOR32_WHITE; + m_ColEditSelBg = lightText ? 0xffc7c7c7 : 0xff575757; + + // Colors dependant of m_Colors + + // Bar background + ColorHLSToRGBf(h, l, s, &r, &g, &b); + m_ColBg = Color32FromARGBf(a, r, g, b); + ColorHLSToRGBf(h, l-0.05f, s, &r, &g, &b); + m_ColBg1 = Color32FromARGBf(a, r, g, b); + ColorHLSToRGBf(h, l-0.1f, s, &r, &g, &b); + m_ColBg2 = Color32FromARGBf(a, r, g, b); + + ColorHLSToRGBf(h, l-0.15f, s, &r, &g, &b); + m_ColTitleBg = Color32FromARGBf(a+0.9f, r, g, b); + m_ColTitleText = lightText ? COLOR32_WHITE : COLOR32_BLACK; + m_ColTitleShadow = lightText ? 0x40000000 : 0x00000000; + ColorHLSToRGBf(h, l-0.25f, s, &r, &g, &b); + m_ColTitleHighBg = Color32FromARGBf(a+0.8f, r, g, b); + ColorHLSToRGBf(h, l-0.3f, s, &r, &g, &b); + m_ColTitleUnactiveBg = Color32FromARGBf(a+0.2f, r, g, b); + + ColorHLSToRGBf(h, l-0.2f, s, &r, &g, &b); + m_ColHierBg = Color32FromARGBf(a, r, g, b); + + ColorHLSToRGBf(h, l+0.1f, s, &r, &g, &b); + m_ColBtn = Color32FromARGBf(0.2f+0.4f*a, r, g, b); + ColorHLSToRGBf(h, l-0.35f, s, &r, &g, &b); + m_ColHighBtn = Color32FromARGBf(0.4f+0.4f*a, r, g, b); + ColorHLSToRGBf(h, l-0.25f, s, &r, &g, &b); + m_ColFold = Color32FromARGBf(0.1f+0.4f*a, r, g, b); + ColorHLSToRGBf(h, l-0.35f, s, &r, &g, &b); + m_ColHighFold = Color32FromARGBf(0.3f+0.4f*a, r, g, b); + + ColorHLSToRGBf(h, 0.75f, s, &r, &g, &b); + m_ColHelpBg = Color32FromARGBf(0.2f, 1, 1, 1); + m_ColHelpText = lightText ? Color32FromARGBf(1, 0.2f, 1.0f, 0.2f) : Color32FromARGBf(1, 0, 0.4f, 0); + m_ColSeparator = m_ColValTextRO; + m_ColStaticText = m_ColHelpText; +} + +/* +void CTwBar::UpdateColors() +{ + float a, r, g, b, h, l, s; + Color32ToARGBf(m_Color, &a, &r, &g, &b); + ColorRGBToHLSf(r, g, b, &h, &l, &s); + bool lightText = !m_DarkText; // (l<=0.45f); + l = 0.2f + 0.6f*l; + + ColorHLSToRGBf(h, l, s, &r, &g, &b); + m_ColBg = Color32FromARGBf(a, r, g, b); + ColorHLSToRGBf(h, l-0.1f, s, &r, &g, &b); + m_ColBg1 = Color32FromARGBf(a, r, g, b); + ColorHLSToRGBf(h, l-0.2f, s, &r, &g, &b); + m_ColBg2 = Color32FromARGBf(a, r, g, b); + + ColorHLSToRGBf(h, l+0.1f, s, &r, &g, &b); + m_ColHighBg = Color32FromARGBf(0.4f, r, g, b); + //m_ColHighBg = Color32FromARGBf(a, 0.95f, 0.95f, 0.2f); + + m_ColLabelText = lightText ? COLOR32_WHITE : COLOR32_BLACK; + m_ColStructText = lightText ? 0xffefef00 : 0xff505000; + + m_ColValText = lightText ? 0xffb7b7ff : 0xff000080; + m_ColValTextRO = lightText ? 0xffb7b7b7 : 0xff505050; + m_ColValMin = lightText ? 0xff9797ff : 0xff0000f0; + m_ColValMax = m_ColValMin; + m_ColValTextNE = lightText ? 0xff97f797 : 0xff006000; + + ColorHLSToRGBf(h, lightText ? (min(l+0.2f, 0.3f)) : (max(l-0.2f, 0.6f)), s, &r, &g, &b); + m_ColValBg = Color32FromARGBf(0.4f*a, 0, 0, 0); + m_ColStructBg = Color32FromARGBf(0.4f*a, 0, 0, 0); + + ColorHLSToRGBf(h, 0.4f, s, &r, &g, &b); + m_ColTitleBg = Color32FromARGBf(a+0.4f, r, g, b); + m_ColTitleText = lightText ? COLOR32_WHITE : COLOR32_BLACK; + m_ColTitleShadow = lightText ? 0x80000000 : 0x80ffffff; + ColorHLSToRGBf(h, 0.3f, s, &r, &g, &b); + m_ColTitleHighBg = Color32FromARGBf(a+0.4f, r, g, b); + ColorHLSToRGBf(h, 0.4f, s, &r, &g, &b); + m_ColTitleUnactiveBg = Color32FromARGBf(a+0.2f, r, g, b); + + ColorHLSToRGBf(h, 0.8f, s, &r, &g, &b); + m_ColLine = Color32FromARGBf(0.6f, r, g, b); // 0xfff0f0f0; + m_ColLineShadow = Color32FromARGBf(0.6f, 0, 0, 0); //COLOR32_BLACK; + m_ColUnderline = lightText ? 0xffd0d0d0 : 0xff202000; + ColorHLSToRGBf(h, 0.7f, s, &r, &g, &b); + m_ColBtn = Color32FromARGBf(0.6f, r, g, b); + ColorHLSToRGBf(h, 0.4f, s, &r, &g, &b); + m_ColHighBtn = Color32FromARGBf(0.6f, r, g, b); + ColorHLSToRGBf(h, 0.6f, s, &r, &g, &b); + m_ColFold = Color32FromARGBf(0.3f*a, r, g, b); + ColorHLSToRGBf(h, 0.4f, s, &r, &g, &b); + m_ColHighFold = Color32FromARGBf(0.3f, r, g, b); + + ColorHLSToRGBf(h, lightText ? l+0.2f : l-0.2f, s, &r, &g, &b); + m_ColGrpBg = Color32FromARGBf(0.5f*a, r, g, b); + m_ColGrpText = lightText ? 0xffffff80 : 0xff404000; + + ColorHLSToRGBf(h, 0.75f, s, &r, &g, &b); + m_ColHelpBg = Color32FromARGBf(a, r, g, b); + m_ColHelpText = Color32FromARGBf(1, 0, 0.4f, 0); + + ColorHLSToRGBf(h, 0.45f, s, &r, &g, &b); + m_ColHierBg = Color32FromARGBf(0.75f*a, r, g, b); + + m_ColShortcutText = lightText ? 0xffff8040 : 0xff802000; //0xfff0f0f0; + m_ColShortcutBg = Color32FromARGBf(0.4f*a, 0.2f, 0.2f, 0.2f); + m_ColInfoText = Color32FromARGBf(1.0f, 0.7f, 0.7f, 0.7f); + + m_ColRoto = Color32FromARGBf(1, 0.75f, 0.75f, 0.75f); + m_ColRotoVal = Color32FromARGBf(1, 1.0f, 0.2f, 0.2f); + m_ColRotoBound = Color32FromARGBf(1, 0.4f, 0.4f, 0.4f); + + m_ColEditText = lightText ? COLOR32_WHITE : COLOR32_BLACK; + m_ColEditBg = lightText ? 0xb7575757 : 0xb7c7c7c7; + m_ColEditSelText = lightText ? COLOR32_BLACK : COLOR32_WHITE; + m_ColEditSelBg = lightText ? 0xffc7c7c7 : 0xff575757; + + m_ColSeparator = m_ColValTextRO; + m_ColStaticText = m_ColHelpText; +} +*/ + +// --------------------------------------------------------------------------- + +CTwVarGroup::~CTwVarGroup() +{ + for( vector::iterator it= m_Vars.begin(); it!=m_Vars.end(); ++it ) + if( *it != NULL ) + { + CTwVar *Var = *it; + delete Var; + *it = NULL; + } +} + +// --------------------------------------------------------------------------- + +static inline int IncrBtnWidth(int _CharHeight) +{ + return ((2*_CharHeight)/3+2)&0xfffe; // force even value +} + +// --------------------------------------------------------------------------- + +void CTwBar::BrowseHierarchy(int *_CurrLine, int _CurrLevel, const CTwVar *_Var, int _First, int _Last) +{ + assert(_Var!=NULL); + if( !_Var->m_IsRoot ) + { + if( (*_CurrLine)>=_First && (*_CurrLine)<=_Last ) + { + CHierTag Tag; + Tag.m_Level = _CurrLevel; + Tag.m_Var = const_cast(_Var); + Tag.m_Closing = false; + m_HierTags.push_back(Tag); + } + *_CurrLine += 1; + } + else + { + *_CurrLine = 0; + _CurrLevel = -1; + m_HierTags.resize(0); + } + + if( _Var->IsGroup() ) + { + const CTwVarGroup *Grp = static_cast(_Var); + if( Grp->m_Open ) + for( vector::const_iterator it=Grp->m_Vars.begin(); it!=Grp->m_Vars.end(); ++it ) + if( (*it)->m_Visible ) + BrowseHierarchy(_CurrLine, _CurrLevel+1, *it, _First, _Last); + if( m_HierTags.size()>0 ) + m_HierTags[m_HierTags.size()-1].m_Closing = true; + } +} + +// --------------------------------------------------------------------------- + +void CTwBar::ListLabels(vector& _Labels, vector& _Colors, vector& _BgColors, bool *_HasBgColors, const CTexFont *_Font, int _AtomWidthMax, int _GroupWidthMax) +{ + const int NbEtc = 2; + string ValStr; + int Len, i, x, Etc, s; + const unsigned char *Text; + unsigned char ch; + int WidthMax; + + int Space = _Font->m_CharWidth[(int)' ']; + int LevelSpace = max(_Font->m_CharHeight-6, 4); // space used by DrawHierHandles + + int nh = (int)m_HierTags.size(); + for( int h=0; hm_Label.length(); + if( Len>0 ) + Text = (const unsigned char *)(m_HierTags[h].m_Var->m_Label.c_str()); + else + { + Text = (const unsigned char *)(m_HierTags[h].m_Var->m_Name.c_str()); + Len = (int)m_HierTags[h].m_Var->m_Name.length(); + } + x = 0; + Etc = 0; + _Labels.push_back(""); // add a new text line + if( !m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_BUTTON && static_cast(m_HierTags[h].m_Var)->m_ReadOnly && static_cast(m_HierTags[h].m_Var)->m_Val.m_Button.m_Callback!=NULL ) + _Colors.push_back(m_ColValTextRO); // special case for read-only buttons + else + _Colors.push_back(m_HierTags[h].m_Var->m_ColorPtr!=NULL ? *(m_HierTags[h].m_Var->m_ColorPtr) : COLOR32_WHITE); + color32 bg = m_HierTags[h].m_Var->m_BgColorPtr!=NULL ? *(m_HierTags[h].m_Var->m_BgColorPtr) : 0; + _BgColors.push_back(bg); + if( _HasBgColors!=NULL && bg!=0 ) + *_HasBgColors = true; + bool IsCustom = m_HierTags[h].m_Var->IsCustom(); // !m_HierTags[h].m_Var->IsGroup() && (static_cast(m_HierTags[h].m_Var)->m_Type>=TW_TYPE_CUSTOM_BASE && static_cast(m_HierTags[h].m_Var)->m_Typem_Customs.size()); + if( !IsCustom ) + { + string& CurrentLabel = _Labels[_Labels.size()-1]; + if( m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_SummaryCallback==NULL ) + WidthMax = _GroupWidthMax; + else if( !m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_BUTTON ) + { + if( static_cast(m_HierTags[h].m_Var)->m_Val.m_Button.m_Callback==NULL ) + WidthMax = _GroupWidthMax; + else if( m_ButtonAlign == BUTTON_ALIGN_RIGHT ) + WidthMax = _GroupWidthMax - 2*IncrBtnWidth(m_Font->m_CharHeight); + else + WidthMax = _AtomWidthMax; + } + //else if( m_HighlightedLine==h && m_DrawRotoBtn ) + // WidthMax = _AtomWidthMax - IncrBtnWidth(m_Font->m_CharHeight); + else + WidthMax = _AtomWidthMax; + if( Space>0 ) + for( s=0; sm_CharWidth[(int)'.']m_DontClip) + for( i=0; im_CharWidth[(int)ch]; + if( Etc>0 ) + { + ++Etc; + if( Etc>NbEtc ) + break; + } + else if( im_CharWidth[(int)'.']>=WidthMax && !(m_HierTags[h].m_Var->m_DontClip)) + Etc = 1; + } + } + } +} + +// --------------------------------------------------------------------------- + +void CTwBar::ListValues(vector& _Values, vector& _Colors, vector& _BgColors, const CTexFont *_Font, int _WidthMax) +{ + CTwFPU fpu; // force fpu precision + + const int NbEtc = 2; + const CTwVarAtom *Atom = NULL; + string ValStr; + int Len, i, x, Etc; + const unsigned char *Text; + unsigned char ch; + bool ReadOnly; + bool IsMax; + bool IsMin; + bool IsROText; + bool HasBgColor; + bool AcceptEdit; + size_t SummaryMaxLength = max(_WidthMax/_Font->m_CharWidth[(int)'I'], 4); + static vector Summary; + Summary.resize(SummaryMaxLength+32); + + int nh = (int)m_HierTags.size(); + for( int h=0; hIsGroup() || m_IsHelpBar + || (m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_SummaryCallback!=NULL) ) + { + ReadOnly = true; + IsMax = false; + IsMin = false; + IsROText = false; + HasBgColor = true; + AcceptEdit = false; + if( !m_HierTags[h].m_Var->IsGroup() ) + { + Atom = static_cast(m_HierTags[h].m_Var); + Atom->ValueToString(&ValStr); + if( !m_IsHelpBar || (Atom->m_Type==TW_TYPE_SHORTCUT && (Atom->m_Val.m_Shortcut.m_Incr[0]>0 || Atom->m_Val.m_Shortcut.m_Decr[0]>0)) ) + ReadOnly = Atom->m_ReadOnly; + if( !Atom->m_NoSlider ) + { + double v, vmin, vmax; + v = Atom->ValueToDouble(); + Atom->MinMaxStepToDouble(&vmin, &vmax, NULL); + IsMax = (v>=vmax); + IsMin = (v<=vmin); + } + if( Atom->m_Type==TW_TYPE_BOOLCPP || Atom->m_Type==TW_TYPE_BOOL8 || Atom->m_Type==TW_TYPE_BOOL16 || Atom->m_Type==TW_TYPE_BOOL32 ) + { + if (ValStr=="1") + ValStr = "\x7f"; // check sign + else if (ValStr=="0") + ValStr = " -"; //"\x97"; // uncheck sign + } + if( (Atom->m_Type==TW_TYPE_CDSTRING && Atom->m_SetCallback==NULL && g_TwMgr->m_CopyCDStringToClient==NULL) + || (Atom->m_Type==TW_TYPE_CDSTDSTRING && Atom->m_SetCallback==NULL) + || (Atom->m_Type==TW_TYPE_STDSTRING && Atom->m_SetCallback==NULL && g_TwMgr->m_CopyStdStringToClient==NULL) ) + IsROText = true; + if( Atom->m_Type==TW_TYPE_HELP_ATOM || Atom->m_Type==TW_TYPE_HELP_GRP || Atom->m_Type==TW_TYPE_BUTTON || Atom->IsCustom() ) // (Atom->m_Type>=TW_TYPE_CUSTOM_BASE && Atom->m_Typem_Customs.size()) ) + HasBgColor = false; + AcceptEdit = EditInPlaceAcceptVar(Atom) || (Atom->m_Type==TW_TYPE_SHORTCUT); + } + else if(m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_SummaryCallback!=NULL) + { + const CTwVarGroup *Grp = static_cast(m_HierTags[h].m_Var); + // force internal value update + for( size_t v=0; vm_Vars.size(); v++ ) + if( Grp->m_Vars[v]!=NULL && !Grp->m_Vars[v]->IsGroup() && Grp->m_Vars[v]->m_Visible ) + static_cast(Grp->m_Vars[v])->ValueToDouble(); + + Summary[0] = '\0'; + if( Grp->m_SummaryCallback==CTwMgr::CStruct::DefaultSummary ) + Grp->m_SummaryCallback(&Summary[0], SummaryMaxLength, Grp, Grp->m_SummaryClientData); + else + Grp->m_SummaryCallback(&Summary[0], SummaryMaxLength, Grp->m_StructValuePtr, Grp->m_SummaryClientData); + ValStr = (const char *)(&Summary[0]); + } + else + { + ValStr = ""; // is a group in the help bar + HasBgColor = false; + } + Len = (int)ValStr.length(); + Text = (const unsigned char *)(ValStr.c_str()); + x = 0; + Etc = 0; + _Values.push_back(""); // add a new text line + if( ReadOnly || (IsMin && IsMax) || IsROText ) + _Colors.push_back(m_ColValTextRO); + else if( IsMin ) + _Colors.push_back(m_ColValMin); + else if( IsMax ) + _Colors.push_back(m_ColValMax); + else if( !AcceptEdit ) + _Colors.push_back(m_ColValTextNE); + else + _Colors.push_back(m_ColValText); + if( !HasBgColor ) + _BgColors.push_back(0x00000000); + else if( m_HierTags[h].m_Var->IsGroup() ) + { + const CTwVarGroup *Grp = static_cast(m_HierTags[h].m_Var); + // if typecolor set bgcolor + if( Grp->m_SummaryCallback==CColorExt::SummaryCB ) + _BgColors.push_back(0xff000000); + else + _BgColors.push_back(m_ColStructBg); + } + else + _BgColors.push_back(m_ColValBg); + + string& CurrentValue = _Values[_Values.size()-1]; + int wmax = _WidthMax; + if( m_HighlightedLine==h && m_DrawRotoBtn ) + wmax -= 3*IncrBtnWidth(m_Font->m_CharHeight); + else if( m_HighlightedLine==h && m_DrawIncrDecrBtn ) + wmax -= 2*IncrBtnWidth(m_Font->m_CharHeight); + else if( m_HighlightedLine==h && m_DrawListBtn ) + wmax -= 1*IncrBtnWidth(m_Font->m_CharHeight); + else if( m_HighlightedLine==h && m_DrawBoolBtn ) + wmax -= 1*IncrBtnWidth(m_Font->m_CharHeight); + for( i=0; im_CharWidth[(int)ch]; + if( Etc>0 ) + { + ++Etc; + if( Etc>NbEtc ) + break; + } + else if( im_CharWidth[(int)'.'])>=wmax ) + Etc = 1; + } + } + else + { + _Values.push_back(""); // add a new empty line + _Colors.push_back(COLOR32_BLACK); + _BgColors.push_back(0x00000000); + } +} + +// --------------------------------------------------------------------------- + +int CTwBar::ComputeLabelsWidth(const CTexFont *_Font) +{ + int Len, i, x, s; + const unsigned char *Text; + int LabelsWidth = 0; + int Space = _Font->m_CharWidth[(int)' ']; + int LevelSpace = max(_Font->m_CharHeight-6, 4); // space used by DrawHierHandles + + int nh = (int)m_HierTags.size(); + for( int h=0; hm_Label.length(); + if( Len>0 ) + Text = (const unsigned char *)(m_HierTags[h].m_Var->m_Label.c_str()); + else + { + Text = (const unsigned char *)(m_HierTags[h].m_Var->m_Name.c_str()); + Len = (int)m_HierTags[h].m_Var->m_Name.length(); + } + x = 0; + bool IsCustom = m_HierTags[h].m_Var->IsCustom(); // !m_HierTags[h].m_Var->IsGroup() && (static_cast(m_HierTags[h].m_Var)->m_Type>=TW_TYPE_CUSTOM_BASE && static_cast(m_HierTags[h].m_Var)->m_Typem_Customs.size()); + if( !IsCustom ) + { + if( Space>0 ) + for( s=0; sm_CharWidth[(int)Text[i]]; + x += 3*Space; // add little margin + } + if (x > LabelsWidth) + LabelsWidth = x; + } + + return LabelsWidth; +} + +int CTwBar::ComputeValuesWidth(const CTexFont *_Font) +{ + CTwFPU fpu; // force fpu precision + + const CTwVarAtom *Atom = NULL; + string ValStr; + int Len, i, x; + int Space = _Font->m_CharWidth[(int)' ']; + const unsigned char *Text; + int ValuesWidth = 0; + + int nh = (int)m_HierTags.size(); + for( int h=0; hIsGroup() ) + { + Atom = static_cast(m_HierTags[h].m_Var); + Atom->ValueToString(&ValStr); + + Len = (int)ValStr.length(); + Text = (const unsigned char *)(ValStr.c_str()); + x = 0; + for( i=0; im_CharWidth[(int)Text[i]]; + x += 2*Space; // add little margin + if (x > ValuesWidth) + ValuesWidth = x; + } + + return ValuesWidth; +} + +// --------------------------------------------------------------------------- + +static int ClampText(string& _Text, const CTexFont *_Font, int _WidthMax) +{ + int Len = (int)_Text.length(); + unsigned char ch; + int Width = 0; + int i; + for( i=0; im_CharWidth[(int)'.']>=_WidthMax ) + break; + Width += _Font->m_CharWidth[ch]; + } + if( im_CharWidth[(int)'.']; + } + return Width; +} + +// --------------------------------------------------------------------------- + +void CTwBar::Update() +{ + assert(m_UpToDate==false); + assert(m_Font); + ITwGraph *Gr = g_TwMgr->m_Graph; + + if( g_TwMgr->m_WndWidth<=0 || g_TwMgr->m_WndHeight<=0 ) + return; // graphic window is not ready + + bool DoEndDraw = false; + if( !Gr->IsDrawing() ) + { + Gr->BeginDraw(g_TwMgr->m_WndWidth, g_TwMgr->m_WndHeight); + DoEndDraw = true; + } + + bool ValuesWidthFit = false; + if( m_ValuesWidth==VALUES_WIDTH_FIT ) + { + ValuesWidthFit = true; + m_ValuesWidth = 0; + } + int PrevPosY = m_PosY; + int vpx, vpy, vpw, vph; + vpx = 0; + vpy = 0; + vpw = g_TwMgr->m_WndWidth; + vph = g_TwMgr->m_WndHeight; + if( !m_IsMinimized && vpw>0 && vph>0 ) + { + bool Modif = false; + if( m_Resizable ) + { + if( m_Width>vpw && m_Contained ) + { + m_Width = vpw; + Modif = true; + } + if( m_Width<8*m_Font->m_CharHeight ) + { + m_Width = 8*m_Font->m_CharHeight; + Modif = true; + } + if( m_Height>vph && m_Contained ) + { + m_Height = vph; + Modif = true; + } + if( m_Height<5*m_Font->m_CharHeight ) + { + m_Height = 5*m_Font->m_CharHeight; + Modif = true; + } + } + if( m_Movable && m_Contained ) + { + if( m_PosX+m_Width>vpx+vpw ) + m_PosX = vpx+vpw-m_Width; + if( m_PosXvpy+vph ) + m_PosY = vpy+vph-m_Height; + if( m_PosYm_CharHeight ) + { + m_ValuesWidth = 2*m_Font->m_CharHeight; + Modif = true; + } + if( m_ValuesWidth>m_Width-4*m_Font->m_CharHeight ) + { + m_ValuesWidth = m_Width-4*m_Font->m_CharHeight; + Modif = true; + } + if (ValuesWidthFit) + Modif = true; + if( Modif && m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + } + } + + UpdateColors(); + + // update geometry relatively to (m_PosX, m_PosY) + if( !m_IsPopupList ) + { + //m_VarX0 = 2*m_Font->m_CharHeight+m_Sep; + m_VarX0 = m_Font->m_CharHeight+m_Sep; + //m_VarX2 = m_Width - 4; + m_VarX2 = m_Width - m_Font->m_CharHeight - m_Sep-2; + m_VarX1 = m_VarX2 - m_ValuesWidth; + } + else + { + //m_VarX0 = m_Font->m_CharHeight+6+m_Sep; + m_VarX0 = 2; + //m_VarX2 = m_Width - 4; + m_VarX2 = m_Width - m_Font->m_CharHeight - m_Sep-2; + m_VarX1 = m_VarX2; + } + if( m_VarX1m_VarX2 ) + m_VarX1 = m_VarX2; + if( !m_IsPopupList ) + { + m_VarY0 = m_Font->m_CharHeight+2+m_Sep+6; + m_VarY1 = m_Height-m_Font->m_CharHeight-2-m_Sep; + m_VarY2 = m_Height-1; + } + else + { + m_VarY0 = 4; + m_VarY1 = m_Height-2-m_Sep; + m_VarY2 = m_Height-1; + } + + int NbLines = (m_VarY1-m_VarY0+1)/(m_Font->m_CharHeight+m_LineSep); + if( NbLines<= 0 ) + NbLines = 1; + if( !m_IsMinimized ) + { + int LineNum = 0; + BrowseHierarchy(&LineNum, 0, &m_VarRoot, m_FirstLine, m_FirstLine+NbLines); // add a dummy tag at the end to avoid wrong 'tag-closing' problems + if( (int)m_HierTags.size()>NbLines ) + m_HierTags.resize(NbLines); // remove the last dummy tag + m_NbHierLines = LineNum; + m_NbDisplayedLines = (int)m_HierTags.size(); + + if( ValuesWidthFit ) + { + m_ValuesWidth = ComputeValuesWidth(m_Font); + if( m_ValuesWidth<2*m_Font->m_CharHeight ) + m_ValuesWidth = 2*m_Font->m_CharHeight; // enough to draw buttons + if( m_ValuesWidth>m_VarX2 - m_VarX0 ) + m_ValuesWidth = max(m_VarX2 - m_VarX0 - m_Font->m_CharHeight, 0); + m_VarX1 = m_VarX2 - m_ValuesWidth; + if( m_VarX1m_VarX2 ) + m_VarX1 = m_VarX2; + m_ValuesWidth = m_VarX2 - m_VarX1; + } + } + + // scroll bar + int y0 = m_PosY+m_VarY0; + int y1 = m_PosY+m_VarY1; + int x0 = m_PosX+2; + int x1 = m_PosX+m_Font->m_CharHeight-2; + if( ((x0+x1)&1)==1 ) + x1 += 1; + int w = x1-x0+1; + int h = y1-y0-2*w; + int hscr = (m_NbHierLines>0) ? ((h*m_NbDisplayedLines)/m_NbHierLines) : h; + if( hscr<=4 ) + hscr = 4; + if( hscr>h ) + hscr = h; + int yscr = (m_NbHierLines>0) ? ((h*m_FirstLine)/m_NbHierLines) : 0; + if( yscr<=0 ) + yscr = 0; + if( yscr>h-4 ) + yscr = h-4; + if( yscr+hscr>h ) + hscr = h-yscr; + if( hscr>h ) + hscr = h; + if( hscr<=4 ) + hscr = 4; + m_ScrollYW = w; + m_ScrollYH = h; + m_ScrollY0 = y0+w+yscr; + m_ScrollY1 = y0+w+yscr+hscr; + + // Build title + string Title; + if( m_Label.size()>0 ) + Title = m_Label; + else + Title = m_Name; + m_TitleWidth = ClampText(Title, m_Font, (!m_IsMinimized)?(m_Width-5*m_Font->m_CharHeight):(16*m_Font->m_CharHeight)); + Gr->BuildText(m_TitleTextObj, &Title, NULL, NULL, 1, m_Font, 0, 0); + + if( !m_IsMinimized ) + { + // Build labels + vector Labels; + vector Colors; + vector BgColors; + bool HasBgColors = false; + ListLabels(Labels, Colors, BgColors, &HasBgColors, m_Font, m_VarX1-m_VarX0, m_VarX2-m_VarX0); + assert( Labels.size()==Colors.size() && Labels.size()==BgColors.size() ); + if( Labels.size()>0 ) + Gr->BuildText(m_LabelsTextObj, &(Labels[0]), &(Colors[0]), &(BgColors[0]), (int)Labels.size(), m_Font, m_LineSep, HasBgColors ? m_VarX1-m_VarX0-m_Font->m_CharHeight+2 : 0); + else + Gr->BuildText(m_LabelsTextObj, NULL, NULL, NULL, 0, m_Font, m_LineSep, 0); + + // Should draw click button? + m_DrawClickBtn = ( m_VarX2-m_VarX1>4*IncrBtnWidth(m_Font->m_CharHeight) + && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() + && m_HierTags[m_HighlightedLine].m_Var!=NULL + && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly + && ( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BUTTON )); + // || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOLCPP + // || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL8 + // || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL16 + // || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL32 )); + + // Should draw [-/+] button? + m_DrawIncrDecrBtn = ( m_VarX2-m_VarX1>5*IncrBtnWidth(m_Font->m_CharHeight) + && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() + && m_HierTags[m_HighlightedLine].m_Var!=NULL + && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() + && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type!=TW_TYPE_BUTTON + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider + && !(m_EditInPlace.m_Active && m_EditInPlace.m_Var==m_HierTags[m_HighlightedLine].m_Var) ); + + // Should draw [v] button (list)? + m_DrawListBtn = ( m_VarX2-m_VarX1>2*IncrBtnWidth(m_Font->m_CharHeight) + && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() + && m_HierTags[m_HighlightedLine].m_Var!=NULL + && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() + && IsEnumType(static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type) + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ); + + // Should draw [<>] button (bool)? + m_DrawBoolBtn = ( m_VarX2-m_VarX1>4*IncrBtnWidth(m_Font->m_CharHeight) + && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() + && m_HierTags[m_HighlightedLine].m_Var!=NULL + && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly + && ( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOLCPP + || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL8 + || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL16 + || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL32 )); + + // Should draw [o] button? + m_DrawRotoBtn = m_DrawIncrDecrBtn; + /* + m_DrawRotoBtn = ( m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() + && m_HierTags[m_HighlightedLine].m_Var!=NULL + && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() + && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type!=TW_TYPE_BUTTON + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider ); + */ + + // Build values + vector& Values = Labels; // reuse + Values.resize(0); + Colors.resize(0); + BgColors.resize(0); + ListValues(Values, Colors, BgColors, m_Font, m_VarX2-m_VarX1); + assert( BgColors.size()==Values.size() && Colors.size()==Values.size() ); + if( Values.size()>0 ) + Gr->BuildText(m_ValuesTextObj, &(Values[0]), &(Colors[0]), &(BgColors[0]), (int)Values.size(), m_Font, m_LineSep, m_VarX2-m_VarX1); + else + Gr->BuildText(m_ValuesTextObj, NULL, NULL, NULL, 0, m_Font, m_LineSep, m_VarX2-m_VarX1); + + // Build key shortcut text + string Shortcut; + m_ShortcutLine = -1; + if( m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var!=NULL && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + const CTwVarAtom *Atom = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( Atom->m_KeyIncr[0]>0 || Atom->m_KeyDecr[0]>0 ) + { + if( Atom->m_KeyIncr[0]>0 && Atom->m_KeyDecr[0]>0 ) + Shortcut = "Keys: "; + else + Shortcut = "Key: "; + if( Atom->m_KeyIncr[0]>0 ) + TwGetKeyString(&Shortcut, Atom->m_KeyIncr[0], Atom->m_KeyIncr[1]); + else + Shortcut += "(none)"; + if( Atom->m_KeyDecr[0]>0 ) + { + Shortcut += " "; + TwGetKeyString(&Shortcut, Atom->m_KeyDecr[0], Atom->m_KeyDecr[1]); + } + m_ShortcutLine = m_HighlightedLine; + } + } + ClampText(Shortcut, m_Font, m_Width-3*m_Font->m_CharHeight); + Gr->BuildText(m_ShortcutTextObj, &Shortcut, NULL, NULL, 1, m_Font, 0, 0); + + // build headers text + if (m_HighlightLabelsHeader || m_HighlightValuesHeader) { + std::string HeadersText = "Fit column content"; + ClampText(HeadersText, m_Font, m_Width-3*m_Font->m_CharHeight); + Gr->BuildText(m_HeadersTextObj, &HeadersText, NULL, NULL, 1, m_Font, 0, 0); + } + } + + if( DoEndDraw ) + Gr->EndDraw(); + + m_UpToDate = true; + m_LastUpdateTime = float(g_BarTimer.GetTime()); +} + +// --------------------------------------------------------------------------- + +void CTwBar::DrawHierHandle() +{ + assert(m_Font); + ITwGraph *Gr = g_TwMgr->m_Graph; + + //int x0 = m_PosX+m_Font->m_CharHeight+1; + int x0 = m_PosX+3; + //int x2 = m_PosX+m_VarX0-5; + //int x2 = m_PosX+3*m_Font->m_CharWidth[(int)' ']-2; + int x2 = m_PosX+m_Font->m_CharHeight-3; + if( x2-x0<4 ) + x2 = x0+4; + if( (x2-x0)&1 ) + --x2; + int x1 = (x0+x2)/2; + int w = x2-x0+1; + int y0 = m_PosY+m_VarY0 +1; + int y1; + int dh0 = (m_Font->m_CharHeight+m_Sep-1-w)/2; + if( dh0<0 ) + dh0 = 0; + int dh1 = dh0+w-1; + int i, h=0; + + if( !m_IsPopupList ) + { + CTwVarGroup *Grp; + int nh = (int)m_HierTags.size(); + for( h=0; hm_CharHeight+m_Sep-1; + if( m_HierTags[h].m_Var->IsGroup() ) + Grp = static_cast(m_HierTags[h].m_Var); + else + Grp = NULL; + + int dx = m_HierTags[h].m_Level * (x2-x0); + + if( Grp ) + { + if( m_ColGrpBg!=0 && Grp->m_StructValuePtr==NULL ) + { + color32 cb = (Grp->m_StructType==TW_TYPE_HELP_STRUCT) ? m_ColStructBg : m_ColGrpBg; + //Gr->DrawRect(x0+dx-1, y0, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1, cb); + Gr->DrawRect(x2+dx+3, y0, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1+m_LineSep-1, cb); + } + + if( m_DrawHandles ) + { + Gr->DrawLine(dx+x2+1,y0+dh0+1, dx+x2+1,y0+dh1+1, m_ColLineShadow); + Gr->DrawLine(dx+x0+1,y0+dh1+1, dx+x2+2,y0+dh1+1, m_ColLineShadow); + } + + //Gr->DrawRect(x0+1,y0+dh0+1,x2-1,y0+dh1-1, (h==m_HighlightedLine) ? m_ColHighBtn : m_ColBtn); + Gr->DrawRect(dx+x0, y0+dh0, dx+x2, y0+dh1, (h==m_HighlightedLine) ? m_ColHighFold : m_ColFold); + if( m_DrawHandles ) + { + Gr->DrawLine(dx+x0,y0+dh0, dx+x2,y0+dh0, m_ColLine); + Gr->DrawLine(dx+x2,y0+dh0, dx+x2,y0+dh1+1, m_ColLine); + Gr->DrawLine(dx+x2,y0+dh1, dx+x0,y0+dh1, m_ColLine); + Gr->DrawLine(dx+x0,y0+dh1, dx+x0,y0+dh0, m_ColLine); + } + + Gr->DrawLine(dx+x0+2,y0+dh0+w/2, dx+x2-1,y0+dh0+w/2, m_ColTitleText); + if( !Grp->m_Open ) + Gr->DrawLine(dx+x1,y0+dh0+2, dx+x1,y0+dh1-1, m_ColTitleText); + + /* + if( m_ColGrpBg!=0 && Grp->m_StructValuePtr==NULL ) + { + color32 cb = (Grp->m_StructType==TW_TYPE_HELP_STRUCT) ? m_ColStructBg : m_ColGrpBg; + //int decal = m_Font->m_CharHeight/2-2+2*m_HierTags[h].m_Level; + //if( decal>m_Font->m_CharHeight-3 ) + // decal = m_Font->m_CharHeight-3; + int margin = dx; //m_Font->m_CharWidth[(int)' ']*m_HierTags[h].m_Level; + //Gr->DrawRect(m_PosX+m_VarX0+margin, y0+decal, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1, cb); + Gr->DrawRect(m_PosX+m_VarX0+margin-1, y0+1, m_PosX+m_VarX2, y0+m_Font->m_CharHeight, cb);// m_ColHierBg); + //Gr->DrawRect(m_PosX+m_VarX0-4, y0+m_Font->m_CharHeight/2-1, m_PosX+m_VarX0+margin-2, y0+m_Font->m_CharHeight/2, m_ColHierBg); + } + */ + } + else if( static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_HELP_GRP && m_ColHelpBg!=0 ) + Gr->DrawRect(m_PosX+m_VarX0+m_HierTags[h].m_Var->m_LeftMargin, y0+m_HierTags[h].m_Var->m_TopMargin, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1, m_ColHelpBg); + //else if( static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_HELP_HEADER && m_ColHelpBg!=0 ) + // Gr->DrawRect(m_PosX+m_VarX0+m_HierTags[h].m_Var->m_LeftMargin, y0+m_HierTags[h].m_Var->m_TopMargin, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1, m_ColHelpBg); + /* + else if( static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_BUTTON && m_ColBtn!=0 ) + { + // draw button + int cbx0 = m_PosX+m_VarX2-2*bw+bw/2, cby0 = y0+2, cbx1 = m_PosX+m_VarX2-2-bw/2, cby1 = y0+m_Font->m_CharHeight-4; + if( m_HighlightClickBtn ) + { + Gr->DrawRect(cbx0+2, cby0+2, cbx1+2, cby1+2, m_ColBtn); + Gr->DrawLine(cbx0+3, cby1+3, cbx1+4, cby1+3, 0x7F000000); + Gr->DrawLine(cbx1+3, cby0+3, cbx1+3, cby1+3, 0x7F000000); + } + else + { + Gr->DrawRect(cbx0+3, cby1+1, cbx1+3, cby1+3, 0x7F000000); + Gr->DrawRect(cbx1+1, cby0+3, cbx1+3, cby1, 0x7F000000); + Gr->DrawRect(cbx0, cby0, cbx1, cby1, m_ColBtn); + } + } + */ + + y0 = y1+m_LineSep; + } + } + + if( m_NbDisplayedLinesm_CharHeight-2; + x0 = m_PosX + m_VarX2+4; + x1 = x0 + m_Font->m_CharHeight-4; + if( ((x0+x1)&1)==1 ) + x1 += 1; + w = m_ScrollYW; + h = m_ScrollYH; + + Gr->DrawRect(x0+2,y0+w, x1-2,y1-1-w, (m_ColBg&0xffffff)|0x11000000); + if( m_DrawHandles || m_IsPopupList ) + { + // scroll handle shadow lines + Gr->DrawLine(x1-1,m_ScrollY0+1, x1-1,m_ScrollY1+1, m_ColLineShadow); + Gr->DrawLine(x0+2,m_ScrollY1+1, x1,m_ScrollY1+1, m_ColLineShadow); + + // up & down arrow + for( i=0; i<(x1-x0-2)/2; ++i ) + { + Gr->DrawLine(x0+2+i,y0+w-2*i, x1-i,y0+w-2*i, m_ColLineShadow); + Gr->DrawLine(x0+1+i,y0+w-1-2*i, x1-1-i,y0+w-1-2*i, m_HighlightUpScroll?((m_ColLine&0xffffff)|0x4f000000):m_ColLine); + + Gr->DrawLine(x0+2+i,y1-w+2+2*i, x1-i,y1-w+2+2*i, m_ColLineShadow); + Gr->DrawLine(x0+1+i,y1-w+1+2*i, x1-1-i,y1-w+1+2*i, m_HighlightDnScroll?((m_ColLine&0xffffff)|0x4f000000):m_ColLine); + } + + // middle lines + Gr->DrawLine((x0+x1)/2-1,y0+w, (x0+x1)/2-1,m_ScrollY0, m_ColLine); + Gr->DrawLine((x0+x1)/2,y0+w, (x0+x1)/2,m_ScrollY0, m_ColLine); + Gr->DrawLine((x0+x1)/2+1,y0+w, (x0+x1)/2+1,m_ScrollY0, m_ColLineShadow); + Gr->DrawLine((x0+x1)/2-1,m_ScrollY1, (x0+x1)/2-1,y1-w+1, m_ColLine); + Gr->DrawLine((x0+x1)/2,m_ScrollY1, (x0+x1)/2,y1-w+1, m_ColLine); + Gr->DrawLine((x0+x1)/2+1,m_ScrollY1, (x0+x1)/2+1,y1-w+1, m_ColLineShadow); + // scroll handle lines + Gr->DrawRect(x0+2,m_ScrollY0+1, x1-3,m_ScrollY1-1, m_HighlightScroll?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(x1-2,m_ScrollY0, x1-2,m_ScrollY1, m_ColLine); + Gr->DrawLine(x0+1,m_ScrollY0, x0+1,m_ScrollY1, m_ColLine); + Gr->DrawLine(x0+1,m_ScrollY1, x1-1,m_ScrollY1, m_ColLine); + Gr->DrawLine(x0+1,m_ScrollY0, x1-2,m_ScrollY0, m_ColLine); + } + else + Gr->DrawRect(x0+3,m_ScrollY0+1, x1-3,m_ScrollY1-1, m_ColBtn); + } + + if( m_DrawHandles && !m_IsPopupList ) + { + if( m_Resizable ) // Draw resize handles + { + // lower-left + Gr->DrawLine(m_PosX+3, m_PosY+m_Height-m_Font->m_CharHeight+3, m_PosX+3, m_PosY+m_Height-4, m_ColLine); + Gr->DrawLine(m_PosX+4, m_PosY+m_Height-m_Font->m_CharHeight+4, m_PosX+4, m_PosY+m_Height-3, m_ColLineShadow); + Gr->DrawLine(m_PosX+3, m_PosY+m_Height-4, m_PosX+m_Font->m_CharHeight-4, m_PosY+m_Height-4, m_ColLine); + Gr->DrawLine(m_PosX+4, m_PosY+m_Height-3, m_PosX+m_Font->m_CharHeight-3, m_PosY+m_Height-3, m_ColLineShadow); + // lower-right + Gr->DrawLine(m_PosX+m_Width-4, m_PosY+m_Height-m_Font->m_CharHeight+3, m_PosX+m_Width-4, m_PosY+m_Height-4, m_ColLine); + Gr->DrawLine(m_PosX+m_Width-3, m_PosY+m_Height-m_Font->m_CharHeight+4, m_PosX+m_Width-3, m_PosY+m_Height-3, m_ColLineShadow); + Gr->DrawLine(m_PosX+m_Width-4, m_PosY+m_Height-4, m_PosX+m_Width-m_Font->m_CharHeight+3, m_PosY+m_Height-4, m_ColLine); + Gr->DrawLine(m_PosX+m_Width-3, m_PosY+m_Height-3, m_PosX+m_Width-m_Font->m_CharHeight+4, m_PosY+m_Height-3, m_ColLineShadow); + // upper-left + Gr->DrawLine(m_PosX+3, m_PosY+m_Font->m_CharHeight-4, m_PosX+3, m_PosY+3, m_ColLine); + Gr->DrawLine(m_PosX+4, m_PosY+m_Font->m_CharHeight-3, m_PosX+4, m_PosY+4, m_ColLineShadow); + Gr->DrawLine(m_PosX+3, m_PosY+3, m_PosX+m_Font->m_CharHeight-4, m_PosY+3, m_ColLine); + Gr->DrawLine(m_PosX+4, m_PosY+4, m_PosX+m_Font->m_CharHeight-3, m_PosY+4, m_ColLineShadow); + // upper-right + Gr->DrawLine(m_PosX+m_Width-4, m_PosY+3, m_PosX+m_Width-m_Font->m_CharHeight+3, m_PosY+3, m_ColLine); + Gr->DrawLine(m_PosX+m_Width-3, m_PosY+4, m_PosX+m_Width-m_Font->m_CharHeight+4, m_PosY+4, m_ColLineShadow); + Gr->DrawLine(m_PosX+m_Width-4, m_PosY+m_Font->m_CharHeight-4, m_PosX+m_Width-4, m_PosY+3, m_ColLine); + Gr->DrawLine(m_PosX+m_Width-3, m_PosY+m_Font->m_CharHeight-3, m_PosX+m_Width-3, m_PosY+4, m_ColLineShadow); + } + + int xm = m_PosX+m_Width-2*m_Font->m_CharHeight, wm=m_Font->m_CharHeight-6; + wm = (wm<6) ? 6 : wm; + if( m_Iconifiable ) // Draw minimize button + { + Gr->DrawRect(xm+1, m_PosY+4, xm+wm-1, m_PosY+3+wm, m_HighlightMinimize?m_ColHighBtn:((m_ColBtn&0xffffff)|0x4f000000)); + Gr->DrawLine(xm, m_PosY+3, xm+wm, m_PosY+3, m_ColLine); + Gr->DrawLine(xm+wm, m_PosY+3, xm+wm, m_PosY+3+wm, m_ColLine); + Gr->DrawLine(xm+wm, m_PosY+3+wm, xm, m_PosY+3+wm, m_ColLine); + Gr->DrawLine(xm, m_PosY+3+wm, xm, m_PosY+3, m_ColLine); + Gr->DrawLine(xm+wm+1, m_PosY+4, xm+wm+1, m_PosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm+1, m_PosY+4+wm, xm, m_PosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm/3+((wm<9)?1:0)-1, m_PosY+4+wm/3-((wm<9)?0:1), xm+wm/2, m_PosY+2+wm-1, m_ColTitleText, true); + Gr->DrawLine(xm+wm-wm/3+((wm<9)?0:1), m_PosY+4+wm/3-((wm<9)?0:1), xm+wm/2, m_PosY+2+wm-1, m_ColTitleText, true); + } + + if( g_TwMgr->m_FontResizable ) // Draw font button + { + xm = m_PosX+m_Font->m_CharHeight+2; + Gr->DrawRect(xm+1, m_PosY+4, xm+wm-1, m_PosY+3+wm, m_HighlightFont?m_ColHighBtn:((m_ColBtn&0xffffff)|0x4f000000)); + Gr->DrawLine(xm, m_PosY+3, xm+wm, m_PosY+3, m_ColLine); + Gr->DrawLine(xm+wm, m_PosY+3, xm+wm, m_PosY+3+wm, m_ColLine); + Gr->DrawLine(xm+wm, m_PosY+3+wm, xm, m_PosY+3+wm, m_ColLine); + Gr->DrawLine(xm, m_PosY+3+wm, xm, m_PosY+3, m_ColLine); + Gr->DrawLine(xm+wm+1, m_PosY+4, xm+wm+1, m_PosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm+1, m_PosY+4+wm, xm, m_PosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm/2-wm/6, m_PosY+3+wm/3, xm+wm/2+wm/6+1, m_PosY+3+wm/3, m_ColTitleText); + Gr->DrawLine(xm+wm/2-wm/6, m_PosY+3+wm/3, xm+wm/2-wm/6, m_PosY+4+wm-wm/3+(wm>11?1:0), m_ColTitleText); + Gr->DrawLine(xm+wm/2-wm/6, m_PosY+3+wm/2+(wm>11?1:0), xm+wm/2+wm/6, m_PosY+3+wm/2+(wm>11?1:0), m_ColTitleText); + } + } +} + +// --------------------------------------------------------------------------- + +void CTwBar::Draw(int _DrawPart) +{ + PERF( PerfTimer Timer; double DT; ) + + assert(m_Font); + ITwGraph *Gr = g_TwMgr->m_Graph; + + m_CustomRecords.clear(); + + if( float(g_BarTimer.GetTime())>m_LastUpdateTime+m_UpdatePeriod ) + NotUpToDate(); + + if( m_HighlightedLine!=m_HighlightedLinePrev ) + { + m_HighlightedLinePrev = m_HighlightedLine; + NotUpToDate(); + } + + if( m_IsHelpBar && g_TwMgr->m_HelpBarNotUpToDate ) + g_TwMgr->UpdateHelpBar(); + + if( !m_UpToDate ) + Update(); + + if( !m_IsMinimized ) + { + int y = m_PosY+1; + int LevelSpace = max(m_Font->m_CharHeight-6, 4); // space used by DrawHierHandles + + color32 colBg = m_ColBg, colBg1 = m_ColBg1, colBg2 = m_ColBg2; + if( m_DrawHandles || m_IsPopupList ) + { + unsigned int alphaMin = 0x70; + if( m_IsPopupList ) + alphaMin = 0xa0; + if( (colBg>>24)>24)>24)DrawRect(m_PosX, m_PosY, m_PosX+m_Width-1, m_PosY+m_Font->m_CharHeight+1, (m_HighlightTitle||m_MouseDragTitle) ? m_ColTitleHighBg : (m_DrawHandles ? m_ColTitleBg : m_ColTitleUnactiveBg)); + if( m_HighlightTitle || m_MouseDragTitle ) + Gr->DrawRect(m_PosX, m_PosY, m_PosX+m_Width-1, m_PosY+m_Font->m_CharHeight+1, m_ColTitleHighBg); + else if (m_DrawHandles) + Gr->DrawRect(m_PosX, m_PosY, m_PosX+m_Width-1, m_PosY+m_Font->m_CharHeight+1, m_ColTitleBg, m_ColTitleBg, colBg2, colBg1); + else + Gr->DrawRect(m_PosX, m_PosY, m_PosX+m_Width-1, m_PosY+m_Font->m_CharHeight+1, m_ColTitleBg, m_ColTitleBg, colBg2, colBg1); + } + if( _DrawPart&DRAW_CONTENT ) + { + const color32 COL0 = 0x50ffffff; + const color32 COL1 = 0x501f1f1f; + Gr->DrawRect(m_PosX, m_PosY, m_PosX+m_Width-1, y, COL0, COL0, COL1, COL1); + if( m_ColTitleShadow!=0 ) + Gr->DrawText(m_TitleTextObj, m_PosX+(m_Width-m_TitleWidth)/2+1, m_PosY+1, m_ColTitleShadow, 0); + Gr->DrawText(m_TitleTextObj, m_PosX+(m_Width-m_TitleWidth)/2, m_PosY, m_ColTitleText, 0); + } + y = m_PosY+m_Font->m_CharHeight+1; + if( _DrawPart&DRAW_CONTENT && m_DrawHandles ) + Gr->DrawLine(m_PosX, y, m_PosX+m_Width-1, y, 0x30ffffff); // 0x80afafaf); + y++; + PERF( DT = Timer.GetTime(); printf("Title=%.4fms ", 1000.0*DT); ) + } + + // Draw background + PERF( Timer.Reset(); ) + if( _DrawPart&DRAW_BG ) + { + Gr->DrawRect(m_PosX, y, m_PosX+m_Width-1, m_PosY+m_Height-1, colBg2, colBg1, colBg1, colBg); + //Gr->DrawRect(m_PosX, y, m_PosX+m_VarX0-5, m_PosY+m_Height-1, m_ColHierBg); + Gr->DrawRect(m_PosX+m_VarX2+3, y, m_PosX+m_Width-1, m_PosY+m_Height-1, m_ColHierBg); + } + + if( _DrawPart&DRAW_CONTENT ) + { + // Draw highlighted line + if( m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var!=NULL + && (m_HierTags[m_HighlightedLine].m_Var->IsGroup() + || (!static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly && !m_IsHelpBar + && !m_HierTags[m_HighlightedLine].m_Var->IsCustom() ) ) ) // !(static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type>=TW_TYPE_CUSTOM_BASE && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Typem_Customs.size()))) ) + { + int y0 = m_PosY + m_VarY0 + m_HighlightedLine*(m_Font->m_CharHeight+m_LineSep); + Gr->DrawRect(m_PosX+LevelSpace+6+LevelSpace*m_HierTags[m_HighlightedLine].m_Level, y0+1, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1+m_LineSep-1, m_ColHighBg0, m_ColHighBg0, m_ColHighBg1, m_ColHighBg1); + int eps = (g_TwMgr->m_GraphAPI==TW_OPENGL || g_TwMgr->m_GraphAPI==TW_OPENGL_CORE) ? 1 : 0; + if( !m_EditInPlace.m_Active ) + Gr->DrawLine(m_PosX+LevelSpace+6+LevelSpace*m_HierTags[m_HighlightedLine].m_Level, y0+m_Font->m_CharHeight+m_LineSep-1+eps, m_PosX+m_VarX2, y0+m_Font->m_CharHeight+m_LineSep-1+eps, m_ColUnderline); + } + else if( m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + int y0 = m_PosY + m_VarY0 + m_HighlightedLine*(m_Font->m_CharHeight+m_LineSep); + color32 col = ColorBlend(m_ColHighBg0, m_ColHighBg1, 0.5f); + CTwVarAtom *Atom = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( !Atom->IsCustom() // !(Atom->m_Type>=TW_TYPE_CUSTOM_BASE && Atom->m_Typem_Customs.size()) + && !(Atom->m_Type==TW_TYPE_BUTTON && Atom->m_Val.m_Button.m_Callback==NULL) ) + Gr->DrawRect(m_PosX+LevelSpace+6+LevelSpace*m_HierTags[m_HighlightedLine].m_Level, y0+1, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1+m_LineSep-1, col); + else + Gr->DrawRect(m_PosX+LevelSpace+6+LevelSpace*m_HierTags[m_HighlightedLine].m_Level, y0+1, m_PosX+LevelSpace+6+LevelSpace*m_HierTags[m_HighlightedLine].m_Level+4, y0+m_Font->m_CharHeight-1+m_LineSep-1, col); + } + color32 clight = 0x5FFFFFFF; // bar contour + Gr->DrawLine(m_PosX, m_PosY, m_PosX, m_PosY+m_Height, clight); + Gr->DrawLine(m_PosX, m_PosY, m_PosX+m_Width, m_PosY, clight); + Gr->DrawLine(m_PosX+m_Width, m_PosY, m_PosX+m_Width, m_PosY+m_Height, clight); + Gr->DrawLine(m_PosX, m_PosY+m_Height, m_PosX+m_Width, m_PosY+m_Height, clight); + int dshad = 3; // bar shadows + color32 cshad = (((m_Color>>24)/2)<<24) & 0xFF000000; + Gr->DrawRect(m_PosX, m_PosY+m_Height, m_PosX+dshad, m_PosY+m_Height+dshad, 0, cshad, 0, 0); + Gr->DrawRect(m_PosX+dshad+1, m_PosY+m_Height, m_PosX+m_Width-1, m_PosY+m_Height+dshad, cshad, cshad, 0, 0); + Gr->DrawRect(m_PosX+m_Width, m_PosY+m_Height, m_PosX+m_Width+dshad, m_PosY+m_Height+dshad, cshad, 0, 0, 0); + Gr->DrawRect(m_PosX+m_Width, m_PosY, m_PosX+m_Width+dshad, m_PosY+dshad, 0, 0, cshad, 0); + Gr->DrawRect(m_PosX+m_Width, m_PosY+dshad+1, m_PosX+m_Width+dshad, m_PosY+m_Height-1, cshad, 0, cshad, 0); + PERF( DT = Timer.GetTime(); printf("Bg=%.4fms ", 1000.0*DT); ) + + // Draw hierarchy handle + PERF( Timer.Reset(); ) + DrawHierHandle(); + PERF( DT = Timer.GetTime(); printf("Handles=%.4fms ", 1000.0*DT); ) + + // Draw labels + PERF( Timer.Reset(); ) + Gr->DrawText(m_LabelsTextObj, m_PosX+LevelSpace+6, m_PosY+m_VarY0, 0 /*m_ColLabelText*/, 0); + PERF( DT = Timer.GetTime(); printf("Labels=%.4fms ", 1000.0*DT); ) + + // Draw values + if( !m_IsPopupList ) + { + PERF( Timer.Reset(); ) + Gr->DrawText(m_ValuesTextObj, m_PosX+m_VarX1, m_PosY+m_VarY0, 0 /*m_ColValText*/, 0 /*m_ColValBg*/); + PERF( DT = Timer.GetTime(); printf("Values=%.4fms ", 1000.0*DT); ) + } + + // Draw preview for color values and draw buttons and custom types + int h, nh = (int)m_HierTags.size(); + int yh = m_PosY+m_VarY0; + int bw = IncrBtnWidth(m_Font->m_CharHeight); + for( h=0; hIsGroup() ) + { + const CTwVarGroup * Grp = static_cast(m_HierTags[h].m_Var); + if( Grp->m_SummaryCallback==CColorExt::SummaryCB && Grp->m_StructValuePtr!=NULL ) + { + // draw color value + if( Grp->m_Vars.size()>0 && Grp->m_Vars[0]!=NULL && !Grp->m_Vars[0]->IsGroup() ) + static_cast(Grp->m_Vars[0])->ValueToDouble(); // force ext update + int ydecal = (g_TwMgr->m_GraphAPI==TW_OPENGL || g_TwMgr->m_GraphAPI==TW_OPENGL_CORE) ? 1 : 0; + const int checker = 8; + for( int c=0; cDrawRect(m_PosX+m_VarX1+(c*(m_VarX2-m_VarX1))/checker, yh+1+ydecal+((c%2)*(m_Font->m_CharHeight-2))/2, m_PosX+m_VarX1-1+((c+1)*(m_VarX2-m_VarX1))/checker, yh+ydecal+(((c%2)+1)*(m_Font->m_CharHeight-2))/2, 0xffffffff); + Gr->DrawRect(m_PosX+m_VarX1, yh+1+ydecal, m_PosX+m_VarX2-1, yh+ydecal+m_Font->m_CharHeight-2, 0xbfffffff); + const CColorExt *colExt = static_cast(Grp->m_StructValuePtr); + color32 col = Color32FromARGBi((colExt->m_HasAlpha ? colExt->A : 255), colExt->R, colExt->G, colExt->B); + if( col!=0 ) + Gr->DrawRect(m_PosX+m_VarX1, yh+1+ydecal, m_PosX+m_VarX2-1, yh+ydecal+m_Font->m_CharHeight-2, col); + /* + Gr->DrawLine(m_PosX+m_VarX1-1, yh, m_PosX+m_VarX2+1, yh, 0xff000000); + Gr->DrawLine(m_PosX+m_VarX1-1, yh+m_Font->m_CharHeight, m_PosX+m_VarX2+1, yh+m_Font->m_CharHeight, 0xff000000); + Gr->DrawLine(m_PosX+m_VarX1-1, yh, m_PosX+m_VarX1-1, yh+m_Font->m_CharHeight, 0xff000000); + Gr->DrawLine(m_PosX+m_VarX2, yh, m_PosX+m_VarX2, yh+m_Font->m_CharHeight, 0xff000000); + */ + } + //else if( Grp->m_SummaryCallback==CustomTypeSummaryCB && Grp->m_StructValuePtr!=NULL ) + //{ + //} + } + else if( static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_BUTTON && !m_IsPopupList ) + { + // draw button + int cbx0, cbx1; + if( m_ButtonAlign == BUTTON_ALIGN_LEFT ) + { + cbx0 = m_PosX+m_VarX1+2; + cbx1 = m_PosX+m_VarX1+bw; + } + else if( m_ButtonAlign == BUTTON_ALIGN_CENTER ) + { + cbx0 = m_PosX+(m_VarX1+m_VarX2)/2-bw/2+1; + cbx1 = m_PosX+(m_VarX1+m_VarX2)/2+bw/2-1; + } + else + { + cbx0 = m_PosX+m_VarX2-2*bw+bw/2; + cbx1 = m_PosX+m_VarX2-2-bw/2; + } + int cby0 = yh+3; + int cby1 = yh+m_Font->m_CharHeight-3; + if( !static_cast(m_HierTags[h].m_Var)->m_ReadOnly ) + { + double BtnAutoDelta = g_TwMgr->m_Timer.GetTime() - m_HighlightClickBtnAuto; + if( (m_HighlightClickBtn || (BtnAutoDelta>=0 && BtnAutoDelta<0.1)) && h==m_HighlightedLine ) + { + cbx0--; cby0--; cbx1--; cby1--; + Gr->DrawRect(cbx0+2, cby0+2, cbx1+2, cby1+2, m_ColHighBtn); + Gr->DrawLine(cbx0+3, cby1+3, cbx1+4, cby1+3, 0xAF000000); + Gr->DrawLine(cbx1+3, cby0+3, cbx1+3, cby1+3, 0xAF000000); + Gr->DrawLine(cbx0+2, cby0+2, cbx0+2, cby1+2, m_ColLine); + Gr->DrawLine(cbx0+2, cby1+2, cbx1+2, cby1+2, m_ColLine); + Gr->DrawLine(cbx1+2, cby1+2, cbx1+2, cby0+2, m_ColLine); + Gr->DrawLine(cbx1+2, cby0+2, cbx0+2, cby0+2, m_ColLine); + } + else + { + Gr->DrawRect(cbx0+2, cby1+1, cbx1+2, cby1+2, (h==m_HighlightedLine)?0xAF000000:0x7F000000); + Gr->DrawRect(cbx1+1, cby0+2, cbx1+2, cby1, (h==m_HighlightedLine)?0xAF000000:0x7F000000); + Gr->DrawRect(cbx0, cby0, cbx1, cby1, (h==m_HighlightedLine)?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(cbx0, cby0, cbx0, cby1, m_ColLine); + Gr->DrawLine(cbx0, cby1, cbx1, cby1, m_ColLine); + Gr->DrawLine(cbx1, cby1, cbx1, cby0, m_ColLine); + Gr->DrawLine(cbx1, cby0, cbx0, cby0, m_ColLine); + } + } + else if( static_cast(m_HierTags[h].m_Var)->m_Val.m_Button.m_Callback!=NULL ) + { + Gr->DrawRect(cbx0+1, cby0+1, cbx1+1, cby1+1, m_ColBtn); + } + else if( static_cast(m_HierTags[h].m_Var)->m_Val.m_Button.m_Separator==1 ) + { + int LevelSpace = max(m_Font->m_CharHeight-6, 4); // space used by DrawHierHandles + Gr->DrawLine(m_PosX+m_VarX0+m_HierTags[h].m_Level*LevelSpace, yh+m_Font->m_CharHeight/2, m_PosX+m_VarX2, yh+m_Font->m_CharHeight/2, m_ColSeparator ); + } + } + else if( m_HierTags[h].m_Var->IsCustom() ) //static_cast(m_HierTags[h].m_Var)->m_Type>=TW_TYPE_CUSTOM_BASE && static_cast(m_HierTags[h].m_Var)->m_Typem_Customs.size() ) + { // record custom types + CTwMgr::CMemberProxy *mProxy = static_cast(m_HierTags[h].m_Var)->m_Val.m_Custom.m_MemberProxy; + if( mProxy!=NULL && mProxy->m_StructProxy!=NULL ) + { + CustomMap::iterator it = m_CustomRecords.find(mProxy->m_StructProxy); + int xMin = m_PosX + m_VarX0 + m_HierTags[h].m_Level*LevelSpace; + int xMax = m_PosX + m_VarX2 - 2; + int yMin = yh + 1; + int yMax = yh + m_Font->m_CharHeight; + if( it==m_CustomRecords.end() ) + { + std::pair pr; + pr.first = mProxy->m_StructProxy; + pr.second.m_IndexMin = pr.second.m_IndexMax = mProxy->m_MemberIndex; + pr.second.m_XMin = xMin; + pr.second.m_XMax = xMax; + pr.second.m_YMin = yMin; + pr.second.m_YMax = yMax; + pr.second.m_Y0 = 0; // will be filled by the draw loop below + pr.second.m_Y1 = 0; // will be filled by the draw loop below + pr.second.m_Var = mProxy->m_VarParent; + m_CustomRecords.insert(pr); + } + else + { + it->second.m_IndexMin = min(it->second.m_IndexMin, mProxy->m_MemberIndex); + it->second.m_IndexMax = min(it->second.m_IndexMax, mProxy->m_MemberIndex); + it->second.m_XMin = min(it->second.m_XMin, xMin); + it->second.m_XMax = max(it->second.m_XMax, xMax); + it->second.m_YMin = min(it->second.m_YMin, yMin); + it->second.m_YMax = max(it->second.m_YMax, yMax); + it->second.m_Y0 = 0; + it->second.m_Y1 = 0; + assert( it->second.m_Var==mProxy->m_VarParent ); + } + } + } + + yh += m_Font->m_CharHeight+m_LineSep; + } + + // Draw custom types + for( CustomMap::iterator it = m_CustomRecords.begin(); it!=m_CustomRecords.end(); ++it ) + { + CTwMgr::CStructProxy *sProxy = it->first; + assert( sProxy!=NULL ); + CCustomRecord& r = it->second; + if( sProxy->m_CustomDrawCallback!=NULL ) + { + int y0 = r.m_YMin - max(r.m_IndexMin - sProxy->m_CustomIndexFirst, 0)*(m_Font->m_CharHeight + m_LineSep); + int y1 = y0 + max(sProxy->m_CustomIndexLast - sProxy->m_CustomIndexFirst + 1, 0)*(m_Font->m_CharHeight + m_LineSep) - 2; + if( y0ChangeViewport(r.m_XMin, r.m_YMin, r.m_XMax-r.m_XMin+1, r.m_YMax-r.m_YMin+1, 0, y0-r.m_YMin+1); + sProxy->m_CustomDrawCallback(r.m_XMax-r.m_XMin, y1-y0, sProxy->m_StructExtData, sProxy->m_StructClientData, this, r.m_Var); + Gr->RestoreViewport(); + } + } + } + + if( m_DrawHandles && !m_IsPopupList ) + { + // Draw -/+/o/click/v buttons + if( (m_DrawIncrDecrBtn || m_DrawClickBtn || m_DrawListBtn || m_DrawBoolBtn || m_DrawRotoBtn) && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() ) + { + int y0 = m_PosY + m_VarY0 + m_HighlightedLine*(m_Font->m_CharHeight+m_LineSep); + if( m_DrawIncrDecrBtn ) + { + bool IsMin = false; + bool IsMax = false; + if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + const CTwVarAtom *Atom = static_cast(m_HierTags[m_HighlightedLine].m_Var); + double v, vmin, vmax; + v = Atom->ValueToDouble(); + Atom->MinMaxStepToDouble(&vmin, &vmax, NULL); + IsMax = (v>=vmax); + IsMin = (v<=vmin); + } + + /* + Gr->DrawRect(m_PosX+m_VarX2-2*bw+1, y0+1, m_PosX+m_VarX2-bw-1, y0+m_Font->m_CharHeight-2, (m_HighlightDecrBtn && !IsMin)?m_ColHighBtn:m_ColBtn); + Gr->DrawRect(m_PosX+m_VarX2-bw+1, y0+1, m_PosX+m_VarX2-1, y0+m_Font->m_CharHeight-2, (m_HighlightIncrBtn && !IsMax)?m_ColHighBtn:m_ColBtn); + // [-] + Gr->DrawLine(m_PosX+m_VarX2-2*bw+3+(bw>8?1:0), y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-bw-2-(bw>8?1:0), y0+m_Font->m_CharHeight/2, IsMin?m_ColValTextRO:m_ColTitleText); + // [+] + Gr->DrawLine(m_PosX+m_VarX2-bw+3, y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-2, y0+m_Font->m_CharHeight/2, IsMax?m_ColValTextRO:m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX2-bw/2, y0+m_Font->m_CharHeight/2-bw/2+2, m_PosX+m_VarX2-bw/2, y0+m_Font->m_CharHeight/2+bw/2-1, IsMax?m_ColValTextRO:m_ColTitleText); + */ + Gr->DrawRect(m_PosX+m_VarX2-3*bw+1, y0+1, m_PosX+m_VarX2-2*bw-1, y0+m_Font->m_CharHeight-2, (m_HighlightDecrBtn && !IsMin)?m_ColHighBtn:m_ColBtn); + Gr->DrawRect(m_PosX+m_VarX2-2*bw+1, y0+1, m_PosX+m_VarX2-bw-1, y0+m_Font->m_CharHeight-2, (m_HighlightIncrBtn && !IsMax)?m_ColHighBtn:m_ColBtn); + // [-] + Gr->DrawLine(m_PosX+m_VarX2-3*bw+3+(bw>8?1:0), y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-2*bw-2-(bw>8?1:0), y0+m_Font->m_CharHeight/2, IsMin?m_ColValTextRO:m_ColTitleText); + // [+] + Gr->DrawLine(m_PosX+m_VarX2-2*bw+3, y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-bw-2, y0+m_Font->m_CharHeight/2, IsMax?m_ColValTextRO:m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX2-bw-bw/2, y0+m_Font->m_CharHeight/2-bw/2+2, m_PosX+m_VarX2-bw-bw/2, y0+m_Font->m_CharHeight/2+bw/2-1, IsMax?m_ColValTextRO:m_ColTitleText); + } + else if( m_DrawListBtn ) + { + // [v] + int eps = 1; + int dx = -1; + Gr->DrawRect(m_PosX+m_VarX2-bw+1, y0+1, m_PosX+m_VarX2-1, y0+m_Font->m_CharHeight-2, m_HighlightListBtn?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(m_PosX+m_VarX2-bw+4+dx, y0+m_Font->m_CharHeight/2-eps, m_PosX+m_VarX2-bw/2+1+dx, y0+m_Font->m_CharHeight-4, m_ColTitleText, true); + Gr->DrawLine(m_PosX+m_VarX2-bw/2+1+dx, y0+m_Font->m_CharHeight-4, m_PosX+m_VarX2-2+dx, y0+m_Font->m_CharHeight/2-1, m_ColTitleText, true); + } + else if( m_DrawBoolBtn ) + { + Gr->DrawRect(m_PosX+m_VarX2-bw+1, y0+1, m_PosX+m_VarX2-1, y0+m_Font->m_CharHeight-2, m_HighlightBoolBtn?m_ColHighBtn:m_ColBtn); + // [x] + //Gr->DrawLine(m_PosX+m_VarX2-bw/2-bw/6, y0+m_Font->m_CharHeight/2-bw/6, m_PosX+m_VarX2-bw/2+bw/6, y0+m_Font->m_CharHeight/2+bw/6, m_ColTitleText, true); + //Gr->DrawLine(m_PosX+m_VarX2-bw/2-bw/6, y0+m_Font->m_CharHeight/2+bw/6, m_PosX+m_VarX2-bw/2+bw/6, y0+m_Font->m_CharHeight/2-bw/6, m_ColTitleText, true); + // [<>] + int s = bw/4; + int eps = 1; + Gr->DrawLine(m_PosX+m_VarX2-bw/2-1, y0+m_Font->m_CharHeight/2-s, m_PosX+m_VarX2-bw/2-s-1, y0+m_Font->m_CharHeight/2, m_ColTitleText, true); + Gr->DrawLine(m_PosX+m_VarX2-bw/2-s-1, y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-bw/2-eps, y0+m_Font->m_CharHeight/2+s+1-eps, m_ColTitleText, true); + //Gr->DrawLine(m_PosX+m_VarX2-bw/2+1, y0+m_Font->m_CharHeight/2+s, m_PosX+m_VarX2-bw/2+s+1, y0+m_Font->m_CharHeight/2, m_ColTitleText, true); + //Gr->DrawLine(m_PosX+m_VarX2-bw/2+s+1, y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-bw/2+1, y0+m_Font->m_CharHeight/2-s, m_ColTitleText, true); + Gr->DrawLine(m_PosX+m_VarX2-bw/2+2, y0+m_Font->m_CharHeight/2-s, m_PosX+m_VarX2-bw/2+s+2, y0+m_Font->m_CharHeight/2, m_ColTitleText, true); + Gr->DrawLine(m_PosX+m_VarX2-bw/2+s+2, y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-bw/2+1+eps, y0+m_Font->m_CharHeight/2+s+1-eps, m_ColTitleText, true); + } + + if( m_DrawRotoBtn ) + { + // [o] rotoslider button + /* + Gr->DrawRect(m_PosX+m_VarX1-bw-1, y0+1, m_PosX+m_VarX1-3, y0+m_Font->m_CharHeight-2, m_HighlightRotoBtn?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(m_PosX+m_VarX1-bw+bw/2-2, y0+m_Font->m_CharHeight/2-1, m_PosX+m_VarX1-bw+bw/2-1, y0+m_Font->m_CharHeight/2-1, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX1-bw+bw/2-3, y0+m_Font->m_CharHeight/2+0, m_PosX+m_VarX1-bw+bw/2+0, y0+m_Font->m_CharHeight/2+0, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX1-bw+bw/2-3, y0+m_Font->m_CharHeight/2+1, m_PosX+m_VarX1-bw+bw/2+0, y0+m_Font->m_CharHeight/2+1, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX1-bw+bw/2-2, y0+m_Font->m_CharHeight/2+2, m_PosX+m_VarX1-bw+bw/2-1, y0+m_Font->m_CharHeight/2+2, m_ColTitleText); + */ + /* + Gr->DrawRect(m_PosX+m_VarX2-3*bw+1, y0+1, m_PosX+m_VarX2-2*bw-1, y0+m_Font->m_CharHeight-2, m_HighlightRotoBtn?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(m_PosX+m_VarX2-3*bw+bw/2+0, y0+m_Font->m_CharHeight/2-1, m_PosX+m_VarX2-3*bw+bw/2+1, y0+m_Font->m_CharHeight/2-1, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX2-3*bw+bw/2-1, y0+m_Font->m_CharHeight/2+0, m_PosX+m_VarX2-3*bw+bw/2+2, y0+m_Font->m_CharHeight/2+0, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX2-3*bw+bw/2-1, y0+m_Font->m_CharHeight/2+1, m_PosX+m_VarX2-3*bw+bw/2+2, y0+m_Font->m_CharHeight/2+1, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX2-3*bw+bw/2+0, y0+m_Font->m_CharHeight/2+2, m_PosX+m_VarX2-3*bw+bw/2+1, y0+m_Font->m_CharHeight/2+2, m_ColTitleText); + */ + int dy = 0; + Gr->DrawRect(m_PosX+m_VarX2-bw+1, y0+1, m_PosX+m_VarX2-1, y0+m_Font->m_CharHeight-2, m_HighlightRotoBtn?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(m_PosX+m_VarX2-bw+bw/2+0, y0+m_Font->m_CharHeight/2-1+dy, m_PosX+m_VarX2-bw+bw/2+1, y0+m_Font->m_CharHeight/2-1+dy, m_ColTitleText, true); + Gr->DrawLine(m_PosX+m_VarX2-bw+bw/2-1, y0+m_Font->m_CharHeight/2+0+dy, m_PosX+m_VarX2-bw+bw/2+2, y0+m_Font->m_CharHeight/2+0+dy, m_ColTitleText, true); + Gr->DrawLine(m_PosX+m_VarX2-bw+bw/2-1, y0+m_Font->m_CharHeight/2+1+dy, m_PosX+m_VarX2-bw+bw/2+2, y0+m_Font->m_CharHeight/2+1+dy, m_ColTitleText, true); + Gr->DrawLine(m_PosX+m_VarX2-bw+bw/2+0, y0+m_Font->m_CharHeight/2+2+dy, m_PosX+m_VarX2-bw+bw/2+1, y0+m_Font->m_CharHeight/2+2+dy, m_ColTitleText, true); + } + } + + + // Draw value width slider + if( !m_HighlightValWidth ) + { + color32 col = m_DarkText ? COLOR32_WHITE : m_ColTitleText; + Gr->DrawRect(m_PosX+m_VarX1-2, m_PosY+m_VarY0-8, m_PosX+m_VarX1-1, m_PosY+m_VarY0-4, col); + Gr->DrawLine(m_PosX+m_VarX1-1, m_PosY+m_VarY0-3, m_PosX+m_VarX1, m_PosY+m_VarY0-3, m_ColLineShadow); + Gr->DrawLine(m_PosX+m_VarX1, m_PosY+m_VarY0-3, m_PosX+m_VarX1, m_PosY+m_VarY0-8, m_ColLineShadow); + } + else + { + color32 col = m_DarkText ? COLOR32_WHITE : m_ColTitleText; + Gr->DrawRect(m_PosX+m_VarX1-2, m_PosY+m_VarY0-8, m_PosX+m_VarX1-1, m_PosY+m_VarY1, col); + Gr->DrawLine(m_PosX+m_VarX1-1, m_PosY+m_VarY1+1, m_PosX+m_VarX1, m_PosY+m_VarY1+1, m_ColLineShadow); + Gr->DrawLine(m_PosX+m_VarX1, m_PosY+m_VarY1+1, m_PosX+m_VarX1, m_PosY+m_VarY0-8, m_ColLineShadow); + } + + // Draw labels & values headers + if (m_HighlightLabelsHeader) + { + Gr->DrawRect(m_PosX+m_VarX0, m_PosY+m_Font->m_CharHeight+2, m_PosX+m_VarX1-4, m_PosY+m_VarY0-1, m_ColHighBg0, m_ColHighBg0, m_ColHighBg1, m_ColHighBg1); + } + if (m_HighlightValuesHeader) + { + Gr->DrawRect(m_PosX+m_VarX1+2, m_PosY+m_Font->m_CharHeight+2, m_PosX+m_VarX2, m_PosY+m_VarY0-1, m_ColHighBg0, m_ColHighBg0, m_ColHighBg1, m_ColHighBg1); + } + } + + // Draw key shortcut text + if( m_HighlightedLine>=0 && m_HighlightedLine==m_ShortcutLine && !m_IsPopupList && !m_EditInPlace.m_Active ) + { + PERF( Timer.Reset(); ) + Gr->DrawRect(m_PosX+m_Font->m_CharHeight-2, m_PosY+m_VarY1+1, m_PosX+m_Width-m_Font->m_CharHeight-2, m_PosY+m_VarY1+1+m_Font->m_CharHeight, m_ColShortcutBg); + Gr->DrawText(m_ShortcutTextObj, m_PosX+m_Font->m_CharHeight, m_PosY+m_VarY1+1, m_ColShortcutText, 0); + PERF( DT = Timer.GetTime(); printf("Shortcut=%.4fms ", 1000.0*DT); ) + } + else if( (m_HighlightLabelsHeader || m_HighlightValuesHeader) && !m_IsPopupList && !m_EditInPlace.m_Active ) + { + Gr->DrawRect(m_PosX+m_Font->m_CharHeight-2, m_PosY+m_VarY1+1, m_PosX+m_Width-m_Font->m_CharHeight-2, m_PosY+m_VarY1+1+m_Font->m_CharHeight, m_ColShortcutBg); + Gr->DrawText(m_HeadersTextObj, m_PosX+m_Font->m_CharHeight, m_PosY+m_VarY1+1, m_ColShortcutText, 0); + } + else if( m_IsHelpBar ) + { + if( g_TwMgr->m_KeyPressedTextObj && g_TwMgr->m_KeyPressedStr.size()>0 ) // Draw key pressed + { + if( g_TwMgr->m_KeyPressedBuildText ) + { + string Str = g_TwMgr->m_KeyPressedStr; + ClampText(Str, m_Font, m_Width-2*m_Font->m_CharHeight); + g_TwMgr->m_Graph->BuildText(g_TwMgr->m_KeyPressedTextObj, &Str, NULL, NULL, 1, g_TwMgr->m_HelpBar->m_Font, 0, 0); + g_TwMgr->m_KeyPressedBuildText = false; + g_TwMgr->m_KeyPressedTime = (float)g_BarTimer.GetTime(); + } + if( (float)g_BarTimer.GetTime()>g_TwMgr->m_KeyPressedTime+1.0f ) // draw key pressed at least 1 second + g_TwMgr->m_KeyPressedStr = ""; + PERF( Timer.Reset(); ) + Gr->DrawRect(m_PosX+m_Font->m_CharHeight-2, m_PosY+m_VarY1+1, m_PosX+m_Width-m_Font->m_CharHeight-2, m_PosY+m_VarY1+1+m_Font->m_CharHeight, m_ColShortcutBg); + Gr->DrawText(g_TwMgr->m_KeyPressedTextObj, m_PosX+m_Font->m_CharHeight, m_PosY+m_VarY1+1, m_ColShortcutText, 0); + PERF( DT = Timer.GetTime(); printf("KeyPressed=%.4fms ", 1000.0*DT); ) + } + else + { + if( g_TwMgr->m_InfoBuildText ) + { + string Info = "atb "; + char Ver[64]; + sprintf(Ver, " %d.%02d", TW_VERSION/100, TW_VERSION%100); + Info += Ver; + ClampText(Info, m_Font, m_Width-2*m_Font->m_CharHeight); + g_TwMgr->m_Graph->BuildText(g_TwMgr->m_InfoTextObj, &Info, NULL, NULL, 1, g_TwMgr->m_HelpBar->m_Font, 0, 0); + g_TwMgr->m_InfoBuildText = false; + } + PERF( Timer.Reset(); ) + Gr->DrawRect(m_PosX+m_Font->m_CharHeight-2, m_PosY+m_VarY1+1, m_PosX+m_Width-m_Font->m_CharHeight-2, m_PosY+m_VarY1+1+m_Font->m_CharHeight, m_ColShortcutBg); + Gr->DrawText(g_TwMgr->m_InfoTextObj, m_PosX+m_Font->m_CharHeight, m_PosY+m_VarY1+1, m_ColInfoText, 0); + PERF( DT = Timer.GetTime(); printf("Info=%.4fms ", 1000.0*DT); ) + } + } + + if( !m_IsPopupList ) + { + // Draw RotoSlider + RotoDraw(); + + // Draw EditInPlace + EditInPlaceDraw(); + } + + if( g_TwMgr->m_PopupBar!=NULL && this!=g_TwMgr->m_PopupBar ) + { + // darken bar if a popup bar is displayed + Gr->DrawRect(m_PosX, m_PosY, m_PosX+m_Width-1, m_PosY+m_Height-1, 0x1F000000); + } + } + } + else // minimized + { + int vpx, vpy, vpw, vph; + vpx = 0; + vpy = 0; + vpw = g_TwMgr->m_WndWidth; + vph = g_TwMgr->m_WndHeight; + if( g_TwMgr->m_IconMarginX>0 ) + { + vpx = min(g_TwMgr->m_IconMarginX, vpw/3); + vpw -= 2 * vpx; + } + if( g_TwMgr->m_IconMarginY>0 ) + { + vpy = min(g_TwMgr->m_IconMarginY, vph/3); + vph -= 2 * vpy; + } + + int MinXOffset = 0, MinYOffset = 0; + if( g_TwMgr->m_IconPos==3 ) // top-right + { + if( g_TwMgr->m_IconAlign==1 ) // horizontal + { + int n = max(1, vpw/m_Font->m_CharHeight-1); + m_MinPosX = vpx + vpw-((m_MinNumber%n)+1)*m_Font->m_CharHeight; + m_MinPosY = vpy + (m_MinNumber/n)*m_Font->m_CharHeight; + MinYOffset = m_Font->m_CharHeight; + MinXOffset = -m_TitleWidth; + } + else // vertical + { + int n = max(1, vph/m_Font->m_CharHeight-1); + m_MinPosY = vpy + (m_MinNumber%n)*m_Font->m_CharHeight; + m_MinPosX = vpx + vpw-((m_MinNumber/n)+1)*m_Font->m_CharHeight; + MinXOffset = -m_TitleWidth-m_Font->m_CharHeight; + } + } + else if( g_TwMgr->m_IconPos==2 ) // top-left + { + if( g_TwMgr->m_IconAlign==1 ) // horizontal + { + int n = max(1, vpw/m_Font->m_CharHeight-1); + m_MinPosX = vpx + (m_MinNumber%n)*m_Font->m_CharHeight; + m_MinPosY = vpy + (m_MinNumber/n)*m_Font->m_CharHeight; + MinYOffset = m_Font->m_CharHeight; + } + else // vertical + { + int n = max(1, vph/m_Font->m_CharHeight-1); + m_MinPosY = vpy + (m_MinNumber%n)*m_Font->m_CharHeight; + m_MinPosX = vpx + (m_MinNumber/n)*m_Font->m_CharHeight; + MinXOffset = m_Font->m_CharHeight; + } + } + else if( g_TwMgr->m_IconPos==1 ) // bottom-right + { + if( g_TwMgr->m_IconAlign==1 ) // horizontal + { + int n = max(1, vpw/m_Font->m_CharHeight-1); + m_MinPosX = vpx + vpw-((m_MinNumber%n)+1)*m_Font->m_CharHeight; + m_MinPosY = vpy + vph-((m_MinNumber/n)+1)*m_Font->m_CharHeight; + MinYOffset = -m_Font->m_CharHeight; + MinXOffset = -m_TitleWidth; + } + else // vertical + { + int n = max(1, vph/m_Font->m_CharHeight-1); + m_MinPosY = vpy + vph-((m_MinNumber%n)+1)*m_Font->m_CharHeight; + m_MinPosX = vpx + vpw-((m_MinNumber/n)+1)*m_Font->m_CharHeight; + MinXOffset = -m_TitleWidth-m_Font->m_CharHeight; + } + } + else // bottom-left + { + if( g_TwMgr->m_IconAlign==1 ) // horizontal + { + int n = max(1, vpw/m_Font->m_CharHeight-1); + m_MinPosX = vpx + (m_MinNumber%n)*m_Font->m_CharHeight; + m_MinPosY = vpy + vph-((m_MinNumber/n)+1)*m_Font->m_CharHeight; + MinYOffset = -m_Font->m_CharHeight; + } + else // vertical + { + int n = max(1, vph/m_Font->m_CharHeight-1); + m_MinPosY = vpy + vph-((m_MinNumber%n)+1)*m_Font->m_CharHeight; + m_MinPosX = vpx + (m_MinNumber/n)*m_Font->m_CharHeight; + MinXOffset = m_Font->m_CharHeight; + } + } + + if( m_HighlightMaximize ) + { + // Draw title + if( _DrawPart&DRAW_BG ) + { + Gr->DrawRect(m_MinPosX, m_MinPosY, m_MinPosX+m_Font->m_CharHeight, m_MinPosY+m_Font->m_CharHeight, m_ColTitleUnactiveBg); + Gr->DrawRect(m_MinPosX+MinXOffset, m_MinPosY+MinYOffset, m_MinPosX+MinXOffset+m_TitleWidth+m_Font->m_CharHeight, m_MinPosY+MinYOffset+m_Font->m_CharHeight, m_ColTitleUnactiveBg); + } + if( _DrawPart&DRAW_CONTENT ) + { + if( m_ColTitleShadow!=0 ) + Gr->DrawText(m_TitleTextObj, m_MinPosX+MinXOffset+m_Font->m_CharHeight/2, m_MinPosY+1+MinYOffset, m_ColTitleShadow, 0); + Gr->DrawText(m_TitleTextObj, m_MinPosX+MinXOffset+m_Font->m_CharHeight/2, m_MinPosY+MinYOffset, m_ColTitleText, 0); + } + } + + if( !m_IsHelpBar ) + { + // Draw maximize button + int xm = m_MinPosX+2, wm=m_Font->m_CharHeight-6; + wm = (wm<6) ? 6 : wm; + if( _DrawPart&DRAW_BG ) + Gr->DrawRect(xm+1, m_MinPosY+4, xm+wm-1, m_MinPosY+3+wm, m_HighlightMaximize?m_ColHighBtn:m_ColBtn); + if( _DrawPart&DRAW_CONTENT ) + { + Gr->DrawLine(xm, m_MinPosY+3, xm+wm, m_MinPosY+3, m_ColLine); + Gr->DrawLine(xm+wm, m_MinPosY+3, xm+wm, m_MinPosY+3+wm, m_ColLine); + Gr->DrawLine(xm+wm, m_MinPosY+3+wm, xm, m_MinPosY+3+wm, m_ColLine); + Gr->DrawLine(xm, m_MinPosY+3+wm, xm, m_MinPosY+3, m_ColLine); + Gr->DrawLine(xm+wm+1, m_MinPosY+4, xm+wm+1, m_MinPosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm+1, m_MinPosY+4+wm, xm, m_MinPosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm/3-1, m_MinPosY+3+wm-wm/3, xm+wm/2, m_MinPosY+6, m_ColTitleText, true); + Gr->DrawLine(xm+wm-wm/3+1, m_MinPosY+3+wm-wm/3, xm+wm/2, m_MinPosY+6, m_ColTitleText, true); + } + } + else + { + // Draw help button + int xm = m_MinPosX+2, wm=m_Font->m_CharHeight-6; + wm = (wm<6) ? 6 : wm; + if( _DrawPart&DRAW_BG ) + Gr->DrawRect(xm+1, m_MinPosY+4, xm+wm-1, m_MinPosY+3+wm, m_HighlightMaximize?m_ColHighBtn:m_ColBtn); + if( _DrawPart&DRAW_CONTENT ) + { + Gr->DrawLine(xm, m_MinPosY+3, xm+wm, m_MinPosY+3, m_ColLine); + Gr->DrawLine(xm+wm, m_MinPosY+3, xm+wm, m_MinPosY+3+wm, m_ColLine); + Gr->DrawLine(xm+wm, m_MinPosY+3+wm, xm, m_MinPosY+3+wm, m_ColLine); + Gr->DrawLine(xm, m_MinPosY+3+wm, xm, m_MinPosY+3, m_ColLine); + Gr->DrawLine(xm+wm+1, m_MinPosY+4, xm+wm+1, m_MinPosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm+1, m_MinPosY+4+wm, xm, m_MinPosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm/2-wm/6, m_MinPosY+3+wm/4, xm+wm-wm/3, m_MinPosY+3+wm/4, m_ColTitleText); + Gr->DrawLine(xm+wm-wm/3, m_MinPosY+3+wm/4, xm+wm-wm/3, m_MinPosY+3+wm/2, m_ColTitleText); + Gr->DrawLine(xm+wm-wm/3, m_MinPosY+3+wm/2, xm+wm/2, m_MinPosY+3+wm/2, m_ColTitleText); + Gr->DrawLine(xm+wm/2, m_MinPosY+3+wm/2, xm+wm/2, m_MinPosY+3+wm-wm/4, m_ColTitleText); + Gr->DrawLine(xm+wm/2, m_MinPosY+3+wm-wm/4+1, xm+wm/2, m_MinPosY+3+wm-wm/4+2, m_ColTitleText); + } + } + } +} + +// --------------------------------------------------------------------------- + +bool CTwBar::MouseMotion(int _X, int _Y) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + if( !m_UpToDate ) + Update(); + + bool Handled = false; + bool CustomArea = false; + if( !m_IsMinimized ) + { + bool InBar = (_X>=m_PosX && _X=m_PosY && _Ym_Bars.size(); ++ib ) + if( g_TwMgr->m_Bars[ib]!=NULL ) + { + g_TwMgr->m_Bars[ib]->m_DrawHandles = false; + g_TwMgr->m_Bars[ib]->m_HighlightTitle = false; + } + m_DrawHandles = InBar; + const int ContainedMargin = 32; + + if( !m_MouseDrag ) + { + Handled = InBar; + m_HighlightedLine = -1; + m_HighlightIncrBtn = false; + m_HighlightDecrBtn = false; + m_HighlightRotoBtn = false; + if( abs(m_MouseOriginX-_X)>6 || abs(m_MouseOriginY-_Y)>6 ) + m_HighlightClickBtn = false; + m_HighlightListBtn = false; + m_HighlightTitle = false; + m_HighlightScroll = false; + m_HighlightUpScroll = false; + m_HighlightDnScroll = false; + m_HighlightMinimize = false; + m_HighlightFont = false; + m_HighlightValWidth = false; + m_HighlightLabelsHeader = false; + m_HighlightValuesHeader = false; + //if( InBar && _X>m_PosX+m_Font->m_CharHeight+1 && _X=m_PosY+m_VarY0 && _Ym_PosX+2 && _X=m_PosY+m_VarY0 && _Ym_CharHeight+m_LineSep); + if( m_HighlightedLine>=(int)m_HierTags.size() ) + m_HighlightedLine = -1; + else if(m_HighlightedLine>=0) + m_HighlightedLineLastValid = m_HighlightedLine; + if( m_HighlightedLine<0 || m_HierTags[m_HighlightedLine].m_Var==NULL || m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + ANT_SET_CURSOR(Arrow); + else + { + if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider ) + { + if( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly && !m_IsHelpBar + && !(static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BUTTON && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Val.m_Button.m_Callback==NULL) ) + ANT_SET_CURSOR(No); //(Arrow); + else + { + ANT_SET_CURSOR(Arrow); + CustomArea = true; + } + + if( m_DrawListBtn ) + { + m_HighlightListBtn = true; + CustomArea = false; + } + if( m_DrawBoolBtn ) + { + m_HighlightBoolBtn = true; + CustomArea = false; + } + } + else if( m_DrawRotoBtn && ( _X>=m_PosX+m_VarX2-IncrBtnWidth(m_Font->m_CharHeight) || _X=m_PosX+m_VarX2-2*IncrBtnWidth(m_Font->m_CharHeight) ) // [+] button + { + m_HighlightIncrBtn = true; + ANT_SET_CURSOR(Arrow); + } + else if( m_DrawIncrDecrBtn && _X>=m_PosX+m_VarX2-3*IncrBtnWidth(m_Font->m_CharHeight) ) // [-] button + { + m_HighlightDecrBtn = true; + ANT_SET_CURSOR(Arrow); + } + else if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ) + { + if( !m_IsHelpBar ) + ANT_SET_CURSOR(No); + else + ANT_SET_CURSOR(Arrow); + } + else + //ANT_SET_CURSOR(Point); + ANT_SET_CURSOR(IBeam); + } + } + else if( InBar && m_Movable && !m_IsPopupList && _X>=m_PosX+2*m_Font->m_CharHeight && _Xm_CharHeight && _Ym_CharHeight ) + { // mouse over title + m_HighlightTitle = true; + ANT_SET_CURSOR(Move); + } + else if ( InBar && !m_IsPopupList && _X>=m_PosX+m_VarX1-5 && _Xm_PosY+m_Font->m_CharHeight && _Y=m_PosX+m_VarX0 && _Xm_PosY+m_Font->m_CharHeight && _Y=m_PosX+m_VarX1+5 && _Xm_PosY+m_Font->m_CharHeight && _Y=m_PosX && _Xm_CharHeight && _Y>=m_ScrollY0 && _Y=m_PosX+m_VarX2+2 && _X=m_ScrollY0 && _Y=m_PosX+m_VarX2+2 && _X=m_PosY+m_VarY0 && _Y=m_PosX+m_VarX2+2 && _X=m_ScrollY1 && _Y=m_PosX && _Xm_CharHeight && _Y>=m_PosY && _Ym_CharHeight ) + ANT_SET_CURSOR(TopLeft); + else if( InBar && !m_IsPopupList && _X>=m_PosX && _Xm_CharHeight && _Y>=m_PosY+m_Height-m_Font->m_CharHeight && _Y=m_PosX+m_Width-m_Font->m_CharHeight && _X=m_PosY && _Ym_CharHeight ) + ANT_SET_CURSOR(TopRight); + else if( InBar && m_Resizable && !m_IsPopupList && _X>=m_PosX+m_Width-m_Font->m_CharHeight && _X=m_PosY+m_Height-m_Font->m_CharHeight && _Ym_FontResizable && !m_IsPopupList && _X>=m_PosX+m_Font->m_CharHeight && _Xm_CharHeight && _Ym_CharHeight ) + { + m_HighlightFont = true; + ANT_SET_CURSOR(Arrow); + } + else if( InBar && m_Iconifiable && !m_IsPopupList && _X>=m_PosX+m_Width-2*m_Font->m_CharHeight && _Xm_CharHeight && _Ym_CharHeight ) + { + m_HighlightMinimize = true; + ANT_SET_CURSOR(Arrow); + } + else if( m_IsHelpBar && InBar && _X>=m_PosX+m_VarX0 && _Xm_CharHeight && _Y>m_PosY+m_Height-m_Font->m_CharHeight && _Y=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + /* + CTwVarAtom *Var = static_cast(m_HierTags[m_HighlightedLine].m_Var); + int Delta = _X-m_MouseOriginX; + if( Delta!=0 ) + { + if( !Var->m_NoSlider && !Var->m_ReadOnly ) + { + Var->Increment(Delta); + NotUpToDate(); + } + m_VarHasBeenIncr = true; + } + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + if( !Var->m_NoSlider && !Var->m_ReadOnly ) + ANT_SET_CURSOR(Center); + //ANT_SET_CURSOR(WE); + else + ANT_SET_CURSOR(Arrow); + Handled = true; + */ + + // move rotoslider + if( !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider ) + RotoOnMouseMove(_X, _Y); + + if( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ) + ANT_SET_CURSOR(No); + else if( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider ) + { + ANT_SET_CURSOR(Arrow); + CustomArea = true; + } + m_VarHasBeenIncr = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragTitle ) + { + int y = m_PosY; + m_PosX += _X-m_MouseOriginX; + m_PosY += _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + int vpx, vpy, vpw, vph; + vpx = 0; + vpy = 0; + vpw = g_TwMgr->m_WndWidth; + vph = g_TwMgr->m_WndHeight; + if( m_Contained ) + { + if( m_PosX+m_Width>vpx+vpw ) + m_PosX = vpx+vpw-m_Width; + if( m_PosXvpy+vph ) + m_PosY = vpy+vph-m_Height; + if( m_PosYvpx+vpw ) + m_PosX = vpx+vpw-ContainedMargin; + if( m_PosX+m_Widthvpy+vph ) + m_PosY = vpy+vph-ContainedMargin; + if( m_PosY+m_Heightm_HelpBarNotUpToDate = true; + ANT_SET_CURSOR(WE); + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragScroll ) + { + if( m_ScrollYH>0 ) + { + int dl = ((_Y-m_MouseOriginY)*m_NbHierLines)/m_ScrollYH; + if( m_FirstLine0+dl<0 ) + m_FirstLine = 0; + else if( m_FirstLine0+dl+m_NbDisplayedLines>m_NbHierLines ) + m_FirstLine = m_NbHierLines-m_NbDisplayedLines; + else + m_FirstLine = m_FirstLine0+dl; + NotUpToDate(); + } + #ifdef ANT_WINDOWS + ANT_SET_CURSOR(NS); + #else + ANT_SET_CURSOR(Arrow); + #endif + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragResizeUL ) + { + int w = m_Width; + int h = m_Height; + m_PosX += _X-m_MouseOriginX; + m_PosY += _Y-m_MouseOriginY; + m_Width -= _X-m_MouseOriginX; + m_Height -= _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + int vpx = 0, vpy = 0, vpw = g_TwMgr->m_WndWidth, vph = g_TwMgr->m_WndHeight; + if( !m_Contained ) + { + if( m_PosX+ContainedMargin>vpx+vpw ) + m_PosX = vpx+vpw-ContainedMargin; + if( m_PosX+m_Widthvpy+vph ) + m_PosY = vpy+vph-ContainedMargin; + if( m_PosY+m_Height 0) + m_ValuesWidth = int(m_ValuesWidthRatio * m_Width + 0.5); + ANT_SET_CURSOR(TopLeft); + NotUpToDate(); + if( m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_HelpBarUpdateNow = true; + } + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragResizeUR ) + { + int h = m_Height; + m_PosY += _Y-m_MouseOriginY; + m_Width += _X-m_MouseOriginX; + m_Height -= _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + int vpx = 0, vpy = 0, vpw = g_TwMgr->m_WndWidth, vph = g_TwMgr->m_WndHeight; + if( !m_Contained ) + { + if( m_PosX+ContainedMargin>vpx+vpw ) + m_PosX = vpx+vpw-ContainedMargin; + if( m_PosX+m_Widthvpy+vph ) + m_PosY = vpy+vph-ContainedMargin; + if( m_PosY+m_Heightvpx+vpw ) + m_Width = vpx+vpw-m_PosX; + if( m_PosY 0) + m_ValuesWidth = int(m_ValuesWidthRatio * m_Width + 0.5); + ANT_SET_CURSOR(TopRight); + NotUpToDate(); + if( m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_HelpBarUpdateNow = true; + } + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragResizeLL ) + { + int w = m_Width; + m_PosX += _X-m_MouseOriginX; + m_Width -= _X-m_MouseOriginX; + m_Height += _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + int vpx = 0, vpy = 0, vpw = g_TwMgr->m_WndWidth, vph = g_TwMgr->m_WndHeight; + if( !m_Contained ) + { + if( m_PosX+ContainedMargin>vpx+vpw ) + m_PosX = vpx+vpw-ContainedMargin; + if( m_PosX+m_Widthvpy+vph ) + m_PosY = vpy+vph-ContainedMargin; + if( m_PosY+m_Heightvpy+vph ) + m_Height = vpy+vph-m_PosY; + if( m_PosX 0) + m_ValuesWidth = int(m_ValuesWidthRatio * m_Width + 0.5); + ANT_SET_CURSOR(BottomLeft); + NotUpToDate(); + if( m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_HelpBarUpdateNow = true; + } + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragResizeLR ) + { + m_Width += _X-m_MouseOriginX; + m_Height += _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + int vpx = 0, vpy = 0, vpw = g_TwMgr->m_WndWidth, vph = g_TwMgr->m_WndHeight; + if( !m_Contained ) + { + if( m_PosX+ContainedMargin>vpx+vpw ) + m_PosX = vpx+vpw-ContainedMargin; + if( m_PosX+m_Widthvpy+vph ) + m_PosY = vpy+vph-ContainedMargin; + if( m_PosY+m_Heightvpx+vpw ) + m_Width = vpx+vpw-m_PosX; + if( m_PosY+m_Height>vpy+vph ) + m_Height = vpy+vph-m_PosY; + } + if (m_ValuesWidthRatio > 0) + m_ValuesWidth = int(m_ValuesWidthRatio * m_Width + 0.5); + ANT_SET_CURSOR(BottomRight); + NotUpToDate(); + if( m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_HelpBarUpdateNow = true; + } + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_EditInPlace.m_Active ) + { + EditInPlaceMouseMove(_X, _Y, true); + ANT_SET_CURSOR(IBeam); + Handled = true; + } + //else if( InBar ) + // ANT_SET_CURSOR(Arrow); + } + } + else // minimized + { + if( m_Iconifiable && _X>=m_MinPosX+2 && _Xm_CharHeight && _Y>m_MinPosY && _Ym_CharHeight-2 ) + { + m_HighlightMaximize = true; + if( !m_IsHelpBar ) + ANT_SET_CURSOR(Arrow); + else + #ifdef ANT_WINDOWS + ANT_SET_CURSOR(Help); + #else + ANT_SET_CURSOR(Arrow); + #endif + Handled = true; + } + else + m_HighlightMaximize = false; + } + + // Handled by a custom widget? + CTwMgr::CStructProxy *currentCustomActiveStructProxy = NULL; + if( g_TwMgr!=NULL && (!Handled || CustomArea) && !m_IsMinimized && m_CustomRecords.size()>0 ) + { + bool CustomHandled = false; + for( int s=0; s<2; ++s ) // 2 iterations: first for custom widget having focus, second for others if no focused widget. + for( CustomMap::iterator it=m_CustomRecords.begin(); it!=m_CustomRecords.end(); ++it ) + { + CTwMgr::CStructProxy *sProxy = it->first; + const CCustomRecord& r = it->second; + if( (s==1 || sProxy->m_CustomCaptureFocus) && !CustomHandled && sProxy!=NULL && sProxy->m_CustomMouseMotionCallback!=NULL && r.m_XMin=r.m_Y0 && r.m_YMax<=r.m_Y1 ) + { + if( sProxy->m_CustomCaptureFocus || (_X>=r.m_XMin && _X=r.m_YMin && _Ym_CustomMouseMotionCallback(_X-r.m_XMin, _Y-r.m_Y0, r.m_XMax-r.m_XMin, r.m_Y1-r.m_Y0, sProxy->m_StructExtData, sProxy->m_StructClientData, this, r.m_Var); + currentCustomActiveStructProxy = sProxy; + s = 2; // force s-loop exit + } + } + else if( sProxy!=NULL ) + { + sProxy->m_CustomCaptureFocus = false; // force free focus, just in case. + ANT_SET_CURSOR(Arrow); + } + } + if( CustomHandled ) + Handled = true; + } + // If needed, send a 'MouseLeave' message to previously active custom struct + if( g_TwMgr!=NULL && m_CustomActiveStructProxy!=NULL && m_CustomActiveStructProxy!=currentCustomActiveStructProxy ) + { + bool found = false; + for( list::iterator it=g_TwMgr->m_StructProxies.begin(); it!=g_TwMgr->m_StructProxies.end() && !found; ++it ) + found = (&(*it)==m_CustomActiveStructProxy); + if( found && m_CustomActiveStructProxy->m_CustomMouseLeaveCallback!=NULL ) + m_CustomActiveStructProxy->m_CustomMouseLeaveCallback(m_CustomActiveStructProxy->m_StructExtData, m_CustomActiveStructProxy->m_StructClientData, this); + } + m_CustomActiveStructProxy = currentCustomActiveStructProxy; + + return Handled; +} + +// --------------------------------------------------------------------------- + +#ifdef ANT_WINDOWS +# pragma optimize("", off) +// disable optimizations because the conversion of Enum from unsigned int to double is not always exact if optimized and GraphAPI=DirectX ! +#endif +static void ANT_CALL PopupCallback(void *_ClientData) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr!=NULL && g_TwMgr->m_PopupBar!=NULL ) + { + unsigned int Enum = *(unsigned int *)&_ClientData; + CTwVarAtom *Var = g_TwMgr->m_PopupBar->m_VarEnumLinkedToPopupList; + CTwBar *Bar = g_TwMgr->m_PopupBar->m_BarLinkedToPopupList; + if( Bar!=NULL && Var!=NULL && !Var->m_ReadOnly && IsEnumType(Var->m_Type) ) + { + Var->ValueFromDouble(Enum); + //Bar->UnHighlightLine(); + Bar->HaveFocus(true); + Bar->NotUpToDate(); + } + if( g_TwMgr->m_PopupBar!=NULL ) // check again because it might have been destroyed by an enum callback + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } +} +#ifdef ANT_WINDOWS +# pragma optimize("", on) +#endif + +// --------------------------------------------------------------------------- + +bool CTwBar::MouseButton(ETwMouseButtonID _Button, bool _Pressed, int _X, int _Y) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + bool Handled = false; + if( !m_UpToDate ) + Update(); + bool EditInPlaceActive = false; + bool CustomArea = false; + + if( !m_IsMinimized ) + { + Handled = (_X>=m_PosX && _X=m_PosY && _Y=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var ) + { + bool OnFocus = (m_HighlightedLine==(_Y-m_PosY-m_VarY0)/(m_Font->m_CharHeight+m_LineSep) && Handled); + if( m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + if( _Pressed && !g_TwMgr->m_IsRepeatingMousePressed && OnFocus ) + { + CTwVarGroup *Grp = static_cast(m_HierTags[m_HighlightedLine].m_Var); + Grp->m_Open = !Grp->m_Open; + NotUpToDate(); + ANT_SET_CURSOR(Arrow); + } + } + else if( _Pressed && m_HighlightIncrBtn ) + { + static_cast(m_HierTags[m_HighlightedLine].m_Var)->Increment(1); + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return 1; + NotUpToDate(); + } + else if( _Pressed && m_HighlightDecrBtn ) + { + static_cast(m_HierTags[m_HighlightedLine].m_Var)->Increment(-1); + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return 1; + NotUpToDate(); + } + else if( _Pressed && !m_MouseDrag ) + { + m_MouseDrag = true; + m_MouseDragVar = true; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + m_VarHasBeenIncr = false; + CTwVarAtom * Var = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( !Var->m_NoSlider && !Var->m_ReadOnly && m_HighlightRotoBtn ) + { + // begin rotoslider + if( _X>m_PosX+m_VarX1 && OnFocus ) + RotoOnLButtonDown(m_PosX+m_VarX2-(1*IncrBtnWidth(m_Font->m_CharHeight))/2, _Y); + else + RotoOnLButtonDown(_X, _Y); + m_MouseDrag = true; + m_MouseDragVar = true; + } + else if( (Var->m_Type==TW_TYPE_BOOL8 || Var->m_Type==TW_TYPE_BOOL16 || Var->m_Type==TW_TYPE_BOOL32 || Var->m_Type==TW_TYPE_BOOLCPP) && !Var->m_ReadOnly && OnFocus ) + { + Var->Increment(1); + //m_HighlightClickBtn = true; + m_VarHasBeenIncr = true; + m_MouseDragVar = false; + m_MouseDrag = false; + NotUpToDate(); + } + else if( Var->m_Type==TW_TYPE_BUTTON && !Var->m_ReadOnly ) + { + m_HighlightClickBtn = true; + m_MouseDragVar = false; + m_MouseDrag = false; + } + //else if( (Var->m_Type==TW_TYPE_ENUM8 || Var->m_Type==TW_TYPE_ENUM16 || Var->m_Type==TW_TYPE_ENUM32) && !Var->m_ReadOnly ) + else if( IsEnumType(Var->m_Type) && !Var->m_ReadOnly && !g_TwMgr->m_IsRepeatingMousePressed && OnFocus ) + { + m_MouseDragVar = false; + m_MouseDrag = false; + if( g_TwMgr->m_PopupBar!=NULL ) + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + // popup list + CTwMgr::CEnum& e = g_TwMgr->m_Enums[Var->m_Type-TW_TYPE_ENUM_BASE]; + g_TwMgr->m_PopupBar = TwNewBar("~ Enum Popup ~"); + g_TwMgr->m_PopupBar->m_IsPopupList = true; + g_TwMgr->m_PopupBar->m_Color = m_Color; + g_TwMgr->m_PopupBar->m_DarkText = m_DarkText; + g_TwMgr->m_PopupBar->m_PosX = m_PosX + m_VarX1 - 2; + g_TwMgr->m_PopupBar->m_PosY = m_PosY + m_VarY0 + (m_HighlightedLine+1)*(m_Font->m_CharHeight+m_LineSep); + g_TwMgr->m_PopupBar->m_Width = m_Width - 2*m_Font->m_CharHeight; + g_TwMgr->m_PopupBar->m_LineSep = g_TwMgr->m_PopupBar->m_Sep; + int popHeight0 = (int)e.m_Entries.size()*(m_Font->m_CharHeight+m_Sep) + m_Font->m_CharHeight/2+2; + int popHeight = popHeight0; + if( g_TwMgr->m_PopupBar->m_PosY+popHeight+2 > g_TwMgr->m_WndHeight ) + popHeight = g_TwMgr->m_WndHeight-g_TwMgr->m_PopupBar->m_PosY-2; + if( popHeightm_WndHeight/2 ) + popHeight = min(popHeight0, g_TwMgr->m_WndHeight/2); + if( popHeight<3*(m_Font->m_CharHeight+m_Sep) ) + popHeight = 3*(m_Font->m_CharHeight+m_Sep); + g_TwMgr->m_PopupBar->m_Height = popHeight; + g_TwMgr->m_PopupBar->m_VarEnumLinkedToPopupList = Var; + g_TwMgr->m_PopupBar->m_BarLinkedToPopupList = this; + unsigned int CurrentEnumValue = (unsigned int)((int)Var->ValueToDouble()); + for( CTwMgr::CEnum::CEntries::iterator It=e.m_Entries.begin(); It!=e.m_Entries.end(); ++It ) + { + char ID[64]; + sprintf(ID, "%u", It->first); + //ultoa(It->first, ID, 10); + TwAddButton(g_TwMgr->m_PopupBar, ID, PopupCallback, *(void**)&(It->first), NULL); + CTwVar *Btn = g_TwMgr->m_PopupBar->Find(ID); + if( Btn!=NULL ) + { + Btn->m_Label = It->second.c_str(); + if( It->first==CurrentEnumValue ) + { + Btn->m_ColorPtr = &m_ColValTextNE; + Btn->m_BgColorPtr = &m_ColGrpBg; + } + } + } + g_TwMgr->m_HelpBarNotUpToDate = false; + } + else if( (Var->m_ReadOnly && (Var->m_Type==TW_TYPE_CDSTRING || Var->m_Type==TW_TYPE_CDSTDSTRING || Var->m_Type==TW_TYPE_STDSTRING || IsCSStringType(Var->m_Type)) && EditInPlaceAcceptVar(Var)) + || (!Var->m_ReadOnly && EditInPlaceAcceptVar(Var)) ) + { + int dw = 0; + //if( m_DrawIncrDecrBtn ) + // dw = 2*IncrBtnWidth(m_Font->m_CharHeight); + if( !m_EditInPlace.m_Active || m_EditInPlace.m_Var!=Var ) + { + EditInPlaceStart(Var, m_VarX1, m_VarY0+(m_HighlightedLine)*(m_Font->m_CharHeight+m_LineSep), m_VarX2-m_VarX1-dw-1); + if( EditInPlaceIsReadOnly() ) + EditInPlaceMouseMove(_X, _Y, false); + m_MouseDrag = false; + m_MouseDragVar = false; + } + else + { + EditInPlaceMouseMove(_X, _Y, false); + m_MouseDrag = true; + m_MouseDragVar = false; + } + EditInPlaceActive = m_EditInPlace.m_Active; + if( Var->m_ReadOnly ) + ANT_SET_CURSOR(No); + else + ANT_SET_CURSOR(IBeam); + } + else if( Var->m_ReadOnly ) + ANT_SET_CURSOR(No); + else + { + ANT_SET_CURSOR(Arrow); + CustomArea = true; + } + } + else if ( !_Pressed && m_MouseDragVar ) + { + m_MouseDrag = false; + m_MouseDragVar = false; + if( !Handled ) + m_DrawHandles = false; + Handled = true; + // end rotoslider + RotoOnLButtonUp(_X, _Y); + + /* Incr/decr on right or left click + if( !m_VarHasBeenIncr && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ) + { + if( _Button==TW_MOUSE_LEFT ) + static_cast(m_HierTags[m_HighlightedLine].m_Var)->Increment(-1); + else if( _Button==TW_MOUSE_RIGHT ) + static_cast(m_HierTags[m_HighlightedLine].m_Var)->Increment(1); + NotUpToDate(); + } + */ + + if( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ) + ANT_SET_CURSOR(No); + else + { + ANT_SET_CURSOR(Arrow); + CustomArea = true; + } + } + else if( !_Pressed && m_HighlightClickBtn ) // a button variable is activated + { + m_HighlightClickBtn = false; + m_MouseDragVar = false; + m_MouseDrag = false; + Handled = true; + NotUpToDate(); + if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + CTwVarAtom * Var = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( !Var->m_ReadOnly && Var->m_Type==TW_TYPE_BUTTON && Var->m_Val.m_Button.m_Callback!=NULL ) + { + Var->m_Val.m_Button.m_Callback(Var->m_ClientData); + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return 1; + } + } + } + else if( !_Pressed ) + { + m_MouseDragVar = false; + m_MouseDrag = false; + CustomArea = true; + } + } + else if( _Pressed && !m_MouseDrag && m_Movable && !m_IsPopupList + && ( (_Button==TW_MOUSE_LEFT && _X>=m_PosX+2*m_Font->m_CharHeight && _Xm_CharHeight && _Y>=m_PosY && _Ym_CharHeight) + || (_Button==TW_MOUSE_MIDDLE && _X>=m_PosX && _X=m_PosY && _Y=m_PosX+m_VarX1-3 && _Xm_PosY+m_Font->m_CharHeight && _Y=m_PosX+m_VarX2+2 && _X=m_ScrollY0 && _Y=m_PosX+m_VarX2+2 && _X=m_PosY+m_VarY0 && _Y0 ) + { + --m_FirstLine; + NotUpToDate(); + } + } + else if( _Pressed && _Button==TW_MOUSE_LEFT && _X>=m_PosX+m_VarX2+2 && _X=m_ScrollY1 && _Y=m_PosX && _Xm_CharHeight && _Y>=m_PosY && _Ym_CharHeight ) + { + m_MouseDrag = true; + m_MouseDragResizeUL = true; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + m_ValuesWidthRatio = (m_Width>0) ? (double)m_ValuesWidth/m_Width : 0; + ANT_SET_CURSOR(TopLeft); + } + else if( !_Pressed && m_MouseDragResizeUL ) + { + m_MouseDrag = false; + m_MouseDragResizeUL = false; + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && !m_MouseDrag && m_Resizable && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX+m_Width-m_Font->m_CharHeight && _X=m_PosY && _Ym_CharHeight ) + { + m_MouseDrag = true; + m_MouseDragResizeUR = true; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + m_ValuesWidthRatio = (m_Width>0) ? (double)m_ValuesWidth/m_Width : 0; + ANT_SET_CURSOR(TopRight); + } + else if( !_Pressed && m_MouseDragResizeUR ) + { + m_MouseDrag = false; + m_MouseDragResizeUR = false; + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && !m_MouseDrag && m_Resizable && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX && _Xm_CharHeight && _Y>=m_PosY+m_Height-m_Font->m_CharHeight && _Y0) ? (double)m_ValuesWidth/m_Width : 0; + ANT_SET_CURSOR(BottomLeft); + } + else if( !_Pressed && m_MouseDragResizeLL ) + { + m_MouseDrag = false; + m_MouseDragResizeLL = false; + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && !m_MouseDrag && m_Resizable && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX+m_Width-m_Font->m_CharHeight && _X=m_PosY+m_Height-m_Font->m_CharHeight && _Y0) ? (double)m_ValuesWidth/m_Width : 0; + ANT_SET_CURSOR(BottomRight); + } + else if( !_Pressed && m_MouseDragResizeLR ) + { + m_MouseDrag = false; + m_MouseDragResizeLR = false; + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && !m_IsPopupList && _Button==TW_MOUSE_LEFT && m_HighlightLabelsHeader ) + { + int w = ComputeLabelsWidth(m_Font); + if( wm_CharHeight ) + w = m_Font->m_CharHeight; + m_ValuesWidth = m_VarX2 - m_VarX0 - w; + if( m_ValuesWidthm_CharHeight ) + m_ValuesWidth = m_Font->m_CharHeight; + if( m_ValuesWidth>m_VarX2 - m_VarX0 ) + m_ValuesWidth = max(m_VarX2 - m_VarX0 - m_Font->m_CharHeight, 0); + NotUpToDate(); + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && !m_IsPopupList && _Button==TW_MOUSE_LEFT && m_HighlightValuesHeader ) + { + int w = ComputeValuesWidth(m_Font); + if( w<2*m_Font->m_CharHeight ) + w = 2*m_Font->m_CharHeight; // enough to draw a button + m_ValuesWidth = w; + if( m_ValuesWidth>m_VarX2 - m_VarX0 ) + m_ValuesWidth = max(m_VarX2 - m_VarX0 - m_Font->m_CharHeight, 0); + NotUpToDate(); + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && g_TwMgr->m_FontResizable && !m_IsPopupList && _X>=m_PosX+m_Font->m_CharHeight && _Xm_CharHeight && _Y>m_PosY && _Ym_CharHeight ) + { + // change font + if( _Button==TW_MOUSE_LEFT ) + { + if( m_Font==g_DefaultSmallFont ) + g_TwMgr->SetFont(g_DefaultNormalFont, true); + else if( m_Font==g_DefaultNormalFont ) + g_TwMgr->SetFont(g_DefaultLargeFont, true); + else if( m_Font==g_DefaultLargeFont ) + g_TwMgr->SetFont(g_DefaultSmallFont, true); + else + g_TwMgr->SetFont(g_DefaultNormalFont, true); + } + else if( _Button==TW_MOUSE_RIGHT ) + { + if( m_Font==g_DefaultSmallFont ) + g_TwMgr->SetFont(g_DefaultLargeFont, true); + else if( m_Font==g_DefaultNormalFont ) + g_TwMgr->SetFont(g_DefaultSmallFont, true); + else if( m_Font==g_DefaultLargeFont ) + g_TwMgr->SetFont(g_DefaultNormalFont, true); + else + g_TwMgr->SetFont(g_DefaultNormalFont, true); + } + + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && m_Iconifiable && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX+m_Width-2*m_Font->m_CharHeight && _Xm_CharHeight && _Y>m_PosY && _Ym_CharHeight ) + { + // minimize + g_TwMgr->Minimize(this); + ANT_SET_CURSOR(Arrow); + } + else if( m_IsHelpBar && _Pressed && !g_TwMgr->m_IsRepeatingMousePressed && _X>=m_PosX+m_VarX0 && _Xm_CharHeight && _Y>m_PosY+m_Height-m_Font->m_CharHeight && _Y& null &", browser, WebPage); + if( system(cmd) ) {} // avoiding warn_unused_result + browser = strtok(NULL, ","); // grab the next browser + } + #elif defined ANT_OSX + char cmd[256]; + snprintf(cmd, sizeof(cmd), "open \"%s\" 1>& null &", WebPage); + if( system(cmd) ) {} // avoiding warn_unused_result + #endif + ANT_SET_CURSOR(Hand); + */ + } + else + { + CustomArea = true; + } + } + else // minimized + { + if( _Pressed && m_HighlightMaximize ) + { + m_HighlightMaximize = false; + g_TwMgr->Maximize(this); + ANT_SET_CURSOR(Arrow); + Handled = true; + } + } + + if( g_TwMgr!=NULL ) // Mgr might have been destroyed by the client inside a callback call + if( _Pressed && !EditInPlaceActive && m_EditInPlace.m_Active ) + EditInPlaceEnd(true); + + // Handled by a custom widget? + if( g_TwMgr!=NULL && (!Handled || CustomArea) && !m_IsMinimized && m_CustomRecords.size()>0 ) + { + bool CustomHandled = false; + for( int s=0; s<2; ++s ) // 2 iterations: first for custom widget having focus, second for others if no focused widget. + for( CustomMap::iterator it=m_CustomRecords.begin(); it!=m_CustomRecords.end(); ++it ) + { + CTwMgr::CStructProxy *sProxy = it->first; + const CCustomRecord& r = it->second; + if( (s==1 || sProxy->m_CustomCaptureFocus) && !CustomHandled && sProxy!=NULL && sProxy->m_CustomMouseButtonCallback!=NULL && r.m_XMin=r.m_Y0 && r.m_YMax<=r.m_Y1 ) + { + if( sProxy->m_CustomCaptureFocus || (_X>=r.m_XMin && _X=r.m_YMin && _Ym_CustomCaptureFocus = _Pressed; + CustomHandled = sProxy->m_CustomMouseButtonCallback(_Button, _Pressed, _X-r.m_XMin, _Y-r.m_Y0, r.m_XMax-r.m_XMin, r.m_Y1-r.m_Y0, sProxy->m_StructExtData, sProxy->m_StructClientData, this, r.m_Var); + s = 2; // force s-loop exit + } + } + else if( sProxy!=NULL ) + { + sProxy->m_CustomCaptureFocus = false; // force free focus, just in case. + ANT_SET_CURSOR(Arrow); + } + } + if( CustomHandled ) + Handled = true; + } + + return Handled; +} + + +// --------------------------------------------------------------------------- + +bool CTwBar::MouseWheel(int _Pos, int _PrevPos, int _MouseX, int _MouseY) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + if( !m_UpToDate ) + Update(); + + bool Handled = false; + if( !m_IsMinimized && _MouseX>=m_PosX && _MouseX=m_PosY && _MouseY_PrevPos && m_FirstLine>0 ) + { + --m_FirstLine; + NotUpToDate(); + } + else if( _Pos<_PrevPos && m_FirstLine' ' && _Key<256 ) // don't test SHIFT if _Key is a common key + Mask &= ~TW_KMOD_SHIFT; + + // don't test KMOD_NUM and KMOD_CAPS modifiers coming from SDL + Mask &= ~(0x1000); // 0x1000 is the KMOD_NUM value defined in SDL_keysym.h + Mask &= ~(0x2000); // 0x2000 is the KMOD_CAPS value defined in SDL_keysym.h + + // complete partial modifiers comming from SDL + if( _Modifiers & TW_KMOD_SHIFT ) + _Modifiers |= TW_KMOD_SHIFT; + if( _Modifiers & TW_KMOD_CTRL ) + _Modifiers |= TW_KMOD_CTRL; + if( _Modifiers & TW_KMOD_ALT ) + _Modifiers |= TW_KMOD_ALT; + if( _Modifiers & TW_KMOD_META ) + _Modifiers |= TW_KMOD_META; + + for(size_t i=0; iIsGroup() ) + { + Atom = static_cast(m_Vars[i])->FindShortcut(_Key, _Modifiers, _DoIncr); + if( Atom!=NULL ) + return Atom; + } + else + { + Atom = static_cast(m_Vars[i]); + if( Atom->m_KeyIncr[0]==_Key && (Atom->m_KeyIncr[1]&Mask)==(_Modifiers&Mask) ) + { + if( _DoIncr!=NULL ) + *_DoIncr = true; + return Atom; + } + else if( Atom->m_KeyDecr[0]==_Key && (Atom->m_KeyDecr[1]&Mask)==(_Modifiers&Mask) ) + { + if( _DoIncr!=NULL ) + *_DoIncr = false; + return Atom; + } + } + } + return NULL; +} + +bool CTwBar::KeyPressed(int _Key, int _Modifiers) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + bool Handled = false; + if( !m_UpToDate ) + Update(); + + if( _Key>0 && _Key0 && _Key<32 ) + _Key += 'a'-1; + + // PAD translation (for SDL keysym) + if( _Key>=256 && _Key<=272 ) // 256=SDLK_KP0 ... 272=SDLK_KP_EQUALS + { + bool Num = ((_Modifiers&TW_KMOD_SHIFT) && !(_Modifiers&0x1000)) || (!(_Modifiers&TW_KMOD_SHIFT) && (_Modifiers&0x1000)); // 0x1000 is SDL's KMOD_NUM + _Modifiers &= ~TW_KMOD_SHIFT; // remove shift modifier + if( _Key==266 ) // SDLK_KP_PERIOD + _Key = Num ? '.' : TW_KEY_DELETE; + else if( _Key==267 ) // SDLK_KP_DIVIDE + _Key = '/'; + else if( _Key==268 ) // SDLK_KP_MULTIPLY + _Key = '*'; + else if( _Key==269 ) // SDLK_KP_MINUS + _Key = '-'; + else if( _Key==270 ) // SDLK_KP_PLUS + _Key = '+'; + else if( _Key==271 ) // SDLK_KP_ENTER + _Key = TW_KEY_RETURN; + else if( _Key==272 ) // SDLK_KP_EQUALS + _Key = '='; + else if( Num ) // num SDLK_KP0..9 + _Key += '0' - 256; + else if( _Key==256 ) // non-num SDLK_KP01 + _Key = TW_KEY_INSERT; + else if( _Key==257 ) // non-num SDLK_KP1 + _Key = TW_KEY_END; + else if( _Key==258 ) // non-num SDLK_KP2 + _Key = TW_KEY_DOWN; + else if( _Key==259 ) // non-num SDLK_KP3 + _Key = TW_KEY_PAGE_DOWN; + else if( _Key==260 ) // non-num SDLK_KP4 + _Key = TW_KEY_LEFT; + else if( _Key==262 ) // non-num SDLK_KP6 + _Key = TW_KEY_RIGHT; + else if( _Key==263 ) // non-num SDLK_KP7 + _Key = TW_KEY_HOME; + else if( _Key==264 ) // non-num SDLK_KP8 + _Key = TW_KEY_UP; + else if( _Key==265 ) // non-num SDLK_KP9 + _Key = TW_KEY_PAGE_UP; + } + */ + + /* + string Str; + TwGetKeyString(&Str, _Key, _Modifiers); + printf("key: %d 0x%04xd %s\n", _Key, _Modifiers, Str.c_str()); + */ + + if( m_EditInPlace.m_Active ) + { + Handled = EditInPlaceKeyPressed(_Key, _Modifiers); + } + else + { + bool BarActive = (m_DrawHandles || m_IsPopupList) && !m_IsMinimized; + bool DoIncr = true; + CTwVarAtom *Atom = m_VarRoot.FindShortcut(_Key, _Modifiers, &DoIncr); + if( Atom!=NULL && Atom->m_Visible ) + { + if( !Atom->m_ReadOnly ) + { + Atom->Increment( DoIncr ? +1 : -1 ); + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return 1; + m_HighlightClickBtnAuto = g_TwMgr->m_Timer.GetTime(); + } + NotUpToDate(); + Show(Atom); + Handled = true; + } + else if( BarActive && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var ) + { + if( _Key==TW_KEY_RIGHT ) + { + if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + CTwVarAtom *Atom = static_cast(m_HierTags[m_HighlightedLine].m_Var); + bool Accept = !Atom->m_NoSlider || Atom->m_Type==TW_TYPE_BUTTON + || Atom->m_Type==TW_TYPE_BOOL8 || Atom->m_Type==TW_TYPE_BOOL16 || Atom->m_Type==TW_TYPE_BOOL32 || Atom->m_Type==TW_TYPE_BOOLCPP + || IsEnumType(Atom->m_Type); + if( !Atom->IsReadOnly() && !m_IsPopupList && Accept ) + { + Atom->Increment(+1); + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return 1; + m_HighlightClickBtnAuto = g_TwMgr->m_Timer.GetTime(); + NotUpToDate(); + } + } + else + { + CTwVarGroup *Grp = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( !Grp->m_Open ) + { + Grp->m_Open = true; + NotUpToDate(); + } + } + Handled = true; + } + else if( _Key==TW_KEY_LEFT ) + { + if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + CTwVarAtom *Atom = static_cast(m_HierTags[m_HighlightedLine].m_Var); + bool Accept = !Atom->m_NoSlider || Atom->m_Type==TW_TYPE_BUTTON + || Atom->m_Type==TW_TYPE_BOOL8 || Atom->m_Type==TW_TYPE_BOOL16 || Atom->m_Type==TW_TYPE_BOOL32 || Atom->m_Type==TW_TYPE_BOOLCPP + || IsEnumType(Atom->m_Type); + if( !Atom->IsReadOnly() && Accept && !m_IsPopupList ) + { + Atom->Increment(-1); + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return 1; + m_HighlightClickBtnAuto = g_TwMgr->m_Timer.GetTime(); + NotUpToDate(); + } + } + else + { + CTwVarGroup *Grp = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( Grp->m_Open ) + { + Grp->m_Open = false; + NotUpToDate(); + } + } + Handled = true; + } + else if( _Key==TW_KEY_RETURN ) + { + if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + CTwVarAtom *Atom = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( !Atom->IsReadOnly() ) + { + if( Atom->m_Type==TW_TYPE_BUTTON || Atom->m_Type==TW_TYPE_BOOLCPP + || Atom->m_Type==TW_TYPE_BOOL8 || Atom->m_Type==TW_TYPE_BOOL16 || Atom->m_Type==TW_TYPE_BOOL32 ) + { + bool isPopup = m_IsPopupList; + Atom->Increment(+1); + if( g_TwMgr==NULL // Mgr might have been destroyed by the client inside a callback call + || isPopup ) // A popup destroys itself + return 1; + m_HighlightClickBtnAuto = g_TwMgr->m_Timer.GetTime(); + NotUpToDate(); + } + else // if( IsEnumType(Atom->m_Type) ) + { + // simulate a mouse click + int y = m_PosY + m_VarY0 + m_HighlightedLine*(m_Font->m_CharHeight+m_LineSep) + m_Font->m_CharHeight/2; + int x = m_PosX + m_VarX1 + 2; + if( x>m_PosX+m_VarX2-2 ) + x = m_PosX + m_VarX2 - 2; + MouseMotion(x, y); + MouseButton(TW_MOUSE_LEFT, true, x, y); + } + } + } + else + { + CTwVarGroup *Grp = static_cast(m_HierTags[m_HighlightedLine].m_Var); + Grp->m_Open = !Grp->m_Open; + NotUpToDate(); + } + Handled = true; + } + else if( _Key==TW_KEY_UP ) + { + --m_HighlightedLine; + if( m_HighlightedLine<0 ) + { + m_HighlightedLine = 0; + if( m_FirstLine>0 ) + { + --m_FirstLine; + NotUpToDate(); + } + } + m_HighlightedLineLastValid = m_HighlightedLine; + Handled = true; + } + else if( _Key==TW_KEY_DOWN ) + { + ++m_HighlightedLine; + if( m_HighlightedLine>=(int)m_HierTags.size() ) + { + m_HighlightedLine = (int)m_HierTags.size() - 1; + if( m_FirstLinem_PopupBar = NULL; + if( LinkedBar!=NULL ) + LinkedBar->m_DrawHandles = true; + return true; // this bar has been destroyed + } + } + else if( BarActive ) + { + if( _Key==TW_KEY_UP || _Key==TW_KEY_DOWN || _Key==TW_KEY_LEFT || _Key==TW_KEY_RIGHT || _Key==TW_KEY_RETURN ) + { + if( m_HighlightedLineLastValid>=0 && m_HighlightedLineLastValid<(int)m_HierTags.size() ) + m_HighlightedLine = m_HighlightedLineLastValid; + else if( m_HierTags.size()>0 ) + { + if( _Key==TW_KEY_UP ) + m_HighlightedLine = (int)m_HierTags.size()-1; + else + m_HighlightedLine = 0; + } + Handled = true; + } + else if( _Key==TW_KEY_ESCAPE && m_IsPopupList ) + { + Handled = true; + CTwBar *LinkedBar = m_BarLinkedToPopupList; + TwDeleteBar(this); + g_TwMgr->m_PopupBar = NULL; + if( LinkedBar!=NULL ) + LinkedBar->m_DrawHandles = true; + return true; // this bar has been destroyed + } + } + } + } + return Handled; +} + +// --------------------------------------------------------------------------- + +bool CTwBar::KeyTest(int _Key, int _Modifiers) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + bool Handled = false; + if( !m_UpToDate ) + Update(); + + if( _Key>0 && _Keym_Visible ) + Handled = true; + else if( BarActive && ( _Key==TW_KEY_RIGHT || _Key==TW_KEY_LEFT || _Key==TW_KEY_UP || _Key==TW_KEY_DOWN + || _Key==TW_KEY_RETURN || (_Key==TW_KEY_ESCAPE && m_IsPopupList) ) ) + Handled = true; + } + } + return Handled; +} + +// --------------------------------------------------------------------------- + +bool CTwBar::Show(CTwVar *_Var) +{ + if( _Var==NULL || !_Var->m_Visible ) + return false; + if( !m_UpToDate ) + Update(); + + if( OpenHier(&m_VarRoot, _Var) ) + { + if( !m_UpToDate ) + Update(); + int l = LineInHier(&m_VarRoot, _Var); + if( l>=0 ) + { + int NbLines = (m_VarY1-m_VarY0+1)/(m_Font->m_CharHeight+m_LineSep); + if( NbLines<= 0 ) + NbLines = 1; + if( l=m_FirstLine+NbLines ) + { + m_FirstLine = l-NbLines/2; + if( m_FirstLine<0 ) + m_FirstLine = 0; + NotUpToDate(); + Update(); + if( m_NbDisplayedLinesm_Vars.size(); ++i) + if( _Root->m_Vars[i]!=NULL ) + { + if( _Var==_Root->m_Vars[i] + || (_Root->m_Vars[i]->IsGroup() && OpenHier(static_cast(_Root->m_Vars[i]), _Var)) ) + { + _Root->m_Open = true; + NotUpToDate(); + return true; + } + } + return false; +} + +// --------------------------------------------------------------------------- + +int CTwBar::LineInHier(CTwVarGroup *_Root, CTwVar *_Var) +{ + assert( _Root!=NULL ); + int l = 0; + for(size_t i=0; i<_Root->m_Vars.size(); ++i) + if( _Root->m_Vars[i]!=NULL && _Root->m_Vars[i]->m_Visible ) + { + if( _Var==_Root->m_Vars[i] ) + return l; + else if( _Root->m_Vars[i]->IsGroup() && static_cast(_Root->m_Vars[i])->m_Open ) + { + ++l; + int ll = LineInHier(static_cast(_Root->m_Vars[i]), _Var); + if( ll>=0 ) + return l+ll; + else + l += -ll-2; + } + ++l; + } + return -l-1; +} + +// --------------------------------------------------------------------------- + +void DrawArc(int _X, int _Y, int _Radius, float _StartAngleDeg, float _EndAngleDeg, color32 _Color) // angles in degree +{ + ITwGraph *Gr = g_TwMgr->m_Graph; + if( Gr==NULL || !Gr->IsDrawing() || _Radius==0 || _StartAngleDeg==_EndAngleDeg ) + return; + + float startAngle = (float)M_PI*_StartAngleDeg/180; + float endAngle = (float)M_PI*_EndAngleDeg/180; + //float stepAngle = 8/(float)_Radius; // segment length = 8 pixels + float stepAngle = 4/(float)_Radius; // segment length = 4 pixels + if( stepAngle>(float)M_PI/4 ) + stepAngle = (float)M_PI/4; + bool fullCircle = fabsf(endAngle-startAngle)>=2.0f*(float)M_PI+fabsf(stepAngle); + int numSteps; + if( fullCircle ) + { + numSteps = int((2.0f*(float)M_PI)/stepAngle); + startAngle = 0; + endAngle = 2.0f*(float)M_PI; + } + else + numSteps = int(fabsf(endAngle-startAngle)/stepAngle); + if( startAngle>endAngle ) + stepAngle = -stepAngle; + + int x0 = int(_X + _Radius * cosf(startAngle) + 0.5f); + int y0 = int(_Y - _Radius * sinf(startAngle) + 0.5f); + int x1, y1; + float angle = startAngle+stepAngle; + + for( int i=0; iDrawLine(x0, y0, x1, y1, _Color, true); + x0 = x1; + y0 = y1; + } + + if( fullCircle ) + { + x1 = int(_X + _Radius * cosf(startAngle) + 0.5f); + y1 = int(_Y - _Radius * sinf(startAngle) + 0.5f); + } + else + { + x1 = int(_X + _Radius * cosf(endAngle) + 0.5f); + y1 = int(_Y - _Radius * sinf(endAngle) + 0.5f); + } + Gr->DrawLine(x0, y0, x1, y1, _Color, true); +} + +// --------------------------------------------------------------------------- + +CTwBar::CRotoSlider::CRotoSlider() +{ + m_Var = NULL; + m_Active = false; + m_ActiveMiddle = false; + m_Subdiv = 256; // will be recalculated in RotoOnLButtonDown +} + +void CTwBar::RotoDraw() +{ + ITwGraph *Gr = g_TwMgr->m_Graph; + if( Gr==NULL || !Gr->IsDrawing() ) + return; + + if( m_Roto.m_Active ) + { + DrawArc(m_Roto.m_Origin.x, m_Roto.m_Origin.y, 32, 0, 360, m_ColRoto); + DrawArc(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, 32, 0, 360, m_ColRoto); + DrawArc(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, 32, 0, 360, m_ColRoto); + + if( m_Roto.m_HasPrevious ) + { + double varMax = RotoGetMax(); + double varMin = RotoGetMin(); + double varStep = RotoGetStep(); + if( varMax-DOUBLE_MAX && fabs(varStep)>DOUBLE_EPS && m_Roto.m_Subdiv>0 ) + { + double dtMax = 360.0*(varMax-m_Roto.m_ValueAngle0)/((double)m_Roto.m_Subdiv*varStep);//+2; + double dtMin = 360.0*(varMin-m_Roto.m_ValueAngle0)/((double)m_Roto.m_Subdiv*varStep);//-2; + + if( dtMax>=0 && dtMax<360 && dtMin<=0 && dtMin>-360 && fabs(dtMax-dtMin)<=360 ) + { + int x1, y1, x2, y2; + double da = 2.0*M_PI/m_Roto.m_Subdiv; + + x1 = m_Roto.m_Origin.x + (int)(40*cos(-M_PI*(m_Roto.m_Angle0+dtMax)/180-da)); + y1 = m_Roto.m_Origin.y + (int)(40*sin(-M_PI*(m_Roto.m_Angle0+dtMax)/180-da)+0.5); + x2 = m_Roto.m_Origin.x + (int)(40*cos(-M_PI*(m_Roto.m_Angle0+dtMax-10)/180-da)); + y2 = m_Roto.m_Origin.y + (int)(40*sin(-M_PI*(m_Roto.m_Angle0+dtMax-10)/180-da)+0.5); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y, x1, y1, m_ColRotoBound, true); + Gr->DrawLine(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, x1+1, y1, m_ColRotoBound, true); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, x1, y1+1, m_ColRotoBound, true); + Gr->DrawLine(x1, y1, x2, y2, m_ColRotoBound, true); + Gr->DrawLine(x1+1, y1, x2+1, y2, m_ColRotoBound, true); + Gr->DrawLine(x1, y1+1, x2, y2+1, m_ColRotoBound, true); + + x1 = m_Roto.m_Origin.x + (int)(40*cos(-M_PI*(m_Roto.m_Angle0+dtMin)/180+da)); + y1 = m_Roto.m_Origin.y + (int)(40*sin(-M_PI*(m_Roto.m_Angle0+dtMin)/180+da)+0.5); + x2 = m_Roto.m_Origin.x + (int)(40*cos(-M_PI*(m_Roto.m_Angle0+dtMin+10)/180+da)); + y2 = m_Roto.m_Origin.y + (int)(40*sin(-M_PI*(m_Roto.m_Angle0+dtMin+10)/180+da)+0.5); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y, x1, y1, m_ColRotoBound, true); + Gr->DrawLine(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, x1+1, y1, m_ColRotoBound, true); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, x1, y1+1, m_ColRotoBound, true); + Gr->DrawLine(x1, y1, x2, y2, m_ColRotoBound, true); + Gr->DrawLine(x1+1, y1, x2+1, y2, m_ColRotoBound, true); + Gr->DrawLine(x1, y1+1, x2, y2+1, m_ColRotoBound, true); + } + } + } + + Gr->DrawLine(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, m_Roto.m_Current.x+1, m_Roto.m_Current.y, m_ColRotoVal, true); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, m_Roto.m_Current.x, m_Roto.m_Current.y+1, m_ColRotoVal, true); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y, m_Roto.m_Current.x, m_Roto.m_Current.y, m_ColRotoVal, true); + + if( fabs(m_Roto.m_AngleDT)>=1 ) + { + DrawArc(m_Roto.m_Origin.x, m_Roto.m_Origin.y, 32, float(m_Roto.m_Angle0), float(m_Roto.m_Angle0+m_Roto.m_AngleDT-1), m_ColRotoVal); + DrawArc(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, 32, float(m_Roto.m_Angle0), float(m_Roto.m_Angle0+m_Roto.m_AngleDT-1), m_ColRotoVal); + DrawArc(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, 32, float(m_Roto.m_Angle0), float(m_Roto.m_Angle0+m_Roto.m_AngleDT-1), m_ColRotoVal); + } + } +} + +double CTwBar::RotoGetValue() const +{ + assert(m_Roto.m_Var!=NULL); + return m_Roto.m_Var->ValueToDouble(); +} + +void CTwBar::RotoSetValue(double _Val) +{ + assert(m_Roto.m_Var!=NULL); + if( _Val!=m_Roto.m_CurrentValue ) + { + m_Roto.m_CurrentValue = _Val; + m_Roto.m_Var->ValueFromDouble(_Val); + NotUpToDate(); + } +} + +double CTwBar::RotoGetMin() const +{ + assert(m_Roto.m_Var!=NULL); + double min = -DOUBLE_MAX; + m_Roto.m_Var->MinMaxStepToDouble(&min, NULL, NULL); + return min; +} + +double CTwBar::RotoGetMax() const +{ + assert(m_Roto.m_Var!=NULL); + double max = DOUBLE_MAX; + m_Roto.m_Var->MinMaxStepToDouble(NULL, &max, NULL); + return max; +} + +double CTwBar::RotoGetStep() const +{ + assert(m_Roto.m_Var!=NULL); + double step = 1; + m_Roto.m_Var->MinMaxStepToDouble(NULL, NULL, &step); + return step; +} + +double CTwBar::RotoGetSteppedValue() const +{ + double d = m_Roto.m_PreciseValue-m_Roto.m_Value0; + double n = int(d/RotoGetStep()); + return m_Roto.m_Value0 + RotoGetStep()*n; +} + +void CTwBar::RotoOnMouseMove(int _X, int _Y) +{ + CPoint p(_X, _Y); + if( m_Roto.m_Active ) + { + m_Roto.m_Current = p; + RotoSetValue(RotoGetSteppedValue()); + //DrawManip(); + + int ti = -1; + double t = 0; + float r = sqrtf(float( (m_Roto.m_Current.x-m_Roto.m_Origin.x)*(m_Roto.m_Current.x-m_Roto.m_Origin.x) + + (m_Roto.m_Current.y-m_Roto.m_Origin.y)*(m_Roto.m_Current.y-m_Roto.m_Origin.y))); + if( r>m_RotoMinRadius ) + { + t = - atan2(double(m_Roto.m_Current.y-m_Roto.m_Origin.y), double(m_Roto.m_Current.x-m_Roto.m_Origin.x)); + ti = (int((t/(2.0*M_PI)+1.0)*NB_ROTO_CURSORS+0.5)) % NB_ROTO_CURSORS; + if( m_Roto.m_HasPrevious ) + { + CPoint v0 = m_Roto.m_Previous-m_Roto.m_Origin; + CPoint v1 = m_Roto.m_Current-m_Roto.m_Origin; + double l0 = sqrt(double(v0.x*v0.x+v0.y*v0.y)); + double l1 = sqrt(double(v1.x*v1.x+v1.y*v1.y)); + double dt = acos(max(-1+1.0e-30,min(1-1.0e-30,double(v0.x*v1.x+v0.y*v1.y)/(l0*l1)))); + if( v0.x*v1.y-v0.y*v1.x>0 ) + dt = - dt; + double preciseInc = double(m_Roto.m_Subdiv) * dt/(2.0*M_PI) * RotoGetStep(); + if( preciseInc>RotoGetStep() || preciseInc<-RotoGetStep() ) + { + m_Roto.m_PreciseValue += preciseInc; + if( m_Roto.m_PreciseValue>RotoGetMax() ) + { + m_Roto.m_PreciseValue = RotoGetMax(); + m_Roto.m_Value0 = RotoGetMax(); + + double da = 360*(RotoGetMax()-m_Roto.m_ValueAngle0)/(double(m_Roto.m_Subdiv)*RotoGetStep()); + m_Roto.m_Angle0 = ((int((t/(2.0*M_PI)+1.0)*360.0+0.5)) % 360) - da; + m_Roto.m_AngleDT = da; + } + else if( m_Roto.m_PreciseValue=0 && ti=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + m_Roto.m_Var = static_cast(m_HierTags[m_HighlightedLine].m_Var); + int y = m_PosY + m_VarY0 + m_HighlightedLine*(m_Font->m_CharHeight+m_LineSep) + m_Font->m_CharHeight/2; + m_Roto.m_Origin = CPoint(p.x, y); //r.CenterPoint().y); + m_Roto.m_Current = p; + m_Roto.m_Active = true; + m_Roto.m_HasPrevious = false; + m_Roto.m_Angle0 = 0; + m_Roto.m_AngleDT = 0; + //SetCapture(); + + m_Roto.m_Value0 = RotoGetValue(); + m_Roto.m_CurrentValue = m_Roto.m_Value0; + m_Roto.m_ValueAngle0 = m_Roto.m_Value0; + m_Roto.m_PreciseValue = m_Roto.m_Value0; + //RotoSetValue(RotoGetSteppedValue()); Not here + //DrawManip(); + + m_Roto.m_Subdiv = m_RotoNbSubdiv; + // re-adjust m_Subdiv if needed: + double min=-DOUBLE_MAX, max=DOUBLE_MAX, step=1; + m_Roto.m_Var->MinMaxStepToDouble(&min, &max, &step); + if( fabs(step)>0 && min>-DOUBLE_MAX && maxm_Graph!=NULL ); + + m_Var = NULL; + m_Active = false; + m_EditTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_EditSelTextObj = g_TwMgr->m_Graph->NewTextObj(); + + m_X = m_Y = m_Width = 0; +} + +CTwBar::CEditInPlace::~CEditInPlace() +{ + assert( g_TwMgr!=NULL && g_TwMgr->m_Graph!=NULL ); + + if( m_EditTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_EditTextObj); + if( m_EditSelTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_EditSelTextObj); +} + +bool CTwBar::EditInPlaceIsReadOnly() +{ + if( m_EditInPlace.m_Var==NULL ) + return true; + else if( m_EditInPlace.m_Var->m_ReadOnly ) + return true; + else if( m_EditInPlace.m_Var->m_Type==TW_TYPE_CDSTRING && ((m_EditInPlace.m_Var->m_Ptr==NULL && m_EditInPlace.m_Var->m_SetCallback==NULL) || (m_EditInPlace.m_Var->m_Ptr!=NULL && g_TwMgr->m_CopyCDStringToClient==NULL)) ) + return true; + else if( m_EditInPlace.m_Var->m_Type==TW_TYPE_CDSTDSTRING && m_EditInPlace.m_Var->m_SetCallback==NULL ) + return true; + else if( m_EditInPlace.m_Var->m_Type==TW_TYPE_STDSTRING && ((m_EditInPlace.m_Var->m_Ptr==NULL && m_EditInPlace.m_Var->m_SetCallback==NULL) || (m_EditInPlace.m_Var->m_Ptr!=NULL && g_TwMgr->m_CopyStdStringToClient==NULL)) ) + return true; + else + return false; +} + +void CTwBar::EditInPlaceDraw() +{ + if( !m_EditInPlace.m_Active || m_EditInPlace.m_Var==NULL || m_EditInPlace.m_Width<=0 ) + return; + + // adjust m_FirstChar to see the caret, and extract the visible sub-string + int i, StringLen = (int)m_EditInPlace.m_String.length(); + if( m_EditInPlace.m_FirstChar>m_EditInPlace.m_CaretPos ) + m_EditInPlace.m_FirstChar = m_EditInPlace.m_CaretPos; + int SubstrWidth = 0; + for( i=min(m_EditInPlace.m_CaretPos, StringLen-1); i>=0 && SubstrWidthm_CharWidth[u]; + } + int FirstChar = max(0, i); + if( SubstrWidth>=m_EditInPlace.m_Width ) + FirstChar += 2; + if( m_EditInPlace.m_FirstChar0 ) + --m_EditInPlace.m_FirstChar; + SubstrWidth = 0; + for( i=m_EditInPlace.m_FirstChar; im_CharWidth[u]; + } + int LastChar = i; + if( SubstrWidth>=m_EditInPlace.m_Width ) + --LastChar; + string Substr = m_EditInPlace.m_String.substr( m_EditInPlace.m_FirstChar, LastChar-m_EditInPlace.m_FirstChar ); + + // compute caret x pos + int CaretX = m_PosX + m_EditInPlace.m_X; + for( i=m_EditInPlace.m_FirstChar; im_CharWidth[u]; + } + + // draw edit text + color32 ColText = EditInPlaceIsReadOnly() ? m_ColValTextRO : m_ColEditText; + color32 ColBg = EditInPlaceIsReadOnly() ? m_ColValBg : m_ColEditBg; + g_TwMgr->m_Graph->BuildText(m_EditInPlace.m_EditTextObj, &Substr, NULL, NULL, 1, m_Font, 0, m_EditInPlace.m_Width); + g_TwMgr->m_Graph->DrawText(m_EditInPlace.m_EditTextObj, m_PosX+m_EditInPlace.m_X, m_PosY+m_EditInPlace.m_Y, ColText, ColBg); + + // draw selected text + string StrSelected = ""; + if( m_EditInPlace.m_CaretPos>m_EditInPlace.m_SelectionStart ) + { + int FirstSel = max(m_EditInPlace.m_SelectionStart, m_EditInPlace.m_FirstChar); + int LastSel = min(m_EditInPlace.m_CaretPos, LastChar); + StrSelected = m_EditInPlace.m_String.substr( FirstSel, LastSel-FirstSel ); + } + else + { + int FirstSel = max(m_EditInPlace.m_CaretPos, m_EditInPlace.m_FirstChar); + int LastSel = min(m_EditInPlace.m_SelectionStart, LastChar); + StrSelected = m_EditInPlace.m_String.substr( FirstSel, LastSel-FirstSel ); + } + int SelWidth = 0; + for( i=0; i<(int)StrSelected.length(); ++i ) + { + unsigned char u = StrSelected.c_str()[i]; + SelWidth += m_Font->m_CharWidth[u]; + } + if( SelWidth>0 && StrSelected.length()>0 ) + { + color32 ColSelBg = EditInPlaceIsReadOnly() ? m_ColValTextRO : m_ColEditSelBg; + g_TwMgr->m_Graph->BuildText(m_EditInPlace.m_EditSelTextObj, &StrSelected, NULL, NULL, 1, m_Font, 0, SelWidth); + if ( m_EditInPlace.m_CaretPos>m_EditInPlace.m_SelectionStart ) + g_TwMgr->m_Graph->DrawText(m_EditInPlace.m_EditSelTextObj, CaretX-SelWidth, m_PosY+m_EditInPlace.m_Y, m_ColEditSelText, ColSelBg); + else + g_TwMgr->m_Graph->DrawText(m_EditInPlace.m_EditSelTextObj, CaretX, m_PosY+m_EditInPlace.m_Y, m_ColEditSelText, ColSelBg); + } + + // draw caret + if( CaretX<=m_PosX+m_EditInPlace.m_X+m_EditInPlace.m_Width ) + g_TwMgr->m_Graph->DrawLine( CaretX, m_PosY+m_EditInPlace.m_Y+1, CaretX, m_PosY+m_EditInPlace.m_Y+m_Font->m_CharHeight, m_ColEditText ); +} + +bool CTwBar::EditInPlaceAcceptVar(const CTwVarAtom* _Var) +{ + if( _Var==NULL ) + return false; + if( _Var->m_Type>=TW_TYPE_CHAR && _Var->m_Type<=TW_TYPE_DOUBLE ) + return true; + if( _Var->m_Type==TW_TYPE_CDSTRING || _Var->m_Type==TW_TYPE_CDSTDSTRING || _Var->m_Type==TW_TYPE_STDSTRING ) + return true; + if( IsCSStringType(_Var->m_Type) ) + return true; + + return false; +} + +void CTwBar::EditInPlaceStart(CTwVarAtom* _Var, int _X, int _Y, int _Width) +{ + if( m_EditInPlace.m_Active ) + EditInPlaceEnd(true); + + m_EditInPlace.m_Active = true; + m_EditInPlace.m_Var = _Var; + m_EditInPlace.m_X = _X; + m_EditInPlace.m_Y = _Y; + m_EditInPlace.m_Width = _Width; + m_EditInPlace.m_Var->ValueToString(&m_EditInPlace.m_String); + if( m_EditInPlace.m_Var->m_Type==TW_TYPE_CHAR ) + m_EditInPlace.m_String = m_EditInPlace.m_String.substr(0, 1); + m_EditInPlace.m_CaretPos = (int)m_EditInPlace.m_String.length(); + if( EditInPlaceIsReadOnly() ) + m_EditInPlace.m_SelectionStart = m_EditInPlace.m_CaretPos; + else + m_EditInPlace.m_SelectionStart = 0; + m_EditInPlace.m_FirstChar = 0; +} + +void CTwBar::EditInPlaceEnd(bool _Commit) +{ + if( _Commit && m_EditInPlace.m_Active && m_EditInPlace.m_Var!=NULL ) + { + if( m_EditInPlace.m_Var->m_Type==TW_TYPE_CDSTRING || m_EditInPlace.m_Var->m_Type==TW_TYPE_CDSTDSTRING ) + { + if( m_EditInPlace.m_Var->m_SetCallback!=NULL ) + { + const char *String = m_EditInPlace.m_String.c_str(); + m_EditInPlace.m_Var->m_SetCallback(&String, m_EditInPlace.m_Var->m_ClientData); + } + else if( m_EditInPlace.m_Var->m_Type!=TW_TYPE_CDSTDSTRING ) + { + char **StringPtr = (char **)m_EditInPlace.m_Var->m_Ptr; + if( StringPtr!=NULL && g_TwMgr->m_CopyCDStringToClient!=NULL ) + g_TwMgr->m_CopyCDStringToClient(StringPtr, m_EditInPlace.m_String.c_str()); + } + } + else if( m_EditInPlace.m_Var->m_Type==TW_TYPE_STDSTRING ) + { + // this case should never happened: TW_TYPE_STDSTRING are converted to TW_TYPE_CDSTDSTRING by TwAddVar + if( m_EditInPlace.m_Var->m_SetCallback!=NULL ) + m_EditInPlace.m_Var->m_SetCallback(&(m_EditInPlace.m_String), m_EditInPlace.m_Var->m_ClientData); + else + { + string *StringPtr = (string *)m_EditInPlace.m_Var->m_Ptr; + if( StringPtr!=NULL && g_TwMgr->m_CopyStdStringToClient!=NULL ) + g_TwMgr->m_CopyStdStringToClient(*StringPtr, m_EditInPlace.m_String); + } + } + else if( IsCSStringType(m_EditInPlace.m_Var->m_Type) ) + { + int n = TW_CSSTRING_SIZE(m_EditInPlace.m_Var->m_Type); + if( n>0 ) + { + if( (int)m_EditInPlace.m_String.length()>n-1 ) + m_EditInPlace.m_String.resize(n-1); + if( m_EditInPlace.m_Var->m_SetCallback!=NULL ) + m_EditInPlace.m_Var->m_SetCallback(m_EditInPlace.m_String.c_str(), m_EditInPlace.m_Var->m_ClientData); + else if( m_EditInPlace.m_Var->m_Ptr!=NULL ) + { + if( n>1 ) + strncpy((char *)m_EditInPlace.m_Var->m_Ptr, m_EditInPlace.m_String.c_str(), n-1); + ((char *)m_EditInPlace.m_Var->m_Ptr)[n-1] = '\0'; + } + } + } + else + { + double Val = 0, Min = 0, Max = 0, Step = 0; + int n = 0; + if( m_EditInPlace.m_Var->m_Type==TW_TYPE_CHAR ) + { + unsigned char Char = 0; + n = sscanf(m_EditInPlace.m_String.c_str(), "%c", &Char); + Val = Char; + } + else + n = sscanf(m_EditInPlace.m_String.c_str(), "%lf", &Val); + if( n==1 ) + { + m_EditInPlace.m_Var->MinMaxStepToDouble(&Min, &Max, &Step); + if( ValMax ) + Val = Max; + m_EditInPlace.m_Var->ValueFromDouble(Val); + } + } + if( g_TwMgr!=NULL ) // Mgr might have been destroyed by the client inside a callback call + NotUpToDate(); + } + m_EditInPlace.m_Active = false; + m_EditInPlace.m_Var = NULL; +} + +bool CTwBar::EditInPlaceKeyPressed(int _Key, int _Modifiers) +{ + if( !m_EditInPlace.m_Active ) + return false; + bool Handled = true; // if EditInPlace is active, it catches all key events + bool DoCopy = false, DoPaste = false; + + switch( _Key ) + { + case TW_KEY_ESCAPE: + EditInPlaceEnd(false); + break; + case TW_KEY_RETURN: + EditInPlaceEnd(true); + break; + case TW_KEY_LEFT: + if( _Modifiers==TW_KMOD_SHIFT ) + m_EditInPlace.m_CaretPos = max(0, m_EditInPlace.m_CaretPos-1); + else + { + if( m_EditInPlace.m_SelectionStart!=m_EditInPlace.m_CaretPos ) + m_EditInPlace.m_CaretPos = min(m_EditInPlace.m_SelectionStart, m_EditInPlace.m_CaretPos); + else + m_EditInPlace.m_CaretPos = max(0, m_EditInPlace.m_CaretPos-1); + m_EditInPlace.m_SelectionStart = m_EditInPlace.m_CaretPos; + } + break; + case TW_KEY_RIGHT: + if( _Modifiers==TW_KMOD_SHIFT ) + m_EditInPlace.m_CaretPos = min((int)m_EditInPlace.m_String.length(), m_EditInPlace.m_CaretPos+1); + else + { + if( m_EditInPlace.m_SelectionStart!=m_EditInPlace.m_CaretPos ) + m_EditInPlace.m_CaretPos = max(m_EditInPlace.m_SelectionStart, m_EditInPlace.m_CaretPos); + else + m_EditInPlace.m_CaretPos = min((int)m_EditInPlace.m_String.length(), m_EditInPlace.m_CaretPos+1); + m_EditInPlace.m_SelectionStart = m_EditInPlace.m_CaretPos; + } + break; + case TW_KEY_BACKSPACE: + if( !EditInPlaceIsReadOnly() ) + { + if( m_EditInPlace.m_SelectionStart==m_EditInPlace.m_CaretPos ) + m_EditInPlace.m_SelectionStart = max(0, m_EditInPlace.m_CaretPos-1); + EditInPlaceEraseSelect(); + } + break; + case TW_KEY_DELETE: + if( !EditInPlaceIsReadOnly() ) + { + if( m_EditInPlace.m_SelectionStart==m_EditInPlace.m_CaretPos ) + m_EditInPlace.m_SelectionStart = min(m_EditInPlace.m_CaretPos+1, (int)m_EditInPlace.m_String.length()); + EditInPlaceEraseSelect(); + } + break; + case TW_KEY_HOME: + m_EditInPlace.m_CaretPos = 0; + if( _Modifiers!=TW_KMOD_SHIFT ) + m_EditInPlace.m_SelectionStart = m_EditInPlace.m_CaretPos; + break; + case TW_KEY_END: + m_EditInPlace.m_CaretPos = (int)m_EditInPlace.m_String.length(); + if( _Modifiers!=TW_KMOD_SHIFT ) + m_EditInPlace.m_SelectionStart = m_EditInPlace.m_CaretPos; + break; + case TW_KEY_INSERT: + if( _Modifiers==TW_KMOD_CTRL ) + DoCopy = true; + else if( _Modifiers==TW_KMOD_SHIFT ) + DoPaste = true; + break; + default: + if( _Modifiers==TW_KMOD_CTRL ) + { + if( _Key=='c' || _Key=='C' ) + DoCopy = true; + else if( _Key=='v' || _Key=='V' ) + DoPaste = true; + } + else if( _Key>=32 && _Key<=255 ) + { + if( !EditInPlaceIsReadOnly() && m_EditInPlace.m_CaretPos>=0 && m_EditInPlace.m_CaretPos<=(int)m_EditInPlace.m_String.length() ) + { + if( m_EditInPlace.m_SelectionStart!=m_EditInPlace.m_CaretPos ) + EditInPlaceEraseSelect(); + string Str(1, (char)_Key); + m_EditInPlace.m_String.insert(m_EditInPlace.m_CaretPos, Str); + ++m_EditInPlace.m_CaretPos; + m_EditInPlace.m_SelectionStart = m_EditInPlace.m_CaretPos; + } + } + } + + if( DoPaste && !EditInPlaceIsReadOnly() ) + { + if( m_EditInPlace.m_SelectionStart!=m_EditInPlace.m_CaretPos ) + EditInPlaceEraseSelect(); + string Str = ""; + if( EditInPlaceGetClipboard(&Str) && Str.length()>0 ) + { + m_EditInPlace.m_String.insert(m_EditInPlace.m_CaretPos, Str); + m_EditInPlace.m_CaretPos += (int)Str.length(); + m_EditInPlace.m_SelectionStart = m_EditInPlace.m_CaretPos; + } + } + if( DoCopy ) + { + string Str = ""; + if( m_EditInPlace.m_CaretPos>m_EditInPlace.m_SelectionStart ) + Str = m_EditInPlace.m_String.substr(m_EditInPlace.m_SelectionStart, m_EditInPlace.m_CaretPos-m_EditInPlace.m_SelectionStart); + else if( m_EditInPlace.m_CaretPosPosMin ) + m_EditInPlace.m_FirstChar = PosMin; + return true; + } + else + return false; +} + + +bool CTwBar::EditInPlaceMouseMove(int _X, int _Y, bool _Select) +{ + if ( !m_EditInPlace.m_Active || _Ym_PosY+m_EditInPlace.m_Y+m_Font->m_CharHeight ) + return false; + + int i, CaretX = m_PosX+m_EditInPlace.m_X; + for( i=m_EditInPlace.m_FirstChar; i<(int)m_EditInPlace.m_String.length() && CaretXm_CharWidth[u]; + if( _X < CaretX + CharWidth / 2 ) + break; + CaretX += CharWidth; + } + if( CaretX>=m_PosX+m_EditInPlace.m_X+m_EditInPlace.m_Width ) + i = max(0, i-1); + + m_EditInPlace.m_CaretPos = i; + if( !_Select ) + m_EditInPlace.m_SelectionStart = m_EditInPlace.m_CaretPos; + return true; +} + + +bool CTwBar::EditInPlaceGetClipboard(std::string *_OutString) +{ + assert( _OutString!=NULL ); + *_OutString = m_EditInPlace.m_Clipboard; // default implementation + +#if defined ANT_WINDOWS + + if( !IsClipboardFormatAvailable(CF_TEXT) ) + return false; + if( !OpenClipboard(NULL) ) + return false; + HGLOBAL TextHandle = GetClipboardData(CF_TEXT); + if( TextHandle!=NULL ) + { + const char *TextString = static_cast(GlobalLock(TextHandle)); + if( TextHandle!=NULL ) + { + *_OutString = TextString; + GlobalUnlock(TextHandle); + } + } + CloseClipboard(); + +#elif defined ANT_UNIX + + if( g_TwMgr->m_CurrentXDisplay!=NULL ) + { + int NbBytes = 0; + char *Buffer = XFetchBytes(g_TwMgr->m_CurrentXDisplay, &NbBytes); + if( Buffer!=NULL ) + { + if( NbBytes>0 ) + { + char *Text = new char[NbBytes+1]; + memcpy(Text, Buffer, NbBytes); + Text[NbBytes] = '\0'; + *_OutString = Text; + delete[] Text; + } + XFree(Buffer); + } + } + +#endif + + return true; +} + + +bool CTwBar::EditInPlaceSetClipboard(const std::string& _String) +{ + if( _String.length()<=0 ) + return false; // keep last clipboard + m_EditInPlace.m_Clipboard = _String; // default implementation + +#if defined ANT_WINDOWS + + if( !OpenClipboard(NULL) ) + return false; + EmptyClipboard(); + HGLOBAL TextHandle = GlobalAlloc(GMEM_MOVEABLE, _String.length()+1); + if( TextHandle==NULL ) + { + CloseClipboard(); + return false; + } + char *TextString = static_cast(GlobalLock(TextHandle)); + memcpy(TextString, _String.c_str(), _String.length()); + TextString[_String.length()] = '\0'; + GlobalUnlock(TextHandle); + SetClipboardData(CF_TEXT, TextHandle); + CloseClipboard(); + +#elif defined ANT_UNIX + + if( g_TwMgr->m_CurrentXDisplay!=NULL ) + { + XSetSelectionOwner(g_TwMgr->m_CurrentXDisplay, XA_PRIMARY, None, CurrentTime); + char *Text = new char[_String.length()+1]; + memcpy(Text, _String.c_str(), _String.length()); + Text[_String.length()] = '\0'; + XStoreBytes(g_TwMgr->m_CurrentXDisplay, Text, _String.length()); + delete[] Text; + } + +#endif + + return true; +} + + +// --------------------------------------------------------------------------- + + diff --git a/AntTweakBar/src/TwBar.h b/AntTweakBar/src/TwBar.h new file mode 100644 index 0000000..4e957a3 --- /dev/null +++ b/AntTweakBar/src/TwBar.h @@ -0,0 +1,438 @@ +// --------------------------------------------------------------------------- +// +// @file TwBar.h +// @brief Tweak bar and var classes. +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_BAR_INCLUDED +#define ANT_TW_BAR_INCLUDED + +#include +#include "TwColors.h" + +#define ANT_TWEAK_BAR_DLL "AntTweakBar" + + +// --------------------------------------------------------------------------- + +bool IsCustomType(int _Type); + +struct CTwVar +{ + std::string m_Name; + std::string m_Label; + std::string m_Help; + bool m_IsRoot; + bool m_DontClip; + bool m_Visible; + signed short m_LeftMargin; + signed short m_TopMargin; + const color32 * m_ColorPtr; + const color32 * m_BgColorPtr; + + virtual bool IsGroup() const = 0; + virtual bool IsCustom() const { return false; } + virtual const CTwVar * Find(const char *_Name, struct CTwVarGroup **_Parent, int *_Index) const = 0; + virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const; + virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex); + virtual ERetType GetAttrib(int _AttribID, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex, std::vector& outDouble, std::ostringstream& outString) const; + virtual void SetReadOnly(bool _ReadOnly) = 0; + virtual bool IsReadOnly() const = 0; + CTwVar(); + virtual ~CTwVar() {} + + static size_t GetDataSize(TwType _Type); +}; + + +struct CTwVarAtom : CTwVar +{ + ETwType m_Type; + void * m_Ptr; + TwSetVarCallback m_SetCallback; + TwGetVarCallback m_GetCallback; + void * m_ClientData; + bool m_ReadOnly; + bool m_NoSlider; + int m_KeyIncr[2]; // [0]=key_code [1]=modifiers + int m_KeyDecr[2]; // [0]=key_code [1]=modifiers + + template struct TVal + { + _T m_Min; + _T m_Max; + _T m_Step; + signed char m_Precision; + bool m_Hexa; + }; + union UVal + { + TVal m_Char; + TVal m_Int8; + TVal m_UInt8; + TVal m_Int16; + TValm_UInt16; + TVal m_Int32; + TVal m_UInt32; + TVal m_Float32; + TVal m_Float64; + struct CBoolVal + { + char * m_TrueString; + char * m_FalseString; + bool m_FreeTrueString; + bool m_FreeFalseString; + } m_Bool; + struct CEnumVal // empty -> enum entries are deduced from m_Type + { + //typedef std::map CEntries; + //CEntries * m_Entries; + } m_Enum; + struct CShortcutVal + { + int m_Incr[2]; + int m_Decr[2]; + } m_Shortcut; + struct CHelpStruct + { + int m_StructType; + } m_HelpStruct; + struct CButtonVal + { + TwButtonCallback m_Callback; + int m_Separator; + } m_Button; + struct CCustomVal + { + CTwMgr::CMemberProxy *m_MemberProxy; + } m_Custom; + }; + UVal m_Val; + + virtual bool IsGroup() const { return false; } + virtual bool IsCustom() const { return IsCustomType(m_Type); } + virtual void ValueToString(std::string *_Str) const; + virtual double ValueToDouble() const; + virtual void ValueFromDouble(double _Val); + virtual void MinMaxStepToDouble(double *_Min, double *_Max, double *_Step) const; + virtual const CTwVar * Find(const char *_Name, struct CTwVarGroup **_Parent, int *_Index) const; + virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const; + virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex); + virtual ERetType GetAttrib(int _AttribID, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex, std::vector& outDouble, std::ostringstream& outString) const; + virtual void Increment(int _Step); + virtual void SetDefaults(); + virtual void SetReadOnly(bool _ReadOnly) { m_ReadOnly=_ReadOnly; if( m_Type!=TW_TYPE_BUTTON && m_SetCallback==NULL && m_Ptr==NULL ) m_ReadOnly=true; } + virtual bool IsReadOnly() const { if( m_Type!=TW_TYPE_BUTTON && m_SetCallback==NULL && m_Ptr==NULL ) return true; else return m_ReadOnly; } + //virtual int DefineEnum(const TwEnumVal *_EnumValues, unsigned int _NbValues); + CTwVarAtom(); + virtual ~CTwVarAtom(); +}; + + +struct CTwVarGroup : CTwVar +{ + std::vector m_Vars; + bool m_Open; + TwSummaryCallback m_SummaryCallback; + void * m_SummaryClientData; + void * m_StructValuePtr; + TwType m_StructType; + + virtual bool IsGroup() const { return true; } + virtual const CTwVar * Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const; + virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const; + virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex); + virtual ERetType GetAttrib(int _AttribID, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex, std::vector& outDouble, std::ostringstream& outString) const; + virtual CTwVarAtom * FindShortcut(int _Key, int _Modifiers, bool *_DoIncr); + virtual void SetReadOnly(bool _ReadOnly) { for(size_t i=0; iSetReadOnly(_ReadOnly); } + virtual bool IsReadOnly() const { for(size_t i=0; iIsReadOnly()) return false; return true; } + CTwVarGroup() { m_Open=false; m_StructType=TW_TYPE_UNDEF; m_SummaryCallback=NULL; m_SummaryClientData=NULL; m_StructValuePtr=NULL; } + virtual ~CTwVarGroup(); +}; + +// --------------------------------------------------------------------------- + +struct CTwBar +{ + std::string m_Name; + std::string m_Label; + std::string m_Help; + bool m_Visible; + int m_PosX; + int m_PosY; + int m_Width; + int m_Height; + color32 m_Color; + bool m_DarkText; + const CTexFont * m_Font; + int m_ValuesWidth; + int m_Sep; + int m_LineSep; + int m_FirstLine; + float m_UpdatePeriod; + bool m_IsHelpBar; + int m_MinNumber; // accessed by TwDeleteBar + bool m_IsPopupList; + CTwVarAtom * m_VarEnumLinkedToPopupList; + CTwBar * m_BarLinkedToPopupList; + bool m_Resizable; + bool m_Movable; + bool m_Iconifiable; + bool m_Contained; + + CTwVarGroup m_VarRoot; + + enum EDrawPart { DRAW_BG=(1<<0), DRAW_CONTENT=(1<<1), DRAW_ALL=DRAW_BG|DRAW_CONTENT }; + void Draw(int _DrawPart=DRAW_ALL); + void NotUpToDate(); + const CTwVar * Find(const char *_Name, CTwVarGroup **_Parent=NULL, int *_Index=NULL) const; + CTwVar * Find(const char *_Name, CTwVarGroup **_Parent=NULL, int *_Index=NULL); + int HasAttrib(const char *_Attrib, bool *_HasValue) const; + int SetAttrib(int _AttribID, const char *_Value); + ERetType GetAttrib(int _AttribID, std::vector& outDouble, std::ostringstream& outString) const; + bool MouseMotion(int _X, int _Y); + bool MouseButton(ETwMouseButtonID _Button, bool _Pressed, int _X, int _Y); + bool MouseWheel(int _Pos, int _PrevPos, int _MouseX, int _MouseY); + bool KeyPressed(int _Key, int _Modifiers); + bool KeyTest(int _Key, int _Modifiers); + bool IsMinimized() const { return m_IsMinimized; } + bool IsDragging() const { return m_MouseDrag; } + bool Show(CTwVar *_Var); // display the line associated to _Var + bool OpenHier(CTwVarGroup *_Root, CTwVar *_Var); // open a hierarchy if it contains _Var + int LineInHier(CTwVarGroup *_Root, CTwVar *_Var); // returns the number of the line associated to _Var + void UnHighlightLine() { m_HighlightedLine = -1; NotUpToDate(); } // used by PopupCallback + void HaveFocus(bool _Focus) { m_DrawHandles = _Focus; } // used by PopupCallback + void StopEditInPlace() { if( m_EditInPlace.m_Active ) EditInPlaceEnd(false); } + CTwBar(const char *_Name); + ~CTwBar(); + + color32 m_ColBg, m_ColBg1, m_ColBg2; + color32 m_ColHighBg0; + color32 m_ColHighBg1; + color32 m_ColLabelText; + color32 m_ColStructText; + color32 m_ColValBg; + color32 m_ColValText; + color32 m_ColValTextRO; + color32 m_ColValTextNE; + color32 m_ColValMin; + color32 m_ColValMax; + color32 m_ColStructBg; + color32 m_ColTitleBg; + color32 m_ColTitleHighBg; + color32 m_ColTitleUnactiveBg; + color32 m_ColTitleText; + color32 m_ColTitleShadow; + color32 m_ColLine; + color32 m_ColLineShadow; + color32 m_ColUnderline; + color32 m_ColBtn; + color32 m_ColHighBtn; + color32 m_ColFold; + color32 m_ColHighFold; + color32 m_ColGrpBg; + color32 m_ColGrpText; + color32 m_ColHierBg; + color32 m_ColShortcutText; + color32 m_ColShortcutBg; + color32 m_ColInfoText; + color32 m_ColHelpBg; + color32 m_ColHelpText; + color32 m_ColRoto; + color32 m_ColRotoVal; + color32 m_ColRotoBound; + color32 m_ColEditBg; + color32 m_ColEditText; + color32 m_ColEditSelBg; + color32 m_ColEditSelText; + color32 m_ColSeparator; + color32 m_ColStaticText; + void UpdateColors(); + +protected: + int m_TitleWidth; + int m_VarX0; + int m_VarX1; + int m_VarX2; + int m_VarY0; + int m_VarY1; + int m_VarY2; + int m_ScrollYW; + int m_ScrollYH; + int m_ScrollY0; + int m_ScrollY1; + int m_NbHierLines; + int m_NbDisplayedLines; + bool m_UpToDate; + float m_LastUpdateTime; + void Update(); + + bool m_MouseDrag; + bool m_MouseDragVar; + bool m_MouseDragTitle; + bool m_MouseDragScroll; + bool m_MouseDragResizeUR; + bool m_MouseDragResizeUL; + bool m_MouseDragResizeLR; + bool m_MouseDragResizeLL; + bool m_MouseDragValWidth; + int m_MouseOriginX; + int m_MouseOriginY; + double m_ValuesWidthRatio; + bool m_VarHasBeenIncr; + int m_FirstLine0; + int m_HighlightedLine; + int m_HighlightedLinePrev; + int m_HighlightedLineLastValid; + bool m_HighlightIncrBtn; + bool m_HighlightDecrBtn; + bool m_HighlightRotoBtn; + bool m_HighlightListBtn; + bool m_HighlightBoolBtn; + bool m_HighlightClickBtn; + double m_HighlightClickBtnAuto; + bool m_HighlightTitle; + bool m_HighlightScroll; + bool m_HighlightUpScroll; + bool m_HighlightDnScroll; + bool m_HighlightMinimize; + bool m_HighlightFont; + bool m_HighlightValWidth; + bool m_HighlightLabelsHeader; + bool m_HighlightValuesHeader; + bool m_DrawHandles; + + bool m_IsMinimized; + int m_MinPosX; + int m_MinPosY; + bool m_HighlightMaximize; + bool m_DrawIncrDecrBtn; + bool m_DrawRotoBtn; + bool m_DrawClickBtn; + bool m_DrawListBtn; + bool m_DrawBoolBtn; + EButtonAlign m_ButtonAlign; + + struct CHierTag + { + CTwVar * m_Var; + int m_Level; + bool m_Closing; + }; + std::vector m_HierTags; + void BrowseHierarchy(int *_LineNum, int _CurrLevel, const CTwVar *_Var, int _First, int _Last); + void * m_TitleTextObj; + void * m_LabelsTextObj; + void * m_ValuesTextObj; + void * m_ShortcutTextObj; + int m_ShortcutLine; + void * m_HeadersTextObj; + void ListLabels(std::vector& _Labels, std::vector& _Colors, std::vector& _BgColors, bool *_HasBgColors, const CTexFont *_Font, int _AtomWidthMax, int _GroupWidthMax); + void ListValues(std::vector& _Values, std::vector& _Colors, std::vector& _BgColors, const CTexFont *_Font, int _WidthMax); + int ComputeLabelsWidth(const CTexFont *_Font); + int ComputeValuesWidth(const CTexFont *_Font); + void DrawHierHandle(); + + enum EValuesWidthFit { VALUES_WIDTH_FIT = -5555 }; + + // RotoSlider + struct CPoint + { + int x, y; + CPoint() {} + CPoint(int _X, int _Y):x(_X), y(_Y) {} + const CPoint operator+ (const CPoint& p) const { return CPoint(x+p.x, y+p.y); } + const CPoint operator- (const CPoint& p) const { return CPoint(x-p.x, y-p.y); } + }; + struct CRotoSlider + { + CRotoSlider(); + CTwVarAtom * m_Var; + double m_PreciseValue; + double m_CurrentValue; + double m_Value0; + double m_ValueAngle0; + bool m_Active; + bool m_ActiveMiddle; + CPoint m_Origin; + CPoint m_Current; + bool m_HasPrevious; + CPoint m_Previous; + double m_Angle0; + double m_AngleDT; + int m_Subdiv; + }; + CRotoSlider m_Roto; + int m_RotoMinRadius; + int m_RotoNbSubdiv; // number of steps for one turn + void RotoDraw(); + void RotoOnMouseMove(int _X, int _Y); + void RotoOnLButtonDown(int _X, int _Y); + void RotoOnLButtonUp(int _X, int _Y); + void RotoOnMButtonDown(int _X, int _Y); + void RotoOnMButtonUp(int _X, int _Y); + double RotoGetValue() const; + void RotoSetValue(double _Val); + double RotoGetMin() const; + double RotoGetMax() const; + double RotoGetStep() const; + double RotoGetSteppedValue() const; + + // Edit-in-place + struct CEditInPlace + { + CEditInPlace(); + ~CEditInPlace(); + CTwVarAtom * m_Var; + bool m_Active; + std::string m_String; + void * m_EditTextObj; + void * m_EditSelTextObj; + int m_CaretPos; + int m_SelectionStart; + int m_X, m_Y; + int m_Width; + int m_FirstChar; + std::string m_Clipboard; + }; + CEditInPlace m_EditInPlace; + void EditInPlaceDraw(); + bool EditInPlaceAcceptVar(const CTwVarAtom* _Var); + bool EditInPlaceIsReadOnly(); + void EditInPlaceStart(CTwVarAtom* _Var, int _X, int _Y, int _Width); + void EditInPlaceEnd(bool _Commit); + bool EditInPlaceKeyPressed(int _Key, int _Modifiers); + bool EditInPlaceEraseSelect(); + bool EditInPlaceMouseMove(int _X, int _Y, bool _Select); + bool EditInPlaceSetClipboard(const std::string& _String); + bool EditInPlaceGetClipboard(std::string *_OutString); + + struct CCustomRecord + { + int m_IndexMin; + int m_IndexMax; + int m_XMin, m_XMax; + int m_YMin, m_YMax; // Y visible range + int m_Y0, m_Y1; // Y widget range + CTwVarGroup * m_Var; + }; + typedef std::map CustomMap; + CustomMap m_CustomRecords; + CTwMgr::CStructProxy * m_CustomActiveStructProxy; + + friend struct CTwMgr; +}; + +void DrawArc(int _X, int _Y, int _Radius, float _StartAngleDeg, float _EndAngleDeg, color32 _Color); + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_BAR_INCLUDED diff --git a/AntTweakBar/src/TwColors.cpp b/AntTweakBar/src/TwColors.cpp new file mode 100644 index 0000000..0d98b09 --- /dev/null +++ b/AntTweakBar/src/TwColors.cpp @@ -0,0 +1,153 @@ +// --------------------------------------------------------------------------- +// +// @file TwColors.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "TwColors.h" + + +void ColorRGBToHLSf(float _R, float _G, float _B, float *_Hue, float *_Light, float *_Saturation) +{ + // Compute HLS from RGB. The r,g,b triplet is between [0,1], + // hue is between [0,360], light and saturation are [0,1]. + + float rnorm, gnorm, bnorm, minval, maxval, msum, mdiff, r, g, b; + r = g = b = 0; + if(_R>0) r = _R; if(r>1) r = 1; + if(_G>0) g = _G; if(g>1) g = 1; + if(_B>0) b = _B; if(b>1) b = 1; + + minval = r; + if(gmaxval) maxval = g; + if(b>maxval) maxval = b; + + rnorm = gnorm = bnorm = 0; + mdiff = maxval - minval; + msum = maxval + minval; + float l = 0.5f * msum; + if(_Light) + *_Light = l; + if(maxval!=minval) + { + rnorm = (maxval - r)/mdiff; + gnorm = (maxval - g)/mdiff; + bnorm = (maxval - b)/mdiff; + } + else + { + if(_Saturation) + *_Saturation = 0; + if(_Hue) + *_Hue = 0; + return; + } + + if(_Saturation) + { + if(l<0.5f) + *_Saturation = mdiff/msum; + else + *_Saturation = mdiff/(2.0f - msum); + } + + if(_Hue) + { + if(r==maxval) + *_Hue = 60.0f * (6.0f + bnorm - gnorm); + else if(g==maxval) + *_Hue = 60.0f * (2.0f + rnorm - bnorm); + else + *_Hue = 60.0f * (4.0f + gnorm - rnorm); + + if(*_Hue>360.0f) + *_Hue -= 360.0f; + } +} + + +void ColorRGBToHLSi(int _R, int _G, int _B, int *_Hue, int *_Light, int *_Saturation) +{ + float h, l, s; + ColorRGBToHLSf((1.0f/255.0f)*float(_R), (1.0f/255.0f)*float(_G), (1.0f/255.0f)*float(_B), &h, &l, &s); + if(_Hue) *_Hue = (int)TClamp(h*(256.0f/360.0f), 0.0f, 255.0f); + if(_Light) *_Light = (int)TClamp(l*256.0f, 0.0f, 255.0f); + if(_Saturation) *_Saturation= (int)TClamp(s*256.0f, 0.0f, 255.0f); +} + + +void ColorHLSToRGBf(float _Hue, float _Light, float _Saturation, float *_R, float *_G, float *_B) +{ + // Compute RGB from HLS. The light and saturation are between [0,1] + // and hue is between [0,360]. The returned r,g,b triplet is between [0,1]. + + // a local auxiliary function + struct CLocal + { + static float HLSToRGB(float _Rn1, float _Rn2, float _Huei) + { + float hue = _Huei; + if(hue>360) hue = hue - 360; + if(hue<0) hue = hue + 360; + if(hue<60 ) return _Rn1 + (_Rn2-_Rn1)*hue/60; + if(hue<180) return _Rn2; + if(hue<240) return _Rn1 + (_Rn2-_Rn1)*(240-hue)/60; + return _Rn1; + } + }; + + float rh, rl, rs, rm1, rm2; + rh = rl = rs = 0; + if(_Hue>0) rh = _Hue; if(rh>360) rh = 360; + if(_Light>0) rl = _Light; if(rl>1) rl = 1; + if(_Saturation>0) rs = _Saturation; if(rs>1) rs = 1; + + if(rl<=0.5f) + rm2 = rl*(1.0f + rs); + else + rm2 = rl + rs - rl*rs; + rm1 = 2.0f*rl - rm2; + + if(!rs) + { + if(_R) *_R = rl; + if(_G) *_G = rl; + if(_B) *_B = rl; + } + else + { + if(_R) *_R = CLocal::HLSToRGB(rm1, rm2, rh+120); + if(_G) *_G = CLocal::HLSToRGB(rm1, rm2, rh); + if(_B) *_B = CLocal::HLSToRGB(rm1, rm2, rh-120); + } +} + + +void ColorHLSToRGBi(int _Hue, int _Light, int _Saturation, int *_R, int *_G, int *_B) +{ + float r, g, b; + ColorHLSToRGBf((360.0f/255.0f)*float(_Hue), (1.0f/255.0f)*float(_Light), (1.0f/255.0f)*float(_Saturation), &r, &g, &b); + if(_R) *_R = (int)TClamp(r*256.0f, 0.0f, 255.0f); + if(_G) *_G = (int)TClamp(g*256.0f, 0.0f, 255.0f); + if(_B) *_B = (int)TClamp(b*256.0f, 0.0f, 255.0f); +} + + +color32 ColorBlend(color32 _Color1, color32 _Color2, float _S) +{ + float a1, r1, g1, b1, a2, r2, g2, b2; + Color32ToARGBf(_Color1, &a1, &r1, &g1, &b1); + Color32ToARGBf(_Color2, &a2, &r2, &g2, &b2); + float t = 1.0f-_S; + return Color32FromARGBf(t*a1+_S*a2, t*r1+_S*r2, t*g1+_S*g2, t*b1+_S*b2); +} + + diff --git a/AntTweakBar/src/TwColors.h b/AntTweakBar/src/TwColors.h new file mode 100644 index 0000000..0c966f7 --- /dev/null +++ b/AntTweakBar/src/TwColors.h @@ -0,0 +1,80 @@ +// --------------------------------------------------------------------------- +// +// @file TwColors.h +// @brief Color conversions +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_COLORS_INCLUDED +#define ANT_TW_COLORS_INCLUDED + + +// --------------------------------------------------------------------------- + + +typedef unsigned int color32; + + +const color32 COLOR32_BLACK = 0xff000000; // Black +const color32 COLOR32_WHITE = 0xffffffff; // White +const color32 COLOR32_ZERO = 0x00000000; // Zero +const color32 COLOR32_RED = 0xffff0000; // Red +const color32 COLOR32_GREEN = 0xff00ff00; // Green +const color32 COLOR32_BLUE = 0xff0000ff; // Blue + + +template inline const _T& TClamp(const _T& _X, const _T& _Limit1, const _T& _Limit2) +{ + if( _Limit1<_Limit2 ) + return (_X<=_Limit1) ? _Limit1 : ( (_X>=_Limit2) ? _Limit2 : _X ); + else + return (_X<=_Limit2) ? _Limit2 : ( (_X>=_Limit1) ? _Limit1 : _X ); +} + +inline color32 Color32FromARGBi(int _A, int _R, int _G, int _B) +{ + return (((color32)TClamp(_A, 0, 255))<<24) | (((color32)TClamp(_R, 0, 255))<<16) | (((color32)TClamp(_G, 0, 255))<<8) | ((color32)TClamp(_B, 0, 255)); +} + +inline color32 Color32FromARGBf(float _A, float _R, float _G, float _B) +{ + return (((color32)TClamp(_A*256.0f, 0.0f, 255.0f))<<24) | (((color32)TClamp(_R*256.0f, 0.0f, 255.0f))<<16) | (((color32)TClamp(_G*256.0f, 0.0f, 255.0f))<<8) | ((color32)TClamp(_B*256.0f, 0.0f, 255.0f)); +} + +inline void Color32ToARGBi(color32 _Color, int *_A, int *_R, int *_G, int *_B) +{ + if(_A) *_A = (_Color>>24)&0xff; + if(_R) *_R = (_Color>>16)&0xff; + if(_G) *_G = (_Color>>8)&0xff; + if(_B) *_B = _Color&0xff; +} + +inline void Color32ToARGBf(color32 _Color, float *_A, float *_R, float *_G, float *_B) +{ + if(_A) *_A = (1.0f/255.0f)*float((_Color>>24)&0xff); + if(_R) *_R = (1.0f/255.0f)*float((_Color>>16)&0xff); + if(_G) *_G = (1.0f/255.0f)*float((_Color>>8)&0xff); + if(_B) *_B = (1.0f/255.0f)*float(_Color&0xff); +} + +void ColorRGBToHLSf(float _R, float _G, float _B, float *_Hue, float *_Light, float *_Saturation); + +void ColorRGBToHLSi(int _R, int _G, int _B, int *_Hue, int *_Light, int *_Saturation); + +void ColorHLSToRGBf(float _Hue, float _Light, float _Saturation, float *_R, float *_G, float *_B); + +void ColorHLSToRGBi(int _Hue, int _Light, int _Saturation, int *_R, int *_G, int *_B); + +color32 ColorBlend(color32 _Color1, color32 _Color2, float _S); + + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_COLORS_INCLUDED diff --git a/AntTweakBar/src/TwDirect3D10.cpp b/AntTweakBar/src/TwDirect3D10.cpp new file mode 100644 index 0000000..11003e2 --- /dev/null +++ b/AntTweakBar/src/TwDirect3D10.cpp @@ -0,0 +1,1291 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D10.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "TwDirect3D10.h" +#include "TwMgr.h" +#include "TwColors.h" + +#include "d3d10vs2003.h" // Workaround to include D3D10.h with VS2003 +#define D3D10_IGNORE_SDK_LAYERS // d3d10sdklayers.h may not exist +#include + + +using namespace std; + +const char *g_ErrCantLoadD3D10 = "Cannot load Direct3D10 library dynamically"; +const char *g_ErrCompileFX10 = "Direct3D10 effect compilation failed"; +const char *g_ErrCreateFX10 = "Direct3D10 effect creation failed"; +const char *g_ErrTechNotFound10 = "Cannot find Direct3D10 technique effect"; +const char *g_ErrCreateLayout10 = "Direct3D10 vertex layout creation failed"; +const char *g_ErrCreateBuffer10 = "Direct3D10 vertex buffer creation failed"; + +// --------------------------------------------------------------------------- + +// Dynamically loaded D3D10 functions (to avoid static linkage with d3d10.lib) +HMODULE g_D3D10Module = NULL; +typedef HRESULT (WINAPI *D3D10CompileEffectFromMemoryProc)(void *pData, SIZE_T DataLength, LPCSTR pSrcFileName, CONST D3D10_SHADER_MACRO *pDefines, ID3D10Include *pInclude, UINT HLSLFlags, UINT FXFlags, ID3D10Blob **ppCompiledEffect, ID3D10Blob **ppErrors); +typedef HRESULT (WINAPI *D3D10CreateEffectFromMemoryProc)(void *pData, SIZE_T DataLength, UINT FXFlags, ID3D10Device *pDevice, ID3D10EffectPool *pEffectPool, ID3D10Effect **ppEffect); +typedef HRESULT (WINAPI *D3D10StateBlockMaskEnableAllProc)(D3D10_STATE_BLOCK_MASK *pMask); +typedef HRESULT (WINAPI *D3D10CreateStateBlockProc)(ID3D10Device *pDevice, D3D10_STATE_BLOCK_MASK *pStateBlockMask, ID3D10StateBlock **ppStateBlock); +D3D10CompileEffectFromMemoryProc _D3D10CompileEffectFromMemory = NULL; +D3D10CreateEffectFromMemoryProc _D3D10CreateEffectFromMemory = NULL; +D3D10StateBlockMaskEnableAllProc _D3D10StateBlockMaskEnableAll = NULL; +D3D10CreateStateBlockProc _D3D10CreateStateBlock = NULL; + +const RECT FullRect = {0, 0, 16000, 16000}; +static bool RectIsFull(const RECT& r) { return r.left==FullRect.left && r.right==FullRect.right && r.top==FullRect.top && r.bottom==FullRect.bottom; } + +static int LoadDirect3D10() +{ + if( g_D3D10Module!=NULL ) + return 1; // Direct3D10 library already loaded + + g_D3D10Module = LoadLibrary("D3D10.DLL"); + if( g_D3D10Module ) + { + int res = 1; + _D3D10CompileEffectFromMemory = reinterpret_cast(GetProcAddress(g_D3D10Module, "D3D10CompileEffectFromMemory")); + if( _D3D10CompileEffectFromMemory==NULL ) + res = 0; + _D3D10CreateEffectFromMemory = reinterpret_cast(GetProcAddress(g_D3D10Module, "D3D10CreateEffectFromMemory")); + if( _D3D10CreateEffectFromMemory==NULL ) + res = 0; + _D3D10StateBlockMaskEnableAll = reinterpret_cast(GetProcAddress(g_D3D10Module, "D3D10StateBlockMaskEnableAll")); + if( _D3D10StateBlockMaskEnableAll==NULL ) + res = 0; + _D3D10CreateStateBlock = reinterpret_cast(GetProcAddress(g_D3D10Module, "D3D10CreateStateBlock")); + if( _D3D10CreateStateBlock==NULL ) + res = 0; + return res; + } + else + return 0; // cannot load DLL +} + +static int UnloadDirect3D10() +{ + _D3D10CompileEffectFromMemory = NULL; + _D3D10CreateEffectFromMemory = NULL; + _D3D10StateBlockMaskEnableAll = NULL; + _D3D10CreateStateBlock = NULL; + + if( g_D3D10Module==NULL ) + return 1; // Direct3D10 library not loaded + + if( FreeLibrary(g_D3D10Module) ) + { + g_D3D10Module = NULL; + return 1; + } + else + return 0; // cannot unload d3d10.dll +} + +// --------------------------------------------------------------------------- + +static ID3D10ShaderResourceView *BindFont(ID3D10Device *_Dev, ID3D10EffectShaderResourceVariable *_ResVar, const CTexFont *_Font) +{ + assert(_Font!=NULL); + assert(_ResVar!=NULL); + + int w = _Font->m_TexWidth; + int h = _Font->m_TexHeight; + color32 *font32 = new color32[w*h]; + color32 *p = font32; + for( int i=0; im_TexBytes[i]))<<24); + + D3D10_TEXTURE2D_DESC desc; + desc.Width = w; + desc.Height = h; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D10_USAGE_IMMUTABLE; + desc.BindFlags = D3D10_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + D3D10_SUBRESOURCE_DATA data; + data.pSysMem = font32; + data.SysMemPitch = w*sizeof(color32); + data.SysMemSlicePitch = 0; + ID3D10Texture2D *tex = NULL; + ID3D10ShaderResourceView *texRV = NULL; + if( SUCCEEDED(_Dev->CreateTexture2D(&desc, &data, &tex)) ) + { + if( SUCCEEDED(_Dev->CreateShaderResourceView(tex, NULL, &texRV)) ) + if( _ResVar ) + _ResVar->SetResource(texRV); + tex->Release(); + tex = NULL; + } + + delete[] font32; + return texRV; +} + +// --------------------------------------------------------------------------- + +static void UnbindFont(ID3D10Device *_Dev, ID3D10EffectShaderResourceVariable *_ResVar, ID3D10ShaderResourceView *_TexRV) +{ + (void)_Dev; + + if( _ResVar ) + _ResVar->SetResource(NULL); + + if( _TexRV ) + { + ULONG rc = _TexRV->Release(); + assert( rc==0 ); (void)rc; + } +} + +// --------------------------------------------------------------------------- + +struct CState10 +{ + ID3D10StateBlock * m_StateBlock; + + void Save(); + void Restore(); + CState10(ID3D10Device *_Dev); + ~CState10(); +private: + ID3D10Device * m_D3DDev; +}; + +CState10::CState10(ID3D10Device *_Dev) +{ + ZeroMemory(this, sizeof(CState10)); + m_D3DDev = _Dev; +} + +CState10::~CState10() +{ + if( m_StateBlock ) + { + UINT rc = m_StateBlock->Release(); + assert( rc==0 ); (void)rc; + m_StateBlock = NULL; + } +} + +void CState10::Save() +{ + if( !m_StateBlock ) + { + D3D10_STATE_BLOCK_MASK stateMask; + _D3D10StateBlockMaskEnableAll(&stateMask); + _D3D10CreateStateBlock(m_D3DDev, &stateMask, &m_StateBlock); + } + + if( m_StateBlock ) + m_StateBlock->Capture(); +} + +void CState10::Restore() +{ + if( m_StateBlock ) + m_StateBlock->Apply(); +} + +// --------------------------------------------------------------------------- + +char g_ShaderFX[] = "// AntTweakBar shaders and techniques \n" + " float4 g_Offset = 0; float4 g_CstColor = 1; \n" + " struct LineRectPSInput { float4 Pos : SV_POSITION; float4 Color : COLOR0; }; \n" + " LineRectPSInput LineRectVS(float4 pos : POSITION, float4 color : COLOR, uniform bool useCstColor) { \n" + " LineRectPSInput ps; ps.Pos = pos + g_Offset; \n" + " ps.Color = useCstColor ? g_CstColor : color; return ps; } \n" + " float4 LineRectPS(LineRectPSInput input) : SV_Target { return input.Color; } \n" + " technique10 LineRect { pass P0 { \n" + " SetVertexShader( CompileShader( vs_4_0, LineRectVS(false) ) ); \n" + " SetGeometryShader( NULL ); \n" + " SetPixelShader( CompileShader( ps_4_0, LineRectPS() ) ); \n" + " } }\n" + " technique10 LineRectCstColor { pass P0 { \n" + " SetVertexShader( CompileShader( vs_4_0, LineRectVS(true) ) ); \n" + " SetGeometryShader( NULL ); \n" + " SetPixelShader( CompileShader( ps_4_0, LineRectPS() ) ); \n" + " } }\n" + " Texture2D Font; \n" + " SamplerState FontSampler { Filter = MIN_MAG_MIP_POINT; AddressU = BORDER; AddressV = BORDER; BorderColor=float4(0, 0, 0, 0); }; \n" + " struct TextPSInput { float4 Pos : SV_POSITION; float4 Color : COLOR0; float2 Tex : TEXCOORD0; }; \n" + " TextPSInput TextVS(float4 pos : POSITION, float4 color : COLOR, float2 tex : TEXCOORD0, uniform bool useCstColor) { \n" + " TextPSInput ps; ps.Pos = pos + g_Offset; \n" + " ps.Color = useCstColor ? g_CstColor : color; ps.Tex = tex; return ps; } \n" + " float4 TextPS(TextPSInput input) : SV_Target { return Font.Sample(FontSampler, input.Tex)*input.Color; } \n" + " technique10 Text { pass P0 { \n" + " SetVertexShader( CompileShader( vs_4_0, TextVS(false) ) ); \n" + " SetGeometryShader( NULL ); \n" + " SetPixelShader( CompileShader( ps_4_0, TextPS() ) ); \n" + " } }\n" + " technique10 TextCstColor { pass P0 { \n" + " SetVertexShader( CompileShader( vs_4_0, TextVS(true) ) ); \n" + " SetGeometryShader( NULL ); \n" + " SetPixelShader( CompileShader( ps_4_0, TextPS() ) ); \n" + " } }\n" + " // End of AntTweakBar shaders and techniques \n"; + +// --------------------------------------------------------------------------- + +int CTwGraphDirect3D10::Init() +{ + assert(g_TwMgr!=NULL); + assert(g_TwMgr->m_Device!=NULL); + + m_D3DDev = static_cast(g_TwMgr->m_Device); + m_D3DDevInitialRefCount = m_D3DDev->AddRef() - 1; + + m_Drawing = false; + m_OffsetX = m_OffsetY = 0; + m_ViewportInit = new D3D10_VIEWPORT; + m_FontTex = NULL; + m_FontD3DTexRV = NULL; + m_WndWidth = 0; + m_WndHeight = 0; + m_State = NULL; + m_DepthStencilState = NULL; + m_BlendState = NULL; + m_RasterState = NULL; + m_RasterStateAntialiased = NULL; + m_RasterStateCullCW = NULL; + m_RasterStateCullCCW = NULL; + m_Effect = NULL; + m_LineRectTech = NULL; + m_LineRectCstColorTech = NULL; + m_LineRectVertexLayout = NULL; + m_LineVertexBuffer = NULL; + m_RectVertexBuffer = NULL; + m_TrianglesVertexBuffer = NULL; + m_TrianglesVertexBufferCount = 0; + m_TextTech = NULL; + m_TextCstColorTech = NULL; + m_TextVertexLayout = NULL; + m_FontD3DResVar = NULL; + m_OffsetVar = NULL; + m_CstColorVar = NULL; + + // Load some D3D10 functions + if( !LoadDirect3D10() ) + { + g_TwMgr->SetLastError(g_ErrCantLoadD3D10); + Shut(); + return 0; + } + + // Allocate state object + m_State = new CState10(m_D3DDev); + + // Compile shaders + DWORD shaderFlags = D3D10_SHADER_ENABLE_STRICTNESS; + #if defined( DEBUG ) || defined( _DEBUG ) + // shaderFlags |= D3D10_SHADER_DEBUG; // no more supported + #endif + ID3D10Blob *compiledFX = NULL; + ID3D10Blob *errors = NULL; + HRESULT hr = _D3D10CompileEffectFromMemory(g_ShaderFX, strlen(g_ShaderFX), "AntTweakBarFX", NULL, NULL, shaderFlags, 0, &compiledFX, &errors); + if( FAILED(hr) ) + { + const size_t ERR_MSG_MAX_LEN = 4096; + static char s_ErrorMsg[ERR_MSG_MAX_LEN]; // must be static to be sent to SetLastError + strncpy(s_ErrorMsg, g_ErrCompileFX10, ERR_MSG_MAX_LEN-1); + size_t errOffset = strlen(s_ErrorMsg); + size_t errLen = 0; + if( errors!=NULL ) + { + s_ErrorMsg[errOffset++] = ':'; + s_ErrorMsg[errOffset++] = '\n'; + errLen = min(errors->GetBufferSize(), ERR_MSG_MAX_LEN-errOffset-2); + strncpy(s_ErrorMsg+errOffset, static_cast(errors->GetBufferPointer()), errLen); + errors->Release(); + errors = NULL; + } + s_ErrorMsg[errOffset+errLen] = '\0'; + g_TwMgr->SetLastError(s_ErrorMsg); + Shut(); + return 0; + } + hr = _D3D10CreateEffectFromMemory(compiledFX->GetBufferPointer(), compiledFX->GetBufferSize(), 0, m_D3DDev, NULL, &m_Effect); + compiledFX->Release(); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateFX10); + Shut(); + return 0; + } + + // Obtain the techniques + m_LineRectTech = m_Effect->GetTechniqueByName("LineRect"); + m_LineRectCstColorTech = m_Effect->GetTechniqueByName("LineRectCstColor"); + m_TextTech = m_Effect->GetTechniqueByName("Text"); + m_TextCstColorTech = m_Effect->GetTechniqueByName("TextCstColor"); + if( m_LineRectTech==NULL || m_TextTech==NULL || m_LineRectCstColorTech==NULL || m_TextCstColorTech==NULL ) + { + g_TwMgr->SetLastError(g_ErrTechNotFound10); + Shut(); + return 0; + } + + // Create input layout for lines & rect + D3D10_INPUT_ELEMENT_DESC lineRectLayout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(CLineRectVtx, m_Color), D3D10_INPUT_PER_VERTEX_DATA, 0 } + }; + D3D10_PASS_DESC passDesc; + hr = m_LineRectTech->GetPassByIndex(0)->GetDesc(&passDesc); + if( SUCCEEDED(hr) ) + hr = m_D3DDev->CreateInputLayout(lineRectLayout, sizeof(lineRectLayout)/sizeof(lineRectLayout[0]), passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, &m_LineRectVertexLayout); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateLayout10); + Shut(); + return 0; + } + + // Create line vertex buffer + D3D10_BUFFER_DESC bd; + bd.Usage = D3D10_USAGE_DYNAMIC; + bd.ByteWidth = 2 * sizeof(CLineRectVtx); + bd.BindFlags = D3D10_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; + bd.MiscFlags = 0; + hr = m_D3DDev->CreateBuffer(&bd, NULL, &m_LineVertexBuffer); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateBuffer10); + Shut(); + return 0; + } + + // Create rect vertex buffer + bd.ByteWidth = 4 * sizeof(CLineRectVtx); + hr = m_D3DDev->CreateBuffer(&bd, NULL, &m_RectVertexBuffer); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateBuffer10); + Shut(); + return 0; + } + + // Create input layout for text + D3D10_INPUT_ELEMENT_DESC textLayout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(CTextVtx, m_Color), D3D10_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(CTextVtx, m_UV), D3D10_INPUT_PER_VERTEX_DATA, 0 } + }; + hr = m_TextTech->GetPassByIndex(0)->GetDesc(&passDesc); + if( SUCCEEDED(hr) ) + hr = m_D3DDev->CreateInputLayout(textLayout, sizeof(textLayout)/sizeof(textLayout[0]), passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, &m_TextVertexLayout); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateLayout10); + Shut(); + return 0; + } + + // Create depth stencil state object + D3D10_DEPTH_STENCILOP_DESC od; + od.StencilFunc = D3D10_COMPARISON_ALWAYS; + od.StencilFailOp = D3D10_STENCIL_OP_KEEP; + od.StencilPassOp = D3D10_STENCIL_OP_KEEP; + od.StencilDepthFailOp = D3D10_STENCIL_OP_KEEP; + D3D10_DEPTH_STENCIL_DESC dsd; + dsd.DepthEnable = FALSE; + dsd.DepthWriteMask = D3D10_DEPTH_WRITE_MASK_ZERO; + dsd.DepthFunc = D3D10_COMPARISON_ALWAYS; + dsd.StencilEnable = FALSE; + dsd.StencilReadMask = D3D10_DEFAULT_STENCIL_READ_MASK; + dsd.StencilWriteMask = D3D10_DEFAULT_STENCIL_WRITE_MASK; + dsd.FrontFace = od; + dsd.BackFace = od; + m_D3DDev->CreateDepthStencilState(&dsd, &m_DepthStencilState); + + // Create blend state object + D3D10_BLEND_DESC bsd; + bsd.AlphaToCoverageEnable = FALSE; + for(int i=0; i<8; ++i) + { + bsd.BlendEnable[i] = TRUE; + bsd.RenderTargetWriteMask[i] = D3D10_COLOR_WRITE_ENABLE_ALL; + } + bsd.SrcBlend = D3D10_BLEND_SRC_ALPHA; + bsd.DestBlend = D3D10_BLEND_INV_SRC_ALPHA; + bsd.BlendOp = D3D10_BLEND_OP_ADD; + bsd.SrcBlendAlpha = D3D10_BLEND_SRC_ALPHA; + bsd.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA; + bsd.BlendOpAlpha = D3D10_BLEND_OP_ADD; + m_D3DDev->CreateBlendState(&bsd, &m_BlendState); + + // Create rasterizer state object + D3D10_RASTERIZER_DESC rd; + rd.FillMode = D3D10_FILL_SOLID; + rd.CullMode = D3D10_CULL_NONE; + rd.FrontCounterClockwise = true; + rd.DepthBias = false; + rd.DepthBiasClamp = 0; + rd.SlopeScaledDepthBias = 0; + rd.DepthClipEnable = false; + rd.ScissorEnable = true; + rd.MultisampleEnable = false; + rd.AntialiasedLineEnable = false; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterState); + + rd.AntialiasedLineEnable = true; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterStateAntialiased); + rd.AntialiasedLineEnable = false; + + rd.CullMode = D3D10_CULL_BACK; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterStateCullCW); + + rd.CullMode = D3D10_CULL_FRONT; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterStateCullCCW); + + m_ViewportAndScissorRects[0] = FullRect; + m_ViewportAndScissorRects[1] = FullRect; + m_D3DDev->RSSetScissorRects(1, m_ViewportAndScissorRects); + + // Get effect globals + if( m_Effect->GetVariableByName("Font") ) + m_FontD3DResVar = m_Effect->GetVariableByName("Font")->AsShaderResource(); + assert( m_FontD3DResVar!=NULL ); + if( m_Effect->GetVariableByName("g_Offset") ) + m_OffsetVar = m_Effect->GetVariableByName("g_Offset")->AsVector(); + assert( m_OffsetVar!=NULL ); + if( m_Effect->GetVariableByName("g_CstColor") ) + m_CstColorVar = m_Effect->GetVariableByName("g_CstColor")->AsVector(); + assert( m_CstColorVar!=NULL ); + + return 1; +} + +// --------------------------------------------------------------------------- + +int CTwGraphDirect3D10::Shut() +{ + assert(m_Drawing==false); + + UnbindFont(m_D3DDev, m_FontD3DResVar, m_FontD3DTexRV); + m_FontD3DTexRV = NULL; + if( m_State ) + { + delete m_State; + m_State = NULL; + } + if( m_ViewportInit ) + { + delete m_ViewportInit; + m_ViewportInit = NULL; + } + + if( m_DepthStencilState ) + { + ULONG rc = m_DepthStencilState->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_DepthStencilState = NULL; + } + if( m_BlendState ) + { + ULONG rc = m_BlendState->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_BlendState = NULL; + } + if( m_RasterState ) + { + ULONG rc = m_RasterState->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterState = NULL; + } + if( m_RasterStateAntialiased ) + { + ULONG rc = m_RasterStateAntialiased->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterStateAntialiased = NULL; + } + if( m_RasterStateCullCW ) + { + ULONG rc = m_RasterStateCullCW->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterStateCullCW = NULL; + } + if( m_RasterStateCullCCW ) + { + ULONG rc = m_RasterStateCullCCW->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterStateCullCCW = NULL; + } + + m_FontD3DResVar = NULL; + m_OffsetVar = NULL; + m_CstColorVar = NULL; + + if( m_LineVertexBuffer ) + { + ULONG rc = m_LineVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + m_LineVertexBuffer = NULL; + } + if( m_RectVertexBuffer ) + { + ULONG rc = m_RectVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + m_RectVertexBuffer = NULL; + } + if( m_TrianglesVertexBuffer ) + { + ULONG rc = m_TrianglesVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + m_TrianglesVertexBuffer = NULL; + m_TrianglesVertexBufferCount = 0; + } + if( m_LineRectVertexLayout ) + { + ULONG rc = m_LineRectVertexLayout->Release(); + assert( rc==0 ); (void)rc; + m_LineRectVertexLayout = NULL; + } + if( m_TextVertexLayout ) + { + ULONG rc = m_TextVertexLayout->Release(); + assert( rc==0 ); (void)rc; + m_TextVertexLayout = NULL; + } + if( m_Effect ) + { + ULONG rc = m_Effect->Release(); + assert( rc==0 ); (void)rc; + m_Effect = NULL; + } + + if( m_D3DDev ) + { + //unsigned int rc = m_D3DDev->Release(); + //assert( m_D3DDevInitialRefCount==rc ); (void)rc; + m_D3DDev->Release(); + m_D3DDev = NULL; + } + + // Unload D3D10 + UnloadDirect3D10(); // this is not a problem if it cannot be unloaded + + return 1; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::BeginDraw(int _WndWidth, int _WndHeight) +{ + assert(m_Drawing==false && _WndWidth>0 && _WndHeight>0); + m_Drawing = true; + + m_WndWidth = _WndWidth; + m_WndHeight = _WndHeight; + m_OffsetX = m_OffsetY = 0; + + // save context + m_State->Save(); + + // Setup the viewport + D3D10_VIEWPORT vp; + vp.Width = _WndWidth; + vp.Height = _WndHeight; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + m_D3DDev->RSSetViewports(1, &vp); + *static_cast(m_ViewportInit) = vp; + + m_D3DDev->RSSetState(m_RasterState); + + m_D3DDev->OMSetDepthStencilState(m_DepthStencilState, 0); + float blendFactors[4] = { 1, 1, 1, 1 }; + m_D3DDev->OMSetBlendState(m_BlendState, blendFactors, 0xffffffff); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::EndDraw() +{ + m_D3DDev->RSSetState(NULL); + m_D3DDev->OMSetDepthStencilState(NULL, 0); + m_D3DDev->OMSetBlendState(NULL, NULL, 0xffffffff); + + assert(m_Drawing==true); + m_Drawing = false; + + // restore context + m_State->Restore(); +} + +// --------------------------------------------------------------------------- + +bool CTwGraphDirect3D10::IsDrawing() +{ + return m_Drawing; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::Restore() +{ + if( m_State ) + { + if( m_State->m_StateBlock ) + { + UINT rc = m_State->m_StateBlock->Release(); + assert( rc==0 ); (void)rc; + m_State->m_StateBlock = NULL; + } + } + + UnbindFont(m_D3DDev, m_FontD3DResVar, m_FontD3DTexRV); + m_FontD3DTexRV = NULL; + + m_FontTex = NULL; +} + + +// --------------------------------------------------------------------------- + +static inline float ToNormScreenX(int x, int wndWidth) +{ + return 2.0f*((float)x-0.5f)/wndWidth - 1.0f; +} + +static inline float ToNormScreenY(int y, int wndHeight) +{ + return 1.0f - 2.0f*((float)y-0.5f)/wndHeight; +} + +static inline color32 ToR8G8B8A8(color32 col) +{ + return (col & 0xff00ff00) | ((col>>16) & 0xff) | ((col<<16) & 0xff0000); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased) +{ + assert(m_Drawing==true); + + float x0 = ToNormScreenX(_X0 + m_OffsetX, m_WndWidth); + float y0 = ToNormScreenY(_Y0 + m_OffsetY, m_WndHeight); + float x1 = ToNormScreenX(_X1 + m_OffsetX, m_WndWidth); + float y1 = ToNormScreenY(_Y1 + m_OffsetY, m_WndHeight); + + CLineRectVtx *vertices = NULL; + HRESULT hr = m_LineVertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void **)&vertices); + if( SUCCEEDED(hr) ) + { + // Fill vertex buffer + vertices[0].m_Pos[0] = x0; + vertices[0].m_Pos[1] = y0; + vertices[0].m_Pos[2] = 0; + vertices[0].m_Color = ToR8G8B8A8(_Color0); + vertices[1].m_Pos[0] = x1; + vertices[1].m_Pos[1] = y1; + vertices[1].m_Pos[2] = 0; + vertices[1].m_Color = ToR8G8B8A8(_Color1); + + m_LineVertexBuffer->Unmap(); + + if( _AntiAliased ) + m_D3DDev->RSSetState(m_RasterStateAntialiased); + + // Reset shader globals + float offsetVec[4] = { 0, 0, 0, 0 }; + if( m_OffsetVar ) + m_OffsetVar->SetFloatVector(offsetVec); + float colorVec[4] = { 1, 1, 1, 1 }; + if( m_CstColorVar ) + m_CstColorVar->SetFloatVector(colorVec); + + // Set the input layout + m_D3DDev->IASetInputLayout(m_LineRectVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CLineRectVtx); + UINT offset = 0; + m_D3DDev->IASetVertexBuffers(0, 1, &m_LineVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDev->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINELIST); + + // Render the line + D3D10_TECHNIQUE_DESC techDesc; + m_LineRectTech->GetDesc(&techDesc); + for(UINT p=0; pGetPassByIndex(p)->Apply(0); + m_D3DDev->Draw(2, 0); + } + + if( _AntiAliased ) + m_D3DDev->RSSetState(m_RasterState); // restore default raster state + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) +{ + assert(m_Drawing==true); + + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + ++_Y1; + else if(_Y0>_Y1) + ++_Y0; + + float x0 = ToNormScreenX(_X0 + m_OffsetX, m_WndWidth); + float y0 = ToNormScreenY(_Y0 + m_OffsetY, m_WndHeight); + float x1 = ToNormScreenX(_X1 + m_OffsetX, m_WndWidth); + float y1 = ToNormScreenY(_Y1 + m_OffsetY, m_WndHeight); + + CLineRectVtx *vertices = NULL; + HRESULT hr = m_RectVertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void **)&vertices); + if( SUCCEEDED(hr) ) + { + // Fill vertex buffer + vertices[0].m_Pos[0] = x0; + vertices[0].m_Pos[1] = y0; + vertices[0].m_Pos[2] = 0; + vertices[0].m_Color = ToR8G8B8A8(_Color00); + vertices[1].m_Pos[0] = x1; + vertices[1].m_Pos[1] = y0; + vertices[1].m_Pos[2] = 0; + vertices[1].m_Color = ToR8G8B8A8(_Color10); + vertices[2].m_Pos[0] = x0; + vertices[2].m_Pos[1] = y1; + vertices[2].m_Pos[2] = 0; + vertices[2].m_Color = ToR8G8B8A8(_Color01); + vertices[3].m_Pos[0] = x1; + vertices[3].m_Pos[1] = y1; + vertices[3].m_Pos[2] = 0; + vertices[3].m_Color = ToR8G8B8A8(_Color11); + + m_RectVertexBuffer->Unmap(); + + // Reset shader globals + float offsetVec[4] = { 0, 0, 0, 0 }; + if( m_OffsetVar ) + m_OffsetVar->SetFloatVector(offsetVec); + float colorVec[4] = { 1, 1, 1, 1 }; + if( m_CstColorVar ) + m_CstColorVar->SetFloatVector(colorVec); + + // Set the input layout + m_D3DDev->IASetInputLayout(m_LineRectVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CLineRectVtx); + UINT offset = 0; + m_D3DDev->IASetVertexBuffers(0, 1, &m_RectVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDev->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + + // Render the rect + D3D10_TECHNIQUE_DESC techDesc; + m_LineRectTech->GetDesc(&techDesc); + for(UINT p=0; pGetPassByIndex(p)->Apply(0); + m_D3DDev->Draw(4, 0); + } + } +} + +// --------------------------------------------------------------------------- + +void *CTwGraphDirect3D10::NewTextObj() +{ + CTextObj *textObj = new CTextObj; + memset(textObj, 0, sizeof(CTextObj)); + return textObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::DeleteTextObj(void *_TextObj) +{ + assert(_TextObj!=NULL); + CTextObj *textObj = static_cast(_TextObj); + if( textObj->m_TextVertexBuffer ) + textObj->m_TextVertexBuffer->Release(); + if( textObj->m_BgVertexBuffer ) + textObj->m_BgVertexBuffer->Release(); + memset(textObj, 0, sizeof(CTextObj)); + delete textObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + assert(_Font!=NULL); + + if( _Font != m_FontTex ) + { + UnbindFont(m_D3DDev, m_FontD3DResVar, m_FontD3DTexRV); + m_FontD3DTexRV = BindFont(m_D3DDev, m_FontD3DResVar, _Font); + m_FontTex = _Font; + } + + int nbTextVerts = 0; + int line; + for( line=0; line<_NbLines; ++line ) + nbTextVerts += 6 * (int)_TextLines[line].length(); + int nbBgVerts = 0; + if( _BgWidth>0 ) + nbBgVerts = _NbLines*6; + + CTextObj *textObj = static_cast(_TextObj); + textObj->m_LineColors = (_LineColors!=NULL); + textObj->m_LineBgColors = (_LineBgColors!=NULL); + + // (re)create text vertex buffer if needed, and map it + CTextVtx *textVerts = NULL; + if( nbTextVerts>0 ) + { + if( textObj->m_TextVertexBuffer==NULL || textObj->m_TextVertexBufferSizem_TextVertexBuffer!=NULL ) + { + ULONG rc = textObj->m_TextVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + textObj->m_TextVertexBuffer = NULL; + } + textObj->m_TextVertexBufferSize = nbTextVerts + 6*256; // add a reserve of 256 characters + D3D10_BUFFER_DESC bd; + bd.Usage = D3D10_USAGE_DYNAMIC; + bd.ByteWidth = textObj->m_TextVertexBufferSize * sizeof(CTextVtx); + bd.BindFlags = D3D10_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; + bd.MiscFlags = 0; + m_D3DDev->CreateBuffer(&bd, NULL, &textObj->m_TextVertexBuffer); + } + + if( textObj->m_TextVertexBuffer!=NULL ) + textObj->m_TextVertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void **)&textVerts); + } + + // (re)create bg vertex buffer if needed, and map it + CLineRectVtx *bgVerts = NULL; + if( nbBgVerts>0 ) + { + if( textObj->m_BgVertexBuffer==NULL || textObj->m_BgVertexBufferSizem_BgVertexBuffer!=NULL ) + { + ULONG rc = textObj->m_BgVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + textObj->m_BgVertexBuffer = NULL; + } + textObj->m_BgVertexBufferSize = nbBgVerts + 6*32; // add a reserve of 32 rects + D3D10_BUFFER_DESC bd; + bd.Usage = D3D10_USAGE_DYNAMIC; + bd.ByteWidth = textObj->m_BgVertexBufferSize * sizeof(CLineRectVtx); + bd.BindFlags = D3D10_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; + bd.MiscFlags = 0; + m_D3DDev->CreateBuffer(&bd, NULL, &textObj->m_BgVertexBuffer); + } + + if( textObj->m_BgVertexBuffer!=NULL ) + textObj->m_BgVertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void **)&bgVerts); + } + + int x, x1, y, y1, i, len; + float px, px1, py, py1; + unsigned char ch; + const unsigned char *text; + color32 lineColor = COLOR32_RED; + CTextVtx vtx; + vtx.m_Pos[2] = 0; + CLineRectVtx bgVtx; + bgVtx.m_Pos[2] = 0; + int textVtxIndex = 0; + int bgVtxIndex = 0; + for( line=0; line<_NbLines; ++line ) + { + x = 0; + y = line * (_Font->m_CharHeight+_Sep); + y1 = y+_Font->m_CharHeight; + len = (int)_TextLines[line].length(); + text = (const unsigned char *)(_TextLines[line].c_str()); + if( _LineColors!=NULL ) + lineColor = ToR8G8B8A8(_LineColors[line]); + + if( textVerts!=NULL ) + for( i=0; im_CharWidth[ch]; + + px = ToNormScreenX(x, m_WndWidth); + py = ToNormScreenY(y, m_WndHeight); + px1 = ToNormScreenX(x1, m_WndWidth); + py1 = ToNormScreenY(y1, m_WndHeight); + + vtx.m_Color = lineColor; + + vtx.m_Pos[0] = px; + vtx.m_Pos[1] = py; + vtx.m_UV [0] = _Font->m_CharU0[ch]; + vtx.m_UV [1] = _Font->m_CharV0[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px1; + vtx.m_Pos[1] = py; + vtx.m_UV [0] = _Font->m_CharU1[ch]; + vtx.m_UV [1] = _Font->m_CharV0[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px; + vtx.m_Pos[1] = py1; + vtx.m_UV [0] = _Font->m_CharU0[ch]; + vtx.m_UV [1] = _Font->m_CharV1[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px1; + vtx.m_Pos[1] = py; + vtx.m_UV [0] = _Font->m_CharU1[ch]; + vtx.m_UV [1] = _Font->m_CharV0[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px1; + vtx.m_Pos[1] = py1; + vtx.m_UV [0] = _Font->m_CharU1[ch]; + vtx.m_UV [1] = _Font->m_CharV1[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px; + vtx.m_Pos[1] = py1; + vtx.m_UV [0] = _Font->m_CharU0[ch]; + vtx.m_UV [1] = _Font->m_CharV1[ch]; + textVerts[textVtxIndex++] = vtx; + + x = x1; + } + + if( _BgWidth>0 && bgVerts!=NULL ) + { + if( _LineBgColors!=NULL ) + bgVtx.m_Color = ToR8G8B8A8(_LineBgColors[line]); + else + bgVtx.m_Color = ToR8G8B8A8(COLOR32_BLACK); + + px = ToNormScreenX(-1, m_WndWidth); + py = ToNormScreenY(y, m_WndHeight); + px1 = ToNormScreenX(_BgWidth+1, m_WndWidth); + py1 = ToNormScreenY(y1, m_WndHeight); + + bgVtx.m_Pos[0] = px; + bgVtx.m_Pos[1] = py; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px1; + bgVtx.m_Pos[1] = py; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px; + bgVtx.m_Pos[1] = py1; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px1; + bgVtx.m_Pos[1] = py; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px1; + bgVtx.m_Pos[1] = py1; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px; + bgVtx.m_Pos[1] = py1; + bgVerts[bgVtxIndex++] = bgVtx; + } + } + assert( textVtxIndex==nbTextVerts ); + assert( bgVtxIndex==nbBgVerts ); + textObj->m_NbTextVerts = nbTextVerts; + textObj->m_NbBgVerts = nbBgVerts; + + if( textVerts!=NULL ) + textObj->m_TextVertexBuffer->Unmap(); + if( bgVerts!=NULL ) + textObj->m_BgVertexBuffer->Unmap(); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + CTextObj *textObj = static_cast(_TextObj); + float dx = 2.0f*(float)(_X + m_OffsetX)/m_WndWidth; + float dy = -2.0f*(float)(_Y + m_OffsetY)/m_WndHeight; + + float offsetVec[4] = { 0, 0, 0, 0 }; + offsetVec[0] = dx; + offsetVec[1] = dy; + if( m_OffsetVar ) + m_OffsetVar->SetFloatVector(offsetVec); + + // Draw background + if( textObj->m_NbBgVerts>=4 && textObj->m_BgVertexBuffer!=NULL ) + { + float color[4]; + Color32ToARGBf(_BgColor, color+3, color+0, color+1, color+2); + if( m_CstColorVar ) + m_CstColorVar->SetFloatVector(color); + + // Set the input layout + m_D3DDev->IASetInputLayout(m_LineRectVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CLineRectVtx); + UINT offset = 0; + m_D3DDev->IASetVertexBuffers(0, 1, &textObj->m_BgVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDev->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + // Render the bg rectangles + ID3D10EffectTechnique *tech; + if( _BgColor!=0 || !textObj->m_LineBgColors ) // use a constant bg color + tech = m_LineRectCstColorTech; + else // use vertex buffer colors + tech = m_LineRectTech; + D3D10_TECHNIQUE_DESC techDesc; + tech->GetDesc(&techDesc); + for( UINT p=0; pGetPassByIndex(p)->Apply(0); + m_D3DDev->Draw(textObj->m_NbBgVerts, 0); + } + } + + // Draw text + if( textObj->m_NbTextVerts>=4 && textObj->m_TextVertexBuffer!=NULL ) + { + float color[4]; + Color32ToARGBf(_Color, color+3, color+0, color+1, color+2); + if( m_CstColorVar ) + m_CstColorVar->SetFloatVector(color); + + // Set the input layout + m_D3DDev->IASetInputLayout(m_TextVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CTextVtx); + UINT offset = 0; + m_D3DDev->IASetVertexBuffers(0, 1, &textObj->m_TextVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDev->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + // Render text + ID3D10EffectTechnique *tech; + if( _Color!=0 || !textObj->m_LineColors ) // use a constant color + tech = m_TextCstColorTech; + else // use vertex buffer colors + tech = m_TextTech; + D3D10_TECHNIQUE_DESC techDesc; + tech->GetDesc(&techDesc); + for( UINT p=0; pGetPassByIndex(p)->Apply(0); + m_D3DDev->Draw(textObj->m_NbTextVerts, 0); + } + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY) +{ + if( _Width>0 && _Height>0 ) + { + /* viewport changes screen coordinates, use scissor instead + D3D10_VIEWPORT vp; + vp.TopLeftX = _X0; + vp.TopLeftY = _Y0; + vp.Width = _Width; + vp.Height = _Height; + vp.MinDepth = 0; + vp.MaxDepth = 1; + m_D3DDev->RSSetViewports(1, &vp); + */ + + m_ViewportAndScissorRects[0].left = _X0; + m_ViewportAndScissorRects[0].right = _X0 + _Width - 1; + m_ViewportAndScissorRects[0].top = _Y0; + m_ViewportAndScissorRects[0].bottom = _Y0 + _Height - 1; + if( RectIsFull(m_ViewportAndScissorRects[1]) ) + m_D3DDev->RSSetScissorRects(1, m_ViewportAndScissorRects); // viewport clipping only + else + m_D3DDev->RSSetScissorRects(2, m_ViewportAndScissorRects); + + m_OffsetX = _X0 + _OffsetX; + m_OffsetY = _Y0 + _OffsetY; + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::RestoreViewport() +{ + //m_D3DDev->RSSetViewports(1, static_cast(m_ViewportInit)); + m_ViewportAndScissorRects[0] = FullRect; + m_D3DDev->RSSetScissorRects(1, m_ViewportAndScissorRects+1); // scissor only + + m_OffsetX = m_OffsetY = 0; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::SetScissor(int _X0, int _Y0, int _Width, int _Height) +{ + if( _Width>0 && _Height>0 ) + { + m_ViewportAndScissorRects[1].left = _X0 - 2; + m_ViewportAndScissorRects[1].right = _X0 + _Width - 3; + m_ViewportAndScissorRects[1].top = _Y0 - 1; + m_ViewportAndScissorRects[1].bottom = _Y0 + _Height - 1; + if( RectIsFull(m_ViewportAndScissorRects[0]) ) + m_D3DDev->RSSetScissorRects(1, m_ViewportAndScissorRects+1); // no viewport clipping + else + m_D3DDev->RSSetScissorRects(2, m_ViewportAndScissorRects); + } + else + { + m_ViewportAndScissorRects[1] = FullRect; + m_D3DDev->RSSetScissorRects(1, m_ViewportAndScissorRects); // apply viewport clipping only + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D10::DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode) +{ + assert(m_Drawing==true); + + if( _NumTriangles<=0 ) + return; + + if( m_TrianglesVertexBufferCount<3*_NumTriangles ) // force re-creation + { + if( m_TrianglesVertexBuffer!=NULL ) + m_TrianglesVertexBuffer->Release(); + m_TrianglesVertexBuffer = NULL; + m_TrianglesVertexBufferCount = 0; + } + + // DrawTriangles uses LineRect layout and technique + + if( m_TrianglesVertexBuffer==NULL ) + { + // Create triangles vertex buffer + D3D10_BUFFER_DESC bd; + bd.Usage = D3D10_USAGE_DYNAMIC; + bd.BindFlags = D3D10_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; + bd.MiscFlags = 0; + bd.ByteWidth = 3*_NumTriangles * sizeof(CLineRectVtx); + HRESULT hr = m_D3DDev->CreateBuffer(&bd, NULL, &m_TrianglesVertexBuffer); + if( SUCCEEDED(hr) ) + m_TrianglesVertexBufferCount = 3*_NumTriangles; + else + { + m_TrianglesVertexBuffer = NULL; + m_TrianglesVertexBufferCount = 0; + return; // Problem: cannot create triangles VB + } + } + assert( m_TrianglesVertexBufferCount>=3*_NumTriangles ); + assert( m_TrianglesVertexBuffer!=NULL ); + + CLineRectVtx *vertices = NULL; + HRESULT hr = m_TrianglesVertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void **)&vertices); + if( SUCCEEDED(hr) ) + { + // Fill vertex buffer + for( int i=0; i<3*_NumTriangles; ++ i ) + { + vertices[i].m_Pos[0] = ToNormScreenX(_Vertices[2*i+0] + m_OffsetX, m_WndWidth); + vertices[i].m_Pos[1] = ToNormScreenY(_Vertices[2*i+1] + m_OffsetY, m_WndHeight); + vertices[i].m_Pos[2] = 0; + vertices[i].m_Color = ToR8G8B8A8(_Colors[i]); + } + m_TrianglesVertexBuffer->Unmap(); + + // Reset shader globals + float offsetVec[4] = { 0, 0, 0, 0 }; + if( m_OffsetVar ) + m_OffsetVar->SetFloatVector(offsetVec); + float colorVec[4] = { 1, 1, 1, 1 }; + if( m_CstColorVar ) + m_CstColorVar->SetFloatVector(colorVec); + + // Set the input layout + m_D3DDev->IASetInputLayout(m_LineRectVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CLineRectVtx); + UINT offset = 0; + m_D3DDev->IASetVertexBuffers(0, 1, &m_TrianglesVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDev->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + if( _CullMode==CULL_CW ) + m_D3DDev->RSSetState(m_RasterStateCullCW); + else if( _CullMode==CULL_CCW ) + m_D3DDev->RSSetState(m_RasterStateCullCCW); + + // Render the triangles + D3D10_TECHNIQUE_DESC techDesc; + m_LineRectTech->GetDesc(&techDesc); + for(UINT p=0; pGetPassByIndex(p)->Apply(0); + m_D3DDev->Draw(3*_NumTriangles, 0); + } + + if( _CullMode==CULL_CW || _CullMode==CULL_CCW ) + m_D3DDev->RSSetState(m_RasterState); // restore default raster state + + // Unset vertex buffer + ID3D10Buffer *vb = NULL; + m_D3DDev->IASetVertexBuffers(0, 1, &vb, &stride, &offset); + } +} + +// --------------------------------------------------------------------------- diff --git a/AntTweakBar/src/TwDirect3D10.h b/AntTweakBar/src/TwDirect3D10.h new file mode 100644 index 0000000..cfb00a6 --- /dev/null +++ b/AntTweakBar/src/TwDirect3D10.h @@ -0,0 +1,108 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D10.h +// @brief Direct3D10 graph functions +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_DIRECT3D10_INCLUDED +#define ANT_TW_DIRECT3D10_INCLUDED + +#include "TwGraph.h" + +// --------------------------------------------------------------------------- + +class CTwGraphDirect3D10 : public ITwGraph +{ +public: + virtual int Init(); + virtual int Shut(); + virtual void BeginDraw(int _WndWidth, int _WndHeight); + virtual void EndDraw(); + virtual bool IsDrawing(); + virtual void Restore(); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) { DrawLine(_X0, _Y0, _X1, _Y1, _Color, _Color, _AntiAliased); } + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11); + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) { DrawRect(_X0, _Y0, _X1, _Y1, _Color, _Color, _Color, _Color); } + virtual void DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode); + + virtual void * NewTextObj(); + virtual void DeleteTextObj(void *_TextObj); + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth); + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor); + + virtual void ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY); + virtual void RestoreViewport(); + virtual void SetScissor(int _X0, int _Y0, int _Width, int _Height); + +protected: + struct ID3D10Device * m_D3DDev; + unsigned int m_D3DDevInitialRefCount; + bool m_Drawing; + const CTexFont * m_FontTex; + struct ID3D10ShaderResourceView *m_FontD3DTexRV; + int m_WndWidth; + int m_WndHeight; + int m_OffsetX; + int m_OffsetY; + void * m_ViewportInit; + RECT m_ViewportAndScissorRects[2]; + + struct CLineRectVtx + { + float m_Pos[3]; + color32 m_Color; + }; + struct CTextVtx + { + float m_Pos[3]; + color32 m_Color; + float m_UV[2]; + }; + + struct CTextObj + { + struct ID3D10Buffer * m_TextVertexBuffer; + struct ID3D10Buffer * m_BgVertexBuffer; + int m_NbTextVerts; + int m_NbBgVerts; + int m_TextVertexBufferSize; + int m_BgVertexBufferSize; + bool m_LineColors; + bool m_LineBgColors; + }; + + struct CState10 * m_State; + struct ID3D10DepthStencilState *m_DepthStencilState; + struct ID3D10BlendState * m_BlendState; + struct ID3D10RasterizerState * m_RasterState; + struct ID3D10RasterizerState * m_RasterStateAntialiased; + struct ID3D10RasterizerState * m_RasterStateCullCW; + struct ID3D10RasterizerState * m_RasterStateCullCCW; + struct ID3D10Effect * m_Effect; + struct ID3D10EffectTechnique* m_LineRectTech; + struct ID3D10EffectTechnique* m_LineRectCstColorTech; + struct ID3D10InputLayout * m_LineRectVertexLayout; + struct ID3D10Buffer * m_LineVertexBuffer; + struct ID3D10Buffer * m_RectVertexBuffer; + struct ID3D10Buffer * m_TrianglesVertexBuffer; + int m_TrianglesVertexBufferCount; + struct ID3D10EffectTechnique* m_TextTech; + struct ID3D10EffectTechnique* m_TextCstColorTech; + struct ID3D10InputLayout * m_TextVertexLayout; + struct ID3D10EffectShaderResourceVariable *m_FontD3DResVar; + struct ID3D10EffectVectorVariable *m_OffsetVar; + struct ID3D10EffectVectorVariable *m_CstColorVar; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_DIRECT3D10_INCLUDED diff --git a/AntTweakBar/src/TwDirect3D11.cpp b/AntTweakBar/src/TwDirect3D11.cpp new file mode 100644 index 0000000..24859c6 --- /dev/null +++ b/AntTweakBar/src/TwDirect3D11.cpp @@ -0,0 +1,1653 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D11.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "TwDirect3D11.h" +#include "TwMgr.h" +#include "TwColors.h" + +#include "d3d10vs2003.h" // Workaround to include D3D10.h and D3D11.h with VS2003 +#define D3D11_IGNORE_SDK_LAYERS // d3d11sdklayers.h may not exist +#include + + +using namespace std; + +const char *g_ErrCantLoadD3D11 = "Cannot load Direct3D11 library dynamically"; +const char *g_ErrCreateVS11 = "Direct3D11 vertex shader creation failed"; +const char *g_ErrCreatePS11 = "Direct3D11 pixel shader creation failed"; +const char *g_ErrCreateLayout11 = "Direct3D11 vertex layout creation failed"; +const char *g_ErrCreateBuffer11 = "Direct3D11 vertex buffer creation failed"; +const char *g_ErrCreateSampler11 = "Direct3D11 sampler state creation failed"; + +// --------------------------------------------------------------------------- +// Shaders : In order to avoid linkage with D3DX11 or D3DCompile libraries, +// vertex and pixel shaders are compiled offline in a pre-build step using +// the fxc.exe compiler (from the DirectX SDK Aug'09 or later) + +#ifdef _WIN64 +# ifdef _DEBUG +# include "debug64\TwDirect3D11_LineRectVS.h" +# include "debug64\TwDirect3D11_LineRectCstColorVS.h" +# include "debug64\TwDirect3D11_LineRectPS.h" +# include "debug64\TwDirect3D11_TextVS.h" +# include "debug64\TwDirect3D11_TextCstColorVS.h" +# include "debug64\TwDirect3D11_TextPS.h" +# else +# include "release64\TwDirect3D11_LineRectVS.h" +# include "release64\TwDirect3D11_LineRectCstColorVS.h" +# include "release64\TwDirect3D11_LineRectPS.h" +# include "release64\TwDirect3D11_TextVS.h" +# include "release64\TwDirect3D11_TextCstColorVS.h" +# include "release64\TwDirect3D11_TextPS.h" +# endif +#else +# ifdef _DEBUG +# include "debug32\TwDirect3D11_LineRectVS.h" +# include "debug32\TwDirect3D11_LineRectCstColorVS.h" +# include "debug32\TwDirect3D11_LineRectPS.h" +# include "debug32\TwDirect3D11_TextVS.h" +# include "debug32\TwDirect3D11_TextCstColorVS.h" +# include "debug32\TwDirect3D11_TextPS.h" +# else +# include "release32\TwDirect3D11_LineRectVS.h" +# include "release32\TwDirect3D11_LineRectCstColorVS.h" +# include "release32\TwDirect3D11_LineRectPS.h" +# include "release32\TwDirect3D11_TextVS.h" +# include "release32\TwDirect3D11_TextCstColorVS.h" +# include "release32\TwDirect3D11_TextPS.h" +# endif +#endif + +// --------------------------------------------------------------------------- + +const RECT FullRect = {0, 0, 16000, 16000}; +static bool RectIsFull(const RECT& r) { return r.left==FullRect.left && r.right==FullRect.right && r.top==FullRect.top && r.bottom==FullRect.bottom; } + +// --------------------------------------------------------------------------- + +static void BindFont(ID3D11Device *_Dev, const CTexFont *_Font, ID3D11Texture2D **_Tex, ID3D11ShaderResourceView **_TexRV) +{ + assert(_Font!=NULL); + *_Tex = NULL; + *_TexRV = NULL; + + int w = _Font->m_TexWidth; + int h = _Font->m_TexHeight; + color32 *font32 = new color32[w*h]; + color32 *p = font32; + for( int i=0; im_TexBytes[i]))<<24); + + D3D11_TEXTURE2D_DESC desc; + desc.Width = w; + desc.Height = h; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_IMMUTABLE; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + D3D11_SUBRESOURCE_DATA data; + data.pSysMem = font32; + data.SysMemPitch = w*sizeof(color32); + data.SysMemSlicePitch = 0; + + if( SUCCEEDED(_Dev->CreateTexture2D(&desc, &data, _Tex)) ) + _Dev->CreateShaderResourceView(*_Tex, NULL, _TexRV); + + delete[] font32; +} + +// --------------------------------------------------------------------------- + +static void UnbindFont(ID3D11Device *_Dev, ID3D11Texture2D *_Tex, ID3D11ShaderResourceView *_TexRV) +{ + (void)_Dev; + + if( _TexRV ) + { + ULONG rc = _TexRV->Release(); + assert( rc==0 ); (void)rc; + } + if( _Tex ) + { + ULONG rc = _Tex->Release(); + assert( rc==0 ); (void)rc; + } +} + +// --------------------------------------------------------------------------- + +struct CState11 +{ + ID3D11ComputeShader * m_CSShader; + ID3D11ClassInstance ** m_CSClassInstances; + UINT m_CSNumClassInstances; + ID3D11DomainShader * m_DSShader; + ID3D11ClassInstance ** m_DSClassInstances; + UINT m_DSNumClassInstances; + ID3D11GeometryShader * m_GSShader; + ID3D11ClassInstance ** m_GSClassInstances; + UINT m_GSNumClassInstances; + ID3D11HullShader * m_HSShader; + ID3D11ClassInstance ** m_HSClassInstances; + UINT m_HSNumClassInstances; + ID3D11PixelShader * m_PSShader; + ID3D11ClassInstance ** m_PSClassInstances; + UINT m_PSNumClassInstances; + ID3D11Buffer * m_PSConstantBuffer; // backup the first constant buffer only + ID3D11SamplerState * m_PSSampler; // backup the first sampler only + ID3D11ShaderResourceView*m_PSShaderResourceView; // backup the first shader resource only + ID3D11VertexShader * m_VSShader; + ID3D11ClassInstance ** m_VSClassInstances; + UINT m_VSNumClassInstances; + ID3D11Buffer * m_VSConstantBuffer; // backup the first constant buffer only + + ID3D11Buffer * m_IAIndexBuffer; + DXGI_FORMAT m_IAIndexBufferFormat; + UINT m_IAIndexBufferOffset; + ID3D11InputLayout * m_IAInputLayout; + D3D11_PRIMITIVE_TOPOLOGY m_IATopology; + ID3D11Buffer * m_IAVertexBuffer; // backup the first buffer only + UINT m_IAVertexBufferStride; + UINT m_IAVertexBufferOffset; + + ID3D11BlendState * m_OMBlendState; + FLOAT m_OMBlendFactor[4]; + UINT m_OMSampleMask; + ID3D11DepthStencilState*m_OMDepthStencilState; + UINT m_OMStencilRef; + + UINT m_RSScissorNumRects; + D3D11_RECT m_RSScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; + ID3D11RasterizerState * m_RSRasterizerState; + UINT m_RSNumViewports; + D3D11_VIEWPORT m_RSViewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; + + void Save(); + void Restore(); + void Release(); + CState11(ID3D11Device *_Dev, ID3D11DeviceContext *_ImmCtx); + ~CState11(); +private: + ID3D11Device * m_D3DDev; + ID3D11DeviceContext * m_D3DDevImmContext; +}; + +CState11::CState11(ID3D11Device *_Dev, ID3D11DeviceContext *_ImmCtx) +{ + ZeroMemory(this, sizeof(CState11)); + m_D3DDev = _Dev; + m_D3DDevImmContext = _ImmCtx; +} + +CState11::~CState11() +{ + Release(); + m_D3DDev = NULL; + m_D3DDevImmContext = NULL; +} + +void CState11::Save() +{ + // Release previous state if needed + Release(); + + // Save shaders. + // Not sure how xxGetShader works, D3D11 doc is evasive... Attempt: + // First call GetShader with NULL ClassInstances to get the number of class instances. + // Second, if not zero allocate an array of class instances and call GetShader again + // with this array ptr to get the class instances and release the shader since its + // ref count has been incremented a second time. + + m_CSShader = NULL; + m_CSClassInstances = NULL; + m_CSNumClassInstances = 0; + m_D3DDevImmContext->CSGetShader(&m_CSShader, NULL, &m_CSNumClassInstances); + if (m_CSNumClassInstances > 0) + { + m_CSClassInstances = new ID3D11ClassInstance*[m_CSNumClassInstances]; + for (UINT i = 0; i < m_CSNumClassInstances; i++) + m_CSClassInstances[i] = NULL; + m_D3DDevImmContext->CSGetShader(&m_CSShader, m_CSClassInstances, &m_CSNumClassInstances); + if (m_CSShader != NULL) + m_CSShader->Release(); + } + + m_DSShader = NULL; + m_DSClassInstances = NULL; + m_DSNumClassInstances = 0; + m_D3DDevImmContext->DSGetShader(&m_DSShader, NULL, &m_DSNumClassInstances); + if (m_DSNumClassInstances > 0) + { + m_DSClassInstances = new ID3D11ClassInstance*[m_DSNumClassInstances]; + for (UINT i = 0; i < m_DSNumClassInstances; i++) + m_DSClassInstances[i] = NULL; + m_D3DDevImmContext->DSGetShader(&m_DSShader, m_DSClassInstances, &m_DSNumClassInstances); + if (m_DSShader != NULL) + m_DSShader->Release(); + } + + m_GSShader = NULL; + m_GSClassInstances = NULL; + m_GSNumClassInstances = 0; + m_D3DDevImmContext->GSGetShader(&m_GSShader, NULL, &m_GSNumClassInstances); + if (m_GSNumClassInstances > 0) + { + m_GSClassInstances = new ID3D11ClassInstance*[m_GSNumClassInstances]; + for (UINT i = 0; i < m_GSNumClassInstances; i++) + m_GSClassInstances[i] = NULL; + m_D3DDevImmContext->GSGetShader(&m_GSShader, m_GSClassInstances, &m_GSNumClassInstances); + if (m_GSShader != NULL) + m_GSShader->Release(); + } + + m_HSShader = NULL; + m_HSClassInstances = NULL; + m_HSNumClassInstances = 0; + m_D3DDevImmContext->HSGetShader(&m_HSShader, NULL, &m_HSNumClassInstances); + if (m_HSNumClassInstances > 0) + { + m_HSClassInstances = new ID3D11ClassInstance*[m_HSNumClassInstances]; + for (UINT i = 0; i < m_HSNumClassInstances; i++) + m_HSClassInstances[i] = NULL; + m_D3DDevImmContext->HSGetShader(&m_HSShader, m_HSClassInstances, &m_HSNumClassInstances); + if (m_HSShader != NULL) + m_HSShader->Release(); + } + + m_PSShader = NULL; + m_PSClassInstances = NULL; + m_PSNumClassInstances = 0; + m_D3DDevImmContext->PSGetShader(&m_PSShader, NULL, &m_PSNumClassInstances); + if (m_PSNumClassInstances > 0) + { + m_PSClassInstances = new ID3D11ClassInstance*[m_PSNumClassInstances]; + for (UINT i = 0; i < m_PSNumClassInstances; i++) + m_PSClassInstances[i] = NULL; + m_D3DDevImmContext->PSGetShader(&m_PSShader, m_PSClassInstances, &m_PSNumClassInstances); + if (m_PSShader != NULL) + m_PSShader->Release(); + } + m_D3DDevImmContext->PSGetConstantBuffers(0, 1, &m_PSConstantBuffer); + m_D3DDevImmContext->PSGetSamplers(0, 1, &m_PSSampler); + m_D3DDevImmContext->PSGetShaderResources(0, 1, &m_PSShaderResourceView); + + m_VSShader = NULL; + m_VSClassInstances = NULL; + m_VSNumClassInstances = 0; + m_D3DDevImmContext->VSGetShader(&m_VSShader, NULL, &m_VSNumClassInstances); + if (m_VSNumClassInstances > 0) + { + m_VSClassInstances = new ID3D11ClassInstance*[m_VSNumClassInstances]; + for (UINT i = 0; i < m_VSNumClassInstances; i++) + m_VSClassInstances[i] = NULL; + m_D3DDevImmContext->VSGetShader(&m_VSShader, m_VSClassInstances, &m_VSNumClassInstances); + if (m_VSShader != NULL) + m_VSShader->Release(); + } + m_D3DDevImmContext->VSGetConstantBuffers(0, 1, &m_VSConstantBuffer); + + // Save Input-Assembler states + m_D3DDevImmContext->IAGetIndexBuffer(&m_IAIndexBuffer, &m_IAIndexBufferFormat, &m_IAIndexBufferOffset); + m_D3DDevImmContext->IAGetInputLayout(&m_IAInputLayout); + m_D3DDevImmContext->IAGetPrimitiveTopology(&m_IATopology); + m_D3DDevImmContext->IAGetVertexBuffers(0, 1, &m_IAVertexBuffer, &m_IAVertexBufferStride, &m_IAVertexBufferOffset); + + // Save Ouput-Merger states + m_D3DDevImmContext->OMGetBlendState(&m_OMBlendState, m_OMBlendFactor, &m_OMSampleMask); + m_D3DDevImmContext->OMGetDepthStencilState(&m_OMDepthStencilState, &m_OMStencilRef); + + // Save Rasterizer states + m_D3DDevImmContext->RSGetScissorRects(&m_RSScissorNumRects, NULL); + if (m_RSScissorNumRects > 0) + m_D3DDevImmContext->RSGetScissorRects(&m_RSScissorNumRects, m_RSScissorRects); + m_D3DDevImmContext->RSGetViewports(&m_RSNumViewports, NULL); + if (m_RSNumViewports > 0) + m_D3DDevImmContext->RSGetViewports(&m_RSNumViewports, m_RSViewports); + m_D3DDevImmContext->RSGetState(&m_RSRasterizerState); +} + +void CState11::Restore() +{ + // Restore shaders + m_D3DDevImmContext->CSSetShader(m_CSShader, m_CSClassInstances, m_CSNumClassInstances); + m_D3DDevImmContext->DSSetShader(m_DSShader, m_DSClassInstances, m_DSNumClassInstances); + m_D3DDevImmContext->GSSetShader(m_GSShader, m_GSClassInstances, m_GSNumClassInstances); + m_D3DDevImmContext->HSSetShader(m_HSShader, m_HSClassInstances, m_HSNumClassInstances); + m_D3DDevImmContext->PSSetShader(m_PSShader, m_PSClassInstances, m_PSNumClassInstances); + m_D3DDevImmContext->PSSetConstantBuffers(0, 1, &m_PSConstantBuffer); + m_D3DDevImmContext->PSSetSamplers(0, 1, &m_PSSampler); + m_D3DDevImmContext->PSSetShaderResources(0, 1, &m_PSShaderResourceView); + m_D3DDevImmContext->VSSetShader(m_VSShader, m_VSClassInstances, m_VSNumClassInstances); + m_D3DDevImmContext->VSSetConstantBuffers(0, 1, &m_VSConstantBuffer); + + // Restore Input-Assembler + m_D3DDevImmContext->IASetIndexBuffer(m_IAIndexBuffer, m_IAIndexBufferFormat, m_IAIndexBufferOffset); + m_D3DDevImmContext->IASetInputLayout(m_IAInputLayout); + m_D3DDevImmContext->IASetPrimitiveTopology(m_IATopology); + m_D3DDevImmContext->IASetVertexBuffers(0, 1, &m_IAVertexBuffer, &m_IAVertexBufferStride, &m_IAVertexBufferOffset); + + // Restore Ouput-Merger + m_D3DDevImmContext->OMSetBlendState(m_OMBlendState, m_OMBlendFactor, m_OMSampleMask); + m_D3DDevImmContext->OMSetDepthStencilState(m_OMDepthStencilState, m_OMStencilRef); + + // Restore Rasterizer states + m_D3DDevImmContext->RSSetScissorRects(m_RSScissorNumRects, m_RSScissorRects); + m_D3DDevImmContext->RSSetViewports(m_RSNumViewports, m_RSViewports); + m_D3DDevImmContext->RSSetState(m_RSRasterizerState); +} + +void CState11::Release() +{ + // Release stored shaders + + if (m_CSClassInstances != NULL) + { + for (UINT i = 0; i < m_CSNumClassInstances; i++) + if (m_CSClassInstances[i] != NULL) + m_CSClassInstances[i]->Release(); + delete[] m_CSClassInstances; + m_CSClassInstances = NULL; + m_CSNumClassInstances = 0; + } + if (m_CSShader != NULL) + { + m_CSShader->Release(); + m_CSShader = NULL; + } + + if (m_DSClassInstances != NULL) + { + for (UINT i = 0; i < m_DSNumClassInstances; i++) + if (m_DSClassInstances[i] != NULL) + m_DSClassInstances[i]->Release(); + delete[] m_DSClassInstances; + m_DSClassInstances = NULL; + m_DSNumClassInstances = 0; + } + if (m_DSShader != NULL) + { + m_DSShader->Release(); + m_DSShader = NULL; + } + + if (m_GSClassInstances != NULL) + { + for (UINT i = 0; i < m_GSNumClassInstances; i++) + if (m_GSClassInstances[i] != NULL) + m_GSClassInstances[i]->Release(); + delete[] m_GSClassInstances; + m_GSClassInstances = NULL; + m_GSNumClassInstances = 0; + } + if (m_GSShader != NULL) + { + m_GSShader->Release(); + m_GSShader = NULL; + } + + if (m_HSClassInstances != NULL) + { + for (UINT i = 0; i < m_HSNumClassInstances; i++) + if (m_HSClassInstances[i] != NULL) + m_HSClassInstances[i]->Release(); + delete[] m_HSClassInstances; + m_HSClassInstances = NULL; + m_HSNumClassInstances = 0; + } + if (m_HSShader != NULL) + { + m_HSShader->Release(); + m_HSShader = NULL; + } + + if (m_PSClassInstances != NULL) + { + for (UINT i = 0; i < m_PSNumClassInstances; i++) + if (m_PSClassInstances[i] != NULL) + m_PSClassInstances[i]->Release(); + delete[] m_PSClassInstances; + m_PSClassInstances = NULL; + m_PSNumClassInstances = 0; + } + if (m_PSShader != NULL) + { + m_PSShader->Release(); + m_PSShader = NULL; + } + if (m_PSConstantBuffer != NULL) + { + m_PSConstantBuffer->Release(); + m_PSConstantBuffer = NULL; + } + if (m_PSSampler != NULL) + { + m_PSSampler->Release(); + m_PSSampler = NULL; + } + if (m_PSShaderResourceView != NULL) + { + m_PSShaderResourceView->Release(); + m_PSShaderResourceView = NULL; + } + + if (m_VSClassInstances != NULL) + { + for (UINT i = 0; i < m_VSNumClassInstances; i++) + if (m_VSClassInstances[i] != NULL) + m_VSClassInstances[i]->Release(); + delete[] m_VSClassInstances; + m_VSClassInstances = NULL; + m_VSNumClassInstances = 0; + } + if (m_VSShader != NULL) + { + m_VSShader->Release(); + m_VSShader = NULL; + } + if (m_VSConstantBuffer != NULL) + { + m_VSConstantBuffer->Release(); + m_VSConstantBuffer = NULL; + } + + // Release Input-Assembler states + if (m_IAIndexBuffer != NULL) + { + m_IAIndexBuffer->Release(); + m_IAIndexBuffer = NULL; + } + if (m_IAInputLayout != NULL) + { + m_IAInputLayout->Release(); + m_IAInputLayout = 0; + } + if (m_IAVertexBuffer != NULL) + { + m_IAVertexBuffer->Release(); + m_IAVertexBuffer = NULL; + } + + // Release Output-Merger states + if (m_OMBlendState != NULL) + { + m_OMBlendState->Release(); + m_OMBlendState = NULL; + } + if (m_OMDepthStencilState != NULL) + { + m_OMDepthStencilState->Release(); + m_OMDepthStencilState = NULL; + } + + // Release Rasterizer state + if (m_RSRasterizerState != 0) + { + m_RSRasterizerState->Release(); + m_RSRasterizerState = NULL; + } + m_RSNumViewports = 0; + m_RSScissorNumRects = 0; +} + +// --------------------------------------------------------------------------- + +int CTwGraphDirect3D11::Init() +{ + assert(g_TwMgr!=NULL); + assert(g_TwMgr->m_Device!=NULL); + + m_D3DDev = static_cast(g_TwMgr->m_Device); + m_D3DDevInitialRefCount = m_D3DDev->AddRef() - 1; + m_D3DDev->GetImmediateContext(&m_D3DDevImmContext); + + m_Drawing = false; + m_OffsetX = m_OffsetY = 0; + m_ViewportInit = new D3D11_VIEWPORT; + m_FontTex = NULL; + m_FontD3DTex = NULL; + m_FontD3DTexRV = NULL; + m_WndWidth = 0; + m_WndHeight = 0; + m_State = NULL; + m_DepthStencilState = NULL; + m_BlendState = NULL; + m_RasterState = NULL; + m_RasterStateAntialiased = NULL; + m_RasterStateMultisample = NULL; + m_RasterStateCullCW = NULL; + m_RasterStateCullCCW = NULL; + m_LineRectVS = NULL; + m_LineRectCstColorVS = NULL; + m_LineRectPS = NULL; + m_LineRectVertexLayout = NULL; + m_TextVS = NULL; + m_TextCstColorVS = NULL; + m_TextPS = NULL; + m_TextVertexLayout = NULL; + m_LineVertexBuffer = NULL; + m_RectVertexBuffer = NULL; + m_TrianglesVertexBuffer = NULL; + m_TrianglesVertexBufferCount = 0; + m_ConstantBuffer = NULL; + m_SamplerState = NULL; + + // Allocate state object + m_State = new CState11(m_D3DDev, m_D3DDevImmContext); + + // Disable client shaders + m_D3DDevImmContext->CSSetShader(NULL, NULL, 0); + m_D3DDevImmContext->DSSetShader(NULL, NULL, 0); + m_D3DDevImmContext->GSSetShader(NULL, NULL, 0); + m_D3DDevImmContext->HSSetShader(NULL, NULL, 0); + m_D3DDevImmContext->PSSetShader(NULL, NULL, 0); + m_D3DDevImmContext->VSSetShader(NULL, NULL, 0); + + // Create shaders + HRESULT hr = m_D3DDev->CreateVertexShader(g_LineRectVS, sizeof(g_LineRectVS), NULL, &m_LineRectVS); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateVS11); + Shut(); + return 0; + } + hr = m_D3DDev->CreateVertexShader(g_LineRectCstColorVS, sizeof(g_LineRectCstColorVS), NULL, &m_LineRectCstColorVS); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateVS11); + Shut(); + return 0; + } + hr = m_D3DDev->CreatePixelShader(g_LineRectPS, sizeof(g_LineRectPS), NULL, &m_LineRectPS); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreatePS11); + Shut(); + return 0; + } + hr = m_D3DDev->CreateVertexShader(g_TextVS, sizeof(g_TextVS), NULL, &m_TextVS); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateVS11); + Shut(); + return 0; + } + hr = m_D3DDev->CreateVertexShader(g_TextCstColorVS, sizeof(g_TextCstColorVS), NULL, &m_TextCstColorVS); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateVS11); + Shut(); + return 0; + } + hr = m_D3DDev->CreatePixelShader(g_TextPS, sizeof(g_TextPS), NULL, &m_TextPS); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreatePS11); + Shut(); + return 0; + } + + // Create input layout for lines & rect + D3D11_INPUT_ELEMENT_DESC lineRectLayout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(CLineRectVtx, m_Color), D3D11_INPUT_PER_VERTEX_DATA, 0 } + }; + hr = m_D3DDev->CreateInputLayout(lineRectLayout, sizeof(lineRectLayout)/sizeof(lineRectLayout[0]), g_LineRectVS, sizeof(g_LineRectVS), &m_LineRectVertexLayout); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateLayout11); + Shut(); + return 0; + } + + // Create line vertex buffer + D3D11_BUFFER_DESC bd; + bd.Usage = D3D11_USAGE_DYNAMIC; + bd.ByteWidth = 2 * sizeof(CLineRectVtx); + bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + bd.MiscFlags = 0; + bd.StructureByteStride = 0; + hr = m_D3DDev->CreateBuffer(&bd, NULL, &m_LineVertexBuffer); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateBuffer11); + Shut(); + return 0; + } + + // Create rect vertex buffer + bd.ByteWidth = 4 * sizeof(CLineRectVtx); + hr = m_D3DDev->CreateBuffer(&bd, NULL, &m_RectVertexBuffer); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateBuffer11); + Shut(); + return 0; + } + + // Create constant buffer + bd.ByteWidth = sizeof(CConstants); + bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + hr = m_D3DDev->CreateBuffer(&bd, NULL, &m_ConstantBuffer); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateBuffer11); + Shut(); + return 0; + } + + // Create sampler + D3D11_SAMPLER_DESC sd; + sd.AddressU = sd.AddressV = sd.AddressW = D3D11_TEXTURE_ADDRESS_BORDER; + sd.BorderColor[0] = sd.BorderColor[1] = sd.BorderColor[2] = sd.BorderColor[3] = 0; + sd.ComparisonFunc = D3D11_COMPARISON_NEVER; + sd.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; + sd.MaxAnisotropy = 1; + sd.MaxLOD = sd.MinLOD = 0; + sd.MipLODBias = 0; + hr = m_D3DDev->CreateSamplerState(&sd, &m_SamplerState); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateSampler11); + Shut(); + return 0; + } + + // Create input layout for text + D3D11_INPUT_ELEMENT_DESC textLayout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(CTextVtx, m_Color), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(CTextVtx, m_UV), D3D11_INPUT_PER_VERTEX_DATA, 0 } + }; + hr = m_D3DDev->CreateInputLayout(textLayout, sizeof(textLayout)/sizeof(textLayout[0]), g_TextVS, sizeof(g_TextVS), &m_TextVertexLayout); + if( FAILED(hr) ) + { + g_TwMgr->SetLastError(g_ErrCreateLayout11); + Shut(); + return 0; + } + + // Create depth stencil state object + D3D11_DEPTH_STENCILOP_DESC od; + od.StencilFunc = D3D11_COMPARISON_ALWAYS; + od.StencilFailOp = D3D11_STENCIL_OP_KEEP; + od.StencilPassOp = D3D11_STENCIL_OP_KEEP; + od.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; + D3D11_DEPTH_STENCIL_DESC dsd; + dsd.DepthEnable = FALSE; + dsd.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + dsd.DepthFunc = D3D11_COMPARISON_ALWAYS; + dsd.StencilEnable = FALSE; + dsd.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; + dsd.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; + dsd.FrontFace = od; + dsd.BackFace = od; + m_D3DDev->CreateDepthStencilState(&dsd, &m_DepthStencilState); + + // Create blend state object + D3D11_BLEND_DESC bsd; + bsd.AlphaToCoverageEnable = FALSE; + bsd.IndependentBlendEnable = FALSE; + for(int i=0; i<8; ++i) + { + bsd.RenderTarget[i].BlendEnable = TRUE; + bsd.RenderTarget[i].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + bsd.RenderTarget[i].SrcBlend = D3D11_BLEND_SRC_ALPHA; + bsd.RenderTarget[i].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + bsd.RenderTarget[i].BlendOp = D3D11_BLEND_OP_ADD; + bsd.RenderTarget[i].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; + bsd.RenderTarget[i].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + bsd.RenderTarget[i].BlendOpAlpha = D3D11_BLEND_OP_ADD; + } + m_D3DDev->CreateBlendState(&bsd, &m_BlendState); + + // Create rasterizer state object + D3D11_RASTERIZER_DESC rd; + rd.FillMode = D3D11_FILL_SOLID; + rd.CullMode = D3D11_CULL_NONE; + rd.FrontCounterClockwise = true; + rd.DepthBias = false; + rd.DepthBiasClamp = 0; + rd.SlopeScaledDepthBias = 0; + rd.DepthClipEnable = false; + rd.ScissorEnable = true; + rd.MultisampleEnable = false; // do not allow msaa (fonts would be degraded) + rd.AntialiasedLineEnable = false; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterState); + + rd.AntialiasedLineEnable = true; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterStateAntialiased); + rd.AntialiasedLineEnable = false; + + // the three following raster states allow msaa + rd.MultisampleEnable = true; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterStateMultisample); + + rd.CullMode = D3D11_CULL_BACK; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterStateCullCW); + + rd.CullMode = D3D11_CULL_FRONT; + m_D3DDev->CreateRasterizerState(&rd, &m_RasterStateCullCCW); + + return 1; +} + +// --------------------------------------------------------------------------- + +int CTwGraphDirect3D11::Shut() +{ + assert(m_Drawing==false); + + UnbindFont(m_D3DDev, m_FontD3DTex, m_FontD3DTexRV); + m_FontD3DTex = NULL; + m_FontD3DTexRV = NULL; + if( m_State ) + { + delete m_State; + m_State = NULL; + } + if( m_ViewportInit ) + { + delete m_ViewportInit; + m_ViewportInit = NULL; + } + + if( m_DepthStencilState ) + { + ULONG rc = m_DepthStencilState->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_DepthStencilState = NULL; + } + if( m_BlendState ) + { + ULONG rc = m_BlendState->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_BlendState = NULL; + } + if( m_RasterState ) + { + ULONG rc = m_RasterState->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterState = NULL; + } + if( m_RasterStateAntialiased ) + { + ULONG rc = m_RasterStateAntialiased->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterStateAntialiased = NULL; + } + if( m_RasterStateMultisample ) + { + ULONG rc = m_RasterStateMultisample->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterStateMultisample = NULL; + } + if( m_RasterStateCullCW ) + { + ULONG rc = m_RasterStateCullCW->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterStateCullCW = NULL; + } + if( m_RasterStateCullCCW ) + { + ULONG rc = m_RasterStateCullCCW->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_RasterStateCullCCW = NULL; + } + if( m_SamplerState ) + { + ULONG rc = m_SamplerState->Release(); + //assert( rc==0 ); // no assert: the client can use a similar (then shared) state + (void)rc; + m_SamplerState = NULL; + } + + if( m_LineRectVS ) + { + ULONG rc = m_LineRectVS->Release(); + assert( rc==0 ); (void)rc; + m_LineRectVS = NULL; + } + if( m_LineRectCstColorVS ) + { + ULONG rc = m_LineRectCstColorVS->Release(); + assert( rc==0 ); (void)rc; + m_LineRectCstColorVS = NULL; + } + if( m_LineRectPS ) + { + ULONG rc = m_LineRectPS->Release(); + assert( rc==0 ); (void)rc; + m_LineRectPS = NULL; + } + if( m_TextVS ) + { + ULONG rc = m_TextVS->Release(); + assert( rc==0 ); (void)rc; + m_TextVS = NULL; + } + if( m_TextCstColorVS ) + { + ULONG rc = m_TextCstColorVS->Release(); + assert( rc==0 ); (void)rc; + m_TextCstColorVS = NULL; + } + if( m_TextPS ) + { + ULONG rc = m_TextPS->Release(); + assert( rc==0 ); (void)rc; + m_TextPS = NULL; + } + if( m_LineVertexBuffer ) + { + ULONG rc = m_LineVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + m_LineVertexBuffer = NULL; + } + if( m_RectVertexBuffer ) + { + ULONG rc = m_RectVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + m_RectVertexBuffer = NULL; + } + if( m_TrianglesVertexBuffer ) + { + ULONG rc = m_TrianglesVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + m_TrianglesVertexBuffer = NULL; + m_TrianglesVertexBufferCount = 0; + } + if( m_ConstantBuffer ) + { + ULONG rc = m_ConstantBuffer->Release(); + assert( rc==0 ); (void)rc; + m_ConstantBuffer = NULL; + } + if( m_LineRectVertexLayout ) + { + ULONG rc = m_LineRectVertexLayout->Release(); + assert( rc==0 ); (void)rc; + m_LineRectVertexLayout = NULL; + } + if( m_TextVertexLayout ) + { + ULONG rc = m_TextVertexLayout->Release(); + assert( rc==0 ); (void)rc; + m_TextVertexLayout = NULL; + } + + if( m_D3DDevImmContext ) + { + m_D3DDevImmContext->Release(); + m_D3DDevImmContext = NULL; + } + + if( m_D3DDev ) + { + //unsigned int rc = m_D3DDev->Release(); + //assert( m_D3DDevInitialRefCount==rc ); (void)rc; + m_D3DDev->Release(); + m_D3DDev = NULL; + } + + return 1; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::BeginDraw(int _WndWidth, int _WndHeight) +{ + assert(m_Drawing==false && _WndWidth>0 && _WndHeight>0); + m_Drawing = true; + + m_WndWidth = _WndWidth; + m_WndHeight = _WndHeight; + m_OffsetX = m_OffsetY = 0; + + // save client context state + m_State->Save(); + + // Setup the viewport + D3D11_VIEWPORT vp; + vp.Width = (FLOAT)_WndWidth; + vp.Height = (FLOAT)_WndHeight; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + m_D3DDevImmContext->RSSetViewports(1, &vp); + *static_cast(m_ViewportInit) = vp; + + m_ViewportAndScissorRects[0] = FullRect; + m_ViewportAndScissorRects[1] = FullRect; + m_D3DDevImmContext->RSSetScissorRects(1, m_ViewportAndScissorRects); + + m_D3DDevImmContext->RSSetState(m_RasterState); + + m_D3DDevImmContext->OMSetDepthStencilState(m_DepthStencilState, 0); + float blendFactors[4] = { 1, 1, 1, 1 }; + m_D3DDevImmContext->OMSetBlendState(m_BlendState, blendFactors, 0xffffffff); + + m_D3DDevImmContext->CSSetShader(NULL, NULL, 0); + m_D3DDevImmContext->DSSetShader(NULL, NULL, 0); + m_D3DDevImmContext->GSSetShader(NULL, NULL, 0); + m_D3DDevImmContext->HSSetShader(NULL, NULL, 0); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::EndDraw() +{ + m_D3DDevImmContext->RSSetState(NULL); + m_D3DDevImmContext->OMSetDepthStencilState(NULL, 0); + m_D3DDevImmContext->OMSetBlendState(NULL, NULL, 0xffffffff); + + assert(m_Drawing==true); + m_Drawing = false; + + // restore and release client context state + m_State->Restore(); + m_State->Release(); +} + +// --------------------------------------------------------------------------- + +bool CTwGraphDirect3D11::IsDrawing() +{ + return m_Drawing; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::Restore() +{ + if( m_State ) + m_State->Release(); + + UnbindFont(m_D3DDev, m_FontD3DTex, m_FontD3DTexRV); + m_FontD3DTexRV = NULL; + m_FontD3DTex = NULL; + + m_FontTex = NULL; +} + +// --------------------------------------------------------------------------- + +static inline float ToNormScreenX(int x, int wndWidth) +{ + return 2.0f*((float)x-0.5f)/wndWidth - 1.0f; +} + +static inline float ToNormScreenY(int y, int wndHeight) +{ + return 1.0f - 2.0f*((float)y-0.5f)/wndHeight; +} + +static inline color32 ToR8G8B8A8(color32 col) +{ + return (col & 0xff00ff00) | ((col>>16) & 0xff) | ((col<<16) & 0xff0000); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased) +{ + assert(m_Drawing==true); + + float x0 = ToNormScreenX(_X0 + m_OffsetX, m_WndWidth); + float y0 = ToNormScreenY(_Y0 + m_OffsetY, m_WndHeight); + float x1 = ToNormScreenX(_X1 + m_OffsetX, m_WndWidth); + float y1 = ToNormScreenY(_Y1 + m_OffsetY, m_WndHeight); + + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr = m_D3DDevImmContext->Map(m_LineVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if( SUCCEEDED(hr) ) + { + CLineRectVtx *vertices = (CLineRectVtx *)mappedResource.pData; + // Fill vertex buffer + vertices[0].m_Pos[0] = x0; + vertices[0].m_Pos[1] = y0; + vertices[0].m_Pos[2] = 0; + vertices[0].m_Color = ToR8G8B8A8(_Color0); + vertices[1].m_Pos[0] = x1; + vertices[1].m_Pos[1] = y1; + vertices[1].m_Pos[2] = 0; + vertices[1].m_Color = ToR8G8B8A8(_Color1); + + m_D3DDevImmContext->Unmap(m_LineVertexBuffer, 0); + + if( _AntiAliased ) + m_D3DDevImmContext->RSSetState(m_RasterStateAntialiased); + + // Reset shader constants + hr = m_D3DDevImmContext->Map(m_ConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if( SUCCEEDED(hr) ) + { + CConstants *constants = (CConstants *)mappedResource.pData; + constants->m_Offset[0] = 0; + constants->m_Offset[1] = 0; + constants->m_Offset[2] = 0; + constants->m_Offset[3] = 0; + constants->m_CstColor[0] = 1; + constants->m_CstColor[1] = 1; + constants->m_CstColor[2] = 1; + constants->m_CstColor[3] = 1; + + m_D3DDevImmContext->Unmap(m_ConstantBuffer, 0); + } + + // Set the input layout + m_D3DDevImmContext->IASetInputLayout(m_LineRectVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CLineRectVtx); + UINT offset = 0; + m_D3DDevImmContext->IASetVertexBuffers(0, 1, &m_LineVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDevImmContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST); + + // Render the line + m_D3DDevImmContext->VSSetConstantBuffers(0, 1, &m_ConstantBuffer); + m_D3DDevImmContext->VSSetShader(m_LineRectVS, NULL, 0); + m_D3DDevImmContext->PSSetShader(m_LineRectPS, NULL, 0); + m_D3DDevImmContext->Draw(2, 0); + + if( _AntiAliased ) + m_D3DDevImmContext->RSSetState(m_RasterState); // restore default raster state + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) +{ + assert(m_Drawing==true); + + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + ++_Y1; + else if(_Y0>_Y1) + ++_Y0; + + float x0 = ToNormScreenX(_X0 + m_OffsetX, m_WndWidth); + float y0 = ToNormScreenY(_Y0 + m_OffsetY, m_WndHeight); + float x1 = ToNormScreenX(_X1 + m_OffsetX, m_WndWidth); + float y1 = ToNormScreenY(_Y1 + m_OffsetY, m_WndHeight); + + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr = m_D3DDevImmContext->Map(m_RectVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if( SUCCEEDED(hr) ) + { + CLineRectVtx *vertices = (CLineRectVtx *)mappedResource.pData; + // Fill vertex buffer + vertices[0].m_Pos[0] = x0; + vertices[0].m_Pos[1] = y0; + vertices[0].m_Pos[2] = 0; + vertices[0].m_Color = ToR8G8B8A8(_Color00); + vertices[1].m_Pos[0] = x1; + vertices[1].m_Pos[1] = y0; + vertices[1].m_Pos[2] = 0; + vertices[1].m_Color = ToR8G8B8A8(_Color10); + vertices[2].m_Pos[0] = x0; + vertices[2].m_Pos[1] = y1; + vertices[2].m_Pos[2] = 0; + vertices[2].m_Color = ToR8G8B8A8(_Color01); + vertices[3].m_Pos[0] = x1; + vertices[3].m_Pos[1] = y1; + vertices[3].m_Pos[2] = 0; + vertices[3].m_Color = ToR8G8B8A8(_Color11); + + m_D3DDevImmContext->Unmap(m_RectVertexBuffer, 0); + + // Reset shader constants + hr = m_D3DDevImmContext->Map(m_ConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if( SUCCEEDED(hr) ) + { + CConstants *constants = (CConstants *)mappedResource.pData; + constants->m_Offset[0] = 0; + constants->m_Offset[1] = 0; + constants->m_Offset[2] = 0; + constants->m_Offset[3] = 0; + constants->m_CstColor[0] = 1; + constants->m_CstColor[1] = 1; + constants->m_CstColor[2] = 1; + constants->m_CstColor[3] = 1; + + m_D3DDevImmContext->Unmap(m_ConstantBuffer, 0); + } + + // Set the input layout + m_D3DDevImmContext->IASetInputLayout(m_LineRectVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CLineRectVtx); + UINT offset = 0; + m_D3DDevImmContext->IASetVertexBuffers(0, 1, &m_RectVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDevImmContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + + // Render the rect + m_D3DDevImmContext->VSSetConstantBuffers(0, 1, &m_ConstantBuffer); + m_D3DDevImmContext->VSSetShader(m_LineRectVS, NULL, 0); + m_D3DDevImmContext->PSSetShader(m_LineRectPS, NULL, 0); + m_D3DDevImmContext->Draw(4, 0); + } +} + +// --------------------------------------------------------------------------- + +void *CTwGraphDirect3D11::NewTextObj() +{ + CTextObj *textObj = new CTextObj; + memset(textObj, 0, sizeof(CTextObj)); + return textObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::DeleteTextObj(void *_TextObj) +{ + assert(_TextObj!=NULL); + CTextObj *textObj = static_cast(_TextObj); + if( textObj->m_TextVertexBuffer ) + textObj->m_TextVertexBuffer->Release(); + if( textObj->m_BgVertexBuffer ) + textObj->m_BgVertexBuffer->Release(); + memset(textObj, 0, sizeof(CTextObj)); + delete textObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + assert(_Font!=NULL); + + if( _Font != m_FontTex ) + { + UnbindFont(m_D3DDev, m_FontD3DTex, m_FontD3DTexRV); + BindFont(m_D3DDev, _Font, &m_FontD3DTex, &m_FontD3DTexRV); + m_FontTex = _Font; + } + + int nbTextVerts = 0; + int line; + for( line=0; line<_NbLines; ++line ) + nbTextVerts += 6 * (int)_TextLines[line].length(); + int nbBgVerts = 0; + if( _BgWidth>0 ) + nbBgVerts = _NbLines*6; + + CTextObj *textObj = static_cast(_TextObj); + textObj->m_LineColors = (_LineColors!=NULL); + textObj->m_LineBgColors = (_LineBgColors!=NULL); + + // (re)create text vertex buffer if needed, and map it + CTextVtx *textVerts = NULL; + if( nbTextVerts>0 ) + { + if( textObj->m_TextVertexBuffer==NULL || textObj->m_TextVertexBufferSizem_TextVertexBuffer!=NULL ) + { + ULONG rc = textObj->m_TextVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + textObj->m_TextVertexBuffer = NULL; + } + textObj->m_TextVertexBufferSize = nbTextVerts + 6*256; // add a reserve of 256 characters + D3D11_BUFFER_DESC bd; + bd.Usage = D3D11_USAGE_DYNAMIC; + bd.ByteWidth = textObj->m_TextVertexBufferSize * sizeof(CTextVtx); + bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + bd.MiscFlags = 0; + bd.StructureByteStride = 0; + m_D3DDev->CreateBuffer(&bd, NULL, &textObj->m_TextVertexBuffer); + } + + if( textObj->m_TextVertexBuffer!=NULL ) + { + D3D11_MAPPED_SUBRESOURCE mappedResource; + m_D3DDevImmContext->Map(textObj->m_TextVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + textVerts = (CTextVtx *)mappedResource.pData; + } + } + + // (re)create bg vertex buffer if needed, and map it + CLineRectVtx *bgVerts = NULL; + if( nbBgVerts>0 ) + { + if( textObj->m_BgVertexBuffer==NULL || textObj->m_BgVertexBufferSizem_BgVertexBuffer!=NULL ) + { + ULONG rc = textObj->m_BgVertexBuffer->Release(); + assert( rc==0 ); (void)rc; + textObj->m_BgVertexBuffer = NULL; + } + textObj->m_BgVertexBufferSize = nbBgVerts + 6*32; // add a reserve of 32 rects + D3D11_BUFFER_DESC bd; + bd.Usage = D3D11_USAGE_DYNAMIC; + bd.ByteWidth = textObj->m_BgVertexBufferSize * sizeof(CLineRectVtx); + bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + bd.MiscFlags = 0; + bd.StructureByteStride = 0; + m_D3DDev->CreateBuffer(&bd, NULL, &textObj->m_BgVertexBuffer); + } + + if( textObj->m_BgVertexBuffer!=NULL ) + { + D3D11_MAPPED_SUBRESOURCE mappedResource; + m_D3DDevImmContext->Map(textObj->m_BgVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + bgVerts = (CLineRectVtx *)mappedResource.pData; + } + } + + int x, x1, y, y1, i, len; + float px, px1, py, py1; + unsigned char ch; + const unsigned char *text; + color32 lineColor = COLOR32_RED; + CTextVtx vtx; + vtx.m_Pos[2] = 0; + CLineRectVtx bgVtx; + bgVtx.m_Pos[2] = 0; + int textVtxIndex = 0; + int bgVtxIndex = 0; + for( line=0; line<_NbLines; ++line ) + { + x = 0; + y = line * (_Font->m_CharHeight+_Sep); + y1 = y+_Font->m_CharHeight; + len = (int)_TextLines[line].length(); + text = (const unsigned char *)(_TextLines[line].c_str()); + if( _LineColors!=NULL ) + lineColor = ToR8G8B8A8(_LineColors[line]); + + if( textVerts!=NULL ) + for( i=0; im_CharWidth[ch]; + + px = ToNormScreenX(x, m_WndWidth); + py = ToNormScreenY(y, m_WndHeight); + px1 = ToNormScreenX(x1, m_WndWidth); + py1 = ToNormScreenY(y1, m_WndHeight); + + vtx.m_Color = lineColor; + + vtx.m_Pos[0] = px; + vtx.m_Pos[1] = py; + vtx.m_UV [0] = _Font->m_CharU0[ch]; + vtx.m_UV [1] = _Font->m_CharV0[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px1; + vtx.m_Pos[1] = py; + vtx.m_UV [0] = _Font->m_CharU1[ch]; + vtx.m_UV [1] = _Font->m_CharV0[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px; + vtx.m_Pos[1] = py1; + vtx.m_UV [0] = _Font->m_CharU0[ch]; + vtx.m_UV [1] = _Font->m_CharV1[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px1; + vtx.m_Pos[1] = py; + vtx.m_UV [0] = _Font->m_CharU1[ch]; + vtx.m_UV [1] = _Font->m_CharV0[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px1; + vtx.m_Pos[1] = py1; + vtx.m_UV [0] = _Font->m_CharU1[ch]; + vtx.m_UV [1] = _Font->m_CharV1[ch]; + textVerts[textVtxIndex++] = vtx; + + vtx.m_Pos[0] = px; + vtx.m_Pos[1] = py1; + vtx.m_UV [0] = _Font->m_CharU0[ch]; + vtx.m_UV [1] = _Font->m_CharV1[ch]; + textVerts[textVtxIndex++] = vtx; + + x = x1; + } + + if( _BgWidth>0 && bgVerts!=NULL ) + { + if( _LineBgColors!=NULL ) + bgVtx.m_Color = ToR8G8B8A8(_LineBgColors[line]); + else + bgVtx.m_Color = ToR8G8B8A8(COLOR32_BLACK); + + px = ToNormScreenX(-1, m_WndWidth); + py = ToNormScreenY(y, m_WndHeight); + px1 = ToNormScreenX(_BgWidth+1, m_WndWidth); + py1 = ToNormScreenY(y1, m_WndHeight); + + bgVtx.m_Pos[0] = px; + bgVtx.m_Pos[1] = py; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px1; + bgVtx.m_Pos[1] = py; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px; + bgVtx.m_Pos[1] = py1; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px1; + bgVtx.m_Pos[1] = py; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px1; + bgVtx.m_Pos[1] = py1; + bgVerts[bgVtxIndex++] = bgVtx; + + bgVtx.m_Pos[0] = px; + bgVtx.m_Pos[1] = py1; + bgVerts[bgVtxIndex++] = bgVtx; + } + } + assert( textVtxIndex==nbTextVerts ); + assert( bgVtxIndex==nbBgVerts ); + textObj->m_NbTextVerts = nbTextVerts; + textObj->m_NbBgVerts = nbBgVerts; + + if( textVerts!=NULL ) + m_D3DDevImmContext->Unmap(textObj->m_TextVertexBuffer, 0); + if( bgVerts!=NULL ) + m_D3DDevImmContext->Unmap(textObj->m_BgVertexBuffer, 0); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + CTextObj *textObj = static_cast(_TextObj); + float dx = 2.0f*(float)(_X + m_OffsetX)/m_WndWidth; + float dy = -2.0f*(float)(_Y + m_OffsetY)/m_WndHeight; + + // Draw background + if( textObj->m_NbBgVerts>=4 && textObj->m_BgVertexBuffer!=NULL ) + { + // Set offset and constant color + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr = m_D3DDevImmContext->Map(m_ConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if( SUCCEEDED(hr) ) + { + CConstants *constants = (CConstants *)mappedResource.pData; + constants->m_Offset[0] = dx; + constants->m_Offset[1] = dy; + constants->m_Offset[2] = 0; + constants->m_Offset[3] = 0; + Color32ToARGBf(_BgColor, constants->m_CstColor+3, constants->m_CstColor+0, constants->m_CstColor+1, constants->m_CstColor+2); + m_D3DDevImmContext->Unmap(m_ConstantBuffer, 0); + } + + // Set the input layout + m_D3DDevImmContext->IASetInputLayout(m_LineRectVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CLineRectVtx); + UINT offset = 0; + m_D3DDevImmContext->IASetVertexBuffers(0, 1, &textObj->m_BgVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDevImmContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + // Render the bg rectangles + m_D3DDevImmContext->VSSetConstantBuffers(0, 1, &m_ConstantBuffer); + if( _BgColor!=0 || !textObj->m_LineBgColors ) // use a constant bg color + m_D3DDevImmContext->VSSetShader(m_LineRectCstColorVS, NULL, 0); + else + m_D3DDevImmContext->VSSetShader(m_LineRectVS, NULL, 0); + m_D3DDevImmContext->PSSetSamplers(0, 1, &m_SamplerState); + m_D3DDevImmContext->PSSetShader(m_LineRectPS, NULL, 0); + m_D3DDevImmContext->Draw(textObj->m_NbBgVerts, 0); + } + + // Draw text + if( textObj->m_NbTextVerts>=4 && textObj->m_TextVertexBuffer!=NULL ) + { + // Set offset and constant color + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr = m_D3DDevImmContext->Map(m_ConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if( SUCCEEDED(hr) ) + { + CConstants *constants = (CConstants *)mappedResource.pData; + constants->m_Offset[0] = dx; + constants->m_Offset[1] = dy; + constants->m_Offset[2] = 0; + constants->m_Offset[3] = 0; + Color32ToARGBf(_Color, constants->m_CstColor+3, constants->m_CstColor+0, constants->m_CstColor+1, constants->m_CstColor+2); + m_D3DDevImmContext->Unmap(m_ConstantBuffer, 0); + } + + // Set the input layout + m_D3DDevImmContext->IASetInputLayout(m_TextVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CTextVtx); + UINT offset = 0; + m_D3DDevImmContext->IASetVertexBuffers(0, 1, &textObj->m_TextVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDevImmContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + // Render the text + m_D3DDevImmContext->VSSetConstantBuffers(0, 1, &m_ConstantBuffer); + if( _Color!=0 || !textObj->m_LineColors ) // use a constant color + m_D3DDevImmContext->VSSetShader(m_TextCstColorVS, NULL, 0); + else + m_D3DDevImmContext->VSSetShader(m_TextVS, NULL, 0); + m_D3DDevImmContext->PSSetShaderResources(0, 1, &m_FontD3DTexRV); + m_D3DDevImmContext->PSSetSamplers(0, 1, &m_SamplerState); + m_D3DDevImmContext->PSSetShader(m_TextPS, NULL, 0); + m_D3DDevImmContext->Draw(textObj->m_NbTextVerts, 0); + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY) +{ + if( _Width>0 && _Height>0 ) + { + /* viewport changes screen coordinates, use scissor instead + D3D11_VIEWPORT vp; + vp.TopLeftX = _X0; + vp.TopLeftY = _Y0; + vp.Width = _Width; + vp.Height = _Height; + vp.MinDepth = 0; + vp.MaxDepth = 1; + m_D3DDev->RSSetViewports(1, &vp); + */ + + m_ViewportAndScissorRects[0].left = _X0; + m_ViewportAndScissorRects[0].right = _X0 + _Width - 1; + m_ViewportAndScissorRects[0].top = _Y0; + m_ViewportAndScissorRects[0].bottom = _Y0 + _Height - 1; + if( RectIsFull(m_ViewportAndScissorRects[1]) ) + m_D3DDevImmContext->RSSetScissorRects(1, m_ViewportAndScissorRects); // viewport clipping only + else + m_D3DDevImmContext->RSSetScissorRects(2, m_ViewportAndScissorRects); + + m_OffsetX = _X0 + _OffsetX; + m_OffsetY = _Y0 + _OffsetY; + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::RestoreViewport() +{ + //m_D3DDevImmContext->RSSetViewports(1, static_cast(m_ViewportInit)); + m_ViewportAndScissorRects[0] = FullRect; + m_D3DDevImmContext->RSSetScissorRects(1, m_ViewportAndScissorRects+1); // scissor only + + m_OffsetX = m_OffsetY = 0; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::SetScissor(int _X0, int _Y0, int _Width, int _Height) +{ + if( _Width>0 && _Height>0 ) + { + m_ViewportAndScissorRects[1].left = _X0 - 2; + m_ViewportAndScissorRects[1].right = _X0 + _Width - 3; + m_ViewportAndScissorRects[1].top = _Y0 - 1; + m_ViewportAndScissorRects[1].bottom = _Y0 + _Height - 1; + if( RectIsFull(m_ViewportAndScissorRects[0]) ) + m_D3DDevImmContext->RSSetScissorRects(1, m_ViewportAndScissorRects+1); // no viewport clipping + else + m_D3DDevImmContext->RSSetScissorRects(2, m_ViewportAndScissorRects); + } + else + { + m_ViewportAndScissorRects[1] = FullRect; + m_D3DDevImmContext->RSSetScissorRects(1, m_ViewportAndScissorRects); // apply viewport clipping only + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D11::DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode) +{ + assert(m_Drawing==true); + + if( _NumTriangles<=0 ) + return; + + if( m_TrianglesVertexBufferCount<3*_NumTriangles ) // force re-creation + { + if( m_TrianglesVertexBuffer!=NULL ) + m_TrianglesVertexBuffer->Release(); + m_TrianglesVertexBuffer = NULL; + m_TrianglesVertexBufferCount = 0; + } + + // DrawTriangles uses LineRect layout and shaders + + if( m_TrianglesVertexBuffer==NULL ) + { + // Create triangles vertex buffer + D3D11_BUFFER_DESC bd; + bd.Usage = D3D11_USAGE_DYNAMIC; + bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + bd.MiscFlags = 0; + bd.ByteWidth = 3*_NumTriangles * sizeof(CLineRectVtx); + bd.StructureByteStride = 0; + HRESULT hr = m_D3DDev->CreateBuffer(&bd, NULL, &m_TrianglesVertexBuffer); + if( SUCCEEDED(hr) ) + m_TrianglesVertexBufferCount = 3*_NumTriangles; + else + { + m_TrianglesVertexBuffer = NULL; + m_TrianglesVertexBufferCount = 0; + return; // Problem: cannot create triangles VB + } + } + assert( m_TrianglesVertexBufferCount>=3*_NumTriangles ); + assert( m_TrianglesVertexBuffer!=NULL ); + + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr = m_D3DDevImmContext->Map(m_TrianglesVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if( SUCCEEDED(hr) ) + { + CLineRectVtx *vertices = (CLineRectVtx *)mappedResource.pData; + // Fill vertex buffer + for( int i=0; i<3*_NumTriangles; ++ i ) + { + vertices[i].m_Pos[0] = ToNormScreenX(_Vertices[2*i+0] + m_OffsetX, m_WndWidth); + vertices[i].m_Pos[1] = ToNormScreenY(_Vertices[2*i+1] + m_OffsetY, m_WndHeight); + vertices[i].m_Pos[2] = 0; + vertices[i].m_Color = ToR8G8B8A8(_Colors[i]); + } + m_D3DDevImmContext->Unmap(m_TrianglesVertexBuffer, 0); + + // Reset shader constants + hr = m_D3DDevImmContext->Map(m_ConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if( SUCCEEDED(hr) ) + { + CConstants *constants = (CConstants *)mappedResource.pData; + constants->m_Offset[0] = 0; + constants->m_Offset[1] = 0; + constants->m_Offset[2] = 0; + constants->m_Offset[3] = 0; + constants->m_CstColor[0] = 1; + constants->m_CstColor[1] = 1; + constants->m_CstColor[2] = 1; + constants->m_CstColor[3] = 1; + m_D3DDevImmContext->Unmap(m_ConstantBuffer, 0); + } + + // Set the input layout + m_D3DDevImmContext->IASetInputLayout(m_LineRectVertexLayout); + + // Set vertex buffer + UINT stride = sizeof(CLineRectVtx); + UINT offset = 0; + m_D3DDevImmContext->IASetVertexBuffers(0, 1, &m_TrianglesVertexBuffer, &stride, &offset); + + // Set primitive topology + m_D3DDevImmContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + if( _CullMode==CULL_CW ) + m_D3DDevImmContext->RSSetState(m_RasterStateCullCW); + else if( _CullMode==CULL_CCW ) + m_D3DDevImmContext->RSSetState(m_RasterStateCullCCW); + else + m_D3DDevImmContext->RSSetState(m_RasterStateMultisample); + + // Render the triangles + m_D3DDevImmContext->VSSetConstantBuffers(0, 1, &m_ConstantBuffer); + m_D3DDevImmContext->VSSetShader(m_LineRectVS, NULL, 0); + m_D3DDevImmContext->PSSetShader(m_LineRectPS, NULL, 0); + m_D3DDevImmContext->Draw(3*_NumTriangles, 0); + + m_D3DDevImmContext->RSSetState(m_RasterState); // restore default raster state + } +} + +// --------------------------------------------------------------------------- diff --git a/AntTweakBar/src/TwDirect3D11.h b/AntTweakBar/src/TwDirect3D11.h new file mode 100644 index 0000000..6d62f08 --- /dev/null +++ b/AntTweakBar/src/TwDirect3D11.h @@ -0,0 +1,117 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D11.h +// @brief Direct3D11 graphic functions +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_DIRECT3D11_INCLUDED +#define ANT_TW_DIRECT3D11_INCLUDED + +#include "TwGraph.h" + +// --------------------------------------------------------------------------- + +class CTwGraphDirect3D11 : public ITwGraph +{ +public: + virtual int Init(); + virtual int Shut(); + virtual void BeginDraw(int _WndWidth, int _WndHeight); + virtual void EndDraw(); + virtual bool IsDrawing(); + virtual void Restore(); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) { DrawLine(_X0, _Y0, _X1, _Y1, _Color, _Color, _AntiAliased); } + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11); + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) { DrawRect(_X0, _Y0, _X1, _Y1, _Color, _Color, _Color, _Color); } + virtual void DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode); + + virtual void * NewTextObj(); + virtual void DeleteTextObj(void *_TextObj); + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth); + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor); + + virtual void ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY); + virtual void RestoreViewport(); + virtual void SetScissor(int _X0, int _Y0, int _Width, int _Height); + +protected: + struct ID3D11Device * m_D3DDev; + struct ID3D11DeviceContext *m_D3DDevImmContext; + unsigned int m_D3DDevInitialRefCount; + bool m_Drawing; + const CTexFont * m_FontTex; + struct ID3D11Texture2D * m_FontD3DTex; + struct ID3D11ShaderResourceView *m_FontD3DTexRV; + int m_WndWidth; + int m_WndHeight; + int m_OffsetX; + int m_OffsetY; + void * m_ViewportInit; + RECT m_ViewportAndScissorRects[2]; + + struct CLineRectVtx + { + float m_Pos[3]; + color32 m_Color; + }; + struct CTextVtx + { + float m_Pos[3]; + color32 m_Color; + float m_UV[2]; + }; + struct CConstants + { + float m_Offset[4]; + float m_CstColor[4]; + }; + + struct CTextObj + { + struct ID3D11Buffer * m_TextVertexBuffer; + struct ID3D11Buffer * m_BgVertexBuffer; + int m_NbTextVerts; + int m_NbBgVerts; + int m_TextVertexBufferSize; + int m_BgVertexBufferSize; + bool m_LineColors; + bool m_LineBgColors; + }; + + struct CState11 * m_State; + struct ID3D11DepthStencilState *m_DepthStencilState; + struct ID3D11BlendState * m_BlendState; + struct ID3D11RasterizerState * m_RasterState; + struct ID3D11RasterizerState * m_RasterStateAntialiased; + struct ID3D11RasterizerState * m_RasterStateMultisample; + struct ID3D11RasterizerState * m_RasterStateCullCW; + struct ID3D11RasterizerState * m_RasterStateCullCCW; + + struct ID3D11VertexShader * m_LineRectVS; + struct ID3D11VertexShader * m_LineRectCstColorVS; + struct ID3D11PixelShader * m_LineRectPS; + struct ID3D11InputLayout * m_LineRectVertexLayout; + struct ID3D11VertexShader * m_TextVS; + struct ID3D11VertexShader * m_TextCstColorVS; + struct ID3D11PixelShader * m_TextPS; + struct ID3D11InputLayout * m_TextVertexLayout; + struct ID3D11Buffer * m_LineVertexBuffer; + struct ID3D11Buffer * m_RectVertexBuffer; + struct ID3D11Buffer * m_TrianglesVertexBuffer; + int m_TrianglesVertexBufferCount; + struct ID3D11Buffer * m_ConstantBuffer; + struct ID3D11SamplerState * m_SamplerState; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_DIRECT3D11_INCLUDED diff --git a/AntTweakBar/src/TwDirect3D11.hlsl b/AntTweakBar/src/TwDirect3D11.hlsl new file mode 100644 index 0000000..f334ace --- /dev/null +++ b/AntTweakBar/src/TwDirect3D11.hlsl @@ -0,0 +1,83 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D11.hlsl +// @author Philippe Decaudin +// @brief AntTweakBar shaders and techniques for Direct3D11 support +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + +float4 g_Offset : register(c0) = 0; +float4 g_CstColor : register(c1) = 1; + +// Shaders for lines and rectangles + +struct LineRectPSInput +{ + float4 Pos : SV_POSITION; + float4 Color : COLOR0; +}; + +LineRectPSInput LineRectVS(float4 pos : POSITION, float4 color : COLOR) +{ + LineRectPSInput ps; + ps.Pos = pos + g_Offset; + ps.Color = color; + return ps; +} + +LineRectPSInput LineRectCstColorVS(float4 pos : POSITION, float4 color : COLOR) +{ + LineRectPSInput ps; + ps.Pos = pos + g_Offset; + ps.Color = g_CstColor; + return ps; +} + +float4 LineRectPS(LineRectPSInput input) : SV_TARGET +{ + return input.Color; +} + +// Shaders for text + +Texture2D g_Font : register(t0); + +SamplerState g_FontSampler : register(s0) +{ + Filter = MIN_MAG_MIP_POINT; + AddressU = BORDER; + AddressV = BORDER; + BorderColor = float4(0, 0, 0, 0); +}; + +struct TextPSInput +{ + float4 Pos : SV_POSITION; + float4 Color : COLOR0; + float2 Tex : TEXCOORD0; +}; + +TextPSInput TextVS(float4 pos : POSITION, float4 color : COLOR, float2 tex : TEXCOORD0) +{ + TextPSInput ps; + ps.Pos = pos + g_Offset; + ps.Color = color; + ps.Tex = tex; + return ps; +} + +TextPSInput TextCstColorVS(float4 pos : POSITION, float4 color : COLOR, float2 tex : TEXCOORD0) +{ + TextPSInput ps; + ps.Pos = pos + g_Offset; + ps.Color = g_CstColor; + ps.Tex = tex; + return ps; +} + +float4 TextPS(TextPSInput input) : SV_TARGET +{ + return g_Font.Sample(g_FontSampler, input.Tex) * input.Color; +} diff --git a/AntTweakBar/src/TwDirect3D9.cpp b/AntTweakBar/src/TwDirect3D9.cpp new file mode 100644 index 0000000..f6b408c --- /dev/null +++ b/AntTweakBar/src/TwDirect3D9.cpp @@ -0,0 +1,640 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D9.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "TwDirect3D9.h" +#include "TwMgr.h" + +#include +#ifdef _DEBUG +// #include +// #pragma comment(lib, "dxerr9") +#endif // _DEBUG + + +using namespace std; + +const char *g_ErrCantLoadD3D9 = "Cannot load Direct3D9 library dynamically"; +const char *g_ErrCantUnloadD3D9 = "Cannot unload Direct3D9 library"; + + +// --------------------------------------------------------------------------- + +static IDirect3DTexture9 *BindFont(IDirect3DDevice9 *_Dev, const CTexFont *_Font) +{ + assert(_Font!=NULL); + + IDirect3DTexture9 *Tex = NULL; + IDirect3DDevice9Ex *D3DDev9Ex = NULL; + bool IsD3DDev9Ex = SUCCEEDED(_Dev->QueryInterface(__uuidof(IDirect3DDevice9Ex), (void **)&D3DDev9Ex)) && D3DDev9Ex != NULL; + HRESULT hr; + if (IsD3DDev9Ex) + { + hr = _Dev->CreateTexture(_Font->m_TexWidth, _Font->m_TexHeight, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &Tex, NULL); + D3DDev9Ex->Release(); + } + else + hr = _Dev->CreateTexture(_Font->m_TexWidth, _Font->m_TexHeight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &Tex, NULL); + if( FAILED(hr) ) + return NULL; + + D3DLOCKED_RECT r; + hr = Tex->LockRect(0, &r, NULL, 0); + if( SUCCEEDED(hr) ) + { + color32 *p = static_cast(r.pBits); + for( int i=0; i<_Font->m_TexWidth*_Font->m_TexHeight; ++i, ++p ) + *p = 0x00ffffff | (((color32)(_Font->m_TexBytes[i]))<<24); + Tex->UnlockRect(0); + } + return Tex; +} + +// --------------------------------------------------------------------------- + +static void UnbindFont(IDirect3DDevice9 *_Dev, IDirect3DTexture9 *_Tex) +{ + (void)_Dev; + + if( _Tex ) + _Tex->Release(); +} + +// --------------------------------------------------------------------------- + +struct CState +{ + IDirect3DStateBlock9 *m_StateBlock; + + // DeviceCaps (filled by constructor) + D3DCAPS9 m_Caps; + + void Save(); + void Restore(); + CState(IDirect3DDevice9 *_Dev); + ~CState(); +private: + IDirect3DDevice9 *m_D3DDev; +}; + +CState::CState(IDirect3DDevice9 *_Dev) +{ + ZeroMemory(this, sizeof(CState)); + m_D3DDev = _Dev; + + m_D3DDev->GetDeviceCaps(&m_Caps); +} + +CState::~CState() +{ + if( m_StateBlock ) + { + UINT rc = m_StateBlock->Release(); + assert( rc==0 ); (void)rc; + m_StateBlock = NULL; + } +} + +void CState::Save() +{ + if( !m_StateBlock && m_D3DDev ) + m_D3DDev->CreateStateBlock(D3DSBT_ALL, &m_StateBlock); + + if( m_StateBlock ) + m_StateBlock->Capture(); +} + +void CState::Restore() +{ + if( m_StateBlock ) + m_StateBlock->Apply(); +} + +// --------------------------------------------------------------------------- + +int CTwGraphDirect3D9::Init() +{ + assert(g_TwMgr->m_Device!=NULL); + + m_D3DDev = static_cast(g_TwMgr->m_Device); + m_Drawing = false; + m_FontTex = NULL; + m_FontD3DTex = NULL; + D3DDEVICE_CREATION_PARAMETERS cp; + m_D3DDev->GetCreationParameters(&cp); + m_PureDevice = ( cp.BehaviorFlags & D3DCREATE_PUREDEVICE ) ? true : false; + m_WndWidth = 0; + m_WndHeight = 0; + m_State = new CState(m_D3DDev); + m_ViewportInit = new D3DVIEWPORT9; + ZeroMemory(m_ViewportInit, sizeof(D3DVIEWPORT9)); + m_OffsetX = 0; + m_OffsetY = 0; + + return 1; +} + +// --------------------------------------------------------------------------- + +int CTwGraphDirect3D9::Shut() +{ + assert(m_Drawing==false); + + UnbindFont(m_D3DDev, m_FontD3DTex); + m_FontD3DTex = NULL; + delete m_State; + m_State = NULL; + m_D3DDev = NULL; + delete m_ViewportInit; + m_ViewportInit = NULL; + + return 1; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::BeginDraw(int _WndWidth, int _WndHeight) +{ + assert(m_Drawing==false && _WndWidth>0 && _WndHeight>0); + m_Drawing = true; + + m_WndWidth = _WndWidth; + m_WndHeight = _WndHeight; + m_OffsetX = 0; + m_OffsetY = 0; + + // save context + if( !m_PureDevice ) + m_State->Save(); + + if( m_WndWidth>0 && m_WndHeight>0 ) + { + D3DVIEWPORT9 Vp; + Vp.X = 0; + Vp.Y = 0; + Vp.Width = m_WndWidth; + Vp.Height = m_WndHeight; + Vp.MinZ = 0; + Vp.MaxZ = 1; + m_D3DDev->SetViewport(&Vp); + + //D3DMATRIX Transfo = { 2.0f/_WndWidth,0,0,0, 0,2.0f/_WndHeight,0,0, 0,0,-1,0, 0,0,0,1 }; + //m_D3DDev->SetTransform(D3DTS_PROJECTION, &Transfo); + } + m_D3DDev->GetViewport(static_cast(m_ViewportInit)); + // const D3DMATRIX id = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 }; + // m_D3DDev->SetTransform(D3DTS_VIEW, &id); + // m_D3DDev->SetTransform(D3DTS_WORLD, &id); + // m_D3DDev->SetTransform(D3DTS_TEXTURE0, &id); + + m_D3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + m_D3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + m_D3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + m_D3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + m_D3DDev->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); + m_D3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + m_D3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + m_D3DDev->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); + m_D3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); + m_D3DDev->SetRenderState(D3DRS_LASTPIXEL, FALSE); + m_D3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); + m_D3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE); + m_D3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, 0x0000000F); + m_D3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); + if( m_State->m_Caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND ) + m_D3DDev->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE); + //if( m_State->m_Caps.LineCaps & D3DLINECAPS_ANTIALIAS ) + m_D3DDev->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, FALSE); + + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + m_D3DDev->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); + m_D3DDev->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); + m_D3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); + m_D3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); + m_D3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); + m_D3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); + m_D3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE); + + m_D3DDev->SetVertexShader(NULL); + m_D3DDev->SetPixelShader(NULL); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::EndDraw() +{ + assert(m_Drawing==true); + m_Drawing = false; + + // restore context + if( !m_PureDevice ) + m_State->Restore(); +} + +// --------------------------------------------------------------------------- + +bool CTwGraphDirect3D9::IsDrawing() +{ + return m_Drawing; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::Restore() +{ + if( m_State ) + if( m_State->m_StateBlock ) + { + UINT rc = m_State->m_StateBlock->Release(); + assert( rc==0 ); (void)rc; + m_State->m_StateBlock = NULL; + } + + UnbindFont(m_D3DDev, m_FontD3DTex); + m_FontD3DTex = NULL; + + m_FontTex = NULL; +} + + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased) +{ + assert(m_Drawing==true); + + struct CVtx + { + float m_Pos[4]; + DWORD m_Color; + }; + CVtx p[2]; + + p[0].m_Pos[0] = (float)(_X0 + m_OffsetX); + p[0].m_Pos[1] = (float)(_Y0 + m_OffsetY); + p[0].m_Pos[2] = 0; + p[0].m_Pos[3] = 0; + p[0].m_Color = _Color0; + + p[1].m_Pos[0] = (float)(_X1 + m_OffsetX); + p[1].m_Pos[1] = (float)(_Y1 + m_OffsetY); + p[1].m_Pos[2] = 0; + p[1].m_Pos[3] = 0; + p[1].m_Color = _Color1; + + //if( m_State->m_Caps.LineCaps & D3DLINECAPS_ANTIALIAS ) + m_D3DDev->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, (_AntiAliased ? TRUE : FALSE)); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); + m_D3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 1, p, sizeof(CVtx)); + //if( m_State->m_Caps.LineCaps & D3DLINECAPS_ANTIALIAS ) + m_D3DDev->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, FALSE); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) +{ + assert(m_Drawing==true); + + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + ++_Y1; + else if(_Y0>_Y1) + ++_Y0; + + struct CVtx + { + float m_Pos[4]; + DWORD m_Color; + }; + CVtx p[4]; + + p[0].m_Pos[0] = (float)(_X1 + m_OffsetX); + p[0].m_Pos[1] = (float)(_Y0 + m_OffsetY); + p[0].m_Pos[2] = 0; + p[0].m_Pos[3] = 1; + p[0].m_Color = _Color10; + + p[1].m_Pos[0] = (float)(_X0 + m_OffsetX); + p[1].m_Pos[1] = (float)(_Y0 + m_OffsetY); + p[1].m_Pos[2] = 0; + p[1].m_Pos[3] = 1; + p[1].m_Color = _Color00; + + p[2].m_Pos[0] = (float)(_X1 + m_OffsetX); + p[2].m_Pos[1] = (float)(_Y1 + m_OffsetY); + p[2].m_Pos[2] = 0; + p[2].m_Pos[3] = 1; + p[2].m_Color = _Color11; + + p[3].m_Pos[0] = (float)(_X0 + m_OffsetX); + p[3].m_Pos[1] = (float)(_Y1 + m_OffsetY); + p[3].m_Pos[2] = 0; + p[3].m_Pos[3] = 1; + p[3].m_Color = _Color01; + + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); + m_D3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, p, sizeof(CVtx)); +} + +// --------------------------------------------------------------------------- + +void *CTwGraphDirect3D9::NewTextObj() +{ + return new CTextObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DeleteTextObj(void *_TextObj) +{ + assert(_TextObj!=NULL); + delete static_cast(_TextObj); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + assert(_Font!=NULL); + + if( _Font != m_FontTex ) + { + UnbindFont(m_D3DDev, m_FontD3DTex); + m_FontD3DTex = BindFont(m_D3DDev, _Font); + m_FontTex = _Font; + } + + CTextObj *TextObj = static_cast(_TextObj); + TextObj->m_TextVerts.resize(0); + TextObj->m_BgVerts.resize(0); + TextObj->m_LineColors = (_LineColors!=NULL); + TextObj->m_LineBgColors = (_LineBgColors!=NULL); + + int x, x1, y, y1, i, Len; + unsigned char ch; + const unsigned char *Text; + color32 LineColor = COLOR32_RED; + CTextVtx Vtx; + Vtx.m_Pos[2] = 0; + Vtx.m_Pos[3] = 1; + CBgVtx BgVtx; + BgVtx.m_Pos[2] = 0; + BgVtx.m_Pos[3] = 1; + for( int Line=0; Line<_NbLines; ++Line ) + { + x = 0; + y = Line * (_Font->m_CharHeight+_Sep); + y1 = y+_Font->m_CharHeight; + Len = (int)_TextLines[Line].length(); + Text = (const unsigned char *)(_TextLines[Line].c_str()); + if( _LineColors!=NULL ) + LineColor = _LineColors[Line]; + + for( i=0; im_CharWidth[ch]; + + Vtx.m_Color = LineColor; + + Vtx.m_Pos[0] = (float)x; + Vtx.m_Pos[1] = (float)y; + Vtx.m_UV [0] = _Font->m_CharU0[ch]; + Vtx.m_UV [1] = _Font->m_CharV0[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x1; + Vtx.m_Pos[1] = (float)y; + Vtx.m_UV [0] = _Font->m_CharU1[ch]; + Vtx.m_UV [1] = _Font->m_CharV0[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x; + Vtx.m_Pos[1] = (float)y1; + Vtx.m_UV [0] = _Font->m_CharU0[ch]; + Vtx.m_UV [1] = _Font->m_CharV1[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x1; + Vtx.m_Pos[1] = (float)y; + Vtx.m_UV [0] = _Font->m_CharU1[ch]; + Vtx.m_UV [1] = _Font->m_CharV0[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x1; + Vtx.m_Pos[1] = (float)y1; + Vtx.m_UV [0] = _Font->m_CharU1[ch]; + Vtx.m_UV [1] = _Font->m_CharV1[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x; + Vtx.m_Pos[1] = (float)y1; + Vtx.m_UV [0] = _Font->m_CharU0[ch]; + Vtx.m_UV [1] = _Font->m_CharV1[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + x = x1; + } + if( _BgWidth>0 ) + { + if( _LineBgColors!=NULL ) + BgVtx.m_Color = _LineBgColors[Line]; + else + BgVtx.m_Color = COLOR32_BLACK; + + BgVtx.m_Pos[0] = -1; + BgVtx.m_Pos[1] = (float)y; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = (float)(_BgWidth+1); + BgVtx.m_Pos[1] = (float)y; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = -1; + BgVtx.m_Pos[1] = (float)y1; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = (float)(_BgWidth+1); + BgVtx.m_Pos[1] = (float)y; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = (float)(_BgWidth+1); + BgVtx.m_Pos[1] = (float)y1; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = -1; + BgVtx.m_Pos[1] = (float)y1; + TextObj->m_BgVerts.push_back(BgVtx); + } + } + +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + CTextObj *TextObj = static_cast(_TextObj); + float x = (float)_X; + float y = (float)_Y; + + int i; + int nv = (int)TextObj->m_TextVerts.size(); + int nb = (int)TextObj->m_BgVerts.size(); + + if( nb>=4 ) + { + for( i=0; im_BgVerts[i].m_Pos[0] += x + m_OffsetX; + TextObj->m_BgVerts[i].m_Pos[1] += y + m_OffsetY; + if( _BgColor!=0 || !TextObj->m_LineBgColors ) + TextObj->m_BgVerts[i].m_Color = _BgColor; + } + + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); + m_D3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, nb/3, &(TextObj->m_BgVerts[0]), sizeof(CBgVtx)); + + for( i=0; im_BgVerts[i].m_Pos[0] -= x + m_OffsetX; + TextObj->m_BgVerts[i].m_Pos[1] -= y + m_OffsetY; + } + } + + if( nv>=4 ) + { + for( i=0; im_TextVerts[i].m_Pos[0] += x + m_OffsetX; + TextObj->m_TextVerts[i].m_Pos[1] += y + m_OffsetY; + } + if( _Color!=0 || !TextObj->m_LineColors ) + for( i=0; im_TextVerts[i].m_Color = _Color; + + m_D3DDev->SetTexture(0, m_FontD3DTex); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE2(0)); + m_D3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, nv/3, &(TextObj->m_TextVerts[0]), sizeof(CTextVtx)); + + for( i=0; im_TextVerts[i].m_Pos[0] -= x + m_OffsetX; + TextObj->m_TextVerts[i].m_Pos[1] -= y + m_OffsetY; + } + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY) +{ + if( _Width>0 && _Height>0 ) + { + D3DVIEWPORT9 Vp; + Vp.X = _X0; + Vp.Y = _Y0; + Vp.Width = _Width; + Vp.Height = _Height; + Vp.MinZ = 0; + Vp.MaxZ = 1; + m_D3DDev->SetViewport(&Vp); + + m_OffsetX = _X0 + _OffsetX; + m_OffsetY = _Y0 + _OffsetY - 1; + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::RestoreViewport() +{ + m_D3DDev->SetViewport(static_cast(m_ViewportInit)); + m_OffsetX = m_OffsetY = 0; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::SetScissor(int _X0, int _Y0, int _Width, int _Height) +{ + if( _Width>0 && _Height>0 ) + { + RECT Rect; + Rect.left = _X0 - 1; + Rect.right = Rect.left + _Width - 1; + Rect.top = _Y0; + Rect.bottom = Rect.top + _Height; + m_D3DDev->SetScissorRect(&Rect); + m_D3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); + } + else + m_D3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode) +{ + assert(m_Drawing==true); + + if( _NumTriangles<0 ) + return; + + DWORD prevCullMode = D3DCULL_NONE; + m_D3DDev->GetRenderState(D3DRS_CULLMODE, &prevCullMode); + if( _CullMode==CULL_CW ) + m_D3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); + else if( _CullMode==CULL_CCW ) + m_D3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); + else + m_D3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + + if( (int)m_TriVertices.size()<3*_NumTriangles ) + m_TriVertices.resize(3*_NumTriangles); + + for( int i=0; i<3*_NumTriangles; ++i ) + { + m_TriVertices[i].m_Pos[0] = (float)(_Vertices[2*i+0] + m_OffsetX); + m_TriVertices[i].m_Pos[1] = (float)(_Vertices[2*i+1] + m_OffsetY); + m_TriVertices[i].m_Pos[2] = 0; + m_TriVertices[i].m_Pos[3] = 1; + m_TriVertices[i].m_Color = _Colors[i]; + } + + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); + m_D3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, _NumTriangles, &(m_TriVertices[0]), sizeof(CTriVtx)); + + m_D3DDev->SetRenderState(D3DRS_CULLMODE, prevCullMode); +} + +// --------------------------------------------------------------------------- diff --git a/AntTweakBar/src/TwDirect3D9.h b/AntTweakBar/src/TwDirect3D9.h new file mode 100644 index 0000000..7e452e2 --- /dev/null +++ b/AntTweakBar/src/TwDirect3D9.h @@ -0,0 +1,90 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D9.h +// @brief Direct3D9 graph functions +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_DIRECT3D9_INCLUDED +#define ANT_TW_DIRECT3D9_INCLUDED + +#include "TwGraph.h" + +// --------------------------------------------------------------------------- + +class CTwGraphDirect3D9 : public ITwGraph +{ +public: + virtual int Init(); + virtual int Shut(); + virtual void BeginDraw(int _WndWidth, int _WndHeight); + virtual void EndDraw(); + virtual bool IsDrawing(); + virtual void Restore(); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) { DrawLine(_X0, _Y0, _X1, _Y1, _Color, _Color, _AntiAliased); } + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11); + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) { DrawRect(_X0, _Y0, _X1, _Y1, _Color, _Color, _Color, _Color); } + virtual void DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode); + + virtual void * NewTextObj(); + virtual void DeleteTextObj(void *_TextObj); + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth); + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor); + + virtual void ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY); + virtual void RestoreViewport(); + virtual void SetScissor(int _X0, int _Y0, int _Width, int _Height); + +protected: + struct IDirect3DDevice9 * m_D3DDev; + bool m_Drawing; + const CTexFont * m_FontTex; + struct IDirect3DTexture9 * m_FontD3DTex; + bool m_PureDevice; + int m_WndWidth; + int m_WndHeight; + void * m_ViewportInit; + int m_OffsetX; + int m_OffsetY; + + struct CTextVtx + { + float m_Pos[4]; + color32 m_Color; + float m_UV[2]; + }; + struct CBgVtx + { + float m_Pos[4]; + color32 m_Color; + }; + + struct CTextObj + { + std::vector m_TextVerts; + std::vector m_BgVerts; + bool m_LineColors; + bool m_LineBgColors; + }; + + struct CTriVtx + { + float m_Pos[4]; + DWORD m_Color; + }; + std::vector m_TriVertices; + + struct CState * m_State; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_DIRECT3D9_INCLUDED diff --git a/AntTweakBar/src/TwEventGLFW.c b/AntTweakBar/src/TwEventGLFW.c new file mode 100644 index 0000000..0b91a5f --- /dev/null +++ b/AntTweakBar/src/TwEventGLFW.c @@ -0,0 +1,212 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventGLFW.c +// @brief Helper: +// translate and re-send mouse and keyboard events +// from GLFW event callbacks to AntTweakBar +// +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + +// #include +#include "MiniGLFW.h" // a subset of GLFW.h needed to compile TwEventGLFW.c +// note: AntTweakBar.dll does not need to link with GLFW, +// it just needs some definitions for its helper functions. + +#include + + +int TW_CALL TwEventMouseButtonGLFW(int glfwButton, int glfwAction) +{ + int handled = 0; + TwMouseAction action = (glfwAction==GLFW_PRESS) ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED; + + if( glfwButton==GLFW_MOUSE_BUTTON_LEFT ) + handled = TwMouseButton(action, TW_MOUSE_LEFT); + else if( glfwButton==GLFW_MOUSE_BUTTON_RIGHT ) + handled = TwMouseButton(action, TW_MOUSE_RIGHT); + else if( glfwButton==GLFW_MOUSE_BUTTON_MIDDLE ) + handled = TwMouseButton(action, TW_MOUSE_MIDDLE); + + return handled; +} + + +int g_KMod = 0; + + +int TW_CALL TwEventKeyGLFW(int glfwKey, int glfwAction) +{ + int handled = 0; + + // Register of modifiers state + if( glfwAction==GLFW_PRESS ) + { + switch( glfwKey ) + { + case GLFW_KEY_LSHIFT: + case GLFW_KEY_RSHIFT: + g_KMod |= TW_KMOD_SHIFT; + break; + case GLFW_KEY_LCTRL: + case GLFW_KEY_RCTRL: + g_KMod |= TW_KMOD_CTRL; + break; + case GLFW_KEY_LALT: + case GLFW_KEY_RALT: + g_KMod |= TW_KMOD_ALT; + break; + } + } + else + { + switch( glfwKey ) + { + case GLFW_KEY_LSHIFT: + case GLFW_KEY_RSHIFT: + g_KMod &= ~TW_KMOD_SHIFT; + break; + case GLFW_KEY_LCTRL: + case GLFW_KEY_RCTRL: + g_KMod &= ~TW_KMOD_CTRL; + break; + case GLFW_KEY_LALT: + case GLFW_KEY_RALT: + g_KMod &= ~TW_KMOD_ALT; + break; + } + } + + // Process key pressed + if( glfwAction==GLFW_PRESS ) + { + int mod = g_KMod; + int testkp = ((mod&TW_KMOD_CTRL) || (mod&TW_KMOD_ALT)) ? 1 : 0; + + if( (mod&TW_KMOD_CTRL) && glfwKey>0 && glfwKey=GLFW_KEY_SPECIAL ) + { + int k = 0; + + if( glfwKey>=GLFW_KEY_F1 && glfwKey<=GLFW_KEY_F15 ) + k = TW_KEY_F1 + (glfwKey-GLFW_KEY_F1); + else if( testkp && glfwKey>=GLFW_KEY_KP_0 && glfwKey<=GLFW_KEY_KP_9 ) + k = '0' + (glfwKey-GLFW_KEY_KP_0); + else + { + switch( glfwKey ) + { + case GLFW_KEY_ESC: + k = TW_KEY_ESCAPE; + break; + case GLFW_KEY_UP: + k = TW_KEY_UP; + break; + case GLFW_KEY_DOWN: + k = TW_KEY_DOWN; + break; + case GLFW_KEY_LEFT: + k = TW_KEY_LEFT; + break; + case GLFW_KEY_RIGHT: + k = TW_KEY_RIGHT; + break; + case GLFW_KEY_TAB: + k = TW_KEY_TAB; + break; + case GLFW_KEY_ENTER: + k = TW_KEY_RETURN; + break; + case GLFW_KEY_BACKSPACE: + k = TW_KEY_BACKSPACE; + break; + case GLFW_KEY_INSERT: + k = TW_KEY_INSERT; + break; + case GLFW_KEY_DEL: + k = TW_KEY_DELETE; + break; + case GLFW_KEY_PAGEUP: + k = TW_KEY_PAGE_UP; + break; + case GLFW_KEY_PAGEDOWN: + k = TW_KEY_PAGE_DOWN; + break; + case GLFW_KEY_HOME: + k = TW_KEY_HOME; + break; + case GLFW_KEY_END: + k = TW_KEY_END; + break; + case GLFW_KEY_KP_ENTER: + k = TW_KEY_RETURN; + break; + case GLFW_KEY_KP_DIVIDE: + if( testkp ) + k = '/'; + break; + case GLFW_KEY_KP_MULTIPLY: + if( testkp ) + k = '*'; + break; + case GLFW_KEY_KP_SUBTRACT: + if( testkp ) + k = '-'; + break; + case GLFW_KEY_KP_ADD: + if( testkp ) + k = '+'; + break; + case GLFW_KEY_KP_DECIMAL: + if( testkp ) + k = '.'; + break; + case GLFW_KEY_KP_EQUAL: + if( testkp ) + k = '='; + break; + } + } + + if( k>0 ) + handled = TwKeyPressed(k, mod); + } + } + + return handled; +} + + +int TW_CALL TwEventCharGLFW(int glfwChar, int glfwAction) +{ + if( glfwAction==GLFW_PRESS && (glfwChar & 0xff00)==0 ) + return TwKeyPressed(glfwChar, g_KMod); + + return 0; +} + +// functions with __cdecl calling convension +TW_API int TW_CDECL_CALL TwEventMouseButtonGLFWcdecl(int glfwButton, int glfwAction) +{ + return TwEventMouseButtonGLFW(glfwButton, glfwAction); +} +TW_API int TW_CDECL_CALL TwEventKeyGLFWcdecl(int glfwKey, int glfwAction) +{ + return TwEventKeyGLFW(glfwKey, glfwAction); +} +TW_API int TW_CDECL_CALL TwEventCharGLFWcdecl(int glfwChar, int glfwAction) +{ + return TwEventCharGLFW(glfwChar, glfwAction); +} +TW_API int TW_CDECL_CALL TwEventMousePosGLFWcdecl(int mouseX, int mouseY) +{ + return TwMouseMotion(mouseX, mouseY); +} +TW_API int TW_CDECL_CALL TwEventMouseWheelGLFWcdecl(int wheelPos) +{ + return TwMouseWheel(wheelPos); +} diff --git a/AntTweakBar/src/TwEventGLUT.c b/AntTweakBar/src/TwEventGLUT.c new file mode 100644 index 0000000..a28e2c5 --- /dev/null +++ b/AntTweakBar/src/TwEventGLUT.c @@ -0,0 +1,150 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventGLUT.c +// @brief Helper: +// translate and re-send mouse and keyboard events +// from GLUT event callbacks to AntTweakBar +// +// @author Philippe Decaudin +// @date 2006/05/10 +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#define GLUT_NO_LIB_PRAGMA // we do not want to force linkage with glut +#ifdef _MSC_VER +# pragma warning(disable: 4505) // glut generates 'unreferenced function' warnings +# pragma warning(disable: 4100) // unreferenced parameter +#endif // _MSC_VER + +// #include +#include "MiniGLUT.h" // a subset of glut.h needed to compile TwEventGLUT.c +// note: AntTweakBar.dll does not need to link with GLUT, +// it just needs some definitions for its helper functions. + +#include + + +int TW_GLUT_CALL TwEventMouseButtonGLUT(int glutButton, int glutState, int mouseX, int mouseY) +{ + TwMouseAction action = (glutState==GLUT_DOWN) ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED; + + TwMouseMotion(mouseX, mouseY); + switch( glutButton ) + { + case GLUT_LEFT_BUTTON: + return TwMouseButton(action, TW_MOUSE_LEFT); + case GLUT_RIGHT_BUTTON: + return TwMouseButton(action, TW_MOUSE_RIGHT); + case GLUT_MIDDLE_BUTTON: + return TwMouseButton(action, TW_MOUSE_MIDDLE); + default: + return 0; + } +} + +int TW_GLUT_CALL TwEventMouseMotionGLUT(int mouseX, int mouseY) +{ + return TwMouseMotion(mouseX, mouseY); +} + + +// GLUT does not send modifiers state to 'Key' and 'Special' callbacks, +// and we cannot call glutGetModifiers here because we do not want to link +// AntTweakBar with glut, so the following function is used to store +// a pointer to the glutGetModifiers function of the calling application. +// It must be called at initialisation of the application. + +int (TW_CALL *g_GLUTGetModifiers)(void) = NULL; + +int TW_CALL TwGLUTModifiersFunc(int (TW_CALL *glutGetModifiersFunc)(void)) +{ + g_GLUTGetModifiers = glutGetModifiersFunc; + return (g_GLUTGetModifiers==NULL) ? 0 : 1; +} + + +int TW_GLUT_CALL TwEventKeyboardGLUT(unsigned char glutKey, int mouseX, int mouseY) +{ + int kmod = 0; + + if( g_GLUTGetModifiers!=NULL ) + { + int glutMod = g_GLUTGetModifiers(); + + if( glutMod&GLUT_ACTIVE_SHIFT ) + kmod |= TW_KMOD_SHIFT; + if( glutMod&GLUT_ACTIVE_CTRL ) + kmod |= TW_KMOD_CTRL; + if( glutMod&GLUT_ACTIVE_ALT ) + kmod |= TW_KMOD_ALT; + } + + if( (kmod&TW_KMOD_CTRL) && (glutKey>0 && glutKey<27) ) // CTRL special case + glutKey += 'a'-1; + + return TwKeyPressed((int)glutKey, kmod); +} + + +int TW_GLUT_CALL TwEventSpecialGLUT(int glutKey, int mouseX, int mouseY) +{ + int k = 0, kmod = 0; + + if( g_GLUTGetModifiers!=NULL ) + { + int glutMod = g_GLUTGetModifiers(); + + if( glutMod&GLUT_ACTIVE_SHIFT ) + kmod |= TW_KMOD_SHIFT; + if( glutMod&GLUT_ACTIVE_CTRL ) + kmod |= TW_KMOD_CTRL; + if( glutMod&GLUT_ACTIVE_ALT ) + kmod |= TW_KMOD_ALT; + } + + if( glutKey>=GLUT_KEY_F1 && glutKey<=GLUT_KEY_F12 ) + k = TW_KEY_F1 + (glutKey-GLUT_KEY_F1); + else + { + switch( glutKey ) + { + case GLUT_KEY_LEFT: + k = TW_KEY_LEFT; + break; + case GLUT_KEY_UP: + k = TW_KEY_UP; + break; + case GLUT_KEY_RIGHT: + k = TW_KEY_RIGHT; + break; + case GLUT_KEY_DOWN: + k = TW_KEY_DOWN; + break; + case GLUT_KEY_PAGE_UP: + k = TW_KEY_PAGE_UP; + break; + case GLUT_KEY_PAGE_DOWN: + k = TW_KEY_PAGE_DOWN; + break; + case GLUT_KEY_HOME: + k = TW_KEY_HOME; + break; + case GLUT_KEY_END: + k = TW_KEY_END; + break; + case GLUT_KEY_INSERT: + k = TW_KEY_INSERT; + break; + } + } + + if( k>0 && k + +int TW_CALL TwEventSDL12(const void *sdlEvent); // implemented in TwEventSDL12.c +int TW_CALL TwEventSDL13(const void *sdlEvent); // implmeneted in TwEventSDL13.c +#ifdef __cplusplus + extern "C" { int TW_CALL TwSetLastError(const char *staticErrorMessage); } +#else + int TW_CALL TwSetLastError(const char *staticErrorMessage); +#endif // __cplusplus + + +// TwEventSDL returns zero if msg has not been handled or the SDL version +// is not supported, and a non-zero value if it has been handled by the +// AntTweakBar library. +int TW_CALL TwEventSDL(const void *sdlEvent, unsigned char majorVersion, unsigned char minorVersion) +{ + if (majorVersion < 1 || (majorVersion == 1 && minorVersion < 2)) + { + static const char *g_ErrBadSDLVersion = "Unsupported SDL version"; + TwSetLastError(g_ErrBadSDLVersion); + return 0; + } + else if (majorVersion == 1 && minorVersion == 2) + return TwEventSDL12(sdlEvent); + else // if( majorVersion==1 && minorVersion==3 ) + return TwEventSDL13(sdlEvent); // will probably not work for version > 1.3, but give it a chance +} diff --git a/AntTweakBar/src/TwEventSDL12.c b/AntTweakBar/src/TwEventSDL12.c new file mode 100644 index 0000000..531f0c9 --- /dev/null +++ b/AntTweakBar/src/TwEventSDL12.c @@ -0,0 +1,71 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventSDL12.c +// @brief Helper: +// translate and re-send mouse and keyboard events +// from SDL 1.2 event loop to AntTweakBar +// +// @author Philippe Decaudin +// @date 2006/05/10 +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "MiniSDL12.h" // a subset of SDL.h needed to compile TwEventSDL12.c +// note: AntTweakBar.dll does not need to link with SDL, +// it just needs some definitions for its helper functions. + +#include + + +// TwEventSDL12 returns zero if msg has not been handled, +// and a non-zero value if it has been handled by the AntTweakBar library. +int TW_CALL TwEventSDL12(const void *sdlEvent) +{ + int handled = 0; + const SDL_Event *event = (const SDL_Event *)sdlEvent; + + if( event==NULL ) + return 0; + + switch( event->type ) + { + case SDL_KEYDOWN: + if( event->key.keysym.unicode!=0 && (event->key.keysym.unicode & 0xFF00)==0 ) + { + if( (event->key.keysym.unicode & 0xFF)<32 && (event->key.keysym.unicode & 0xFF)!=event->key.keysym.sym ) + handled = TwKeyPressed((event->key.keysym.unicode & 0xFF)+'a'-1, event->key.keysym.mod); + else + handled = TwKeyPressed(event->key.keysym.unicode & 0xFF, event->key.keysym.mod); + } + else + handled = TwKeyPressed(event->key.keysym.sym, event->key.keysym.mod); + break; + case SDL_MOUSEMOTION: + handled = TwMouseMotion(event->motion.x, event->motion.y); + break; + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + if( event->type==SDL_MOUSEBUTTONDOWN && (event->button.button==4 || event->button.button==5) ) // mouse wheel + { + static int s_WheelPos = 0; + if( event->button.button==4 ) + ++s_WheelPos; + else + --s_WheelPos; + handled = TwMouseWheel(s_WheelPos); + } + else + handled = TwMouseButton((event->type==SDL_MOUSEBUTTONUP)?TW_MOUSE_RELEASED:TW_MOUSE_PRESSED, (TwMouseButtonID)event->button.button); + break; + case SDL_VIDEORESIZE: + // tell the new size to TweakBar + TwWindowSize(event->resize.w, event->resize.h); + // do not set 'handled', SDL_VIDEORESIZE may be also processed by the calling application + break; + } + + return handled; +} diff --git a/AntTweakBar/src/TwEventSDL13.c b/AntTweakBar/src/TwEventSDL13.c new file mode 100644 index 0000000..f1ef767 --- /dev/null +++ b/AntTweakBar/src/TwEventSDL13.c @@ -0,0 +1,129 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventSDL13.c +// @brief Helper: +// translate and re-send mouse and keyboard events +// from SDL 1.3 event loop to AntTweakBar +// +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "MiniSDL13.h" // a subset of SDL.h needed to compile TwEventSDL.c +// note: AntTweakBar.dll does not need to link with SDL, +// it just needs some definitions for its helper functions. + +#include + + +// The way SDL handles keyboard events has changed between version 1.2 +// and 1.3. It is now more difficult to translate SDL keyboard events to +// AntTweakBar events. The following code is an attempt to do so, but +// it is rather complex and not always accurate (eg, CTRL+1 is not handled). +// If someone knows a better and more robust way to do the keyboard events +// translation, please let me know. + +// TwEventSDL returns zero if msg has not been handled, +// and a non-zero value if it has been handled by the AntTweakBar library. +int TW_CALL TwEventSDL13(const void *sdlEvent) +{ + int handled = 0; + static int s_KeyMod = 0; + const SDL_Event *event = (const SDL_Event *)sdlEvent; + + if( event==NULL ) + return 0; + + switch( event->type ) + { + case SDL_TEXTINPUT: + if( event->text.text[0]!=0 && event->text.text[1]==0 ) + { + if( s_KeyMod & TW_KMOD_CTRL && event->text.text[0]<32 ) + handled = TwKeyPressed(event->text.text[0]+'a'-1, s_KeyMod); + else + { + if (s_KeyMod & KMOD_RALT) + s_KeyMod &= ~KMOD_CTRL; + handled = TwKeyPressed(event->text.text[0], s_KeyMod); + } + } + s_KeyMod = 0; + break; + case SDL_KEYDOWN: + if( event->key.keysym.sym & SDLK_SCANCODE_MASK ) + { + int key = 0; + switch( event->key.keysym.sym ) + { + case SDLK_UP: + key = TW_KEY_UP; + break; + case SDLK_DOWN: + key = TW_KEY_DOWN; + break; + case SDLK_RIGHT: + key = TW_KEY_RIGHT; + break; + case SDLK_LEFT: + key = TW_KEY_LEFT; + break; + case SDLK_INSERT: + key = TW_KEY_INSERT; + break; + case SDLK_HOME: + key = TW_KEY_HOME; + break; + case SDLK_END: + key = TW_KEY_END; + break; + case SDLK_PAGEUP: + key = TW_KEY_PAGE_UP; + break; + case SDLK_PAGEDOWN: + key = TW_KEY_PAGE_DOWN; + break; + default: + if( event->key.keysym.sym>=SDLK_F1 && event->key.keysym.sym<=SDLK_F12 ) + key = event->key.keysym.sym + TW_KEY_F1 - SDLK_F1; + } + if( key!=0 ) + handled = TwKeyPressed(key, event->key.keysym.mod); + } + else if( event->key.keysym.mod & TW_KMOD_ALT ) + handled = TwKeyPressed(event->key.keysym.sym & 0xFF, event->key.keysym.mod); + else + s_KeyMod = event->key.keysym.mod; + break; + case SDL_KEYUP: + s_KeyMod = 0; + break; + case SDL_MOUSEMOTION: + handled = TwMouseMotion(event->motion.x, event->motion.y); + break; + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + if( event->type==SDL_MOUSEBUTTONDOWN && (event->button.button==4 || event->button.button==5) ) // mouse wheel + { + static int s_WheelPos = 0; + if( event->button.button==4 ) + ++s_WheelPos; + else + --s_WheelPos; + handled = TwMouseWheel(s_WheelPos); + } + else + handled = TwMouseButton((event->type==SDL_MOUSEBUTTONUP)?TW_MOUSE_RELEASED:TW_MOUSE_PRESSED, (TwMouseButtonID)event->button.button); + break; + case SDL_VIDEORESIZE: + // tell the new size to TweakBar + TwWindowSize(event->resize.w, event->resize.h); + // do not set 'handled', SDL_VIDEORESIZE may be also processed by the calling application + break; + } + + return handled; +} diff --git a/AntTweakBar/src/TwEventSFML.cpp b/AntTweakBar/src/TwEventSFML.cpp new file mode 100644 index 0000000..f83f81c --- /dev/null +++ b/AntTweakBar/src/TwEventSFML.cpp @@ -0,0 +1,173 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventSFML.cpp +// @brief Helper: +// translate and re-send mouse and keyboard events +// from SFML 1.6 event loop to AntTweakBar +// +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "MiniSFML16.h" // a subset of SFML 1.6 headers needed to compile TwEventSFML.cpp +// note: AntTweakBar.dll does not need to link with SFML, +// it just needs some definitions for its helper functions. + +#include + + +// TwEventSFML returns zero if msg has not been handled, +// and a non-zero value if it has been handled by the AntTweakBar library. +int TW_CALL TwEventSFML(const void *sfmlEvent, unsigned char majorVersion, unsigned char minorVersion) +{ + // Assume version 1.6 (will possibly not work for version != 1.6, but give it a chance) + /* + if (majorVersion > 1 || (majorVersion == 1 && minorVersion > 6) + { + static const char *g_ErrBadSFMLVersion = "Unsupported SFML version"; + TwSetLastError(g_ErrBadSFMLVersion); + return 0; + } + */ + (void)majorVersion, (void)minorVersion; + + int handled = 0; + const sf::Event *event = (const sf::Event *)sfmlEvent; + TwMouseAction mouseAction; + int key = 0; + static int s_KMod = 0; + static bool s_PreventTextHandling = false; + static int s_WheelPos = 0; + + if (event == NULL) + return 0; + + switch (event->Type) + { + case sf::Event::KeyPressed: + s_PreventTextHandling = false; + s_KMod = 0; + if (event->Key.Shift) s_KMod |= TW_KMOD_SHIFT; + if (event->Key.Alt) s_KMod |= TW_KMOD_ALT; + if (event->Key.Control) s_KMod |= TW_KMOD_CTRL; + key = 0; + switch (event->Key.Code) + { + case sf::Key::Escape: + key = TW_KEY_ESCAPE; + break; + case sf::Key::Return: + key = TW_KEY_RETURN; + break; + case sf::Key::Tab: + key = TW_KEY_TAB; + break; + case sf::Key::Back: + key = TW_KEY_BACKSPACE; + break; + case sf::Key::PageUp: + key = TW_KEY_PAGE_UP; + break; + case sf::Key::PageDown: + key = TW_KEY_PAGE_DOWN; + break; + case sf::Key::Up: + key = TW_KEY_UP; + break; + case sf::Key::Down: + key = TW_KEY_DOWN; + break; + case sf::Key::Left: + key = TW_KEY_LEFT; + break; + case sf::Key::Right: + key = TW_KEY_RIGHT; + break; + case sf::Key::End: + key = TW_KEY_END; + break; + case sf::Key::Home: + key = TW_KEY_HOME; + break; + case sf::Key::Insert: + key = TW_KEY_INSERT; + break; + case sf::Key::Delete: + key = TW_KEY_DELETE; + break; + case sf::Key::Space: + key = TW_KEY_SPACE; + break; + default: + if (event->Key.Code >= sf::Key::F1 && event->Key.Code <= sf::Key::F15) + key = TW_KEY_F1 + event->Key.Code - sf::Key::F1; + else if (s_KMod & TW_KMOD_ALT) + { + if (event->Key.Code >= sf::Key::A && event->Key.Code <= sf::Key::Z) + { + if (s_KMod & TW_KMOD_SHIFT) + key = 'A' + event->Key.Code - sf::Key::A; + else + key = 'a' + event->Key.Code - sf::Key::A; + } + } + } + if (key != 0) + { + handled = TwKeyPressed(key, s_KMod); + s_PreventTextHandling = true; + } + break; + case sf::Event::KeyReleased: + s_PreventTextHandling = false; + s_KMod = 0; + break; + case sf::Event::TextEntered: + if (!s_PreventTextHandling && event->Text.Unicode != 0 && (event->Text.Unicode & 0xFF00) == 0) + { + if ((event->Text.Unicode & 0xFF) < 32) // CTRL+letter + handled = TwKeyPressed((event->Text.Unicode & 0xFF)+'a'-1, TW_KMOD_CTRL|s_KMod); + else + handled = TwKeyPressed(event->Text.Unicode & 0xFF, 0); + } + s_PreventTextHandling = false; + break; + case sf::Event::MouseMoved: + handled = TwMouseMotion(event->MouseMove.X, event->MouseMove.Y); + break; + case sf::Event::MouseButtonPressed: + case sf::Event::MouseButtonReleased: + mouseAction = (event->Type==sf::Event::MouseButtonPressed) ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED; + switch (event->MouseButton.Button) + { + case sf::Mouse::Left: + handled = TwMouseButton(mouseAction, TW_MOUSE_LEFT); + break; + case sf::Mouse::Middle: + handled = TwMouseButton(mouseAction, TW_MOUSE_MIDDLE); + break; + case sf::Mouse::Right: + handled = TwMouseButton(mouseAction, TW_MOUSE_RIGHT); + break; + default: + break; + } + break; + case sf::Event::MouseWheelMoved: + s_WheelPos += event->MouseWheel.Delta; + handled = TwMouseWheel(s_WheelPos); + break; + case sf::Event::Resized: + // tell the new size to TweakBar + TwWindowSize(event->Size.Width, event->Size.Height); + // do not set 'handled', sf::Event::Resized may be also processed by the client application + break; + default: + break; + } + + return handled; +} diff --git a/AntTweakBar/src/TwEventWin.c b/AntTweakBar/src/TwEventWin.c new file mode 100644 index 0000000..c79a9f3 --- /dev/null +++ b/AntTweakBar/src/TwEventWin.c @@ -0,0 +1,256 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventWin.c +// @brief Helper: +// translate and re-send mouse and keyboard events +// from Windows message proc to AntTweakBar +// +// @author Philippe Decaudin +// @date 2006/05/10 +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + +#include + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include + +// Mouse wheel support +#if !defined WM_MOUSEWHEEL +# define WM_MOUSEWHEEL 0x020A +#endif // WM_MOUSEWHEEL +#if !defined WHEEL_DELTA +#define WHEEL_DELTA 120 +#endif // WHEEL_DELTA + +#ifdef _WIN64 +#define PARAM_INT __int64 +#else +#define PARAM_INT int +#endif + +// TwEventWin returns zero if msg has not been handled, +// and a non-zero value if it has been handled by the AntTweakBar library. +int TW_CALL TwEventWin(void *wnd, unsigned int msg, unsigned PARAM_INT _W64 wParam, PARAM_INT _W64 lParam) +{ + int handled = 0; + static unsigned PARAM_INT s_PrevKeyDown = 0; + static PARAM_INT s_PrevKeyDownMod = 0; + static int s_PrevKeyDownHandled = 0; + + switch( msg ) + { + case WM_MOUSEMOVE: + // send signed! mouse coordinates + handled = TwMouseMotion((short)LOWORD(lParam), (short)HIWORD(lParam)); + break; + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + SetCapture(wnd); + handled = TwMouseButton(TW_MOUSE_PRESSED, TW_MOUSE_LEFT); + break; + case WM_LBUTTONUP: + ReleaseCapture(); + handled = TwMouseButton(TW_MOUSE_RELEASED, TW_MOUSE_LEFT); + break; + case WM_MBUTTONDOWN: + case WM_MBUTTONDBLCLK: + SetCapture(wnd); + handled = TwMouseButton(TW_MOUSE_PRESSED, TW_MOUSE_MIDDLE); + break; + case WM_MBUTTONUP: + ReleaseCapture(); + handled = TwMouseButton(TW_MOUSE_RELEASED, TW_MOUSE_MIDDLE); + break; + case WM_RBUTTONDOWN: + case WM_RBUTTONDBLCLK: + SetCapture(wnd); + handled = TwMouseButton(TW_MOUSE_PRESSED, TW_MOUSE_RIGHT); + break; + case WM_RBUTTONUP: + ReleaseCapture(); + handled = TwMouseButton(TW_MOUSE_RELEASED, TW_MOUSE_RIGHT); + break; + case WM_CHAR: + case WM_SYSCHAR: + { + int key = (int)(wParam&0xff); + int kmod = 0; + + if( GetAsyncKeyState(VK_SHIFT)<0 ) + kmod |= TW_KMOD_SHIFT; + if( GetAsyncKeyState(VK_CONTROL)<0 ) + { + kmod |= TW_KMOD_CTRL; + if( key>0 && key<27 ) + key += 'a'-1; + } + if( GetAsyncKeyState(VK_MENU)<0 ) + kmod |= TW_KMOD_ALT; + if( key>0 && key<256 ) + handled = TwKeyPressed(key, kmod); + } + break; + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + { + int kmod = 0; + int testkp = 0; + int k = 0; + + if( GetAsyncKeyState(VK_SHIFT)<0 ) + kmod |= TW_KMOD_SHIFT; + if( GetAsyncKeyState(VK_CONTROL)<0 ) + { + kmod |= TW_KMOD_CTRL; + testkp = 1; + } + if( GetAsyncKeyState(VK_MENU)<0 ) + { + kmod |= TW_KMOD_ALT; + testkp = 1; + } + if( wParam>=VK_F1 && wParam<=VK_F15 ) + k = TW_KEY_F1 + ((int)wParam-VK_F1); + else if( testkp && wParam>=VK_NUMPAD0 && wParam<=VK_NUMPAD9 ) + k = '0' + ((int)wParam-VK_NUMPAD0); + else + { + switch( wParam ) + { + case VK_UP: + k = TW_KEY_UP; + break; + case VK_DOWN: + k = TW_KEY_DOWN; + break; + case VK_LEFT: + k = TW_KEY_LEFT; + break; + case VK_RIGHT: + k = TW_KEY_RIGHT; + break; + case VK_INSERT: + k = TW_KEY_INSERT; + break; + case VK_DELETE: + k = TW_KEY_DELETE; + break; + case VK_PRIOR: + k = TW_KEY_PAGE_UP; + break; + case VK_NEXT: + k = TW_KEY_PAGE_DOWN; + break; + case VK_HOME: + k = TW_KEY_HOME; + break; + case VK_END: + k = TW_KEY_END; + break; + case VK_DIVIDE: + if( testkp ) + k = '/'; + break; + case VK_MULTIPLY: + if( testkp ) + k = '*'; + break; + case VK_SUBTRACT: + if( testkp ) + k = '-'; + break; + case VK_ADD: + if( testkp ) + k = '+'; + break; + case VK_DECIMAL: + if( testkp ) + k = '.'; + break; + default: + if( (kmod&TW_KMOD_CTRL) && (kmod&TW_KMOD_ALT) ) + k = MapVirtualKey( (UINT)wParam, 2 ) & 0x0000FFFF; + } + } + if( k!=0 ) + handled = TwKeyPressed(k, kmod); + else + { + // if the key will be handled at next WM_CHAR report this event as handled + int key = (int)(wParam&0xff); + if( kmod&TW_KMOD_CTRL && key>0 && key<27 ) + key += 'a'-1; + if( key>0 && key<256 ) + handled = TwKeyTest(key, kmod); + } + s_PrevKeyDown = wParam; + s_PrevKeyDownMod = kmod; + s_PrevKeyDownHandled = handled; + } + break; + case WM_KEYUP: + case WM_SYSKEYUP: + { + int kmod = 0; + if( GetAsyncKeyState(VK_SHIFT)<0 ) + kmod |= TW_KMOD_SHIFT; + if( GetAsyncKeyState(VK_CONTROL)<0 ) + kmod |= TW_KMOD_CTRL; + if( GetAsyncKeyState(VK_MENU)<0 ) + kmod |= TW_KMOD_ALT; + // if the key has been handled at previous WM_KEYDOWN report this event as handled + if( s_PrevKeyDown==wParam && s_PrevKeyDownMod==kmod ) + handled = s_PrevKeyDownHandled; + else + { + // if the key would have been handled report this event as handled + int key = (int)(wParam&0xff); + if( kmod&TW_KMOD_CTRL && key>0 && key<27 ) + key += 'a'-1; + if( key>0 && key<256 ) + handled = TwKeyTest(key, kmod); + } + // reset previous keydown + s_PrevKeyDown = 0; + s_PrevKeyDownMod = 0; + s_PrevKeyDownHandled = 0; + } + break; + case WM_MOUSEWHEEL: + { + static int s_WheelPos = 0; + s_WheelPos += ((short)HIWORD(wParam))/WHEEL_DELTA; + handled = TwMouseWheel(s_WheelPos); + } + break; + case WM_SIZE: + // tell the new size to AntTweakBar + TwWindowSize(LOWORD(lParam), HIWORD(lParam)); + // do not set 'handled', WM_SIZE may be also processed by the calling application + break; + } + + if( handled ) + // Event has been handled by AntTweakBar, so we invalidate the window + // content to send a WM_PAINT which will redraw the tweak bar(s). + InvalidateRect(wnd, NULL, FALSE); + + return handled; +} + + +// For compatibility with AntTweakBar versions prior to 1.11 +#undef TwEventWin32 +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus +TW_EXPORT_API int TW_CALL TwEventWin32(void *wnd, unsigned int msg, unsigned int _W64 wParam, int _W64 lParam) +{ + return TwEventWin(wnd, msg, wParam, lParam); +} +#ifdef __cplusplus +} +#endif // __cplusplus diff --git a/AntTweakBar/src/TwEventX11.c b/AntTweakBar/src/TwEventX11.c new file mode 100644 index 0000000..a98290d --- /dev/null +++ b/AntTweakBar/src/TwEventX11.c @@ -0,0 +1,207 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventX11.c +// @brief Helper: +// translate and forward mouse and keyboard events +// from X11 to AntTweakBar +// +// @contrib Greg Popovitch +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + +#include +#include +#include +#include + +static int s_KMod = 0; +const int buff_sz = 80; + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +/* +static int _XKeyRelease(XEvent *event) +{ + KeySym keysym; + char buffer[buff_sz]; + + XLookupString((XKeyEvent *)event, buffer, buff_sz, &keysym, 0); + + switch (keysym) + { + case XK_Control_L: + case XK_Control_R: s_KMod &= ~TW_KMOD_CTRL; break; + + case XK_Shift_L: + case XK_Shift_R: s_KMod &= ~TW_KMOD_SHIFT; break; + + case XK_Alt_L: + case XK_Alt_R: s_KMod &= ~TW_KMOD_ALT; break; + } + return 0; +} +*/ + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +static int _XKeyPress(XEvent *event) +{ + int modifiers = 0; // modifiers sent to AntTweakBar + int k = 0; // key sent to AntTweakBar + KeySym keysym; + char buffer[buff_sz]; + + int num_char = XLookupString((XKeyEvent *)event, buffer, buff_sz, &keysym, 0); + + if (event->xkey.state & ControlMask) + modifiers |= TW_KMOD_CTRL; + if (event->xkey.state & ShiftMask) + modifiers |= TW_KMOD_SHIFT; + if (event->xkey.state & Mod1Mask) + modifiers |= TW_KMOD_ALT; + + switch (keysym) + { + case XK_Control_L: + case XK_Control_R: s_KMod |= TW_KMOD_CTRL; break; + + case XK_Shift_L: + case XK_Shift_R: s_KMod |= TW_KMOD_SHIFT; break; + + case XK_Alt_L: + case XK_Alt_R: s_KMod |= TW_KMOD_ALT; break; + + case XK_Escape: k = TW_KEY_ESCAPE; break; + case XK_Help: k = TW_KEY_F1; break; + case XK_F1: k = TW_KEY_F1; break; + case XK_F2: k = TW_KEY_F2; break; + case XK_F3: k = TW_KEY_F3; break; + case XK_F4: k = TW_KEY_F4; break; + case XK_F5: k = TW_KEY_F5; break; + case XK_F6: k = TW_KEY_F6; break; + case XK_F7: k = TW_KEY_F7; break; + case XK_F8: k = TW_KEY_F8; break; + case XK_F9: k = TW_KEY_F9; break; + case XK_F10: k = TW_KEY_F10; break; + case XK_F11: k = TW_KEY_F11; break; + case XK_F12: k = TW_KEY_F12; break; + case XK_Up: k = TW_KEY_UP; break; + case XK_Down: k = TW_KEY_DOWN; break; + case XK_Right: k = TW_KEY_RIGHT; break; + case XK_Left: k = TW_KEY_LEFT; break; + case XK_Return: k = TW_KEY_RETURN; break; + case XK_Insert: k = TW_KEY_INSERT; break; + case XK_Delete: k = TW_KEY_DELETE; break; + case XK_BackSpace: k = TW_KEY_BACKSPACE; break; + case XK_Home: k = TW_KEY_HOME; break; + case XK_Tab: k = TW_KEY_TAB; break; + case XK_End: k = TW_KEY_END; break; + +#ifdef XK_Enter + case XK_Enter: k = TW_KEY_RETURN; break; +#endif + +#ifdef XK_KP_Home + case XK_KP_Home: k = TW_KEY_HOME; break; + case XK_KP_End: k = TW_KEY_END; break; + case XK_KP_Delete: k = TW_KEY_DELETE; break; +#endif + +#ifdef XK_KP_Up + case XK_KP_Up: k = TW_KEY_UP; break; + case XK_KP_Down: k = TW_KEY_DOWN; break; + case XK_KP_Right: k = TW_KEY_RIGHT; break; + case XK_KP_Left: k = TW_KEY_LEFT; break; +#endif + +#ifdef XK_KP_Page_Up + case XK_KP_Page_Up: k = TW_KEY_PAGE_UP; break; + case XK_KP_Page_Down: k = TW_KEY_PAGE_DOWN; break; +#endif + +#ifdef XK_KP_Tab + case XK_KP_Tab: k = TW_KEY_TAB; break; +#endif + + default: + if (0) + { + // should we do that, or rely on the buffer (see code below) + if (keysym > 12 && keysym < 127) + k = keysym; + } + break; + } + + if (k == 0 && num_char) + { + int i, handled = 0; + for (i=0; i 0) ? TwKeyPressed(k, modifiers) : 0; +} + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +static int _XButtonEvent(XEvent *event) +{ + TwMouseAction action = (event->type == ButtonPress) ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED; + XButtonEvent *xbe = (XButtonEvent *)event; + return TwMouseButton(action, xbe->button); +} + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +static int _XConfigureEvent(XEvent *event) +{ + XConfigureEvent *xce = (XConfigureEvent *)event; + TwWindowSize(xce->width, xce->height); + return 0; +} + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +static int _XMotionEvent(XEvent *event) +{ + XMotionEvent *xme = (XMotionEvent *)event; + return TwMouseMotion(xme->x, xme->y); +} + +// ---------------------------------------------------------------------- +// ---------------------------------------------------------------------- +TW_API int TW_CDECL_CALL TwEventX11(void *xevent) +{ + XEvent *event = (XEvent *)xevent; + + switch (event->type) + { + case KeyPress: + return _XKeyPress(xevent); + + case KeyRelease: + return 0; // _XKeyRelease(xevent); + + case ButtonPress: + case ButtonRelease: + return _XButtonEvent(xevent); + + case MotionNotify: + return _XMotionEvent(xevent); + + case ConfigureNotify: + return _XConfigureEvent(xevent); + + default: + break; + } + return 0; +} + diff --git a/AntTweakBar/src/TwFonts.cpp b/AntTweakBar/src/TwFonts.cpp new file mode 100644 index 0000000..9476faa --- /dev/null +++ b/AntTweakBar/src/TwFonts.cpp @@ -0,0 +1,4898 @@ +// --------------------------------------------------------------------------- +// +// @file TwFonts.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "TwMgr.h" +#include "TwFonts.h" + +// Fedora patch: memset() +using std::memset; + +// --------------------------------------------------------------------------- + +CTexFont::CTexFont() +{ + for( int i=0; i<256; ++i ) + { + m_CharU0[i] = 0; + m_CharU1[i] = 0; + m_CharV0[i] = 0; + m_CharV1[i] = 0; + m_CharWidth[i] = 0; + } + m_TexWidth = 0; + m_TexHeight = 0; + m_TexBytes = NULL; + m_NbCharRead = 0; + m_CharHeight = 0; +} + +// --------------------------------------------------------------------------- + +CTexFont::~CTexFont() +{ + if( m_TexBytes ) + delete[] m_TexBytes; + m_TexBytes = NULL; + m_TexWidth = 0; + m_TexHeight = 0; + m_NbCharRead = 0; +} + +// --------------------------------------------------------------------------- + +static int NextPow2(int _n) +{ + int r = 1; + while( r<_n ) + r *= 2; + return r; +} + +// --------------------------------------------------------------------------- + +const char *g_ErrBadFontHeight = "Cannot determine font height while reading font bitmap (check first pixel column)"; + +CTexFont *TwGenerateFont(const unsigned char *_Bitmap, int _BmWidth, int _BmHeight, float _Scaling) +{ + // find height of the font + int x, y; + int h = 0, hh = 0; + int r, NbRow = 0; + for( y=0; y<_BmHeight; ++y ) + if( _Bitmap[y*_BmWidth]==0 ) + { + if( (hh<=0 && h<=0) || (h!=hh && h>0 && hh>0) ) + { + g_TwMgr->SetLastError(g_ErrBadFontHeight); + return NULL; + } + else if( h<=0 ) + h = hh; + else if( hh<=0 ) + break; + hh = 0; + ++NbRow; + } + else + ++hh; + + // find width and position of each character + int w = 0; + int x0[224], y0[224], x1[224], y1[224]; + int ch = 32; + int start; + for( r=0; rlmax ) + lmax = l; + } + // A little empty margin is added between chars to avoid artefact when antialiasing is on + const int MARGIN_X = 2; + const int MARGIN_Y = 2; + lmax += 16*MARGIN_X; + // - Second, build the texture + CTexFont *TexFont = new CTexFont; + TexFont->m_NbCharRead = ch-32; + TexFont->m_CharHeight = (int)(_Scaling*h+0.5f); + TexFont->m_TexWidth = NextPow2(lmax); + TexFont->m_TexHeight = NextPow2(14*(h+MARGIN_Y)); + TexFont->m_TexBytes = new unsigned char[TexFont->m_TexWidth*TexFont->m_TexHeight]; + memset(TexFont->m_TexBytes, 0, TexFont->m_TexWidth*TexFont->m_TexHeight); + int xx; + float du = 0.4f; + float dv = 0.4f; + assert( g_TwMgr!=NULL ); + if( g_TwMgr ) + { + if( g_TwMgr->m_GraphAPI==TW_OPENGL || g_TwMgr->m_GraphAPI==TW_OPENGL_CORE ) + { + du = 0; + dv = 0; + } + else // texel alignement for D3D + { + du = 0.5f; + dv = 0.5f; + } + } + float alpha; + for( r=0; r<14; ++r ) + for( xx=0, ch=r*16; ch<(r+1)*16; ++ch ) + if( y1[ch]-y0[ch]==h-1 ) + { + for( y=0; ym_TexBytes[(xx+x-x0[ch])+(r*(h+MARGIN_Y)+y)*TexFont->m_TexWidth] = (unsigned char)(alpha*256.0f); + } + TexFont->m_CharU0[ch+32] = (float(xx)+du)/float(TexFont->m_TexWidth); + xx += x1[ch]-x0[ch]+1; + TexFont->m_CharU1[ch+32] = (float(xx)+du)/float(TexFont->m_TexWidth); + TexFont->m_CharV0[ch+32] = (float(r*(h+MARGIN_Y))+dv)/float(TexFont->m_TexHeight); + TexFont->m_CharV1[ch+32] = (float(r*(h+MARGIN_Y)+h)+dv)/float(TexFont->m_TexHeight); + TexFont->m_CharWidth[ch+32] = (int)(_Scaling*(x1[ch]-x0[ch]+1)+0.5f); + xx += MARGIN_X; + } + + const unsigned char Undef = 127; // default character used as for undifined ones (having ascii codes from 0 to 31) + for( ch=0; ch<32; ++ch ) + { + TexFont->m_CharU0[ch] = TexFont->m_CharU0[Undef]; + TexFont->m_CharU1[ch] = TexFont->m_CharU1[Undef]; + TexFont->m_CharV0[ch] = TexFont->m_CharV0[Undef]; + TexFont->m_CharV1[ch] = TexFont->m_CharV1[Undef]; + TexFont->m_CharWidth[ch] = TexFont->m_CharWidth[Undef]/2; + } + + return TexFont; +} + +// --------------------------------------------------------------------------- + +CTexFont *g_DefaultSmallFont = NULL; +CTexFont *g_DefaultNormalFont = NULL; +CTexFont *g_DefaultLargeFont = NULL; +CTexFont *g_DefaultFixed1Font = NULL; + +// Small font +const int FONT0_BM_W = 211; +const int FONT0_BM_H = 84; +static const unsigned char s_Font0[] = +{ + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,255,0,255,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,0,0,255,255,0,0, + 0,255,0,0,0,0,255,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,255,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,255,0,0,255,255, + 255,0,0,255,255,255,0,0,0,0,0,255,0,255,255,255,255,0,0,255,255,0,0,255, + 255,255,255,0,0,255,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,0,0,0,255,0,255,0,255,0,0,0,255,0,0,255,0,0,255,255,255,255, + 0,255,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,255,0,0,255, + 255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255, + 255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,255,0,255,0,0,0,0,255,0,0,0,0,0, + 0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,255,0,0,0,0,0,0,255,255,255,255,255,255,255,0,255,0,0,0,255,0,0, + 255,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,255,0,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0, + 0,0,255,0,0,0,0,255,0,0,255,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0, + 255,0,0,255,0,255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,255,255,0,0,0,0,0,0, + 0,0,0,255,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,255,0,0,0,0,0,0,0,255,0,255,0,0,0,255,255,0,0,0,0,255,255,0, + 255,0,255,255,0,0,0,255,255,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0, + 0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255, + 0,0,0,0,255,0,0,0,255,255,0,0,255,0,0,255,0,255,255,255,0,0,255,255,255, + 0,0,0,0,255,0,0,0,255,255,0,0,0,255,255,255,0,0,255,0,0,255,0,0,0,255,255, + 0,0,0,255,255,255,255,255,255,0,0,0,0,255,255,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,255,0,0,0,0,0,255,255,255,255,255, + 255,0,0,0,255,255,0,0,0,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,255,0,0,0,0,0,255,0, + 0,255,0,0,255,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,255,255,255,255,255,0, + 0,0,255,0,255,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,255,0,0,255,0,255,0,0,255,255,0,0,0,255,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,255,0, + 0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0, + 0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255,0,0,255,0,0,0,255,255, + 0,0,0,255,255,255,255,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,255, + 255,255,255,0,0,0,0,255,0,0,0,255,255,0,0,0,255,255,0,0,255,0,0,255,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,255, + 255,0,0,255,255,255,0,255,255,255,255,0,255,255,255,0,0,0,0,0,255,0,255, + 255,255,0,0,0,255,255,0,0,255,0,0,0,0,0,255,255,0,0,0,255,255,0,0,0,255, + 0,0,255,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,0,127,0,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,0,127,0,127,127,0,127,127,127,0,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,0,127,127,127,0,127,0,127, + 127,127,0,127,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,127,0,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,255,255,255,0,0,0,0,0, + 255,255,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,255,255,255,255,0,0, + 0,255,255,255,255,255,0,255,255,255,255,255,0,0,0,255,255,255,0,0,255,0, + 0,0,0,255,0,255,255,255,0,0,255,255,0,255,0,0,0,255,0,255,0,0,0,255,255, + 0,0,0,255,255,0,255,0,0,0,0,255,0,0,0,255,255,255,0,0,0,255,255,255,255, + 0,0,0,0,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,255,255, + 255,255,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,255,0,0,255,0, + 255,0,0,255,0,255,0,0,0,255,0,255,255,255,255,0,255,0,0,255,0,0,0,0,255, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,0, + 0,0,255,0,0,0,0,255,255,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,255,0,0, + 0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255, + 0,0,255,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,0,255,255,0,0,0,255,255,0, + 255,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255, + 0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,255, + 0,255,0,0,0,255,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,255,0,0,255,255,0,255,0,0,255,0,0,255,0,0,255,0,0,255, + 0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0, + 0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,255,0,255,0,0,0,255,0,0, + 0,255,0,255,0,255,0,255,0,255,0,255,0,0,255,0,255,0,0,0,0,0,255,0,255,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,255,0,0, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,255,0,255,0,255,0,0,255,255, + 0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,255,0,255, + 0,0,255,0,0,255,0,0,255,255,255,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255, + 0,255,255,255,255,0,0,255,255,255,255,0,0,255,0,0,255,255,255,0,255,255, + 255,255,255,255,0,0,255,0,0,0,0,255,0,255,255,0,0,0,0,255,0,0,0,255,0,255, + 0,255,0,255,0,255,0,0,255,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,255,255,255,0,0,0,255,255,255,0,0,0,0,255,0,0,0,255, + 0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,255,0,255,0,255,0,0,255,255,0,0,0, + 0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,255,0,255,0,255,255,255, + 255,255,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255, + 0,255,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,255,0,255,0,0,0,255,255,0,255, + 0,0,0,0,0,255,0,255,255,255,255,0,0,255,0,0,0,0,0,255,0,255,0,255,0,0,0, + 0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,255, + 0,255,0,255,0,0,255,255,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255, + 0,0,255,255,255,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0,0,255,0, + 255,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0, + 0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0, + 255,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,0,0,255, + 0,0,255,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255, + 255,0,0,0,0,255,0,0,0,255,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,255,255,255,0,0,0,0,255, + 255,255,0,0,255,255,255,255,0,0,0,255,255,255,255,255,0,255,0,0,0,0,0,0, + 0,255,255,255,255,0,255,0,0,0,0,255,0,255,255,255,0,255,255,0,0,255,0,0, + 0,255,0,255,255,255,255,255,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,255, + 255,0,0,0,255,0,0,0,0,0,0,0,255,255,255,0,0,0,255,0,0,0,255,0,255,255,255, + 255,0,0,0,0,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,0,0,0,0,255,0,0, + 0,255,0,0,255,0,0,255,0,0,0,255,0,0,0,255,255,255,255,0,255,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 0,0,0,0,0,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0, + 127,127,127,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,127, + 0,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,0,127, + 127,0,127,127,127,0,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0, + 255,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,4,4, + 4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,4,4,4,4,12,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,255,255,0,0,255,255,255,0,0,0,255,255,0,0,255,255,255,0,0, + 255,255,0,0,255,255,255,0,255,255,255,0,255,255,255,0,0,255,0,255,255,0, + 255,0,0,255,0,255,0,255,255,255,0,255,255,0,0,255,255,255,0,0,0,255,255, + 0,0,255,255,255,0,0,0,255,255,255,0,255,0,255,255,255,255,0,255,255,0,255, + 0,0,255,0,255,0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,255,0,255,0,0,0,255, + 0,255,255,255,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 255,0,255,0,0,255,0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0, + 0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,255,0,0,255,0,255,0,0,255,0,0, + 255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,255,0, + 255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,0,255,0,0, + 255,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,255, + 0,0,255,0,0,255,4,4,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,0,0,0,0,255,255,255,0,255,0,0,255,0,255,0,0,0,255,0,0,255,0, + 255,255,255,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255, + 255,0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0, + 0,255,0,255,0,0,255,0,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,255, + 0,0,255,0,255,0,255,0,255,0,0,255,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0, + 0,0,255,0,0,0,0,255,0,255,0,0,255,255,0,0,0,255,255,4,255,255,0,4,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,255,0,0,255,0,255,0, + 0,255,0,255,0,0,0,255,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,255,0,255,0, + 0,255,0,255,0,0,255,0,255,0,255,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0, + 255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0, + 0,255,0,0,255,0,0,255,0,255,0,0,0,255,255,0,255,255,0,0,0,255,0,0,0,255, + 0,255,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,255,255,255,0,255,255,255,0,0,0,255,255,0,0,255,255,255,0,0,255,255,255, + 0,255,0,0,0,255,255,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255, + 0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,255,255,0,0,255,255,255,0,0,0,255, + 255,255,0,255,0,0,255,255,255,0,0,255,0,0,255,255,255,0,0,0,255,0,0,0,0, + 255,0,0,0,255,0,0,255,0,255,0,0,0,255,0,0,0,255,255,255,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,20,0,255,0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,4,4,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,0,127,127,127,127,0, + 127,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,0,127,127,0,127,127,127,127, + 0,127,0,127,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,0,127,127,0,127,127,127,0,127,127,0, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,0,127,127,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127, + 0,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 255,255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 0,255,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,255,255,255,0,0,255,255,255,255,255,255,255,0,0,0,0,0,0,255,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,255,255,0,0, + 0,255,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,255,255,255,255,255,255, + 0,0,255,255,255,255,255,255,255,0,255,255,255,255,0,0,255,255,255,255,255, + 255,255,0,0,255,255,255,255,255,255,255,0,255,0,0,255,255,0,255,0,0,255, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,255,255,0,255, + 0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0, + 0,255,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,255,255,255,255,0,255,255,255,255,255,0,0,0,0,0,0,255,0,0,255,0,255, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255,255, + 0,0,255,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 255,255,255,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0, + 0,255,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,255,0, + 255,255,255,0,255,0,0,0,255,255,0,255,255,0,0,0,255,0,0,0,0,0,255,0,255, + 255,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,255,255,0,255,0,255, + 255,0,255,255,0,0,0,255,255,255,0,0,255,0,0,255,0,0,0,255,255,255,255,0, + 0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,255,0, + 0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,255,255,255,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255, + 0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0, + 0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,255,255,255,0,255,255,255,255,255, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,255,255, + 255,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255, + 0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255,0,255,0,0,0,255, + 0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,255,255,255,0,0,255,255,255,255,255,255,255,0,0,255, + 0,255,0,0,0,0,255,0,255,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,0,255,255,0,255,255,0,0,255,255,255,255,0,0,0,0,0,0,255, + 255,255,255,255,255,255,0,0,255,255,255,255,255,255,255,0,255,255,255,255, + 0,0,255,255,255,255,255,255,255,0,0,255,255,255,255,255,255,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,255,255,0,0,0,0,0,255,255,0,255,255,255,0,0,255,255,255,255,255, + 255,255,0,255,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0, + 127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,0,127,0,127, + 127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 0,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,0,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,255,0,0,0,0,0,0,0,255,0, + 0,0,255,0,255,0,0,255,255,255,0,0,255,0,255,0,0,0,255,255,255,255,0,0,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,255,255,0,0,255,0,0,0,0,0,0, + 0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,255, + 0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0,255,255,255,0,0,255,0,0,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0, + 0,255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,255, + 0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255, + 0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,255,0,0,0,0,0,0,255,255,0,255,0,0, + 0,0,0,255,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,255,0,0,255,255,255,0,0,255,0,0,0,0,255,255,255,0,0,0,255, + 0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,255,255,0,255, + 0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,0,0,255,0,0,0,0,0, + 0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,255, + 255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,255,0,255,0,0,0,255, + 0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,255,0,255,0,255,0,0,255,255,255,0,0,0,255,0,255, + 0,0,0,0,255,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0, + 255,255,0,255,0,255,0,0,0,255,255,255,255,255,0,0,0,0,255,0,255,0,0,255, + 0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,255,255,255,0,255,255, + 0,0,0,0,0,0,255,0,0,255,0,255,255,0,255,0,0,255,0,0,0,0,0,0,0,255,255,255, + 0,255,255,0,0,0,255,0,255,0,0,255,255,0,0,255,255,0,0,0,255,0,255,0,255, + 255,0,0,255,255,0,255,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 255,0,255,0,255,0,0,0,255,0,0,0,0,255,255,255,0,0,0,255,255,255,0,0,0,0, + 255,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0, + 0,0,0,255,0,255,255,0,255,0,255,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,255,0,255,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,255,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,255,0,255,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 255,255,255,0,0,0,0,0,0,255,0,0,255,255,0,0,255,0,0,0,0,0,255,0,255,0,0, + 0,0,0,0,255,0,0,0,0,255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,255,255,255,255,0,0,0,255, + 0,0,0,255,0,0,0,0,255,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,255,0,0,255,255,255,0,255,255,255,255,0,0,0,0,0,0,0,0,0,255,0,0,0, + 255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,255,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,255, + 255,0,0,255,0,0,0,0,255,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0, + 0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,127,127,127,0,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,0,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,0,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127, + 127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255,0,255,255,0,0,0,255,0,0,255, + 0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,0,0,255,0,0,255,0,255,0,255, + 0,255,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,255,0,0,0,0,255,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,255, + 0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,127,0,0,255,255, + 0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,255,255, + 0,0,0,0,0,255,255,0,0,0,0,0,255,255,255,255,255,0,0,0,255,255,255,0,0,255, + 255,255,255,255,0,255,255,255,255,255,0,255,255,255,255,255,0,255,255,255, + 255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255, + 255,255,0,0,0,255,0,0,0,0,255,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0, + 0,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0, + 255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0, + 255,0,127,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,255, + 255,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,255,0,255,0,0,0,0,0,255, + 0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,255,0,0,0,255,0, + 0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0, + 255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,255,0,0,0, + 0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255, + 0,0,255,255,255,0,0,255,0,0,255,0,127,0,255,0,0,255,0,0,0,255,0,0,255,0, + 0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0, + 0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0, + 0,255,0,255,0,255,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255, + 0,255,0,0,0,255,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,255,0,255,0,0,127, + 0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0, + 0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,255,255,255,255,0,255,0,0,0, + 0,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255, + 255,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,255,255,0,0,255, + 0,255,0,0,255,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,255,0,255,0,0,255, + 0,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0, + 255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,127,255,255, + 255,255,255,255,0,255,255,255,255,255,255,0,255,255,255,255,255,255,0,255, + 255,255,255,255,255,0,255,255,255,255,255,255,0,255,255,255,255,255,255, + 0,0,255,255,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0, + 0,0,255,0,255,0,0,0,255,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0, + 255,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,127,255,0, + 0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,255, + 0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0, + 0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,255, + 255,0,0,255,0,0,255,0,127,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0, + 0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,255, + 255,255,255,0,0,0,255,255,255,0,0,255,255,255,255,255,0,255,255,255,255, + 255,0,255,255,255,255,255,0,255,255,255,255,255,0,255,255,255,0,255,255, + 255,0,255,255,255,0,255,255,255,0,255,255,255,255,0,0,0,255,0,0,0,0,255, + 0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0, + 255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,255,0,0,0,255,0,255,0,255,255, + 255,0,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255, + 0,0,0,255,255,255,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 0,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,255,255,0,255,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0, + 0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,255,255,0,255, + 0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,255, + 0,0,0,0,255,0,0,0,255,0,255,0,255,0,255,255,0,0,255,0,255,0,0,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,255,0,0,255,0, + 255,0,0,255,0,255,0,255,0,255,255,0,255,0,0,255,255,0,255,0,255,255,0,0, + 0,255,0,0,0,0,255,0,0,0,255,0,255,0,255,0,255,255,0,255,0,0,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,255,0,0,255,0,255,0, + 0,0,255,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255, + 255,0,0,0,255,255,0,0,255,255,255,0,255,255,0,0,0,255,255,0,0,255,255,0, + 0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,0,255,0,0,255,0,0,255, + 0,0,0,0,255,0,255,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0, + 0,255,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,255,0,0,255, + 0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,0,255,0,255,255,255, + 0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,255, + 0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,255, + 0,255,0,0,255,0,0,255,0,0,255,255,255,0,255,0,0,255,0,255,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,255,255,255,255,255, + 0,255,0,0,255,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255, + 0,0,255,0,255,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,255,255,255,0,0,255,255,255,0,0,255,255,255,0,0,255,255,255, + 0,0,255,255,255,0,0,255,255,255,0,0,255,255,255,255,255,255,0,255,0,0,0, + 255,255,255,255,0,255,255,255,255,0,255,255,255,255,0,255,255,255,255,0, + 0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0, + 255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,255, + 0,255,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0, + 255,0,255,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0, + 255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0, + 0,255,0,0,0,0,255,0,0,0,255,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,0,255,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,255,0,0,255,255,255,0,0,255, + 255,255,0,0,255,255,255,0,0,255,255,255,0,0,255,255,255,0,0,255,255,0,255, + 255,255,0,0,255,255,0,0,255,255,255,0,0,255,255,255,0,0,255,255,255,0,0, + 255,255,255,0,0,255,0,255,0,0,255,0,0,255,0,0,255,255,0,0,255,0,0,255,0, + 0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0, + 0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,0,0,255,255,255,0,0,255,255, + 255,0,0,255,255,255,0,0,0,255,0,0,0,255,255,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,0,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127,127,0, + 127,127,127,127,0,127,127,127,127,0,127,127,0,127,0,127,127,0,127,127,0, + 127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0, + 127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + + +// Normal font +const int FONT1_BM_W = 253; +const int FONT1_BM_H = 106; +static const unsigned char s_Font1[] = +{ + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0, + 0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,255,0,0,0,0,255,0,0,0,0,0,255,255, + 255,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,255,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,255,255,0,0,0,0,0, + 255,0,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,0,0,0,255,0,0,255, + 255,255,255,255,255,0,0,0,255,255,255,0,0,255,255,255,255,255,255,0,0,255, + 255,255,255,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,255,255, + 255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255, + 0,0,0,0,255,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255,255,255,0,0,0,255,0,0,0,0,255,0, + 255,0,0,0,0,255,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255, + 0,0,255,0,255,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,255, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,255,255,255,255,0,0,255,255, + 255,255,255,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255, + 0,0,0,255,0,0,0,0,0,0,255,255,0,0,0,0,255,255,255,255,255,255,0,0,0,0,255, + 255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,255,255,0,0,0,0,255,255,0,0,255,0,0, + 255,255,0,0,0,255,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0, + 255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,255,255,0,0,255,0,0,0,255, + 0,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,255,255,255, + 0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,255,255,0, + 0,0,0,0,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,255,255, + 255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,255, + 0,0,0,0,0,0,0,0,255,0,255,255,255,255,255,255,0,0,0,0,0,0,255,0,255,0,0, + 0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,255,255,255,255,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,255, + 0,255,0,0,0,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255, + 0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,255,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,255,0,255, + 0,0,0,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0, + 0,0,255,0,0,0,255,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,255,0,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,255,0,0,0,0,255,255, + 0,0,0,255,255,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,255,255, + 255,0,0,0,255,255,255,255,255,0,255,255,255,255,255,255,0,0,255,255,255, + 255,0,0,0,0,0,0,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255, + 0,0,0,0,0,0,255,255,255,255,0,0,0,255,255,255,0,0,0,0,255,0,0,0,255,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,0, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,0,127,127,127, + 127,0,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,0,0,0,0,0,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255, + 255,255,255,0,0,0,0,0,0,0,255,0,0,0,0,255,255,255,255,255,0,0,0,0,255,255, + 255,255,0,255,255,255,255,255,0,0,0,255,255,255,255,255,255,0,255,255,255, + 255,255,0,0,0,255,255,255,255,0,0,255,0,0,0,0,0,255,0,255,255,255,0,0,255, + 255,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,255,0,0,0,0,255,255,0,255, + 255,0,0,0,0,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,255,0,0,0,0, + 255,255,255,255,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,255,255, + 255,255,255,255,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,255,255,255, + 255,255,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,0,0,0,0,255,255,0,0, + 0,0,255,0,255,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0, + 0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0, + 0,255,0,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0,0,0,0,255,255,0,0,0,0,255, + 255,0,255,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255, + 0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,255,0,0,255, + 0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,255,0,255,255,255,255,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0, + 0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0, + 255,0,0,0,255,0,0,0,0,0,255,0,255,0,0,255,0,255,0,255,0,255,0,0,0,255,0, + 255,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0, + 0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,0, + 255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,0, + 0,255,0,0,255,0,0,0,255,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0, + 0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,255,0,0,0,0,255,0,0,0,0,0,255,0, + 255,0,0,255,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0, + 0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,255, + 0,0,255,0,0,0,0,255,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,0,0,255,0,0,255,0,0,255,0,0,0,255, + 0,0,255,255,255,255,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,255, + 255,255,255,255,0,255,255,255,255,255,0,255,0,0,0,255,255,255,0,255,255, + 255,255,255,255,255,0,0,255,0,0,0,0,0,255,0,255,255,0,0,0,0,0,255,0,0,0, + 0,0,255,0,255,0,0,255,0,255,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,255,255,255,0,0,0,0,255,255, + 255,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0, + 255,0,0,255,0,255,0,0,255,0,0,0,0,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,0,0,255,0,0,255,0,0,255, + 0,0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255, + 0,0,0,0,0,255,0,255,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,255,0,0,255, + 0,255,0,0,0,255,0,255,0,255,0,0,0,0,0,0,255,0,255,255,255,255,255,0,0,255, + 0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0, + 255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,255,0,255,0,0,0,255,0,0,255,0,0,255,255,255,255,255,0,0,255,0,0,0, + 0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0, + 255,0,0,0,255,0,0,0,0,0,255,0,0,255,255,0,0,255,0,255,0,0,0,255,0,255,0, + 255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255, + 0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,0,255,0,255, + 0,0,0,0,0,255,255,0,0,0,255,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,0,255,255,255,255, + 255,255,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0, + 0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0, + 0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0,0,0,0,255,0, + 0,0,0,0,0,255,0,255,0,0,0,0,255,255,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0, + 0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0, + 0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,255,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,255,255, + 255,255,0,0,0,0,255,255,255,255,0,255,255,255,255,255,0,0,0,255,255,255, + 255,255,255,0,255,0,0,0,0,0,0,0,255,255,255,255,255,0,255,0,0,0,0,0,255, + 0,255,255,255,0,255,255,255,0,0,255,0,0,0,0,255,0,255,255,255,255,255,0, + 255,0,0,0,0,0,0,255,0,255,0,0,0,0,255,255,0,0,0,255,255,255,255,0,0,0,255, + 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,255,0,0,0,0,255,0,0,255,255,255,255, + 0,0,0,0,0,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,255,255,255,255, + 255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,255,255,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,255,0,0, + 255,255,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255, + 0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,255,255,255,0,0,255,0,255,255, + 255,0,0,0,255,255,255,255,0,0,255,255,255,255,255,0,0,255,255,255,255,0, + 0,255,255,255,255,0,255,255,255,255,255,0,255,0,255,255,255,0,0,255,0,255, + 255,0,255,0,0,0,255,0,255,0,255,255,255,255,0,255,255,255,0,0,255,0,255, + 255,255,0,0,0,255,255,255,255,0,0,255,0,255,255,255,0,0,0,255,255,255,255, + 255,0,255,0,255,0,0,255,255,255,0,255,255,255,255,0,255,0,0,0,0,255,0,255, + 0,0,0,255,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255, + 255,255,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,255,0,255,255,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,255,0,255,255,0,0,0,255,0,255,0,0,255, + 0,255,0,0,255,0,0,255,0,255,0,0,0,255,0,0,0,255,0,255,255,0,0,0,255,0,255, + 0,0,0,0,255,0,255,255,0,0,0,255,0,255,0,0,0,0,255,0,255,255,0,0,255,0,0, + 0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,0,0,255, + 0,0,255,0,255,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0, + 0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0, + 0,0,255,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,0,255, + 0,0,0,255,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,255,0,0,0,255,0,0,0, + 255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0, + 0,255,255,255,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255, + 255,255,255,255,255,0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,255,0,255,255,0,0,0,0,255,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,0,255,0,0,0,255,0,255,0,255, + 0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0, + 255,0,0,0,0,0,255,255,0,0,255,0,0,255,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,0,255,0,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,255,0,255,0,255,0,0,0,255,0,255, + 0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,0,255,0, + 0,255,0,255,0,0,0,255,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,255, + 255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,255, + 255,0,255,0,0,0,0,255,0,0,255,0,0,255,0,0,0,255,255,0,255,0,0,0,0,255,0, + 255,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0, + 0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,255,255,0,255,0,0, + 0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,255,0,0,0,255,0,0,0,0,0,255,0,0, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,255,255,255,255,0,255,255, + 255,255,255,0,0,0,255,255,255,255,0,0,255,255,255,0,255,0,0,255,255,255, + 255,0,0,0,255,0,0,0,255,255,255,0,255,0,255,0,0,0,0,255,0,255,0,0,255,0, + 255,0,0,0,255,0,255,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0,255, + 255,255,255,0,0,255,255,255,255,255,0,0,0,255,255,255,0,255,0,255,0,0,0, + 255,255,255,0,0,0,0,255,255,0,0,255,255,255,0,255,0,0,0,255,0,0,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,255,255,255,0,0,0,255, + 0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255, + 255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0, + 255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,0,127,127,127,127,127,0, + 127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,0,127,127,0,127,127,127,127,127,0,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,255,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0, + 0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,255, + 0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,127,0,0,255, + 255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0, + 255,0,0,255,0,0,0,255,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255, + 255,255,255,255,255,255,0,255,255,255,255,255,255,0,0,0,255,255,255,255, + 255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,0,255,0,0, + 0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,255,255,0,0,0,255,255,255,0,255,0,0,0,255,0,0,255,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255, + 255,0,0,255,255,0,0,255,0,0,0,0,0,255,0,127,0,255,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,255,0,0,255,0,0, + 255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,255,0,255,0,255,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,127,255,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0, + 0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,255, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0, + 0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255, + 0,255,0,255,0,0,255,255,255,0,0,255,0,0,0,0,255,255,255,255,0,255,255,255, + 0,0,0,0,255,0,0,0,0,0,0,0,255,0,255,255,255,255,0,0,255,0,0,0,255,0,0,127, + 255,255,255,255,255,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255, + 0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,255,0,0, + 0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,255, + 0,0,0,127,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,255,255,0,0,0,255,255,0,0,0,255,255, + 255,255,0,0,0,255,0,0,0,255,0,0,0,0,0,255,255,255,255,255,0,0,0,255,0,0, + 0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0, + 0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,127,255,255,255,255,255,255,0,0,0,255,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,0,0,255,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,0,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,255, + 0,255,0,0,0,0,255,255,255,255,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0, + 0,0,0,0,0,255,0,0,0,0,127,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,0, + 0,0,0,255,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255, + 0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0, + 0,0,255,0,0,0,0,127,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0, + 0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255, + 0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,255,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0, + 0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0, + 0,0,255,0,0,0,0,127,0,0,255,255,255,255,0,0,0,255,255,255,255,255,255,255, + 255,255,0,0,255,0,0,0,255,0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,255,0, + 0,0,255,255,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255, + 255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,0,255,255,255, + 255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255, + 255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,0,0,0,0,0,0,0,0,255,255,255,255,0,255,255,255,255,0,0,0,255,255, + 255,255,255,255,255,255,255,0,255,255,255,255,0,0,0,0,255,0,0,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,0,127,127,0,127,127,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,0, + 127,127,0,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0, + 255,0,0,0,0,255,255,255,255,0,0,255,0,0,255,0,0,0,0,0,255,255,255,255,0, + 0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,0,0,0,255,255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,255,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,255, + 255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 0,0,0,0,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,255,0,0, + 0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,255,255,0,0,0,0,255,0,0,0,0, + 0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0,0,255,255,255,255,0,0,255,0,0,0,0, + 0,255,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,255,255,0,0,255,0,0,0,0,255,255,255,0,0,0,255,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,0,0,255,0,0,0,0,0,0,0,0, + 0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,255,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,255,0,255,255,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,255,0,0,0,255,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0, + 0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0, + 0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,255,255,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255, + 0,0,255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255, + 0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,255,255,255,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,255,0,0, + 0,0,255,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,255, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0, + 0,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 255,255,255,0,0,255,255,255,255,0,0,255,255,255,0,0,0,0,0,0,0,0,0,255,0, + 0,0,0,255,0,0,255,255,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255, + 0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,255,255,0,0,0,0, + 255,0,0,255,0,255,255,255,0,0,0,0,0,0,255,0,255,0,0,255,255,0,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0, + 0,255,0,255,0,0,0,255,255,255,255,255,0,0,0,255,0,0,255,0,0,0,255,255,255, + 255,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0, + 0,255,0,0,0,255,255,255,0,255,0,0,255,0,0,0,0,255,255,255,255,255,255,255, + 0,255,255,255,0,255,0,0,255,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0, + 0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,255,0,0,0,0, + 255,0,0,255,255,255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0, + 255,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0,255,0,255, + 0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0, + 0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,255,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,0,255, + 255,255,255,255,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,255,255, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,255,0,0,0,0,255,255,255,255,0,255,255,255,255,255,255,0,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255, + 255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,255,0,0,0, + 0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,255,255,255,255,0,0,0,0,255, + 0,0,0,0,0,0,255,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,255,0,255,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 127,127,0,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,0, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,255, + 0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,255,255,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,255,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255, + 255,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0, + 255,0,255,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0, + 0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,255,255,0,255,0,0,0,0,0, + 0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,255,0,255,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,255,255,255,255,0,255,255, + 255,255,255,255,0,255,255,255,255,255,255,0,255,255,255,255,255,255,0,255, + 255,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255, + 255,0,0,255,255,255,255,0,0,0,255,255,0,0,0,0,255,0,0,0,255,255,255,255, + 0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,255,255, + 255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,127,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0, + 255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,255,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0, + 255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255, + 0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,127,0,0,255,0,255,0,0,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0, + 255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,255,0,0,0,255,0,255, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,255, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0, + 0,0,255,0,0,255,0,0,0,255,0,0,255,255,255,255,255,0,0,255,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0, + 255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0, + 255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0, + 0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,255,0,0,0,0,0,255, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,255,0, + 255,0,0,0,255,0,0,0,0,255,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,255,255,255, + 255,0,255,0,0,0,0,0,0,255,255,255,255,255,255,0,255,255,255,255,255,255, + 0,255,255,255,255,255,255,0,255,255,255,255,255,255,0,0,255,0,0,0,255,0, + 0,0,255,0,0,0,255,0,0,255,255,255,255,0,0,255,0,255,0,0,255,0,0,255,0,255, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0, + 0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,127,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0, + 255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 255,255,255,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0, + 0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,255,0,0,0,0,0,0,255,0,255,0, + 0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0, + 0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,255,0,0,0,0,0,255, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,127,0,255, + 255,255,255,255,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,255,0,0, + 0,255,255,255,255,255,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,255, + 0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,255,0,0,0,0,0,0,255,0,255, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0, + 255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0, + 255,0,0,0,0,255,255,255,255,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 127,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0, + 0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0, + 0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 255,0,0,0,0,255,255,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255, + 0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0, + 0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,127,255,0,0,0,0,0,255,0,255,0,0,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,0, + 255,255,255,255,255,255,0,255,255,255,255,255,255,0,255,255,255,255,255, + 255,0,255,255,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255, + 0,255,255,255,0,0,255,255,255,255,0,0,0,255,0,0,0,0,255,255,0,0,0,255,255, + 255,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255, + 255,255,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255, + 255,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,0,127,127,127,0,127,127, + 127,0,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,255,0,0,0,0,0,0,255,0,0, + 0,0,255,255,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,255,0,0, + 0,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,255,0,0,0,0,0,255,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,0,0,0,0,255,0,0,0,0,255, + 0,0,255,0,255,0,255,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0, + 0,255,0,0,255,0,0,0,255,0,255,0,255,0,255,255,0,255,0,0,255,0,255,0,0,0, + 255,0,255,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255, + 0,255,255,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0, + 0,0,255,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,255,255,255,0,0,0,255,255,255,0,0,0,255,255,255,0,0,0,255,255,255, + 0,0,0,255,255,255,0,0,0,255,255,255,0,0,0,255,255,255,0,0,255,255,0,0,0, + 0,255,255,255,255,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255, + 255,255,0,0,0,255,255,255,255,0,0,0,255,0,255,0,0,255,0,0,255,0,0,255,255, + 0,255,0,0,255,0,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255, + 0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0, + 0,0,0,255,0,0,0,0,0,0,255,255,255,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,255,255, + 255,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255, + 255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,0,255, + 0,255,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,255, + 0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,255,0,255,255,0,0,0,255,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255, + 0,0,255,0,0,255,0,0,255,255,255,255,255,0,255,0,0,0,0,255,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,255,0,0,0,0,255,0,255,0,0, + 0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255,0,0,255,0,0,0, + 0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,255,255,0,0, + 255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255, + 255,0,0,255,255,255,255,0,0,255,255,255,255,255,255,255,255,255,0,255,0, + 0,0,0,0,255,255,255,255,255,255,0,255,255,255,255,255,255,0,255,255,255, + 255,255,255,0,255,255,255,255,255,255,0,0,255,0,255,0,0,255,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,255,255,255,255, + 255,255,0,255,0,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255,0,0,255,0,0,0,0,255,0,0,255, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,0,0,255,0,255,0,0,0,255,0,255, + 0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255, + 0,255,0,0,255,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255, + 0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255, + 0,255,0,0,0,255,0,255,0,0,0,255,255,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0, + 0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255, + 0,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0, + 255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,255,0,255,0,0,0,255, + 255,0,255,0,0,0,255,255,0,255,0,0,0,255,255,0,0,0,255,0,0,0,255,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,255,255,0,0,255, + 255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255, + 0,0,255,255,255,255,0,0,255,255,255,0,0,255,255,255,0,0,0,255,255,255,255, + 0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255, + 255,255,255,0,0,0,255,0,255,0,0,255,0,0,255,0,0,255,255,255,255,0,0,255, + 0,0,0,0,255,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255, + 255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,0,0,0,255,0,0,0,0, + 0,255,255,255,255,0,0,0,0,255,255,255,0,255,0,0,255,255,255,0,255,0,0,255, + 255,255,0,255,0,0,255,255,255,0,255,0,0,0,255,0,0,0,255,255,255,255,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,0,127,0,127,127,0,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + +// Normal font anti-aliased +const int FONT1AA_BM_W = 264; +const int FONT1AA_BM_H = 106; +static const unsigned char s_Font1AA[] = +{ + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0, + 0,0,0,4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0, + 59,241,97,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,168,34,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,251,89,0,0,89,255,125,89,255,125,0,0,0,0, + 7,199,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0, + 0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,59,238,42, + 206,125,0,0,0,0,7,199,34,89,166,0,0,0,0,168,34,0,0,0,175,255,255,166,0, + 0,7,202,89,0,0,0,0,59,245,255,251,89,0,0,0,59,238,34,0,12,232,89,0,0,89, + 247,34,0,59,245,206,199,124,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,7,202,89,0,12,235,255,247,34,0,0,0,0,12,232,89,0,0,12,235, + 255,255,251,89,0,7,206,255,255,255,125,0,0,0,0,138,251,89,0,0,59,245,255, + 255,255,251,89,0,0,89,255,255,166,0,89,255,255,255,255,255,201,0,0,59,245, + 255,255,125,0,0,12,235,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,247,34,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,138,225,21,59,238,34,175,125,0,0,0,0,59,192,0,172, + 89,0,0,59,245,255,255,251,89,89,247,34,12,228,34,0,138,166,0,0,0,0,12,235, + 125,0,175,225,21,0,0,59,238,34,0,138,201,0,0,0,0,175,166,0,0,0,89,255,201, + 0,0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,215,21,0,175, + 166,0,138,201,0,0,7,206,255,251,89,0,0,59,192,0,0,138,247,34,59,192,0,0, + 89,251,89,0,0,59,245,251,89,0,0,59,241,89,0,0,0,0,0,89,247,34,0,0,0,0,0, + 0,0,7,206,166,0,7,206,125,0,89,247,34,7,206,166,0,138,225,21,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0,0,0,0,175,166,0,0,0,0,0, + 0,0,89,125,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0, + 0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,12,206, + 21,175,125,0,0,89,255,255,255,255,255,255,166,59,241,89,168,34,138,125, + 89,225,21,7,202,89,12,228,34,0,0,0,0,12,232,89,0,138,201,0,0,0,12,206,21, + 7,202,89,0,0,0,0,59,215,21,59,245,206,199,124,255,125,0,0,0,0,7,202,89, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,12,232,89,0,59,238,34,0,0, + 0,59,241,89,0,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,12,232,132,241,89, + 0,0,59,241,89,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,89,247,34,0,12,232,89,0, + 12,232,89,59,241,89,0,59,241,89,0,138,247,34,0,0,138,247,34,0,0,0,0,0,12, + 235,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,166,0,0,0,0,0,0,0,0,0,138, + 225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0, + 0,0,4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,172, + 89,59,192,0,0,59,238,34,168,34,0,0,89,247,34,12,228,34,138,166,0,0,0,0, + 0,0,138,251,159,247,34,0,0,0,0,0,0,59,238,34,0,0,0,0,7,202,89,0,0,7,199, + 34,0,0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,59, + 241,89,0,59,241,89,0,0,0,59,241,89,0,0,0,0,0,0,89,247,34,0,0,0,0,138,201, + 0,7,206,125,59,241,89,0,0,59,245,255,255,251,89,0,12,235,255,255,255,125, + 0,0,0,0,7,206,166,0,0,0,175,251,89,138,201,0,59,241,89,0,12,235,125,0,138, + 247,34,0,0,138,247,34,0,0,0,59,245,247,34,0,0,0,0,7,206,255,255,255,255, + 255,255,125,0,0,0,0,138,255,201,0,0,0,0,0,0,89,251,89,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0,0,12,206,21,138,125,0,0,7,206,255, + 247,34,0,0,0,175,255,255,166,59,215,21,175,255,255,125,0,0,138,171,206, + 166,0,175,201,0,0,0,0,89,201,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,12,235, + 255,255,255,255,255,255,125,0,0,0,0,138,255,255,251,89,0,0,0,0,0,59,215, + 21,0,59,241,89,0,59,241,89,0,0,0,59,241,89,0,0,0,0,0,12,235,166,0,0,0,138, + 255,255,125,0,175,201,0,59,241,89,0,0,0,0,0,0,175,247,34,59,241,89,0,89, + 247,34,0,0,0,89,247,34,0,0,0,89,255,255,255,125,0,12,235,166,0,59,245,125, + 0,0,0,0,0,0,0,0,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,89,251,89,0,0,7,206,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,201, + 0,0,0,0,0,0,0,12,235,255,255,255,255,255,225,21,0,0,0,175,255,251,89,0, + 0,0,0,0,175,125,89,225,21,59,238,34,89,225,21,12,235,166,175,166,0,0,0, + 0,89,201,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,59,241,89,0,59,241,89,0,0,0,59,241,89, + 0,0,0,0,12,235,166,0,0,0,0,0,0,59,241,97,206,255,255,255,255,255,125,0, + 0,0,0,0,59,241,89,59,238,34,0,12,235,125,0,0,12,235,125,0,0,0,12,232,89, + 0,59,245,125,0,89,255,255,232,241,89,0,0,0,0,0,0,0,0,0,0,0,0,59,245,247, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,201,0,0,0,0,7,206,125,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, + 4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,12,206,21, + 0,0,0,0,0,168,34,175,166,0,0,0,0,59,215,21,138,201,0,12,228,34,138,225, + 21,0,12,235,251,89,0,0,0,0,59,215,21,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0, + 0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,12,232,89,0, + 59,238,34,0,0,0,59,241,89,0,0,0,12,235,166,0,0,0,0,0,0,0,12,235,125,0,0, + 0,59,241,89,0,0,0,0,0,0,59,241,89,12,232,89,0,12,232,89,0,0,138,225,21, + 0,0,0,59,238,34,0,7,206,166,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,12,235,247,34,0,0,7,206,255,255,255,255,255,255,125,0,0,138,255,166,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0, + 0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,0,0,0,0, + 0,0,0,0,172,89,89,166,0,0,0,89,166,0,168,42,206,125,0,0,0,7,202,89,0,89, + 225,21,59,238,34,89,251,89,0,0,175,255,201,0,0,0,0,7,202,89,0,0,0,0,59, + 215,21,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,0,0,138,247,34,0,0,0,0,0,7,206, + 201,0,12,228,34,0,0,0,175,166,0,138,201,0,0,0,0,59,241,89,0,0,12,235,166, + 0,0,0,0,89,166,0,0,89,251,89,0,0,0,59,241,89,0,0,59,192,0,0,175,225,21, + 0,175,201,0,138,225,21,0,12,235,125,0,0,0,0,12,235,166,0,59,241,89,0,0, + 0,7,206,166,0,0,138,247,34,0,0,59,245,125,0,0,0,0,0,0,0,12,232,89,0,0,0, + 0,0,0,0,0,0,0,0,175,166,0,0,0,0,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,12,206,21,138,125,0,0,0,12,235,255, + 255,255,166,0,0,0,0,138,201,0,0,0,175,255,255,125,0,0,138,255,255,255,125, + 12,235,247,0,0,0,0,138,201,0,0,0,0,175,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,206,166,0,0,0,0,0,0,7,206,201,0,89,201,0,0,0,0,12,235,255,247, + 34,0,0,7,206,255,255,255,225,21,89,255,255,255,255,255,166,59,245,255,255, + 251,89,0,0,0,0,59,241,89,0,0,12,235,255,255,225,21,0,0,12,235,255,251,89, + 0,0,175,225,21,0,0,0,0,0,59,245,255,255,125,0,0,89,255,255,166,0,0,0,138, + 247,34,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, + 0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0, + 4,4,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,168,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89, + 255,125,89,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0, + 0,0,0,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0, + 127,127,127,127,0,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,0,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,0,127,127,127,127,0,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,0, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,125,138,166,0,0,0,89,255,255,247, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,89,255,255, + 255,255,166,0,0,0,0,0,12,235,225,21,0,0,59,245,255,255,255,251,89,0,0,0, + 59,245,255,255,251,89,59,245,255,255,255,247,34,0,0,59,245,255,255,255, + 255,127,81,245,255,255,255,255,127,0,0,59,245,255,255,255,166,0,59,241, + 89,0,0,0,59,241,89,89,255,255,255,125,7,206,255,251,89,59,241,89,0,0,89, + 255,166,59,241,89,0,0,0,0,59,245,225,21,0,0,7,206,251,89,59,245,247,34, + 0,0,59,241,89,0,0,138,255,255,255,166,0,0,59,245,255,255,255,225,21,0,0, + 0,138,255,255,255,166,0,0,59,245,255,255,255,251,89,0,0,0,59,245,255,255, + 201,89,255,255,255,255,255,255,255,125,59,241,89,0,0,0,59,241,97,206,166, + 0,0,0,0,175,201,175,201,0,0,7,206,201,0,0,0,175,171,206,225,21,0,0,59,245, + 166,245,125,0,0,0,89,251,89,89,255,255,255,255,255,127,0,228,34,0,0,59, + 215,21,0,0,0,0,12,228,34,0,0,0,59,245,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,175,225,21,0,0,0,175,225,21,0,0,0,89,232,241,89,0,0,59, + 241,89,0,0,138,225,21,0,89,255,125,0,0,59,192,59,241,89,0,0,175,251,89, + 0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,89,255,125,0,0,7,199,34,59,241, + 89,0,0,0,59,241,89,0,59,241,89,0,0,0,59,241,89,59,241,89,0,59,241,89,0, + 59,241,89,0,0,0,0,59,245,255,125,0,0,89,255,251,89,59,245,255,201,0,0,59, + 241,89,0,138,251,89,0,12,235,166,0,59,241,89,0,7,206,225,21,0,138,251,89, + 0,12,235,166,0,59,241,89,0,0,138,247,34,0,12,235,125,0,7,176,21,0,0,59, + 241,89,0,0,0,59,241,89,0,0,0,59,241,89,138,225,21,0,0,12,235,125,89,225, + 21,0,59,245,247,34,0,12,232,89,12,235,166,0,7,206,166,0,89,247,34,0,7,206, + 125,0,0,0,0,0,7,206,166,12,228,34,0,0,7,202,89,0,0,0,0,12,228,34,0,0,12, + 235,133,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,138,201,0,138, + 255,255,255,125,138,166,0,0,7,206,166,175,166,0,0,59,241,89,0,0,89,247, + 34,7,206,166,0,0,0,0,0,59,241,89,0,0,0,175,225,21,59,241,89,0,0,0,0,59, + 241,89,0,0,0,0,7,206,166,0,0,0,0,0,0,59,241,89,0,0,0,59,241,89,0,59,241, + 89,0,0,0,59,241,89,59,241,89,59,241,89,0,0,59,241,89,0,0,0,0,59,241,159, + 225,21,0,175,166,241,89,59,241,132,241,89,0,59,241,89,12,235,166,0,0,0, + 89,247,34,59,241,89,0,0,89,247,34,12,235,166,0,0,0,89,247,34,59,241,89, + 0,0,59,241,89,0,59,238,34,0,0,0,0,0,0,59,241,89,0,0,0,59,241,89,0,0,0,59, + 241,89,59,241,89,0,0,89,225,21,59,241,89,0,89,206,202,89,0,59,238,34,0, + 89,251,89,138,225,21,0,0,175,201,0,138,225,21,0,0,0,0,0,175,225,21,12,228, + 34,0,0,0,138,166,0,0,0,0,12,228,34,0,7,206,166,0,12,235,125,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,7,202,89,89,225,21,7,206,125,12,206,21,0,59,238, + 34,89,247,34,0,59,241,89,0,0,175,201,0,59,241,89,0,0,0,0,0,59,241,89,0, + 0,0,59,241,89,59,241,89,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,0, + 59,241,89,0,0,0,59,241,89,0,59,241,89,0,0,0,59,241,89,59,241,102,232,89, + 0,0,0,59,241,89,0,0,0,0,59,241,102,232,89,59,215,81,241,89,59,241,89,138, + 225,21,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,7,206,201,0,59,241, + 89,0,0,0,59,241,89,59,241,89,0,0,175,201,0,0,12,235,166,0,0,0,0,0,0,59, + 241,89,0,0,0,59,241,89,0,0,0,59,241,89,7,206,166,0,0,175,166,0,7,206,125, + 0,175,125,175,166,0,138,201,0,0,0,175,255,251,89,0,0,0,59,245,166,241,89, + 0,0,0,0,0,89,247,34,0,12,228,34,0,0,0,89,201,0,0,0,0,12,228,34,12,235,201, + 0,0,0,59,245,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,59,215,21,175,125, + 0,7,206,125,7,199,34,0,138,201,0,12,235,125,0,59,245,255,255,255,247,34, + 0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,59,241,89,59,245,255,255,255,255, + 127,59,245,255,255,255,255,127,59,241,89,0,0,0,0,0,0,59,245,255,255,255, + 255,255,251,89,0,59,241,89,0,0,0,59,241,89,59,245,255,247,34,0,0,0,59,241, + 89,0,0,0,0,59,241,89,138,201,175,166,59,241,89,59,241,89,12,235,125,59, + 241,89,59,241,89,0,0,0,12,235,125,59,245,255,255,255,201,0,0,59,241,89, + 0,0,0,12,235,125,59,245,255,255,255,125,0,0,0,0,59,245,255,255,125,0,0, + 0,59,241,89,0,0,0,59,241,89,0,0,0,59,241,89,0,138,225,21,59,241,89,0,0, + 175,201,7,202,89,89,201,0,175,166,0,0,0,12,235,166,0,0,0,0,0,138,255,166, + 0,0,0,0,0,59,245,125,0,0,12,228,34,0,0,0,12,228,34,0,0,0,12,228,34,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,59,215,21,175,125,0,7, + 206,125,7,199,34,7,206,125,0,0,175,201,0,59,241,89,0,0,89,247,34,59,241, + 89,0,0,0,0,0,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,0,59,241,89,0,0, + 0,0,59,241,89,0,59,245,255,251,89,59,241,89,0,0,0,59,241,89,0,59,241,89, + 0,0,0,59,241,89,59,241,89,175,225,21,0,0,59,241,89,0,0,0,0,59,241,89,12, + 235,247,34,59,241,89,59,241,89,0,89,247,94,241,89,59,241,89,0,0,0,59,241, + 89,59,241,89,0,0,0,0,0,59,241,89,0,0,0,59,241,89,59,241,89,12,235,166,0, + 0,0,0,0,0,0,138,251,89,0,0,59,241,89,0,0,0,59,241,89,0,0,0,59,241,89,0, + 12,232,89,138,225,21,0,0,89,225,81,215,21,12,228,47,232,89,0,0,0,175,255, + 251,89,0,0,0,0,59,241,89,0,0,0,0,7,206,201,0,0,0,12,228,34,0,0,0,0,175, + 125,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 12,228,34,89,201,0,7,206,125,59,215,21,59,245,255,255,255,255,247,34,59, + 241,89,0,0,59,241,89,7,206,166,0,0,0,0,0,59,241,89,0,0,0,138,225,21,59, + 241,89,0,0,0,0,59,241,89,0,0,0,0,7,206,166,0,0,0,59,241,89,59,241,89,0, + 0,0,59,241,89,0,59,241,89,0,0,0,59,241,89,59,241,89,7,206,201,0,0,59,241, + 89,0,0,0,0,59,241,89,0,175,166,0,59,241,89,59,241,89,0,7,206,200,241,89, + 12,235,166,0,0,0,89,247,34,59,241,89,0,0,0,0,0,12,235,166,0,0,0,89,247, + 34,59,241,89,0,59,245,125,0,0,0,0,0,0,12,232,89,0,0,59,241,89,0,0,0,12, + 232,89,0,0,0,59,238,34,0,0,175,171,206,166,0,0,0,12,232,159,201,0,7,202, + 132,215,21,0,0,89,247,34,175,225,21,0,0,0,59,241,89,0,0,0,0,138,225,21, + 0,0,0,12,228,34,0,0,0,0,89,201,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,138,201,7,206,255,251,226,255,255,166,0, + 138,201,0,0,0,12,235,125,59,241,89,0,0,138,247,34,0,89,255,125,0,0,59,192, + 59,241,89,0,0,138,251,89,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,89,255, + 125,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,59,241,89,0,0,0,89,247,34, + 59,241,89,0,12,235,166,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,59,241,89, + 59,241,89,0,0,59,245,251,89,0,138,251,89,0,59,245,166,0,59,241,89,0,0,0, + 0,0,0,138,251,89,0,59,245,166,0,59,241,89,0,0,138,251,89,0,89,166,0,0,89, + 247,34,0,0,59,241,89,0,0,0,0,138,225,21,0,7,206,166,0,0,0,89,255,251,89, + 0,0,0,7,206,255,125,0,0,138,255,201,0,0,12,235,125,0,12,235,166,0,0,0,59, + 241,89,0,0,0,89,251,89,0,0,0,0,12,228,34,0,0,0,0,12,228,34,0,0,12,228,34, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,7,206,225,21,0, + 0,0,0,0,0,7,206,125,0,0,0,0,175,201,59,245,255,255,255,247,34,0,0,0,59, + 245,255,255,251,89,59,245,255,255,255,225,21,0,0,59,245,255,255,255,255, + 127,81,241,89,0,0,0,0,0,0,59,245,255,255,255,201,0,59,241,89,0,0,0,59,241, + 89,89,255,255,255,138,235,255,255,125,0,59,241,89,0,0,89,255,201,59,245, + 255,255,255,255,166,59,241,89,0,0,0,0,59,241,89,59,241,89,0,0,0,175,251, + 89,0,0,138,255,255,255,166,0,0,59,241,89,0,0,0,0,0,0,0,138,255,255,255, + 166,0,0,59,241,89,0,0,0,175,251,89,12,235,255,255,251,89,0,0,0,59,241,89, + 0,0,0,0,0,59,245,255,251,89,0,0,0,0,12,235,201,0,0,0,0,0,138,251,89,0,0, + 89,255,125,0,7,206,225,21,0,0,89,255,125,0,0,59,241,89,0,0,0,175,255,255, + 255,255,255,127,0,228,34,0,0,0,0,0,175,125,0,0,12,228,34,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,89,255,255,255,255,125,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12, + 228,34,0,0,0,0,0,89,201,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,138,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,125,0,0,0,12,228, + 124,255,255,247,34,0,0,0,0,0,0,0,0,0,245,255,255,255,255,255,255,0,0,0, + 0,0,0,0,0,0,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,89,255,125,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,89,255,255,166,0,0,0,0,0, + 0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,255,201,0,12,228, + 34,0,0,89,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,116,116, + 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,59,241,89,0,0,0,0,0,0,0,0,0,59,241,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0, + 0,0,0,59,241,89,0,0,0,0,59,241,89,0,89,251,89,59,241,89,0,0,0,0,59,241, + 89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225, + 21,0,0,12,228,34,0,0,0,0,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, + 4,4,28,244,252,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59, + 241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,59,241,89,0, + 0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,59,241, + 89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166, + 0,0,0,12,228,34,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4, + 4,180,252,164,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,7,206,255,255,255, + 125,0,59,241,194,255,251,89,0,0,7,206,255,255,201,0,12,235,255,255,251, + 89,0,12,235,255,251,89,7,206,255,255,247,34,0,12,235,255,255,251,89,59, + 241,194,255,255,125,0,59,241,89,89,255,251,89,59,241,89,0,138,251,89,59, + 241,89,59,241,159,255,255,125,89,255,255,166,0,59,241,194,255,255,125,0, + 0,0,12,235,255,247,34,0,59,241,194,255,255,125,0,0,12,235,255,255,251,89, + 59,241,159,255,201,0,138,255,255,247,34,206,255,255,255,166,59,241,89,0, + 59,241,97,206,166,0,0,12,235,125,175,201,0,7,206,166,0,7,206,133,206,225, + 21,0,89,255,255,166,0,0,12,235,125,138,255,255,255,255,166,0,0,138,166, + 0,0,0,12,228,34,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4, + 76,252,244,20,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,89,247,34, + 59,245,166,0,138,225,21,7,206,201,0,0,0,7,206,166,0,59,241,89,7,206,125, + 0,89,225,21,59,241,89,0,0,7,206,166,0,59,241,89,59,245,166,0,89,247,34, + 59,241,89,0,59,241,89,59,241,89,138,225,21,0,59,241,89,59,245,201,0,89, + 255,201,0,89,247,34,59,245,166,0,89,247,34,0,7,206,166,0,138,225,21,59, + 245,166,0,138,247,34,7,206,166,0,59,241,89,59,245,201,0,0,59,238,34,0,130, + 34,59,241,89,0,0,59,241,89,0,59,241,89,89,247,34,0,89,247,34,138,225,21, + 12,235,225,21,12,232,89,7,206,166,12,235,125,89,247,34,0,89,247,34,0,0, + 0,89,247,34,0,0,138,166,0,0,0,12,228,34,0,0,0,0,89,225,21,0,0,7,206,247, + 34,0,0,89,201,0,0,4,4,68,12,4,4,4,220,252,108,4,4,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,0,0,59, + 241,89,0,59,241,89,59,238,34,0,59,238,34,59,241,89,0,0,59,241,89,0,59,241, + 89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,159,201,0,0,0,59, + 241,89,59,241,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241, + 89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0, + 0,59,241,89,0,0,0,59,241,89,0,0,59,241,89,0,59,241,89,12,235,125,0,175, + 166,0,59,238,34,89,171,202,89,89,225,21,0,59,241,226,201,0,12,235,125,0, + 175,166,0,0,0,12,235,125,0,0,59,238,34,0,0,0,12,228,34,0,0,0,0,7,206,125, + 0,7,202,89,12,235,166,0,175,125,0,0,4,60,244,172,4,4,132,252,212,4,4,4, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,89,255,255,255,251,89,59,241,89, + 0,59,241,89,59,238,34,0,0,0,59,238,34,0,59,241,89,59,245,255,255,255,251, + 0,59,241,89,0,0,59,238,34,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0, + 59,241,89,59,245,255,225,21,0,0,59,241,89,59,241,89,0,59,241,89,0,59,241, + 89,59,241,89,0,59,241,89,0,59,238,34,0,12,232,89,59,241,89,0,12,232,89, + 59,238,34,0,59,241,89,59,241,89,0,0,0,175,255,255,201,0,59,241,89,0,0,59, + 241,89,0,59,241,89,0,175,201,12,232,89,0,7,206,125,172,89,138,166,138,201, + 0,0,0,138,247,34,0,0,175,201,12,232,89,0,0,7,206,166,0,0,175,225,21,0,0, + 0,0,12,228,34,0,0,0,0,0,0,175,225,34,206,21,0,0,175,255,166,0,0,0,4,52, + 244,252,140,36,244,252,60,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,59, + 241,89,0,59,241,89,59,241,89,0,59,238,34,59,241,89,0,0,0,59,241,89,0,59, + 241,89,59,238,34,0,0,0,0,59,241,89,0,0,59,241,89,0,59,241,89,59,241,89, + 0,59,241,89,59,241,89,0,59,241,89,59,241,97,206,201,0,0,59,241,89,59,241, + 89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241,89,0,59,241,89, + 59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,0,0,0,0,59,245, + 125,59,241,89,0,0,59,241,89,0,59,241,89,0,59,238,124,225,21,0,0,175,176, + 206,21,59,215,187,125,0,0,59,245,255,201,0,0,89,247,124,225,21,0,0,138, + 225,21,0,0,0,59,241,89,0,0,0,12,228,34,0,0,0,0,12,235,125,0,0,0,0,0,0,0, + 0,0,0,0,0,4,4,76,252,252,220,252,164,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,89,247,34,0,89,251,89,59,241,89,0,175,201,0,7,206,201,0,0,0, + 7,206,166,0,138,251,89,7,206,166,0,7,199,34,59,241,89,0,0,7,206,166,0,138, + 251,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,12,235,166, + 0,59,241,89,59,241,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,7, + 206,166,0,138,225,21,59,241,89,0,138,225,21,7,206,166,0,89,251,89,59,241, + 89,0,0,89,125,0,12,232,89,12,232,89,0,12,12,235,125,0,175,251,89,0,7,206, + 255,125,0,0,0,89,255,201,0,7,206,247,34,0,7,206,166,59,245,125,0,7,206, + 255,125,0,0,59,241,89,0,0,0,0,0,138,166,0,0,0,12,228,34,0,0,0,0,89,225, + 21,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,100,252,252,244,28,4,4,4,4,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,175,255,255,232,241,89,59,245,255,255,247,34, + 0,0,12,235,255,255,201,0,59,245,255,200,241,89,0,12,235,255,251,89,0,59, + 241,89,0,0,0,12,235,255,200,241,89,59,241,89,0,59,241,89,59,241,89,0,59, + 241,89,59,241,89,0,59,245,201,59,241,89,59,241,89,0,59,241,89,0,59,241, + 89,59,241,89,0,59,241,89,0,0,12,235,255,247,34,0,59,245,166,255,247,34, + 0,0,59,245,255,166,241,89,59,241,89,0,0,59,245,255,255,166,0,0,138,255, + 255,125,0,89,255,255,166,241,89,0,0,138,247,34,0,0,0,59,245,125,0,0,138, + 225,21,7,206,225,21,0,138,251,0,0,138,247,34,0,0,175,255,255,255,255,166, + 0,0,138,166,0,0,0,12,228,34,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,4, + 4,4,4,132,252,108,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0, + 0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0,0,0,0,138, + 201,0,0,0,12,228,34,0,0,0,0,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, + 116,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,255,255, + 247,34,0,0,0,0,0,0,0,0,0,0,0,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,59, + 241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,7,206,255, + 201,0,12,228,34,0,0,89,255,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, + 4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,0,127,127,127,0,127,127,127, + 127,127,127,0,127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,89,247,34,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,59,238,34,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255, + 225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 12,235,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,138,201,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,0,0,0,0,7,199,34,0,0,0,0,138,255, + 201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,89,0,0,138,255,251,97,206,201,0,0,138, + 251,102,235,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255, + 201,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,7,206,166,12,232,89,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,12,235,127,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,175,255,255,255,225,21,59,245,255,255,255, + 255,255,125,0,0,0,0,0,0,0,7,206,255,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,7,199,34,0,0,0,0,0,7,199,34,0,0,0,138,225,21,175,166,0,0,175,255,255, + 166,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,59,245,255,255,201,0,0,0,0,0,0,0,0, + 59,245,255,255,255,255,255,255,255,255,125,0,59,245,255,255,255,255,255, + 125,0,0,89,255,255,255,255,255,225,21,59,245,255,255,255,255,255,125,0, + 0,0,59,245,255,255,255,255,255,125,7,206,166,0,0,175,171,206,166,89,247, + 34,0,175,201,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 12,228,34,175,255,125,0,0,89,255,255,255,125,175,251,89,89,255,125,0,7, + 206,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,255,255, + 255,255,125,0,0,7,206,255,125,59,245,125,0,0,0,89,251,89,0,0,0,0,0,0,0, + 127,7,206,225,21,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,0,175,201,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,255,255,255,125,0,59,245,255, + 255,255,255,125,0,0,0,0,0,0,0,89,247,34,12,228,34,0,138,166,0,0,0,0,0,0, + 0,0,0,0,12,235,125,0,7,176,21,0,0,0,0,0,0,138,251,89,0,0,138,201,0,0,0, + 0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,7,206,166,0,59,115,0,0,0,0,59,115, + 0,0,0,59,115,0,0,0,0,59,115,0,89,201,0,12,232,89,89,201,7,202,89,12,232, + 89,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,199,34,0,172,132,196,199,163,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,0,89,247,34,0,7, + 206,125,0,0,0,0,0,0,0,0,127,89,247,34,0,0,0,0,0,59,115,0,0,0,0,59,115,0, + 0,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0, + 0,0,0,0,7,199,34,0,0,0,0,0,0,0,0,0,89,225,21,7,202,89,12,228,34,0,0,0,0, + 0,0,0,0,0,0,59,238,34,0,0,0,0,0,0,0,130,34,59,241,89,0,0,0,138,201,0,0, + 0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,175,225,21,0,59,115,0,0,0,0,59, + 115,0,0,0,59,115,0,0,0,0,59,115,0,12,228,34,59,192,0,12,228,34,138,166, + 59,215,21,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,7,199,34,0,172,89,175,166,138,125,0,138,255,255,247,34,12, + 146,0,0,0,0,89,255,255,255,125,12,235,255,255,125,0,0,0,59,115,0,0,0,0, + 59,115,0,138,255,255,255,255,127,0,175,201,0,138,225,21,0,0,0,0,0,0,0,0, + 127,245,255,255,255,255,255,125,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,12, + 232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,0,0,0,0,7,199, + 34,0,0,0,0,0,0,0,0,0,89,247,34,12,228,34,138,166,0,0,0,0,0,0,0,0,0,0,0, + 12,235,166,0,0,0,0,0,0,175,225,21,138,225,21,0,0,0,138,201,0,0,0,0,0,0, + 59,115,0,0,0,0,59,115,0,0,0,0,0,89,247,34,0,0,59,115,0,0,0,0,59,115,0,0, + 0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,166, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,172, + 89,0,0,138,125,59,238,34,0,130,34,7,206,201,0,0,59,241,89,0,12,235,255, + 125,0,59,241,89,0,0,59,115,0,0,0,0,59,115,0,0,0,0,89,247,34,0,59,245,166, + 241,89,0,0,0,0,0,0,0,0,0,127,138,225,21,0,0,0,0,0,59,115,0,0,0,0,59,115, + 0,0,0,0,0,89,255,255,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199, + 34,0,0,0,0,0,7,199,34,0,0,0,0,0,0,0,0,0,0,175,255,255,166,59,215,21,175, + 255,255,125,0,89,255,255,201,0,0,0,59,245,255,255,125,0,12,235,166,0,0, + 138,225,21,0,0,0,138,255,255,255,255,247,34,0,59,115,0,0,0,0,59,115,0,0, + 0,0,59,245,125,0,0,0,59,115,0,0,0,0,59,115,0,0,0,59,115,0,0,0,0,59,115, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,251,102,0,255,255,255,255, + 255,0,245,255,255,255,255,255,255,255,255,255,255,127,21,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,138,247,34,138,201,0,0,0,175, + 201,0,0,0,175,166,0,0,59,115,0,0,0,0,59,115,0,0,0,12,235,125,0,0,0,138, + 255,166,0,0,0,0,0,0,0,0,0,0,127,245,255,255,255,255,225,21,0,59,115,0,0, + 0,0,59,115,0,0,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,7,199,34,0,0,0,59,245,255,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,175, + 125,89,225,21,59,238,47,232,89,7,206,125,0,0,0,0,0,138,251,89,12,235,166, + 0,0,138,225,21,0,0,0,138,201,0,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,7, + 206,201,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,59,115,0,0,0,0,59,115,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,251,89,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,255,255,201,0, + 0,0,138,247,34,175,201,0,0,0,138,255,255,255,255,255,166,0,0,59,115,0,0, + 0,0,59,115,0,0,7,206,166,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,127,89,251, + 89,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,0,0,0,0,7,199,34,0,0,0,0,0,0,0,0,0, + 0,0,0,0,59,215,21,138,201,0,12,228,47,228,34,0,175,166,0,0,0,0,0,12,232, + 89,0,0,175,225,21,59,241,89,0,0,0,138,201,0,0,0,0,0,0,59,115,0,0,0,0,59, + 115,0,0,0,138,225,21,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,59,115,0,0,0,0, + 59,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,166,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59, + 245,125,7,206,201,0,0,138,201,0,0,0,175,201,0,0,0,0,0,0,0,59,115,0,0,0, + 0,59,115,0,0,138,225,21,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,127,7,206, + 247,34,0,0,0,0,59,115,0,0,0,0,59,115,0,59,245,125,0,0,175,166,0,0,0,59, + 245,125,175,225,29,206,166,0,89,247,34,7,206,166,0,0,0,7,199,34,0,0,0,0, + 0,7,199,34,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,89,225,21,59,238,47,232,89, + 7,206,125,0,89,166,0,0,89,247,34,0,0,0,130,34,0,138,255,125,0,0,138,201, + 0,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,89,251,89,0,0,0,0,0,59,115,0,0,0, + 0,59,115,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,89,125,0,12,232,89,12,146,0,0,0,59,241,89,0,12,235,247, + 34,0,0,89,125,0,0,59,115,0,0,0,0,59,115,0,59,241,89,0,0,0,0,0,59,241,89, + 0,0,0,0,0,0,0,0,0,0,127,0,0,175,255,255,255,225,21,59,245,255,255,255,255, + 255,125,0,138,225,21,0,12,235,125,0,0,0,138,225,34,235,125,7,206,166,0, + 89,247,34,7,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 138,201,0,0,0,175,255,255,125,0,89,255,255,201,0,0,12,235,255,255,251,89, + 0,0,0,0,0,0,0,0,89,255,255,255,255,255,255,255,255,255,125,0,59,245,255, + 255,255,255,255,125,0,0,175,255,255,255,255,255,247,34,59,245,255,255,255, + 255,255,125,0,0,0,59,245,255,255,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,255,166,0,0,0,0,0,0,0,89,255,255, + 255,125,59,245,255,255,201,0,0,0,59,245,255,255,255,255,255,125,0,175,255, + 255,255,255,127,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,175,166,0,255,255,201,0,0,0,0,175,166,59,238,34,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,0,0, + 0,0,0,0,0,12,228,34,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,0,127,127,0,127,127,0,127,127,127,127,0, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,245,255,255,255,255,255, + 251,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21, + 0,0,0,138,125,0,0,0,0,59,245,255,255,125,0,0,0,0,0,0,0,0,138,225,21,0,0, + 175,166,0,12,228,34,0,0,59,245,255,255,247,34,0,89,225,29,206,166,0,0,0, + 0,0,89,255,255,255,255,125,0,0,0,7,206,255,255,247,34,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,255,125,0,0,0,0,0,0,0, + 0,0,0,0,0,138,255,255,166,0,0,0,0,7,202,89,0,0,0,0,0,12,235,255,125,0,0, + 175,255,255,225,21,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,138,255,255,255, + 255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,0,0,89,255,255,225,21,0,0, + 0,0,0,0,0,0,0,0,0,138,166,0,0,0,89,225,21,0,0,0,0,0,138,166,0,0,0,89,225, + 21,0,0,0,12,235,255,255,166,0,0,7,206,125,0,0,0,0,0,0,89,247,34,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,0,0,0,138,125,0,0,0,12, + 235,125,0,59,115,0,0,0,0,0,0,0,0,7,206,125,0,59,215,21,0,12,228,34,0,12, + 235,125,0,0,168,34,0,0,0,0,0,0,0,0,0,0,175,225,21,0,0,0,175,225,21,0,0, + 0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,225, + 21,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,59,238,34,7,206,125,0,0,0,7,202,89, + 0,0,0,0,7,199,34,59,238,34,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,89,255,255,255,125,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,247,34,0, + 59,241,89,0,175,201,0,0,0,0,0,0,0,0,0,7,206,255,166,0,0,12,232,89,0,0,0, + 0,7,206,255,166,0,0,12,232,89,0,0,0,0,0,0,0,59,215,21,0,89,201,0,0,0,0, + 0,0,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,7, + 206,255,255,251,89,0,59,241,89,0,0,0,138,201,0,0,0,138,201,0,0,89,225,21, + 175,125,0,0,12,228,34,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0, + 89,255,255,247,34,89,201,0,0,89,255,255,255,166,0,0,0,0,168,34,7,151,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,7,206,255,255,225,21,89,201,0,0,0, + 0,0,0,0,0,0,89,166,0,0,138,166,0,0,0,7,202,89,0,0,0,0,0,0,0,59,238,34,0, + 7,206,255,125,0,0,0,0,0,0,0,0,0,59,238,34,0,0,175,166,0,175,255,255,255, + 125,175,125,0,138,247,34,0,0,0,0,0,0,0,0,0,0,12,228,34,0,89,201,0,0,89, + 225,0,81,115,0,134,89,0,0,0,0,0,138,166,0,0,138,166,0,0,0,0,0,0,0,138,166, + 0,0,138,166,0,0,0,0,0,0,59,245,247,34,0,12,232,89,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,201,0,7,206,201,138,125, + 138,125,0,59,241,89,0,0,0,0,175,255,255,255,225,21,0,0,7,206,166,215,21, + 0,0,12,228,34,0,0,138,255,255,251,89,0,0,0,0,0,0,0,0,0,12,206,21,59,241, + 89,0,134,89,0,172,89,59,238,34,0,138,166,0,0,7,206,201,12,235,125,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,12,206,21,7,202,89,12,235,125,0,172,89,0,0,0,0, + 0,0,0,0,59,238,34,7,206,125,12,235,255,255,255,255,255,255,125,0,0,0,12, + 235,125,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,59,238,34,0,0,175,166,0,175,255, + 255,255,125,175,125,0,138,247,34,0,0,0,0,0,0,0,0,0,0,12,228,34,0,89,201, + 0,0,89,225,0,29,206,166,59,245,125,0,0,0,0,138,166,0,12,228,34,0,175,225, + 21,0,0,0,138,166,0,12,228,42,206,255,255,166,0,0,0,0,12,228,34,138,166, + 0,89,247,34,0,0,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,138,201,0,59,241,89,138,125,0,0,59,245,255,255,255,125,0,0,138,166, + 0,89,201,0,0,0,0,89,255,125,0,0,0,0,0,0,0,7,206,125,0,138,251,89,0,0,0, + 0,0,0,0,0,89,166,0,138,201,0,0,0,0,0,89,166,59,215,21,0,175,166,0,59,245, + 125,89,251,89,0,0,12,235,255,255,255,255,255,255,125,138,255,255,251,89, + 127,166,0,7,202,89,12,232,89,0,89,166,0,0,0,0,0,0,0,0,0,138,255,255,166, + 0,0,0,0,7,202,89,0,0,0,0,0,59,241,89,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0, + 0,59,238,34,0,0,175,166,0,89,255,255,255,125,175,125,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,12,228,34,0,59,241,89,0,175,201,0,0,0,175,201,7,206,201,0,0,0, + 138,166,0,175,166,0,138,200,215,21,0,0,0,138,166,0,175,166,7,151,0,89,247, + 34,0,0,0,59,238,47,228,34,59,219,209,34,0,0,0,89,255,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,59,238,34,138,125,0,0,0,59, + 241,89,0,0,0,0,138,166,0,89,201,0,0,59,245,255,255,255,255,125,0,0,0,0, + 0,59,238,34,0,7,206,125,0,0,0,0,0,0,0,0,89,166,0,138,201,0,0,0,0,0,89,166, + 0,175,255,255,223,166,0,12,235,125,59,241,89,0,0,0,0,0,0,0,0,0,175,125, + 0,0,0,0,0,138,125,0,7,206,255,255,125,0,0,59,157,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,7,202,89,0,0,0,0,7,206,255,255,255,166,7,206,255,255,201,0, + 0,0,0,0,0,0,0,0,59,238,34,0,0,175,166,0,0,89,255,255,125,175,125,0,0,0, + 0,0,0,0,0,0,0,0,0,0,89,255,255,251,89,0,89,255,255,225,21,0,0,0,175,225, + 29,206,166,0,0,0,138,166,59,215,21,59,215,81,215,21,0,0,0,138,166,59,215, + 21,0,0,0,89,225,21,59,245,255,255,125,138,166,7,202,97,199,34,0,0,89,251, + 89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,59,241, + 89,138,125,0,0,0,89,247,34,0,0,0,0,175,255,255,255,225,21,0,0,0,12,232, + 89,0,0,0,12,228,34,0,12,235,225,21,59,215,21,0,0,0,0,0,0,0,0,12,206,21, + 59,241,89,0,134,89,0,172,89,0,0,0,0,0,0,0,0,7,206,201,12,235,125,0,0,0, + 0,0,0,0,0,175,125,0,0,0,0,0,12,206,21,7,202,89,7,206,125,0,172,89,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,238,34,0,0,175,166,0,0,0,0,175,125,175,125,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,166,59,245,125,0,0,0,0,0,0, + 175,125,12,228,34,59,215,21,0,0,0,0,0,175,125,0,0,0,12,232,89,0,0,0,0,0, + 59,238,34,175,125,7,199,34,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,0,0,0,0,138,225,21,7,206,201,138,125,138,125,7,202,89,0,0,0, + 0,138,201,0,0,0,138,166,0,0,0,12,232,89,0,0,0,12,228,34,0,0,0,175,255,255, + 166,0,0,0,0,0,0,0,0,0,0,138,166,0,89,255,255,247,34,89,201,0,0,0,0,0,0, + 0,0,0,0,0,168,34,7,151,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,0,138,166,7,202, + 89,0,89,247,124,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,255,255, + 255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,125,0,7,206, + 166,0,0,0,0,175,125,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,59,115,0,134,89,0,0,0,0,0,0,59,215,21,59,245,255,255,255,225,21,0, + 0,0,59,215,21,0,0,59,238,34,0,0,0,0,0,0,175,125,7,206,255,255,255,251,89, + 0,138,247,34,0,59,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225, + 21,0,7,206,255,255,251,89,138,255,255,255,255,255,166,0,0,0,0,0,0,0,0,0, + 0,12,232,89,0,0,0,12,228,34,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,175, + 225,21,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,175,225,21,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,198, + 255,251,194,166,0,0,0,0,175,125,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,0,0,0,89,225,21,0,0,0, + 7,206,125,0,0,12,235,255,255,255,166,0,0,0,89,225,21,0,0,0,12,228,34,0, + 0,0,175,255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228, + 34,0,7,176,21,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,255,125, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89, + 255,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,0,0,0,175, + 125,175,125,0,0,0,0,0,0,0,0,59,215,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 12,228,34,0,7,206,255,255,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,0,0,0,175,125,175,125, + 0,0,0,0,0,0,59,245,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,0,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,89, + 255,125,0,0,0,0,0,0,12,235,201,0,0,0,0,12,235,251,89,0,0,0,0,175,255,125, + 89,201,0,0,0,0,0,0,0,0,0,0,0,59,245,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,0,0,0,138,251,89,0,0,0,12,235,251, + 89,0,0,0,0,0,0,0,0,7,206,225,21,0,0,0,89,255,125,0,89,255,225,21,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,247,34,172,89,0,0,0,0,7,206,225,21,0,0, + 0,0,0,0,0,89,255,125,0,0,0,0,0,0,89,255,225,21,0,0,0,0,12,235,247,34,172, + 89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89, + 255,125,0,0,0,0,0,0,0,7,206,225,21,0,0,0,0,89,255,225,21,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,89,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,89,247,34,0,0,0,0,0,175,166,0,0,0,0,7,206,125,59,241,89,0,0,89,201,12, + 235,247,34,0,0,7,206,166,59,241,89,0,0,12,228,34,59,215,21,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,89,247,34,0,0,0,7, + 206,125,59,241,89,0,7,206,166,59,238,34,0,0,175,166,0,0,59,241,89,0,89, + 247,34,138,201,59,238,34,138,201,0,0,0,0,0,0,0,0,0,0,0,175,125,89,255,201, + 0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,59,238,34,138,225, + 21,0,0,0,175,125,89,255,201,0,0,0,0,59,238,34,138,201,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,0,0,0,138,201,0,0,0,0, + 0,59,238,34,138,225,21,0,0,0,59,238,34,138,201,0,0,0,0,12,232,89,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,59,215,21,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,125,0, + 0,0,0,127,0,0,12,235,225,21,0,0,0,0,12,235,225,21,0,0,0,0,12,235,225,21, + 0,0,0,0,12,235,225,21,0,0,0,0,12,235,225,21,0,0,0,0,12,235,225,21,0,0,0, + 0,0,175,255,255,255,255,255,255,255,166,0,0,138,255,255,255,251,89,59,245, + 255,255,255,255,127,81,245,255,255,255,255,225,21,59,245,255,255,255,255, + 127,81,245,255,255,255,255,127,111,255,255,255,125,89,255,255,255,125,89, + 255,255,255,125,89,255,255,255,125,7,206,255,255,255,255,125,0,0,59,245, + 247,34,0,0,59,241,89,0,0,0,138,255,255,255,166,0,0,0,0,138,255,255,255, + 166,0,0,0,0,0,138,255,255,255,166,0,0,0,0,138,255,255,255,166,0,0,0,0,138, + 255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,255,255,210,235,166, + 59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59, + 241,89,59,241,89,0,0,0,59,241,132,245,125,0,0,0,89,251,89,12,232,89,0,0, + 0,0,7,206,166,0,89,251,89,0,0,0,127,0,0,89,232,241,89,0,0,0,0,89,232,241, + 89,0,0,0,0,89,232,241,89,0,0,0,0,89,232,241,89,0,0,0,0,89,232,241,89,0, + 0,0,0,89,232,241,89,0,0,0,0,12,232,89,89,225,21,0,0,0,0,0,175,247,34,0, + 0,59,192,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,0,59,241, + 89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0,7,206, + 166,0,0,59,245,201,0,59,245,255,201,0,0,59,241,89,0,0,138,251,89,0,12,235, + 166,0,0,138,251,89,0,12,235,166,0,0,0,138,251,89,0,12,235,166,0,0,138,251, + 89,0,12,235,166,0,0,138,251,89,0,12,235,166,0,0,0,138,166,0,0,0,12,228, + 34,0,0,175,247,34,0,0,175,225,21,59,241,89,0,0,0,59,241,89,59,241,89,0, + 0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,89,247, + 34,0,7,206,125,0,12,232,89,0,0,0,0,59,241,89,0,12,232,89,0,0,0,127,0,7, + 206,166,175,166,0,0,0,7,206,166,175,166,0,0,0,7,206,166,175,166,0,0,0,7, + 206,166,175,166,0,0,0,7,206,166,175,166,0,0,0,0,175,166,175,166,0,0,0,0, + 138,225,21,89,225,21,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,0,59,241, + 89,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,59,241, + 89,0,0,59,241,89,0,0,59,241,89,0,7,206,166,0,0,0,59,245,125,59,241,132, + 241,89,0,59,241,89,0,12,235,166,0,0,0,89,247,34,12,235,166,0,0,0,89,247, + 34,0,12,235,166,0,0,0,89,247,34,12,235,166,0,0,0,89,247,34,12,235,166,0, + 0,0,89,247,34,0,0,12,235,125,0,12,235,125,0,0,59,241,89,0,0,138,176,235, + 166,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0, + 59,241,89,59,241,89,0,0,0,59,241,89,0,175,201,0,138,225,21,0,12,235,255, + 255,255,225,21,59,238,34,0,138,225,21,0,0,0,127,0,59,238,34,89,247,34,0, + 0,59,238,34,89,247,34,0,0,59,238,34,89,247,34,0,0,59,238,34,89,247,34,0, + 0,59,238,34,89,247,34,0,0,59,241,89,89,225,21,0,0,7,206,125,0,89,225,21, + 0,0,0,0,138,225,21,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241, + 89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0, + 0,59,241,89,0,7,206,166,0,0,0,7,206,166,59,241,89,138,225,21,59,241,89, + 0,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,59,241,89,0,0,0, + 59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,0,0,12, + 235,138,235,125,0,0,0,138,225,21,0,59,215,21,175,201,59,241,89,0,0,0,59, + 241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0, + 0,0,59,241,89,0,59,245,166,241,89,0,0,12,232,89,0,0,175,225,59,238,47,235, + 225,21,0,0,0,0,127,0,138,201,0,12,235,125,0,0,138,201,0,12,235,125,0,0, + 138,201,0,12,235,125,0,0,138,201,0,12,235,125,0,0,138,201,0,12,235,125, + 0,0,138,225,21,12,235,125,0,0,89,247,34,0,89,255,255,255,255,251,89,138, + 225,21,0,0,0,0,0,59,245,255,255,255,255,127,59,245,255,255,255,255,166, + 0,59,245,255,255,255,255,127,59,245,255,255,255,255,127,0,59,241,89,0,0, + 59,241,89,0,0,59,241,89,0,0,59,241,89,7,206,255,255,255,166,0,0,175,201, + 59,241,89,12,235,125,59,241,89,0,59,241,89,0,0,0,12,235,125,59,241,89,0, + 0,0,12,235,125,0,59,241,89,0,0,0,12,235,125,59,241,89,0,0,0,12,235,125, + 59,241,89,0,0,0,12,235,125,0,0,0,0,12,235,125,0,0,0,0,138,225,21,7,199, + 34,0,138,225,81,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241, + 89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,0,138,255,166,0,0,0,12,232, + 89,0,0,89,247,59,238,34,0,59,245,125,0,0,0,127,7,206,125,0,0,175,201,0, + 7,206,125,0,0,175,201,0,7,206,125,0,0,175,201,0,7,206,125,0,0,175,201,0, + 7,206,125,0,0,175,201,0,7,206,125,0,0,175,201,0,7,206,255,255,255,255,225, + 21,0,0,0,0,138,225,21,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59, + 241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89, + 0,0,59,241,89,0,7,206,166,0,0,0,7,206,166,59,241,89,0,89,247,94,241,89, + 0,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,59,241,89,0,0,0, + 59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,0,0,12, + 235,138,235,125,0,0,0,138,225,21,175,125,0,0,175,201,59,241,89,0,0,0,59, + 241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0, + 0,0,59,241,89,0,0,59,241,89,0,0,0,12,232,89,0,7,206,201,59,238,34,0,0,138, + 201,0,0,0,127,59,245,255,255,255,255,247,34,59,245,255,255,255,255,247, + 34,59,245,255,255,255,255,247,34,59,245,255,255,255,255,247,34,59,245,255, + 255,255,255,247,34,59,245,255,255,255,255,247,34,59,241,89,0,0,89,225,21, + 0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241, + 89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0, + 0,59,241,89,0,7,206,166,0,0,0,59,241,89,59,241,89,0,7,206,200,241,89,0, + 12,235,166,0,0,0,89,247,34,12,235,166,0,0,0,89,247,34,0,12,235,166,0,0, + 0,89,247,34,12,235,166,0,0,0,89,247,34,12,235,166,0,0,0,89,247,34,0,0,12, + 235,125,0,12,235,125,0,0,59,241,159,166,0,0,12,235,166,12,232,89,0,0,0, + 59,238,34,12,232,89,0,0,0,59,238,34,12,232,89,0,0,0,59,238,34,12,232,89, + 0,0,0,59,238,34,0,0,59,241,89,0,0,0,12,235,255,255,255,201,0,59,238,34, + 0,0,138,201,0,0,0,127,138,201,0,0,0,12,235,125,138,201,0,0,0,12,235,125, + 138,201,0,0,0,12,235,125,138,201,0,0,0,12,235,125,138,201,0,0,0,12,235, + 125,138,201,0,0,0,12,235,125,175,201,0,0,0,89,225,21,0,0,0,0,0,175,247, + 34,0,0,59,192,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,0,59, + 241,89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0, + 7,206,166,0,0,59,245,201,0,59,241,89,0,0,59,245,251,89,0,0,138,251,89,0, + 59,245,166,0,0,138,251,89,0,59,245,166,0,0,0,138,251,89,0,59,245,166,0, + 0,138,251,89,0,59,245,166,0,0,138,251,89,0,59,245,166,0,0,0,138,166,0,0, + 0,12,228,34,0,0,175,247,34,0,7,206,225,21,0,138,225,21,0,7,206,166,0,0, + 138,225,21,0,7,206,166,0,0,138,225,21,0,7,206,166,0,0,138,225,21,0,7,206, + 166,0,0,0,59,241,89,0,0,0,12,232,89,0,0,0,0,59,238,34,0,12,235,125,0,0, + 0,127,206,125,0,0,0,0,175,206,206,125,0,0,0,0,175,206,206,125,0,0,0,0,175, + 206,206,125,0,0,0,0,175,206,206,125,0,0,0,0,175,206,206,125,0,0,0,0,175, + 232,245,125,0,0,0,89,255,255,255,255,255,166,0,0,138,255,255,255,251,89, + 59,245,255,255,255,255,127,81,245,255,255,255,255,225,21,59,245,255,255, + 255,255,127,81,245,255,255,255,255,127,111,255,255,255,125,89,255,255,255, + 125,89,255,255,255,125,89,255,255,255,125,7,206,255,255,255,255,125,0,0, + 59,241,89,0,0,0,175,251,89,0,0,0,138,255,255,255,166,0,0,0,0,138,255,255, + 255,166,0,0,0,0,0,138,255,255,255,166,0,0,0,0,138,255,255,255,166,0,0,0, + 0,138,255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,194,255,255,255,201, + 0,0,0,0,59,245,255,251,89,0,0,0,0,59,245,255,251,89,0,0,0,0,59,245,255, + 251,89,0,0,0,0,59,245,255,251,89,0,0,0,0,59,241,89,0,0,0,12,232,89,0,0, + 0,0,59,238,47,235,255,166,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,166,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,0, + 0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,201,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,7,206, + 225,21,0,0,0,0,0,12,235,201,0,0,0,138,255,201,0,0,0,59,245,225,29,202,89, + 0,0,0,0,0,0,0,0,138,166,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 7,206,225,21,0,0,0,0,0,12,235,201,0,0,0,89,255,225,21,0,0,0,0,0,0,0,0,175, + 247,34,0,12,235,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,59,245,225,29,202,89, + 0,0,138,251,89,0,0,0,0,0,7,206,225,21,0,0,0,89,255,225,21,0,0,59,245,225, + 29,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,225, + 21,0,0,0,0,0,89,255,125,0,0,0,89,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,138, + 251,89,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,175, + 166,0,0,0,0,7,206,166,0,0,0,89,225,21,175,201,0,7,202,89,138,255,166,0, + 0,89,247,34,175,166,0,0,138,166,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,7,206,166,0,0,0,0,0,175,166,0,0,0,89,247,34,138,201,0,0,89,247, + 34,175,201,0,0,138,201,0,175,200,215,34,235,247,47,232,0,138,255,225,111, + 225,21,0,0,172,89,138,255,166,0,0,0,0,89,225,21,0,0,0,0,175,201,0,0,0,0, + 89,247,34,138,201,0,0,172,89,138,255,166,0,0,59,238,34,138,201,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,0,0,0,0,59,241,89,0,0,0,89, + 247,34,138,201,0,0,0,59,238,34,138,201,0,0,0,89,247,34,0,0,59,238,34,0, + 0,0,0,0,138,225,29,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,201,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,225,21,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,12,235,166,0,0,0,0,0,0,0,0,89,166,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,7,206,255,255,255,125,0,7,206,255,255,255, + 125,0,7,206,255,255,255,125,0,7,206,255,255,255,125,0,7,206,255,255,255, + 125,0,12,235,255,255,251,89,0,12,235,255,255,251,89,59,245,255,166,0,0, + 59,245,255,255,201,0,12,235,255,251,89,0,0,12,235,255,251,89,0,0,12,235, + 255,251,89,0,0,12,235,255,251,89,0,59,238,34,59,238,34,59,238,34,59,238, + 34,0,59,241,89,175,225,21,0,59,241,194,255,255,125,0,0,12,235,255,247,34, + 0,0,12,235,255,247,34,0,0,0,12,235,255,247,34,0,0,12,235,255,247,34,0,0, + 12,235,255,247,34,0,0,0,0,0,12,235,166,0,0,0,0,7,206,255,255,225,21,0,59, + 241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241, + 89,0,59,241,97,206,166,0,0,12,235,125,59,238,163,255,255,201,7,206,166, + 0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,89,247,34,0,0,0,0,89,247, + 34,0,0,0,0,89,247,34,0,0,0,0,89,247,34,0,0,0,0,89,247,34,0,0,0,0,138,225, + 21,0,0,0,0,89,255,225,21,0,138,201,59,245,125,0,0,0,7,206,125,0,89,225, + 21,7,206,125,0,89,225,21,7,206,125,0,89,225,21,7,206,125,0,89,225,21,59, + 238,34,59,238,34,59,238,34,59,238,34,0,0,0,0,12,235,125,0,59,245,166,0, + 89,247,34,7,206,166,0,138,225,21,7,206,166,0,138,225,21,0,7,206,166,0,138, + 225,21,7,206,166,0,138,225,21,7,206,166,0,138,225,21,0,0,0,0,0,0,0,0,0, + 0,12,232,89,0,138,251,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89, + 59,241,89,0,59,241,89,0,59,241,89,0,59,241,89,89,247,34,0,89,247,34,59, + 245,166,0,7,206,166,89,247,34,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 59,241,89,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0, + 59,241,89,0,0,0,0,59,238,34,0,0,0,0,12,232,89,0,0,59,238,127,225,21,0,0, + 0,59,238,34,0,59,238,34,59,238,34,0,59,238,34,59,238,34,0,59,238,34,59, + 238,34,0,59,238,34,59,238,34,59,238,34,59,238,34,59,238,34,0,138,255,255, + 255,255,201,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59, + 241,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241, + 89,0,12,235,255,255,255,255,255,255,166,138,201,0,59,157,175,201,0,59,241, + 89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241,89, + 0,59,241,89,12,235,125,0,175,166,0,59,238,34,0,0,138,225,34,235,125,0,175, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,89,255,255,255,251,89,0,89,255,255,255,251, + 89,0,89,255,255,255,251,89,0,89,255,255,255,251,89,0,89,255,255,255,251, + 89,0,138,255,255,255,247,34,0,175,255,255,255,255,255,255,255,255,251,127, + 201,0,0,0,0,59,245,255,255,255,251,89,59,245,255,255,255,251,89,59,245, + 255,255,255,251,89,59,245,255,255,255,251,89,59,238,34,59,238,34,59,238, + 34,59,238,34,138,247,34,0,0,138,201,0,59,241,89,0,59,241,89,59,238,34,0, + 12,232,89,59,238,34,0,12,232,89,0,59,238,34,0,12,232,89,59,238,34,0,12, + 232,89,59,238,34,0,12,232,89,0,0,0,0,0,0,0,0,0,0,175,201,7,176,21,138,201, + 0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59, + 241,89,0,59,241,89,0,175,201,12,232,89,0,59,238,34,0,0,138,225,21,175,201, + 12,232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,59,241,89,0,59,241,89,59,241,89,0,59, + 241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89, + 138,247,34,0,59,238,34,138,225,21,0,12,232,89,0,0,0,0,138,201,0,0,0,0,59, + 238,34,0,0,0,0,59,238,34,0,0,0,0,59,238,34,0,0,0,0,59,238,34,0,0,0,0,59, + 238,34,59,238,34,59,238,34,59,238,34,175,201,0,0,0,138,166,0,59,241,89, + 0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241,89,0,59, + 241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,0,0,0,12,235,166,0, + 0,0,138,201,134,89,0,175,166,0,59,241,89,0,59,241,89,59,241,89,0,59,241, + 89,59,241,89,0,59,241,89,0,59,241,89,0,59,241,89,0,89,247,124,225,21,0, + 59,238,34,0,0,138,201,0,89,247,124,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,89,247, + 34,0,89,251,89,89,247,34,0,89,251,89,89,247,34,0,89,251,89,89,247,34,0, + 89,251,89,89,247,34,0,89,251,89,175,201,0,0,175,247,34,175,201,0,0,59,245, + 225,21,0,7,199,94,245,125,0,0,0,7,206,166,0,7,199,34,7,206,166,0,7,199, + 34,7,206,166,0,7,199,34,7,206,166,0,7,199,34,59,238,34,59,238,34,59,238, + 34,59,238,34,138,247,34,0,12,232,89,0,59,241,89,0,59,241,89,7,206,166,0, + 138,225,21,7,206,166,0,138,225,21,0,7,206,166,0,138,225,21,7,206,166,0, + 138,225,21,7,206,166,0,138,225,21,0,0,0,0,12,235,166,0,0,0,59,245,166,0, + 59,241,89,0,12,235,125,0,175,251,89,12,235,125,0,175,251,89,12,235,125, + 0,175,251,89,0,12,235,125,0,175,251,89,0,7,206,255,125,0,0,59,238,34,0, + 12,235,125,0,7,206,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,175,255,255,232, + 241,89,0,175,255,255,232,241,89,0,175,255,255,232,241,89,0,175,255,255, + 232,241,89,0,175,255,255,232,241,89,12,235,255,255,166,238,34,12,235,255, + 255,225,21,89,255,255,251,89,0,89,255,255,255,201,0,12,235,255,251,89,0, + 0,12,235,255,251,89,0,0,12,235,255,251,89,0,0,12,235,255,251,89,0,59,238, + 34,59,238,34,59,238,34,59,238,34,0,138,255,255,255,125,0,0,59,241,89,0, + 59,241,89,0,12,235,255,247,34,0,0,12,235,255,247,34,0,0,0,12,235,255,247, + 34,0,0,12,235,255,247,34,0,0,12,235,255,247,34,0,0,0,0,0,0,0,0,0,0,0,7, + 206,255,255,225,21,0,0,0,89,255,255,166,241,89,0,89,255,255,166,241,89, + 0,89,255,255,166,241,89,0,0,89,255,255,166,241,89,0,0,138,247,34,0,0,59, + 245,166,255,255,166,0,0,0,138,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,215,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,59,238,34,0,0,0,0,0, + 12,232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,12,235,255,125,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,138,225,21,0,0,0,59,238,34,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,0,127,127,0,127,127, + 0,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + + +// Large font anti-aliased +const int FONT2AA_BM_W = 276; +const int FONT2AA_BM_H = 120; +static const unsigned char s_Font2AA[] = +{ + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,0, + 0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,59,245,125,175,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,241,89,0,0,12,235,201,89,255,166,0,0,0,0,0,172,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225,21,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0, + 0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,138,247,34,0,12, + 232,89,138,225,21,0,0,0,0,138,125,7,199,34,0,0,0,0,138,125,0,0,0,0,138, + 255,255,201,0,0,0,59,215,21,0,0,0,0,59,245,255,255,166,0,0,0,59,241,89, + 0,7,206,201,0,0,89,251,89,0,59,215,21,172,89,59,192,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,0,0,138,255,251,89,0,0,0,0,0, + 138,201,0,0,0,7,206,255,255,255,166,0,0,7,206,255,255,255,201,0,0,0,0,0, + 0,138,251,89,0,0,175,255,255,255,255,225,21,0,0,12,235,255,255,125,89,255, + 255,255,255,255,251,89,0,12,235,255,255,225,21,0,0,59,245,255,255,166,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,59,245,255,255,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,89,247, + 34,0,12,232,89,138,201,0,0,0,0,7,202,89,59,215,21,0,0,12,235,255,255,255, + 166,0,59,241,89,12,235,125,0,0,172,89,0,0,0,0,7,206,166,0,89,251,89,0,0, + 12,228,34,0,89,247,34,0,0,0,175,201,0,0,89,251,191,194,247,34,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,175,201,0,12,235, + 125,0,0,138,255,255,201,0,0,0,12,182,0,0,59,245,125,0,12,206,21,0,12,235, + 166,0,0,0,0,89,255,251,89,0,0,175,201,0,0,0,0,0,0,89,255,125,0,0,0,0,0, + 0,0,0,89,251,89,12,235,166,0,7,206,201,0,59,245,125,0,12,235,166,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,89,166,0,0,138,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0, + 0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,12, + 228,34,89,201,0,0,0,0,12,206,21,89,166,0,0,12,235,125,138,125,59,192,0, + 89,247,34,7,206,166,0,89,201,0,0,0,0,0,12,235,125,0,12,232,89,0,0,12,228, + 34,0,175,201,0,0,0,0,59,241,89,0,0,7,206,166,0,0,0,0,0,0,0,138,166,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225,21,59,241,89,0,0,138,225,21,0, + 0,0,175,201,0,0,0,0,0,0,0,7,206,201,0,0,0,0,0,0,175,201,0,0,0,59,241,132, + 241,89,0,0,175,201,0,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0,7,206,201,0,59,241, + 89,0,0,138,225,21,138,225,21,0,0,138,225,21,89,255,125,0,0,89,255,125,0, + 0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0, + 0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0,0,0, + 0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,0,0,0,0,0,0, + 0,89,255,255,255,255,255,255,255,125,59,238,34,138,125,0,0,0,89,247,34, + 7,206,166,7,202,89,0,0,0,0,0,0,175,225,21,138,225,21,0,0,0,0,0,12,235,125, + 0,0,0,0,7,206,125,0,89,251,191,194,247,34,0,0,0,0,0,138,166,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,89,247,34,0,0,89,247,34,0,0,0,175,201, + 0,0,0,0,0,0,0,12,235,166,0,0,0,0,0,59,245,125,0,0,12,235,125,59,241,89, + 0,0,175,201,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,89,247,34,0,12,235,201, + 0,0,175,201,0,138,225,21,0,0,89,247,34,89,255,125,0,0,89,255,125,0,0,0, + 0,0,12,235,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,175,255,251,89,0,0,0,0, + 0,0,0,0,138,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0, + 0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,0,0,0,0, + 0,0,0,0,0,175,125,7,199,34,0,0,12,235,166,138,125,0,0,0,59,241,89,12,235, + 125,89,201,12,235,255,251,89,0,0,7,206,255,166,0,59,241,89,0,0,0,59,238, + 34,0,0,0,0,0,175,166,59,215,21,172,89,59,192,0,0,0,0,0,138,166,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,138,247,34,0,0,89,247,34,0,0,0, + 175,201,0,0,0,0,0,0,0,89,251,89,0,0,0,89,255,247,34,0,0,7,206,166,0,59, + 241,89,0,0,175,255,255,255,225,21,0,89,251,226,255,255,247,34,0,0,0,7,206, + 166,0,0,0,12,235,255,255,201,0,0,89,255,125,0,0,138,247,34,0,0,0,0,0,0, + 0,0,0,0,0,89,255,255,166,0,0,0,0,0,175,255,255,255,255,255,255,225,21,0, + 0,0,0,59,245,255,201,0,0,0,0,0,175,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0, + 0,0,89,225,21,0,0,0,0,0,0,0,0,0,7,199,34,59,215,21,0,0,0,59,245,255,255, + 201,0,0,0,138,255,255,201,12,228,34,175,166,0,138,201,0,12,235,125,89,255, + 125,59,241,89,0,0,0,59,238,34,0,0,0,0,0,138,201,0,0,0,172,89,0,0,0,7,206, + 255,255,255,255,255,255,247,34,0,0,0,0,89,255,255,255,166,0,0,0,0,0,59, + 238,34,0,138,247,34,0,0,89,247,34,0,0,0,175,201,0,0,0,0,0,0,59,245,166, + 0,0,0,0,0,0,12,235,166,0,138,201,0,0,59,241,89,0,0,0,0,0,12,235,201,0,138, + 251,89,0,0,175,225,21,0,0,89,247,34,0,0,7,206,166,0,175,255,166,0,0,89, + 255,255,255,223,247,34,0,0,0,0,0,0,0,0,0,0,175,247,34,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,225,21,0,0,175,225,21,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0, + 0,0,127,0,0,0,0,0,59,215,21,0,0,0,0,0,0,0,12,235,255,255,255,255,255,255, + 166,0,0,0,0,138,125,175,225,21,0,0,0,0,0,138,166,7,206,125,0,89,247,34, + 138,225,21,0,89,255,166,215,21,0,0,0,59,238,34,0,0,0,0,0,138,201,0,0,0, + 0,0,0,0,0,0,0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,201,0, + 0,89,247,34,0,0,89,247,34,0,0,0,175,201,0,0,0,0,0,12,235,201,0,0,0,0,0, + 0,0,0,138,225,21,175,255,255,255,255,255,255,125,0,0,0,0,0,138,247,34,89, + 247,34,0,0,59,241,89,0,7,206,166,0,0,0,138,247,34,0,0,138,247,34,0,0,0, + 0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,89,255,255,166,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,59,245,255,201,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0, + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,166,0,175,125,0,0,0,0,0,0,138, + 125,89,247,34,0,0,0,0,12,228,34,7,206,125,0,89,247,34,138,247,34,0,0,89, + 255,166,0,0,0,0,59,238,34,0,0,0,0,0,175,166,0,0,0,0,0,0,0,0,0,0,0,0,138, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,0,59,241,89,0,0,138,225, + 21,0,0,0,175,201,0,0,0,0,12,235,201,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0, + 0,59,241,89,0,0,0,0,0,0,138,225,21,59,241,89,0,0,59,241,89,0,89,247,34, + 0,0,0,138,247,34,0,0,89,251,89,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,12,235,255,225,21,0,0,175,255,255,255,255,255,255,225,21,0,0,175, + 255,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,89,247, + 34,0,0,0,0,0,0,0,0,0,175,125,7,199,34,0,0,0,89,201,0,138,125,175,201,0, + 0,0,0,0,138,166,0,0,175,166,0,138,201,0,89,255,166,0,0,89,255,255,125,0, + 0,0,12,235,125,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,0, + 0,0,138,255,125,0,0,0,0,0,0,175,247,34,59,238,34,0,0,0,175,201,0,12,235, + 125,0,0,0,0,175,201,0,0,0,12,235,166,0,0,0,0,0,89,166,0,0,59,245,166,0, + 0,0,0,0,59,241,89,0,59,215,21,0,12,235,166,0,7,206,201,0,0,175,225,21,7, + 206,166,0,0,0,0,59,245,166,0,7,206,225,21,0,0,0,0,175,225,21,0,89,255,125, + 0,0,12,235,201,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,138,201, + 0,0,0,0,0,0,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0,0,0,89,247, + 34,0,0,0,0,0,0,0,0,7,199,34,59,215,21,0,0,0,12,235,255,255,255,201,0,0, + 0,0,0,59,215,21,0,0,12,235,255,251,89,0,0,89,255,255,255,201,0,89,255,0, + 0,0,0,175,201,0,0,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175, + 201,0,0,0,0,0,0,0,175,247,34,138,201,0,0,0,0,0,138,255,251,89,0,0,0,138, + 255,255,255,255,166,0,89,255,255,255,255,255,247,34,12,235,255,255,255, + 166,0,0,0,0,0,0,59,241,89,0,12,235,255,255,255,166,0,0,0,7,206,255,255, + 225,21,0,138,247,34,0,0,0,0,0,59,245,255,255,201,0,0,0,175,255,255,201, + 0,0,0,89,255,125,0,0,89,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,4,4,4,4,4,4,4,4,52,4,4,4,4,4,4,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,175,201,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0,0,0,175,125, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,201,0,0,89,251,89,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0,0,0,0,0,0,0,12,232,89, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,201,201,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,0,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 127,0,127,127,127,0,127,127,127,127,0,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255, + 201,0,138,201,0,0,0,0,89,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,175,255,255,255,247,34,0,0,0,0,0,7,206,251,89,0,0,12,0, + 235,255,255,255,255,201,0,0,0,0,59,245,255,255,255,201,12,0,235,255,255, + 255,255,166,0,0,0,12,235,255,255,255,255,255,127,12,235,255,255,255,255, + 251,89,0,0,12,235,255,255,255,251,89,12,235,166,0,0,0,12,235,125,89,255, + 255,255,201,0,0,175,255,255,225,21,12,235,166,0,0,7,206,251,102,0,235,166, + 0,0,0,0,12,235,251,89,0,0,0,89,255,225,21,12,235,251,89,0,0,12,235,125, + 0,0,0,138,255,255,166,0,0,0,12,235,255,255,255,251,89,0,0,0,0,175,255,255, + 201,0,0,0,12,235,255,255,255,251,89,0,0,0,12,235,255,255,255,247,47,235, + 255,255,255,255,255,255,255,138,0,235,125,0,0,0,59,245,133,206,166,0,0, + 0,0,59,245,255,133,201,0,0,0,138,251,89,0,0,12,235,133,206,247,34,0,0,0, + 175,229,216,225,21,0,0,0,138,247,124,255,255,255,255,255,255,125,7,206, + 125,0,0,0,59,238,34,0,0,0,0,0,12,235,125,0,0,0,0,175,247,34,0,0,0,0,0,0, + 0,0,0,0,127,0,0,59,245,166,0,0,0,59,245,166,0,0,0,0,59,245,255,166,0,0, + 12,0,235,166,0,0,59,245,125,0,0,138,255,125,0,0,7,202,102,0,235,166,0,0, + 59,245,225,21,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,89,255,166, + 0,0,0,89,127,12,235,166,0,0,0,12,235,125,0,12,235,125,0,0,0,0,0,138,225, + 21,12,235,166,0,7,206,225,21,12,0,235,166,0,0,0,0,12,235,255,166,0,0,7, + 206,255,225,21,12,235,255,201,0,0,12,235,125,0,59,245,166,0,0,138,251,89, + 0,12,235,166,0,0,138,251,89,0,89,255,125,0,0,89,255,125,0,12,235,166,0, + 0,138,251,89,0,12,235,166,0,0,7,202,89,0,0,0,138,225,21,0,0,12,0,235,125, + 0,0,0,59,245,125,138,225,21,0,0,0,138,225,151,34,247,34,0,0,175,255,125, + 0,0,89,247,34,12,235,166,0,0,89,247,34,59,245,125,0,0,59,245,125,0,0,0, + 0,0,138,247,34,7,206,125,0,0,0,7,206,125,0,0,0,0,0,12,235,125,0,0,0,138, + 225,187,201,0,0,0,0,0,0,0,0,0,0,127,0,12,232,89,0,0,0,0,0,12,232,89,0,0, + 0,138,225,151,225,21,0,12,0,235,166,0,0,12,235,166,0,12,235,166,0,0,0,0, + 0,12,0,235,166,0,0,0,12,235,166,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0, + 0,0,12,235,166,0,0,0,0,0,0,12,235,166,0,0,0,12,235,125,0,12,235,125,0,0, + 0,0,0,138,225,21,12,235,166,0,175,225,21,0,12,0,235,166,0,0,0,0,12,235, + 166,238,34,0,59,215,187,225,21,12,235,166,245,125,0,12,235,125,12,235,125, + 0,0,0,0,138,247,34,12,235,166,0,0,12,235,166,12,235,125,0,0,0,0,138,247, + 34,12,235,166,0,0,12,235,166,0,89,247,34,0,0,0,0,0,0,0,0,138,225,21,0,0, + 12,0,235,125,0,0,0,59,245,125,59,241,89,0,0,7,206,166,59,0,241,89,0,12, + 232,194,201,0,0,138,225,21,0,89,251,89,12,235,166,0,0,138,247,34,7,206, + 201,0,0,0,0,0,59,245,125,0,7,206,125,0,0,0,0,138,201,0,0,0,0,0,12,235,125, + 0,0,59,241,89,12,235,166,0,0,0,0,0,0,0,0,0,127,0,175,166,0,59,245,255,255, + 247,34,138,201,0,0,7,206,166,59,241,89,0,12,0,235,166,0,0,89,251,89,0,89, + 247,34,0,0,0,0,0,12,0,235,166,0,0,0,0,138,225,21,12,235,166,0,0,0,0,0,12, + 235,166,0,0,0,0,0,89,247,34,0,0,0,0,0,0,12,235,166,0,0,0,12,235,125,0,12, + 235,125,0,0,0,0,0,138,225,21,12,235,166,175,247,34,0,0,12,0,235,166,0,0, + 0,0,12,235,133,206,166,0,175,166,175,225,21,12,235,125,138,225,21,12,235, + 125,89,247,34,0,0,0,0,59,245,125,12,235,166,0,0,12,235,166,89,247,34,0, + 0,0,0,59,245,125,12,235,166,0,0,12,235,125,0,89,255,125,0,0,0,0,0,0,0,0, + 138,225,21,0,0,12,0,235,125,0,0,0,59,245,125,7,206,201,0,0,59,241,89,7, + 0,206,166,0,59,215,111,225,21,7,206,166,0,0,0,175,225,187,225,21,0,0,12, + 235,166,89,247,34,0,0,0,0,7,206,201,0,0,7,206,125,0,0,0,0,89,225,21,0,0, + 0,0,12,235,125,0,12,235,166,0,0,59,241,89,0,0,0,0,0,0,0,0,127,0,202,89, + 12,235,125,0,12,228,34,59,215,0,0,59,241,89,7,206,166,0,12,0,235,255,255, + 255,255,166,0,0,138,225,21,0,0,0,0,0,12,0,235,166,0,0,0,0,89,247,34,12, + 235,255,255,255,255,247,34,12,235,255,255,255,255,247,0,163,225,21,0,0, + 0,0,0,0,12,235,255,255,255,255,255,255,125,0,12,235,125,0,0,0,0,0,138,225, + 21,12,235,255,247,34,0,0,0,12,0,235,166,0,0,0,0,12,235,125,89,225,34,228, + 34,175,225,21,12,235,125,12,235,125,12,235,125,138,225,21,0,0,0,0,12,235, + 166,12,235,166,0,0,175,247,34,138,225,21,0,0,0,0,12,235,166,12,235,166, + 0,0,175,225,21,0,0,175,255,255,225,21,0,0,0,0,0,138,225,21,0,0,12,0,235, + 125,0,0,0,59,245,125,0,138,247,34,0,138,225,21,0,0,175,201,0,138,201,12, + 232,89,12,235,125,0,0,0,12,235,251,89,0,0,0,0,89,255,255,125,0,0,0,0,0, + 138,247,34,0,0,7,206,125,0,0,0,0,12,232,89,0,0,0,0,12,235,125,7,206,201, + 0,0,0,0,138,251,89,0,0,0,0,0,0,0,127,7,228,34,89,225,21,0,12,228,34,12, + 228,0,0,138,225,21,0,138,225,21,12,0,235,166,0,0,12,235,201,0,138,225,21, + 0,0,0,0,0,12,0,235,166,0,0,0,0,89,247,34,12,235,166,0,0,0,0,0,12,235,166, + 0,0,0,0,0,138,225,21,0,12,235,255,255,127,12,235,166,0,0,0,12,235,125,0, + 12,235,125,0,0,0,0,0,138,225,21,12,235,229,216,225,21,0,0,12,0,235,166, + 0,0,0,0,12,235,125,12,235,223,201,0,175,225,21,12,235,125,0,138,225,34, + 235,125,138,225,21,0,0,0,0,12,235,166,12,235,255,255,255,247,34,0,138,225, + 21,0,0,0,0,12,235,166,12,235,255,255,255,166,0,0,0,0,0,0,89,255,255,247, + 34,0,0,0,138,225,21,0,0,12,0,235,125,0,0,0,59,245,125,0,59,245,125,7,206, + 166,0,0,0,89,247,34,175,125,7,206,125,89,247,34,0,0,0,12,235,251,89,0,0, + 0,0,7,206,225,21,0,0,0,0,59,245,125,0,0,0,7,206,125,0,0,0,0,0,175,166,0, + 0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,12,228,34,89,225, + 21,0,12,228,34,59,215,0,7,206,255,255,255,255,251,89,12,0,235,166,0,0,0, + 138,247,0,124,247,34,0,0,0,0,0,12,0,235,166,0,0,0,0,138,225,21,12,235,166, + 0,0,0,0,0,12,235,166,0,0,0,0,0,89,247,34,0,0,0,0,175,127,12,235,166,0,0, + 0,12,235,125,0,12,235,125,0,0,0,0,0,138,225,21,12,235,166,59,245,201,0, + 0,12,0,235,166,0,0,0,0,12,235,125,0,138,251,89,0,175,225,21,12,235,125, + 0,12,235,138,235,125,89,247,34,0,0,0,0,59,245,125,12,235,166,0,0,0,0,0, + 89,247,34,0,0,0,0,59,245,125,12,235,166,0,175,247,34,0,0,0,0,0,0,0,59,245, + 166,0,0,0,138,225,21,0,0,12,0,235,125,0,0,0,59,241,89,0,7,206,201,59,241, + 89,0,0,0,59,241,102,232,89,0,138,201,138,225,21,0,0,0,175,201,175,225,21, + 0,0,0,0,175,225,21,0,0,0,7,206,201,0,0,0,0,7,206,125,0,0,0,0,0,89,225,21, + 0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,12,232,89,59,241, + 89,0,89,247,34,89,201,0,59,241,89,0,0,7,206,166,12,0,235,166,0,0,0,138, + 225,0,81,245,166,0,0,0,0,0,12,0,235,166,0,0,0,12,235,166,0,12,235,166,0, + 0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,175,127,12,235,166,0,0, + 0,12,235,125,0,12,235,125,0,0,0,0,0,138,225,21,12,235,166,0,89,255,166, + 0,12,0,235,166,0,0,0,0,12,235,125,0,12,182,0,0,175,225,21,12,235,125,0, + 0,138,232,245,125,12,235,125,0,0,0,0,138,247,34,12,235,166,0,0,0,0,0,12, + 235,125,0,0,0,0,138,247,34,12,235,166,0,7,206,225,21,0,0,0,0,0,0,12,235, + 166,0,0,0,138,225,21,0,0,12,0,235,166,0,0,0,89,251,89,0,0,138,247,163,225, + 21,0,0,0,7,206,200,215,21,0,89,225,187,166,0,0,0,89,251,89,12,235,166,0, + 0,0,0,175,225,21,0,0,0,138,247,34,0,0,0,0,7,206,125,0,0,0,0,0,12,232,89, + 0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,12,175,166,0,89, + 255,255,210,235,255,255,125,0,138,225,21,0,0,0,138,247,47,0,235,166,0,0, + 59,245,166,0,0,138,255,125,0,0,7,202,102,0,235,166,0,0,12,235,225,21,0, + 12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,138,255,125,0,0,0,175,127,12, + 235,166,0,0,0,12,235,125,0,12,235,125,0,0,0,0,7,206,201,0,12,235,166,0, + 0,138,255,125,12,0,235,166,0,0,0,12,0,235,125,0,0,0,0,0,175,225,21,12,235, + 125,0,0,12,235,255,125,0,89,255,125,0,0,89,251,89,0,12,235,166,0,0,0,0, + 0,0,89,255,125,0,0,89,255,125,0,12,235,166,0,0,12,235,201,0,138,166,0,0, + 0,138,251,89,0,0,0,138,225,21,0,0,0,0,138,247,34,0,7,206,225,21,0,0,12, + 235,255,166,0,0,0,0,0,175,255,201,0,0,12,235,255,125,0,0,12,235,166,0,0, + 138,251,89,0,0,0,175,225,21,0,0,89,251,89,0,0,0,0,0,7,206,125,0,0,0,0,0, + 0,175,166,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,59,241, + 89,0,0,0,0,0,0,0,0,7,206,166,0,0,0,0,59,245,138,0,235,255,255,255,255,125, + 0,0,0,0,59,245,255,255,255,201,12,0,235,255,255,255,255,166,0,0,0,12,235, + 255,255,255,255,255,127,12,235,166,0,0,0,0,0,0,0,59,245,255,255,255,225, + 21,12,235,166,0,0,0,12,235,125,89,255,255,255,210,127,235,255,255,225,21, + 0,12,235,166,0,0,0,175,255,127,0,235,255,255,255,247,47,0,235,125,0,0,0, + 0,0,175,225,21,12,235,125,0,0,0,138,255,125,0,0,0,175,255,255,201,0,0,0, + 12,235,166,0,0,0,0,0,0,0,0,175,255,255,201,0,0,0,12,235,166,0,0,0,89,255, + 225,34,235,255,255,255,247,34,0,0,0,0,138,225,21,0,0,0,0,0,138,255,255, + 255,201,0,0,0,0,0,175,251,89,0,0,0,0,0,89,255,166,0,0,7,206,247,34,0,7, + 206,225,21,0,0,7,206,225,21,0,0,175,225,21,0,0,138,255,255,255,255,255, + 255,166,7,206,125,0,0,0,0,0,0,138,201,0,0,0,12,235,125,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,89,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,7,206,125,0,0,0,0,0,0,59,238,34,0,0,12,235,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,7,206,255,255,255,225,21,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,251,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,7,206,125,0,0,0,0,0,0,7,206,125,0,0,12,235,125,0,0,0, + 0,0,0,0,0,0,0,245,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138, + 255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,201,0,0,0,0,0,0,89,89,255,255, + 255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,59,245,166,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,89,247,34,0,0,0,0,0,0,0,0,0,0,12,235, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,12,235, + 255,247,0,0,0,0,0,0,0,12,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125, + 0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,251,89,0,7,206,125,0,89,255,251,89, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,84,84,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,7,206, + 125,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138, + 225,21,0,0,0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,12,12,235,125,0,0,0, + 0,0,59,245,102,0,89,247,34,12,235,125,0,0,0,0,0,12,235,125,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 59,241,89,0,0,0,7,206,125,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 4,4,4,4,4,4,4,4,100,252,252,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12, + 235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,12,0, + 235,125,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125, + 0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,7,206,125,0,0,0,59,238, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,20,236,252,164,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,0,12,235,255,255,255,166,0,12,235,166,245,255,247,34,0,0,12, + 235,255,255,247,34,0,34,235,255,255,255,225,21,0,12,235,255,255,225,29, + 0,206,255,255,255,127,0,12,235,255,255,255,225,21,12,235,138,235,255,247, + 34,0,12,235,102,175,255,247,34,12,235,125,0,59,245,201,0,12,235,125,12, + 0,235,166,245,255,225,29,206,255,251,89,0,12,235,138,235,255,247,34,0,0, + 12,235,255,255,201,0,0,12,235,166,245,255,251,89,0,0,12,235,255,255,255, + 225,21,12,235,138,235,247,127,34,138,255,255,255,206,0,206,255,255,255, + 201,59,241,89,0,0,89,247,42,206,201,0,0,0,138,225,187,201,0,0,138,225,21, + 0,59,241,187,226,247,34,0,7,206,206,206,201,0,0,0,138,225,151,255,255,255, + 255,247,0,0,89,247,34,0,0,0,7,206,125,0,0,0,59,238,34,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,4,4,4,4,4,4,4,148,252,236,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,12,206, + 21,0,59,245,125,12,235,247,34,0,138,225,21,12,235,166,0,0,134,102,0,235, + 166,0,0,138,225,21,12,235,125,0,0,175,201,12,0,235,125,0,0,12,235,166,0, + 0,138,225,21,12,235,247,34,0,175,201,0,12,235,102,0,89,247,34,12,235,125, + 12,235,166,0,0,12,235,125,12,0,235,225,21,12,235,251,89,0,175,201,0,12, + 235,247,34,0,175,201,0,12,235,166,0,7,206,201,0,12,235,225,21,0,175,225, + 21,12,235,166,0,0,138,225,21,12,235,247,34,0,0,89,247,34,0,12,206,34,0, + 235,125,0,0,59,241,89,0,0,89,247,34,89,247,34,0,7,206,166,138,225,21,7, + 206,251,89,0,89,225,138,34,235,201,0,138,225,21,89,247,34,0,7,206,166,0, + 0,0,7,206,166,0,0,89,225,21,0,0,0,7,206,125,0,0,0,59,241,89,0,0,0,0,138, + 251,89,0,0,7,202,89,0,0,4,4,4,4,4,4,52,252,252,108,4,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,0,0,7,206,102,12,235,125,0,0,59,241,89,138,225,21,0,0,0,34, + 89,225,21,0,0,138,225,21,89,225,21,0,0,89,247,47,0,235,125,0,0,89,225,21, + 0,0,138,225,21,12,235,125,0,0,89,247,34,12,235,102,0,89,247,34,12,235,138, + 235,166,0,0,0,12,235,125,12,0,235,125,0,7,206,166,0,0,138,225,21,12,235, + 125,0,0,89,247,34,138,225,21,0,0,59,238,34,12,235,125,0,0,59,241,89,89, + 225,21,0,0,138,225,21,12,235,125,0,0,0,138,225,21,0,0,0,12,0,235,125,0, + 0,59,241,89,0,0,89,247,34,12,235,125,0,59,241,89,59,238,34,12,228,198,166, + 0,175,166,59,0,89,251,132,241,89,0,12,235,125,0,59,238,34,0,0,0,138,225, + 21,0,12,235,166,0,0,0,0,7,206,125,0,0,0,0,175,201,0,0,0,138,166,12,235, + 166,0,12,232,89,0,0,12,84,4,4,4,4,204,252,204,4,4,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0, + 0,0,0,59,245,255,255,255,102,12,235,125,0,0,12,235,125,175,201,0,0,0,0, + 0,175,201,0,0,0,138,225,21,175,255,255,255,255,255,247,47,0,235,125,0,0, + 175,201,0,0,0,138,225,21,12,235,125,0,0,89,247,34,12,235,102,0,89,247,34, + 12,235,255,225,21,0,0,0,12,235,125,12,0,235,125,0,7,206,166,0,0,138,225, + 21,12,235,125,0,0,89,247,34,175,201,0,0,0,12,232,89,12,235,125,0,0,12,235, + 125,175,201,0,0,0,138,225,21,12,235,125,0,0,0,59,245,255,247,34,0,12,0, + 235,125,0,0,59,241,89,0,0,89,247,34,0,175,201,0,138,201,0,12,235,125,89, + 201,89,225,29,206,125,12,0,0,175,255,166,0,0,0,175,201,0,138,201,0,0,0, + 89,251,89,0,138,247,34,0,0,0,0,0,7,206,125,0,0,0,0,0,89,255,125,7,202,89, + 0,89,251,89,89,201,0,0,0,172,252,84,4,4,100,252,252,60,4,4,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,0,89,255,166,0,7,206,102,12,235,125,0,0,12,235,125,175,201, + 0,0,0,0,0,175,201,0,0,0,138,225,21,175,201,0,0,0,0,0,12,0,235,125,0,0,175, + 201,0,0,0,138,225,21,12,235,125,0,0,89,247,34,12,235,102,0,89,247,34,12, + 235,138,235,201,0,0,0,12,235,125,12,0,235,125,0,7,206,166,0,0,138,225,21, + 12,235,125,0,0,89,247,34,175,201,0,0,0,12,232,89,12,235,125,0,0,12,235, + 125,175,201,0,0,0,138,225,21,12,235,125,0,0,0,0,0,138,255,255,201,12,0, + 235,125,0,0,59,241,89,0,0,89,247,34,0,89,247,42,206,125,0,0,175,166,175, + 125,12,232,102,232,89,0,0,0,175,255,201,0,0,0,89,247,47,235,125,0,0,12, + 235,166,0,0,0,12,235,125,0,0,0,0,7,206,125,0,0,0,0,138,201,0,0,12,232,89, + 0,0,59,245,225,21,0,0,0,196,252,244,60,20,236,252,156,4,4,4,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,0,175,201,0,0,7,206,102,12,235,125,0,0,59,241,89,138,225,21, + 0,0,0,34,89,225,21,0,0,138,225,21,138,247,34,0,0,0,0,12,0,235,125,0,0,138, + 225,21,0,0,138,225,21,12,235,125,0,0,89,247,34,12,235,102,0,89,247,34,12, + 235,125,59,245,125,0,0,12,235,125,12,0,235,125,0,7,206,166,0,0,138,225, + 21,12,235,125,0,0,89,247,34,138,225,21,0,0,89,247,34,12,235,125,0,0,59, + 241,89,138,225,21,0,0,138,225,21,12,235,125,0,0,0,0,0,0,0,89,247,47,0,235, + 125,0,0,59,241,89,0,0,89,247,34,0,12,235,166,238,34,0,0,138,210,228,34, + 0,175,166,215,21,0,0,89,251,159,251,89,0,0,12,235,191,247,34,0,0,175,225, + 21,0,0,0,0,138,225,21,0,0,0,7,206,125,0,0,0,12,232,89,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,20,220,252,236,180,252,244,28,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0, + 138,225,21,0,138,255,102,12,235,125,0,7,206,201,0,12,235,166,0,0,134,132, + 0,245,125,0,59,245,225,21,12,235,201,0,0,12,206,34,0,235,125,0,0,59,245, + 125,0,12,235,225,21,12,235,125,0,0,89,247,34,12,235,102,0,89,247,34,12, + 235,125,0,138,251,89,0,12,235,125,12,0,235,125,0,7,206,166,0,0,138,225, + 21,12,235,125,0,0,89,247,34,12,235,166,0,7,206,201,0,12,235,125,0,7,206, + 201,0,59,245,125,0,12,235,225,21,12,235,125,0,0,0,138,125,0,0,138,225,29, + 0,206,166,0,0,7,206,166,0,59,245,247,34,0,0,175,255,201,0,0,0,59,245,225, + 21,0,89,255,201,0,0,12,235,166,0,175,225,21,0,0,138,255,166,0,0,89,251, + 89,0,0,0,0,0,89,247,34,0,0,0,7,206,125,0,0,0,59,238,34,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,4,36,236,252,252,252,108,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0, + 7,206,255,255,171,206,102,12,232,226,255,255,225,21,0,0,12,235,255,255, + 247,34,0,89,255,255,247,163,225,21,0,7,206,255,255,247,34,12,0,235,125, + 0,0,0,89,255,255,247,163,225,21,12,235,125,0,0,89,247,34,12,235,102,0,89, + 247,34,12,235,125,0,0,175,251,34,0,235,125,12,0,235,125,0,7,206,166,0,0, + 138,225,21,12,235,125,0,0,89,247,34,0,12,235,255,255,201,0,0,12,235,255, + 255,255,225,21,0,0,89,255,255,247,163,225,21,12,235,125,0,0,0,89,255,255, + 255,247,34,0,0,89,255,255,127,0,59,245,255,225,111,247,34,0,0,59,245,125, + 0,0,0,12,235,166,0,0,59,245,125,7,0,206,225,21,0,12,235,201,0,0,59,241, + 89,0,0,175,255,255,255,255,247,0,0,89,247,34,0,0,0,7,206,125,0,0,0,59,238, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,60,252,252,204,4,4,4,4,4,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0, + 89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,7, + 206,125,0,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,76,252,60,4,4, + 4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,12,232,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0, + 0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0, + 0,0,0,12,235,125,0,0,0,7,206,125,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 12,235,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,89,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235, + 125,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89, + 247,34,0,0,0,0,0,0,0,0,0,0,0,0,89,255,251,89,0,7,206,125,0,89,255,247,34, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,0,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,175,166,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,125,0,175,166, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,225,21,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,125,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,125,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,0,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,0,138,201,0,7,206,166,12,235, + 125,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175,125, + 0,0,0,0,0,175,171,206,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,125,0, + 31,206,130,255,166,175,247,34,0,0,89,255,125,175,247,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,247,34,138,166,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,241,132,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,59,241,132,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 59,245,255,255,255,125,0,12,235,255,255,255,255,255,225,21,0,0,0,0,0,0, + 0,0,175,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0, + 0,0,175,125,0,0,0,0,89,225,21,59,238,34,0,0,138,255,255,201,0,0,0,59,215, + 21,0,0,0,0,0,0,0,0,0,12,235,255,255,255,247,34,0,0,0,0,0,0,0,12,235,255, + 255,255,255,255,255,255,255,251,89,0,12,235,255,255,255,255,255,225,21, + 0,89,255,255,255,255,255,255,125,0,12,235,255,255,255,255,255,225,21,0, + 0,12,235,255,255,255,255,255,225,21,7,206,201,0,50,206,56,255,201,12,235, + 125,0,0,138,225,29,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,202,89,89,255,225,21,0,89,255,255,255,225,81,245,201,0,138,251, + 89,0,0,138,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255, + 255,255,255,225,21,0,0,0,138,255,166,7,206,225,21,0,0,0,138,247,34,0,0, + 0,0,127,0,89,255,125,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,89, + 247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175, + 125,0,0,0,0,0,0,0,0,0,0,0,59,241,89,12,235,125,0,0,172,89,0,0,0,0,0,0,0, + 0,0,12,235,166,0,0,7,202,89,0,0,0,0,0,0,89,255,201,0,0,12,235,125,0,0,0, + 0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,138,247,34,0,12,146,0,0,0,0,0, + 144,21,0,0,12,146,0,0,0,0,0,144,21,0,89,225,21,71,157,22,191,225,21,175, + 201,0,7,206,125,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,59,196,199,47,206,184,89,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0, + 0,0,0,59,245,125,0,0,59,245,125,0,0,0,0,0,127,12,235,166,0,0,0,0,0,0,12, + 146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,12,235,255,255,255,255,127,34,235,255,255,255,255,225,21,0, + 0,0,0,0,0,0,0,89,247,34,7,206,166,0,89,201,0,0,0,0,0,0,0,0,0,0,89,247,34, + 0,0,0,0,0,0,0,0,59,115,12,235,166,0,0,0,12,235,125,0,0,0,0,0,0,12,146,0, + 0,0,0,0,144,21,0,0,0,0,0,59,245,125,0,0,12,146,0,0,0,0,0,144,21,0,0,12, + 146,0,0,0,0,0,144,21,0,7,202,89,117,104,0,29,202,89,59,215,21,59,215,21, + 138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,175,125,0,59,192,89,223,125,172,89,0,138,255,255,255,201,12,182, + 0,0,0,0,0,175,255,255,125,0,89,255,255,247,34,0,0,12,146,0,0,0,0,0,144, + 21,0,138,255,255,255,255,247,34,138,247,34,7,206,201,0,0,0,0,0,0,127,89, + 251,89,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,7,206,166,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175,125,0,0,0, + 0,0,0,0,0,0,0,0,89,247,34,7,206,166,7,202,89,0,0,0,0,0,0,0,0,0,0,89,255, + 125,0,0,0,0,0,0,0,89,255,125,89,247,34,0,0,0,12,235,125,0,0,0,0,0,0,12, + 146,0,0,0,0,0,144,21,0,0,0,0,7,206,201,0,0,0,12,146,0,0,0,0,0,144,21,0, + 0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245, + 255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175, + 125,0,59,192,12,228,34,172,89,89,247,34,0,12,206,29,206,201,0,0,7,206,166, + 0,7,206,255,225,21,0,89,247,34,0,12,146,0,0,0,0,0,144,21,0,0,0,0,7,206, + 166,0,12,235,166,89,247,34,0,0,0,0,0,0,127,245,255,255,255,255,255,201, + 0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,59,245,255,255,255,127,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175,125,0,0,0,0,0,0,0, + 0,0,0,0,59,241,89,12,235,125,89,201,12,235,255,251,89,0,89,255,255,225, + 21,0,175,255,255,225,21,0,0,0,89,251,89,0,138,225,21,0,0,0,12,235,255,255, + 255,255,225,21,0,12,146,0,0,0,0,0,144,21,0,0,0,0,138,247,34,0,0,0,12,146, + 0,0,0,0,0,144,21,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,12,235,255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,59,192,0,0,0,172,89,138,225,21,0,0,0, + 0,7,206,225,21,138,225,21,0,0,89,251,89,0,0,12,235,125,0,12,146,0,0,0,0, + 0,144,21,0,0,0,0,138,225,21,0,0,89,255,255,125,0,0,0,0,0,0,0,127,138,225, + 21,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,59,241,89,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,12,235,255,255,255,255, + 225,21,0,0,0,0,0,0,0,0,0,138,255,255,201,12,228,34,175,166,0,138,201,7, + 206,125,7,206,166,0,0,0,89,255,255,247,34,59,241,89,0,0,138,225,21,0,0, + 0,12,235,125,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,59,245,125,0,0,0, + 0,12,146,0,0,0,0,0,144,21,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,59,245,255,255,255,207,235,255,255,255,255,255,255, + 207,235,255,255,255,255,255,255,255,255,255,255,255,225,21,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,247,34,0,0,0,0,175,166,175,201,0,0,0, + 59,245,255,255,255,255,255,125,0,12,146,0,0,0,0,0,144,21,0,0,0,89,251,89, + 0,0,0,7,206,225,21,0,0,0,0,0,0,0,127,245,255,255,255,255,255,125,0,0,12, + 146,0,0,0,0,0,144,21,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,138,166,7,206,125,0,89,247,94,241,89,0,138,201,0,0,0,0,0,59,245,166, + 0,89,251,89,0,89,247,34,0,0,0,12,235,125,0,0,0,0,0,0,12,146,0,0,0,0,0,144, + 21,0,0,7,206,201,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,12,146,0,0,0,0,0, + 144,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,255,166,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,138,255,255,201,0,7,206,225,21,175,201,0,0,0,59,241,89,0,0,0,0, + 0,0,12,146,0,0,0,0,0,144,21,0,0,12,235,166,0,0,0,0,0,175,225,21,0,0,0,0, + 0,0,0,127,89,255,125,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,89, + 247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0, + 175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,7,206,125,0,89,247,94,241, + 89,0,138,201,0,0,0,0,0,12,235,166,0,0,89,255,125,12,235,166,0,0,0,12,235, + 125,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,138,247,34,0,0,0,0,0,12,146, + 0,0,0,0,0,144,21,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,245,255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,42,206,201,0,0,89, + 225,21,0,0,89,255,125,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,175,225,21, + 0,0,0,0,0,175,225,21,0,0,0,0,0,0,0,127,0,175,251,89,0,0,0,0,0,12,146,0, + 0,0,0,0,144,21,0,59,245,166,0,0,138,225,21,0,0,0,59,245,166,138,251,89, + 7,206,201,0,12,235,125,0,59,241,89,0,0,0,175,125,0,0,0,0,0,175,125,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,175,166,0,138,201,7,206,125,7,206, + 166,138,166,0,0,0,138,251,89,0,0,0,59,115,0,89,255,201,0,0,12,235,125,0, + 0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,89,251,89,0,0,0,0,0,0,12,146,0,0,0, + 0,0,144,21,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,138,225,34,182,0,0,0,7,206,166,0, + 7,206,255,247,34,0,0,175,125,0,12,146,0,0,0,0,0,144,21,0,89,251,89,0,0, + 0,0,0,0,175,225,21,0,0,0,0,0,0,0,127,0,0,138,255,255,255,255,125,0,12,235, + 255,255,255,255,255,225,21,0,138,247,34,0,7,206,166,0,0,0,0,89,247,34,175, + 201,0,7,206,201,0,12,235,125,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,59,215,21,0,0,12,235,255,251,89,0,89,255,255,225, + 21,12,235,255,255,255,247,34,0,0,0,0,0,0,0,0,12,235,255,255,255,255,255, + 255,255,255,251,89,0,12,235,255,255,255,255,255,225,21,0,138,255,255,255, + 255,255,255,166,0,12,235,255,255,255,255,255,225,21,0,0,12,235,255,255, + 255,255,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,89,255,255,255,247,34,0,0,0,0,0,0,0,175,255,255,125,0,138,255,255, + 255,125,0,0,12,235,255,255,255,255,255,225,21,0,175,255,255,255,255,247, + 0,0,0,175,225,21,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,175,166,0,255,255,201,0,0,0,0,0,175,166,12,232,89,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12, + 228,34,0,0,0,0,0,0,0,0,12,232,89,59,215,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,0,127,127,0,127,127,127,127,127,0,127,127,127,127, + 127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,245,255,255,255,255,255,255,225,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,225,21,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247, + 34,0,0,0,0,59,192,0,0,0,0,0,7,206,255,255,225,21,0,0,0,0,0,0,0,0,138,247, + 34,0,0,89,251,89,0,7,206,125,0,0,7,206,255,255,255,166,0,89,251,89,138, + 247,34,0,0,0,0,7,206,255,255,255,247,34,0,0,0,0,175,255,255,251,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,255,247, + 34,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,12, + 235,255,247,34,0,0,7,206,255,251,89,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0, + 0,89,255,255,255,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,0, + 59,245,255,247,34,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0,175,166,0,0,0,0, + 0,0,89,201,0,0,0,0,175,166,0,0,0,0,0,59,245,255,201,0,0,0,59,241,89,0,0, + 0,0,0,59,245,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34, + 0,0,0,0,59,192,0,0,0,0,0,175,201,0,0,144,21,0,0,0,0,0,0,0,0,7,206,166,0, + 7,206,166,0,0,7,206,125,0,7,206,201,0,0,89,166,0,0,0,0,0,0,0,0,0,0,89,255, + 125,0,0,0,59,245,166,0,0,0,0,0,0,12,206,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,59,245,166,0,0,0,0,0,0,0,0,0,0,59, + 241,89,0,138,201,0,0,0,0,0,138,166,0,0,0,0,0,168,34,7,206,166,0,0,172,89, + 0,175,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,166,89,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,251,89,0,0,12,235,125,0,138,225,21,0,0, + 0,0,0,0,0,0,7,206,255,201,0,0,0,89,225,21,0,0,0,0,7,206,255,201,0,0,0,89, + 225,21,0,0,0,0,12,206,21,12,235,125,0,0,175,166,0,0,0,0,0,0,59,245,125, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,175,255,255,255, + 166,0,0,12,235,125,0,0,0,0,89,225,21,0,0,12,232,89,0,89,247,34,89,247,34, + 0,0,7,206,125,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225,21,0,0,0,0, + 0,7,206,125,0,0,7,206,255,255,247,34,0,0,0,85,89,0,85,89,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,89,225,21,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,89,201, + 0,0,12,228,34,0,0,0,0,138,166,0,0,0,0,0,0,0,7,206,125,0,0,7,206,255,166, + 0,0,0,0,0,0,0,0,0,12,235,125,0,0,89,247,34,175,255,255,255,166,89,225,21, + 0,89,255,125,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,89,225,21,0,12,232,89,59, + 115,0,59,115,0,0,0,0,0,89,201,0,0,7,206,125,0,0,0,0,0,0,0,89,201,0,0,7, + 206,125,0,0,0,0,0,0,0,0,12,232,89,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,225,21,0,0,138,247,94,192,12,182, + 0,0,12,235,125,0,0,0,0,0,175,255,255,255,255,166,0,0,7,206,171,206,166, + 0,0,0,7,206,125,0,7,206,251,89,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,59,245, + 255,255,201,0,12,228,34,12,235,166,0,12,228,34,0,0,138,251,89,138,247,34, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,138,255,255,255,125,0,12,228,34, + 0,0,0,0,0,0,0,0,59,241,89,0,138,201,0,0,0,0,0,138,166,0,0,0,0,0,0,0,175, + 201,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,12,235,125,0,0,89,247,34,175,255, + 255,255,166,89,225,21,0,89,255,125,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,138, + 225,21,0,12,235,125,12,235,166,59,245,166,0,0,0,0,89,201,0,0,89,225,21, + 0,0,0,0,0,0,0,89,201,0,0,89,225,21,0,0,0,0,0,0,12,235,255,125,0,0,175,125, + 0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89, + 225,21,0,12,235,125,59,192,0,0,0,0,12,235,125,0,0,0,0,0,59,215,21,59,238, + 34,0,0,0,89,255,247,34,0,0,0,7,206,125,0,0,7,206,255,255,247,34,0,0,0,0, + 0,0,0,0,59,192,0,12,235,166,0,7,176,21,0,175,125,59,238,34,0,12,228,34, + 0,138,247,34,138,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,192,0,0,138, + 201,0,89,247,34,0,175,125,0,0,0,0,0,0,0,0,0,89,255,255,225,21,0,7,206,255, + 255,255,255,255,255,247,34,0,12,235,125,0,0,0,7,176,21,0,175,201,0,0,0, + 0,0,0,0,0,12,235,125,0,0,89,247,34,89,255,255,255,166,89,225,21,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,89,225,21,0,12,232,89,0,12,235,166,12, + 235,166,0,0,0,89,201,0,7,206,125,0,12,235,166,0,0,0,0,89,201,0,7,206,125, + 89,255,255,255,125,0,0,0,0,7,206,125,89,225,21,0,138,225,21,0,0,0,138,255, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,59,241,89,59, + 192,0,0,0,12,235,255,255,255,225,21,0,0,138,166,0,7,202,89,0,0,0,7,206, + 166,0,0,0,0,0,0,0,0,7,206,125,0,12,235,201,0,0,0,0,0,0,0,0,89,166,0,89, + 247,34,0,0,0,0,0,89,166,12,232,89,0,138,247,34,89,247,34,59,238,34,0,0, + 12,235,255,255,255,255,255,255,247,34,89,255,255,255,166,89,166,0,0,138, + 201,0,138,225,21,0,89,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166, + 0,0,0,0,7,206,255,255,255,247,34,0,59,245,255,247,34,0,0,0,0,0,0,0,0,12, + 235,125,0,0,89,247,34,0,89,255,255,166,89,225,21,0,0,0,0,0,0,0,0,0,0,0, + 0,0,89,255,255,255,166,0,12,235,125,0,138,225,21,0,0,12,235,125,12,235, + 125,0,0,89,201,0,89,201,0,7,206,223,166,0,0,0,0,89,201,0,89,201,0,89,125, + 0,138,225,21,12,182,0,7,206,133,206,125,0,89,232,215,21,0,7,206,247,34, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,59,241,89,59, + 192,0,0,0,0,12,235,125,0,0,0,0,0,59,215,21,59,238,34,0,59,245,255,255,255, + 255,225,21,0,0,0,0,0,59,241,89,0,0,138,225,21,0,0,0,0,0,0,0,89,166,0,89, + 247,34,0,0,0,0,0,89,166,0,138,255,255,176,228,34,0,138,247,34,138,247,34, + 0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,89,166,0,0,138,255,255,225,21,0,0,89, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,89,247,34,0,0,0,138,166,89,225, + 21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,247,34,0,0,12,235, + 166,12,235,166,0,0,0,0,0,12,232,89,0,175,166,138,166,0,0,0,0,0,0,12,232, + 89,0,0,0,0,138,201,0,0,89,255,255,201,89,225,21,89,225,81,215,21,0,138, + 247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,12,235, + 125,59,192,0,0,0,0,59,241,89,0,0,0,0,0,175,255,255,255,255,166,0,0,0,7, + 206,166,0,0,0,0,7,206,125,0,12,235,201,0,7,206,166,0,0,0,0,0,0,0,0,59,192, + 0,12,235,166,0,7,176,21,0,175,125,0,0,0,0,0,0,0,0,0,138,251,89,138,247, + 34,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,59,192,0,0,138,201,59,245,166,0,0, + 175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,89,247,34,0,0,0,138,166, + 89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,166, + 59,245,166,0,0,0,0,0,0,138,201,0,138,201,0,138,166,0,0,0,0,0,0,138,201, + 0,0,0,0,89,247,34,0,0,0,0,0,7,206,125,59,238,34,59,215,21,0,175,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,0,175,225,81, + 192,12,182,0,7,206,125,0,0,0,0,0,89,225,21,0,0,12,232,89,0,0,7,206,166, + 0,0,0,0,7,206,125,0,0,59,245,255,255,166,0,0,0,0,0,0,0,0,0,7,202,89,0,59, + 245,255,255,166,0,12,228,34,0,0,0,0,0,0,0,0,0,0,85,89,0,85,89,0,0,0,0,0, + 0,0,59,238,34,0,0,0,0,0,7,202,89,0,138,201,0,59,245,225,34,228,34,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,255,255,255,255,247,34,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,201,0,0,175,247,34,0,0,0,138,166, + 89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,115,0, + 59,115,0,0,0,0,0,0,12,232,89,0,175,255,255,255,255,201,0,0,0,0,12,232,89, + 0,0,0,138,201,0,0,0,0,0,0,0,89,201,0,89,255,255,255,255,247,34,138,251, + 89,0,7,176,21,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,247,34,0,0,0, + 175,255,255,255,166,0,89,255,255,255,255,255,247,34,0,0,0,0,0,0,0,0,0,0, + 7,206,166,0,0,0,0,7,206,125,0,0,0,0,0,138,255,166,0,0,0,0,0,0,0,0,0,89, + 225,21,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,59,238,34,0,0,0,0,0,0,89,225,21,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,12,235,191,255,255,166,238,34,0,0,0,138,166,89,225,21,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,201,0,0, + 0,0,0,138,166,0,0,0,0,0,175,201,0,0,0,89,255,255,255,255,125,0,0,0,12,232, + 89,0,0,0,0,59,215,21,0,0,138,255,255,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,0,0,0,0,0,0,0,0,0,0,0,0,59,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,0, + 89,255,125,0,0,0,59,245,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,59,245,166,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,12,235,125,0,0,0,0,0,0,0,0,138,166,89,225,21,0,0,0,0,0,0,0,0,0,175, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,59,192,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,7,199,34, + 0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,255,247,34,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255, + 255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,138,166, + 89,225,21,0,0,0,0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,7,206,125,0,7,206,255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,138,225, + 21,0,0,0,0,0,12,235,125,0,0,0,0,19,172,255,190,11,0,0,0,0,138,255,201,7, + 202,89,0,0,0,0,0,0,0,0,0,0,7,206,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,59,138,225,21,0,0,0,0,0,0,59,245,201,0,0,0,19,172, + 255,190,11,0,0,0,0,0,0,0,0,0,7,206,225,21,0,0,0,59,245,201,19,172,255,190, + 11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,251,89,89,201,0,0,0,0,0,175, + 201,0,0,0,0,0,0,0,0,7,206,225,21,0,0,0,0,0,19,172,255,190,11,0,0,0,0,0, + 175,255,166,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,0,0,0,0,12,175,247,34,0,0,0,19,172,255, + 190,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,247,34,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,0,0,7,206,125,0,0,0,0,0,138,201,0,0,0,0,0,136,190, + 45,196,145,0,0,0,59,215,21,175,255,166,0,0,0,175,225,29,206,166,0,0,7,202, + 89,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,209,125, + 0,0,0,0,0,0,138,225,21,0,0,0,136,190,45,196,145,0,0,0,175,225,29,206,166, + 0,0,12,235,125,0,0,12,138,225,21,136,190,45,196,145,159,251,89,138,247, + 34,0,0,0,0,0,0,0,0,0,0,0,175,125,59,245,247,34,0,0,0,0,0,12,232,89,0,0, + 0,0,0,0,0,175,166,0,0,0,0,0,0,12,136,190,45,196,145,0,0,0,0,138,166,12, + 235,255,125,0,0,0,0,7,206,166,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,138,201,0,0,0,0,0,136,190,45, + 196,145,34,0,0,0,89,251,89,138,247,34,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,7,202,89,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255, + 255,125,0,0,0,0,127,0,0,7,206,251,89,0,0,0,0,7,206,251,89,0,0,0,0,7,206, + 251,89,0,0,0,0,0,7,206,251,89,0,0,0,0,7,206,251,89,0,0,0,0,12,235,255,125, + 0,0,0,0,0,89,255,255,255,255,255,255,255,255,125,0,0,0,59,245,255,255,255, + 201,12,235,255,255,255,255,255,125,12,235,255,255,255,255,255,125,12,235, + 255,255,255,255,255,125,12,235,255,255,255,255,255,125,89,255,255,255,201, + 89,255,255,255,201,89,255,255,255,201,89,255,255,255,201,0,175,255,255, + 255,255,201,0,0,0,12,235,251,89,0,0,12,235,125,0,0,0,138,255,255,166,0, + 0,0,0,0,0,138,255,255,166,0,0,0,0,0,0,138,255,255,166,0,0,0,0,0,0,138,255, + 255,166,0,0,0,0,0,0,138,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138, + 255,255,201,89,251,89,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245, + 125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,7,206,225,21, + 0,0,0,138,247,0,235,166,0,0,0,0,0,0,138,225,21,7,206,166,0,0,0,127,0,0, + 59,245,255,166,0,0,0,0,59,245,255,166,0,0,0,0,59,245,255,166,0,0,0,0,0, + 59,245,255,166,0,0,0,0,59,245,255,166,0,0,0,0,59,245,255,166,0,0,0,0,0, + 175,201,7,206,166,0,0,0,0,0,0,0,138,255,125,0,0,7,202,102,235,166,0,0,0, + 0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,12, + 235,125,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,175,201,0,0,7, + 206,251,89,0,12,235,255,201,0,0,12,235,125,0,59,245,166,0,0,138,251,89, + 0,0,59,245,166,0,0,138,251,89,0,0,59,245,166,0,0,138,251,89,0,0,59,245, + 166,0,0,138,251,89,0,0,59,245,166,0,0,138,251,89,0,0,0,0,0,0,0,0,0,0,0, + 0,59,245,166,0,0,89,255,166,0,12,235,125,0,0,0,59,245,125,12,235,125,0, + 0,0,59,245,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125, + 0,59,245,125,0,0,59,245,125,12,235,166,0,0,0,0,0,12,235,125,0,0,175,201, + 0,0,0,127,0,0,138,225,151,225,21,0,0,0,138,225,151,225,21,0,0,0,138,225, + 151,225,21,0,0,0,0,138,225,151,225,21,0,0,0,138,225,151,225,21,0,0,0,138, + 225,151,225,21,0,0,0,59,241,89,7,206,166,0,0,0,0,0,0,12,235,166,0,0,0,0, + 0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235, + 166,0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125, + 0,0,175,201,0,0,0,0,175,225,21,12,235,166,245,125,0,12,235,125,12,235,125, + 0,0,0,0,138,247,34,12,235,125,0,0,0,0,138,247,34,12,235,125,0,0,0,0,138, + 247,34,12,235,125,0,0,0,0,138,247,34,12,235,125,0,0,0,0,138,247,34,0,138, + 225,21,0,0,0,175,201,0,12,235,125,0,0,7,202,159,247,34,12,235,125,0,0,0, + 59,245,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,12,235, + 125,0,0,0,59,245,125,0,0,138,247,34,7,206,201,0,12,235,255,255,255,251, + 89,0,12,235,125,0,12,235,125,0,0,0,127,0,7,206,166,59,241,89,0,0,7,206, + 166,59,241,89,0,0,7,206,166,59,241,89,0,0,0,7,206,166,59,241,89,0,0,7,206, + 166,59,241,89,0,0,7,206,166,59,241,89,0,0,0,138,225,21,7,206,166,0,0,0, + 0,0,0,89,247,34,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12, + 235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0, + 12,235,125,0,0,12,235,125,0,0,175,201,0,0,0,0,59,241,89,12,235,125,138, + 225,21,12,235,125,89,247,34,0,0,0,0,59,245,125,89,247,34,0,0,0,0,59,245, + 125,89,247,34,0,0,0,0,59,245,125,89,247,34,0,0,0,0,59,245,125,89,247,34, + 0,0,0,0,59,245,125,0,0,175,225,21,0,175,225,21,0,89,247,34,0,0,138,166, + 12,235,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,12,235, + 125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,0,0,12,235,166,89,247, + 34,0,12,235,166,0,0,138,251,89,12,235,133,206,255,125,0,0,0,0,127,0,59, + 241,89,7,206,166,0,0,59,241,89,7,206,166,0,0,59,241,89,7,206,166,0,0,0, + 59,241,89,7,206,166,0,0,59,241,89,7,206,166,0,0,59,241,89,7,206,166,0,0, + 12,235,125,0,7,206,255,255,255,255,247,34,0,138,225,21,0,0,0,0,0,12,235, + 255,255,255,255,247,34,12,235,255,255,255,255,247,34,12,235,255,255,255, + 255,247,34,12,235,255,255,255,255,247,34,0,12,235,125,0,0,12,235,125,0, + 0,12,235,125,0,0,12,235,125,0,206,255,255,255,247,34,0,12,235,125,12,235, + 125,12,235,125,12,235,125,138,225,21,0,0,0,0,12,235,166,138,225,21,0,0, + 0,0,12,235,166,138,225,21,0,0,0,0,12,235,166,138,225,21,0,0,0,0,12,235, + 166,138,225,21,0,0,0,0,12,235,166,0,0,0,175,225,187,225,21,0,0,138,225, + 21,0,59,215,21,7,206,166,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59, + 245,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,0,0,0,89, + 255,255,125,0,0,12,235,166,0,0,12,235,166,12,235,125,0,7,206,201,0,0,0, + 127,0,138,225,21,0,138,225,21,0,138,225,21,0,138,225,21,0,138,225,21,0, + 138,225,21,0,0,138,225,21,0,138,225,21,0,138,225,21,0,138,225,21,0,138, + 225,21,0,138,225,21,0,89,255,255,255,255,255,166,0,0,0,0,0,0,138,225,21, + 0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0, + 0,12,235,166,0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,12, + 235,125,0,0,175,201,0,0,0,0,12,235,125,12,235,125,0,138,225,34,235,125, + 138,225,21,0,0,0,0,12,235,166,138,225,21,0,0,0,0,12,235,166,138,225,21, + 0,0,0,0,12,235,166,138,225,21,0,0,0,0,12,235,166,138,225,21,0,0,0,0,12, + 235,166,0,0,0,0,175,225,21,0,0,0,138,225,21,7,202,89,0,7,206,166,12,235, + 125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245, + 125,12,235,125,0,0,0,59,245,125,0,0,0,7,206,225,21,0,0,12,235,166,0,0,12, + 235,166,12,235,125,0,0,59,241,89,0,0,127,7,206,255,255,255,255,251,89,7, + 206,255,255,255,255,251,89,7,206,255,255,255,255,251,89,0,7,206,255,255, + 255,255,251,89,7,206,255,255,255,255,251,89,7,206,255,255,255,255,251,89, + 7,206,166,0,0,7,206,166,0,0,0,0,0,0,89,247,34,0,0,0,0,0,12,235,166,0,0, + 0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0, + 12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,175,201,0,0, + 0,0,59,241,89,12,235,125,0,12,235,138,235,125,89,247,34,0,0,0,0,59,245, + 125,89,247,34,0,0,0,0,59,245,125,89,247,34,0,0,0,0,59,245,125,89,247,34, + 0,0,0,0,59,245,125,89,247,34,0,0,0,0,59,245,125,0,0,0,175,225,187,225,21, + 0,0,138,247,34,175,125,0,0,12,235,125,12,235,125,0,0,0,59,241,89,12,235, + 125,0,0,0,59,241,89,12,235,125,0,0,0,59,241,89,12,235,125,0,0,0,59,241, + 89,0,0,0,0,175,225,21,0,0,12,235,166,0,0,175,247,34,12,235,125,0,0,12,235, + 125,0,0,127,59,241,89,0,0,7,206,166,59,241,89,0,0,7,206,166,59,241,89,0, + 0,7,206,166,0,59,241,89,0,0,7,206,166,59,241,89,0,0,7,206,166,59,241,89, + 0,0,7,206,166,59,241,89,0,0,7,206,166,0,0,0,0,0,0,59,245,166,0,0,0,0,0, + 12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166, + 0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0, + 175,201,0,0,0,0,175,225,21,12,235,125,0,0,138,232,245,125,12,235,125,0, + 0,0,0,138,247,34,12,235,125,0,0,0,0,138,247,34,12,235,125,0,0,0,0,138,247, + 34,12,235,125,0,0,0,0,138,247,34,12,235,125,0,0,0,0,138,247,34,0,0,175, + 225,21,0,175,225,21,0,59,245,191,201,0,0,0,89,225,21,12,235,166,0,0,0,89, + 251,89,12,235,166,0,0,0,89,251,89,12,235,166,0,0,0,89,251,89,12,235,166, + 0,0,0,89,251,89,0,0,0,0,175,225,21,0,0,12,235,255,255,255,247,34,0,12,235, + 125,0,0,59,241,89,0,0,127,138,225,21,0,0,0,138,247,163,225,21,0,0,0,138, + 247,163,225,21,0,0,0,138,247,34,138,225,21,0,0,0,138,247,163,225,21,0,0, + 0,138,247,163,225,21,0,0,0,138,247,198,225,21,0,0,7,206,166,0,0,0,0,0,0, + 0,138,255,125,0,0,7,202,102,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235, + 166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0,12,235, + 125,0,0,12,235,125,0,0,175,201,0,0,7,206,251,89,0,12,235,125,0,0,12,235, + 255,125,0,89,255,125,0,0,89,251,89,0,0,89,255,125,0,0,89,251,89,0,0,89, + 255,125,0,0,89,251,89,0,0,89,255,125,0,0,89,251,89,0,0,89,255,125,0,0,89, + 251,89,0,0,138,225,21,0,0,0,175,201,0,0,138,251,89,0,0,89,251,89,0,0,138, + 247,34,0,7,206,225,21,0,138,247,34,0,7,206,225,21,0,138,247,34,0,7,206, + 225,21,0,138,247,34,0,7,206,225,21,0,0,0,0,175,225,21,0,0,12,235,166,0, + 0,0,0,0,12,235,125,0,0,175,225,21,0,0,127,206,166,0,0,0,0,59,245,255,166, + 0,0,0,0,59,245,255,166,0,0,0,0,59,245,133,206,166,0,0,0,0,59,245,255,166, + 0,0,0,0,59,245,255,166,0,0,0,0,59,245,255,125,0,0,0,7,206,255,255,255,255, + 255,125,0,0,0,59,245,255,255,255,201,12,235,255,255,255,255,255,125,12, + 235,255,255,255,255,255,125,12,235,255,255,255,255,255,125,12,235,255,255, + 255,255,255,125,89,255,255,255,201,89,255,255,255,201,89,255,255,255,201, + 89,255,255,255,201,0,175,255,255,255,255,225,21,0,0,12,235,125,0,0,0,138, + 255,125,0,0,0,175,255,255,201,0,0,0,0,0,0,175,255,255,201,0,0,0,0,0,0,175, + 255,255,201,0,0,0,0,0,0,175,255,255,201,0,0,0,0,0,0,175,255,255,201,0,0, + 0,0,0,0,0,0,0,0,0,0,0,7,202,97,206,255,255,201,0,0,0,0,0,138,255,255,255, + 201,0,0,0,0,138,255,255,255,201,0,0,0,0,138,255,255,255,201,0,0,0,0,138, + 255,255,255,201,0,0,0,0,0,0,175,225,21,0,0,12,235,166,0,0,0,0,0,12,235, + 133,206,255,225,21,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,175,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,7,206,225,21, + 0,0,0,0,0,12,235,225,21,0,0,89,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,7,206,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,247, + 34,0,0,0,0,0,0,0,138,251,89,0,0,59,245,247,34,0,0,0,0,0,0,0,0,0,175,247, + 34,0,0,175,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,225,21, + 0,0,0,0,0,0,0,138,255,125,0,0,0,12,235,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,251,89,0,0,0,0,0,0, + 7,206,225,21,0,0,0,7,206,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,166,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,59,241,89,0,0,0,0, + 0,89,247,34,0,0,7,206,138,235,125,0,0,89,255,225,21,175,125,0,0,0,0,0,0, + 0,0,0,138,201,0,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12, + 235,125,0,0,0,0,0,0,12,235,125,0,0,0,175,171,206,166,0,0,0,0,0,0,0,0,0, + 7,206,166,0,59,245,255,166,238,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,125,59, + 215,21,0,0,59,241,89,0,0,0,0,0,0,7,206,166,0,0,0,0,138,201,175,201,0,0, + 0,12,235,251,89,89,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,206,166,0,0,0,0,0,0,89,247,34,0,0,0,0,89,225,151,201,0,0,0,0, + 0,0,0,0,0,0,0,0,0,175,201,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,138,201,0,0,0,0,7,206,125,0,0,0,138,201,0,89,225,21, + 12,228,34,138,255,201,0,0,0,138,247,34,175,225,21,0,138,201,0,138,201,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225,21,0,0,0,0,0,89,225, + 21,0,0,89,247,34,59,241,89,0,59,241,89,89,247,34,0,0,89,225,21,175,127, + 215,21,206,247,42,206,0,138,255,247,42,206,125,0,0,138,166,12,235,251,89, + 0,0,0,0,138,201,0,0,0,0,0,0,89,225,21,0,0,0,59,241,89,12,235,125,0,0,175, + 125,59,245,247,34,0,0,12,235,125,89,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,175,166,0,0,0,0,12,232,89,7,206,125,0, + 0,12,235,166,59,245,125,0,0,0,59,238,34,0,12,235,125,0,0,0,0,0,0,89,247, + 34,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,247,34,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,251,89,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,12,235,255,255,255,166,0,12,235,255, + 255,255,166,0,12,235,255,255,255,166,0,12,235,255,255,255,166,0,0,12,235, + 255,255,255,166,0,12,235,255,255,255,166,0,12,235,255,255,255,166,0,175, + 255,255,125,0,0,12,235,255,255,125,0,0,12,235,255,255,225,21,0,0,12,235, + 255,255,225,21,0,12,235,255,255,225,21,0,12,235,255,255,225,21,0,12,235, + 125,12,235,125,12,235,125,12,235,125,0,12,235,125,89,251,89,0,12,235,138, + 235,255,247,34,0,0,12,235,255,255,201,0,0,0,12,235,255,255,201,0,0,0,12, + 235,255,255,201,0,0,0,12,235,255,255,201,0,0,0,12,235,255,255,201,0,0,0, + 0,0,0,175,247,34,0,0,0,12,235,255,255,255,166,0,59,241,89,0,0,89,247,34, + 59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,42, + 206,201,0,0,0,138,232,245,166,245,255,251,89,7,206,201,0,0,0,138,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,12,206,21,0,59,245,125,12,206,21,0,59,245,125,12,206, + 21,0,59,245,125,12,206,21,0,59,245,125,0,12,206,21,0,59,245,125,12,206, + 21,0,59,245,125,12,206,21,0,12,235,255,125,0,7,206,166,12,235,166,0,0,172, + 102,0,235,125,0,0,175,201,0,12,235,125,0,0,175,201,12,235,125,0,0,175,201, + 12,235,125,0,0,175,201,0,12,235,125,12,235,125,12,235,125,12,235,125,0, + 0,0,0,0,175,201,0,12,235,247,34,0,175,201,0,12,235,166,0,7,206,201,0,12, + 235,166,0,7,206,201,0,12,235,166,0,7,206,201,0,12,235,166,0,7,206,201,0, + 12,235,166,0,7,206,201,0,0,0,0,0,175,247,34,0,0,12,235,166,0,12,235,201, + 0,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247, + 34,59,241,89,0,0,89,247,34,89,247,34,0,7,206,176,235,225,21,0,175,225,21, + 89,247,34,0,7,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,7,206,166,0,0,0,0,7, + 206,166,0,0,0,0,7,206,166,0,0,0,0,7,206,166,0,0,0,0,0,7,206,166,0,0,0,0, + 7,206,166,0,0,0,0,0,175,201,0,0,0,89,225,138,225,21,0,0,0,0,89,225,21,0, + 0,89,247,34,89,225,21,0,0,89,247,124,225,21,0,0,89,247,124,225,21,0,0,89, + 247,34,12,235,125,12,235,125,12,235,125,12,235,125,0,89,255,255,255,255, + 247,34,12,235,125,0,0,89,247,34,138,225,21,0,0,59,238,34,138,225,21,0,0, + 59,238,34,138,225,21,0,0,59,238,34,138,225,21,0,0,59,238,34,138,225,21, + 0,0,59,238,34,0,0,0,0,0,0,0,0,0,138,225,21,0,172,132,238,34,59,241,89,0, + 0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0, + 0,89,247,34,12,235,125,0,59,238,47,235,125,0,0,59,241,89,12,235,125,0,59, + 238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,59,245,255,255,255,166,0,59,245,255,255, + 255,166,0,59,245,255,255,255,166,0,59,245,255,255,255,166,0,0,59,245,255, + 255,255,166,0,59,245,255,255,255,166,0,89,255,255,255,255,255,255,255,255, + 255,247,175,201,0,0,0,0,0,175,255,255,255,255,255,247,34,175,255,255,255, + 255,255,247,198,255,255,255,255,255,247,198,255,255,255,255,255,247,34, + 12,235,125,12,235,125,12,235,125,12,235,125,89,251,89,0,0,59,241,89,12, + 235,125,0,0,89,247,34,175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89,175, + 201,0,0,0,12,232,89,175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89,7,206, + 255,255,255,255,255,255,251,226,201,0,89,166,12,232,89,59,241,89,0,0,89, + 247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89, + 247,34,0,175,201,0,138,201,12,235,125,0,0,12,235,125,0,175,201,0,138,201, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,89,255,166,0,7,206,166,89,255,166,0,7,206,166,89, + 255,166,0,7,206,166,89,255,166,0,7,206,166,0,89,255,166,0,7,206,166,89, + 255,166,0,7,206,166,138,255,125,0,0,175,201,0,0,0,0,0,175,201,0,0,0,0,0, + 175,201,0,0,0,0,0,0,175,201,0,0,0,0,0,175,201,0,0,0,0,0,175,201,0,0,0,0, + 0,0,12,235,125,12,235,125,12,235,125,12,235,125,175,201,0,0,0,59,241,89, + 12,235,125,0,0,89,247,34,175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89, + 175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89, + 0,0,0,0,0,0,0,0,0,175,201,7,176,21,12,232,89,59,241,89,0,0,89,247,34,59, + 241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,0, + 89,247,47,235,125,12,235,125,0,0,12,235,125,0,89,247,47,235,125,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,175,201,0,0,7,206,166,175,201,0,0,7,206,166,175,201,0,0, + 7,206,166,175,201,0,0,7,206,166,0,175,201,0,0,7,206,166,175,201,0,0,7,206, + 166,175,201,0,0,0,138,225,21,0,0,0,0,138,225,21,0,0,0,0,138,247,34,0,0, + 0,0,0,138,247,34,0,0,0,0,138,247,34,0,0,0,0,138,247,34,0,0,0,0,0,12,235, + 125,12,235,125,12,235,125,12,235,125,175,201,0,0,0,89,247,34,12,235,125, + 0,0,89,247,34,138,225,21,0,0,89,247,34,138,225,21,0,0,89,247,34,138,225, + 21,0,0,89,247,34,138,225,21,0,0,89,247,34,138,225,21,0,0,89,247,34,0,0, + 0,0,175,247,34,0,0,138,225,151,125,0,89,247,34,59,241,89,0,0,89,247,34, + 59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34, + 0,12,235,191,247,34,12,235,125,0,0,59,241,89,0,12,235,191,247,34,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,138,225,21,0,138,255,166,138,225,21,0,138,255,166,138, + 225,21,0,138,255,166,138,225,21,0,138,255,166,0,138,225,21,0,138,255,166, + 138,225,21,0,138,255,166,89,247,34,0,89,255,255,166,0,0,12,206,12,235,166, + 0,0,127,102,0,235,201,0,0,12,206,21,12,235,201,0,0,12,206,34,235,201,0, + 0,12,206,34,235,201,0,0,12,206,21,12,235,125,12,235,125,12,235,125,12,235, + 125,89,255,125,0,7,206,166,0,12,235,125,0,0,89,247,34,12,235,166,0,7,206, + 201,0,12,235,166,0,7,206,201,0,12,235,166,0,7,206,201,0,12,235,166,0,7, + 206,201,0,12,235,166,0,7,206,201,0,0,0,0,0,175,247,34,0,0,12,235,201,0, + 7,206,201,0,7,206,166,0,59,245,247,34,7,206,166,0,59,245,247,34,7,206,166, + 0,59,245,247,34,7,206,166,0,59,245,247,34,0,0,138,255,166,0,12,235,125, + 0,7,206,201,0,0,0,138,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,7,206,255,255,171, + 206,166,7,206,255,255,171,206,166,7,206,255,255,171,206,166,7,206,255,255, + 171,206,166,0,7,206,255,255,171,206,166,7,206,255,255,171,206,166,0,89, + 255,255,201,0,0,175,255,255,247,34,0,12,235,255,255,166,0,0,7,206,255,255, + 247,34,0,0,7,206,255,255,247,34,0,7,206,255,255,247,34,0,7,206,255,255, + 247,34,0,12,235,125,12,235,125,12,235,125,12,235,125,0,89,255,255,255,201, + 0,0,12,235,125,0,0,89,247,34,0,12,235,255,255,201,0,0,0,12,235,255,255, + 201,0,0,0,12,235,255,255,201,0,0,0,12,235,255,255,201,0,0,0,12,235,255, + 255,201,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,255,201,0,0,0,59,245,255,225, + 111,247,34,0,59,245,255,225,111,247,34,0,59,245,255,225,111,247,34,0,59, + 245,255,225,111,247,34,0,0,59,241,89,0,12,235,255,255,255,225,21,0,0,0, + 59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,12,235,125,0,0,0,0,0,0,0, + 138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,166,0,0,12,235,125,0,0,0,0,0,0,7,206, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 12,235,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,12,235,125,0,0,0,0,0,0,89,247, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0 +}; + + +const int FONTFIXED1_BM_W = 257; +const int FONTFIXED1_BM_H = 112; + +static const unsigned char s_FontFixed1[] = { + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,52,255,56,255,4,0,0, + 0,0,0,212,44,76,180,0,0,0,52,255,4,0,0,0,0,109,231,218,72,0,0,0,0,0,96,227, + 243,170,0,0,0,0,52,255,4,0,0,0,0,0,0,0,158,104,0,0,0,0,153,114,0,0,0,0,0,0,0, + 52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,172,128,0,0,12,164,241,234,133,1,0,0,22,179,237,255,4,0,0,0,141,220 + ,246,236,164,22,0,0,94,216,242,243,194,56,0,0,0,0,0,186,255,4,0,0,52,255,244, + 244,244,91,0,0,1,120,223,244,225,62,0,0,244,244,244,244,249,242,0,0,62,200, + 245,242,181,35,0,0,46,196,244,232,139,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,216,246,215,62,0,0,127,0,0 + ,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,52,255,56,255,4,0,0,0,0,13,239,2,131,124,0, + 0,110,232,255,238,202,62,0,29,254,51,99,231,0,0,0,0,0,241,53,0,34,0,0,0,0,52, + 255,4,0,0,0,0,0,0,45,225,4,0,0,0,0,30,237,15,0,0,0,0,99,95,52,255,11,127,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,242, + 19,0,0,155,188,12,29,221,103,0,0,21,101,90,255,4,0,0,0,127,46,1,15,165,192,0, + 0,34,24,0,5,127,233,0,0,0,0,98,197,255,4,0,0,52,255,4,0,0,0,0,0,121,219,45,0, + 22,27,0,0,0,0,0,0,170,151,0,14,242,119,4,12,160,207,0,3,224,136,5,18,188,114, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,114,38,2,133,225,0,0,127,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,52,255, + 56,255,4,0,0,0,0,67,189,0,187,69,0,26,254,100,255,8,53,44,0,30,254,49,100,235 + ,0,1,0,0,0,206,47,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,155,133,0,0,0,0,0,0,186, + 110,0,0,0,0,3,103,195,255,177,75,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,144,0,0,5,244,63,0,0,112,200,0,0,0,0,52, + 255,4,0,0,0,0,0,0,0,60,251,0,0,0,0,0,10,127,211,0,0,0,25,215,67,255,4,0,0,52, + 255,4,0,0,0,0,1,235,77,0,0,0,0,0,0,0,0,0,24,250,49,0,44,255,15,0,0,64,251,0, + 41,255,17,0,0,68,205,0,0,0,43,216,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,147,0, + 0,0,0,0,0,0,0,0,0,197,97,11,0,0,0,0,0,0,0,0,69,248,0,0,127,0,0,0,0,0,0,0,0,0, + 0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,63,240,247,248,240,254,241,0,42,255,69,255,4 + ,0,0,0,0,112,232,221,80,97,184,0,0,14,189,196,7,0,0,0,0,0,0,0,0,0,0,0,0,0,1, + 233,64,0,0,0,0,0,0,117,186,0,0,0,0,3,102,194,255,177,74,0,0,0,0,52,255,4,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,244,30,0,0,37,255,37 + ,175,0,66,244,0,0,0,0,52,255,4,0,0,0,0,0,0,0,126,195,0,0,0,48,241,255,190,16, + 0,0,0,176,90,52,255,4,0,0,52,255,228,236,162,16,0,33,255,106,220,237,172,21,0 + ,0,0,0,0,125,203,0,0,4,205,120,6,14,160,159,0,40,255,21,0,0,69,245,0,0,0,52, + 255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,13,102,203,225,132,0,0,240,240,240,240,240 + ,240,0,0,84,180,237,152,52,0,0,0,0,0,11,204,150,0,0,127,0,0,0,0,0,0,0,0,0,0, + 52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,190,66,54,202,0,0,2,196,220,255,106,32,0,0 + ,0,0,13,116,184,93,4,0,0,176,114,109,159,0,52,0,1,0,0,0,0,0,0,0,0,0,29,255,22 + ,0,0,0,0,0,0,72,236,0,0,0,0,99,96,52,255,11,128,0,0,240,240,243,255,240,240,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,161,0,0,0,49,255, + 33,216,0,54,255,0,0,0,0,52,255,4,0,0,0,0,0,0,68,236,45,0,0,0,0,0,27,198,133,0 + ,0,87,189,0,52,255,4,0,0,19,40,0,29,197,168,0,49,255,146,9,15,182,176,0,0,0,0 + ,3,226,100,0,0,0,28,210,252,255,182,7,0,2,223,142,6,20,186,255,0,0,0,0,0,0,0, + 0,0,0,0,43,216,3,0,0,0,0,158,233,162,67,1,0,0,0,0,0,0,0,0,0,0,0,0,0,23,115, + 210,208,0,0,0,0,176,192,6,0,0,127,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0, + 0,0,0,0,0,7,239,9,118,138,0,0,0,5,109,255,153,234,112,0,0,88,179,76,110,231, + 220,0,28,255,16,0,176,110,68,0,0,0,0,0,0,0,0,0,0,0,46,255,8,0,0,0,0,0,0,57, + 253,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,244,244, + 244,0,0,0,0,0,0,0,0,0,0,0,0,0,17,241,43,0,0,0,37,255,17,0,0,66,244,0,0,0,0,52 + ,255,4,0,0,0,0,0,73,233,60,0,0,0,0,0,0,0,69,238,0,16,227,40,0,52,255,4,0,0,0, + 0,0,0,69,246,0,38,255,20,0,0,69,247,0,0,0,0,79,242,11,0,0,5,214,122,7,16,162, + 175,0,0,46,193,239,210,125,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,215, + 114,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,67,162,236,0,0,0,34,255,31,0,0,0,127,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,244,251,240,251,244,228,0,0, + 0,52,255,4,76,245,0,0,11,0,29,254,51,101,0,40,255,30,0,18,222,193,0,0,0,0,0,0 + ,0,0,0,0,0,29,255,23,0,0,0,0,0,0,72,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,178,0,0,0,0,5,245 + ,63,0,0,111,200,0,0,0,0,52,255,4,0,0,0,0,87,233,54,0,0,0,0,0,0,0,0,70,248,0, + 52,255,255,255,255,255,255,0,0,0,0,0,0,68,246,0,6,248,19,0,0,65,247,0,0,0,0, + 185,151,0,0,0,42,255,15,0,0,59,252,0,0,0,0,0,0,124,188,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,46,147,234,180,86,0,0,244,244,244,244,244,244,0,0,39,133,226, + 197,97,10,0,0,0,51,255,4,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,140,115,12,235,8,0,0,32,73,55,255,11,143,215,0,0,0,0,31,255,47,97,0,1 + ,211,174,16,6,148,252,0,0,0,0,0,0,0,0,0,0,0,1,233,65,0,0,0,0,0,0,116,187,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0, + 44,220,3,0,0,0,0,9,234,58,0,0,0,0,0,155,186,12,28,220,103,0,0,0,8,58,255,11,8 + ,0,0,105,232,47,0,0,0,0,0,101,32,0,25,193,173,0,0,0,0,0,52,255,4,0,0,70,25,0, + 25,193,166,0,0,165,147,7,13,176,176,0,0,0,36,254,49,0,0,0,15,245,120,4,12,157 + ,210,0,0,37,12,0,68,239,74,0,0,0,44,220,3,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,8, + 92,192,0,0,0,0,0,0,0,0,0,0,235,142,41,0,0,0,0,0,0,4,24,0,0,0,0,127,0,0,0,0,0, + 0,0,0,0,0,49,244,3,0,0,0,0,0,0,0,0,0,0,0,0,222,33,87,169,0,0,0,23,186,245,255 + ,243,186,39,0,0,0,0,0,122,239,229,0,0,30,181,245,231,147,178,0,3,0,0,0,0,0,0, + 0,0,0,0,155,133,0,0,0,0,0,0,185,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,62,241,1,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,108,195,0,0,0,0,0,0,13, + 165,241,235,134,1,0,0,0,255,255,255,255,255,0,0,255,250,244,244,244,244,0,0, + 143,226,244,238,163,17,0,0,0,0,0,52,255,4,0,0,134,236,245,236,155,13,0,0,16, + 167,238,242,175,22,0,0,0,139,203,0,0,0,0,0,68,203,246,243,185,39,0,0,104,235, + 244,212,88,0,0,0,0,52,255,4,0,0,0,0,0,62,241,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,6,0,0,0,0,0,0,0,0,49,244,3,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,225,4,0,0,0,0,29,237,16,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,120,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,223, + 75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,158,104,0,0,0,0,153,115,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,181,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,119,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0 + ,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127 + ,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127 + ,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127 + ,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,28,160 + ,229,236,163,14,0,0,0,20,252,200,0,0,0,52,255,244,243,238,177,32,0,0,0,96,213 + ,244,234,137,0,52,255,244,239,190,68,0,0,52,255,244,244,244,244,68,0,0,52,255 + ,244,244,244,244,0,0,0,104,217,244,222,100,0,52,255,4,0,0,52,255,0,0,244,246, + 255,244,244,0,0,0,0,137,244,246,255,4,0,52,255,4,0,0,137,216,0,0,52,255,4,0,0 + ,0,0,52,255,163,0,0,212,255,0,52,255,166,0,0,52,255,0,0,15,168,241,236,141,2, + 0,52,255,244,244,239,176,33,0,0,15,168,241,236,141,2,0,52,255,244,244,236,171 + ,30,0,0,47,189,243,241,204,73,0,0,244,244,246,255,244,244,0,52,255,4,0,0,52, + 255,0,125,203,0,0,0,24,254,0,236,75,0,0,0,0,152,0,44,247,51,0,0,71,241,0,220, + 112,0,0,0,161,179,0,0,244,244,244,244,249,254,0,0,0,52,255,244,125,0,0,35,244 + ,23,0,0,0,0,0,0,0,171,246,255,4,0,0,0,0,41,242,200,7,0,0,0,0,0,0,0,0,0,0,127, + 24,227,130,13,21,206,163,0,0,0,98,207,251,26,0,0,52,255,4,0,8,147,204,0,0,100 + ,224,51,0,22,89,0,52,255,4,7,81,238,66,0,52,255,4,0,0,0,0,0,0,52,255,4,0,0,0, + 0,0,106,221,46,0,29,89,0,52,255,4,0,0,52,255,0,0,0,52,255,4,0,0,0,0,0,0,0,52, + 255,4,0,52,255,4,0,133,218,26,0,0,52,255,4,0,0,0,0,52,255,202,4,36,219,255,0, + 52,255,242,30,0,52,255,0,0,160,175,10,24,213,112,0,52,255,4,0,20,166,204,0,0, + 160,175,10,24,213,112,0,52,255,4,0,17,166,201,0,8,232,119,7,3,56,63,0,0,0,0, + 52,255,4,0,0,52,255,4,0,0,52,255,0,48,253,19,0,0,94,226,0,197,107,0,0,0,0,184 + ,0,0,131,201,2,8,220,101,0,74,238,18,0,52,245,33,0,0,0,0,0,1,192,148,0,0,0,52 + ,255,4,0,0,0,0,168,135,0,0,0,0,0,0,0,0,52,255,4,0,0,0,16,218,106,178,159,0,0, + 0,0,0,0,0,0,0,0,127,157,170,0,0,0,88,243,0,0,0,179,121,200,105,0,0,52,255,4,0 + ,0,63,251,0,0,227,86,0,0,0,0,0,52,255,4,0,0,125,186,0,52,255,4,0,0,0,0,0,0,52 + ,255,4,0,0,0,0,1,229,84,0,0,0,0,0,52,255,4,0,0,52,255,0,0,0,52,255,4,0,0,0,0, + 0,0,0,52,255,4,0,52,255,4,130,220,27,0,0,0,52,255,4,0,0,0,0,52,255,141,66,115 + ,140,255,0,52,255,150,143,0,52,255,0,6,246,54,0,0,105,204,0,52,255,4,0,0,60, + 253,0,6,246,54,0,0,105,204,0,52,255,4,0,0,59,252,0,46,255,15,0,0,0,0,0,0,0,0, + 52,255,4,0,0,52,255,4,0,0,52,255,0,0,225,87,0,0,165,150,0,157,139,0,234,154,0 + ,215,0,0,7,216,102,132,187,0,0,0,176,146,0,194,127,0,0,0,0,0,0,101,223,12,0,0 + ,0,52,255,4,0,0,0,0,48,239,14,0,0,0,0,0,0,0,52,255,4,0,0,3,184,122,0,8,193, + 112,0,0,0,0,0,0,0,0,0,127,243,67,72,217,233,162,255,0,3,12,248,51,130,186,0,0 + ,52,255,4,0,12,158,197,0,31,255,22,0,0,0,0,0,52,255,4,0,0,69,240,0,52,255,4,0 + ,0,0,0,0,0,52,255,4,0,0,0,0,32,255,22,0,0,0,0,0,52,255,4,0,0,52,255,0,0,0,52, + 255,4,0,0,0,0,0,0,0,52,255,4,0,52,255,130,244,29,0,0,0,0,52,255,4,0,0,0,0,52, + 255,61,146,188,66,255,0,52,255,37,239,16,52,255,0,38,255,15,0,0,64,244,0,52, + 255,4,0,24,169,202,0,38,255,15,0,0,64,244,0,52,255,4,0,16,159,188,0,11,235, + 176,72,17,0,0,0,0,0,0,52,255,4,0,0,52,255,4,0,0,52,255,0,0,148,157,0,1,234,73 + ,0,118,170,31,225,207,0,246,0,0,0,62,237,237,32,0,0,0,31,241,124,221,8,0,0,0, + 0,0,25,238,68,0,0,0,0,52,255,4,0,0,0,0,0,184,118,0,0,0,0,0,0,0,52,255,4,0,0, + 44,101,0,0,0,14,121,0,0,0,0,0,0,0,0,0,127,255,32,242,102,5,147,255,0,4,86,235 + ,1,59,250,16,0,52,255,240,241,254,223,32,0,48,255,6,0,0,0,0,0,52,255,4,0,0,55 + ,255,0,52,255,240,240,240,240,22,0,0,52,255,240,240,240,202,0,48,255,6,0,138, + 241,248,0,52,255,240,240,240,243,255,0,0,0,52,255,4,0,0,0,0,0,0,0,52,255,4,0, + 52,255,220,235,100,0,0,0,0,52,255,4,0,0,0,0,52,255,6,209,182,52,255,0,52,255, + 4,169,120,52,255,0,49,255,5,0,0,54,255,0,52,255,240,240,231,169,31,0,49,255,5 + ,0,0,54,255,0,52,255,240,244,255,173,11,0,0,38,160,229,253,188,37,0,0,0,0,52, + 255,4,0,0,52,255,4,0,0,52,255,0,0,70,227,0,51,244,7,0,78,202,83,147,220,32, + 251,0,0,0,14,235,202,0,0,0,0,0,124,255,75,0,0,0,0,0,0,173,156,0,0,0,0,0,52, + 255,4,0,0,0,0,0,64,230,7,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,127,255,54,255,13,0,62,255,0,4,167,167,0,4,240,92,0,52,255,4,0,18,164, + 181,0,31,255,22,0,0,0,0,0,52,255,4,0,0,69,240,0,52,255,4,0,0,0,0,0,0,52,255,4 + ,0,0,0,0,32,255,20,0,0,52,255,0,52,255,4,0,0,52,255,0,0,0,52,255,4,0,0,0,0,0, + 0,0,52,255,3,0,52,255,33,86,243,35,0,0,0,52,255,4,0,0,0,0,52,255,4,127,89,52, + 255,0,52,255,4,52,230,58,255,0,38,255,15,0,0,64,244,0,52,255,4,0,0,0,0,0,38, + 255,15,0,0,64,247,0,52,255,4,1,87,251,67,0,0,0,0,0,32,176,207,0,0,0,0,52,255, + 4,0,0,51,255,4,0,0,52,255,0,0,6,242,42,121,174,0,0,39,234,136,91,168,112,218, + 0,0,0,153,180,211,98,0,0,0,0,52,255,4,0,0,0,0,0,80,228,15,0,0,0,0,0,52,255,4, + 0,0,0,0,0,0,200,101,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,255,37,243,102,5,147,255,0,11,241,250,248,248,253,173,0,52,255,4,0,0,58, + 249,0,0,228,84,0,0,0,0,0,52,255,4,0,0,126,186,0,52,255,4,0,0,0,0,0,0,52,255,4 + ,0,0,0,0,1,230,78,0,0,52,255,0,52,255,4,0,0,52,255,0,0,0,52,255,4,0,0,0,0,0,0 + ,0,61,250,0,0,52,255,4,0,170,199,3,0,0,52,255,4,0,0,0,0,52,255,4,0,0,52,255,0 + ,52,255,4,0,192,149,255,0,6,247,54,0,0,104,204,0,52,255,4,0,0,0,0,0,6,247,54, + 0,0,104,209,0,52,255,4,0,0,151,207,0,0,0,0,0,0,61,253,0,0,0,0,52,255,4,0,0,40 + ,255,8,0,0,56,248,0,0,0,171,112,192,97,0,0,4,250,199,35,111,196,178,0,0,66, + 241,28,64,236,21,0,0,0,52,255,4,0,0,0,0,14,228,75,0,0,0,0,0,0,52,255,4,0,0,0, + 0,0,0,80,218,2,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,238 + ,80,75,219,234,164,248,0,77,249,16,0,0,87,245,0,52,255,4,0,9,145,216,0,0,102, + 222,50,0,22,89,0,52,255,4,7,82,239,67,0,52,255,4,0,0,0,0,0,0,52,255,4,0,0,0,0 + ,0,109,215,40,0,81,255,0,52,255,4,0,0,52,255,0,0,0,52,255,4,0,0,0,43,112,13,3 + ,145,201,0,0,52,255,4,0,20,233,126,0,0,52,255,11,8,8,8,0,52,255,4,0,0,52,255, + 0,52,255,4,0,75,246,255,0,0,163,173,9,23,212,114,0,52,255,4,0,0,0,0,0,0,162, + 173,9,23,212,123,0,52,255,4,0,0,25,246,0,14,123,29,0,18,163,202,0,0,0,0,52, + 255,4,0,0,5,232,107,3,9,151,190,0,0,0,93,195,248,21,0,0,0,216,233,0,54,254, + 139,0,10,221,108,0,0,168,163,0,0,0,52,255,4,0,0,0,0,151,163,0,0,0,0,0,0,0,52, + 255,4,0,0,0,0,0,0,1,214,84,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,127,146,193,1,0,0,0,0,0,155,179,0,0,0,11,245,0,52,255,244,243,239,184,44 + ,0,0,0,99,214,244,237,140,0,52,255,244,240,191,69,0,0,52,255,244,244,244,244, + 99,0,0,52,255,4,0,0,0,0,0,0,109,219,243,223,116,0,52,255,4,0,0,52,255,0,0,244 + ,246,255,244,244,0,0,27,186,240,244,204,50,0,0,52,255,4,0,0,82,251,0,0,52,255 + ,255,255,255,255,0,52,255,4,0,0,52,255,0,52,255,4,0,1,213,255,0,0,16,171,241, + 237,143,3,0,52,255,4,0,0,0,0,0,0,16,170,241,254,187,6,0,52,255,4,0,0,0,138,0, + 9,171,229,246,240,177,33,0,0,0,0,52,255,4,0,0,0,51,197,244,241,177,28,0,0,0, + 18,252,198,0,0,0,0,176,179,0,5,247,99,0,144,199,2,0,0,27,243,0,0,0,52,255,4,0 + ,0,0,0,254,247,244,244,244,244,0,0,0,52,255,4,0,0,0,0,0,0,0,96,203,0,0,0,0,0, + 52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,16,216,165,31,2,24,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,237,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,5,226,68,0,0,0,0,52, + 255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,19,144,222,242,159,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,248,240,123,0,0,0,0,0,0,0,71,79,0,0,0,168, + 241,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,244,244,244,244,244,244,99,0,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127 + ,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127 + ,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127 + ,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127 + ,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,9,124,20,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,127,0,0,112,174,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,4,221,0,127,0,0,0,159,98,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,0,0,0,0,0,0,0,0,0,0,0,2,166,243,244,102,0, + 0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,49,244,3,0,0,0,0,0,49,244,3,0,0,0,52 + ,255,4,0,0,0,0,11,244,246,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,158,239,209,0,0,0,0,52,255,4,0,0,11 + ,244,233,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,162,0,127,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,0,0,0,0,0, + 0,0,0,0,0,0,46,255,24,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,255,46,0,0,0,0,0 + ,52,255,4,0,0,0,0,96,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,81,0,127,0,0,0 + ,0,0,0,0,0,0,103,213,244,239,180,36,0,52,255,122,232,241,159,9,0,0,12,151,233 + ,244,202,40,0,0,26,183,244,223,133,255,0,0,13,156,236,241,165,12,0,19,244,246 + ,255,244,244,102,0,0,25,182,244,221,127,255,0,52,255,111,233,235,80,0,0,0,0, + 244,246,255,4,0,0,0,45,244,246,255,4,0,0,0,52,255,4,0,122,210,0,0,0,52,255,4, + 0,0,0,255,173,246,137,195,245,114,0,52,255,111,233,235,80,0,0,0,29,182,242, + 237,157,11,0,52,255,121,231,241,161,10,0,0,26,183,244,222,130,255,0,0,52,255, + 78,217,244,175,0,0,0,109,226,245,229,114,0,19,244,246,255,244,244,152,0,52, + 255,4,0,52,255,4,0,51,242,9,0,0,73,228,0,226,63,0,0,0,0,140,0,13,219,93,0,0, + 173,156,0,40,250,19,0,0,50,245,0,0,209,244,244,246,255,0,0,0,0,0,51,255,4,0,0 + ,0,0,0,52,255,4,0,0,0,0,52,255,3,0,0,0,0,0,0,0,0,0,0,0,0,5,8,0,1,219,10,0,127 + ,0,0,0,0,0,0,0,0,0,93,52,2,9,162,204,0,52,255,163,9,19,198,144,0,0,174,188,24 + ,0,53,43,0,0,193,157,7,20,200,255,0,0,173,186,16,11,179,152,0,0,0,52,255,4,0, + 0,0,0,189,167,10,19,199,255,0,52,255,121,2,133,219,0,0,0,0,0,52,255,4,0,0,0,0 + ,0,52,255,4,0,0,0,52,255,4,133,204,19,0,0,0,52,255,4,0,0,0,255,51,99,255,55, + 96,227,0,52,255,121,2,133,219,0,0,0,198,158,8,19,198,149,0,52,255,163,9,19, + 198,145,0,0,192,158,8,20,198,255,0,0,52,255,169,20,2,52,0,0,31,255,62,0,20,57 + ,0,0,0,52,255,4,0,0,0,52,255,4,0,52,255,4,0,0,216,84,0,0,162,139,0,166,118,0, + 0,0,0,195,0,0,49,235,36,104,211,9,0,0,200,106,0,0,142,163,0,0,0,0,0,149,171,0 + ,0,0,0,0,54,255,2,0,0,0,0,0,52,255,4,0,0,0,0,50,255,5,0,0,0,0,0,0,0,0,0,0,0, + 95,232,100,0,55,175,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,61,252,0,52,255,33,0,0, + 81,233,0,22,255,41,0,0,0,0,0,25,255,32,0,0,82,255,0,21,255,49,0,0,70,236,0,0, + 0,52,255,4,0,0,0,24,255,35,0,0,82,255,0,52,255,18,0,56,254,1,0,0,0,0,52,255,4 + ,0,0,0,0,0,52,255,4,0,0,0,52,255,146,227,15,0,0,0,0,52,255,4,0,0,0,255,8,56, + 255,8,56,253,0,52,255,18,0,56,254,1,0,27,255,32,0,0,81,234,0,52,255,33,0,0,81 + ,232,0,25,255,32,0,0,81,255,0,0,52,255,41,0,0,0,0,0,26,252,96,11,0,0,0,0,0,52 + ,255,4,0,0,0,52,255,4,0,52,255,4,0,0,125,173,0,8,242,48,0,106,173,0,192,118,4 + ,246,0,0,0,106,212,234,40,0,0,0,103,199,0,3,230,67,0,0,0,0,90,216,13,0,0,0,0, + 1,121,226,0,0,0,0,0,0,52,255,4,0,0,0,0,22,252,74,0,0,0,0,115,225,233,149,42, + 25,0,15,54,177,0,136,94,0,0,127,0,0,0,0,0,0,0,0,0,78,197,237,240,243,255,0,52 + ,255,6,0,0,55,254,0,47,255,7,0,0,0,0,0,48,255,6,0,0,55,255,0,47,255,240,240, + 240,241,247,0,0,0,52,255,4,0,0,0,48,255,7,0,0,55,255,0,52,255,4,0,52,255,4,0, + 0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,52,255,187,238,80,0,0,0,0,52,255,4,0, + 0,0,255,4,52,255,4,52,255,0,55,255,4,0,52,255,4,0,48,255,6,0,0,55,254,0,52, + 255,6,0,0,55,254,0,48,255,6,0,0,55,255,0,0,52,255,6,0,0,0,0,0,0,84,186,239, + 208,75,0,0,0,52,255,4,0,0,0,52,255,4,0,52,255,4,0,0,35,246,13,84,213,0,0,46, + 228,16,202,187,49,226,0,0,0,13,239,176,0,0,0,0,15,246,36,70,225,1,0,0,0,43, + 233,43,0,0,0,0,33,247,247,73,0,0,0,0,0,0,52,255,4,0,0,0,0,0,112,254,237,0,0,0 + ,139,14,17,117,219,229,0,0,1,219,8,211,18,0,0,127,0,0,0,0,0,0,0,0,24,251,86,5 + ,0,65,255,0,52,255,32,0,0,80,232,0,22,255,41,0,0,0,0,0,25,255,32,0,0,81,255,0 + ,22,255,21,0,0,0,0,0,0,0,52,255,4,0,0,0,25,255,34,0,0,81,255,0,52,255,4,0,52, + 255,4,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,52,255,8,84,237,29,0,0,0,51, + 255,5,0,0,0,255,4,52,255,4,52,255,0,56,255,4,0,52,255,4,0,27,255,32,0,0,81, + 234,0,52,255,32,0,0,80,233,0,26,255,32,0,0,81,255,0,0,52,255,4,0,0,0,0,0,0,0, + 0,4,126,237,0,0,0,51,255,4,0,0,0,48,255,8,0,66,255,4,0,0,0,199,94,173,122,0,0 + ,2,239,110,116,189,116,166,0,0,0,166,166,222,90,0,0,0,0,166,128,162,131,0,0,0 + ,13,216,90,0,0,0,0,0,0,3,137,210,0,0,0,0,0,0,52,255,4,0,0,0,0,14,244,89,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,154,117,188,0,0,0,127,0,0,0,0,0,0,0,0,33,255,68,0,26,189 + ,255,0,52,255,160,8,17,195,143,0,0,177,185,23,0,50,42,0,0,194,158,7,19,198, + 255,0,0,176,162,17,0,32,76,0,0,0,52,255,4,0,0,0,0,191,164,10,17,195,255,0,52, + 255,4,0,52,255,4,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,52,255,4,0,156,194 + ,0,0,0,24,254,67,0,0,0,255,4,52,255,4,52,255,0,56,255,4,0,52,255,4,0,0,200, + 158,7,19,198,151,0,52,255,160,8,17,195,146,0,0,194,158,7,19,198,255,0,0,52, + 255,4,0,0,0,0,0,31,72,8,2,124,230,0,0,0,30,255,51,0,0,0,15,251,62,0,147,255,4 + ,0,0,0,108,195,246,32,0,0,0,182,228,42,120,228,106,0,0,103,217,11,55,238,39,0 + ,0,0,70,222,242,36,0,0,0,172,148,0,0,0,0,0,0,0,0,57,254,1,0,0,0,0,0,52,255,4, + 0,0,0,0,49,255,8,0,0,0,0,0,0,0,0,0,0,0,0,0,78,244,107,0,0,0,127,0,0,0,0,0,0,0 + ,0,0,114,231,243,204,108,255,0,52,255,120,232,240,159,9,0,0,14,153,234,244, + 206,41,0,0,28,184,244,223,132,255,0,0,14,155,234,244,218,111,0,0,0,52,255,4,0 + ,0,0,0,27,184,245,221,123,255,0,52,255,4,0,52,255,4,0,0,118,244,246,255,244, + 244,0,0,0,0,52,255,4,0,0,0,52,255,4,0,11,217,0,0,0,0,121,240,244,114,0,255,4, + 52,255,4,52,255,0,56,255,4,0,52,255,4,0,0,31,184,243,238,160,12,0,52,255,120, + 232,241,160,10,0,0,28,185,244,223,130,255,0,0,52,255,4,0,0,0,0,0,35,199,242, + 246,204,61,0,0,0,0,141,236,229,142,0,0,120,234,191,137,255,4,0,0,0,21,251,197 + ,0,0,0,0,122,224,0,45,255,46,0,48,241,50,0,0,118,210,0,0,0,2,227,198,0,0,0,0, + 255,246,244,244,244,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,52,255,4,0, + 0,0,0,0,0,0,0,0,0,0,0,0,10,245,27,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,72,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,254,1,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52 + ,255,4,0,0,0,0,0,0,0,0,0,0,52,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 199,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,255,5,0,0,0,0,0,52,255,4,0,0,0,0,53, + 255,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,53,55,2,15,182,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,215,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,52,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,64,244,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,255,56,0,0,0,0,0,52,255,4,0,0 + ,0,0,106,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,75,220,246,237,162,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 194,246,227,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,52,255,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,203,237,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,229,206, + 0,0,0,0,52,255,4,0,0,11,240,221,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127 + ,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127 + ,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127 + ,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,187,58,108,143,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,10,58,54,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,97,59,0,0,0,0,0,0,0,0,0,0,0,0,0,33,222,208,8,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,194,183,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,48,240,52,240,3,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,58,199,211,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,184,143,119,77,39,156,0, + 0,0,73,164,22,196,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42, + 179,3,188,30,0,0,0,0,0,0,0,0,0,0,127,0,4,134,230,245,210,44,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,57,219,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52, + 255,4,0,0,0,0,0,52,255,4,0,0,0,0,4,195,31,94,137,0,0,109,231,221,73,0,0,0,0,0 + ,47,189,243,241,204,73,0,0,0,0,0,0,0,0,0,0,26,175,241,247,255,244,0,0,0,0,0,0 + ,0,0,0,0,244,244,244,244,249,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111, + 129,0,0,0,0,0,0,52,255,4,0,0,0,0,111,178,0,111,129,0,0,52,255,4,52,255,4,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,156,224,40,191,0,0,0,196,0, + 196,159,147,211,0,0,0,0,125,231,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,143,189,126,0,0,0,171,161,0,0,1,208,134,0,127,0,137,197,27,0,51 + ,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,218,103,1,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,254,51,101 + ,235,0,0,0,0,8,233,119,7,3,56,63,0,0,0,0,0,0,0,0,0,0,181,177,20,52,255,4,0,0, + 0,0,0,0,0,0,0,0,0,0,0,1,192,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206, + 69,0,0,0,0,0,0,62,241,1,0,0,0,0,206,94,0,206,69,0,0,62,241,1,66,241,1,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,174,39,188,126,0,0,0,196,0,196 + ,55,118,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,15,125,8,0,0,0,29,241,39,0,85,240,17,0,127,8,244,57,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,249,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118, + 244,246,255,244,244,72,0,118,244,246,255,244,244,72,0,0,0,0,0,0,0,0,0,254,50, + 100,234,1,57,97,0,46,255,15,0,0,0,0,0,0,0,0,0,31,0,0,0,10,252,51,0,52,255,4,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,101,223,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35, + 255,14,0,0,0,0,0,0,118,157,0,0,0,0,35,255,18,35,255,14,0,0,120,157,0,143,157, + 0,0,0,0,84,234,231,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 196,0,196,0,0,196,0,0,0,109,226,245,229,114,0,0,0,0,30,0,0,0,0,0,103,239,220, + 122,231,236,0,0,0,0,0,0,0,0,0,0,209,244,244,246,255,0,0,0,120,167,2,213,127,0 + ,0,127,240,255,241,240,236,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74, + 210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0 + ,0,0,0,0,0,0,0,0,0,111,234,255,210,148,92,14,0,10,232,176,72,17,0,0,0,0,0,0, + 55,219,0,0,0,40,255,14,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,25,238,68,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,178,63,0,0,0,0,52,255,4, + 52,255,4,0,0,181,63,0,225,63,0,0,0,0,234,255,255,232,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,255,62,0,20,57,0,0,0,0,218, + 54,0,0,0,5,243,62,113,255,57,106,0,0,0,0,0,0,0,0,0,0,0,0,0,149,171,0,0,0,6, + 214,135,237,14,0,0,127,51,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 22,240,247,250,240,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0 + ,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,129,149,89,13,0,0,0,0,0,33,152,222,253,188, + 37,0,0,0,85,217,46,0,0,0,49,255,6,0,52,255,240,0,0,0,0,0,0,0,0,0,0,0,0,173, + 156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,255,255,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,252,96,11,0,0,0,0,0,0,46,217,85, + 0,0,39,255,11,62,255,6,54,0,0,0,0,0,0,0,0,0,0,0,0,90,216,13,0,0,0,0,68,255, + 121,0,0,0,127,240,255,240,240,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 156,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4 + ,0,0,0,0,0,0,0,0,0,0,0,113,231,221,73,73,223,225,0,0,0,0,0,27,170,207,0,0,0, + 229,102,0,0,0,0,40,255,14,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,80,228,15,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,84,235,233,79,0,0,244,244,244,244,244,244,244,0,244,244, + 244,244,244,244,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,186,239,208,75,0 + ,0,0,0,0,103,229,0,0,50,255,5,53,255,240,241,0,3,0,0,0,0,0,0,0,0,0,43,233,43, + 0,0,0,0,0,0,252,60,0,0,0,127,9,247,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,200,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,116, + 240,243,255,240,240,71,0,0,0,0,0,0,0,0,0,254,51,102,235,229,51,101,0,0,0,0,0, + 0,61,253,0,0,0,29,206,115,0,0,0,10,252,51,0,52,255,4,0,0,0,0,0,0,0,0,0,0,14, + 228,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,126,237,0,0,0,0,116,206,29,0,0 + ,39,255,11,60,255,8,0,0,0,0,0,0,0,0,0,0,0,13,216,90,0,0,0,0,0,0,0,252,60,0,0, + 0,127,0,146,201,26,0,50,39,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,1,243,45, + 0,0,0,0,52,255,4,52,255,4,0,44,220,3,44,220,3,44,0,3,0,52,255,4,0,0,0,0,0,52, + 255,4,0,0,0,0,0,0,0,0,0,0,0,254,47,99,235,230,47,97,0,15,135,41,5,30,171,202, + 0,0,0,0,12,180,0,0,0,0,181,177,19,52,255,4,0,0,0,0,0,0,0,0,0,0,151,163,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,72,8,2,124,230,0,0,0,0,179,12,0,0,0,6,244,62, + 114,255,80,0,0,1,0,0,0,0,0,0,0,0,172,148,0,0,0,0,0,0,0,0,252,60,0,0,0,127,0,6 + ,140,231,245,213,44,0,0,0,0,0,0,0,0,0,0,0,62,241,1,0,0,0,0,0,33,253,7,0,0,0,0 + ,62,241,1,66,241,1,0,52,255,4,52,255,4,52,0,4,0,52,255,4,0,0,0,0,0,52,255,4,0 + ,0,0,0,0,0,0,0,0,0,0,116,239,229,79,79,231,233,0,9,166,229,252,240,177,33,0,0 + ,0,0,0,3,0,0,0,0,26,177,242,247,255,244,0,0,0,0,0,0,0,0,0,0,254,247,244,244, + 244,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,199,242,246,204,61,0,0,0,0,2,0,0,0,0,0, + 105,240,221,111,222,244,0,1,0,0,0,0,0,0,0,0,255,246,244,244,244,0,0,0,0,0,252 + ,60,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,157,0,0,0,0,0,0,85,212, + 0,0,0,0,0,120,157,0,143,157,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255 + ,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,63,0,0,0,0,30,11,195,131, + 0,0,0,0,0,181,63,0,225,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,227,245,177,12,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0 + ,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127 + ,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127 + ,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127 + ,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,58,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,221,50,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,185,255,4,0,0,0,0,106,186,255,4,0,0 + ,0,0,0,144,235,229,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0, + 0,0,0,0,49,244,3,0,0,0,0,0,0,0,52,255,4,0,0,0,0,86,224,245,206,0,0,0,0,0,0,0, + 0,0,215,116,0,0,0,164,172,0,0,0,0,52,255,4,0,0,0,110,227,245,223,102,0,0,0,49 + ,244,53,244,3,0,0,0,0,0,0,0,0,0,0,0,0,122,237,237,102,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,244,244,244,175,0,0,0,0,116,239,227,77,0,0,0 + ,0,0,0,0,0,0,0,0,0,116,235,233,108,0,0,0,0,165,239,235,132,0,0,0,0,0,173,88,0 + ,0,0,0,0,0,0,0,0,0,0,0,40,184,245,255,246,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,101,185,255,4,0,0,0,0,77,219,247,201,45,0,0,0,0,0,0,0,0,0,0,52,255,4,0 + ,0,0,0,0,52,255,4,0,0,0,0,0,17,0,101,238,0,0,0,0,0,49,244,3,0,0,0,0,0,0,0,0,0 + ,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,11,245,105,1, + 43,0,0,0,0,0,0,0,0,0,62,241,25,0,61,236,23,0,0,0,0,52,255,4,0,0,33,255,60,0, + 26,51,0,0,0,0,0,0,0,0,0,0,0,53,181,236,230,161,31,0,0,0,33,1,102,238,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,181,236,230,161,31,0,0,0,0,0,0,0,0,0,0,30, + 254,51,99,236,0,0,0,0,0,0,0,0,0,0,0,0,42,3,96,248,0,0,0,0,15,2,107,236,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,226,255,255,255,56,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,14,244,93,2,142,209,0,0,0,0,0,0,0,0,0,0,52, + 255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,0,222,242,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,161,243,255,236,0,0,0,47, + 255,11,0,0,0,0,82,25,0,0,44,64,0,0,155,165,3,210,93,0,0,0,0,0,52,255,4,0,0,15 + ,230,104,0,0,0,0,0,0,0,0,0,0,0,0,0,67,255,255,253,224,140,233,0,0,3,160,237, + 243,255,3,0,0,0,0,31,0,0,31,0,0,0,0,0,0,0,0,0,67,255,255,251,251,255,233,0,0, + 0,0,0,0,0,0,0,0,30,254,50,100,234,0,0,0,0,0,52,255,4,0,0,0,0,0,0,113,173,0,0, + 0,0,0,244,239,67,0,0,0,0,0,0,0,0,0,0,52,255,4,0,52,255,4,0,45,255,255,255,255 + ,56,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,47,255,12,0,61 + ,253,0,0,30,0,0,30,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,108,224, + 0,0,0,0,0,44,255,3,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0 + ,0,0,0,174,182,65,255,13,0,0,0,52,255,4,0,0,0,0,79,222,204,189,221,47,0,123, + 185,244,166,235,176,90,0,0,0,0,52,255,4,0,0,0,100,237,188,46,0,0,0,0,0,0,0,0, + 0,0,0,222,255,110,2,21,6,156,0,0,42,255,40,100,255,4,0,0,0,55,219,0,55,218,0, + 0,0,0,0,0,0,0,0,222,161,255,4,86,247,157,0,0,0,0,0,0,0,0,0,0,0,114,233,220,71 + ,0,0,0,0,0,52,255,4,0,0,0,0,0,65,191,12,0,0,0,0,0,0,107,224,0,0,0,0,0,0,0,0,0 + ,0,52,255,4,0,52,255,4,0,19,250,255,255,255,56,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,52,255,4,0,0,0,12,243,94,4,144,206,0,0,218,54,0,219,54,0,0,81, + 176,212,160,0,28,70,0,81,176,212,168,31,8,78,0,0,35,1,114,240,0,0,0,0,0,63, + 242,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,22,255, + 48,52,255,4,0,0,172,243,255,240,240,37,0,0,17,230,49,97,201,0,0,0,0,101,255, + 50,0,0,0,0,0,0,52,255,4,0,0,21,249,20,108,240,103,0,0,0,0,0,0,0,0,0,0,255,255 + ,14,0,0,0,67,0,0,5,182,234,147,248,3,0,0,85,219,47,85,212,43,0,186,244,244, + 244,244,245,252,0,255,71,255,244,232,84,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,240,240,243,255,240,240,0,0,0,56,182,13,0,0,0,0,0,42,1,116,239,0,0,0,0,0,0, + 0,0,0,0,52,255,4,0,52,255,4,0,0,105,248,255,255,56,255,0,0,0,44,220,3,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,81,176,212,168,49,0,0,0,72,213,242,195,40,0,0,44,213,85,48 + ,220,85,0,0,2,56,132,204,195,104,0,0,0,12,86,169,231,170,0,0,180,240,219,87, + 42,91,0,0,15,210,132,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,52,255,4 + ,0,0,0,0,48,255,11,52,255,4,0,0,0,52,255,4,0,0,0,0,16,229,53,101,198,0,0,168, + 240,243,255,240,240,123,0,0,0,0,0,0,0,0,0,30,254,67,0,93,244,0,0,0,0,0,0,0,0, + 0,0,255,222,111,4,17,5,67,0,0,0,0,0,0,0,0,0,0,229,109,0,229,89,0,0,0,0,0,0,0, + 52,255,0,255,71,255,9,178,76,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52, + 255,4,0,0,0,0,173,242,240,240,11,0,0,0,200,241,217,82,0,0,0,0,0,0,0,0,0,0,52, + 255,4,0,52,255,4,0,0,0,18,107,255,56,255,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,229,0,109,229,0,150,216,167,92,18,0,0 + ,0,92,177,230,162,79,8,0,0,21,98,143,151,148,110,60,0,0,186,168,2,0,0,0,0,0,0 + ,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,21,255,43,52,255,4,0,0, + 0,52,255,4,0,0,0,0,76,223,204,189,222,49,0,0,0,52,255,4,0,0,0,0,0,0,52,255,4, + 0,0,0,117,241,119,83,210,0,0,0,0,0,0,0,0,0,0,224,153,197,240,202,13,157,0,0,3 + ,240,240,240,240,11,0,0,29,207,117,29,205,112,0,0,0,0,0,0,50,248,0,224,156, + 228,3,22,188,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,11,0,62,255,4,0,0,0,0,52,255, + 56,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,240,240,240, + 172,0,0,113,205,29,118,207,29,0,49,4,0,0,146,255,4,0,130,71,5,87,225,232,129, + 0,21,53,7,0,2,174,255,0,40,255,20,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0 + ,0,0,0,52,255,4,0,0,0,0,0,175,172,59,255,8,0,0,0,52,255,4,0,0,0,0,85,25,0,0, + 46,62,0,0,0,52,255,4,0,0,0,0,0,0,52,255,4,0,0,0,0,43,182,246,51,0,0,0,0,0,0,0 + ,0,0,0,68,240,97,7,14,129,232,0,0,0,0,0,0,0,0,0,0,0,12,180,0,12,180,0,0,0,0,0 + ,0,0,0,0,68,240,97,7,14,129,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,99,3,157,255,18,0 + ,0,0,0,52,255,56,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,179,12,0,179,12,0,0,0,0,0,44,141,255,4,0,0,0,0,28,5,88,239,0,0,0, + 0,0,126,102,255,0,23,252,95,8,66,99,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0 + ,0,52,255,4,0,0,0,0,0,13,156,235,255,231,0,0,244,246,255,244,244,244,0,0,0,0, + 0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,127,213,0,0,0,0,0,0,0 + ,0,0,0,0,53,184,236,232,164,31,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,3,0,0,0,0,0,0,0, + 0,0,0,53,184,236,232,164,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,244,244, + 244,244,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,163,243, + 148,208,191,0,0,0,0,52,255,56,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,136,53,255,4,0,0,0,0,0,9,168,67, + 0,0,0,0,84,94,52,255,0,0,101,231,249,202,68,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,52,255,4,0,0,1,72,10,3,120,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,52,255,56,255,0,0,0,0,0,0,0,0,0,0,0,0 + ,33,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,243, + 255,176,0,0,0,0,28,162,38,0,0,0,0,0,174,240,243,255,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,2,188,234,241,201,61,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,23,116,25, + 116,0,0,0,0,0,0,0,0,0,0,0,0,2,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,143,245,244,244,0,0,0,0,0,0,52,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,116,199,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127 + ,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127 + ,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127 + ,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,0,0,51,90,0,0,0, + 0,0,0,0,6,119,17,0,0,0,0,4,117,84,0,0,0,0,2,196,190,20,191,0,0,0,0,0,0,0,0,0, + 0,0,0,145,237,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,44,0,0,0,0,0,0 + ,0,48,95,0,0,0,0,0,41,128,38,0,0,0,0,0,0,0,0,0,0,0,0,0,97,35,0,0,0,0,0,0,0,57 + ,85,0,0,0,0,0,46,127,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,217,181,17 + ,203,0,0,0,0,74,213,6,0,0,0,0,0,0,27,229,40,0,0,0,0,29,222,209,8,0,0,0,2,195, + 200,27,193,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,212,8, + 0,0,0,0,0,0,29,234,61,0,0,0,0,42,226,218,16,0,0,0,0,0,0,0,0,0,0,0,0,0,143,135 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,3,172,83,0,0,0,0,0,0,158,105,0 + ,0,0,0,0,154,91,157,84,0,0,0,34,144,63,189,101,0,0,0,48,240,52,240,3,0,0,0,32 + ,255,96,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,201,20,0,0,0,0,0,25, + 203,35,0,0,0,0,24,188,62,188,22,0,0,0,48,240,52,240,3,0,0,0,0,42,195,12,0,0,0 + ,0,0,29,198,25,0,0,0,0,22,184,66,185,14,0,0,0,48,240,52,240,3,0,0,0,0,0,0,0,0 + ,0,0,0,74,110,77,192,109,0,0,0,0,0,139,130,0,0,0,0,0,0,177,92,0,0,0,0,1,183, + 63,107,141,0,0,0,37,141,60,187,123,0,0,0,48,240,3,48,240,3,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,151,143,0,0,0,0,0,1,189,104,0,0,0,0,8,200,53,93,169,0,0 + ,0,48,240,3,48,240,3,0,0,0,42,192,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,20,246,100,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,20,252,200, + 0,0,0,0,0,20,252,200,0,0,0,0,0,20,252,200,0,0,0,0,0,20,252,200,0,0,0,0,0,80, + 255,32,0,0,0,0,0,62,238,30,0,0,0,0,0,196,247,255,244,244,0,0,0,96,213,244,234 + ,137,0,52,255,244,244,244,244,68,0,52,255,244,244,244,244,68,0,52,255,244,244 + ,244,244,68,0,52,255,244,244,244,236,0,0,0,244,246,255,244,244,0,0,0,244,246, + 255,244,244,0,0,0,244,246,255,244,244,0,0,0,244,246,255,244,244,0,0,52,255, + 244,239,190,68,0,0,52,255,166,0,0,52,255,0,0,15,168,241,236,141,2,0,0,15,168, + 241,236,141,2,0,0,15,168,241,236,141,2,0,0,15,168,241,236,141,2,0,0,15,168, + 241,236,141,2,0,0,0,0,0,0,0,0,0,0,13,166,240,239,148,152,0,52,255,4,0,0,52, + 255,0,52,255,4,0,0,52,255,0,52,255,4,0,0,52,255,0,52,255,4,0,0,52,255,0,220, + 112,0,0,0,161,179,0,52,255,4,0,0,0,0,0,0,100,226,247,212,58,0,0,127,0,0,98, + 207,251,26,0,0,0,0,98,207,251,26,0,0,0,0,98,207,251,26,0,0,0,0,98,207,251,26, + 0,0,0,0,160,212,112,0,0,0,0,0,91,210,42,0,0,0,0,17,242,58,255,4,0,0,0,100,223 + ,50,0,22,89,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255 + ,4,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52, + 255,4,0,0,0,52,255,4,7,81,238,66,0,52,255,242,30,0,52,255,0,0,160,175,10,24, + 213,112,0,0,160,175,10,24,213,112,0,0,160,175,10,24,213,112,0,0,160,175,10,24 + ,213,112,0,0,160,175,10,24,213,112,0,0,0,0,0,0,0,0,0,0,158,169,7,42,243,176,0 + ,52,255,4,0,0,52,255,0,52,255,4,0,0,52,255,0,52,255,4,0,0,52,255,0,52,255,4,0 + ,0,52,255,0,74,238,18,0,52,245,33,0,52,255,4,0,0,0,0,0,20,251,87,1,120,216,0, + 0,127,0,0,179,121,200,105,0,0,0,0,179,121,200,105,0,0,0,0,179,121,200,105,0,0 + ,0,0,179,121,200,105,0,0,0,3,236,97,192,0,0,0,0,0,185,107,136,0,0,0,0,86,189, + 52,255,4,0,0,0,227,84,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255, + 4,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52, + 255,4,0,0,0,0,0,52,255,4,0,0,0,52,255,4,0,0,125,186,0,52,255,150,143,0,52,255 + ,0,6,246,54,0,0,105,204,0,6,246,54,0,0,105,204,0,6,246,54,0,0,105,204,0,6,246 + ,54,0,0,105,204,0,6,246,54,0,0,105,204,0,0,123,22,0,0,66,81,0,5,246,57,0,52, + 245,208,0,52,255,4,0,0,52,255,0,52,255,4,0,0,52,255,0,52,255,4,0,0,52,255,0, + 52,255,4,0,0,52,255,0,0,176,146,0,194,127,0,0,52,255,240,240,233,177,38,0,50, + 255,8,69,180,160,0,0,127,0,12,248,51,130,186,0,0,0,12,248,51,130,186,0,0,0,12 + ,248,51,130,186,0,0,0,12,248,51,130,186,0,0,0,64,222,16,250,19,0,0,0,25,230, + 26,227,2,0,0,0,159,125,52,255,4,0,0,31,255,21,0,0,0,0,0,52,255,4,0,0,0,0,0,52 + ,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0 + ,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,52,255,4,0,0,69,240,0, + 52,255,37,239,16,52,255,0,38,255,15,0,0,64,244,0,38,255,15,0,0,64,244,0,38, + 255,15,0,0,64,244,0,38,255,15,0,0,64,244,0,38,255,15,0,0,64,244,0,0,130,214, + 25,73,235,64,0,38,255,20,12,210,108,246,0,52,255,4,0,0,52,255,0,52,255,4,0,0, + 52,255,0,52,255,4,0,0,52,255,0,52,255,4,0,0,52,255,0,0,31,241,124,221,8,0,0, + 52,255,4,0,18,164,208,0,52,255,30,251,36,0,0,0,127,0,86,235,1,59,250,16,0,0, + 86,235,1,59,250,16,0,0,86,235,1,59,250,16,0,0,86,235,1,59,250,16,0,0,144,164, + 0,213,96,0,0,0,117,182,0,230,68,0,0,1,231,61,52,255,240,240,0,48,255,6,0,0,0, + 0,0,52,255,240,240,240,240,22,0,52,255,240,240,240,240,22,0,52,255,240,240, + 240,240,22,0,52,255,240,240,240,187,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0 + ,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,239,255,240,198,0,55,255,0,52,255,4, + 169,120,52,255,0,49,255,5,0,0,54,255,0,49,255,5,0,0,54,255,0,49,255,5,0,0,54, + 255,0,49,255,5,0,0,54,255,0,49,255,5,0,0,54,255,0,0,0,124,225,235,60,0,0,49, + 255,6,160,101,53,255,0,52,255,4,0,0,52,255,0,52,255,4,0,0,52,255,0,52,255,4,0 + ,0,52,255,0,52,255,4,0,0,52,255,0,0,0,124,255,75,0,0,0,52,255,4,0,0,59,253,0, + 52,255,26,245,109,2,0,0,127,0,167,167,0,4,240,92,0,0,167,167,0,4,240,92,0,0, + 167,167,0,4,240,92,0,0,167,167,0,4,240,92,0,0,223,105,0,154,176,0,0,0,210,130 + ,0,179,162,0,0,49,246,6,52,255,4,0,0,31,255,23,0,0,0,0,0,52,255,4,0,0,0,0,0, + 52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,52,255,4,0,0,0,0 + ,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,52,255,4,0,0,69,240,0 + ,52,255,4,52,230,58,255,0,38,255,15,0,0,64,244,0,38,255,15,0,0,64,244,0,38, + 255,15,0,0,64,244,0,38,255,15,0,0,64,244,0,38,255,15,0,0,64,244,0,0,0,80,241, + 224,31,0,0,40,255,92,164,0,63,245,0,51,255,4,0,0,52,255,0,51,255,4,0,0,52,255 + ,0,51,255,4,0,0,52,255,0,51,255,4,0,0,52,255,0,0,0,52,255,4,0,0,0,52,255,4,0, + 17,161,208,0,52,255,4,47,187,209,46,0,127,7,241,250,248,248,253,173,0,7,241, + 250,248,248,253,173,0,7,241,250,248,248,253,173,0,7,241,250,248,248,253,173,0 + ,48,255,249,248,250,246,10,0,49,255,249,248,250,244,11,0,122,251,240,243,255, + 4,0,0,0,228,88,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0 + ,0,0,52,255,4,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0, + 0,0,0,0,52,255,4,0,0,0,52,255,4,0,0,126,186,0,52,255,4,0,192,149,255,0,6,247, + 54,0,0,104,204,0,6,247,54,0,0,104,204,0,6,247,54,0,0,104,204,0,6,247,54,0,0, + 104,204,0,6,247,54,0,0,104,204,0,0,87,233,51,113,224,34,0,10,253,203,12,0,100 + ,203,0,40,255,9,0,0,57,248,0,40,255,9,0,0,57,248,0,40,255,9,0,0,57,248,0,40, + 255,8,0,0,56,248,0,0,0,52,255,4,0,0,0,52,255,240,240,234,178,38,0,52,255,4,0, + 0,116,220,0,127,74,249,16,0,0,87,245,0,74,249,16,0,0,87,245,0,74,249,16,0,0, + 87,245,0,74,249,16,0,0,87,245,0,128,211,0,0,15,248,80,0,143,187,0,0,5,234,94, + 0,195,109,0,52,255,4,0,0,0,102,228,62,5,34,99,0,52,255,4,0,0,0,0,0,52,255,4,0 + ,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255, + 4,0,0,0,0,8,58,255,11,8,0,0,0,0,52,255,4,0,0,0,52,255,4,7,82,239,67,0,52,255, + 4,0,75,246,255,0,0,163,173,9,23,212,114,0,0,163,173,9,23,212,114,0,0,163,173, + 9,23,212,114,0,0,163,173,9,23,212,114,0,0,163,173,9,23,212,114,0,0,166,49,0,0 + ,108,107,0,13,237,190,15,18,206,111,0,5,232,117,10,19,158,190,0,5,232,117,10, + 19,158,190,0,5,232,117,10,19,158,190,0,5,232,107,3,9,151,190,0,0,0,52,255,4,0 + ,0,0,52,255,4,0,0,0,0,0,52,255,34,8,2,118,240,0,127,155,179,0,0,0,11,245,0, + 155,179,0,0,0,11,245,0,155,179,0,0,0,11,245,0,155,179,0,0,0,11,245,0,208,126, + 0,0,0,176,160,0,232,94,0,0,0,144,188,0,251,31,0,52,255,244,244,0,0,0,99,214, + 255,240,135,0,52,255,244,244,244,244,99,0,52,255,244,244,244,244,99,0,52,255, + 244,244,244,244,99,0,52,255,244,244,244,244,22,0,0,244,246,255,244,244,0,0,0, + 244,246,255,244,244,0,0,0,255,255,255,255,255,0,0,0,244,246,255,244,244,0,0, + 52,255,244,240,191,69,0,0,52,255,4,0,1,213,255,0,0,16,171,241,237,143,3,0,0, + 16,171,241,237,143,3,0,0,16,171,241,237,143,3,0,0,16,171,241,237,143,3,0,0,16 + ,171,241,237,143,3,0,0,0,0,0,0,0,0,0,157,99,185,245,234,140,2,0,0,51,197,249, + 244,177,28,0,0,51,197,249,244,177,28,0,0,51,197,249,244,177,28,0,0,51,197,244 + ,241,177,28,0,0,0,52,255,4,0,0,0,52,255,4,0,0,0,0,0,52,255,116,240,246,211,74 + ,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,120,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,69,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,233,241,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127,127,127 + ,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127 + ,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127 + ,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127 + ,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,226,228,110,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,8,195,125,0,0,0,0,0,0,0,0,98,212,15,0,0 + ,0,2,197,213,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,45,96,248,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,157,139,0,0,0,0,0,0,0,0,154,142,0,0,0,0,10, + 199,192,5,0,0,0,0,0,0,0,0,0,0,0,0,111,190,2,0,0,0,0,0,0,0,50,225,29,0,0,0,0, + 130,241,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,187,114,0 + ,0,0,0,0,0,0,1,161,149,1,0,0,0,24,211,193,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,217,9,0,0,0,0,0,0,0,44,223,23,0,0,0,0 + ,88,244,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,0,18,213,67,0,0,0,0,0,0,46,220,30,0,0,0,0,115,148,123,138,0,0,0, + 14,196,237,203,189,27,0,0,0,240,3,49,244,3,0,0,0,105,226,228,110,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,155,105,0,0,0,0,0,0,121,140,0,0,0,0,0,158,74,90 + ,145,0,0,0,0,240,3,49,244,3,0,0,0,0,158,122,0,0,0,0,0,0,12,210,56,0,0,0,0,38, + 200,77,175,0,0,0,49,244,53,244,3,0,0,0,3,138,202,114,121,12,0,0,86,232,214, + 194,37,0,0,0,0,7,172,97,0,0,0,0,0,0,144,133,0,0,0,0,6,185,54,92,153,0,0,0,25, + 206,234,199,174,3,0,0,49,244,3,49,244,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,123,138,0,0,0,0,0,0,2,195,59,0,0,0,0,11,204,78,171,0,0,0,0,49,244,53,244,3,0 + ,0,0,0,0,51,205,26,0,0,52,255,4,0,0,0,0,0,0,49,244,53,244,3,0,0,127,0,0,0,32, + 105,0,0,0,0,0,0,91,46,0,0,0,0,2,113,7,1,111,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,117,7,0,0,0,0,0,57,72,0,0,0,0,0 + ,74,38,0,93,20,0,0,0,0,0,0,0,0,0,0,51,110,93,212,36,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,1,109,6,0,0,0,0,0,35,80,0,0,0,0,0,49,64,0, + 96,15,0,0,0,0,0,0,0,0,0,0,0,0,0,103,25,0,0,0,52,255,4,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,127,0,103,213,244,239,180,36,0,0,103,213,244,240,180,36,0,0,103,213,244, + 239,180,36,0,0,103,213,244,239,180,36,0,0,103,213,244,239,180,36,0,0,103,213, + 244,239,180,36,0,0,132,239,226,131,234,236,0,0,12,151,233,244,202,40,0,0,13, + 156,236,241,165,12,0,0,13,156,236,241,165,12,0,0,13,156,236,241,165,12,0,0,13 + ,156,235,241,165,12,0,0,0,244,246,255,4,0,0,0,0,244,246,255,4,0,0,0,0,244,246 + ,255,4,0,0,0,148,244,255,4,0,0,0,0,25,178,243,251,214,9,0,52,255,111,233,235, + 80,0,0,0,29,182,242,237,157,11,0,0,29,182,242,237,157,11,0,0,29,182,242,237, + 157,11,0,0,29,182,242,237,157,11,0,0,29,182,242,237,157,11,0,0,0,0,49,244,3,0 + ,0,0,29,181,242,238,160,192,0,52,255,4,0,52,255,4,0,52,255,4,0,52,255,4,0,52, + 255,4,0,52,255,4,0,52,255,4,0,52,255,4,0,40,250,19,0,0,50,245,0,52,255,121, + 231,241,161,10,0,93,212,0,0,0,221,87,0,127,0,93,52,2,9,162,204,0,0,93,52,2,10 + ,165,204,0,0,93,52,2,9,162,204,0,0,93,52,2,9,162,204,0,0,93,52,2,9,162,204,0, + 0,93,52,2,9,159,204,0,0,48,4,120,255,57,104,0,0,174,188,24,0,53,43,0,0,173, + 187,16,11,178,153,0,0,173,187,16,11,178,153,0,0,173,186,16,11,179,152,0,0,173 + ,177,14,11,179,152,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0 + ,0,0,0,252,4,0,0,0,0,192,167,11,4,181,123,0,52,255,121,2,133,219,0,0,0,198, + 158,8,19,198,149,0,0,198,158,8,19,198,149,0,0,198,158,8,19,198,149,0,0,198, + 158,8,19,198,149,0,0,198,158,8,19,198,149,0,0,0,0,0,0,0,0,0,0,198,161,9,24, + 239,165,0,52,255,4,0,52,255,4,0,52,255,4,0,52,255,4,0,52,255,4,0,52,255,4,0, + 52,255,4,0,52,255,4,0,0,200,106,0,0,142,163,0,52,255,163,9,19,198,145,0,11, + 244,36,0,48,244,10,0,127,0,0,0,0,0,61,252,0,0,0,0,0,0,62,252,0,0,0,0,0,0,61, + 252,0,0,0,0,0,0,61,252,0,0,0,0,0,0,61,252,0,0,0,0,0,0,57,252,0,0,0,0,55,255,6 + ,54,0,22,255,41,0,0,0,0,0,21,255,50,0,0,67,236,0,21,255,50,0,0,67,236,0,21, + 255,49,0,0,70,236,0,21,255,37,0,0,70,236,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4, + 0,0,0,0,0,52,255,4,0,0,0,0,0,252,4,0,0,0,25,255,35,0,0,86,217,0,52,255,18,0, + 56,254,1,0,27,255,32,0,0,81,234,0,27,255,32,0,0,81,234,0,27,255,32,0,0,81,234 + ,0,27,255,32,0,0,81,234,0,27,255,32,0,0,81,234,0,0,240,240,240,240,240,240,0, + 27,255,31,2,168,165,235,0,52,255,4,0,52,255,4,0,52,255,4,0,52,255,4,0,52,255, + 4,0,52,255,4,0,52,255,4,0,52,255,4,0,0,103,199,0,3,230,67,0,52,255,33,0,0,81, + 232,0,0,162,117,0,130,165,0,0,127,0,78,197,237,240,243,255,0,0,71,189,224,224 + ,230,255,0,0,78,197,237,240,243,255,0,0,78,197,237,240,243,255,0,0,78,197,237 + ,240,243,255,0,0,78,197,237,240,243,255,0,0,125,231,244,255,240,241,0,50,255, + 7,0,0,0,0,0,47,255,225,224,224,227,239,0,47,255,225,224,224,227,239,0,47,255, + 240,240,240,241,247,0,47,255,240,240,240,241,247,0,0,0,0,52,255,4,0,0,0,0,0, + 52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,252,4,0,0,0,48,255,7,0,0,56,254,0,52, + 255,4,0,52,255,4,0,48,255,6,0,0,55,254,0,48,255,6,0,0,55,254,0,48,255,6,0,0, + 55,254,0,48,255,6,0,0,55,254,0,48,255,6,0,0,55,254,0,0,0,0,0,0,0,0,0,48,255,7 + ,152,111,54,255,0,52,255,4,0,52,255,4,0,52,255,4,0,52,255,4,0,52,255,4,0,52, + 255,4,0,52,255,4,0,52,255,4,0,0,15,246,36,70,225,1,0,52,255,6,0,0,55,254,0,0, + 68,197,0,212,76,0,0,127,24,251,95,6,0,62,255,0,23,250,82,2,0,65,255,0,24,251, + 86,5,0,65,255,0,24,251,86,5,0,65,255,0,24,251,86,5,0,65,255,0,24,251,86,5,0, + 65,255,0,32,255,57,53,255,8,0,0,22,255,41,0,0,0,0,0,22,255,23,0,0,0,0,0,22, + 255,23,0,0,0,0,0,22,255,21,0,0,0,0,0,22,255,21,0,0,0,0,0,0,0,0,52,255,4,0,0,0 + ,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,252,4,0,0,0,25,255,34,0,0,83,238,0 + ,52,255,4,0,52,255,4,0,27,255,32,0,0,81,234,0,27,255,32,0,0,81,234,0,27,255, + 32,0,0,81,234,0,27,255,32,0,0,81,234,0,27,255,32,0,0,81,234,0,0,0,0,48,240,3, + 0,0,27,255,165,129,0,81,234,0,48,255,8,0,66,255,4,0,48,255,8,0,66,255,4,0,48, + 255,8,0,66,255,4,0,48,255,8,0,66,255,4,0,0,0,166,128,162,131,0,0,52,255,32,0, + 0,80,233,0,0,2,226,62,238,5,0,0,127,33,255,38,0,4,170,255,0,33,255,69,0,26, + 189,255,0,33,255,68,0,26,189,255,0,33,255,68,0,26,189,255,0,33,255,68,0,26, + 189,255,0,33,255,68,0,26,189,255,0,38,255,39,95,255,76,1,0,0,177,185,23,0,50, + 42,0,0,176,165,17,0,32,76,0,0,176,165,17,0,32,76,0,0,176,162,17,0,32,76,0,0, + 176,162,17,0,29,79,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0,0,0,0,52,255,4,0,0 + ,0,0,0,252,4,0,0,0,0,194,163,8,21,202,156,0,52,255,4,0,52,255,4,0,0,200,158,7 + ,19,198,151,0,0,200,158,7,19,198,151,0,0,200,158,7,19,198,151,0,0,200,158,7, + 19,198,151,0,0,200,158,7,19,198,151,0,0,0,0,0,0,0,0,0,0,216,210,7,19,198,151, + 0,15,251,62,0,147,255,4,0,15,251,62,0,147,255,4,0,15,251,62,0,147,255,4,0,15, + 251,62,0,147,255,4,0,0,0,70,222,242,36,0,0,52,255,160,8,17,195,146,0,0,0,137, + 215,157,0,0,0,127,0,114,219,196,189,127,255,0,0,114,231,243,204,107,255,0,0, + 114,231,243,204,108,255,0,0,114,231,243,204,108,255,0,0,114,231,243,204,108, + 255,0,0,113,230,243,205,106,255,0,0,154,245,215,95,224,242,0,0,14,153,237,255 + ,207,42,0,0,14,155,234,244,218,111,0,0,14,155,234,244,218,111,0,0,14,155,234, + 244,218,111,0,0,14,153,233,244,220,120,0,0,118,244,246,255,244,244,0,0,108, + 224,230,255,224,224,0,0,108,224,230,255,224,224,0,22,244,244,255,244,244,34,0 + ,0,27,180,242,238,161,13,0,52,255,4,0,52,255,4,0,0,31,184,243,238,160,12,0,0, + 31,184,243,238,160,12,0,0,31,184,243,238,160,12,0,0,31,184,243,238,160,12,0,0 + ,31,184,243,238,160,12,0,0,0,0,0,0,0,0,0,95,164,178,242,238,160,12,0,0,120, + 234,191,137,255,4,0,0,120,234,191,137,255,4,0,0,120,234,191,137,255,4,0,0,120 + ,234,191,137,255,4,0,0,0,2,227,198,0,0,0,52,255,120,232,241,160,10,0,0,0,43, + 255,72,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,187,14,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,40,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,105,0,0,0,52,255,4,0,0,0,0,0,0,0,18,232,4,0, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,1,167,67,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,64,244,16,0,0,0,52,255,4,0,0,0,0,0,0,0,132,148,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,242,213,19,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,203,237,92,0,0,0,0,52,255,4,0,0,0,0,0,11,243,209,25,0,0,0,0,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127 + ,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127 + ,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127 + ,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127 + ,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127 + ,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0 +}; + + +void TwGenerateDefaultFonts(float _Scaling) +{ + g_DefaultSmallFont = TwGenerateFont(s_Font0, FONT0_BM_W, FONT0_BM_H, _Scaling); + assert(g_DefaultSmallFont && g_DefaultSmallFont->m_NbCharRead==224); + g_DefaultNormalFont = TwGenerateFont(s_Font1AA, FONT1AA_BM_W, FONT1AA_BM_H, _Scaling); + assert(g_DefaultNormalFont && g_DefaultNormalFont->m_NbCharRead==224); + g_DefaultLargeFont = TwGenerateFont(s_Font2AA, FONT2AA_BM_W, FONT2AA_BM_H, _Scaling); + assert(g_DefaultLargeFont && g_DefaultLargeFont->m_NbCharRead==224); + g_DefaultFixed1Font = TwGenerateFont(s_FontFixed1, FONTFIXED1_BM_W, FONTFIXED1_BM_H, _Scaling); + assert(g_DefaultFixed1Font && g_DefaultFixed1Font->m_NbCharRead==224); +} + +// --------------------------------------------------------------------------- + +void TwDeleteDefaultFonts() +{ + delete g_DefaultSmallFont; + g_DefaultSmallFont = NULL; + delete g_DefaultNormalFont; + g_DefaultNormalFont = NULL; + delete g_DefaultLargeFont; + g_DefaultLargeFont = NULL; + delete g_DefaultFixed1Font; + g_DefaultFixed1Font = NULL; +} + +// --------------------------------------------------------------------------- diff --git a/AntTweakBar/src/TwFonts.h b/AntTweakBar/src/TwFonts.h new file mode 100644 index 0000000..6653646 --- /dev/null +++ b/AntTweakBar/src/TwFonts.h @@ -0,0 +1,67 @@ +// --------------------------------------------------------------------------- +// +// @file TwFonts.h +// @brief Bitmaps fonts +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_FONTS_INCLUDED +#define ANT_TW_FONTS_INCLUDED + +//#include + +/* +A source bitmap includes 224 characters starting from ascii char 32 (i.e. space) +to ascii char 255 (extended ASCII Latin1/CP1252): + + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ + + + + + +First pixel column of a source bitmap is a delimiter with color=zero at the end of each line of characters. +Last pixel row of a line of characters is a delimiter with color=zero at the last pixel of each character. + +*/ + + +struct CTexFont +{ + unsigned char * m_TexBytes; + int m_TexWidth; // power of 2 + int m_TexHeight; // power of 2 + float m_CharU0[256]; + float m_CharV0[256]; + float m_CharU1[256]; + float m_CharV1[256]; + int m_CharWidth[256]; + int m_CharHeight; + int m_NbCharRead; + + CTexFont(); + ~CTexFont(); +}; + + +CTexFont *TwGenerateFont(const unsigned char *_Bitmap, int _BmWidth, int _BmHeight, float _Scaling=1.0f); + + +extern CTexFont *g_DefaultSmallFont; +extern CTexFont *g_DefaultNormalFont; +extern CTexFont *g_DefaultLargeFont; +extern CTexFont *g_DefaultFixed1Font; + +void TwGenerateDefaultFonts(float _Scaling=1.0f); +void TwDeleteDefaultFonts(); + + +#endif // !defined ANT_TW_FONTS_INCLUDED diff --git a/AntTweakBar/src/TwGraph.h b/AntTweakBar/src/TwGraph.h new file mode 100644 index 0000000..a8d0ac4 --- /dev/null +++ b/AntTweakBar/src/TwGraph.h @@ -0,0 +1,58 @@ +// --------------------------------------------------------------------------- +// +// @file TwGraph.h +// @brief ITwGraph pure interface +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_GRAPH_INCLUDED +#define ANT_TW_GRAPH_INCLUDED + +#include "TwColors.h" +#include "TwFonts.h" + + +// --------------------------------------------------------------------------- + +#ifdef DrawText // DirectX redefines 'DrawText' !! +# undef DrawText +#endif // DrawText + +class ITwGraph +{ +public: + virtual int Init() = 0; + virtual int Shut() = 0; + virtual void BeginDraw(int _WndWidth, int _WndHeight) = 0; + virtual void EndDraw() = 0; + virtual bool IsDrawing() = 0; + virtual void Restore() = 0; + + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false) = 0; + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) = 0; + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) = 0; + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) = 0; + enum Cull { CULL_NONE, CULL_CW, CULL_CCW }; + virtual void DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode) = 0; + + virtual void * NewTextObj() = 0; + virtual void DeleteTextObj(void *_TextObj) = 0; + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) = 0; + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) = 0; + + virtual void ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY) = 0; + virtual void RestoreViewport() = 0; + virtual void SetScissor(int _X0, int _Y0, int _Width, int _Height) = 0; + + virtual ~ITwGraph() {} // required by gcc +}; + +// --------------------------------------------------------------------------- + +#endif // ANT_TW_GRAPH_INCLUDED diff --git a/AntTweakBar/src/TwMgr.cpp b/AntTweakBar/src/TwMgr.cpp new file mode 100644 index 0000000..adaa82a --- /dev/null +++ b/AntTweakBar/src/TwMgr.cpp @@ -0,0 +1,6753 @@ +// --------------------------------------------------------------------------- +// +// @file TwMgr.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include +#include "TwMgr.h" +#include "TwBar.h" +#include "TwFonts.h" +#include "TwOpenGL.h" +#include "TwOpenGLCore.h" +#ifdef ANT_WINDOWS +# include "TwDirect3D9.h" +# include "TwDirect3D10.h" +# include "TwDirect3D11.h" +# include "resource.h" +# ifdef _DEBUG +# include +# endif // _DEBUG +#endif // ANT_WINDOWS + +#if !defined(ANT_WINDOWS) +# define _snprintf snprintf +#endif // defined(ANT_WINDOWS) + + +using namespace std; + +CTwMgr *g_TwMgr = NULL; // current TwMgr +bool g_BreakOnError = false; +TwErrorHandler g_ErrorHandler = NULL; +int g_TabLength = 4; +CTwBar * const TW_GLOBAL_BAR = (CTwBar *)(-1); +int g_InitWndWidth = -1; +int g_InitWndHeight = -1; +TwCopyCDStringToClient g_InitCopyCDStringToClient = NULL; +TwCopyStdStringToClient g_InitCopyStdStringToClient = NULL; +float g_FontScaling = 1.0f; + +// multi-windows +const int TW_MASTER_WINDOW_ID = 0; +typedef map CTwWndMap; +CTwWndMap g_Wnds; +CTwMgr *g_TwMasterMgr = NULL; + +// error messages +extern const char *g_ErrUnknownAttrib; +extern const char *g_ErrNoValue; +extern const char *g_ErrBadValue; +const char *g_ErrInit = "Already initialized"; +const char *g_ErrShut = "Already shutdown"; +const char *g_ErrNotInit = "Not initialized"; +const char *g_ErrUnknownAPI = "Unsupported graph API"; +const char *g_ErrBadDevice = "Invalid graph device"; +const char *g_ErrBadParam = "Invalid parameter"; +const char *g_ErrExist = "Exists already"; +const char *g_ErrNotFound = "Not found"; +const char *g_ErrNthToDo = "Nothing to do"; +const char *g_ErrBadSize = "Bad size"; +const char *g_ErrIsDrawing = "Asynchronous drawing detected"; +const char *g_ErrIsProcessing="Asynchronous processing detected"; +const char *g_ErrOffset = "Offset larger than StructSize"; +const char *g_ErrDelStruct = "Cannot delete a struct member"; +const char *g_ErrNoBackQuote= "Name cannot include back-quote"; +const char *g_ErrStdString = "Debug/Release std::string mismatch"; +const char *g_ErrCStrParam = "Value count for TW_PARAM_CSTRING must be 1"; +const char *g_ErrOutOfRange = "Index out of range"; +const char *g_ErrHasNoValue = "Has no value"; +const char *g_ErrBadType = "Incompatible type"; +const char *g_ErrDelHelp = "Cannot delete help bar"; +char g_ErrParse[512]; + +void ANT_CALL TwGlobalError(const char *_ErrorMessage); + +#if defined(ANT_UNIX) || defined(ANT_OSX) +#define _stricmp strcasecmp +#define _strdup strdup +#endif + +#ifdef ANT_WINDOWS + bool g_UseCurRsc = true; // use dll resources for rotoslider cursors +#endif + +// --------------------------------------------------------------------------- + +const float FLOAT_EPS = 1.0e-7f; +const float FLOAT_EPS_SQ = 1.0e-14f; +const float FLOAT_PI = 3.14159265358979323846f; +const double DOUBLE_EPS = 1.0e-14; +const double DOUBLE_EPS_SQ = 1.0e-28; +const double DOUBLE_PI = 3.14159265358979323846; + +inline double DegToRad(double degree) { return degree * (DOUBLE_PI/180.0); } +inline double RadToDeg(double radian) { return radian * (180.0/DOUBLE_PI); } + +// --------------------------------------------------------------------------- + +// a static global object to verify that Tweakbar module has been properly terminated (in debug mode only) +#ifdef _DEBUG +static struct CTwVerif +{ + ~CTwVerif() + { + if( g_TwMgr!=NULL ) + g_TwMgr->SetLastError("Tweak bar module has not been terminated properly: call TwTerminate()\n"); + } +} s_Verif; +#endif // _DEBUG + +// --------------------------------------------------------------------------- +// Color ext type +// --------------------------------------------------------------------------- + +void CColorExt::RGB2HLS() +{ + float fH = 0, fL = 0, fS = 0; + ColorRGBToHLSf((float)R/255.0f, (float)G/255.0f, (float)B/255.0f, &fH, &fL, &fS); + H = (int)fH; + if( H>=360 ) + H -= 360; + else if( H<0 ) + H += 360; + L = (int)(255.0f*fL + 0.5f); + if( L<0 ) + L = 0; + else if( L>255 ) + L = 255; + S = (int)(255.0f*fS + 0.5f); + if( S<0 ) + S = 0; + else if( S>255 ) + S = 255; +} + +void CColorExt::HLS2RGB() +{ + float fR = 0, fG = 0, fB = 0; + ColorHLSToRGBf((float)H, (float)L/255.0f, (float)S/255.0f, &fR, &fG, &fB); + R = (int)(255.0f*fR + 0.5f); + if( R<0 ) + R = 0; + else if( R>255 ) + R = 255; + G = (int)(255.0f*fG + 0.5f); + if( G<0 ) + G = 0; + else if( G>255 ) + G = 255; + B = (int)(255.0f*fB + 0.5f); + if( B<0 ) + B = 0; + else if( B>255 ) + B = 255; +} + +void ANT_CALL CColorExt::InitColor32CB(void *_ExtValue, void *_ClientData) +{ + CColorExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->m_IsColorF = false; + ext->R = 0; + ext->G = 0; + ext->B = 0; + ext->H = 0; + ext->L = 0; + ext->S = 0; + ext->A = 255; + ext->m_HLS = false; + ext->m_HasAlpha = false; + ext->m_CanHaveAlpha = true; + if( g_TwMgr && g_TwMgr->m_GraphAPI==TW_DIRECT3D9 ) // D3D10 now use OGL rgba order! + ext->m_OGL = false; + else + ext->m_OGL = true; + ext->m_PrevConvertedColor = Color32FromARGBi(ext->A, ext->R, ext->G, ext->B); + ext->m_StructProxy = (CTwMgr::CStructProxy *)_ClientData; + } +} + +void ANT_CALL CColorExt::InitColor3FCB(void *_ExtValue, void *_ClientData) +{ + InitColor32CB(_ExtValue, _ClientData); + CColorExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->m_IsColorF = true; + ext->m_HasAlpha = false; + ext->m_CanHaveAlpha = false; + } +} + +void ANT_CALL CColorExt::InitColor4FCB(void *_ExtValue, void *_ClientData) +{ + InitColor32CB(_ExtValue, _ClientData); + CColorExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->m_IsColorF = true; + ext->m_HasAlpha = true; + ext->m_CanHaveAlpha = true; + } +} + +void ANT_CALL CColorExt::CopyVarFromExtCB(void *_VarValue, const void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData) +{ + unsigned int *var32 = static_cast(_VarValue); + float *varF = static_cast(_VarValue); + CColorExt *ext = (CColorExt *)(_ExtValue); + CTwMgr::CMemberProxy *mProxy = static_cast(_ClientData); + if( _VarValue && ext ) + { + if( ext->m_HasAlpha && mProxy && mProxy->m_StructProxy && mProxy->m_StructProxy->m_Type==g_TwMgr->m_TypeColor3F ) + ext->m_HasAlpha = false; + + // Synchronize HLS and RGB + if( _ExtMemberIndex>=0 && _ExtMemberIndex<=2 ) + ext->RGB2HLS(); + else if( _ExtMemberIndex>=3 && _ExtMemberIndex<=5 ) + ext->HLS2RGB(); + else if( mProxy && _ExtMemberIndex==7 && mProxy->m_VarParent ) + { + assert( mProxy->m_VarParent->m_Vars.size()==8 ); + if( mProxy->m_VarParent->m_Vars[0]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[1]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[2]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[3]->m_Visible != ext->m_HLS + || mProxy->m_VarParent->m_Vars[4]->m_Visible != ext->m_HLS + || mProxy->m_VarParent->m_Vars[5]->m_Visible != ext->m_HLS ) + { + mProxy->m_VarParent->m_Vars[0]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[1]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[2]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[3]->m_Visible = ext->m_HLS; + mProxy->m_VarParent->m_Vars[4]->m_Visible = ext->m_HLS; + mProxy->m_VarParent->m_Vars[5]->m_Visible = ext->m_HLS; + mProxy->m_Bar->NotUpToDate(); + } + if( mProxy->m_VarParent->m_Vars[6]->m_Visible != ext->m_HasAlpha ) + { + mProxy->m_VarParent->m_Vars[6]->m_Visible = ext->m_HasAlpha; + mProxy->m_Bar->NotUpToDate(); + } + if( static_cast(mProxy->m_VarParent->m_Vars[7])->m_ReadOnly ) + { + static_cast(mProxy->m_VarParent->m_Vars[7])->m_ReadOnly = false; + mProxy->m_Bar->NotUpToDate(); + } + } + // Convert to color32 + color32 col = Color32FromARGBi((ext->m_HasAlpha ? ext->A : 255), ext->R, ext->G, ext->B); + if( ext->m_OGL && !ext->m_IsColorF ) + col = (col&0xff00ff00) | (unsigned char)(col>>16) | (((unsigned char)(col))<<16); + if( ext->m_IsColorF ) + Color32ToARGBf(col, (ext->m_HasAlpha ? varF+3 : NULL), varF+0, varF+1, varF+2); + else + { + if( ext->m_HasAlpha ) + *var32 = col; + else + *var32 = ((*var32)&0xff000000) | (col&0x00ffffff); + } + ext->m_PrevConvertedColor = col; + } +} + +void ANT_CALL CColorExt::CopyVarToExtCB(const void *_VarValue, void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData) +{ + const unsigned int *var32 = static_cast(_VarValue); + const float *varF = static_cast(_VarValue); + CColorExt *ext = static_cast(_ExtValue); + CTwMgr::CMemberProxy *mProxy = static_cast(_ClientData); + if( _VarValue && ext ) + { + if( ext->m_HasAlpha && mProxy && mProxy->m_StructProxy && mProxy->m_StructProxy->m_Type==g_TwMgr->m_TypeColor3F ) + ext->m_HasAlpha = false; + + if( mProxy && _ExtMemberIndex==7 && mProxy->m_VarParent ) + { + assert( mProxy->m_VarParent->m_Vars.size()==8 ); + if( mProxy->m_VarParent->m_Vars[0]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[1]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[2]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[3]->m_Visible != ext->m_HLS + || mProxy->m_VarParent->m_Vars[4]->m_Visible != ext->m_HLS + || mProxy->m_VarParent->m_Vars[5]->m_Visible != ext->m_HLS ) + { + mProxy->m_VarParent->m_Vars[0]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[1]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[2]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[3]->m_Visible = ext->m_HLS; + mProxy->m_VarParent->m_Vars[4]->m_Visible = ext->m_HLS; + mProxy->m_VarParent->m_Vars[5]->m_Visible = ext->m_HLS; + mProxy->m_Bar->NotUpToDate(); + } + if( mProxy->m_VarParent->m_Vars[6]->m_Visible != ext->m_HasAlpha ) + { + mProxy->m_VarParent->m_Vars[6]->m_Visible = ext->m_HasAlpha; + mProxy->m_Bar->NotUpToDate(); + } + if( static_cast(mProxy->m_VarParent->m_Vars[7])->m_ReadOnly ) + { + static_cast(mProxy->m_VarParent->m_Vars[7])->m_ReadOnly = false; + mProxy->m_Bar->NotUpToDate(); + } + } + color32 col; + if( ext->m_IsColorF ) + col = Color32FromARGBf((ext->m_HasAlpha ? varF[3] : 1), varF[0], varF[1], varF[2]); + else + col = *var32; + if( ext->m_OGL && !ext->m_IsColorF ) + col = (col&0xff00ff00) | (unsigned char)(col>>16) | (((unsigned char)(col))<<16); + Color32ToARGBi(col, (ext->m_HasAlpha ? &ext->A : NULL), &ext->R, &ext->G, &ext->B); + if( (col & 0x00ffffff)!=(ext->m_PrevConvertedColor & 0x00ffffff) ) + ext->RGB2HLS(); + ext->m_PrevConvertedColor = col; + } +} + +void ANT_CALL CColorExt::SummaryCB(char *_SummaryString, size_t /*_SummaryMaxLength*/, const void *_ExtValue, void * /*_ClientData*/) +{ + // copy var + CColorExt *ext = (CColorExt *)(_ExtValue); + if( ext && ext->m_StructProxy && ext->m_StructProxy->m_StructData ) + { + if( ext->m_StructProxy->m_StructGetCallback ) + ext->m_StructProxy->m_StructGetCallback(ext->m_StructProxy->m_StructData, ext->m_StructProxy->m_StructClientData); + //if( *(unsigned int *)(ext->m_StructProxy->m_StructData)!=ext->m_PrevConvertedColor ) + CopyVarToExtCB(ext->m_StructProxy->m_StructData, ext, 99, NULL); + } + + //unsigned int col = 0; + //CopyVar32FromExtCB(&col, _ExtValue, 99, _ClientData); + //_snprintf(_SummaryString, _SummaryMaxLength, "0x%.8X", col); + //(void) _SummaryMaxLength, _ExtValue, _ClientData; + _SummaryString[0] = ' '; // required to force background color for this value + _SummaryString[1] = '\0'; +} + +void CColorExt::CreateTypes() +{ + if( g_TwMgr==NULL ) + return; + TwStructMember ColorExtMembers[] = { { "Red", TW_TYPE_INT32, offsetof(CColorExt, R), "min=0 max=255" }, + { "Green", TW_TYPE_INT32, offsetof(CColorExt, G), "min=0 max=255" }, + { "Blue", TW_TYPE_INT32, offsetof(CColorExt, B), "min=0 max=255" }, + { "Hue", TW_TYPE_INT32, offsetof(CColorExt, H), "hide min=0 max=359" }, + { "Lightness", TW_TYPE_INT32, offsetof(CColorExt, L), "hide min=0 max=255" }, + { "Saturation", TW_TYPE_INT32, offsetof(CColorExt, S), "hide min=0 max=255" }, + { "Alpha", TW_TYPE_INT32, offsetof(CColorExt, A), "hide min=0 max=255" }, + { "Mode", TW_TYPE_BOOLCPP, offsetof(CColorExt, m_HLS), "true='HLS' false='RGB' readwrite" } }; + g_TwMgr->m_TypeColor32 = TwDefineStructExt("COLOR32", ColorExtMembers, 8, sizeof(unsigned int), sizeof(CColorExt), CColorExt::InitColor32CB, CColorExt::CopyVarFromExtCB, CColorExt::CopyVarToExtCB, CColorExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData, "A 32-bit-encoded color."); + g_TwMgr->m_TypeColor3F = TwDefineStructExt("COLOR3F", ColorExtMembers, 8, 3*sizeof(float), sizeof(CColorExt), CColorExt::InitColor3FCB, CColorExt::CopyVarFromExtCB, CColorExt::CopyVarToExtCB, CColorExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData, "A 3-floats-encoded RGB color."); + g_TwMgr->m_TypeColor4F = TwDefineStructExt("COLOR4F", ColorExtMembers, 8, 4*sizeof(float), sizeof(CColorExt), CColorExt::InitColor4FCB, CColorExt::CopyVarFromExtCB, CColorExt::CopyVarToExtCB, CColorExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData, "A 4-floats-encoded RGBA color."); + // Do not name them "TW_COLOR*" because the name is displayed in the help bar. +} + +// --------------------------------------------------------------------------- +// Quaternion ext type +// --------------------------------------------------------------------------- + +void ANT_CALL CQuaternionExt::InitQuat4FCB(void *_ExtValue, void *_ClientData) +{ + CQuaternionExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->Qx = ext->Qy = ext->Qz = 0; + ext->Qs = 1; + ext->Vx = 1; + ext->Vy = ext->Vz = 0; + ext->Angle = 0; + ext->Dx = ext->Dy = ext->Dz = 0; + ext->m_AAMode = false; // Axis & angle mode hidden + ext->m_ShowVal = false; + ext->m_IsFloat = true; + ext->m_IsDir = false; + ext->m_Dir[0] = ext->m_Dir[1] = ext->m_Dir[2] = 0; + ext->m_DirColor = 0xffffff00; + int i, j; + for(i=0; i<3; ++i) + for(j=0; j<3; ++j) + ext->m_Permute[i][j] = (i==j) ? 1.0f : 0.0f; + ext->m_StructProxy = (CTwMgr::CStructProxy *)_ClientData; + ext->ConvertToAxisAngle(); + ext->m_Highlighted = false; + ext->m_Rotating = false; + if( ext->m_StructProxy!=NULL ) + { + ext->m_StructProxy->m_CustomDrawCallback = CQuaternionExt::DrawCB; + ext->m_StructProxy->m_CustomMouseButtonCallback = CQuaternionExt::MouseButtonCB; + ext->m_StructProxy->m_CustomMouseMotionCallback = CQuaternionExt::MouseMotionCB; + ext->m_StructProxy->m_CustomMouseLeaveCallback = CQuaternionExt::MouseLeaveCB; + } + } +} + +void ANT_CALL CQuaternionExt::InitQuat4DCB(void *_ExtValue, void *_ClientData) +{ + CQuaternionExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->Qx = ext->Qy = ext->Qz = 0; + ext->Qs = 1; + ext->Vx = 1; + ext->Vy = ext->Vz = 0; + ext->Angle = 0; + ext->Dx = ext->Dy = ext->Dz = 0; + ext->m_AAMode = false; // Axis & angle mode hidden + ext->m_ShowVal = false; + ext->m_IsFloat = false; + ext->m_IsDir = false; + ext->m_Dir[0] = ext->m_Dir[1] = ext->m_Dir[2] = 0; + ext->m_DirColor = 0xffffff00; + int i, j; + for(i=0; i<3; ++i) + for(j=0; j<3; ++j) + ext->m_Permute[i][j] = (i==j) ? 1.0f : 0.0f; + ext->m_StructProxy = (CTwMgr::CStructProxy *)_ClientData; + ext->ConvertToAxisAngle(); + ext->m_Highlighted = false; + ext->m_Rotating = false; + if( ext->m_StructProxy!=NULL ) + { + ext->m_StructProxy->m_CustomDrawCallback = CQuaternionExt::DrawCB; + ext->m_StructProxy->m_CustomMouseButtonCallback = CQuaternionExt::MouseButtonCB; + ext->m_StructProxy->m_CustomMouseMotionCallback = CQuaternionExt::MouseMotionCB; + ext->m_StructProxy->m_CustomMouseLeaveCallback = CQuaternionExt::MouseLeaveCB; + } + } +} + +void ANT_CALL CQuaternionExt::InitDir3FCB(void *_ExtValue, void *_ClientData) +{ + CQuaternionExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->Qx = ext->Qy = ext->Qz = 0; + ext->Qs = 1; + ext->Vx = 1; + ext->Vy = ext->Vz = 0; + ext->Angle = 0; + ext->Dx = 1; + ext->Dy = ext->Dz = 0; + ext->m_AAMode = false; // Axis & angle mode hidden + ext->m_ShowVal = true; + ext->m_IsFloat = true; + ext->m_IsDir = true; + ext->m_Dir[0] = ext->m_Dir[1] = ext->m_Dir[2] = 0; + ext->m_DirColor = 0xffffff00; + int i, j; + for(i=0; i<3; ++i) + for(j=0; j<3; ++j) + ext->m_Permute[i][j] = (i==j) ? 1.0f : 0.0f; + ext->m_StructProxy = (CTwMgr::CStructProxy *)_ClientData; + ext->ConvertToAxisAngle(); + ext->m_Highlighted = false; + ext->m_Rotating = false; + if( ext->m_StructProxy!=NULL ) + { + ext->m_StructProxy->m_CustomDrawCallback = CQuaternionExt::DrawCB; + ext->m_StructProxy->m_CustomMouseButtonCallback = CQuaternionExt::MouseButtonCB; + ext->m_StructProxy->m_CustomMouseMotionCallback = CQuaternionExt::MouseMotionCB; + ext->m_StructProxy->m_CustomMouseLeaveCallback = CQuaternionExt::MouseLeaveCB; + } + } +} + +void ANT_CALL CQuaternionExt::InitDir3DCB(void *_ExtValue, void *_ClientData) +{ + CQuaternionExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->Qx = ext->Qy = ext->Qz = 0; + ext->Qs = 1; + ext->Vx = 1; + ext->Vy = ext->Vz = 0; + ext->Angle = 0; + ext->Dx = 1; + ext->Dy = ext->Dz = 0; + ext->m_AAMode = false; // Axis & angle mode hidden + ext->m_ShowVal = true; + ext->m_IsFloat = false; + ext->m_IsDir = true; + ext->m_Dir[0] = ext->m_Dir[1] = ext->m_Dir[2] = 0; + ext->m_DirColor = 0xffffff00; + int i, j; + for(i=0; i<3; ++i) + for(j=0; j<3; ++j) + ext->m_Permute[i][j] = (i==j) ? 1.0f : 0.0f; + ext->m_StructProxy = (CTwMgr::CStructProxy *)_ClientData; + ext->ConvertToAxisAngle(); + ext->m_Highlighted = false; + ext->m_Rotating = false; + if( ext->m_StructProxy!=NULL ) + { + ext->m_StructProxy->m_CustomDrawCallback = CQuaternionExt::DrawCB; + ext->m_StructProxy->m_CustomMouseButtonCallback = CQuaternionExt::MouseButtonCB; + ext->m_StructProxy->m_CustomMouseMotionCallback = CQuaternionExt::MouseMotionCB; + ext->m_StructProxy->m_CustomMouseLeaveCallback = CQuaternionExt::MouseLeaveCB; + } + } +} + +void ANT_CALL CQuaternionExt::CopyVarFromExtCB(void *_VarValue, const void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData) +{ + CQuaternionExt *ext = (CQuaternionExt *)(_ExtValue); + CTwMgr::CMemberProxy *mProxy = static_cast(_ClientData); + if( _VarValue && ext ) + { + // Synchronize Quat and AxisAngle + if( _ExtMemberIndex>=4 && _ExtMemberIndex<=7 ) + { + ext->ConvertToAxisAngle(); + // show/hide quat values + if( _ExtMemberIndex==4 && mProxy && mProxy->m_VarParent ) + { + assert( mProxy->m_VarParent->m_Vars.size()==16 ); + bool visible = ext->m_ShowVal; + if( ext->m_IsDir ) + { + if( mProxy->m_VarParent->m_Vars[13]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[14]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[15]->m_Visible != visible ) + { + mProxy->m_VarParent->m_Vars[13]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[14]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[15]->m_Visible = visible; + mProxy->m_Bar->NotUpToDate(); + } + } + else + { + if( mProxy->m_VarParent->m_Vars[4]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[5]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[6]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[7]->m_Visible != visible ) + { + mProxy->m_VarParent->m_Vars[4]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[5]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[6]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[7]->m_Visible = visible; + mProxy->m_Bar->NotUpToDate(); + } + } + } + } + else if( _ExtMemberIndex>=8 && _ExtMemberIndex<=11 ) + ext->ConvertFromAxisAngle(); + else if( mProxy && _ExtMemberIndex==12 && mProxy->m_VarParent && !ext->m_IsDir ) + { + assert( mProxy->m_VarParent->m_Vars.size()==16 ); + bool aa = ext->m_AAMode; + if( mProxy->m_VarParent->m_Vars[4]->m_Visible != !aa + || mProxy->m_VarParent->m_Vars[5]->m_Visible != !aa + || mProxy->m_VarParent->m_Vars[6]->m_Visible != !aa + || mProxy->m_VarParent->m_Vars[7]->m_Visible != !aa + || mProxy->m_VarParent->m_Vars[8 ]->m_Visible != aa + || mProxy->m_VarParent->m_Vars[9 ]->m_Visible != aa + || mProxy->m_VarParent->m_Vars[10]->m_Visible != aa + || mProxy->m_VarParent->m_Vars[11]->m_Visible != aa ) + { + mProxy->m_VarParent->m_Vars[4]->m_Visible = !aa; + mProxy->m_VarParent->m_Vars[5]->m_Visible = !aa; + mProxy->m_VarParent->m_Vars[6]->m_Visible = !aa; + mProxy->m_VarParent->m_Vars[7]->m_Visible = !aa; + mProxy->m_VarParent->m_Vars[8 ]->m_Visible = aa; + mProxy->m_VarParent->m_Vars[9 ]->m_Visible = aa; + mProxy->m_VarParent->m_Vars[10]->m_Visible = aa; + mProxy->m_VarParent->m_Vars[11]->m_Visible = aa; + mProxy->m_Bar->NotUpToDate(); + } + if( static_cast(mProxy->m_VarParent->m_Vars[12])->m_ReadOnly ) + { + static_cast(mProxy->m_VarParent->m_Vars[12])->m_ReadOnly = false; + mProxy->m_Bar->NotUpToDate(); + } + } + + if( ext->m_IsFloat ) + { + float *var = static_cast(_VarValue); + if( ext->m_IsDir ) + { + var[0] = (float)ext->Dx; + var[1] = (float)ext->Dy; + var[2] = (float)ext->Dz; + } + else // quat + { + var[0] = (float)ext->Qx; + var[1] = (float)ext->Qy; + var[2] = (float)ext->Qz; + var[3] = (float)ext->Qs; + } + } + else + { + double *var = static_cast(_VarValue); + if( ext->m_IsDir ) + { + var[0] = ext->Dx; + var[1] = ext->Dy; + var[2] = ext->Dz; + } + else // quat + { + var[0] = ext->Qx; + var[1] = ext->Qy; + var[2] = ext->Qz; + var[3] = ext->Qs; + } + } + } +} + +void ANT_CALL CQuaternionExt::CopyVarToExtCB(const void *_VarValue, void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData) +{ + CQuaternionExt *ext = static_cast(_ExtValue); + CTwMgr::CMemberProxy *mProxy = static_cast(_ClientData); + (void)mProxy; + if( _VarValue && ext ) + { + if( mProxy && _ExtMemberIndex==12 && mProxy->m_VarParent && !ext->m_IsDir ) + { + assert( mProxy->m_VarParent->m_Vars.size()==16 ); + bool aa = ext->m_AAMode; + if( mProxy->m_VarParent->m_Vars[4]->m_Visible != !aa + || mProxy->m_VarParent->m_Vars[5]->m_Visible != !aa + || mProxy->m_VarParent->m_Vars[6]->m_Visible != !aa + || mProxy->m_VarParent->m_Vars[7]->m_Visible != !aa + || mProxy->m_VarParent->m_Vars[8 ]->m_Visible != aa + || mProxy->m_VarParent->m_Vars[9 ]->m_Visible != aa + || mProxy->m_VarParent->m_Vars[10]->m_Visible != aa + || mProxy->m_VarParent->m_Vars[11]->m_Visible != aa ) + { + mProxy->m_VarParent->m_Vars[4]->m_Visible = !aa; + mProxy->m_VarParent->m_Vars[5]->m_Visible = !aa; + mProxy->m_VarParent->m_Vars[6]->m_Visible = !aa; + mProxy->m_VarParent->m_Vars[7]->m_Visible = !aa; + mProxy->m_VarParent->m_Vars[8 ]->m_Visible = aa; + mProxy->m_VarParent->m_Vars[9 ]->m_Visible = aa; + mProxy->m_VarParent->m_Vars[10]->m_Visible = aa; + mProxy->m_VarParent->m_Vars[11]->m_Visible = aa; + mProxy->m_Bar->NotUpToDate(); + } + if( static_cast(mProxy->m_VarParent->m_Vars[12])->m_ReadOnly ) + { + static_cast(mProxy->m_VarParent->m_Vars[12])->m_ReadOnly = false; + mProxy->m_Bar->NotUpToDate(); + } + } + else if( mProxy && _ExtMemberIndex==4 && mProxy->m_VarParent ) + { + assert( mProxy->m_VarParent->m_Vars.size()==16 ); + bool visible = ext->m_ShowVal; + if( ext->m_IsDir ) + { + if( mProxy->m_VarParent->m_Vars[13]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[14]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[15]->m_Visible != visible ) + { + mProxy->m_VarParent->m_Vars[13]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[14]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[15]->m_Visible = visible; + mProxy->m_Bar->NotUpToDate(); + } + } + else + { + if( mProxy->m_VarParent->m_Vars[4]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[5]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[6]->m_Visible != visible + || mProxy->m_VarParent->m_Vars[7]->m_Visible != visible ) + { + mProxy->m_VarParent->m_Vars[4]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[5]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[6]->m_Visible = visible; + mProxy->m_VarParent->m_Vars[7]->m_Visible = visible; + mProxy->m_Bar->NotUpToDate(); + } + } + } + + if( ext->m_IsFloat ) + { + const float *var = static_cast(_VarValue); + if( ext->m_IsDir ) + { + ext->Dx = var[0]; + ext->Dy = var[1]; + ext->Dz = var[2]; + QuatFromDir(&ext->Qx, &ext->Qy, &ext->Qz, &ext->Qs, var[0], var[1], var[2]); + } + else + { + ext->Qx = var[0]; + ext->Qy = var[1]; + ext->Qz = var[2]; + ext->Qs = var[3]; + } + + } + else + { + const double *var = static_cast(_VarValue); + if( ext->m_IsDir ) + { + ext->Dx = var[0]; + ext->Dy = var[1]; + ext->Dz = var[2]; + QuatFromDir(&ext->Qx, &ext->Qy, &ext->Qz, &ext->Qs, var[0], var[1], var[2]); + } + else + { + ext->Qx = var[0]; + ext->Qy = var[1]; + ext->Qz = var[2]; + ext->Qs = var[3]; + } + } + ext->ConvertToAxisAngle(); + } +} + +void ANT_CALL CQuaternionExt::SummaryCB(char *_SummaryString, size_t _SummaryMaxLength, const void *_ExtValue, void * /*_ClientData*/) +{ + const CQuaternionExt *ext = static_cast(_ExtValue); + if( ext ) + { + if( ext->m_AAMode ) + _snprintf(_SummaryString, _SummaryMaxLength, "V={%.2f,%.2f,%.2f} A=%.0f%c", ext->Vx, ext->Vy, ext->Vz, ext->Angle, 176); + else if( ext->m_IsDir ) + { + //float d[] = {1, 0, 0}; + //ApplyQuat(d+0, d+1, d+2, 1, 0, 0, (float)ext->Qx, (float)ext->Qy, (float)ext->Qz, (float)ext->Qs); + _snprintf(_SummaryString, _SummaryMaxLength, "V={%.2f,%.2f,%.2f}", ext->Dx, ext->Dy, ext->Dz); + } + else + _snprintf(_SummaryString, _SummaryMaxLength, "Q={x:%.2f,y:%.2f,z:%.2f,s:%.2f}", ext->Qx, ext->Qy, ext->Qz, ext->Qs); + } + else + { + _SummaryString[0] = ' '; // required to force background color for this value + _SummaryString[1] = '\0'; + } +} + +TwType CQuaternionExt::s_CustomType = TW_TYPE_UNDEF; +vector CQuaternionExt::s_SphTri; +vector CQuaternionExt::s_SphCol; +vector CQuaternionExt::s_SphTriProj; +vector CQuaternionExt::s_SphColLight; +vector CQuaternionExt::s_ArrowTri[4]; +vector CQuaternionExt::s_ArrowNorm[4]; +vector CQuaternionExt::s_ArrowTriProj[4]; +vector CQuaternionExt::s_ArrowColLight[4]; + +void CQuaternionExt::CreateTypes() +{ + if( g_TwMgr==NULL ) + return; + s_CustomType = (TwType)(TW_TYPE_CUSTOM_BASE + (int)g_TwMgr->m_Customs.size()); + g_TwMgr->m_Customs.push_back(NULL); // increment custom type number + + for(int pass=0; pass<2; pass++) // pass 0: create quat types; pass 1: create dir types + { + const char *quatDefPass0 = "step=0.01 hide"; + const char *quatDefPass1 = "step=0.01 hide"; + const char *quatSDefPass0 = "step=0.01 min=-1 max=1 hide"; + const char *quatSDefPass1 = "step=0.01 min=-1 max=1 hide"; + const char *dirDefPass0 = "step=0.01 hide"; + const char *dirDefPass1 = "step=0.01"; + const char *quatDef = (pass==0) ? quatDefPass0 : quatDefPass1; + const char *quatSDef = (pass==0) ? quatSDefPass0 : quatSDefPass1; + const char *dirDef = (pass==0) ? dirDefPass0 : dirDefPass1; + + TwStructMember QuatExtMembers[] = { { "0", s_CustomType, 0, "" }, + { "1", s_CustomType, 0, "" }, + { "2", s_CustomType, 0, "" }, + { "3", s_CustomType, 0, "" }, + { "Quat X", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Qx), quatDef }, // copy of the source quaternion + { "Quat Y", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Qy), quatDef }, + { "Quat Z", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Qz), quatDef }, + { "Quat S", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Qs), quatSDef }, + { "Axis X", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Vx), "step=0.01 hide" }, // axis and angle conversion -> Mode hidden because it is not equivalent to a quat (would have required vector renormalization) + { "Axis Y", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Vy), "step=0.01 hide" }, + { "Axis Z", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Vz), "step=0.01 hide" }, + { "Angle (degree)", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Angle), "step=1 min=-360 max=360 hide" }, + { "Mode", TW_TYPE_BOOLCPP, offsetof(CQuaternionExt, m_AAMode), "true='Axis Angle' false='Quaternion' readwrite hide" }, + { "Dir X", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Dx), dirDef }, // copy of the source direction + { "Dir Y", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Dy), dirDef }, + { "Dir Z", TW_TYPE_DOUBLE, offsetof(CQuaternionExt, Dz), dirDef } }; + if( pass==0 ) + { + g_TwMgr->m_TypeQuat4F = TwDefineStructExt("QUAT4F", QuatExtMembers, sizeof(QuatExtMembers)/sizeof(QuatExtMembers[0]), 4*sizeof(float), sizeof(CQuaternionExt), CQuaternionExt::InitQuat4FCB, CQuaternionExt::CopyVarFromExtCB, CQuaternionExt::CopyVarToExtCB, CQuaternionExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData, "A 4-floats-encoded quaternion"); + g_TwMgr->m_TypeQuat4D = TwDefineStructExt("QUAT4D", QuatExtMembers, sizeof(QuatExtMembers)/sizeof(QuatExtMembers[0]), 4*sizeof(double), sizeof(CQuaternionExt), CQuaternionExt::InitQuat4DCB, CQuaternionExt::CopyVarFromExtCB, CQuaternionExt::CopyVarToExtCB, CQuaternionExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData, "A 4-doubles-encoded quaternion"); + } + else if( pass==1 ) + { + g_TwMgr->m_TypeDir3F = TwDefineStructExt("DIR4F", QuatExtMembers, sizeof(QuatExtMembers)/sizeof(QuatExtMembers[0]), 3*sizeof(float), sizeof(CQuaternionExt), CQuaternionExt::InitDir3FCB, CQuaternionExt::CopyVarFromExtCB, CQuaternionExt::CopyVarToExtCB, CQuaternionExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData, "A 3-floats-encoded direction"); + g_TwMgr->m_TypeDir3D = TwDefineStructExt("DIR4D", QuatExtMembers, sizeof(QuatExtMembers)/sizeof(QuatExtMembers[0]), 3*sizeof(double), sizeof(CQuaternionExt), CQuaternionExt::InitDir3DCB, CQuaternionExt::CopyVarFromExtCB, CQuaternionExt::CopyVarToExtCB, CQuaternionExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData, "A 3-doubles-encoded direction"); + } + } + + CreateSphere(); + CreateArrow(); +} + +void CQuaternionExt::ConvertToAxisAngle() +{ + if( fabs(Qs)>(1.0 + FLOAT_EPS) ) + { + //Vx = Vy = Vz = 0; // no, keep the previous value + Angle = 0; + } + else + { + double a; + if( Qs>=1.0f ) + a = 0; // and keep V + else if( Qs<=-1.0f ) + a = DOUBLE_PI; // and keep V + else if( fabs(Qx*Qx+Qy*Qy+Qz*Qz+Qs*Qs)FLOAT_PI ) + // Angle -= 2.0f*FLOAT_PI; + // else if( Angle<-FLOAT_PI ) + // Angle += 2.0f*FLOAT_PI; + Angle = RadToDeg(Angle); + + if( fabs(Angle)FLOAT_EPS_SQ ) + { + double f = 0.5*DegToRad(Angle); + Qs = cos(f); + //do not normalize + //if( fabs(n - 1.0)>FLOAT_EPS_SQ ) + // f = sin(f) * (1.0/sqrt(n)) ; + //else + // f = sin(f); + f = sin(f); + + Qx = Vx * f; + Qy = Vy * f; + Qz = Vz * f; + } + else + { + Qs = 1.0; + Qx = Qy = Qz = 0.0; + } +} + +void CQuaternionExt::CopyToVar() +{ + if( m_StructProxy!=NULL ) + { + if( m_StructProxy->m_StructSetCallback!=NULL ) + { + if( m_IsFloat ) + { + if( m_IsDir ) + { + float d[] = {1, 0, 0}; + ApplyQuat(d+0, d+1, d+2, 1, 0, 0, (float)Qx, (float)Qy, (float)Qz, (float)Qs); + float l = (float)sqrt(Dx*Dx + Dy*Dy + Dz*Dz); + d[0] *= l; d[1] *= l; d[2] *= l; + Dx = d[0]; Dy = d[1]; Dz = d[2]; // update also Dx,Dy,Dz + m_StructProxy->m_StructSetCallback(d, m_StructProxy->m_StructClientData); + } + else + { + float q[] = { (float)Qx, (float)Qy, (float)Qz, (float)Qs }; + m_StructProxy->m_StructSetCallback(q, m_StructProxy->m_StructClientData); + } + } + else + { + if( m_IsDir ) + { + float d[] = {1, 0, 0}; + ApplyQuat(d+0, d+1, d+2, 1, 0, 0, (float)Qx, (float)Qy, (float)Qz, (float)Qs); + double l = sqrt(Dx*Dx + Dy*Dy + Dz*Dz); + double dd[] = {l*d[0], l*d[1], l*d[2]}; + Dx = dd[0]; Dy = dd[1]; Dz = dd[2]; // update also Dx,Dy,Dz + m_StructProxy->m_StructSetCallback(dd, m_StructProxy->m_StructClientData); + } + else + { + double q[] = { Qx, Qy, Qz, Qs }; + m_StructProxy->m_StructSetCallback(q, m_StructProxy->m_StructClientData); + } + } + } + else if( m_StructProxy->m_StructData!=NULL ) + { + if( m_IsFloat ) + { + if( m_IsDir ) + { + float *d = static_cast(m_StructProxy->m_StructData); + ApplyQuat(d+0, d+1, d+2, 1, 0, 0, (float)Qx, (float)Qy, (float)Qz, (float)Qs); + float l = (float)sqrt(Dx*Dx + Dy*Dy + Dz*Dz); + d[0] *= l; d[1] *= l; d[2] *= l; + Dx = d[0]; Dy = d[1]; Dz = d[2]; // update also Dx,Dy,Dz + } + else + { + float *q = static_cast(m_StructProxy->m_StructData); + q[0] = (float)Qx; q[1] = (float)Qy; q[2] = (float)Qz; q[3] = (float)Qs; + } + } + else + { + if( m_IsDir ) + { + double *dd = static_cast(m_StructProxy->m_StructData); + float d[] = {1, 0, 0}; + ApplyQuat(d+0, d+1, d+2, 1, 0, 0, (float)Qx, (float)Qy, (float)Qz, (float)Qs); + double l = sqrt(Dx*Dx + Dy*Dy + Dz*Dz); + dd[0] = l*d[0]; dd[1] = l*d[1]; dd[2] = l*d[2]; + Dx = dd[0]; Dy = dd[1]; Dz = dd[2]; // update also Dx,Dy,Dz + } + else + { + double *q = static_cast(m_StructProxy->m_StructData); + q[0] = Qx; q[1] = Qy; q[2] = Qz; q[3] = Qs; + } + } + } + } +} + +void CQuaternionExt::CreateSphere() +{ + const int SUBDIV = 7; + s_SphTri.clear(); + s_SphCol.clear(); + + const float A[8*3] = { 1,0,0, 0,0,-1, -1,0,0, 0,0,1, 0,0,1, 1,0,0, 0,0,-1, -1,0,0 }; + const float B[8*3] = { 0,1,0, 0,1,0, 0,1,0, 0,1,0, 0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0 }; + const float C[8*3] = { 0,0,1, 1,0,0, 0,0,-1, -1,0,0, 1,0,0, 0,0,-1, -1,0,0, 0,0,1 }; + //const color32 COL_A[8] = { 0xffff8080, 0xff000080, 0xff800000, 0xff8080ff, 0xff8080ff, 0xffff8080, 0xff000080, 0xff800000 }; + //const color32 COL_B[8] = { 0xff80ff80, 0xff80ff80, 0xff80ff80, 0xff80ff80, 0xff008000, 0xff008000, 0xff008000, 0xff008000 }; + //const color32 COL_C[8] = { 0xff8080ff, 0xffff8080, 0xff000080, 0xff800000, 0xffff8080, 0xff000080, 0xff800000, 0xff8080ff }; + const color32 COL_A[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff, 0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff }; + const color32 COL_B[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff, 0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff }; + const color32 COL_C[8] = { 0xffffffff, 0xffffff40, 0xff40ff40, 0xff40ffff, 0xffff40ff, 0xffff4040, 0xff404040, 0xff4040ff }; + + int i, j, k, l; + float xa, ya, za, xb, yb, zb, xc, yc, zc, x, y, z, norm, u[3], v[3]; + color32 col; + for( i=0; i<8; ++i ) + { + xa = A[3*i+0]; ya = A[3*i+1]; za = A[3*i+2]; + xb = B[3*i+0]; yb = B[3*i+1]; zb = B[3*i+2]; + xc = C[3*i+0]; yc = C[3*i+1]; zc = C[3*i+2]; + for( j=0; j<=SUBDIV; ++j ) + for( k=0; k<=2*(SUBDIV-j); ++k ) + { + if( k%2==0 ) + { + u[0] = ((float)j)/(SUBDIV+1); + v[0] = ((float)(k/2))/(SUBDIV+1); + u[1] = ((float)(j+1))/(SUBDIV+1); + v[1] = ((float)(k/2))/(SUBDIV+1); + u[2] = ((float)j)/(SUBDIV+1); + v[2] = ((float)(k/2+1))/(SUBDIV+1); + } + else + { + u[0] = ((float)j)/(SUBDIV+1); + v[0] = ((float)(k/2+1))/(SUBDIV+1); + u[1] = ((float)(j+1))/(SUBDIV+1); + v[1] = ((float)(k/2))/(SUBDIV+1); + u[2] = ((float)(j+1))/(SUBDIV+1); + v[2] = ((float)(k/2+1))/(SUBDIV+1); + } + + for( l=0; l<3; ++l ) + { + x = (1.0f-u[l]-v[l])*xa + u[l]*xb + v[l]*xc; + y = (1.0f-u[l]-v[l])*ya + u[l]*yb + v[l]*yc; + z = (1.0f-u[l]-v[l])*za + u[l]*zb + v[l]*zc; + norm = sqrtf(x*x+y*y+z*z); + x /= norm; y /= norm; z /= norm; + s_SphTri.push_back(x); s_SphTri.push_back(y); s_SphTri.push_back(z); + if( u[l]+v[l]>FLOAT_EPS ) + col = ColorBlend(COL_A[i], ColorBlend(COL_B[i], COL_C[i], v[l]/(u[l]+v[l])), u[l]+v[l]); + else + col = COL_A[i]; + //if( (j==0 && k==0) || (j==0 && k==2*SUBDIV) || (j==SUBDIV && k==0) ) + // col = 0xffff0000; + s_SphCol.push_back(col); + } + } + } + s_SphTriProj.clear(); + s_SphTriProj.resize(2*s_SphCol.size(), 0); + s_SphColLight.clear(); + s_SphColLight.resize(s_SphCol.size(), 0); +} + +void CQuaternionExt::CreateArrow() +{ + const int SUBDIV = 15; + const float CYL_RADIUS = 0.08f; + const float CONE_RADIUS = 0.16f; + const float CONE_LENGTH = 0.25f; + const float ARROW_BGN = -1.1f; + const float ARROW_END = 1.15f; + int i; + for(i=0; i<4; ++i) + { + s_ArrowTri[i].clear(); + s_ArrowNorm[i].clear(); + } + + float x0, x1, y0, y1, z0, z1, a0, a1, nx, nn; + for(i=0; iDOUBLE_EPS ) + { + double f = 0.5*angle; + out[3] = cos(f); + f = sin(f)/sqrt(n); + out[0] = axis[0]*f; + out[1] = axis[1]*f; + out[2] = axis[2]*f; + } + else + { + out[3] = 1.0; + out[0] = out[1] = out[2] = 0.0; + } +} + +static inline void Vec3Cross(double *out, const double *a, const double *b) +{ + out[0] = a[1]*b[2]-a[2]*b[1]; + out[1] = a[2]*b[0]-a[0]*b[2]; + out[2] = a[0]*b[1]-a[1]*b[0]; +} + +static inline double Vec3Dot(const double *a, const double *b) +{ + return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; +} + +static inline void Vec3RotY(float *x, float *y, float *z) +{ + (void)y; + float tmp = *x; + *x = - *z; + *z = tmp; +} + +static inline void Vec3RotZ(float *x, float *y, float *z) +{ + (void)z; + float tmp = *x; + *x = - *y; + *y = tmp; +} + +void CQuaternionExt::ApplyQuat(float *outX, float *outY, float *outZ, float x, float y, float z, float qx, float qy, float qz, float qs) +{ + float ps = - qx * x - qy * y - qz * z; + float px = qs * x + qy * z - qz * y; + float py = qs * y + qz * x - qx * z; + float pz = qs * z + qx * y - qy * x; + *outX = - ps * qx + px * qs - py * qz + pz * qy; + *outY = - ps * qy + py * qs - pz * qx + px * qz; + *outZ = - ps * qz + pz * qs - px * qy + py * qx; +} + +void CQuaternionExt::QuatFromDir(double *outQx, double *outQy, double *outQz, double *outQs, double dx, double dy, double dz) +{ + // compute a quaternion that rotates (1,0,0) to (dx,dy,dz) + + double dn = sqrt(dx*dx + dy*dy + dz*dz); + if( dnm_Graph==NULL ) + return; + assert( g_TwMgr->m_Graph->IsDrawing() ); + CQuaternionExt *ext = static_cast(_ExtValue); + assert( ext!=NULL ); + (void)_ClientData; (void)_Bar; + + // show/hide quat values + assert( varGrp->m_Vars.size()==16 ); + bool visible = ext->m_ShowVal; + if( ext->m_IsDir ) + { + if( varGrp->m_Vars[13]->m_Visible != visible + || varGrp->m_Vars[14]->m_Visible != visible + || varGrp->m_Vars[15]->m_Visible != visible ) + { + varGrp->m_Vars[13]->m_Visible = visible; + varGrp->m_Vars[14]->m_Visible = visible; + varGrp->m_Vars[15]->m_Visible = visible; + _Bar->NotUpToDate(); + } + } + else + { + if( varGrp->m_Vars[4]->m_Visible != visible + || varGrp->m_Vars[5]->m_Visible != visible + || varGrp->m_Vars[6]->m_Visible != visible + || varGrp->m_Vars[7]->m_Visible != visible ) + { + varGrp->m_Vars[4]->m_Visible = visible; + varGrp->m_Vars[5]->m_Visible = visible; + varGrp->m_Vars[6]->m_Visible = visible; + varGrp->m_Vars[7]->m_Visible = visible; + _Bar->NotUpToDate(); + } + } + + // force ext update + static_cast(varGrp->m_Vars[4])->ValueToDouble(); + + assert( s_SphTri.size()>0 ); + assert( s_SphTri.size()==3*s_SphCol.size() ); + assert( s_SphTriProj.size()==2*s_SphCol.size() ); + assert( s_SphColLight.size()==s_SphCol.size() ); + + if( QuatD(w, h)<=2 ) + return; + float x, y, z, nx, ny, nz, kx, ky, kz, qx, qy, qz, qs; + int i, j, k, l, m; + + // normalize quaternion + float qn = (float)sqrt(ext->Qs*ext->Qs+ext->Qx*ext->Qx+ext->Qy*ext->Qy+ext->Qz*ext->Qz); + if( qn>FLOAT_EPS ) + { + qx = (float)ext->Qx/qn; + qy = (float)ext->Qy/qn; + qz = (float)ext->Qz/qn; + qs = (float)ext->Qs/qn; + } + else + { + qx = qy = qz = 0; + qs = 1; + } + + double normDir = sqrt(ext->m_Dir[0]*ext->m_Dir[0] + ext->m_Dir[1]*ext->m_Dir[1] + ext->m_Dir[2]*ext->m_Dir[2]); + bool drawDir = ext->m_IsDir || (normDir>DOUBLE_EPS); + color32 alpha = ext->m_Highlighted ? 0xffffffff : 0xb0ffffff; + + // check if frame is right-handed + ext->Permute(&kx, &ky, &kz, 1, 0, 0); + double px[3] = { (double)kx, (double)ky, (double)kz }; + ext->Permute(&kx, &ky, &kz, 0, 1, 0); + double py[3] = { (double)kx, (double)ky, (double)kz }; + ext->Permute(&kx, &ky, &kz, 0, 0, 1); + double pz[3] = { (double)kx, (double)ky, (double)kz }; + double ez[3]; + Vec3Cross(ez, px, py); + bool frameRightHanded = (ez[0]*pz[0]+ez[1]*pz[1]+ez[2]*pz[2] >= 0); + ITwGraph::Cull cull = frameRightHanded ? ITwGraph::CULL_CW : ITwGraph::CULL_CCW; + + if( drawDir ) + { + float dir[] = {(float)ext->m_Dir[0], (float)ext->m_Dir[1], (float)ext->m_Dir[2]}; + if( normDirPermute(&x, &y, &z, kx, ky, kz); + j = (z>0) ? 3-k : k; + + assert( s_ArrowTriProj[j].size()==2*(s_ArrowTri[j].size()/3) && s_ArrowColLight[j].size()==s_ArrowTri[j].size()/3 && s_ArrowNorm[j].size()==s_ArrowTri[j].size() ); + const int ntri = (int)s_ArrowTri[j].size()/3; + const float *tri = &(s_ArrowTri[j][0]); + const float *norm = &(s_ArrowNorm[j][0]); + int *triProj = &(s_ArrowTriProj[j][0]); + color32 *colLight = &(s_ArrowColLight[j][0]); + for(i=0; i0 ) + x = 2.5f*x - 2.0f; + else + x += 0.2f; + y *= 1.5f; + z *= 1.5f; + ApplyQuat(&x, &y, &z, x, y, z, (float)rotDirQuat[0], (float)rotDirQuat[1], (float)rotDirQuat[2], (float)rotDirQuat[3]); + ApplyQuat(&x, &y, &z, x, y, z, qx, qy, qz, qs); + ext->Permute(&x, &y, &z, x, y, z); + ApplyQuat(&nx, &ny, &nz, nx, ny, nz, (float)rotDirQuat[0], (float)rotDirQuat[1], (float)rotDirQuat[2], (float)rotDirQuat[3]); + ApplyQuat(&nx, &ny, &nz, nx, ny, nz, qx, qy, qz, qs); + ext->Permute(&nx, &ny, &nz, nx, ny, nz); + triProj[2*i+0] = QuatPX(x, w, h); + triProj[2*i+1] = QuatPY(y, w, h); + color32 col = (ext->m_DirColor|0xff000000) & alpha; + colLight[i] = ColorBlend(0xff000000, col, fabsf(TClamp(nz, -1.0f, 1.0f))); + } + if( s_ArrowTri[j].size()>=9 ) // 1 tri = 9 floats + g_TwMgr->m_Graph->DrawTriangles((int)s_ArrowTri[j].size()/9, triProj, colLight, cull); + } + } + else + { + /* + int px0 = QuatPX(0, w, h)-1, py0 = QuatPY(0, w, h), r0 = (int)(0.5f*QuatD(w, h)-0.5f); + color32 col0 = 0x80000000; + DrawArc(px0-1, py0, r0, 0, 360, col0); + DrawArc(px0+1, py0, r0, 0, 360, col0); + DrawArc(px0, py0-1, r0, 0, 360, col0); + DrawArc(px0, py0+1, r0, 0, 360, col0); + */ + // draw arrows & sphere + const float SPH_RADIUS = 0.75f; + for(m=0; m<2; ++m) // m=0: back, m=1: front + { + for(l=0; l<3; ++l) // draw 3 arrows + { + kx = 1; ky = 0; kz = 0; + if( l==1 ) + Vec3RotZ(&kx, &ky, &kz); + else if( l==2 ) + Vec3RotY(&kx, &ky, &kz); + ApplyQuat(&kx, &ky, &kz, kx, ky, kz, qx, qy, qz, qs); + for(k=0; k<4; ++k) // 4 parts of the arrow + { + // draw order + ext->Permute(&x, &y, &z, kx, ky, kz); + j = (z>0) ? 3-k : k; + + bool cone = true; + if( (m==0 && z>0) || (m==1 && z<=0) ) + { + if( j==ARROW_CONE || j==ARROW_CONE_CAP ) // do not draw cone + continue; + else + cone = false; + } + assert( s_ArrowTriProj[j].size()==2*(s_ArrowTri[j].size()/3) && s_ArrowColLight[j].size()==s_ArrowTri[j].size()/3 && s_ArrowNorm[j].size()==s_ArrowTri[j].size() ); + const int ntri = (int)s_ArrowTri[j].size()/3; + const float *tri = &(s_ArrowTri[j][0]); + const float *norm = &(s_ArrowNorm[j][0]); + int *triProj = &(s_ArrowTriProj[j][0]); + color32 *colLight = &(s_ArrowColLight[j][0]); + for(i=0; i0 ) + x = -SPH_RADIUS; + nx = norm[3*i+0]; ny = norm[3*i+1]; nz = norm[3*i+2]; + if( l==1 ) + { + Vec3RotZ(&x, &y, &z); + Vec3RotZ(&nx, &ny, &nz); + } + else if( l==2 ) + { + Vec3RotY(&x, &y, &z); + Vec3RotY(&nx, &ny, &nz); + } + ApplyQuat(&x, &y, &z, x, y, z, qx, qy, qz, qs); + ext->Permute(&x, &y, &z, x, y, z); + ApplyQuat(&nx, &ny, &nz, nx, ny, nz, qx, qy, qz, qs); + ext->Permute(&nx, &ny, &nz, nx, ny, nz); + triProj[2*i+0] = QuatPX(x, w, h); + triProj[2*i+1] = QuatPY(y, w, h); + float fade = ( m==0 && z<0 ) ? TClamp(2.0f*z*z, 0.0f, 1.0f) : 0; + float alphaFade = 1.0f; + Color32ToARGBf(alpha, &alphaFade, NULL, NULL, NULL); + alphaFade *= (1.0f-fade); + color32 alphaFadeCol = Color32FromARGBf(alphaFade, 1, 1, 1); + color32 col = (l==0) ? 0xffff0000 : ( (l==1) ? 0xff00ff00 : 0xff0000ff ); + colLight[i] = ColorBlend(0xff000000, col, fabsf(TClamp(nz, -1.0f, 1.0f))) & alphaFadeCol; + } + if( s_ArrowTri[j].size()>=9 ) // 1 tri = 9 floats + g_TwMgr->m_Graph->DrawTriangles((int)s_ArrowTri[j].size()/9, triProj, colLight, cull); + } + } + + if( m==0 ) + { + const float *tri = &(s_SphTri[0]); + int *triProj = &(s_SphTriProj[0]); + const color32 *col = &(s_SphCol[0]); + color32 *colLight = &(s_SphColLight[0]); + const int ntri = (int)s_SphTri.size()/3; + for(i=0; iPermute(&x, &y, &z, x, y, z); + triProj[2*i+0] = QuatPX(x, w, h); + triProj[2*i+1] = QuatPY(y, w, h); + colLight[i] = ColorBlend(0xff000000, col[i], fabsf(TClamp(z/SPH_RADIUS, -1.0f, 1.0f))) & alpha; + } + g_TwMgr->m_Graph->DrawTriangles((int)s_SphTri.size()/9, triProj, colLight, cull); + } + } + + // draw x + g_TwMgr->m_Graph->DrawLine(w-12, h-36, w-12+5, h-36+5, 0xffc00000, true); + g_TwMgr->m_Graph->DrawLine(w-12+5, h-36, w-12, h-36+5, 0xffc00000, true); + // draw y + g_TwMgr->m_Graph->DrawLine(w-12, h-25, w-12+3, h-25+4, 0xff00c000, true); + g_TwMgr->m_Graph->DrawLine(w-12+5, h-25, w-12, h-25+7, 0xff00c000, true); + // draw z + g_TwMgr->m_Graph->DrawLine(w-12, h-12, w-12+5, h-12, 0xff0000c0, true); + g_TwMgr->m_Graph->DrawLine(w-12, h-12+5, w-12+5, h-12+5, 0xff0000c0, true); + g_TwMgr->m_Graph->DrawLine(w-12, h-12+5, w-12+5, h-12, 0xff0000c0, true); + } + + // draw borders + g_TwMgr->m_Graph->DrawLine(1, 0, w-1, 0, 0x40000000); + g_TwMgr->m_Graph->DrawLine(w-1, 0, w-1, h-1, 0x40000000); + g_TwMgr->m_Graph->DrawLine(w-1, h-1, 1, h-1, 0x40000000); + g_TwMgr->m_Graph->DrawLine(1, h-1, 1, 0, 0x40000000); +} + +bool CQuaternionExt::MouseMotionCB(int mouseX, int mouseY, int w, int h, void *structExtValue, void *clientData, TwBar *bar, CTwVarGroup *varGrp) +{ + CQuaternionExt *ext = static_cast(structExtValue); + if( ext==NULL ) + return false; + (void)clientData, (void)varGrp; + + if( mouseX>0 && mouseX0 && mouseYm_Highlighted = true; + + if( ext->m_Rotating ) + { + double x = QuatIX(mouseX, w, h); + double y = QuatIY(mouseY, w, h); + double z = 1; + double px, py, pz, ox, oy, oz; + ext->PermuteInv(&px, &py, &pz, x, y, z); + ext->PermuteInv(&ox, &oy, &oz, ext->m_OrigX, ext->m_OrigY, 1); + double n0 = sqrt(ox*ox + oy*oy + oz*oz); + double n1 = sqrt(px*px + py*py + pz*pz); + if( n0>DOUBLE_EPS && n1>DOUBLE_EPS ) + { + double v0[] = { ox/n0, oy/n0, oz/n0 }; + double v1[] = { px/n1, py/n1, pz/n1 }; + double axis[3]; + Vec3Cross(axis, v0, v1); + double sa = sqrt(Vec3Dot(axis, axis)); + double ca = Vec3Dot(v0, v1); + double angle = atan2(sa, ca); + if( x*x+y*y>1.0 ) + angle *= 1.0 + 0.2f*(sqrt(x*x+y*y)-1.0); + double qrot[4], qres[4], qorig[4]; + QuatFromAxisAngle(qrot, axis, angle); + double nqorig = sqrt(ext->m_OrigQuat[0]*ext->m_OrigQuat[0]+ext->m_OrigQuat[1]*ext->m_OrigQuat[1]+ext->m_OrigQuat[2]*ext->m_OrigQuat[2]+ext->m_OrigQuat[3]*ext->m_OrigQuat[3]); + if( fabs(nqorig)>DOUBLE_EPS_SQ ) + { + qorig[0] = ext->m_OrigQuat[0]/nqorig; + qorig[1] = ext->m_OrigQuat[1]/nqorig; + qorig[2] = ext->m_OrigQuat[2]/nqorig; + qorig[3] = ext->m_OrigQuat[3]/nqorig; + QuatMult(qres, qrot, qorig); + ext->Qx = qres[0]; + ext->Qy = qres[1]; + ext->Qz = qres[2]; + ext->Qs = qres[3]; + } + else + { + ext->Qx = qrot[0]; + ext->Qy = qrot[1]; + ext->Qz = qrot[2]; + ext->Qs = qrot[3]; + } + ext->CopyToVar(); + if( bar!=NULL ) + bar->NotUpToDate(); + + ext->m_PrevX = x; + ext->m_PrevY = y; + } + } + + return true; +} + +bool CQuaternionExt::MouseButtonCB(TwMouseButtonID button, bool pressed, int mouseX, int mouseY, int w, int h, void *structExtValue, void *clientData, TwBar *bar, CTwVarGroup *varGrp) +{ + CQuaternionExt *ext = static_cast(structExtValue); + if( ext==NULL ) + return false; + (void)clientData; (void)bar, (void)varGrp; + + if( button==TW_MOUSE_LEFT ) + { + if( pressed ) + { + ext->m_OrigQuat[0] = ext->Qx; + ext->m_OrigQuat[1] = ext->Qy; + ext->m_OrigQuat[2] = ext->Qz; + ext->m_OrigQuat[3] = ext->Qs; + ext->m_OrigX = QuatIX(mouseX, w, h); + ext->m_OrigY = QuatIY(mouseY, w, h); + ext->m_PrevX = ext->m_OrigX; + ext->m_PrevY = ext->m_OrigY; + ext->m_Rotating = true; + } + else + ext->m_Rotating = false; + } + + //printf("Click %x\n", structExtValue); + return true; +} + +void CQuaternionExt::MouseLeaveCB(void *structExtValue, void *clientData, TwBar *bar) +{ + CQuaternionExt *ext = static_cast(structExtValue); + if( ext==NULL ) + return; + (void)clientData; (void)bar; + + //printf("Leave %x\n", structExtValue); + ext->m_Highlighted = false; + ext->m_Rotating = false; +} + + +// --------------------------------------------------------------------------- +// Convertion between VC++ Debug/Release std::string +// (Needed because VC++ adds some extra info to std::string in Debug mode!) +// And resolve binary std::string incompatibility between VS2010 and other VS versions +// --------------------------------------------------------------------------- + +#ifdef _MSC_VER +// VS2010 store the string allocator pointer at the end +// VS2008 VS2012 and others store the string allocator pointer at the beginning +static void FixVS2010StdStringLibToClient(void *strPtr) +{ + char *ptr = (char *)strPtr; + const size_t SizeOfUndecoratedString = 16 + 2*sizeof(size_t) + sizeof(void *); // size of a VS std::string without extra debug iterator and info. + assert(SizeOfUndecoratedString <= sizeof(std::string)); + TwType LibStdStringBaseType = (TwType)(TW_TYPE_STDSTRING&0xffff0000); + void **allocAddress2008 = (void **)(ptr + sizeof(std::string) - SizeOfUndecoratedString); + void **allocAddress2010 = (void **)(ptr + sizeof(std::string) - sizeof(void *)); + if (LibStdStringBaseType == TW_TYPE_STDSTRING_VS2008 && g_TwMgr->m_ClientStdStringBaseType == TW_TYPE_STDSTRING_VS2010) + { + void *allocator = *allocAddress2008; + memmove(allocAddress2008, allocAddress2008 + 1, SizeOfUndecoratedString - sizeof(void *)); + *allocAddress2010 = allocator; + } + else if (LibStdStringBaseType == TW_TYPE_STDSTRING_VS2010 && g_TwMgr->m_ClientStdStringBaseType == TW_TYPE_STDSTRING_VS2008) + { + void *allocator = *allocAddress2010; + memmove(allocAddress2008 + 1, allocAddress2008, SizeOfUndecoratedString - sizeof(void *)); + *allocAddress2008 = allocator; + } +} + +static void FixVS2010StdStringClientToLib(void *strPtr) +{ + char *ptr = (char *)strPtr; + const size_t SizeOfUndecoratedString = 16 + 2*sizeof(size_t) + sizeof(void *); // size of a VS std::string without extra debug iterator and info. + assert(SizeOfUndecoratedString <= sizeof(std::string)); + TwType LibStdStringBaseType = (TwType)(TW_TYPE_STDSTRING&0xffff0000); + void **allocAddress2008 = (void **)(ptr + sizeof(std::string) - SizeOfUndecoratedString); + void **allocAddress2010 = (void **)(ptr + sizeof(std::string) - sizeof(void *)); + if (LibStdStringBaseType == TW_TYPE_STDSTRING_VS2008 && g_TwMgr->m_ClientStdStringBaseType == TW_TYPE_STDSTRING_VS2010) + { + void *allocator = *allocAddress2010; + memmove(allocAddress2008 + 1, allocAddress2008, SizeOfUndecoratedString - sizeof(void *)); + *allocAddress2008 = allocator; + } + else if (LibStdStringBaseType == TW_TYPE_STDSTRING_VS2010 && g_TwMgr->m_ClientStdStringBaseType == TW_TYPE_STDSTRING_VS2008) + { + void *allocator = *allocAddress2008; + memmove(allocAddress2008, allocAddress2008 + 1, SizeOfUndecoratedString - sizeof(void *)); + *allocAddress2010 = allocator; + } +} +#endif // _MSC_VER + +CTwMgr::CClientStdString::CClientStdString() +{ + memset(m_Data, 0, sizeof(m_Data)); +} + +void CTwMgr::CClientStdString::FromLib(const char *libStr) +{ + m_LibStr = libStr; // it is ok to have a local copy here + memcpy(m_Data + sizeof(void *), &m_LibStr, sizeof(std::string)); +#ifdef _MSC_VER + FixVS2010StdStringLibToClient(m_Data + sizeof(void *)); +#endif +} + +std::string& CTwMgr::CClientStdString::ToClient() +{ + assert( g_TwMgr!=NULL ); + if( g_TwMgr->m_ClientStdStringStructSize==sizeof(std::string)+sizeof(void *) ) + return *(std::string *)(m_Data); + else if( g_TwMgr->m_ClientStdStringStructSize+sizeof(void *)==sizeof(std::string) ) + return *(std::string *)(m_Data + 2*sizeof(void *)); + else + { + assert( g_TwMgr->m_ClientStdStringStructSize==sizeof(std::string) ); + return *(std::string *)(m_Data + sizeof(void *)); + } +} + + +CTwMgr::CLibStdString::CLibStdString() +{ + memset(m_Data, 0, sizeof(m_Data)); +} + +void CTwMgr::CLibStdString::FromClient(const std::string& clientStr) +{ + assert( g_TwMgr!=NULL ); + memcpy(m_Data + sizeof(void *), &clientStr, g_TwMgr->m_ClientStdStringStructSize); +#ifdef _MSC_VER + FixVS2010StdStringClientToLib(m_Data + sizeof(void *)); +#endif +} + +std::string& CTwMgr::CLibStdString::ToLib() +{ + assert( g_TwMgr!=NULL ); + if( g_TwMgr->m_ClientStdStringStructSize==sizeof(std::string)+sizeof(void *) ) + return *(std::string *)(m_Data + 2*sizeof(void *)); + else if( g_TwMgr->m_ClientStdStringStructSize+sizeof(void *)==sizeof(std::string) ) + return *(std::string *)(m_Data); + else + { + assert( g_TwMgr->m_ClientStdStringStructSize==sizeof(std::string) ); + return *(std::string *)(m_Data + sizeof(void *)); + } +} + + +// --------------------------------------------------------------------------- +// Management functions +// --------------------------------------------------------------------------- + + +static int TwCreateGraph(ETwGraphAPI _GraphAPI) +{ + assert( g_TwMgr!=NULL && g_TwMgr->m_Graph==NULL ); + + switch( _GraphAPI ) + { + case TW_OPENGL: + g_TwMgr->m_Graph = new CTwGraphOpenGL; + break; + case TW_OPENGL_CORE: + g_TwMgr->m_Graph = new CTwGraphOpenGLCore; + break; + case TW_DIRECT3D9: + #ifdef ANT_WINDOWS + if( g_TwMgr->m_Device!=NULL ) + g_TwMgr->m_Graph = new CTwGraphDirect3D9; + else + { + g_TwMgr->SetLastError(g_ErrBadDevice); + return 0; + } + #endif // ANT_WINDOWS + break; + case TW_DIRECT3D10: + #ifdef ANT_WINDOWS + if( g_TwMgr->m_Device!=NULL ) + g_TwMgr->m_Graph = new CTwGraphDirect3D10; + else + { + g_TwMgr->SetLastError(g_ErrBadDevice); + return 0; + } + #endif // ANT_WINDOWS + break; + case TW_DIRECT3D11: + #ifdef ANT_WINDOWS + if( g_TwMgr->m_Device!=NULL ) + g_TwMgr->m_Graph = new CTwGraphDirect3D11; + else + { + g_TwMgr->SetLastError(g_ErrBadDevice); + return 0; + } + #endif // ANT_WINDOWS + break; + } + + if( g_TwMgr->m_Graph==NULL ) + { + g_TwMgr->SetLastError(g_ErrUnknownAPI); + return 0; + } + else + return g_TwMgr->m_Graph->Init(); +} + +// --------------------------------------------------------------------------- + +static inline int TwFreeAsyncDrawing() +{ + if( g_TwMgr && g_TwMgr->m_Graph && g_TwMgr->m_Graph->IsDrawing() ) + { + const double SLEEP_MAX = 0.25; // wait at most 1/4 second + PerfTimer timer; + while( g_TwMgr->m_Graph->IsDrawing() && timer.GetTime()m_Graph->IsDrawing() ) + { + g_TwMgr->SetLastError(g_ErrIsDrawing); + return 0; + } + } + return 1; +} + +// --------------------------------------------------------------------------- + +/* +static inline int TwFreeAsyncProcessing() +{ + if( g_TwMgr && g_TwMgr->IsProcessing() ) + { + const double SLEEP_MAX = 0.25; // wait at most 1/4 second + PerfTimer timer; + while( g_TwMgr->IsProcessing() && timer.GetTime()IsProcessing() ) + { + g_TwMgr->SetLastError(g_ErrIsProcessing); + return 0; + } + } + return 1; +} + +static inline int TwBeginProcessing() +{ + if( !TwFreeAsyncProcessing() ) + return 0; + if( g_TwMgr ) + g_TwMgr->SetProcessing(true); +} + +static inline int TwEndProcessing() +{ + if( g_TwMgr ) + g_TwMgr->SetProcessing(false); +} +*/ + +// --------------------------------------------------------------------------- + +static int TwInitMgr() +{ + assert( g_TwMasterMgr!=NULL ); + assert( g_TwMgr!=NULL ); + + g_TwMgr->m_CurrentFont = g_DefaultNormalFont; + g_TwMgr->m_Graph = g_TwMasterMgr->m_Graph; + + g_TwMgr->m_KeyPressedTextObj = g_TwMgr->m_Graph->NewTextObj(); + g_TwMgr->m_InfoTextObj = g_TwMgr->m_Graph->NewTextObj(); + + g_TwMgr->m_HelpBar = TwNewBar("TW_HELP"); + if( g_TwMgr->m_HelpBar ) + { + g_TwMgr->m_HelpBar->m_Label = "~ Help & Shortcuts ~"; + g_TwMgr->m_HelpBar->m_PosX = 32; + g_TwMgr->m_HelpBar->m_PosY = 32; + g_TwMgr->m_HelpBar->m_Width = 400; + g_TwMgr->m_HelpBar->m_Height = 200; + g_TwMgr->m_HelpBar->m_ValuesWidth = 12*(g_TwMgr->m_HelpBar->m_Font->m_CharHeight/2); + g_TwMgr->m_HelpBar->m_Color = 0xa05f5f5f; //0xd75f5f5f; + g_TwMgr->m_HelpBar->m_DarkText = false; + g_TwMgr->m_HelpBar->m_IsHelpBar = true; + g_TwMgr->Minimize(g_TwMgr->m_HelpBar); + } + else + return 0; + + CColorExt::CreateTypes(); + CQuaternionExt::CreateTypes(); + + return 1; +} + + +int ANT_CALL TwInit(ETwGraphAPI _GraphAPI, void *_Device) +{ +#if defined(_DEBUG) && defined(ANT_WINDOWS) + _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF)); +#endif + + if( g_TwMasterMgr!=NULL ) + { + g_TwMasterMgr->SetLastError(g_ErrInit); + return 0; + } + assert( g_TwMgr==0 ); + assert( g_Wnds.empty() ); + + g_TwMasterMgr = new CTwMgr(_GraphAPI, _Device, TW_MASTER_WINDOW_ID); + g_Wnds[TW_MASTER_WINDOW_ID] = g_TwMasterMgr; + g_TwMgr = g_TwMasterMgr; + + TwGenerateDefaultFonts(g_FontScaling); + g_TwMgr->m_CurrentFont = g_DefaultNormalFont; + + int Res = TwCreateGraph(_GraphAPI); + if( Res ) + Res = TwInitMgr(); + + if( !Res ) + TwTerminate(); + + return Res; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwSetLastError(const char *_StaticErrorMessage) +{ + if( g_TwMasterMgr!=0 ) + { + g_TwMasterMgr->SetLastError(_StaticErrorMessage); + return 1; + } + else + return 0; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwTerminate() +{ + if( g_TwMgr==NULL ) + { + //TwGlobalError(g_ErrShut); -> not an error + return 0; // already shutdown + } + + // For multi-thread safety + if( !TwFreeAsyncDrawing() ) + return 0; + + CTwWndMap::iterator it; + for( it=g_Wnds.begin(); it!=g_Wnds.end(); it++ ) + { + g_TwMgr = it->second; + + g_TwMgr->m_Terminating = true; + TwDeleteAllBars(); + if( g_TwMgr->m_CursorsCreated ) + g_TwMgr->FreeCursors(); + + if( g_TwMgr->m_Graph ) + { + if( g_TwMgr->m_KeyPressedTextObj ) + { + g_TwMgr->m_Graph->DeleteTextObj(g_TwMgr->m_KeyPressedTextObj); + g_TwMgr->m_KeyPressedTextObj = NULL; + } + if( g_TwMgr->m_InfoTextObj ) + { + g_TwMgr->m_Graph->DeleteTextObj(g_TwMgr->m_InfoTextObj); + g_TwMgr->m_InfoTextObj = NULL; + } + if (g_TwMgr != g_TwMasterMgr) + g_TwMgr->m_Graph = NULL; + } + + if (g_TwMgr != g_TwMasterMgr) + { + delete g_TwMgr; + g_TwMgr = NULL; + } + } + + // delete g_TwMasterMgr + int Res = 1; + g_TwMgr = g_TwMasterMgr; + if( g_TwMasterMgr->m_Graph ) + { + Res = g_TwMasterMgr->m_Graph->Shut(); + delete g_TwMasterMgr->m_Graph; + g_TwMasterMgr->m_Graph = NULL; + } + TwDeleteDefaultFonts(); + delete g_TwMasterMgr; + g_TwMasterMgr = NULL; + g_TwMgr = NULL; + g_Wnds.clear(); + + return Res; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwGetCurrentWindow() +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + + return g_TwMgr->m_WndID; +} + +int ANT_CALL TwSetCurrentWindow(int wndID) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + + if (wndID != g_TwMgr->m_WndID) + { + CTwWndMap::iterator foundWnd = g_Wnds.find(wndID); + if (foundWnd == g_Wnds.end()) + { + // create a new CTwMgr + g_TwMgr = new CTwMgr(g_TwMasterMgr->m_GraphAPI, g_TwMasterMgr->m_Device, wndID); + g_Wnds[wndID] = g_TwMgr; + return TwInitMgr(); + } + else + { + g_TwMgr = foundWnd->second; + return 1; + } + } + else + return 1; +} + +int ANT_CALL TwWindowExists(int wndID) +{ + CTwWndMap::iterator foundWnd = g_Wnds.find(wndID); + if (foundWnd == g_Wnds.end()) + return 0; + else + return 1; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwDraw() +{ + PERF( PerfTimer Timer; double DT; ) + //CTwFPU fpu; // fpu precision only forced in update (do not modif dx draw calls) + + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + + assert(g_TwMgr->m_Bars.size()==g_TwMgr->m_Order.size()); + + // For multi-thread savety + if( !TwFreeAsyncDrawing() ) + return 0; + + // Create cursors + #if defined(ANT_WINDOWS) || defined(ANT_OSX) + if( !g_TwMgr->m_CursorsCreated ) + g_TwMgr->CreateCursors(); + #elif defined(ANT_UNIX) + if( !g_TwMgr->m_CurrentXDisplay ) + g_TwMgr->m_CurrentXDisplay = glXGetCurrentDisplay(); + if( !g_TwMgr->m_CurrentXWindow ) + g_TwMgr->m_CurrentXWindow = glXGetCurrentDrawable(); + if( g_TwMgr->m_CurrentXDisplay && !g_TwMgr->m_CursorsCreated ) + g_TwMgr->CreateCursors(); + #endif + + // Autorepeat TW_MOUSE_PRESSED + double CurrTime = g_TwMgr->m_Timer.GetTime(); + double RepeatDT = CurrTime - g_TwMgr->m_LastMousePressedTime; + double DrawDT = CurrTime - g_TwMgr->m_LastDrawTime; + if( RepeatDT>2.0*g_TwMgr->m_RepeatMousePressedDelay + || DrawDT>2.0*g_TwMgr->m_RepeatMousePressedDelay + || abs(g_TwMgr->m_LastMousePressedPosition[0]-g_TwMgr->m_LastMouseX)>4 + || abs(g_TwMgr->m_LastMousePressedPosition[1]-g_TwMgr->m_LastMouseY)>4 ) + { + g_TwMgr->m_CanRepeatMousePressed = false; + g_TwMgr->m_IsRepeatingMousePressed = false; + } + if( g_TwMgr->m_CanRepeatMousePressed ) + { + if( (!g_TwMgr->m_IsRepeatingMousePressed && RepeatDT>g_TwMgr->m_RepeatMousePressedDelay) + || (g_TwMgr->m_IsRepeatingMousePressed && RepeatDT>g_TwMgr->m_RepeatMousePressedPeriod) ) + { + g_TwMgr->m_IsRepeatingMousePressed = true; + g_TwMgr->m_LastMousePressedTime = g_TwMgr->m_Timer.GetTime(); + TwMouseMotion(g_TwMgr->m_LastMouseX,g_TwMgr->m_LastMouseY); + TwMouseButton(TW_MOUSE_PRESSED, g_TwMgr->m_LastMousePressedButtonID); + } + } + g_TwMgr->m_LastDrawTime = CurrTime; + + if( g_TwMgr->m_WndWidth<0 || g_TwMgr->m_WndHeight<0 ) + { + g_TwMgr->SetLastError(g_ErrBadSize); + return 0; + } + else if( g_TwMgr->m_WndWidth==0 || g_TwMgr->m_WndHeight==0 ) // probably iconified + return 1; // nothing to do + + // count number of bars to draw + size_t i, j; + int Nb = 0; + for( i=0; im_Bars.size(); ++i ) + if( g_TwMgr->m_Bars[i]!=NULL && g_TwMgr->m_Bars[i]->m_Visible ) + ++Nb; + + if( Nb>0 ) + { + PERF( Timer.Reset(); ) + g_TwMgr->m_Graph->BeginDraw(g_TwMgr->m_WndWidth, g_TwMgr->m_WndHeight); + PERF( DT = Timer.GetTime(); printf("\nBegin=%.4fms ", 1000.0*DT); ) + + PERF( Timer.Reset(); ) + vector TopBarsRects, ClippedBarRects; + for( i=0; im_Bars.size(); ++i ) + { + CTwBar *Bar = g_TwMgr->m_Bars[ g_TwMgr->m_Order[i] ]; + if( Bar->m_Visible ) + { + if( g_TwMgr->m_OverlapContent || Bar->IsMinimized() ) + Bar->Draw(); + else + { + // Clip overlapped transparent bars to make them more readable + const int Margin = 4; + CRect BarRect(Bar->m_PosX - Margin, Bar->m_PosY - Margin, Bar->m_Width + 2*Margin, Bar->m_Height + 2*Margin); + TopBarsRects.clear(); + for( j=i+1; jm_Bars.size(); ++j ) + { + CTwBar *TopBar = g_TwMgr->m_Bars[g_TwMgr->m_Order[j]]; + if( TopBar->m_Visible && !TopBar->IsMinimized() ) + TopBarsRects.push_back(CRect(TopBar->m_PosX, TopBar->m_PosY, TopBar->m_Width, TopBar->m_Height)); + } + ClippedBarRects.clear(); + BarRect.Subtract(TopBarsRects, ClippedBarRects); + + if( ClippedBarRects.size()==1 && ClippedBarRects[0]==BarRect ) + //g_TwMgr->m_Graph->DrawRect(Bar->m_PosX, Bar->m_PosY, Bar->m_PosX+Bar->m_Width-1, Bar->m_PosY+Bar->m_Height-1, 0x70ffffff); // Clipping test + Bar->Draw(); // unclipped + else + { + Bar->Draw(CTwBar::DRAW_BG); // draw background only + + // draw content for each clipped rectangle + for( j=0; j1 && ClippedBarRects[j].H>1) + { + g_TwMgr->m_Graph->SetScissor(ClippedBarRects[j].X+1, ClippedBarRects[j].Y, ClippedBarRects[j].W, ClippedBarRects[j].H-1); + //g_TwMgr->m_Graph->DrawRect(0, 0, 1000, 1000, 0x70ffffff); // Clipping test + Bar->Draw(CTwBar::DRAW_CONTENT); + } + g_TwMgr->m_Graph->SetScissor(0, 0, 0, 0); + } + } + } + } + PERF( DT = Timer.GetTime(); printf("Draw=%.4fms ", 1000.0*DT); ) + + PERF( Timer.Reset(); ) + g_TwMgr->m_Graph->EndDraw(); + PERF( DT = Timer.GetTime(); printf("End=%.4fms\n", 1000.0*DT); ) + } + + return 1; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwWindowSize(int _Width, int _Height) +{ + g_InitWndWidth = _Width; + g_InitWndHeight = _Height; + + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + //TwGlobalError(g_ErrNotInit); -> not an error here + return 0; // not initialized + } + + if( _Width<0 || _Height<0 ) + { + g_TwMgr->SetLastError(g_ErrBadSize); + return 0; + } + + // For multi-thread savety + if( !TwFreeAsyncDrawing() ) + return 0; + + // Delete the extra text objects + if( g_TwMgr->m_KeyPressedTextObj ) + { + g_TwMgr->m_Graph->DeleteTextObj(g_TwMgr->m_KeyPressedTextObj); + g_TwMgr->m_KeyPressedTextObj = NULL; + } + if( g_TwMgr->m_InfoTextObj ) + { + g_TwMgr->m_Graph->DeleteTextObj(g_TwMgr->m_InfoTextObj); + g_TwMgr->m_InfoTextObj = NULL; + } + + g_TwMgr->m_WndWidth = _Width; + g_TwMgr->m_WndHeight = _Height; + g_TwMgr->m_Graph->Restore(); + + // Recreate extra text objects + if( g_TwMgr->m_WndWidth!=0 && g_TwMgr->m_WndHeight!=0 ) + { + if( g_TwMgr->m_KeyPressedTextObj==NULL ) + { + g_TwMgr->m_KeyPressedTextObj = g_TwMgr->m_Graph->NewTextObj(); + g_TwMgr->m_KeyPressedBuildText = true; + } + if( g_TwMgr->m_InfoTextObj==NULL ) + { + g_TwMgr->m_InfoTextObj = g_TwMgr->m_Graph->NewTextObj(); + g_TwMgr->m_InfoBuildText = true; + } + } + + for( std::vector::iterator it=g_TwMgr->m_Bars.begin(); it!=g_TwMgr->m_Bars.end(); ++it ) + (*it)->NotUpToDate(); + + return 1; +} + +// --------------------------------------------------------------------------- + +CTwMgr::CTwMgr(ETwGraphAPI _GraphAPI, void *_Device, int _WndID) +{ + m_GraphAPI = _GraphAPI; + m_Device = _Device; + m_WndID = _WndID; + m_LastError = NULL; + m_CurrentDbgFile = ""; + m_CurrentDbgLine = 0; + //m_Processing = false; + m_Graph = NULL; + m_WndWidth = g_InitWndWidth; + m_WndHeight = g_InitWndHeight; + m_CurrentFont = NULL; // set after by TwIntialize + m_NbMinimizedBars = 0; + m_HelpBar = NULL; + m_HelpBarNotUpToDate = true; + m_HelpBarUpdateNow = false; + m_LastHelpUpdateTime = 0; + m_LastMouseX = -1; + m_LastMouseY = -1; + m_LastMouseWheelPos = 0; + m_IconPos = 0; + m_IconAlign = 0; + m_IconMarginX = m_IconMarginY = 8; + m_FontResizable = true; + m_KeyPressedTextObj = NULL; + m_KeyPressedBuildText = false; + m_KeyPressedTime = 0; + m_InfoTextObj = NULL; + m_InfoBuildText = true; + m_BarInitColorHue = 155; + m_PopupBar = NULL; + m_TypeColor32 = TW_TYPE_UNDEF; + m_TypeColor3F = TW_TYPE_UNDEF; + m_TypeColor4F = TW_TYPE_UNDEF; + m_LastMousePressedTime = 0; + m_LastMousePressedButtonID = TW_MOUSE_MIDDLE; + m_LastMousePressedPosition[0] = -1000; + m_LastMousePressedPosition[1] = -1000; + m_RepeatMousePressedDelay = 0.5; + m_RepeatMousePressedPeriod = 0.1; + m_CanRepeatMousePressed = false; + m_IsRepeatingMousePressed = false; + m_LastDrawTime = 0; + m_UseOldColorScheme = false; + m_Contained = false; + m_ButtonAlign = BUTTON_ALIGN_RIGHT; + m_OverlapContent = false; + m_Terminating = false; + + m_CursorsCreated = false; + #if defined(ANT_UNIX) + m_CurrentXDisplay = NULL; + m_CurrentXWindow = 0; + #endif // defined(ANT_UNIX) + + m_CopyCDStringToClient = g_InitCopyCDStringToClient; + m_CopyStdStringToClient = g_InitCopyStdStringToClient; + m_ClientStdStringStructSize = 0; + m_ClientStdStringBaseType = (TwType)0; +} + +// --------------------------------------------------------------------------- + +CTwMgr::~CTwMgr() +{ +} + +// --------------------------------------------------------------------------- + +int CTwMgr::FindBar(const char *_Name) const +{ + if( _Name==NULL || strlen(_Name)<=0 ) + return -1; + int i; + for( i=0; i<(int)m_Bars.size(); ++i ) + if( m_Bars[i]!=NULL && strcmp(_Name, m_Bars[i]->m_Name.c_str())==0 ) + return i; + return -1; +} + + +// --------------------------------------------------------------------------- + +int CTwMgr::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = true; + if( _stricmp(_Attrib, "help")==0 ) + return MGR_HELP; + else if( _stricmp(_Attrib, "fontsize")==0 ) + return MGR_FONT_SIZE; + else if( _stricmp(_Attrib, "fontstyle")==0 ) + return MGR_FONT_STYLE; + else if( _stricmp(_Attrib, "iconpos")==0 ) + return MGR_ICON_POS; + else if( _stricmp(_Attrib, "iconalign")==0 ) + return MGR_ICON_ALIGN; + else if( _stricmp(_Attrib, "iconmargin")==0 ) + return MGR_ICON_MARGIN; + else if( _stricmp(_Attrib, "fontresizable")==0 ) + return MGR_FONT_RESIZABLE; + else if( _stricmp(_Attrib, "colorscheme")==0 ) + return MGR_COLOR_SCHEME; + else if( _stricmp(_Attrib, "contained")==0 ) + return MGR_CONTAINED; + else if( _stricmp(_Attrib, "buttonalign")==0 ) + return MGR_BUTTON_ALIGN; + else if( _stricmp(_Attrib, "overlap")==0 ) + return MGR_OVERLAP; + + *_HasValue = false; + return 0; // not found +} + +int CTwMgr::SetAttrib(int _AttribID, const char *_Value) +{ + switch( _AttribID ) + { + case MGR_HELP: + if( _Value && strlen(_Value)>0 ) + { + m_Help = _Value; + m_HelpBarNotUpToDate = true; + return 1; + } + else + { + SetLastError(g_ErrNoValue); + return 0; + } + case MGR_FONT_SIZE: + if( _Value && strlen(_Value)>0 ) + { + int s; + int n = sscanf(_Value, "%d", &s); + if( n==1 && s>=1 && s<=3 ) + { + if( s==1 ) + SetFont(g_DefaultSmallFont, true); + else if( s==2 ) + SetFont(g_DefaultNormalFont, true); + else if( s==3 ) + SetFont(g_DefaultLargeFont, true); + return 1; + } + else + { + SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + SetLastError(g_ErrNoValue); + return 0; + } + case MGR_FONT_STYLE: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "fixed")==0 ) + { + if( m_CurrentFont!=g_DefaultFixed1Font ) + { + SetFont(g_DefaultFixed1Font, true); + m_FontResizable = false; // for now fixed font is not resizable + } + return 1; + } + else if( _stricmp(_Value, "default")==0 ) + { + if( m_CurrentFont!=g_DefaultSmallFont && m_CurrentFont!=g_DefaultNormalFont && m_CurrentFont!=g_DefaultLargeFont ) + { + if( m_CurrentFont == g_DefaultFixed1Font ) + m_FontResizable = true; + SetFont(g_DefaultNormalFont, true); + } + return 1; + } + else + { + SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + SetLastError(g_ErrNoValue); + return 0; + } + case MGR_ICON_POS: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "bl")==0 || _stricmp(_Value, "lb")==0 || _stricmp(_Value, "bottomleft")==0 || _stricmp(_Value, "leftbottom")==0 ) + { + m_IconPos = 0; + return 1; + } + else if( _stricmp(_Value, "br")==0 || _stricmp(_Value, "rb")==0 || _stricmp(_Value, "bottomright")==0 || _stricmp(_Value, "rightbottom")==0 ) + { + m_IconPos = 1; + return 1; + } + else if( _stricmp(_Value, "tl")==0 || _stricmp(_Value, "lt")==0 || _stricmp(_Value, "topleft")==0 || _stricmp(_Value, "lefttop")==0 ) + { + m_IconPos = 2; + return 1; + } + else if( _stricmp(_Value, "tr")==0 || _stricmp(_Value, "rt")==0 || _stricmp(_Value, "topright")==0 || _stricmp(_Value, "righttop")==0 ) + { + m_IconPos = 3; + return 1; + } + else + { + SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + SetLastError(g_ErrNoValue); + return 0; + } + case MGR_ICON_ALIGN: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "vert")==0 || _stricmp(_Value, "vertical")==0 ) + { + m_IconAlign = 0; + return 1; + } + else if( _stricmp(_Value, "horiz")==0 || _stricmp(_Value, "horizontal")==0 ) + { + m_IconAlign = 1; + return 1; + } + else + { + SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + SetLastError(g_ErrNoValue); + return 0; + } + case MGR_ICON_MARGIN: + if( _Value && strlen(_Value)>0 ) + { + int x, y; + int n = sscanf(_Value, "%d%d", &x, &y); + if( n==2 && x>=0 && y>=0 ) + { + m_IconMarginX = x; + m_IconMarginY = y; + return 1; + } + else + { + SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + SetLastError(g_ErrNoValue); + return 0; + } + case MGR_FONT_RESIZABLE: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + m_FontResizable = true; + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + m_FontResizable = false; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case MGR_COLOR_SCHEME: + if( _Value && strlen(_Value)>0 ) + { + int s; + int n = sscanf(_Value, "%d", &s); + if( n==1 && s>=0 && s<=1 ) + { + if( s==0 ) + m_UseOldColorScheme = true; + else + m_UseOldColorScheme = false; + return 1; + } + else + { + SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case MGR_CONTAINED: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + m_Contained = true; + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + m_Contained = false; + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + vector::iterator barIt; + for( barIt=g_TwMgr->m_Bars.begin(); barIt!=g_TwMgr->m_Bars.end(); ++barIt ) + if( (*barIt)!=NULL ) + (*barIt)->m_Contained = m_Contained; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case MGR_BUTTON_ALIGN: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "left")==0 ) + m_ButtonAlign = BUTTON_ALIGN_LEFT; + else if( _stricmp(_Value, "center")==0 ) + m_ButtonAlign = BUTTON_ALIGN_CENTER; + else if( _stricmp(_Value, "right")==0 ) + m_ButtonAlign = BUTTON_ALIGN_RIGHT; + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + vector::iterator barIt; + for( barIt=g_TwMgr->m_Bars.begin(); barIt!=g_TwMgr->m_Bars.end(); ++barIt ) + if( (*barIt)!=NULL ) + (*barIt)->m_ButtonAlign = m_ButtonAlign; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case MGR_OVERLAP: + if( _Value && strlen(_Value)>0 ) + { + if( _stricmp(_Value, "1")==0 || _stricmp(_Value, "true")==0 ) + { + m_OverlapContent = true; + return 1; + } + else if( _stricmp(_Value, "0")==0 || _stricmp(_Value, "false")==0 ) + { + m_OverlapContent = false; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return 0; + } +} + +ERetType CTwMgr::GetAttrib(int _AttribID, std::vector& outDoubles, std::ostringstream& outString) const +{ + outDoubles.clear(); + outString.clear(); + + switch( _AttribID ) + { + case MGR_HELP: + outString << m_Help; + return RET_STRING; + case MGR_FONT_SIZE: + if( m_CurrentFont==g_DefaultSmallFont ) + outDoubles.push_back(1); + else if( m_CurrentFont==g_DefaultNormalFont ) + outDoubles.push_back(2); + else if( m_CurrentFont==g_DefaultLargeFont ) + outDoubles.push_back(3); + else + outDoubles.push_back(0); // should not happened + return RET_DOUBLE; + case MGR_FONT_STYLE: + if( m_CurrentFont==g_DefaultFixed1Font ) + outString << "fixed"; + else + outString << "default"; + return RET_STRING; + case MGR_ICON_POS: + if( m_IconPos==0 ) + outString << "bottomleft"; + else if( m_IconPos==1 ) + outString << "bottomright"; + else if( m_IconPos==2 ) + outString << "topleft"; + else if( m_IconPos==3 ) + outString << "topright"; + else + outString << "undefined"; // should not happened + return RET_STRING; + case MGR_ICON_ALIGN: + if( m_IconAlign==0 ) + outString << "vertical"; + else if( m_IconAlign==1 ) + outString << "horizontal"; + else + outString << "undefined"; // should not happened + return RET_STRING; + case MGR_ICON_MARGIN: + outDoubles.push_back(m_IconMarginX); + outDoubles.push_back(m_IconMarginY); + return RET_DOUBLE; + case MGR_FONT_RESIZABLE: + outDoubles.push_back(m_FontResizable); + return RET_DOUBLE; + case MGR_COLOR_SCHEME: + outDoubles.push_back(m_UseOldColorScheme ? 0 : 1); + return RET_DOUBLE; + case MGR_CONTAINED: + { + bool contained = m_Contained; + /* + if( contained ) + { + vector::iterator barIt; + for( barIt=g_TwMgr->m_Bars.begin(); barIt!=g_TwMgr->m_Bars.end(); ++barIt ) + if( (*barIt)!=NULL && !(*barIt)->m_Contained ) + { + contained = false; + break; + } + } + */ + outDoubles.push_back(contained); + return RET_DOUBLE; + } + case MGR_BUTTON_ALIGN: + if( m_ButtonAlign==BUTTON_ALIGN_LEFT ) + outString << "left"; + else if( m_ButtonAlign==BUTTON_ALIGN_CENTER ) + outString << "center"; + else + outString << "right"; + return RET_STRING; + case MGR_OVERLAP: + outDoubles.push_back(m_OverlapContent); + return RET_DOUBLE; + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return RET_ERROR; + } +} + +// --------------------------------------------------------------------------- + +void CTwMgr::Minimize(TwBar *_Bar) +{ + assert(m_Graph!=NULL && _Bar!=NULL); + assert(m_Bars.size()==m_MinOccupied.size()); + if( _Bar->m_IsMinimized ) + return; + if( _Bar->m_Visible ) + { + size_t i = m_NbMinimizedBars; + m_NbMinimizedBars++; + for( i=0; im_MinNumber = (int)i; + } + else + _Bar->m_MinNumber = -1; + _Bar->m_IsMinimized = true; + _Bar->NotUpToDate(); +} + +// --------------------------------------------------------------------------- + +void CTwMgr::Maximize(TwBar *_Bar) +{ + assert(m_Graph!=NULL && _Bar!=NULL); + assert(m_Bars.size()==m_MinOccupied.size()); + if( !_Bar->m_IsMinimized ) + return; + if( _Bar->m_Visible ) + { + --m_NbMinimizedBars; + if( m_NbMinimizedBars<0 ) + m_NbMinimizedBars = 0; + if( _Bar->m_MinNumber>=0 && _Bar->m_MinNumber<(int)m_MinOccupied.size() ) + m_MinOccupied[_Bar->m_MinNumber] = false; + } + _Bar->m_IsMinimized = false; + _Bar->NotUpToDate(); + if( _Bar->m_IsHelpBar ) + m_HelpBarNotUpToDate = true; +} + +// --------------------------------------------------------------------------- + +void CTwMgr::Hide(TwBar *_Bar) +{ + assert(m_Graph!=NULL && _Bar!=NULL); + if( !_Bar->m_Visible ) + return; + if( _Bar->IsMinimized() ) + { + Maximize(_Bar); + _Bar->m_Visible = false; + Minimize(_Bar); + } + else + _Bar->m_Visible = false; + if( !_Bar->m_IsHelpBar ) + m_HelpBarNotUpToDate = true; +} + +// --------------------------------------------------------------------------- + +void CTwMgr::Unhide(TwBar *_Bar) +{ + assert(m_Graph!=NULL && _Bar!=NULL); + if( _Bar->m_Visible ) + return; + if( _Bar->IsMinimized() ) + { + Maximize(_Bar); + _Bar->m_Visible = true; + Minimize(_Bar); + } + else + _Bar->m_Visible = true; + _Bar->NotUpToDate(); + if( !_Bar->m_IsHelpBar ) + m_HelpBarNotUpToDate = true; +} + +// --------------------------------------------------------------------------- + +void CTwMgr::SetFont(const CTexFont *_Font, bool _ResizeBars) +{ + assert(m_Graph!=NULL); + assert(_Font!=NULL); + + m_CurrentFont = _Font; + + for( int i=0; i<(int)m_Bars.size(); ++i ) + if( m_Bars[i]!=NULL ) + { + int fh = m_Bars[i]->m_Font->m_CharHeight; + m_Bars[i]->m_Font = _Font; + if( _ResizeBars ) + { + if( m_Bars[i]->m_Movable ) + { + m_Bars[i]->m_PosX += (3*(fh-_Font->m_CharHeight))/2; + m_Bars[i]->m_PosY += (fh-_Font->m_CharHeight)/2; + } + if( m_Bars[i]->m_Resizable ) + { + m_Bars[i]->m_Width = (m_Bars[i]->m_Width*_Font->m_CharHeight)/fh; + m_Bars[i]->m_Height = (m_Bars[i]->m_Height*_Font->m_CharHeight)/fh; + m_Bars[i]->m_ValuesWidth = (m_Bars[i]->m_ValuesWidth*_Font->m_CharHeight)/fh; + } + } + m_Bars[i]->NotUpToDate(); + } + + if( g_TwMgr->m_HelpBar!=NULL ) + g_TwMgr->m_HelpBar->Update(); + g_TwMgr->m_InfoBuildText = true; + g_TwMgr->m_KeyPressedBuildText = true; + m_HelpBarNotUpToDate = true; +} + +// --------------------------------------------------------------------------- + +void ANT_CALL TwGlobalError(const char *_ErrorMessage) // to be called when g_TwMasterMgr is not created +{ + if( g_ErrorHandler==NULL ) + { + fprintf(stderr, "ERROR(AntTweakBar) >> %s\n", _ErrorMessage); + #ifdef ANT_WINDOWS + OutputDebugString("ERROR(AntTweakBar) >> "); + OutputDebugString(_ErrorMessage); + OutputDebugString("\n"); + #endif // ANT_WINDOWS + } + else + g_ErrorHandler(_ErrorMessage); + + if( g_BreakOnError ) + abort(); +} + +// --------------------------------------------------------------------------- + +void CTwMgr::SetLastError(const char *_ErrorMessage) // _ErrorMessage must be a static string +{ + if (this != g_TwMasterMgr) + { + // route to master + g_TwMasterMgr->SetLastError(_ErrorMessage); + return; + } + + m_LastError = _ErrorMessage; + + if( g_ErrorHandler==NULL ) + { + if( m_CurrentDbgFile!=NULL && strlen(m_CurrentDbgFile)>0 && m_CurrentDbgLine>0 ) + fprintf(stderr, "%s(%d): ", m_CurrentDbgFile, m_CurrentDbgLine); + fprintf(stderr, "ERROR(AntTweakBar) >> %s\n", m_LastError); + #ifdef ANT_WINDOWS + if( m_CurrentDbgFile!=NULL && strlen(m_CurrentDbgFile)>0 && m_CurrentDbgLine>0 ) + { + OutputDebugString(m_CurrentDbgFile); + char sl[32]; + sprintf(sl, "(%d): ", m_CurrentDbgLine); + OutputDebugString(sl); + } + OutputDebugString("ERROR(AntTweakBar) >> "); + OutputDebugString(m_LastError); + OutputDebugString("\n"); + #endif // ANT_WINDOWS + } + else + g_ErrorHandler(_ErrorMessage); + + if( g_BreakOnError ) + abort(); +} + +// --------------------------------------------------------------------------- + +const char *CTwMgr::GetLastError() +{ + if (this != g_TwMasterMgr) + { + // route to master + return g_TwMasterMgr->GetLastError(); + } + + const char *Err = m_LastError; + m_LastError = NULL; + return Err; +} + +// --------------------------------------------------------------------------- + +const char *CTwMgr::CheckLastError() const +{ + return m_LastError; +} + +// --------------------------------------------------------------------------- + +void CTwMgr::SetCurrentDbgParams(const char *dbgFile, int dbgLine) +{ + m_CurrentDbgFile = dbgFile; + m_CurrentDbgLine = dbgLine; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL __TwDbg(const char *dbgFile, int dbgLine) +{ + if( g_TwMgr!=NULL ) + g_TwMgr->SetCurrentDbgParams(dbgFile, dbgLine); + return 0; // always returns zero +} + +// --------------------------------------------------------------------------- + +void ANT_CALL TwHandleErrors(TwErrorHandler _ErrorHandler, int _BreakOnError) +{ + g_ErrorHandler = _ErrorHandler; + g_BreakOnError = (_BreakOnError) ? true : false; +} + +void ANT_CALL TwHandleErrors(TwErrorHandler _ErrorHandler) +{ + TwHandleErrors(_ErrorHandler, false); +} + +// --------------------------------------------------------------------------- + +const char *ANT_CALL TwGetLastError() +{ + if( g_TwMasterMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return g_ErrNotInit; + } + else + return g_TwMasterMgr->GetLastError(); +} + +// --------------------------------------------------------------------------- + +TwBar *ANT_CALL TwNewBar(const char *_Name) +{ + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + + TwFreeAsyncDrawing(); // For multi-thread savety + + if( _Name==NULL || strlen(_Name)<=0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return NULL; + } + if( g_TwMgr->FindBar(_Name)>=0 ) + { + g_TwMgr->SetLastError(g_ErrExist); + return NULL; + } + + if( strstr(_Name, "`")!=NULL ) + { + g_TwMgr->SetLastError(g_ErrNoBackQuote); + return NULL; + } + + if( g_TwMgr->m_PopupBar!=NULL ) // delete popup bar if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + TwBar *Bar = new CTwBar(_Name); + g_TwMgr->m_Bars.push_back(Bar); + g_TwMgr->m_Order.push_back((int)g_TwMgr->m_Bars.size()-1); + g_TwMgr->m_MinOccupied.push_back(false); + g_TwMgr->m_HelpBarNotUpToDate = true; + + return Bar; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwDeleteBar(TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + if( _Bar==g_TwMgr->m_HelpBar ) + { + g_TwMgr->SetLastError(g_ErrDelHelp); + return 0; + } + + TwFreeAsyncDrawing(); // For multi-thread savety + + vector::iterator BarIt; + int i = 0; + for( BarIt=g_TwMgr->m_Bars.begin(); BarIt!=g_TwMgr->m_Bars.end(); ++BarIt, ++i ) + if( (*BarIt)==_Bar ) + break; + if( BarIt==g_TwMgr->m_Bars.end() ) + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } + + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + // force bar to un-minimize + g_TwMgr->Maximize(_Bar); + // find an empty MinOccupied + vector::iterator itm; + int j = 0; + for( itm=g_TwMgr->m_MinOccupied.begin(); itm!=g_TwMgr->m_MinOccupied.end(); ++itm, ++j) + if( (*itm)==false ) + break; + assert( itm!=g_TwMgr->m_MinOccupied.end() ); + // shift MinNumbers and erase the empty MinOccupied + for( size_t k=0; km_Bars.size(); ++k ) + if( g_TwMgr->m_Bars[k]!=NULL && g_TwMgr->m_Bars[k]->m_MinNumber>j ) + g_TwMgr->m_Bars[k]->m_MinNumber -= 1; + g_TwMgr->m_MinOccupied.erase(itm); + // erase _Bar order + vector::iterator BarOrderIt = g_TwMgr->m_Order.end(); + for(vector::iterator it=g_TwMgr->m_Order.begin(); it!=g_TwMgr->m_Order.end(); ++it ) + if( (*it)==i ) + BarOrderIt = it; + else if( (*it)>i ) + (*it) -= 1; + assert( BarOrderIt!=g_TwMgr->m_Order.end() ); + g_TwMgr->m_Order.erase(BarOrderIt); + + // erase & delete _Bar + g_TwMgr->m_Bars.erase(BarIt); + delete _Bar; + + g_TwMgr->m_HelpBarNotUpToDate = true; + return 1; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwDeleteAllBars() +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + + TwFreeAsyncDrawing(); // For multi-thread savety + + int n = 0; + if( g_TwMgr->m_Terminating || g_TwMgr->m_HelpBar==NULL ) + { + for( size_t i=0; im_Bars.size(); ++i ) + if( g_TwMgr->m_Bars[i]!=NULL ) + { + ++n; + delete g_TwMgr->m_Bars[i]; + g_TwMgr->m_Bars[i] = NULL; + } + g_TwMgr->m_Bars.clear(); + g_TwMgr->m_Order.clear(); + g_TwMgr->m_MinOccupied.clear(); + g_TwMgr->m_HelpBarNotUpToDate = true; + } + else + { + vector bars = g_TwMgr->m_Bars; + for( size_t i = 0; i < bars.size(); ++i ) + if( bars[i]!=0 && bars[i]!=g_TwMgr->m_HelpBar) + { + ++n; + TwDeleteBar(bars[i]); + } + g_TwMgr->m_HelpBarNotUpToDate = true; + } + + if( n==0 ) + { + //g_TwMgr->SetLastError(g_ErrNthToDo); + return 0; + } + else + return 1; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwSetTopBar(const TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + TwFreeAsyncDrawing(); // For multi-thread savety + + if( _Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_BarAlwaysOnBottom.length()>0 ) + { + if( strcmp(_Bar->m_Name.c_str(), g_TwMgr->m_BarAlwaysOnBottom.c_str())==0 ) + return TwSetBottomBar(_Bar); + } + + int i = -1, iOrder; + for( iOrder=0; iOrder<(int)g_TwMgr->m_Bars.size(); ++iOrder ) + { + i = g_TwMgr->m_Order[iOrder]; + assert( i>=0 && i<(int)g_TwMgr->m_Bars.size() ); + if( g_TwMgr->m_Bars[i]==_Bar ) + break; + } + if( i<0 || iOrder>=(int)g_TwMgr->m_Bars.size() ) // bar not found + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } + + for( int j=iOrder; j<(int)g_TwMgr->m_Bars.size()-1; ++j ) + g_TwMgr->m_Order[j] = g_TwMgr->m_Order[j+1]; + g_TwMgr->m_Order[(int)g_TwMgr->m_Bars.size()-1] = i; + + if( _Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_BarAlwaysOnTop.length()>0 ) + { + int topIdx = g_TwMgr->FindBar(g_TwMgr->m_BarAlwaysOnTop.c_str()); + TwBar *top = (topIdx>=0 && topIdx<(int)g_TwMgr->m_Bars.size()) ? g_TwMgr->m_Bars[topIdx] : NULL; + if( top!=NULL && top!=_Bar ) + TwSetTopBar(top); + } + + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar ) + TwSetTopBar(g_TwMgr->m_PopupBar); + + return 1; +} + +// --------------------------------------------------------------------------- + +TwBar * ANT_CALL TwGetTopBar() +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + + if( g_TwMgr->m_Bars.size()>0 && g_TwMgr->m_PopupBar==NULL ) + return g_TwMgr->m_Bars[g_TwMgr->m_Order[ g_TwMgr->m_Bars.size()-1 ]]; + else if( g_TwMgr->m_Bars.size()>1 && g_TwMgr->m_PopupBar!=NULL ) + return g_TwMgr->m_Bars[g_TwMgr->m_Order[ g_TwMgr->m_Bars.size()-2 ]]; + else + return NULL; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwSetBottomBar(const TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + TwFreeAsyncDrawing(); // For multi-thread savety + + if( _Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_BarAlwaysOnTop.length()>0 ) + { + if( strcmp(_Bar->m_Name.c_str(), g_TwMgr->m_BarAlwaysOnTop.c_str())==0 ) + return TwSetTopBar(_Bar); + } + + int i = -1, iOrder; + for( iOrder=0; iOrder<(int)g_TwMgr->m_Bars.size(); ++iOrder ) + { + i = g_TwMgr->m_Order[iOrder]; + assert( i>=0 && i<(int)g_TwMgr->m_Bars.size() ); + if( g_TwMgr->m_Bars[i]==_Bar ) + break; + } + if( i<0 || iOrder>=(int)g_TwMgr->m_Bars.size() ) // bar not found + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } + + if( iOrder>0 ) + for( int j=iOrder-1; j>=0; --j ) + g_TwMgr->m_Order[j+1] = g_TwMgr->m_Order[j]; + g_TwMgr->m_Order[0] = i; + + if( _Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_BarAlwaysOnBottom.length()>0 ) + { + int btmIdx = g_TwMgr->FindBar(g_TwMgr->m_BarAlwaysOnBottom.c_str()); + TwBar *btm = (btmIdx>=0 && btmIdx<(int)g_TwMgr->m_Bars.size()) ? g_TwMgr->m_Bars[btmIdx] : NULL; + if( btm!=NULL && btm!=_Bar ) + TwSetBottomBar(btm); + } + + return 1; +} + +// --------------------------------------------------------------------------- + +TwBar* ANT_CALL TwGetBottomBar() +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + + if( g_TwMgr->m_Bars.size()>0 ) + return g_TwMgr->m_Bars[g_TwMgr->m_Order[0]]; + else + return NULL; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwSetBarState(TwBar *_Bar, TwState _State) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + TwFreeAsyncDrawing(); // For multi-thread savety + + switch( _State ) + { + case TW_STATE_SHOWN: + g_TwMgr->Unhide(_Bar); + return 1; + case TW_STATE_ICONIFIED: + //g_TwMgr->Unhide(_Bar); + g_TwMgr->Minimize(_Bar); + return 1; + case TW_STATE_HIDDEN: + //g_TwMgr->Maximize(_Bar); + g_TwMgr->Hide(_Bar); + return 1; + case TW_STATE_UNICONIFIED: + //g_TwMgr->Unhide(_Bar); + g_TwMgr->Maximize(_Bar); + return 1; + default: + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } +} + +// --------------------------------------------------------------------------- + +/* +TwState ANT_CALL TwGetBarState(const TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return TW_STATE_ERROR; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return TW_STATE_ERROR; + } + + if( !_Bar->m_Visible ) + return TW_STATE_HIDDEN; + else if( _Bar->IsMinimized() ) + return TW_STATE_ICONIFIED; + else + return TW_STATE_SHOWN; +} +*/ + +// --------------------------------------------------------------------------- + +const char * ANT_CALL TwGetBarName(const TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return NULL; + } + vector::iterator BarIt; + int i = 0; + for( BarIt=g_TwMgr->m_Bars.begin(); BarIt!=g_TwMgr->m_Bars.end(); ++BarIt, ++i ) + if( (*BarIt)==_Bar ) + break; + if( BarIt==g_TwMgr->m_Bars.end() ) + { + g_TwMgr->SetLastError(g_ErrNotFound); + return NULL; + } + + return _Bar->m_Name.c_str(); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwGetBarCount() +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + + return (int)g_TwMgr->m_Bars.size(); +} + + +// --------------------------------------------------------------------------- + +TwBar * ANT_CALL TwGetBarByIndex(int index) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + + if( index>=0 && index<(int)g_TwMgr->m_Bars.size() ) + return g_TwMgr->m_Bars[index]; + else + { + g_TwMgr->SetLastError(g_ErrOutOfRange); + return NULL; + } +} + +// --------------------------------------------------------------------------- + +TwBar * ANT_CALL TwGetBarByName(const char *name) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + + int idx = g_TwMgr->FindBar(name); + if ( idx>=0 && idx<(int)g_TwMgr->m_Bars.size() ) + return g_TwMgr->m_Bars[idx]; + else + return NULL; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwRefreshBar(TwBar *bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( bar==NULL ) + { + vector::iterator BarIt; + for( BarIt=g_TwMgr->m_Bars.begin(); BarIt!=g_TwMgr->m_Bars.end(); ++BarIt ) + if( *BarIt!=NULL ) + (*BarIt)->NotUpToDate(); + } + else + { + vector::iterator BarIt; + int i = 0; + for( BarIt=g_TwMgr->m_Bars.begin(); BarIt!=g_TwMgr->m_Bars.end(); ++BarIt, ++i ) + if( (*BarIt)==bar ) + break; + if( BarIt==g_TwMgr->m_Bars.end() ) + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } + + bar->NotUpToDate(); + } + return 1; +} + +// --------------------------------------------------------------------------- + +int BarVarHasAttrib(CTwBar *_Bar, CTwVar *_Var, const char *_Attrib, bool *_HasValue); +int BarVarSetAttrib(CTwBar *_Bar, CTwVar *_Var, CTwVarGroup *_VarParent, int _VarIndex, int _AttribID, const char *_Value); +ERetType BarVarGetAttrib(CTwBar *_Bar, CTwVar *_Var, CTwVarGroup *_VarParent, int _VarIndex, int _AttribID, std::vector& outDouble, std::ostringstream& outString); + + +int ANT_CALL TwGetParam(TwBar *bar, const char *varName, const char *paramName, TwParamValueType paramValueType, unsigned int outValueMaxCount, void *outValues) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( paramName==NULL || strlen(paramName)<=0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + if( outValueMaxCount<=0 || outValues==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + if( bar==NULL ) + bar = TW_GLOBAL_BAR; + else + { + vector::iterator barIt; + int i = 0; + for( barIt=g_TwMgr->m_Bars.begin(); barIt!=g_TwMgr->m_Bars.end(); ++barIt, ++i ) + if( (*barIt)==bar ) + break; + if( barIt==g_TwMgr->m_Bars.end() ) + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } + } + CTwVarGroup *varParent = NULL; + int varIndex = -1; + CTwVar *var = NULL; + if( varName!=NULL && strlen(varName)>0 ) + { + var = bar->Find(varName, &varParent, &varIndex); + if( var==NULL ) + { + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Unknown var '%s/%s'", + (bar==TW_GLOBAL_BAR) ? "GLOBAL" : bar->m_Name.c_str(), varName); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + } + + bool hasValue = false; + int paramID = BarVarHasAttrib(bar, var, paramName, &hasValue); + if( paramID>0 ) + { + std::ostringstream valStr; + std::vector valDbl; + const char *PrevLastErrorPtr = g_TwMgr->CheckLastError(); + + ERetType retType = BarVarGetAttrib(bar, var, varParent, varIndex, paramID, valDbl, valStr); + unsigned int i, valDblCount = (unsigned int)valDbl.size(); + if( valDblCount > outValueMaxCount ) + valDblCount = outValueMaxCount; + if( retType==RET_DOUBLE && valDblCount==0 ) + { + g_TwMgr->SetLastError(g_ErrHasNoValue); + retType = RET_ERROR; + } + + if( retType==RET_DOUBLE ) + { + switch( paramValueType ) + { + case TW_PARAM_INT32: + for( i=0; i(outValues))[i] = (int)valDbl[i]; + return valDblCount; + case TW_PARAM_FLOAT: + for( i=0; i(outValues))[i] = (float)valDbl[i]; + return valDblCount; + case TW_PARAM_DOUBLE: + for( i=0; i(outValues))[i] = valDbl[i]; + return valDblCount; + case TW_PARAM_CSTRING: + valStr.clear(); + for( i=0; i<(unsigned int)valDbl.size(); i++ ) // not valDblCount here + valStr << ((i>0) ? " " : "") << valDbl[i]; + strncpy(static_cast(outValues), valStr.str().c_str(), outValueMaxCount); + i = (unsigned int)valStr.str().size(); + if( i>outValueMaxCount-1 ) + i = outValueMaxCount-1; + (static_cast(outValues))[i] = '\0'; + return 1; // always returns 1 for CSTRING + default: + g_TwMgr->SetLastError(g_ErrBadParam); // Unknown param value type + retType = RET_ERROR; + } + } + else if( retType==RET_STRING ) + { + if( paramValueType == TW_PARAM_CSTRING ) + { + strncpy(static_cast(outValues), valStr.str().c_str(), outValueMaxCount); + i = (unsigned int)valStr.str().size(); + if( i>outValueMaxCount-1 ) + i = outValueMaxCount-1; + (static_cast(outValues))[i] = '\0'; + return 1; // always returns 1 for CSTRING + } + else + { + g_TwMgr->SetLastError(g_ErrBadType); // string cannot be converted to int or double + retType = RET_ERROR; + } + } + + if( retType==RET_ERROR ) + { + bool errMsg = (g_TwMgr->CheckLastError()!=NULL && strlen(g_TwMgr->CheckLastError())>0 && PrevLastErrorPtr!=g_TwMgr->CheckLastError()); + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Unable to get param '%s%s%s %s' %s%s", + (bar==TW_GLOBAL_BAR) ? "GLOBAL" : bar->m_Name.c_str(), (var!=NULL) ? "/" : "", + (var!=NULL) ? varName : "", paramName, errMsg ? " : " : "", + errMsg ? g_TwMgr->CheckLastError() : ""); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + } + return retType; + } + else + { + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Unknown param '%s%s%s %s'", + (bar==TW_GLOBAL_BAR) ? "GLOBAL" : bar->m_Name.c_str(), + (var!=NULL) ? "/" : "", (var!=NULL) ? varName : "", paramName); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } +} + + +int ANT_CALL TwSetParam(TwBar *bar, const char *varName, const char *paramName, TwParamValueType paramValueType, unsigned int inValueCount, const void *inValues) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( paramName==NULL || strlen(paramName)<=0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + if( inValueCount>0 && inValues==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + TwFreeAsyncDrawing(); // For multi-thread savety + + if( bar==NULL ) + bar = TW_GLOBAL_BAR; + else + { + vector::iterator barIt; + int i = 0; + for( barIt=g_TwMgr->m_Bars.begin(); barIt!=g_TwMgr->m_Bars.end(); ++barIt, ++i ) + if( (*barIt)==bar ) + break; + if( barIt==g_TwMgr->m_Bars.end() ) + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } + } + CTwVarGroup *varParent = NULL; + int varIndex = -1; + CTwVar *var = NULL; + if( varName!=NULL && strlen(varName)>0 ) + { + var = bar->Find(varName, &varParent, &varIndex); + if( var==NULL ) + { + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Unknown var '%s/%s'", + (bar==TW_GLOBAL_BAR) ? "GLOBAL" : bar->m_Name.c_str(), varName); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + } + + bool hasValue = false; + int paramID = BarVarHasAttrib(bar, var, paramName, &hasValue); + if( paramID>0 ) + { + int ret = 0; + const char *PrevLastErrorPtr = g_TwMgr->CheckLastError(); + if( hasValue ) + { + std::ostringstream valuesStr; + unsigned int i; + switch( paramValueType ) + { + case TW_PARAM_INT32: + for( i=0; i(inValues))[i] << ((i(inValues))[i] << ((i(inValues))[i] << ((i(inValues))[i]; + for( const char *ch = str; *ch!=0; ch++ ) + if( *ch=='`' ) + valuesStr << "`'`'`"; + else + valuesStr << *ch; + valuesStr << "` "; + } + */ + if( inValueCount!=1 ) + { + g_TwMgr->SetLastError(g_ErrCStrParam); // count for CString param must be 1 + return 0; + } + else + valuesStr << static_cast(inValues); + break; + default: + g_TwMgr->SetLastError(g_ErrBadParam); // Unknown param value type + return 0; + } + ret = BarVarSetAttrib(bar, var, varParent, varIndex, paramID, valuesStr.str().c_str()); + } + else + ret = BarVarSetAttrib(bar, var, varParent, varIndex, paramID, NULL); + if( ret==0 ) + { + bool errMsg = (g_TwMgr->CheckLastError()!=NULL && strlen(g_TwMgr->CheckLastError())>0 && PrevLastErrorPtr!=g_TwMgr->CheckLastError()); + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Unable to set param '%s%s%s %s' %s%s", + (bar==TW_GLOBAL_BAR) ? "GLOBAL" : bar->m_Name.c_str(), (var!=NULL) ? "/" : "", + (var!=NULL) ? varName : "", paramName, errMsg ? " : " : "", + errMsg ? g_TwMgr->CheckLastError() : ""); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + } + return ret; + } + else + { + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Unknown param '%s%s%s %s'", + (bar==TW_GLOBAL_BAR) ? "GLOBAL" : bar->m_Name.c_str(), + (var!=NULL) ? "/" : "", (var!=NULL) ? varName : "", paramName); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } +} + +// --------------------------------------------------------------------------- + +static int s_PassProxy = 0; +void *CTwMgr::CStruct::s_PassProxyAsClientData = &s_PassProxy; // special tag + +CTwMgr::CStructProxy::CStructProxy() +{ + memset(this, 0, sizeof(*this)); +} + +CTwMgr::CStructProxy::~CStructProxy() +{ + if( m_StructData!=NULL && m_DeleteStructData ) + { + //if( m_StructExtData==NULL && g_TwMgr!=NULL && m_Type>=TW_TYPE_STRUCT_BASE && m_Typem_Structs.size() ) + // g_TwMgr->UninitVarData(m_Type, m_StructData, g_TwMgr->m_Structs[m_Type-TW_TYPE_STRUCT_BASE].m_Size); + delete[] (char*)m_StructData; + } + if( m_StructExtData!=NULL ) + { + //if( g_TwMgr!=NULL && m_Type>=TW_TYPE_STRUCT_BASE && m_Typem_Structs.size() ) + // g_TwMgr->UninitVarData(m_Type, m_StructExtData, g_TwMgr->m_Structs[m_Type-TW_TYPE_STRUCT_BASE].m_Size); + delete[] (char*)m_StructExtData; + } + memset(this, 0, sizeof(*this)); +} + +/* +void CTwMgr::InitVarData(TwType _Type, void *_Data, size_t _Size) +{ + if( _Data!=NULL ) + { + if( _Type>=TW_TYPE_STRUCT_BASE && _Type=TW_TYPE_STRUCT_BASE && _Type~string(); + memset(_Data, 0, _Size); + } + else + memset(_Data, 0, _Size); + } +} +*/ + +void CTwMgr::UnrollCDStdString(std::vector& _Records, TwType _Type, void *_Data) +{ + if( _Data!=NULL ) + { + if( _Type>=TW_TYPE_STRUCT_BASE && _Type& _Records) +{ + for( size_t i=0; i<_Records.size(); ++i ) + memcpy(_Records[i].m_DataPtr, _Records[i].m_PrevValue, m_ClientStdStringStructSize); +} + +CTwMgr::CMemberProxy::CMemberProxy() +{ + memset(this, 0, sizeof(*this)); +} + +CTwMgr::CMemberProxy::~CMemberProxy() +{ + memset(this, 0, sizeof(*this)); +} + +void ANT_CALL CTwMgr::CMemberProxy::SetCB(const void *_Value, void *_ClientData) +{ + if( _ClientData && _Value ) + { + const CMemberProxy *mProxy = static_cast(_ClientData); + if( g_TwMgr && mProxy ) + { + const CStructProxy *sProxy = mProxy->m_StructProxy; + if( sProxy && sProxy->m_StructData && sProxy->m_Type>=TW_TYPE_STRUCT_BASE && sProxy->m_Typem_Structs.size() ) + { + CTwMgr::CStruct& s = g_TwMgr->m_Structs[sProxy->m_Type-TW_TYPE_STRUCT_BASE]; + if( mProxy->m_MemberIndex>=0 && mProxy->m_MemberIndex<(int)s.m_Members.size() ) + { + CTwMgr::CStructMember& m = s.m_Members[mProxy->m_MemberIndex]; + if( m.m_Size>0 && m.m_Type!=TW_TYPE_BUTTON ) + { + if( s.m_IsExt ) + { + memcpy((char *)sProxy->m_StructExtData + m.m_Offset, _Value, m.m_Size); + if( s.m_CopyVarFromExtCallback && sProxy->m_StructExtData ) + s.m_CopyVarFromExtCallback(sProxy->m_StructData, sProxy->m_StructExtData, mProxy->m_MemberIndex, (s.m_ExtClientData==s.s_PassProxyAsClientData) ? _ClientData : s.m_ExtClientData); + } + else + memcpy((char *)sProxy->m_StructData + m.m_Offset, _Value, m.m_Size); + if( sProxy->m_StructSetCallback ) + { + g_TwMgr->m_CDStdStringRecords.resize(0); + g_TwMgr->UnrollCDStdString(g_TwMgr->m_CDStdStringRecords, sProxy->m_Type, sProxy->m_StructData); + sProxy->m_StructSetCallback(sProxy->m_StructData, sProxy->m_StructClientData); + g_TwMgr->RestoreCDStdString(g_TwMgr->m_CDStdStringRecords); + } + } + } + } + } + } +} + +void ANT_CALL CTwMgr::CMemberProxy::GetCB(void *_Value, void *_ClientData) +{ + if( _ClientData && _Value ) + { + const CMemberProxy *mProxy = static_cast(_ClientData); + if( g_TwMgr && mProxy ) + { + const CStructProxy *sProxy = mProxy->m_StructProxy; + if( sProxy && sProxy->m_StructData && sProxy->m_Type>=TW_TYPE_STRUCT_BASE && sProxy->m_Typem_Structs.size() ) + { + CTwMgr::CStruct& s = g_TwMgr->m_Structs[sProxy->m_Type-TW_TYPE_STRUCT_BASE]; + if( mProxy->m_MemberIndex>=0 && mProxy->m_MemberIndex<(int)s.m_Members.size() ) + { + CTwMgr::CStructMember& m = s.m_Members[mProxy->m_MemberIndex]; + if( m.m_Size>0 && m.m_Type!=TW_TYPE_BUTTON ) + { + if( sProxy->m_StructGetCallback ) + sProxy->m_StructGetCallback(sProxy->m_StructData, sProxy->m_StructClientData); + if( s.m_IsExt ) + { + if( s.m_CopyVarToExtCallback && sProxy->m_StructExtData ) + s.m_CopyVarToExtCallback(sProxy->m_StructData, sProxy->m_StructExtData, mProxy->m_MemberIndex, (s.m_ExtClientData==s.s_PassProxyAsClientData) ? _ClientData : s.m_ExtClientData); + memcpy(_Value, (char *)sProxy->m_StructExtData + m.m_Offset, m.m_Size); + } + else + memcpy(_Value, (char *)sProxy->m_StructData + m.m_Offset, m.m_Size); + } + } + } + } + } +} + +// --------------------------------------------------------------------------- + +void ANT_CALL CTwMgr::CCDStdString::SetCB(const void *_Value, void *_ClientData) +{ + if( _Value==NULL || _ClientData==NULL || g_TwMgr==NULL ) + return; + CTwMgr::CCDStdString *CDStdString = (CTwMgr::CCDStdString *)_ClientData; + const char *SrcStr = *(const char **)_Value; + if( SrcStr==NULL ) + { + static char s_EmptyString[] = ""; + SrcStr = s_EmptyString; + } + if( CDStdString->m_ClientSetCallback==NULL ) + { + if( g_TwMgr->m_CopyStdStringToClient && CDStdString->m_ClientStdStringPtr!=NULL ) + { + CTwMgr::CClientStdString clientSrcStr; // convert VC++ Release/Debug std::string + clientSrcStr.FromLib(SrcStr); + g_TwMgr->m_CopyStdStringToClient(*(CDStdString->m_ClientStdStringPtr), clientSrcStr.ToClient()); + } + } + else + { + if( CDStdString->m_ClientSetCallback==CMemberProxy::SetCB ) + CDStdString->m_ClientSetCallback(&SrcStr, CDStdString->m_ClientData); + else + { + CTwMgr::CClientStdString clientSrcStr; // convert VC++ Release/Debug std::string + clientSrcStr.FromLib(SrcStr); + std::string& ValStr = clientSrcStr.ToClient(); + CDStdString->m_ClientSetCallback(&ValStr, CDStdString->m_ClientData); + } + } +} + +void ANT_CALL CTwMgr::CCDStdString::GetCB(void *_Value, void *_ClientData) +{ + if( _Value==NULL || _ClientData==NULL || g_TwMgr==NULL ) + return; + CTwMgr::CCDStdString *CDStdString = (CTwMgr::CCDStdString *)_ClientData; + char **DstStrPtr = (char **)_Value; + if( CDStdString->m_ClientGetCallback==NULL ) + { + if( CDStdString->m_ClientStdStringPtr!=NULL ) + { + //*DstStrPtr = const_cast(CDStdString->m_ClientStdStringPtr->c_str()); + static CTwMgr::CLibStdString s_LibStr; // static because it will be used as a returned value + s_LibStr.FromClient(*CDStdString->m_ClientStdStringPtr); + *DstStrPtr = const_cast(s_LibStr.ToLib().c_str()); + } + else + { + static char s_EmptyString[] = ""; + *DstStrPtr = s_EmptyString; + } + } + else + { + // m_ClientGetCallback uses TwCopyStdStringToLibrary to copy string + // and TwCopyStdStringToLibrary does the VC++ Debug/Release std::string conversion. + CDStdString->m_ClientGetCallback(&(CDStdString->m_LocalString[0]), CDStdString->m_ClientData); + //*DstStrPtr = const_cast(CDStdString->m_LocalString.c_str()); + char **StrPtr = (char **)&(CDStdString->m_LocalString[0]); + *DstStrPtr = *StrPtr; + } +} + +// --------------------------------------------------------------------------- + +static int s_SeparatorTag = 0; + +// --------------------------------------------------------------------------- + +static int AddVar(TwBar *_Bar, const char *_Name, ETwType _Type, void *_VarPtr, bool _ReadOnly, TwSetVarCallback _SetCallback, TwGetVarCallback _GetCallback, TwButtonCallback _ButtonCallback, void *_ClientData, const char *_Def) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + + char unnamedVarName[64]; + if( _Name==NULL || strlen(_Name)==0 ) // create a name automatically + { + static unsigned int s_UnnamedVarCount = 0; + _snprintf(unnamedVarName, sizeof(unnamedVarName), "TW_UNNAMED_%04X", s_UnnamedVarCount); + _Name = unnamedVarName; + ++s_UnnamedVarCount; + } + + if( _Bar==NULL || _Name==NULL || strlen(_Name)==0 || (_VarPtr==NULL && _GetCallback==NULL && _Type!=TW_TYPE_BUTTON) ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + if( _Bar->Find(_Name)!=NULL ) + { + g_TwMgr->SetLastError(g_ErrExist); + return 0; + } + + if( strstr(_Name, "`")!=NULL ) + { + g_TwMgr->SetLastError(g_ErrNoBackQuote); + return 0; + } + + if( _VarPtr==NULL && _Type!=TW_TYPE_BUTTON && _GetCallback!=NULL && _SetCallback==NULL ) + _ReadOnly = true; // force readonly in this case + + // Convert color types + if( _Type==TW_TYPE_COLOR32 ) + _Type = g_TwMgr->m_TypeColor32; + else if( _Type==TW_TYPE_COLOR3F ) + _Type = g_TwMgr->m_TypeColor3F; + else if( _Type==TW_TYPE_COLOR4F ) + _Type = g_TwMgr->m_TypeColor4F; + + // Convert rotation types + if( _Type==TW_TYPE_QUAT4F ) + _Type = g_TwMgr->m_TypeQuat4F; + else if( _Type==TW_TYPE_QUAT4D ) + _Type = g_TwMgr->m_TypeQuat4D; + else if( _Type==TW_TYPE_DIR3F ) + _Type = g_TwMgr->m_TypeDir3F; + else if( _Type==TW_TYPE_DIR3D ) + _Type = g_TwMgr->m_TypeDir3D; + + // VC++ uses a different definition of std::string in Debug and Release modes. + // sizeof(std::string) is encoded in TW_TYPE_STDSTRING to overcome this issue. + // With VS2010 the binary representation of std::string has changed too. This is + // also detected here. + if( (_Type&0xffff0000)==(TW_TYPE_STDSTRING&0xffff0000) || (_Type&0xffff0000)==TW_TYPE_STDSTRING_VS2010 || (_Type&0xffff0000)==TW_TYPE_STDSTRING_VS2008 ) + { + if( g_TwMgr->m_ClientStdStringBaseType==0 ) + g_TwMgr->m_ClientStdStringBaseType = (TwType)(_Type&0xffff0000); + + size_t clientStdStringStructSize = (_Type&0xffff); + if( g_TwMgr->m_ClientStdStringStructSize==0 ) + g_TwMgr->m_ClientStdStringStructSize = clientStdStringStructSize; + int diff = abs((int)g_TwMgr->m_ClientStdStringStructSize - (int)sizeof(std::string)); + if( g_TwMgr->m_ClientStdStringStructSize!=clientStdStringStructSize || g_TwMgr->m_ClientStdStringStructSize==0 + || (diff!=0 && diff!=sizeof(void*))) + { + g_TwMgr->SetLastError(g_ErrStdString); + return 0; + } + + _Type = TW_TYPE_STDSTRING; // force type to be our TW_TYPE_STDSTRING + } + + if( _Type==TW_TYPE_STDSTRING ) + { + g_TwMgr->m_CDStdStrings.push_back(CTwMgr::CCDStdString()); + CTwMgr::CCDStdString& CDStdString = g_TwMgr->m_CDStdStrings.back(); + CDStdString.m_ClientStdStringPtr = (std::string *)_VarPtr; + CDStdString.m_ClientSetCallback = _SetCallback; + CDStdString.m_ClientGetCallback = _GetCallback; + CDStdString.m_ClientData = _ClientData; + //CDStdString.m_This = g_TwMgr->m_CDStdStrings.end(); + //--CDStdString.m_This; + TwGetVarCallback GetCB = CTwMgr::CCDStdString::GetCB; + TwSetVarCallback SetCB = CTwMgr::CCDStdString::SetCB; + if( _VarPtr==NULL && _SetCallback==NULL ) + SetCB = NULL; + if( _VarPtr==NULL && _GetCallback==NULL ) + GetCB = NULL; + return AddVar(_Bar, _Name, TW_TYPE_CDSTDSTRING, NULL, _ReadOnly, SetCB, GetCB, NULL, &CDStdString, _Def); + } + else if( (_Type>TW_TYPE_UNDEF && _Type=TW_TYPE_ENUM_BASE && _Typem_Enums.size()) + || (_Type>TW_TYPE_CSSTRING_BASE && _Type<=TW_TYPE_CSSTRING_MAX) + || _Type==TW_TYPE_CDSTDSTRING + || IsCustomType(_Type) ) // (_Type>=TW_TYPE_CUSTOM_BASE && _Typem_Customs.size()) ) + { + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Name = _Name; + Var->m_Ptr = _VarPtr; + Var->m_Type = _Type; + Var->m_ColorPtr = &(_Bar->m_ColLabelText); + if( _VarPtr!=NULL ) + { + assert( _GetCallback==NULL && _SetCallback==NULL && _ButtonCallback==NULL ); + + Var->m_ReadOnly = _ReadOnly; + Var->m_GetCallback = NULL; + Var->m_SetCallback = NULL; + Var->m_ClientData = NULL; + } + else + { + assert( _GetCallback!=NULL || _Type==TW_TYPE_BUTTON ); + + Var->m_GetCallback = _GetCallback; + Var->m_SetCallback = _SetCallback; + Var->m_ClientData = _ClientData; + if( _Type==TW_TYPE_BUTTON ) + { + Var->m_Val.m_Button.m_Callback = _ButtonCallback; + if( _ButtonCallback==NULL && _ClientData==&s_SeparatorTag ) + { + Var->m_Val.m_Button.m_Separator = 1; + Var->m_Label = " "; + } + else if( _ButtonCallback==NULL ) + Var->m_ColorPtr = &(_Bar->m_ColStaticText); + } + if( _Type!=TW_TYPE_BUTTON ) + Var->m_ReadOnly = (_SetCallback==NULL || _ReadOnly); + else + Var->m_ReadOnly = (_ButtonCallback==NULL); + } + Var->SetDefaults(); + + if( IsCustomType(_Type) ) // _Type>=TW_TYPE_CUSTOM_BASE && _Typem_Customs.size() ) + { + if( Var->m_GetCallback==CTwMgr::CMemberProxy::GetCB && Var->m_SetCallback==CTwMgr::CMemberProxy::SetCB ) + Var->m_Val.m_Custom.m_MemberProxy = static_cast(Var->m_ClientData); + else + Var->m_Val.m_Custom.m_MemberProxy = NULL; + } + + _Bar->m_VarRoot.m_Vars.push_back(Var); + _Bar->NotUpToDate(); + g_TwMgr->m_HelpBarNotUpToDate = true; + + if( _Def!=NULL && strlen(_Def)>0 ) + { + string d = '`' + _Bar->m_Name + "`/`" + _Name + "` " + _Def; + return TwDefine(d.c_str()); + } + else + return 1; + } + else if(_Type>=TW_TYPE_STRUCT_BASE && _Typem_Structs.size()) + { + CTwMgr::CStruct& s = g_TwMgr->m_Structs[_Type-TW_TYPE_STRUCT_BASE]; + CTwMgr::CStructProxy *sProxy = NULL; + void *vPtr; + if( !s.m_IsExt ) + { + if( _VarPtr!=NULL ) + vPtr = _VarPtr; + else + { + assert( _GetCallback!=NULL || _SetCallback!=NULL ); + assert( s.m_Size>0 ); + vPtr = new char[s.m_Size]; + memset(vPtr, 0, s.m_Size); + // create a new StructProxy + g_TwMgr->m_StructProxies.push_back(CTwMgr::CStructProxy()); + sProxy = &(g_TwMgr->m_StructProxies.back()); + sProxy->m_Type = _Type; + sProxy->m_StructData = vPtr; + sProxy->m_DeleteStructData = true; + sProxy->m_StructSetCallback = _SetCallback; + sProxy->m_StructGetCallback = _GetCallback; + sProxy->m_StructClientData = _ClientData; + sProxy->m_CustomDrawCallback = NULL; + sProxy->m_CustomMouseButtonCallback = NULL; + sProxy->m_CustomMouseMotionCallback = NULL; + sProxy->m_CustomMouseLeaveCallback = NULL; + sProxy->m_CustomCaptureFocus = false; + sProxy->m_CustomIndexFirst = -1; + sProxy->m_CustomIndexLast = -1; + //g_TwMgr->InitVarData(sProxy->m_Type, sProxy->m_StructData, s.m_Size); + } + } + else // s.m_IsExt + { + assert( s.m_Size>0 && s.m_ClientStructSize>0 ); + vPtr = new char[s.m_Size]; // will be m_StructExtData + memset(vPtr, 0, s.m_Size); + // create a new StructProxy + g_TwMgr->m_StructProxies.push_back(CTwMgr::CStructProxy()); + sProxy = &(g_TwMgr->m_StructProxies.back()); + sProxy->m_Type = _Type; + sProxy->m_StructExtData = vPtr; + sProxy->m_StructSetCallback = _SetCallback; + sProxy->m_StructGetCallback = _GetCallback; + sProxy->m_StructClientData = _ClientData; + sProxy->m_CustomDrawCallback = NULL; + sProxy->m_CustomMouseButtonCallback = NULL; + sProxy->m_CustomMouseMotionCallback = NULL; + sProxy->m_CustomMouseLeaveCallback = NULL; + sProxy->m_CustomCaptureFocus = false; + sProxy->m_CustomIndexFirst = -1; + sProxy->m_CustomIndexLast = -1; + //g_TwMgr->InitVarData(sProxy->m_Type, sProxy->m_StructExtData, s.m_Size); + if( _VarPtr!=NULL ) + { + sProxy->m_StructData = _VarPtr; + sProxy->m_DeleteStructData = false; + } + else + { + sProxy->m_StructData = new char[s.m_ClientStructSize]; + memset(sProxy->m_StructData, 0, s.m_ClientStructSize); + sProxy->m_DeleteStructData = true; + //g_TwMgr->InitVarData(ClientStructType, sProxy->m_StructData, s.m_ClientStructSize); //ClientStructType is unknown + } + _VarPtr = NULL; // force use of TwAddVarCB for members + + // init m_StructExtdata + if( s.m_ExtClientData==CTwMgr::CStruct::s_PassProxyAsClientData ) + s.m_StructExtInitCallback(sProxy->m_StructExtData, sProxy); + else + s.m_StructExtInitCallback(sProxy->m_StructExtData, s.m_ExtClientData); + } + + for( int i=0; i<(int)s.m_Members.size(); ++i ) + { + CTwMgr::CStructMember& m = s.m_Members[i]; + string name = string(_Name) + '.' + m.m_Name; + const char *access = ""; + if( _ReadOnly ) + access = "readonly "; + string def = "label=`" + m.m_Name + "` group=`" + _Name + "` " + access; // + m.m_DefString; // member def must be done after group def + if( _VarPtr!=NULL ) + { + if( TwAddVarRW(_Bar, name.c_str(), m.m_Type, (char*)vPtr+m.m_Offset, def.c_str())==0 ) + return 0; + } + else + { + assert( sProxy!=NULL ); + // create a new MemberProxy + g_TwMgr->m_MemberProxies.push_back(CTwMgr::CMemberProxy()); + CTwMgr::CMemberProxy& mProxy = g_TwMgr->m_MemberProxies.back(); + mProxy.m_StructProxy = sProxy; + mProxy.m_MemberIndex = i; + assert( !(s.m_IsExt && (m.m_Type==TW_TYPE_STDSTRING || m.m_Type==TW_TYPE_CDSTDSTRING)) ); // forbidden because this case is not handled by UnrollCDStdString + if( TwAddVarCB(_Bar, name.c_str(), m.m_Type, CTwMgr::CMemberProxy::SetCB, CTwMgr::CMemberProxy::GetCB, &mProxy, def.c_str())==0 ) + return 0; + mProxy.m_Var = _Bar->Find(name.c_str(), &mProxy.m_VarParent, NULL); + mProxy.m_Bar = _Bar; + } + + if( sProxy!=NULL && IsCustomType(m.m_Type) ) // m.m_Type>=TW_TYPE_CUSTOM_BASE && m.m_Typem_Customs.size() ) + { + if( sProxy->m_CustomIndexFirst<0 ) + sProxy->m_CustomIndexFirst = sProxy->m_CustomIndexLast = i; + else + sProxy->m_CustomIndexLast = i; + } + } + char structInfo[64]; + sprintf(structInfo, "typeid=%d valptr=%p close ", _Type, vPtr); + string grpDef = '`' + _Bar->m_Name + "`/`" + _Name + "` " + structInfo; + if( _Def!=NULL && strlen(_Def)>0 ) + grpDef += _Def; + int ret = TwDefine(grpDef.c_str()); + for( int i=0; i<(int)s.m_Members.size(); ++i ) // members must be defined even if grpDef has error + { + CTwMgr::CStructMember& m = s.m_Members[i]; + if( m.m_DefString.length()>0 ) + { + string memberDef = '`' + _Bar->m_Name + "`/`" + _Name + '.' + m.m_Name + "` " + m.m_DefString; + if( !TwDefine(memberDef.c_str()) ) // all members must be defined even if memberDef has error + ret = 0; + } + } + return ret; + } + else + { + if( _Type==TW_TYPE_CSSTRING_BASE ) + g_TwMgr->SetLastError(g_ErrBadSize); // static string of size null + else + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddVarRW(TwBar *_Bar, const char *_Name, ETwType _Type, void *_Var, const char *_Def) +{ + return AddVar(_Bar, _Name, _Type, _Var, false, NULL, NULL, NULL, NULL, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddVarRO(TwBar *_Bar, const char *_Name, ETwType _Type, const void *_Var, const char *_Def) +{ + return AddVar(_Bar, _Name, _Type, const_cast(_Var), true, NULL, NULL, NULL, NULL, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddVarCB(TwBar *_Bar, const char *_Name, ETwType _Type, TwSetVarCallback _SetCallback, TwGetVarCallback _GetCallback, void *_ClientData, const char *_Def) +{ + return AddVar(_Bar, _Name, _Type, NULL, false, _SetCallback, _GetCallback, NULL, _ClientData, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddButton(TwBar *_Bar, const char *_Name, TwButtonCallback _Callback, void *_ClientData, const char *_Def) +{ + return AddVar(_Bar, _Name, TW_TYPE_BUTTON, NULL, false, NULL, NULL, _Callback, _ClientData, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddSeparator(TwBar *_Bar, const char *_Name, const char *_Def) +{ + return AddVar(_Bar, _Name, TW_TYPE_BUTTON, NULL, true, NULL, NULL, NULL, &s_SeparatorTag, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwRemoveVar(TwBar *_Bar, const char *_Name) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL || _Name==NULL || strlen(_Name)==0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + _Bar->StopEditInPlace(); // desactivate EditInPlace + + CTwVarGroup *Parent = NULL; + int Index = -1; + CTwVar *Var = _Bar->Find(_Name, &Parent, &Index); + if( Var!=NULL && Parent!=NULL && Index>=0 ) + { + if( Parent->m_StructValuePtr!=NULL ) + { + g_TwMgr->SetLastError(g_ErrDelStruct); + return 0; + } + + delete Var; + Parent->m_Vars.erase(Parent->m_Vars.begin()+Index); + if( Parent!=&(_Bar->m_VarRoot) && Parent->m_Vars.size()<=0 ) + TwRemoveVar(_Bar, Parent->m_Name.c_str()); + _Bar->NotUpToDate(); + if( _Bar!=g_TwMgr->m_HelpBar ) + g_TwMgr->m_HelpBarNotUpToDate = true; + return 1; + } + + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwRemoveAllVars(TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar && _Bar!=g_TwMgr->m_HelpBar ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + _Bar->StopEditInPlace(); // desactivate EditInPlace + + for( vector::iterator it=_Bar->m_VarRoot.m_Vars.begin(); it!=_Bar->m_VarRoot.m_Vars.end(); ++it ) + if( *it != NULL ) + { + delete *it; + *it = NULL; + } + _Bar->m_VarRoot.m_Vars.resize(0); + _Bar->NotUpToDate(); + g_TwMgr->m_HelpBarNotUpToDate = true; + return 1; +} + +// --------------------------------------------------------------------------- + +int ParseToken(string& _Token, const char *_Def, int& Line, int& Column, bool _KeepQuotes, bool _EndCR, char _Sep1='\0', char _Sep2='\0') +{ + const char *Cur = _Def; + _Token = ""; + // skip spaces + while( *Cur==' ' || *Cur=='\t' || *Cur=='\r' || *Cur=='\n' ) + { + if( *Cur=='\n' && _EndCR ) + return (int)(Cur-_Def); // a CR has been found + ++Cur; + if( *Cur=='\n' ) + { + ++Line; + Column = 1; + } + else if( *Cur=='\t' ) + Column += g_TabLength; + else if( *Cur!='\r' ) + ++Column; + } + // read token + int QuoteLine=0, QuoteColumn=0; + char Quote = 0; + bool AddChar; + bool LineJustIncremented = false; + while( (Quote==0 && (*Cur!='\0' && *Cur!=' ' && *Cur!='\t' && *Cur!='\r' && *Cur!='\n' && *Cur!=_Sep1 && *Cur!=_Sep2)) + || (Quote!=0 && (*Cur!='\0' /* && *Cur!='\r' && *Cur!='\n' */)) ) // allow multi-line strings + { + LineJustIncremented = false; + AddChar = true; + if( Quote==0 && (*Cur=='\'' || *Cur=='\"' || *Cur=='`') ) + { + Quote = *Cur; + QuoteLine = Line; + QuoteColumn = Column; + AddChar = _KeepQuotes; + } + else if ( Quote!=0 && *Cur==Quote ) + { + Quote = 0; + AddChar = _KeepQuotes; + } + + if( AddChar ) + _Token += *Cur; + ++Cur; + if( *Cur=='\t' ) + Column += g_TabLength; + else if( *Cur=='\n' ) + { + ++Line; + LineJustIncremented = true; + Column = 1; + } + else + ++Column; + } + + if( Quote!=0 ) + { + Line = QuoteLine; + Column = QuoteColumn; + return -(int)(Cur-_Def); // unclosed quote + } + else + { + if( *Cur=='\n' ) + { + if( !LineJustIncremented ) + ++Line; + Column = 1; + } + else if( *Cur=='\t' ) + Column += g_TabLength; + else if( *Cur!='\r' && *Cur!='\0' ) + ++Column; + return (int)(Cur-_Def); + } +} + +// --------------------------------------------------------------------------- + +int GetBarVarFromString(CTwBar **_Bar, CTwVar **_Var, CTwVarGroup **_VarParent, int *_VarIndex, const char *_Str) +{ + *_Bar = NULL; + *_Var = NULL; + *_VarParent = NULL; + *_VarIndex = -1; + vector Names; + string Token; + const char *Cur =_Str; + int l=1, c=1, p=1; + while( *Cur!='\0' && p>0 && Names.size()<=3 ) + { + p = ParseToken(Token, Cur, l, c, false, true, '/', '\\'); + if( p>0 && Token.size()>0 ) + { + Names.push_back(Token); + Cur += p + ((Cur[p]!='\0')?1:0); + } + } + if( p<=0 || (Names.size()!=1 && Names.size()!=2) ) + return 0; // parse error + int BarIdx = g_TwMgr->FindBar(Names[0].c_str()); + if( BarIdx<0 ) + { + if( Names.size()==1 && strcmp(Names[0].c_str(), "GLOBAL")==0 ) + { + *_Bar = TW_GLOBAL_BAR; + return +3; // 'GLOBAL' found + } + else + return -1; // bar not found + } + *_Bar = g_TwMgr->m_Bars[BarIdx]; + if( Names.size()==1 ) + return 1; // bar found, no var name parsed + *_Var = (*_Bar)->Find(Names[1].c_str(), _VarParent, _VarIndex); + if( *_Var==NULL ) + return -2; // var not found + return 2; // bar and var found +} + + +int BarVarHasAttrib(CTwBar *_Bar, CTwVar *_Var, const char *_Attrib, bool *_HasValue) +{ + assert(_Bar!=NULL && _HasValue!=NULL && _Attrib!=NULL && strlen(_Attrib)>0); + *_HasValue = false; + if( _Bar==TW_GLOBAL_BAR ) + { + assert( _Var==NULL ); + return g_TwMgr->HasAttrib(_Attrib, _HasValue); + } + else if( _Var==NULL ) + return _Bar->HasAttrib(_Attrib, _HasValue); + else + return _Var->HasAttrib(_Attrib, _HasValue); +} + + +int BarVarSetAttrib(CTwBar *_Bar, CTwVar *_Var, CTwVarGroup *_VarParent, int _VarIndex, int _AttribID, const char *_Value) +{ + assert(_Bar!=NULL && _AttribID>0); + + /* don't delete popupbar here: if any attrib is changed every frame by the app, popup will not work anymore. + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_PopupBar->m_BarLinkedToPopupList==_Bar ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + */ + + if( _Bar==TW_GLOBAL_BAR ) + { + assert( _Var==NULL ); + return g_TwMgr->SetAttrib(_AttribID, _Value); + } + else if( _Var==NULL ) + return _Bar->SetAttrib(_AttribID, _Value); + else + return _Var->SetAttrib(_AttribID, _Value, _Bar, _VarParent, _VarIndex); + // don't make _Bar not-up-to-date here, should be done in SetAttrib if needed to avoid too frequent refreshs +} + + +ERetType BarVarGetAttrib(CTwBar *_Bar, CTwVar *_Var, CTwVarGroup *_VarParent, int _VarIndex, int _AttribID, std::vector& outDoubles, std::ostringstream& outString) +{ + assert(_Bar!=NULL && _AttribID>0); + + if( _Bar==TW_GLOBAL_BAR ) + { + assert( _Var==NULL ); + return g_TwMgr->GetAttrib(_AttribID, outDoubles, outString); + } + else if( _Var==NULL ) + return _Bar->GetAttrib(_AttribID, outDoubles, outString); + else + return _Var->GetAttrib(_AttribID, _Bar, _VarParent, _VarIndex, outDoubles, outString); +} + +// --------------------------------------------------------------------------- + +static inline std::string ErrorPosition(bool _MultiLine, int _Line, int _Column) +{ + if( !_MultiLine ) + return ""; + else + { + char pos[32]; + //_snprintf(pos, sizeof(pos)-1, " line %d column %d", _Line, _Column); + _snprintf(pos, sizeof(pos)-1, " line %d", _Line); (void)_Column; + pos[sizeof(pos)-1] = '\0'; + return pos; + } +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwDefine(const char *_Def) +{ + CTwFPU fpu; // force fpu precision + + // hack to scale fonts artificially (for retina display for instance) + if( g_TwMgr==NULL && _Def!=NULL ) + { + size_t l = strlen(_Def); + const char *eq = strchr(_Def, '='); + if( eq!=NULL && eq!=_Def && l>0 && l<512 ) + { + char *a = new char[l+1]; + char *b = new char[l+1]; + if( sscanf(_Def, "%s%s", a, b)==2 && strcmp(a, "GLOBAL")==0 ) + { + if( strchr(b, '=') != NULL ) + *strchr(b, '=') = '\0'; + double scal = 1.0; + if( _stricmp(b, "fontscaling")==0 && sscanf(eq+1, "%lf", &scal)==1 && scal>0 ) + { + g_FontScaling = (float)scal; + delete[] a; + delete[] b; + return 1; + } + } + delete[] a; + delete[] b; + } + } + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Def==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + bool MultiLine = false; + const char *Cur = _Def; + while( *Cur!='\0' ) + { + if( *Cur=='\n' ) + { + MultiLine = true; + break; + } + ++Cur; + } + + int Line = 1; + int Column = 1; + enum EState { PARSE_NAME, PARSE_ATTRIB }; + EState State = PARSE_NAME; + string Token; + string Value; + CTwBar *Bar = NULL; + CTwVar *Var = NULL; + CTwVarGroup *VarParent = NULL; + int VarIndex = -1; + int p; + + Cur = _Def; + while( *Cur!='\0' ) + { + const char *PrevCur = Cur; + p = ParseToken(Token, Cur, Line, Column, (State==PARSE_NAME), (State==PARSE_ATTRIB), (State==PARSE_ATTRIB)?'=':'\0'); + if( p<=0 || Token.size()<=0 ) + { + if( p>0 && Cur[p]=='\0' ) + { + Cur += p; + continue; + } + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Parsing error in def string%s [%-16s...]", ErrorPosition(MultiLine, Line, Column).c_str(), (p<0)?(Cur-p):PrevCur); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + char CurSep = Cur[p]; + Cur += p + ((CurSep!='\0')?1:0); + + if( State==PARSE_NAME ) + { + int Err = GetBarVarFromString(&Bar, &Var, &VarParent, &VarIndex, Token.c_str()); + if( Err<=0 ) + { + if( Err==-1 ) + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Parsing error in def string: Bar not found%s [%-16s...]", ErrorPosition(MultiLine, Line, Column).c_str(), Token.c_str()); + else if( Err==-2 ) + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Parsing error in def string: Variable not found%s [%-16s...]", ErrorPosition(MultiLine, Line, Column).c_str(), Token.c_str()); + else + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Parsing error in def string%s [%-16s...]", ErrorPosition(MultiLine, Line, Column).c_str(), Token.c_str()); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + State = PARSE_ATTRIB; + } + else // State==PARSE_ATTRIB + { + assert(State==PARSE_ATTRIB); + assert(Bar!=NULL); + + bool HasValue = false; + Value = ""; + int AttribID = BarVarHasAttrib(Bar, Var, Token.c_str(), &HasValue); + if( AttribID<=0 ) + { + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Parsing error in def string: Unknown attribute%s [%-16s...]", ErrorPosition(MultiLine, Line, Column).c_str(), Token.c_str()); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + + // special case for backward compatibility + if( HasValue && ( _stricmp(Token.c_str(), "readonly")==0 || _stricmp(Token.c_str(), "hexa")==0 ) ) + { + if( CurSep==' ' || CurSep=='\t' ) + { + const char *ch = Cur; + while( *ch==' ' || *ch=='\t' ) // find next non-space character + ++ch; + if( *ch!='=' ) // if this is not '=' the param has no value + HasValue = false; + } + } + + if( HasValue ) + { + if( CurSep!='=' ) + { + string EqualStr; + p = ParseToken(EqualStr, Cur, Line, Column, true, true, '='); + CurSep = Cur[p]; + if( p<0 || EqualStr.size()>0 || CurSep!='=' ) + { + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Parsing error in def string: '=' not found while reading attribute value%s [%-16s...]", ErrorPosition(MultiLine, Line, Column).c_str(), Token.c_str()); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + Cur += p + 1; + } + p = ParseToken(Value, Cur, Line, Column, false, true); + if( p<=0 ) + { + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Parsing error in def string: can't read attribute value%s [%-16s...]", ErrorPosition(MultiLine, Line, Column).c_str(), Token.c_str()); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + CurSep = Cur[p]; + Cur += p + ((CurSep!='\0')?1:0); + } + const char *PrevLastErrorPtr = g_TwMgr->CheckLastError(); + if( BarVarSetAttrib(Bar, Var, VarParent, VarIndex, AttribID, HasValue?Value.c_str():NULL)==0 ) + { + if( g_TwMgr->CheckLastError()==NULL || strlen(g_TwMgr->CheckLastError())<=0 || g_TwMgr->CheckLastError()==PrevLastErrorPtr ) + _snprintf(g_ErrParse, sizeof(g_ErrParse), "Parsing error in def string: wrong attribute value%s [%-16s...]", ErrorPosition(MultiLine, Line, Column).c_str(), Token.c_str()); + else + _snprintf(g_ErrParse, sizeof(g_ErrParse), "%s%s [%-16s...]", g_TwMgr->CheckLastError(), ErrorPosition(MultiLine, Line, Column).c_str(), Token.c_str()); + g_ErrParse[sizeof(g_ErrParse)-1] = '\0'; + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + // sweep spaces to detect next attrib + while( *Cur==' ' || *Cur=='\t' || *Cur=='\r' ) + { + ++Cur; + if( *Cur=='\t' ) + Column += g_TabLength; + else if( *Cur!='\r' ) + ++Column; + } + if( *Cur=='\n' ) // new line detected + { + ++Line; + Column = 1; + State = PARSE_NAME; + } + } + } + + g_TwMgr->m_HelpBarNotUpToDate = true; + return 1; +} + +// --------------------------------------------------------------------------- + +TwType ANT_CALL TwDefineEnum(const char *_Name, const TwEnumVal *_EnumValues, unsigned int _NbValues) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return TW_TYPE_UNDEF; // not initialized + } + if( _EnumValues==NULL && _NbValues!=0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return TW_TYPE_UNDEF; + } + + if( g_TwMgr->m_PopupBar!=NULL ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + size_t enumIndex = g_TwMgr->m_Enums.size(); + if( _Name!=NULL && strlen(_Name)>0 ) + for( size_t j=0; jm_Enums.size(); ++j ) + if( strcmp(_Name, g_TwMgr->m_Enums[j].m_Name.c_str())==0 ) + { + enumIndex = j; + break; + } + if( enumIndex==g_TwMgr->m_Enums.size() ) + g_TwMgr->m_Enums.push_back(CTwMgr::CEnum()); + assert( enumIndex>=0 && enumIndexm_Enums.size() ); + CTwMgr::CEnum& e = g_TwMgr->m_Enums[enumIndex]; + if( _Name!=NULL && strlen(_Name)>0 ) + e.m_Name = _Name; + else + e.m_Name = ""; + e.m_Entries.clear(); + for(unsigned int i=0; i<_NbValues; ++i) + { + CTwMgr::CEnum::CEntries::value_type Entry(_EnumValues[i].Value, (_EnumValues[i].Label!=NULL)?_EnumValues[i].Label:""); + pair Result = e.m_Entries.insert(Entry); + if( !Result.second ) + (Result.first)->second = Entry.second; + } + + return TwType( TW_TYPE_ENUM_BASE + enumIndex ); +} + +// --------------------------------------------------------------------------- + +TwType TW_CALL TwDefineEnumFromString(const char *_Name, const char *_EnumString) +{ + if (_EnumString == NULL) + return TwDefineEnum(_Name, NULL, 0); + + // split enumString + stringstream EnumStream(_EnumString); + string Label; + vector Labels; + while( getline(EnumStream, Label, ',') ) { + // trim Label + size_t Start = Label.find_first_not_of(" \n\r\t"); + size_t End = Label.find_last_not_of(" \n\r\t"); + if( Start==string::npos || End==string::npos ) + Label = ""; + else + Label = Label.substr(Start, (End-Start)+1); + // store Label + Labels.push_back(Label); + } + // create TwEnumVal array + vector Vals(Labels.size()); + for( int i=0; i<(int)Labels.size(); i++ ) + { + Vals[i].Value = i; + Vals[i].Label = Labels[i].c_str(); + } + + return TwDefineEnum(_Name, Vals.empty() ? NULL : &(Vals[0]), (unsigned int)Vals.size()); +} + +// --------------------------------------------------------------------------- + +void ANT_CALL CTwMgr::CStruct::DefaultSummary(char *_SummaryString, size_t _SummaryMaxLength, const void *_Value, void *_ClientData) +{ + const CTwVarGroup *varGroup = static_cast(_Value); // special case + if( _SummaryString && _SummaryMaxLength>0 ) + _SummaryString[0] = '\0'; + size_t structIndex = (size_t)(_ClientData); + if( g_TwMgr && _SummaryString && _SummaryMaxLength>2 + && varGroup && static_cast(varGroup)->IsGroup() + && structIndex>=0 && structIndex<=g_TwMgr->m_Structs.size() ) + { + // return g_TwMgr->m_Structs[structIndex].m_Name.c_str(); + CTwMgr::CStruct& s = g_TwMgr->m_Structs[structIndex]; + _SummaryString[0] = '{'; + _SummaryString[1] = '\0'; + bool separator = false; + for( size_t i=0; im_Name + '.' + s.m_Members[i].m_Name; + const CTwVar *var = varGroup->Find(varName.c_str(), NULL, NULL); + if( var ) + { + if( var->IsGroup() ) + { + const CTwVarGroup *grp = static_cast(var); + if( grp->m_SummaryCallback!=NULL ) + { + size_t l = strlen(_SummaryString); + if( separator ) + { + _SummaryString[l++] = ','; + _SummaryString[l++] = '\0'; + } + if( grp->m_SummaryCallback==CTwMgr::CStruct::DefaultSummary ) + grp->m_SummaryCallback(_SummaryString+l, _SummaryMaxLength-l, grp, grp->m_SummaryClientData); + else + grp->m_SummaryCallback(_SummaryString+l, _SummaryMaxLength-l, grp->m_StructValuePtr, grp->m_SummaryClientData); + separator = true; + } + } + else + { + size_t l = strlen(_SummaryString); + if( separator ) + { + _SummaryString[l++] = ','; + _SummaryString[l++] = '\0'; + } + string valString; + const CTwVarAtom *atom = static_cast(var); + atom->ValueToString(&valString); + if( atom->m_Type==TW_TYPE_BOOLCPP || atom->m_Type==TW_TYPE_BOOL8 || atom->m_Type==TW_TYPE_BOOL16 || atom->m_Type==TW_TYPE_BOOL32 ) + { + if (valString == "0") + valString = "-"; + else if (valString == "1") + valString = "\x7f"; // check sign + } + strncat(_SummaryString, valString.c_str(), _SummaryMaxLength-l); + separator = true; + } + if( strlen(_SummaryString)>_SummaryMaxLength-2 ) + break; + } + } + size_t l = strlen(_SummaryString); + if( l>_SummaryMaxLength-2 ) + { + _SummaryString[_SummaryMaxLength-2] = '.'; + _SummaryString[_SummaryMaxLength-1] = '.'; + _SummaryString[_SummaryMaxLength+0] = '\0'; + } + else + { + _SummaryString[l+0] = '}'; + _SummaryString[l+1] = '\0'; + } + } +} + +// --------------------------------------------------------------------------- + +TwType ANT_CALL TwDefineStruct(const char *_StructName, const TwStructMember *_StructMembers, unsigned int _NbMembers, size_t _StructSize, TwSummaryCallback _SummaryCallback, void *_SummaryClientData) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return TW_TYPE_UNDEF; // not initialized + } + if( _StructMembers==NULL || _NbMembers==0 || _StructSize==0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return TW_TYPE_UNDEF; + } + + if( _StructName!=NULL && strlen(_StructName)>0 ) + for( size_t j=0; jm_Structs.size(); ++j ) + if( strcmp(_StructName, g_TwMgr->m_Structs[j].m_Name.c_str())==0 ) + { + g_TwMgr->SetLastError(g_ErrExist); + return TW_TYPE_UNDEF; + } + + size_t structIndex = g_TwMgr->m_Structs.size(); + CTwMgr::CStruct s; + s.m_Size = _StructSize; + if( _StructName!=NULL && strlen(_StructName)>0 ) + s.m_Name = _StructName; + else + s.m_Name = ""; + s.m_Members.resize(_NbMembers); + if( _SummaryCallback!=NULL ) + { + s.m_SummaryCallback = _SummaryCallback; + s.m_SummaryClientData = _SummaryClientData; + } + else + { + s.m_SummaryCallback = CTwMgr::CStruct::DefaultSummary; + s.m_SummaryClientData = (void *)(structIndex); + } + for( unsigned int i=0; i<_NbMembers; ++i ) + { + CTwMgr::CStructMember& m = s.m_Members[i]; + if( _StructMembers[i].Name!=NULL ) + m.m_Name = _StructMembers[i].Name; + else + { + char name[16]; + sprintf(name, "%u", i); + m.m_Name = name; + } + m.m_Type = _StructMembers[i].Type; + m.m_Size = 0; // to avoid endless recursivity in GetDataSize + m.m_Size = CTwVar::GetDataSize(m.m_Type); + if( _StructMembers[i].Offset<_StructSize ) + m.m_Offset = _StructMembers[i].Offset; + else + { + g_TwMgr->SetLastError(g_ErrOffset); + return TW_TYPE_UNDEF; + } + if( _StructMembers[i].DefString!=NULL && strlen(_StructMembers[i].DefString)>0 ) + m.m_DefString = _StructMembers[i].DefString; + else + m.m_DefString = ""; + } + + g_TwMgr->m_Structs.push_back(s); + assert( g_TwMgr->m_Structs.size()==structIndex+1 ); + return TwType( TW_TYPE_STRUCT_BASE + structIndex ); +} + +// --------------------------------------------------------------------------- + +TwType ANT_CALL TwDefineStructExt(const char *_StructName, const TwStructMember *_StructExtMembers, unsigned int _NbExtMembers, size_t _StructSize, size_t _StructExtSize, TwStructExtInitCallback _StructExtInitCallback, TwCopyVarFromExtCallback _CopyVarFromExtCallback, TwCopyVarToExtCallback _CopyVarToExtCallback, TwSummaryCallback _SummaryCallback, void *_ClientData, const char *_Help) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return TW_TYPE_UNDEF; // not initialized + } + if( _StructSize==0 || _StructExtInitCallback==NULL || _CopyVarFromExtCallback==NULL || _CopyVarToExtCallback==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return TW_TYPE_UNDEF; + } + TwType type = TwDefineStruct(_StructName, _StructExtMembers, _NbExtMembers, _StructExtSize, _SummaryCallback, _ClientData); + if( type>=TW_TYPE_STRUCT_BASE && typem_Structs.size() ) + { + CTwMgr::CStruct& s = g_TwMgr->m_Structs[type-TW_TYPE_STRUCT_BASE]; + s.m_IsExt = true; + s.m_ClientStructSize = _StructSize; + s.m_StructExtInitCallback = _StructExtInitCallback; + s.m_CopyVarFromExtCallback = _CopyVarFromExtCallback; + s.m_CopyVarToExtCallback = _CopyVarToExtCallback; + s.m_ExtClientData = _ClientData; + if( _Help!=NULL ) + s.m_Help = _Help; + } + return type; +} + + +// --------------------------------------------------------------------------- + +bool TwGetKeyCode(int *_Code, int *_Modif, const char *_String) +{ + assert(_Code!=NULL && _Modif!=NULL); + bool Ok = true; + *_Modif = TW_KMOD_NONE; + *_Code = 0; + size_t Start = strlen(_String)-1; + if( Start<0 ) + return false; + while( Start>0 && _String[Start-1]!='+' ) + --Start; + while( _String[Start]==' ' || _String[Start]=='\t' ) + ++Start; + char *CodeStr = _strdup(_String+Start); + for( size_t i=strlen(CodeStr)-1; i>=0; ++i ) + if( CodeStr[i]==' ' || CodeStr[i]=='\t' ) + CodeStr[i] = '\0'; + else + break; + + /* + if( strstr(_String, "SHIFT")!=NULL || strstr(_String, "shift")!=NULL ) + *_Modif |= TW_KMOD_SHIFT; + if( strstr(_String, "CTRL")!=NULL || strstr(_String, "ctrl")!=NULL ) + *_Modif |= TW_KMOD_CTRL; + if( strstr(_String, "META")!=NULL || strstr(_String, "meta")!=NULL ) + *_Modif |= TW_KMOD_META; + + if( strstr(_String, "ALTGR")!=NULL || strstr(_String, "altgr")!=NULL ) + ((void)(0)); // *_Modif |= TW_KMOD_ALTGR; + else // ALT and ALTGR are exclusive + if( strstr(_String, "ALT")!=NULL || strstr(_String, "alt")!=NULL ) + *_Modif |= TW_KMOD_ALT; + */ + char *up = _strdup(_String); + // _strupr(up); + for( char *upch=up; *upch!='\0'; ++upch ) + *upch = (char)toupper(*upch); + if( strstr(up, "SHIFT")!=NULL ) + *_Modif |= TW_KMOD_SHIFT; + if( strstr(up, "CTRL")!=NULL ) + *_Modif |= TW_KMOD_CTRL; + if( strstr(up, "META")!=NULL ) + *_Modif |= TW_KMOD_META; + + if( strstr(up, "ALTGR")!=NULL ) + ((void)(0)); // *_Modif |= TW_KMOD_ALTGR; + else // ALT and ALTGR are exclusive + if( strstr(up, "ALT")!=NULL ) + *_Modif |= TW_KMOD_ALT; + free(up); + + if( strlen(CodeStr)==1 ) + *_Code = (unsigned char)(CodeStr[0]); + else if( _stricmp(CodeStr, "backspace")==0 || _stricmp(CodeStr, "bs")==0 ) + *_Code = TW_KEY_BACKSPACE; + else if( _stricmp(CodeStr, "tab")==0 ) + *_Code = TW_KEY_TAB; + else if( _stricmp(CodeStr, "clear")==0 || _stricmp(CodeStr, "clr")==0 ) + *_Code = TW_KEY_CLEAR; + else if( _stricmp(CodeStr, "return")==0 || _stricmp(CodeStr, "ret")==0 ) + *_Code = TW_KEY_RETURN; + else if( _stricmp(CodeStr, "pause")==0 ) + *_Code = TW_KEY_PAUSE; + else if( _stricmp(CodeStr, "escape")==0 || _stricmp(CodeStr, "esc")==0 ) + *_Code = TW_KEY_ESCAPE; + else if( _stricmp(CodeStr, "space")==0 ) + *_Code = TW_KEY_SPACE; + else if( _stricmp(CodeStr, "delete")==0 || _stricmp(CodeStr, "del")==0 ) + *_Code = TW_KEY_DELETE; + /* + else if( strlen(CodeStr)==4 && CodeStr[3]>='0' && CodeStr[3]<='9' && (strstr(CodeStr, "pad")==CodeStr || strstr(CodeStr, "PAD")==CodeStr) ) + *_Code = TW_KEY_PAD_0 + CodeStr[3]-'0'; + else if( _stricmp(CodeStr, "pad.")==0 ) + *_Code = TW_KEY_PAD_PERIOD; + else if( _stricmp(CodeStr, "pad/")==0 ) + *_Code = TW_KEY_PAD_DIVIDE; + else if( _stricmp(CodeStr, "pad*")==0 ) + *_Code = TW_KEY_PAD_MULTIPLY; + else if( _stricmp(CodeStr, "pad+")==0 ) + *_Code = TW_KEY_PAD_PLUS; + else if( _stricmp(CodeStr, "pad-")==0 ) + *_Code = TW_KEY_PAD_MINUS; + else if( _stricmp(CodeStr, "padenter")==0 ) + *_Code = TW_KEY_PAD_ENTER; + else if( _stricmp(CodeStr, "pad=")==0 ) + *_Code = TW_KEY_PAD_EQUALS; + */ + else if( _stricmp(CodeStr, "up")==0 ) + *_Code = TW_KEY_UP; + else if( _stricmp(CodeStr, "down")==0 ) + *_Code = TW_KEY_DOWN; + else if( _stricmp(CodeStr, "right")==0 ) + *_Code = TW_KEY_RIGHT; + else if( _stricmp(CodeStr, "left")==0 ) + *_Code = TW_KEY_LEFT; + else if( _stricmp(CodeStr, "insert")==0 || _stricmp(CodeStr, "ins")==0 ) + *_Code = TW_KEY_INSERT; + else if( _stricmp(CodeStr, "home")==0 ) + *_Code = TW_KEY_HOME; + else if( _stricmp(CodeStr, "end")==0 ) + *_Code = TW_KEY_END; + else if( _stricmp(CodeStr, "pgup")==0 ) + *_Code = TW_KEY_PAGE_UP; + else if( _stricmp(CodeStr, "pgdown")==0 ) + *_Code = TW_KEY_PAGE_DOWN; + else if( (strlen(CodeStr)==2 || strlen(CodeStr)==3) && (CodeStr[0]=='f' || CodeStr[0]=='F') ) + { + int n = 0; + if( sscanf(CodeStr+1, "%d", &n)==1 && n>0 && n<16 ) + *_Code = TW_KEY_F1 + n-1; + else + Ok = false; + } + + free(CodeStr); + return Ok; +} + +bool TwGetKeyString(std::string *_String, int _Code, int _Modif) +{ + assert(_String!=NULL); + bool Ok = true; + if( _Modif & TW_KMOD_SHIFT ) + *_String += "SHIFT+"; + if( _Modif & TW_KMOD_CTRL ) + *_String += "CTRL+"; + if ( _Modif & TW_KMOD_ALT ) + *_String += "ALT+"; + if ( _Modif & TW_KMOD_META ) + *_String += "META+"; + // if ( _Modif & TW_KMOD_ALTGR ) + // *_String += "ALTGR+"; + switch( _Code ) + { + case TW_KEY_BACKSPACE: + *_String += "BackSpace"; + break; + case TW_KEY_TAB: + *_String += "Tab"; + break; + case TW_KEY_CLEAR: + *_String += "Clear"; + break; + case TW_KEY_RETURN: + *_String += "Return"; + break; + case TW_KEY_PAUSE: + *_String += "Pause"; + break; + case TW_KEY_ESCAPE: + *_String += "Esc"; + break; + case TW_KEY_SPACE: + *_String += "Space"; + break; + case TW_KEY_DELETE: + *_String += "Delete"; + break; + /* + case TW_KEY_PAD_0: + *_String += "PAD0"; + break; + case TW_KEY_PAD_1: + *_String += "PAD1"; + break; + case TW_KEY_PAD_2: + *_String += "PAD2"; + break; + case TW_KEY_PAD_3: + *_String += "PAD3"; + break; + case TW_KEY_PAD_4: + *_String += "PAD4"; + break; + case TW_KEY_PAD_5: + *_String += "PAD5"; + break; + case TW_KEY_PAD_6: + *_String += "PAD6"; + break; + case TW_KEY_PAD_7: + *_String += "PAD7"; + break; + case TW_KEY_PAD_8: + *_String += "PAD8"; + break; + case TW_KEY_PAD_9: + *_String += "PAD9"; + break; + case TW_KEY_PAD_PERIOD: + *_String += "PAD."; + break; + case TW_KEY_PAD_DIVIDE: + *_String += "PAD/"; + break; + case TW_KEY_PAD_MULTIPLY: + *_String += "PAD*"; + break; + case TW_KEY_PAD_MINUS: + *_String += "PAD-"; + break; + case TW_KEY_PAD_PLUS: + *_String += "PAD+"; + break; + case TW_KEY_PAD_ENTER: + *_String += "PADEnter"; + break; + case TW_KEY_PAD_EQUALS: + *_String += "PAD="; + break; + */ + case TW_KEY_UP: + *_String += "Up"; + break; + case TW_KEY_DOWN: + *_String += "Down"; + break; + case TW_KEY_RIGHT: + *_String += "Right"; + break; + case TW_KEY_LEFT: + *_String += "Left"; + break; + case TW_KEY_INSERT: + *_String += "Insert"; + break; + case TW_KEY_HOME: + *_String += "Home"; + break; + case TW_KEY_END: + *_String += "End"; + break; + case TW_KEY_PAGE_UP: + *_String += "PgUp"; + break; + case TW_KEY_PAGE_DOWN: + *_String += "PgDown"; + break; + case TW_KEY_F1: + *_String += "F1"; + break; + case TW_KEY_F2: + *_String += "F2"; + break; + case TW_KEY_F3: + *_String += "F3"; + break; + case TW_KEY_F4: + *_String += "F4"; + break; + case TW_KEY_F5: + *_String += "F5"; + break; + case TW_KEY_F6: + *_String += "F6"; + break; + case TW_KEY_F7: + *_String += "F7"; + break; + case TW_KEY_F8: + *_String += "F8"; + break; + case TW_KEY_F9: + *_String += "F9"; + break; + case TW_KEY_F10: + *_String += "F10"; + break; + case TW_KEY_F11: + *_String += "F11"; + break; + case TW_KEY_F12: + *_String += "F12"; + break; + case TW_KEY_F13: + *_String += "F13"; + break; + case TW_KEY_F14: + *_String += "F14"; + break; + case TW_KEY_F15: + *_String += "F15"; + break; + default: + if( _Code>0 && _Code<256 ) + *_String += char(_Code); + else + { + *_String += "Unknown"; + Ok = false; + } + } + return Ok; +} + +// --------------------------------------------------------------------------- + +const int TW_MOUSE_NOMOTION = -1; +ETwMouseAction TW_MOUSE_MOTION = (ETwMouseAction)(-2); +ETwMouseAction TW_MOUSE_WHEEL = (ETwMouseAction)(-3); +ETwMouseButtonID TW_MOUSE_NA = (ETwMouseButtonID)(-1); + +static int TwMouseEvent(ETwMouseAction _EventType, TwMouseButtonID _Button, int _MouseX, int _MouseY, int _WheelPos) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + // TwGlobalError(g_ErrNotInit); -> not an error here + return 0; // not initialized + } + if( g_TwMgr->m_WndHeight<=0 || g_TwMgr->m_WndWidth<=0 ) + { + //g_TwMgr->SetLastError(g_ErrBadWndSize); // not an error, windows not yet ready. + return 0; + } + + // For multi-thread safety + if( !TwFreeAsyncDrawing() ) + return 0; + + if( _MouseX==TW_MOUSE_NOMOTION ) + _MouseX = g_TwMgr->m_LastMouseX; + else + g_TwMgr->m_LastMouseX = _MouseX; + if( _MouseY==TW_MOUSE_NOMOTION ) + _MouseY = g_TwMgr->m_LastMouseY; + else + g_TwMgr->m_LastMouseY = _MouseY; + + // for autorepeat + if( (!g_TwMgr->m_IsRepeatingMousePressed || !g_TwMgr->m_CanRepeatMousePressed) && _EventType==TW_MOUSE_PRESSED ) + { + g_TwMgr->m_LastMousePressedTime = g_TwMgr->m_Timer.GetTime(); + g_TwMgr->m_LastMousePressedButtonID = _Button; + g_TwMgr->m_LastMousePressedPosition[0] = _MouseX; + g_TwMgr->m_LastMousePressedPosition[1] = _MouseY; + g_TwMgr->m_CanRepeatMousePressed = true; + g_TwMgr->m_IsRepeatingMousePressed = false; + } + else if( _EventType==TW_MOUSE_RELEASED || _EventType==TW_MOUSE_WHEEL ) + { + g_TwMgr->m_CanRepeatMousePressed = false; + g_TwMgr->m_IsRepeatingMousePressed = false; + } + + bool Handled = false; + bool wasPopup = (g_TwMgr->m_PopupBar!=NULL); + CTwBar *Bar = NULL; + int i; + + // search for a bar with mousedrag enabled + CTwBar *BarDragging = NULL; + for( i=((int)g_TwMgr->m_Bars.size())-1; i>=0; --i ) + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + if( Bar!=NULL && Bar->m_Visible && Bar->IsDragging() ) + { + BarDragging = Bar; + break; + } + } + + for( i=(int)g_TwMgr->m_Bars.size(); i>=0; --i ) + { + if( i==(int)g_TwMgr->m_Bars.size() ) // first try the bar with mousedrag enabled (this bar has the focus) + Bar = BarDragging; + else + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + if( Bar==BarDragging ) + continue; + } + if( Bar!=NULL && Bar->m_Visible ) + { + if( _EventType==TW_MOUSE_MOTION ) + Handled = Bar->MouseMotion(_MouseX, _MouseY); + else if( _EventType==TW_MOUSE_PRESSED || _EventType==TW_MOUSE_RELEASED ) + Handled = Bar->MouseButton(_Button, (_EventType==TW_MOUSE_PRESSED), _MouseX, _MouseY); + else if( _EventType==TW_MOUSE_WHEEL ) + { + if( abs(_WheelPos-g_TwMgr->m_LastMouseWheelPos)<4 ) // avoid crazy wheel positions + Handled = Bar->MouseWheel(_WheelPos, g_TwMgr->m_LastMouseWheelPos, _MouseX, _MouseY); + } + if( Handled ) + break; + } + } + + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return 1; + + /* + if( i>=0 && Bar!=NULL && Handled && (_EventType==TW_MOUSE_PRESSED || Bar->IsMinimized()) && i!=((int)g_TwMgr->m_Bars.size())-1 ) + { + int iOrder = g_TwMgr->m_Order[i]; + for( int j=i; j<(int)g_TwMgr->m_Bars.size()-1; ++j ) + g_TwMgr->m_Order[j] = g_TwMgr->m_Order[j+1]; + g_TwMgr->m_Order[(int)g_TwMgr->m_Bars.size()-1] = iOrder; + } + */ + if( _EventType==TW_MOUSE_PRESSED || (Bar!=NULL && Bar->IsMinimized() && Handled) ) + { + if( wasPopup && Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_PopupBar!=NULL ) // delete popup + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + if( i>=0 && Bar!=NULL && Handled && !wasPopup ) + TwSetTopBar(Bar); + } + + if( _EventType==TW_MOUSE_WHEEL ) + g_TwMgr->m_LastMouseWheelPos = _WheelPos; + + return Handled ? 1 : 0; +} + +int ANT_CALL TwMouseButton(ETwMouseAction _EventType, TwMouseButtonID _Button) +{ + return TwMouseEvent(_EventType, _Button, TW_MOUSE_NOMOTION, TW_MOUSE_NOMOTION, 0); +} + +int ANT_CALL TwMouseMotion(int _MouseX, int _MouseY) +{ + return TwMouseEvent(TW_MOUSE_MOTION, TW_MOUSE_NA, _MouseX, _MouseY, 0); +} + +int ANT_CALL TwMouseWheel(int _Pos) +{ + return TwMouseEvent(TW_MOUSE_WHEEL, TW_MOUSE_NA, TW_MOUSE_NOMOTION, TW_MOUSE_NOMOTION, _Pos); +} + +// --------------------------------------------------------------------------- + +static int TranslateKey(int _Key, int _Modifiers) +{ + // CTRL special cases + //if( (_Modifiers&TW_KMOD_CTRL) && !(_Modifiers&TW_KMOD_ALT || _Modifiers&TW_KMOD_META) && _Key>0 && _Key<32 ) + // _Key += 'a'-1; + if( (_Modifiers&TW_KMOD_CTRL) ) + { + if( _Key>='a' && _Key<='z' && ( ((_Modifiers&0x2000) && !(_Modifiers&TW_KMOD_SHIFT)) || (!(_Modifiers&0x2000) && (_Modifiers&TW_KMOD_SHIFT)) )) // 0x2000 is SDL's KMOD_CAPS + _Key += 'A'-'a'; + else if ( _Key>='A' && _Key<='Z' && ( ((_Modifiers&0x2000) && (_Modifiers&TW_KMOD_SHIFT)) || (!(_Modifiers&0x2000) && !(_Modifiers&TW_KMOD_SHIFT)) )) // 0x2000 is SDL's KMOD_CAPS + _Key += 'a'-'A'; + } + + // PAD translation (for SDL keysym) + if( _Key>=256 && _Key<=272 ) // 256=SDLK_KP0 ... 272=SDLK_KP_EQUALS + { + //bool Num = ((_Modifiers&TW_KMOD_SHIFT) && !(_Modifiers&0x1000)) || (!(_Modifiers&TW_KMOD_SHIFT) && (_Modifiers&0x1000)); // 0x1000 is SDL's KMOD_NUM + //_Modifiers &= ~TW_KMOD_SHIFT; // remove shift modifier + bool Num = (!(_Modifiers&TW_KMOD_SHIFT) && (_Modifiers&0x1000)); // 0x1000 is SDL's KMOD_NUM + if( _Key==266 ) // SDLK_KP_PERIOD + _Key = Num ? '.' : TW_KEY_DELETE; + else if( _Key==267 ) // SDLK_KP_DIVIDE + _Key = '/'; + else if( _Key==268 ) // SDLK_KP_MULTIPLY + _Key = '*'; + else if( _Key==269 ) // SDLK_KP_MINUS + _Key = '-'; + else if( _Key==270 ) // SDLK_KP_PLUS + _Key = '+'; + else if( _Key==271 ) // SDLK_KP_ENTER + _Key = TW_KEY_RETURN; + else if( _Key==272 ) // SDLK_KP_EQUALS + _Key = '='; + else if( Num ) // num SDLK_KP0..9 + _Key += '0' - 256; + else if( _Key==256 ) // non-num SDLK_KP01 + _Key = TW_KEY_INSERT; + else if( _Key==257 ) // non-num SDLK_KP1 + _Key = TW_KEY_END; + else if( _Key==258 ) // non-num SDLK_KP2 + _Key = TW_KEY_DOWN; + else if( _Key==259 ) // non-num SDLK_KP3 + _Key = TW_KEY_PAGE_DOWN; + else if( _Key==260 ) // non-num SDLK_KP4 + _Key = TW_KEY_LEFT; + else if( _Key==262 ) // non-num SDLK_KP6 + _Key = TW_KEY_RIGHT; + else if( _Key==263 ) // non-num SDLK_KP7 + _Key = TW_KEY_HOME; + else if( _Key==264 ) // non-num SDLK_KP8 + _Key = TW_KEY_UP; + else if( _Key==265 ) // non-num SDLK_KP9 + _Key = TW_KEY_PAGE_UP; + } + return _Key; +} + +// --------------------------------------------------------------------------- + +static int KeyPressed(int _Key, int _Modifiers, bool _TestOnly) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + // TwGlobalError(g_ErrNotInit); -> not an error here + return 0; // not initialized + } + if( g_TwMgr->m_WndHeight<=0 || g_TwMgr->m_WndWidth<=0 ) + { + //g_TwMgr->SetLastError(g_ErrBadWndSize); // not an error, windows not yet ready. + return 0; + } + + // For multi-thread savety + if( !TwFreeAsyncDrawing() ) + return 0; + + /* + // Test for TwDeleteBar + if( _Key>='0' && _Key<='9' ) + { + int n = _Key-'0'; + if( (int)g_TwMgr->m_Bars.size()>n && g_TwMgr->m_Bars[n]!=NULL ) + { + printf("Delete %s\n", g_TwMgr->m_Bars[n]->m_Name.c_str()); + TwDeleteBar(g_TwMgr->m_Bars[n]); + } + else + printf("can't delete %d\n", n); + return 1; + } + */ + + //char s[256]; + //sprintf(s, "twkeypressed k=%d m=%x\n", _Key, _Modifiers); + //OutputDebugString(s); + + _Key = TranslateKey(_Key, _Modifiers); + if( _Key>' ' && _Key<256 ) // don't test SHIFT if _Key is a common key + _Modifiers &= ~TW_KMOD_SHIFT; + // complete partial modifiers comming from SDL + if( _Modifiers & TW_KMOD_SHIFT ) + _Modifiers |= TW_KMOD_SHIFT; + if( _Modifiers & TW_KMOD_CTRL ) + _Modifiers |= TW_KMOD_CTRL; + if( _Modifiers & TW_KMOD_ALT ) + _Modifiers |= TW_KMOD_ALT; + if( _Modifiers & TW_KMOD_META ) + _Modifiers |= TW_KMOD_META; + + bool Handled = false; + CTwBar *Bar = NULL; + CTwBar *PopupBar = g_TwMgr->m_PopupBar; + //int Order = 0; + int i; + if( _Key>0 && _Keym_LastMouseX; + int MouseY = g_TwMgr->m_LastMouseY; + for( i=((int)g_TwMgr->m_Bars.size())-1; i>=0 && !Handled; --i ) + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + if( Bar!=NULL && Bar->m_Visible && !Bar->IsMinimized() + && ( (MouseX>=Bar->m_PosX && MouseXm_PosX+Bar->m_Width && MouseY>=Bar->m_PosY && MouseYm_PosY+Bar->m_Height) + || Bar==PopupBar) ) + { + if (_TestOnly) + Handled = Bar->KeyTest(_Key, _Modifiers); + else + Handled = Bar->KeyPressed(_Key, _Modifiers); + } + } + + // If not handled, send it to non-iconified bars in the right order + for( i=((int)g_TwMgr->m_Bars.size())-1; i>=0 && !Handled; --i ) + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + /* + for( size_t j=0; jm_Bars.size(); ++j ) + if( g_TwMgr->m_Order[j]==i ) + { + Bar = g_TwMgr->m_Bars[j]; + break; + } + Order = i; + */ + + if( Bar!=NULL && Bar->m_Visible && !Bar->IsMinimized() ) + { + if( _TestOnly ) + Handled = Bar->KeyTest(_Key, _Modifiers); + else + Handled = Bar->KeyPressed(_Key, _Modifiers); + if( g_TwMgr==NULL ) // Mgr might have been destroyed by the client inside a callback call + return 1; + } + } + + // If not handled, send it to iconified bars in the right order + for( i=((int)g_TwMgr->m_Bars.size())-1; i>=0 && !Handled; --i ) + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + if( Bar!=NULL && Bar->m_Visible && Bar->IsMinimized() ) + { + if( _TestOnly ) + Handled = Bar->KeyTest(_Key, _Modifiers); + else + Handled = Bar->KeyPressed(_Key, _Modifiers); + } + } + + if( g_TwMgr->m_HelpBar!=NULL && g_TwMgr->m_Graph && !_TestOnly ) + { + string Str; + TwGetKeyString(&Str, _Key, _Modifiers); + char Msg[256]; + sprintf(Msg, "Key pressed: %s", Str.c_str()); + g_TwMgr->m_KeyPressedStr = Msg; + g_TwMgr->m_KeyPressedBuildText = true; + // OutputDebugString(Msg); + } + } + + if( Handled && Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_PopupBar!=NULL && g_TwMgr->m_PopupBar==PopupBar ) // delete popup + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + if( Handled && Bar!=NULL && Bar!=g_TwMgr->m_PopupBar && Bar!=PopupBar ) // popup bar may have been destroyed + TwSetTopBar(Bar); + + return Handled ? 1 : 0; +} + +int ANT_CALL TwKeyPressed(int _Key, int _Modifiers) +{ + return KeyPressed(_Key, _Modifiers, false); +} + +int ANT_CALL TwKeyTest(int _Key, int _Modifiers) +{ + return KeyPressed(_Key, _Modifiers, true); +} + +// --------------------------------------------------------------------------- + +struct StructCompare : public binary_function +{ + bool operator()(const TwType& _Left, const TwType& _Right) const + { + assert( g_TwMgr!=NULL ); + int i0 = _Left-TW_TYPE_STRUCT_BASE; + int i1 = _Right-TW_TYPE_STRUCT_BASE; + if( i0>=0 && i0<(int)g_TwMgr->m_Structs.size() && i1>=0 && i1<(int)g_TwMgr->m_Structs.size() ) + return g_TwMgr->m_Structs[i0].m_Name < g_TwMgr->m_Structs[i1].m_Name; + else + return false; + } +}; + +typedef set StructSet; + +static void InsertUsedStructs(StructSet& _Set, const CTwVarGroup *_Grp) +{ + assert( g_TwMgr!=NULL && _Grp!=NULL ); + + for( size_t i=0; i<_Grp->m_Vars.size(); ++i ) + if( _Grp->m_Vars[i]!=NULL && _Grp->m_Vars[i]->m_Visible && _Grp->m_Vars[i]->IsGroup() )// && _Grp->m_Vars[i]->m_Help.length()>0 ) + { + const CTwVarGroup *SubGrp = static_cast(_Grp->m_Vars[i]); + if( SubGrp->m_StructValuePtr!=NULL && SubGrp->m_StructType>=TW_TYPE_STRUCT_BASE && SubGrp->m_StructTypem_Structs.size() && g_TwMgr->m_Structs[SubGrp->m_StructType-TW_TYPE_STRUCT_BASE].m_Name.length()>0 ) + { + if( SubGrp->m_Help.length()>0 ) + _Set.insert(SubGrp->m_StructType); + else + { + int idx = SubGrp->m_StructType - TW_TYPE_STRUCT_BASE; + if( idx>=0 && idx<(int)g_TwMgr->m_Structs.size() && g_TwMgr->m_Structs[idx].m_Name.length()>0 ) + { + for( size_t j=0; jm_Structs[idx].m_Members.size(); ++j ) + if( g_TwMgr->m_Structs[idx].m_Members[j].m_Help.length()>0 ) + { + _Set.insert(SubGrp->m_StructType); + break; + } + } + } + } + InsertUsedStructs(_Set, SubGrp); + } +} + +static void SplitString(vector& _OutSplits, const char *_String, int _Width, const CTexFont *_Font) +{ + assert( _Font!=NULL && _String!=NULL ); + _OutSplits.resize(0); + int l = (int)strlen(_String); + if( l==0 ) + { + _String = " "; + l = 1; + } + + if( _String!=NULL && l>0 && _Width>0 ) + { + int w = 0; + int i = 0; + int First = 0; + int Last = 0; + bool PrevNotBlank = true; + unsigned char c; + bool Tab = false, CR = false; + string Split; + const string TabString(g_TabLength, ' '); + + while( im_CharWidth[(int)' ']; + Tab = true; + } + else if( c=='\n' ) + { + w += _Width+1; // force split + Last = i; + CR = true; + } + else + w += _Font->m_CharWidth[(int)c]; + if( w>_Width || i==l-1 ) + { + if( Last<=First || i==l-1 ) + Last = i; + if( Tab ) + { + Split.resize(0); + for(int k=0; km_HelpBar!=NULL); + assert( _String!=NULL ); + int n = 0; + const CTexFont *Font = g_TwMgr->m_HelpBar->m_Font; + assert(Font!=NULL); + string Decal; + for( int s=0; s<_Level; ++s ) + Decal += ' '; + int DecalWidth = (_Level+2)*Font->m_CharWidth[(int)' ']; + + if( _Width>DecalWidth ) + { + vector Split; + SplitString(Split, _String, _Width-DecalWidth, Font); + for( int i=0; i<(int)Split.size(); ++i ) + { + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Name = Decal + Split[i]; + Var->m_Ptr = NULL; + if( _Type==TW_TYPE_HELP_HEADER ) + Var->m_ReadOnly = false; + else + Var->m_ReadOnly = true; + Var->m_NoSlider = true; + Var->m_DontClip = true; + Var->m_Type = _Type; + Var->m_LeftMargin = (signed short)((_Level+1)*Font->m_CharWidth[(int)' ']); + Var->m_TopMargin = (signed short)(-g_TwMgr->m_HelpBar->m_Sep); + //Var->m_TopMargin = 1; + Var->m_ColorPtr = &(g_TwMgr->m_HelpBar->m_ColHelpText); + Var->SetDefaults(); + _Grp->m_Vars.push_back(Var); + ++n; + } + } + return n; +} + +static int AppendHelp(CTwVarGroup *_Grp, const CTwVarGroup *_ToAppend, int _Level, int _Width) +{ + assert( _Grp!=NULL ); + assert( _ToAppend!=NULL ); + int n = 0; + string Decal; + for( int s=0; s<_Level; ++s ) + Decal += ' '; + + if( _ToAppend->m_Help.size()>0 ) + n += AppendHelpString(_Grp, _ToAppend->m_Help.c_str(), _Level, _Width, TW_TYPE_HELP_GRP); + + for( size_t i=0; i<_ToAppend->m_Vars.size(); ++i ) + if( _ToAppend->m_Vars[i]!=NULL && _ToAppend->m_Vars[i]->m_Visible ) + { + bool append = true; + if( !_ToAppend->m_Vars[i]->IsGroup() ) + { + const CTwVarAtom *a = static_cast(_ToAppend->m_Vars[i]); + if( a->m_Type==TW_TYPE_BUTTON && a->m_Val.m_Button.m_Callback==NULL ) + append = false; + else if( a->m_KeyIncr[0]==0 && a->m_KeyIncr[1]==0 && a->m_KeyDecr[0]==0 && a->m_KeyDecr[1]==0 && a->m_Help.length()<=0 ) + append = false; + } + else if( _ToAppend->m_Vars[i]->IsGroup() && static_cast(_ToAppend->m_Vars[i])->m_StructValuePtr!=NULL // that's a struct var + && _ToAppend->m_Vars[i]->m_Help.length()<=0 ) + append = false; + + if( append ) + { + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Name = Decal; + if( _ToAppend->m_Vars[i]->m_Label.size()>0 ) + Var->m_Name += _ToAppend->m_Vars[i]->m_Label; + else + Var->m_Name += _ToAppend->m_Vars[i]->m_Name; + Var->m_Ptr = NULL; + if( _ToAppend->m_Vars[i]->IsGroup() && static_cast(_ToAppend->m_Vars[i])->m_StructValuePtr!=NULL ) + { // That's a struct var + Var->m_Type = TW_TYPE_HELP_STRUCT; + Var->m_Val.m_HelpStruct.m_StructType = static_cast(_ToAppend->m_Vars[i])->m_StructType; + Var->m_ReadOnly = true; + Var->m_NoSlider = true; + } + else if( !_ToAppend->m_Vars[i]->IsGroup() ) + { + Var->m_Type = TW_TYPE_SHORTCUT; + Var->m_Val.m_Shortcut.m_Incr[0] = static_cast(_ToAppend->m_Vars[i])->m_KeyIncr[0]; + Var->m_Val.m_Shortcut.m_Incr[1] = static_cast(_ToAppend->m_Vars[i])->m_KeyIncr[1]; + Var->m_Val.m_Shortcut.m_Decr[0] = static_cast(_ToAppend->m_Vars[i])->m_KeyDecr[0]; + Var->m_Val.m_Shortcut.m_Decr[1] = static_cast(_ToAppend->m_Vars[i])->m_KeyDecr[1]; + Var->m_ReadOnly = static_cast(_ToAppend->m_Vars[i])->m_ReadOnly; + Var->m_NoSlider = true; + } + else + { + Var->m_Type = TW_TYPE_HELP_GRP; + Var->m_DontClip = true; + Var->m_LeftMargin = (signed short)((_Level+2)*g_TwMgr->m_HelpBar->m_Font->m_CharWidth[(int)' ']); + //Var->m_TopMargin = (signed short)(g_TwMgr->m_HelpBar->m_Font->m_CharHeight/2-2+2*(_Level-1)); + Var->m_TopMargin = 2; + if( Var->m_TopMargin>g_TwMgr->m_HelpBar->m_Font->m_CharHeight-3 ) + Var->m_TopMargin = (signed short)(g_TwMgr->m_HelpBar->m_Font->m_CharHeight-3); + Var->m_ReadOnly = true; + } + Var->SetDefaults(); + _Grp->m_Vars.push_back(Var); + size_t VarIndex = _Grp->m_Vars.size()-1; + ++n; + if( _ToAppend->m_Vars[i]->IsGroup() && static_cast(_ToAppend->m_Vars[i])->m_StructValuePtr==NULL ) + { + int nAppended = AppendHelp(_Grp, static_cast(_ToAppend->m_Vars[i]), _Level+1, _Width); + if( _Grp->m_Vars.size()==VarIndex+1 ) + { + delete _Grp->m_Vars[VarIndex]; + _Grp->m_Vars.resize(VarIndex); + } + else + n += nAppended; + } + else if( _ToAppend->m_Vars[i]->m_Help.length()>0 ) + n += AppendHelpString(_Grp, _ToAppend->m_Vars[i]->m_Help.c_str(), _Level+1, _Width, TW_TYPE_HELP_ATOM); + } + } + return n; +} + + +static void CopyHierarchy(CTwVarGroup *dst, const CTwVarGroup *src) +{ + if( dst==NULL || src==NULL ) + return; + + dst->m_Name = src->m_Name; + dst->m_Open = src->m_Open; + dst->m_Visible = src->m_Visible; + dst->m_ColorPtr = src->m_ColorPtr; + dst->m_DontClip = src->m_DontClip; + dst->m_IsRoot = src->m_IsRoot; + dst->m_LeftMargin = src->m_LeftMargin; + dst->m_TopMargin = src->m_TopMargin; + + dst->m_Vars.resize(src->m_Vars.size()); + for(size_t i=0; im_Vars.size(); ++i) + if( src->m_Vars[i]!=NULL && src->m_Vars[i]->IsGroup() ) + { + CTwVarGroup *grp = new CTwVarGroup; + CopyHierarchy(grp, static_cast(src->m_Vars[i])); + dst->m_Vars[i] = grp; + } + else + dst->m_Vars[i] = NULL; +} + +// copy the 'open' flag from original hierarchy to current hierarchy +static void SynchroHierarchy(CTwVarGroup *cur, const CTwVarGroup *orig) +{ + if( cur==NULL || orig==NULL ) + return; + + if( strcmp(cur->m_Name.c_str(), orig->m_Name.c_str())==0 ) + cur->m_Open = orig->m_Open; + + size_t j = 0; + while( jm_Vars.size() && (orig->m_Vars[j]==NULL || !orig->m_Vars[j]->IsGroup()) ) + ++j; + + for(size_t i=0; im_Vars.size(); ++i) + if( cur->m_Vars[i]!=NULL && cur->m_Vars[i]->IsGroup() && jm_Vars.size() && orig->m_Vars[j]!=NULL && orig->m_Vars[j]->IsGroup() ) + { + CTwVarGroup *curGrp = static_cast(cur->m_Vars[i]); + const CTwVarGroup *origGrp = static_cast(orig->m_Vars[j]); + if( strcmp(curGrp->m_Name.c_str(), origGrp->m_Name.c_str())==0 ) + { + curGrp->m_Open = origGrp->m_Open; + + SynchroHierarchy(curGrp, origGrp); + + ++j; + while( jm_Vars.size() && (orig->m_Vars[j]==NULL || !orig->m_Vars[j]->IsGroup()) ) + ++j; + } + } +} + + +void CTwMgr::UpdateHelpBar() +{ + if( m_HelpBar==NULL || m_HelpBar->IsMinimized() ) + return; + if( !m_HelpBarUpdateNow && (float)m_Timer.GetTime()m_VarRoot); + + TwRemoveAllVars(m_HelpBar); + + if( m_HelpBar->m_UpToDate ) + m_HelpBar->Update(); + + if( m_Help.size()>0 ) + AppendHelpString(&(m_HelpBar->m_VarRoot), m_Help.c_str(), 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + if( m_HelpBar->m_Help.size()>0 ) + AppendHelpString(&(m_HelpBar->m_VarRoot), m_HelpBar->m_Help.c_str(), 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + AppendHelpString(&(m_HelpBar->m_VarRoot), "", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_HEADER); + + for( size_t ib=0; ibm_IsHelpBar) && m_Bars[ib]!=m_PopupBar && m_Bars[ib]->m_Visible ) + { + // Create a group + CTwVarGroup *Grp = new CTwVarGroup; + Grp->m_SummaryCallback = NULL; + Grp->m_SummaryClientData = NULL; + Grp->m_StructValuePtr = NULL; + if( m_Bars[ib]->m_Label.size()<=0 ) + Grp->m_Name = m_Bars[ib]->m_Name; + else + Grp->m_Name = m_Bars[ib]->m_Label; + Grp->m_Open = true; + Grp->m_ColorPtr = &(m_HelpBar->m_ColGrpText); + m_HelpBar->m_VarRoot.m_Vars.push_back(Grp); + if( m_Bars[ib]->m_Help.size()>0 ) + AppendHelpString(Grp, m_Bars[ib]->m_Help.c_str(), 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_GRP); + + // Append variables (recursive) + AppendHelp(Grp, &(m_Bars[ib]->m_VarRoot), 1, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0); + + // Append structures + StructSet UsedStructs; + InsertUsedStructs(UsedStructs, &(m_Bars[ib]->m_VarRoot)); + CTwVarGroup *StructGrp = NULL; + int MemberCount = 0; + for( StructSet::iterator it=UsedStructs.begin(); it!=UsedStructs.end(); ++it ) + { + int idx = (*it) - TW_TYPE_STRUCT_BASE; + if( idx>=0 && idx<(int)g_TwMgr->m_Structs.size() && g_TwMgr->m_Structs[idx].m_Name.length()>0 ) + { + if( StructGrp==NULL ) + { + StructGrp = new CTwVarGroup; + StructGrp->m_StructType = TW_TYPE_HELP_STRUCT; // a special line background color will be used + StructGrp->m_Name = "Structures"; + StructGrp->m_Open = false; + StructGrp->m_ColorPtr = &(m_HelpBar->m_ColStructText); + //Grp->m_Vars.push_back(StructGrp); + MemberCount = 0; + } + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Ptr = NULL; + Var->m_Type = TW_TYPE_HELP_GRP; + Var->m_DontClip = true; + Var->m_LeftMargin = (signed short)(3*g_TwMgr->m_HelpBar->m_Font->m_CharWidth[(int)' ']); + Var->m_TopMargin = 2; + Var->m_ReadOnly = true; + Var->m_NoSlider = true; + Var->m_Name = '{'+g_TwMgr->m_Structs[idx].m_Name+'}'; + StructGrp->m_Vars.push_back(Var); + size_t structIndex = StructGrp->m_Vars.size()-1; + if( g_TwMgr->m_Structs[idx].m_Help.size()>0 ) + AppendHelpString(StructGrp, g_TwMgr->m_Structs[idx].m_Help.c_str(), 2, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0-2*Var->m_LeftMargin, TW_TYPE_HELP_ATOM); + + // Append struct members + for( size_t im=0; imm_Structs[idx].m_Members.size(); ++im ) + { + if( g_TwMgr->m_Structs[idx].m_Members[im].m_Help.size()>0 ) + { + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Ptr = NULL; + Var->m_Type = TW_TYPE_SHORTCUT; + Var->m_Val.m_Shortcut.m_Incr[0] = 0; + Var->m_Val.m_Shortcut.m_Incr[1] = 0; + Var->m_Val.m_Shortcut.m_Decr[0] = 0; + Var->m_Val.m_Shortcut.m_Decr[1] = 0; + Var->m_ReadOnly = false; + Var->m_NoSlider = true; + if( g_TwMgr->m_Structs[idx].m_Members[im].m_Label.length()>0 ) + Var->m_Name = " "+g_TwMgr->m_Structs[idx].m_Members[im].m_Label; + else + Var->m_Name = " "+g_TwMgr->m_Structs[idx].m_Members[im].m_Name; + StructGrp->m_Vars.push_back(Var); + //if( g_TwMgr->m_Structs[idx].m_Members[im].m_Help.size()>0 ) + AppendHelpString(StructGrp, g_TwMgr->m_Structs[idx].m_Members[im].m_Help.c_str(), 3, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0-4*Var->m_LeftMargin, TW_TYPE_HELP_ATOM); + } + } + + if( StructGrp->m_Vars.size()==structIndex+1 ) // remove struct from help + { + delete StructGrp->m_Vars[structIndex]; + StructGrp->m_Vars.resize(structIndex); + } + else + ++MemberCount; + } + } + if( StructGrp!=NULL ) + { + if( MemberCount==1 ) + StructGrp->m_Name = "Structure"; + if( StructGrp->m_Vars.size()>0 ) + Grp->m_Vars.push_back(StructGrp); + else + { + delete StructGrp; + StructGrp = NULL; + } + } + } + + // Append RotoSlider + CTwVarGroup *RotoGrp = new CTwVarGroup; + RotoGrp->m_SummaryCallback = NULL; + RotoGrp->m_SummaryClientData = NULL; + RotoGrp->m_StructValuePtr = NULL; + RotoGrp->m_Name = "RotoSlider"; + RotoGrp->m_Open = false; + RotoGrp->m_ColorPtr = &(m_HelpBar->m_ColGrpText); + m_HelpBar->m_VarRoot.m_Vars.push_back(RotoGrp); + AppendHelpString(RotoGrp, "The RotoSlider allows rapid editing of numerical values.", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + AppendHelpString(RotoGrp, "To modify a numerical value, click on its label or on its roto [.] button, then move the mouse outside of the grey circle while keeping the mouse button pressed, and turn around the circle to increase or decrease the numerical value.", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + AppendHelpString(RotoGrp, "The two grey lines depict the min and max bounds.", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + AppendHelpString(RotoGrp, "Moving the mouse far form the circle allows precise increase or decrease, while moving near the circle allows fast increase or decrease.", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + + SynchroHierarchy(&m_HelpBar->m_VarRoot, &prevHierarchy); + + m_HelpBarNotUpToDate = false; +} + +// --------------------------------------------------------------------------- + +#if defined(ANT_WINDOWS) + +#include "res/TwXCursors.h" + +void CTwMgr::CreateCursors() +{ + if( m_CursorsCreated ) + return; + m_CursorArrow = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_ARROW)); + m_CursorMove = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZEALL)); + m_CursorWE = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZEWE)); + m_CursorNS = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENS)); + m_CursorTopRight = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENESW)); + m_CursorTopLeft = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENWSE)); + m_CursorBottomLeft = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENESW)); + m_CursorBottomRight = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENWSE)); + m_CursorHelp = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_HELP)); + m_CursorCross = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_CROSS)); + m_CursorUpArrow = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_UPARROW)); + m_CursorNo = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_NO)); + m_CursorIBeam = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_IBEAM)); + #ifdef IDC_HAND + m_CursorHand = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_HAND)); + #else + m_CursorHand = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_UPARROW)); + #endif + int cur; + HMODULE hdll = GetModuleHandle(ANT_TWEAK_BAR_DLL); + if( hdll==NULL ) + g_UseCurRsc = false; // force the use of built-in cursors (not using resources) + if( g_UseCurRsc ) + m_CursorCenter = ::LoadCursor(hdll, MAKEINTRESOURCE(IDC_CURSOR1+0)); + else + m_CursorCenter = PixmapCursor(0); + if( m_CursorCenter==NULL ) + m_CursorCenter = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_CROSS)); + if( g_UseCurRsc ) + m_CursorPoint = ::LoadCursor(hdll, MAKEINTRESOURCE(IDC_CURSOR1+1)); + else + m_CursorPoint = PixmapCursor(1); + if( m_CursorPoint==NULL ) + m_CursorPoint = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_CROSS)); + + for( cur=0; cur>2) + y*8] |= (unsigned char)(g_CurPict[_CurIdx][x+y*32] << 2*(3-(x&3))+1); //turn whiteon + data[(x>>2) + y*8] |= (unsigned char)(g_CurMask[_CurIdx][x+y*32] << 2*(3-(x&3))); //turn the alpha all the way up + } + //printf("\n"); + } + NSImage *img = [[NSImage alloc] initWithSize: [imgr size]]; + [img addRepresentation: imgr]; + NSCursor *cur = [[NSCursor alloc] initWithImage: img hotSpot: NSMakePoint(g_CurHot[_CurIdx][0],g_CurHot[_CurIdx][1])]; + + [imgr autorelease]; + [img autorelease]; + if (cur) + return cur; + else + return [NSCursor arrowCursor]; +} + +void CTwMgr::CreateCursors() +{ + if (m_CursorsCreated) + return; + + m_CursorArrow = [[NSCursor arrowCursor] retain]; + m_CursorMove = [[NSCursor crosshairCursor] retain]; + m_CursorWE = [[NSCursor resizeLeftRightCursor] retain]; + m_CursorNS = [[NSCursor resizeUpDownCursor] retain]; + m_CursorTopRight = [[NSCursor arrowCursor] retain]; //osx not have one + m_CursorTopLeft = [[NSCursor arrowCursor] retain]; //osx not have one + m_CursorBottomRight = [[NSCursor arrowCursor] retain]; //osx not have one + m_CursorBottomLeft = [[NSCursor arrowCursor] retain]; //osx not have one + m_CursorHelp = [[NSCursor arrowCursor] retain]; //osx not have one + m_CursorHand = [[NSCursor pointingHandCursor] retain]; + m_CursorCross = [[NSCursor arrowCursor] retain]; + m_CursorUpArrow = [[NSCursor arrowCursor] retain]; + m_CursorNo = [[NSCursor arrowCursor] retain]; + m_CursorIBeam = [[NSCursor IBeamCursor] retain]; + for (int i=0;ierror_code, err->request_code); + // No exit! + return 0 ; +} + +static void IgnoreXErrors() +{ + if( g_TwMgr!=NULL && g_TwMgr->m_CurrentXDisplay==glXGetCurrentDisplay() ) + { + XFlush(g_TwMgr->m_CurrentXDisplay); + XSync(g_TwMgr->m_CurrentXDisplay, False); + } + s_PrevErrorHandler = XSetErrorHandler(InactiveErrorHandler); +} + +static void RestoreXErrors() +{ + if( g_TwMgr!=NULL && g_TwMgr->m_CurrentXDisplay==glXGetCurrentDisplay() ) + { + XFlush(g_TwMgr->m_CurrentXDisplay); + XSync(g_TwMgr->m_CurrentXDisplay, False); + } + XSetErrorHandler(s_PrevErrorHandler); +} + +CTwMgr::CCursor CTwMgr::PixmapCursor(int _CurIdx) +{ + if( !m_CurrentXDisplay || !m_CurrentXWindow ) + return XC_left_ptr; + + IgnoreXErrors(); + + XColor black, white, exact; + Colormap colmap = DefaultColormap(m_CurrentXDisplay, DefaultScreen(m_CurrentXDisplay)); + Status s1 = XAllocNamedColor(m_CurrentXDisplay, colmap, "black", &black, &exact); + Status s2 = XAllocNamedColor(m_CurrentXDisplay, colmap, "white", &white, &exact); + if( s1==0 || s2==0 ) + return XC_left_ptr; // cannot allocate colors! + int x, y; + unsigned int mask[32]; + unsigned int pict[32]; + for( y=0; y<32; ++y ) + { + mask[y] = pict[y] = 0; + for( x=0; x<32; ++x ) + { + mask[y] |= (((unsigned int)(g_CurMask[_CurIdx][x+y*32]))<m_CurrentXDisplay ) + { + Window wnd = glXGetCurrentDrawable(); + if( wnd!=g_TwMgr->m_CurrentXWindow ) + { + FreeCursors(); + g_TwMgr->m_CurrentXWindow = wnd; + CreateCursors(); + // now _Cursor is not a valid cursor ID. + } + else + { + IgnoreXErrors(); + XDefineCursor(m_CurrentXDisplay, m_CurrentXWindow, _Cursor); + RestoreXErrors(); + } + } + } +} + +#endif //defined(ANT_UNIX) + +// --------------------------------------------------------------------------- + +void ANT_CALL TwCopyCDStringToClientFunc(TwCopyCDStringToClient copyCDStringToClientFunc) +{ + g_InitCopyCDStringToClient = copyCDStringToClientFunc; + if( g_TwMgr!=NULL ) + g_TwMgr->m_CopyCDStringToClient = copyCDStringToClientFunc; +} + +void ANT_CALL TwCopyCDStringToLibrary(char **destinationLibraryStringPtr, const char *sourceClientString) +{ + if( g_TwMgr==NULL ) + { + if( destinationLibraryStringPtr!=NULL ) + *destinationLibraryStringPtr = const_cast(sourceClientString); + return; + } + + // static buffer to store sourceClientString copy associated to sourceClientString pointer + std::vector& Buf = g_TwMgr->m_CDStdStringCopyBuffers[(void *)sourceClientString]; + + size_t len = (sourceClientString!=NULL) ? strlen(sourceClientString) : 0; + if( Buf.size()m_CopyStdStringToClient = copyStdStringToClientFunc; +} + +void ANT_CALL TwCopyStdStringToLibrary(std::string& destLibraryString, const std::string& srcClientString) +{ + /* + // check if destLibraryString should be initialized + char *Mem = (char *)&destLibraryString; + bool Init = true; + for( int i=0; i& Buf = g_TwMgr->m_CDStdStringCopyBuffers[(void *)&srcClientString]; + + size_t len = strlen(SrcStr); + if( Buf.size()& _OutRects) const +{ + if( Empty() ) + return false; + if( _Rect.Empty() || _Rect.Y>=Y+H || _Rect.Y+_Rect.H<=Y || _Rect.X>=X+W || _Rect.X+_Rect.W<=X ) + { + _OutRects.push_back(*this); + return true; + } + + bool Ret = false; + int Y0 = Y; + int Y1 = Y+H-1; + if( _Rect.Y>Y ) + { + Y0 = _Rect.Y; + _OutRects.push_back(CRect(X, Y, W, Y0-Y+1)); + Ret = true; + } + if( _Rect.Y+_Rect.HX ) + { + X0 = _Rect.X; //-2; + _OutRects.push_back(CRect(X, Y0, X0-X+1, Y1-Y0+1)); + Ret = true; + } + if( _Rect.X+_Rect.W& _Rects, vector& _OutRects) const +{ + _OutRects.clear(); + size_t i, j, NbRects = _Rects.size(); + if( NbRects==0 ) + { + _OutRects.push_back(*this); + return true; + } + else + { + vector TmpRects; + Subtract(_Rects[0], _OutRects); + + for( i=1; i +#define ANT_CALL TW_CALL + +#include "TwColors.h" +#include "TwFonts.h" +#include "TwGraph.h" +#include "AntPerfTimer.h" + + +//#define BENCH // uncomment to activate benchmarks + +#ifdef BENCH +# define PERF(cmd) cmd +#else // BENCH +# define PERF(cmd) +#endif // BENCH + +const int NB_ROTO_CURSORS = 12; + + +// --------------------------------------------------------------------------- +// API unexposed by AntTweakBar.h +// --------------------------------------------------------------------------- + +// bar states -> use TwDefine instead +typedef enum ETwState +{ + TW_STATE_SHOWN = 1, + TW_STATE_ICONIFIED = 2, + TW_STATE_HIDDEN = 3, + TW_STATE_UNICONIFIED = 4, + TW_STATE_ERROR = 0 +} TwState; +/*ANT_TWEAK_BAR_API*/ int ANT_CALL TwSetBarState(TwBar *bar, TwState state); +/*ANT_TWEAK_BAR_API*/ //TwState ANT_CALL TwGetBarState(const TwBar *bar); +// var states -> use TwDefine instead: visible/iconified implemented only as string commands +//ANT_TWEAK_BAR_API int ANT_CALL TwSetVarState(TwBar *bar, const char *name, TwState state); +//ANT_TWEAK_BAR_API TwState ANT_CALL TwGetVarState(const TwBar *bar, const char *name); + +struct CTwVarGroup; +typedef void (ANT_CALL *TwStructExtInitCallback)(void *structExtValue, void *clientData); +typedef void (ANT_CALL *TwCopyVarFromExtCallback)(void *structValue, const void *structExtValue, unsigned int structExtMemberIndex, void *clientData); +typedef void (ANT_CALL *TwCopyVarToExtCallback)(const void *structValue, void *structExtValue, unsigned int structExtMemberIndex, void *clientData); +/*ANT_TWEAK_BAR_API*/ TwType ANT_CALL TwDefineStructExt(const char *name, const TwStructMember *structExtMembers, unsigned int nbExtMembers, size_t structSize, size_t structExtSize, TwStructExtInitCallback structExtInitCallback, TwCopyVarFromExtCallback copyVarFromExtCallback, TwCopyVarToExtCallback copyVarToExtCallback, TwSummaryCallback summaryCallback, void *clientData, const char *help); +typedef void (ANT_CALL *TwCustomDrawCallback)(int w, int h, void *structExtValue, void *clientData, TwBar *bar, CTwVarGroup *varGrp); +typedef bool (ANT_CALL *TwCustomMouseMotionCallback)(int mouseX, int mouseY, int w, int h, void *structExtValue, void *clientData, TwBar *bar, CTwVarGroup *varGrp); +typedef bool (ANT_CALL *TwCustomMouseButtonCallback)(TwMouseButtonID button, bool pressed, int mouseX, int mouseY, int w, int h, void *structExtValue, void *clientData, TwBar *bar, CTwVarGroup *varGrp); +typedef void (ANT_CALL *TwCustomMouseLeaveCallback)(void *structExtValue, void *clientData, TwBar *bar); + +enum ERetType +{ + RET_ERROR = 0, + RET_DOUBLE, + RET_STRING +}; + +enum EButtonAlign +{ + BUTTON_ALIGN_LEFT, + BUTTON_ALIGN_CENTER, + BUTTON_ALIGN_RIGHT +}; + +// --------------------------------------------------------------------------- +// AntTweakBar Manager +// --------------------------------------------------------------------------- + +struct CTwMgr +{ + ETwGraphAPI m_GraphAPI; + void * m_Device; + int m_WndID; + class ITwGraph * m_Graph; + int m_WndWidth; + int m_WndHeight; + const CTexFont * m_CurrentFont; + + std::vector m_Bars; + std::vector m_Order; + + std::vector m_MinOccupied; + void Minimize(TwBar *_Bar); + void Maximize(TwBar *_Bar); + void Hide(TwBar *_Bar); + void Unhide(TwBar *_Bar); + void SetFont(const CTexFont *_Font, bool _ResizeBars); + int m_LastMouseX; + int m_LastMouseY; + int m_LastMouseWheelPos; + int m_IconPos; // 0: bottom-left, 1:bottom-right, 2:top-left, 3:top-right + int m_IconAlign; // 0: vertical, 1: horizontal + int m_IconMarginX, m_IconMarginY; + bool m_FontResizable; + std::string m_BarAlwaysOnTop; + std::string m_BarAlwaysOnBottom; + bool m_UseOldColorScheme; + bool m_Contained; + EButtonAlign m_ButtonAlign; + bool m_OverlapContent; + bool m_Terminating; + + std::string m_Help; + TwBar * m_HelpBar; + float m_LastHelpUpdateTime; + void UpdateHelpBar(); + bool m_HelpBarNotUpToDate; + bool m_HelpBarUpdateNow; + void * m_KeyPressedTextObj; + bool m_KeyPressedBuildText; + std::string m_KeyPressedStr; + float m_KeyPressedTime; + void * m_InfoTextObj; + bool m_InfoBuildText; + int m_BarInitColorHue; + int FindBar(const char *_Name) const; + int HasAttrib(const char *_Attrib, bool *_HasValue) const; + int SetAttrib(int _AttribID, const char *_Value); + ERetType GetAttrib(int _AttribID, std::vector& outDouble, std::ostringstream& outString) const; + void SetLastError(const char *_StaticErrorMesssage); // _StaticErrorMesssage must be a static string + const char * GetLastError(); // returns a static string describing the error, and set LastError to NULL + const char * CheckLastError() const; // returns the LastError, but does not set it to NULL + void SetCurrentDbgParams(const char *file, int line); + TwBar * m_PopupBar; + //bool IsProcessing() const { return m_Processing); + //void SetProcessing(bool processing) { m_Processing = processing; } + + CTwMgr(ETwGraphAPI _GraphAPI, void *_Device, int _WndID); + ~CTwMgr(); + + struct CStructMember + { + std::string m_Name; + std::string m_Label; + TwType m_Type; + size_t m_Offset; + std::string m_DefString; + size_t m_Size; + std::string m_Help; + }; + struct CStruct + { + std::string m_Name; + std::vector m_Members; + size_t m_Size; + TwSummaryCallback m_SummaryCallback; + void * m_SummaryClientData; + std::string m_Help; + bool m_IsExt; + size_t m_ClientStructSize; + TwStructExtInitCallback m_StructExtInitCallback; + TwCopyVarFromExtCallback m_CopyVarFromExtCallback; + TwCopyVarToExtCallback m_CopyVarToExtCallback; + void * m_ExtClientData; + CStruct() : m_IsExt(false), m_StructExtInitCallback(NULL), m_CopyVarFromExtCallback(NULL), m_CopyVarToExtCallback(NULL), m_ExtClientData(NULL) {} + static void ANT_CALL DefaultSummary(char *_SummaryString, size_t _SummaryMaxLength, const void *_Value, void *_ClientData); + static void * s_PassProxyAsClientData; + }; + std::vector m_Structs; + + // followings are used for TwAddVarCB( ... StructType ... ) + struct CStructProxy + { + TwType m_Type; + void * m_StructData; + bool m_DeleteStructData; + void * m_StructExtData; + TwSetVarCallback m_StructSetCallback; + TwGetVarCallback m_StructGetCallback; + void * m_StructClientData; + TwCustomDrawCallback m_CustomDrawCallback; + TwCustomMouseMotionCallback m_CustomMouseMotionCallback; + TwCustomMouseButtonCallback m_CustomMouseButtonCallback; + TwCustomMouseLeaveCallback m_CustomMouseLeaveCallback; + bool m_CustomCaptureFocus; + int m_CustomIndexFirst; + int m_CustomIndexLast; + CStructProxy(); + ~CStructProxy(); + }; + struct CMemberProxy + { + CStructProxy * m_StructProxy; + int m_MemberIndex; + struct CTwVar * m_Var; + struct CTwVarGroup * m_VarParent; + CTwBar * m_Bar; + CMemberProxy(); + ~CMemberProxy(); + static void ANT_CALL SetCB(const void *_Value, void *_ClientData); + static void ANT_CALL GetCB(void *_Value, void *_ClientData); + }; + std::list m_StructProxies; // elements should not move + std::list m_MemberProxies; // elements should not move + //void InitVarData(TwType _Type, void *_Data, size_t _Size); + //void UninitVarData(TwType _Type, void *_Data, size_t _Size); + + struct CEnum + { + std::string m_Name; + typedef std::map CEntries; + CEntries m_Entries; + }; + std::vector m_Enums; + + TwType m_TypeColor32; + TwType m_TypeColor3F; + TwType m_TypeColor4F; + TwType m_TypeQuat4F; + TwType m_TypeQuat4D; + TwType m_TypeDir3F; + TwType m_TypeDir3D; + + std::vector m_CSStringBuffer; + struct CCDStdString + { + std::string * m_ClientStdStringPtr; + char m_LocalString[sizeof(std::string)+2*sizeof(void*)]; //+2*sizeof(void*) because of VC++ std::string extra info in Debug + TwSetVarCallback m_ClientSetCallback; + TwGetVarCallback m_ClientGetCallback; + void * m_ClientData; + static void ANT_CALL SetCB(const void *_Value, void *_ClientData); + static void ANT_CALL GetCB(void *_Value, void *_ClientData); + }; + std::list m_CDStdStrings; + struct CClientStdString // Convertion between VC++ Debug/Release std::string + { + CClientStdString(); + void FromLib(const char *libStr); + std::string& ToClient(); + private: + char m_Data[sizeof(std::string)+2*sizeof(void *)]; + std::string m_LibStr; + }; + struct CLibStdString // Convertion between VC++ Debug/Release std::string + { + CLibStdString(); + void FromClient(const std::string& clientStr); + std::string& ToLib(); + private: + char m_Data[sizeof(std::string)+2*sizeof(void *)]; + }; + struct CCDStdStringRecord + { + void * m_DataPtr; + char m_PrevValue[sizeof(std::string)+2*sizeof(void*)]; + CClientStdString m_ClientStdString; + }; + std::vector m_CDStdStringRecords; + void UnrollCDStdString(std::vector& _Records, TwType _Type, void *_Data); + void RestoreCDStdString(const std::vector& _Records); + std::map > m_CDStdStringCopyBuffers; + + struct CCustom // custom var type + { + virtual ~CCustom() = 0; + }; + std::vector m_Customs; + + PerfTimer m_Timer; + double m_LastMousePressedTime; + TwMouseButtonID m_LastMousePressedButtonID; + int m_LastMousePressedPosition[2]; + double m_RepeatMousePressedDelay; + double m_RepeatMousePressedPeriod; + bool m_CanRepeatMousePressed; + bool m_IsRepeatingMousePressed; + double m_LastDrawTime; + + #if defined(ANT_WINDOWS) + typedef HCURSOR CCursor; + CCursor PixmapCursor(int _CurIdx); + #elif defined(ANT_UNIX) + typedef Cursor CCursor; + CCursor PixmapCursor(int _CurIdx); + Display * m_CurrentXDisplay; + Window m_CurrentXWindow; + #elif defined(ANT_OSX) + typedef NSCursor * CCursor; + CCursor PixmapCursor(int _CurIdx); + #endif // defined(ANT_UNIX) + bool m_CursorsCreated; + void CreateCursors(); + void FreeCursors(); + void SetCursor(CCursor _Cursor); + CCursor m_CursorArrow; + CCursor m_CursorMove; + CCursor m_CursorWE; + CCursor m_CursorNS; + CCursor m_CursorTopLeft; + CCursor m_CursorTopRight; + CCursor m_CursorBottomLeft; + CCursor m_CursorBottomRight; + CCursor m_CursorHelp; + CCursor m_CursorHand; + CCursor m_CursorCross; + CCursor m_CursorUpArrow; + CCursor m_CursorNo; + CCursor m_CursorIBeam; + CCursor m_RotoCursors[NB_ROTO_CURSORS]; + CCursor m_CursorCenter; + CCursor m_CursorPoint; + + TwCopyCDStringToClient m_CopyCDStringToClient; + TwCopyStdStringToClient m_CopyStdStringToClient; + size_t m_ClientStdStringStructSize; + TwType m_ClientStdStringBaseType; + +protected: + int m_NbMinimizedBars; + const char * m_LastError; + const char * m_CurrentDbgFile; + int m_CurrentDbgLine; + //bool m_Processing; +}; + +extern CTwMgr *g_TwMgr; + + +// --------------------------------------------------------------------------- +// Extra functions and TwTypes +// --------------------------------------------------------------------------- + + +bool TwGetKeyCode(int *_Code, int *_Modif, const char *_String); +bool TwGetKeyString(std::string *_String, int _Code, int _Modif); + +const TwType TW_TYPE_SHORTCUT = TwType(0xfff1); +const TwType TW_TYPE_HELP_GRP = TwType(0xfff2); +const TwType TW_TYPE_HELP_ATOM = TwType(0xfff3); +const TwType TW_TYPE_HELP_HEADER = TwType(0xfff4); +const TwType TW_TYPE_HELP_STRUCT = TwType(0xfff5); +const TwType TW_TYPE_BUTTON = TwType(0xfff6); +const TwType TW_TYPE_CDSTDSTRING = TwType(0xfff7); +const TwType TW_TYPE_STRUCT_BASE = TwType(0x10000000); +const TwType TW_TYPE_ENUM_BASE = TwType(0x20000000); +const TwType TW_TYPE_CSSTRING_BASE = TW_TYPE_CSSTRING(0); // defined as 0x30000000 (see AntTweakBar.h) +const TwType TW_TYPE_CSSTRING_MAX = TW_TYPE_CSSTRING(0xfffffff); +#define TW_CSSTRING_SIZE(type) ((int)((type)&0xfffffff)) +const TwType TW_TYPE_CUSTOM_BASE = TwType(0x40000000); +const TwType TW_TYPE_STDSTRING_VS2008 = TwType(0x2fff0000); +const TwType TW_TYPE_STDSTRING_VS2010 = TwType(0x2ffe0000); + +extern "C" int ANT_CALL TwSetLastError(const char *_StaticErrorMessage); + +//const TwGraphAPI TW_OPENGL_CORE = (TwGraphAPI)5; // WIP (note: OpenGL Core Profil requires OpenGL 3.2 or later) + +// Clipping helper +struct CRect +{ + int X, Y, W, H; + CRect() : X(0), Y(0), W(0), H(0) {} + CRect(int _X, int _Y, int _W, int _H) : X(_X), Y(_Y), W(_W), H(_H) {} + bool operator==(const CRect& _Rect) { return (Empty() && _Rect.Empty()) || (X==_Rect.X && Y==_Rect.Y && W==_Rect.W && H==_Rect.H); } + bool Empty(int _Margin=0) const { return (W<=_Margin || H<=_Margin); } + bool Subtract(const CRect& _Rect, std::vector& _OutRects) const; + bool Subtract(const std::vector& _Rects, std::vector& _OutRects) const; +}; + + +// --------------------------------------------------------------------------- +// Global bar attribs +// --------------------------------------------------------------------------- + + +enum EMgrAttribs +{ + MGR_HELP = 1, + MGR_FONT_SIZE, + MGR_FONT_STYLE, + MGR_ICON_POS, + MGR_ICON_ALIGN, + MGR_ICON_MARGIN, + MGR_FONT_RESIZABLE, + MGR_COLOR_SCHEME, + MGR_CONTAINED, + MGR_BUTTON_ALIGN, + MGR_OVERLAP +}; + + +// --------------------------------------------------------------------------- +// Color struct ext +// --------------------------------------------------------------------------- + + +struct CColorExt +{ + int R, G, B; + int H, L, S; + int A; + bool m_HLS, m_HasAlpha, m_OGL; + bool m_CanHaveAlpha; + bool m_IsColorF; + unsigned int m_PrevConvertedColor; + CTwMgr::CStructProxy*m_StructProxy; + void RGB2HLS(); + void HLS2RGB(); + static void ANT_CALL InitColor32CB(void *_ExtValue, void *_ClientData); + static void ANT_CALL InitColor3FCB(void *_ExtValue, void *_ClientData); + static void ANT_CALL InitColor4FCB(void *_ExtValue, void *_ClientData); + static void ANT_CALL CopyVarFromExtCB(void *_VarValue, const void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData); + static void ANT_CALL CopyVarToExtCB(const void *_VarValue, void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData); + static void ANT_CALL SummaryCB(char *_SummaryString, size_t _SummaryMaxLength, const void *_ExtValue, void *_ClientData); + static void CreateTypes(); +}; + + +// --------------------------------------------------------------------------- +// Quaternion struct ext +// --------------------------------------------------------------------------- + + +struct CQuaternionExt +{ + double Qx, Qy, Qz, Qs; // Quat value + double Vx, Vy, Vz, Angle; // Not used + double Dx, Dy, Dz; // Dir value set when used as a direction + bool m_AAMode; // Axis & angle mode -> disabled + bool m_ShowVal; // Display values + bool m_IsFloat; // Quat/Dir uses floats + bool m_IsDir; // Mapped to a dir vector instead of a quat + double m_Dir[3]; // If not zero, display one direction vector + color32 m_DirColor; // Direction vector color + float m_Permute[3][3]; // Permute frame axis + CTwMgr::CStructProxy*m_StructProxy; + static void ANT_CALL InitQuat4FCB(void *_ExtValue, void *_ClientData); + static void ANT_CALL InitQuat4DCB(void *_ExtValue, void *_ClientData); + static void ANT_CALL InitDir3FCB(void *_ExtValue, void *_ClientData); + static void ANT_CALL InitDir3DCB(void *_ExtValue, void *_ClientData); + static void ANT_CALL CopyVarFromExtCB(void *_VarValue, const void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData); + static void ANT_CALL CopyVarToExtCB(const void *_VarValue, void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData); + static void ANT_CALL SummaryCB(char *_SummaryString, size_t _SummaryMaxLength, const void *_ExtValue, void *_ClientData); + static void ANT_CALL DrawCB(int _W, int _H, void *_ExtValue, void *_ClientData, TwBar *_Bar, CTwVarGroup *varGrp); + static bool ANT_CALL MouseMotionCB(int _MouseX, int _MouseY, int _W, int _H, void *_StructExtValue, void *_ClientData, TwBar *_Bar, CTwVarGroup *varGrp); + static bool ANT_CALL MouseButtonCB(TwMouseButtonID _Button, bool _Pressed, int _MouseX, int _MouseY, int _W, int _H, void *_StructExtValue, void *_ClientData, TwBar *_Bar, CTwVarGroup *varGrp); + static void ANT_CALL MouseLeaveCB(void *_StructExtValue, void *_ClientData, TwBar *_Bar); + static void CreateTypes(); + static TwType s_CustomType; + void ConvertToAxisAngle(); + void ConvertFromAxisAngle(); + void CopyToVar(); + static std::vector s_SphTri; + static std::vector s_SphCol; + static std::vector s_SphTriProj; + static std::vector s_SphColLight; + static std::vector s_ArrowTri[4]; + static std::vector s_ArrowTriProj[4]; + static std::vector s_ArrowNorm[4]; + static std::vector s_ArrowColLight[4]; + enum EArrowParts { ARROW_CONE, ARROW_CONE_CAP, ARROW_CYL, ARROW_CYL_CAP }; + static void CreateSphere(); + static void CreateArrow(); + static void ApplyQuat(float *outX, float *outY, float *outZ, float x, float y, float z, float qx, float qy, float qz, float qs); + static void QuatFromDir(double *outQx, double *outQy, double *outQz, double *outQs, double dx, double dy, double dz); + inline void Permute(float *outX, float *outY, float *outZ, float x, float y, float z); + inline void PermuteInv(float *outX, float *outY, float *outZ, float x, float y, float z); + inline void Permute(double *outX, double *outY, double *outZ, double x, double y, double z); + inline void PermuteInv(double *outX, double *outY, double *outZ, double x, double y, double z); + bool m_Highlighted; + bool m_Rotating; + double m_OrigQuat[4]; + float m_OrigX, m_OrigY; + double m_PrevX, m_PrevY; +}; + + +// --------------------------------------------------------------------------- +// CTwFPU objects set and restore the fpu precision if needed. +// (could be useful because DirectX changes it and AntTweakBar requires default double precision) +// --------------------------------------------------------------------------- + + +struct CTwFPU +{ + CTwFPU() + { + #ifdef ANT_WINDOWS + state0 = _controlfp(0, 0); + if( (state0&MCW_PC)==_PC_24 ) // we need at least _PC_53 + _controlfp(_PC_53, MCW_PC); + #else + state0 = 0; + #endif + } + ~CTwFPU() + { + #ifdef ANT_WINDOWS + if( (state0&MCW_PC)==_PC_24 ) + _controlfp(_PC_24, MCW_PC); + #else + state0 = 0; + #endif + } +private: + unsigned int state0; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_MGR_INCLUDED diff --git a/AntTweakBar/src/TwOpenGL.cpp b/AntTweakBar/src/TwOpenGL.cpp new file mode 100644 index 0000000..043a6db --- /dev/null +++ b/AntTweakBar/src/TwOpenGL.cpp @@ -0,0 +1,906 @@ +// --------------------------------------------------------------------------- +// +// @file TwOpenGL.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "LoadOGL.h" +#include "TwOpenGL.h" +#include "TwMgr.h" + +using namespace std; + +const char *g_ErrCantLoadOGL = "Cannot load OpenGL library dynamically"; +const char *g_ErrCantUnloadOGL = "Cannot unload OpenGL library"; + +GLuint g_SmallFontTexID = 0; +GLuint g_NormalFontTexID = 0; +GLuint g_LargeFontTexID = 0; + +// --------------------------------------------------------------------------- +// Extensions + +typedef void (APIENTRY * PFNGLBindBufferARB)(GLenum target, GLuint buffer); +typedef void (APIENTRY * PFNGLBindProgramARB)(GLenum target, GLuint program); +typedef GLuint (APIENTRY * PFNGLGetHandleARB)(GLenum pname); +typedef void (APIENTRY * PFNGLUseProgramObjectARB)(GLuint programObj); +typedef void (APIENTRY * PFNGLTexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (APIENTRY * PFNGLActiveTextureARB)(GLenum texture); +typedef void (APIENTRY * PFNGLClientActiveTextureARB)(GLenum texture); +typedef void (APIENTRY * PFNGLBlendEquation)(GLenum mode); +typedef void (APIENTRY * PFNGLBlendEquationSeparate)(GLenum srcMode, GLenum dstMode); +typedef void (APIENTRY * PFNGLBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRY * PFNGLBindVertexArray)(GLuint array); +typedef void (APIENTRY * PFNGLEnableVertexAttribArray) (GLuint index); +typedef void (APIENTRY * PFNGLDisableVertexAttribArray) (GLuint index); +typedef void (APIENTRY * PFNGLGetVertexAttribiv) (GLuint, GLenum, GLint*); +PFNGLBindBufferARB _glBindBufferARB = NULL; +PFNGLBindProgramARB _glBindProgramARB = NULL; +PFNGLGetHandleARB _glGetHandleARB = NULL; +PFNGLUseProgramObjectARB _glUseProgramObjectARB = NULL; +PFNGLTexImage3D _glTexImage3D = NULL; +PFNGLActiveTextureARB _glActiveTextureARB = NULL; +PFNGLClientActiveTextureARB _glClientActiveTextureARB = NULL; +PFNGLBlendEquation _glBlendEquation = NULL; +PFNGLBlendEquationSeparate _glBlendEquationSeparate = NULL; +PFNGLBlendFuncSeparate _glBlendFuncSeparate = NULL; +PFNGLBindVertexArray _glBindVertexArray = NULL; +PFNGLEnableVertexAttribArray _glEnableVertexAttribArray = NULL; +PFNGLDisableVertexAttribArray _glDisableVertexAttribArray = NULL; +PFNGLGetVertexAttribiv _glGetVertexAttribiv = NULL; +#ifndef GL_ARRAY_BUFFER_ARB +# define GL_ARRAY_BUFFER_ARB 0x8892 +#endif +#ifndef GL_ELEMENT_ARRAY_BUFFER_ARB +# define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#endif +#ifndef GL_ARRAY_BUFFER_BINDING_ARB +# define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#endif +#ifndef GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB +# define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#endif +#ifndef GL_VERTEX_PROGRAM_ARB +# define GL_VERTEX_PROGRAM_ARB 0x8620 +#endif +#ifndef GL_FRAGMENT_PROGRAM_ARB +# define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#endif +#ifndef GL_PROGRAM_OBJECT_ARB +# define GL_PROGRAM_OBJECT_ARB 0x8B40 +#endif +#ifndef GL_TEXTURE_3D +# define GL_TEXTURE_3D 0x806F +#endif +#ifndef GL_TEXTURE0_ARB +# define GL_TEXTURE0_ARB 0x84C0 +#endif +#ifndef GL_ACTIVE_TEXTURE_ARB +# define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#endif +#ifndef GL_CLIENT_ACTIVE_TEXTURE_ARB +# define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#endif +#ifndef GL_MAX_TEXTURE_UNITS_ARB +# define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#endif +#ifndef GL_MAX_TEXTURE_COORDS +# define GL_MAX_TEXTURE_COORDS 0x8871 +#endif +#ifndef GL_TEXTURE_RECTANGLE_ARB +# define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#endif +#ifndef GL_FUNC_ADD +# define GL_FUNC_ADD 0x8006 +#endif +#ifndef GL_BLEND_EQUATION +# define GL_BLEND_EQUATION 0x8009 +#endif +#ifndef GL_BLEND_EQUATION_RGB +# define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#endif +#ifndef GL_BLEND_EQUATION_ALPHA +# define GL_BLEND_EQUATION_ALPHA 0x883D +#endif +#ifndef GL_BLEND_SRC_RGB +# define GL_BLEND_SRC_RGB 0x80C9 +#endif +#ifndef GL_BLEND_DST_RGB +# define GL_BLEND_DST_RGB 0x80C8 +#endif +#ifndef GL_BLEND_SRC_ALPHA +# define GL_BLEND_SRC_ALPHA 0x80CB +#endif +#ifndef GL_BLEND_DST_ALPHA +# define GL_BLEND_DST_ALPHA 0x80CA +#endif +#ifndef GL_VERTEX_ARRAY_BINDING +# define GL_VERTEX_ARRAY_BINDING 0x85B5 +#endif +#ifndef GL_MAX_VERTEX_ATTRIBS +# define GL_MAX_VERTEX_ATTRIBS 0x8869 +#endif +#ifndef GL_VERTEX_ATTRIB_ARRAY_ENABLED +# define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#endif + +// --------------------------------------------------------------------------- + +#ifdef _DEBUG + static void CheckGLError(const char *file, int line, const char *func) + { + int err=0; + char msg[256]; + while( (err=_glGetError())!=0 ) + { + sprintf(msg, "%s(%d) : [%s] GL_ERROR=0x%x\n", file, line, func, err); + #ifdef ANT_WINDOWS + OutputDebugString(msg); + #endif + fprintf(stderr, msg); + } + } +# ifdef __FUNCTION__ +# define CHECK_GL_ERROR CheckGLError(__FILE__, __LINE__, __FUNCTION__) +# else +# define CHECK_GL_ERROR CheckGLError(__FILE__, __LINE__, "") +# endif +#else +# define CHECK_GL_ERROR ((void)(0)) +#endif + +// --------------------------------------------------------------------------- + +static GLuint BindFont(const CTexFont *_Font) +{ + GLuint TexID = 0; + _glGenTextures(1, &TexID); + _glBindTexture(GL_TEXTURE_2D, TexID); + _glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE); + _glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); + _glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + _glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + _glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + _glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + _glPixelTransferf(GL_ALPHA_SCALE, 1); + _glPixelTransferf(GL_ALPHA_BIAS, 0); + _glPixelTransferf(GL_RED_BIAS, 1); + _glPixelTransferf(GL_GREEN_BIAS, 1); + _glPixelTransferf(GL_BLUE_BIAS, 1); + _glTexImage2D(GL_TEXTURE_2D, 0, 4, _Font->m_TexWidth, _Font->m_TexHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, _Font->m_TexBytes); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); + _glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + _glBindTexture(GL_TEXTURE_2D, 0); + _glPixelTransferf(GL_ALPHA_BIAS, 0); + _glPixelTransferf(GL_RED_BIAS, 0); + _glPixelTransferf(GL_GREEN_BIAS, 0); + _glPixelTransferf(GL_BLUE_BIAS, 0); + + return TexID; +} + +static void UnbindFont(GLuint _FontTexID) +{ + if( _FontTexID>0 ) + _glDeleteTextures(1, &_FontTexID); +} + +// --------------------------------------------------------------------------- + +int CTwGraphOpenGL::Init() +{ + m_Drawing = false; + m_FontTexID = 0; + m_FontTex = NULL; + m_MaxClipPlanes = -1; + + if( LoadOpenGL()==0 ) + { + g_TwMgr->SetLastError(g_ErrCantLoadOGL); + return 0; + } + + // Get extensions + _glBindBufferARB = reinterpret_cast(_glGetProcAddress("glBindBufferARB")); + _glBindProgramARB = reinterpret_cast(_glGetProcAddress("glBindProgramARB")); + _glGetHandleARB = reinterpret_cast(_glGetProcAddress("glGetHandleARB")); + _glUseProgramObjectARB = reinterpret_cast(_glGetProcAddress("glUseProgramObjectARB")); + _glTexImage3D = reinterpret_cast(_glGetProcAddress("glTexImage3D")); + _glActiveTextureARB = reinterpret_cast(_glGetProcAddress("glActiveTextureARB")); + _glClientActiveTextureARB = reinterpret_cast(_glGetProcAddress("glClientActiveTextureARB")); + _glBlendEquation = reinterpret_cast(_glGetProcAddress("glBlendEquation")); + _glBlendEquationSeparate = reinterpret_cast(_glGetProcAddress("glBlendEquationSeparate")); + _glBlendFuncSeparate = reinterpret_cast(_glGetProcAddress("glBlendFuncSeparate")); + _glBindVertexArray = reinterpret_cast(_glGetProcAddress("glBindVertexArray")); + _glEnableVertexAttribArray = reinterpret_cast(_glGetProcAddress("glEnableVertexAttribArray")); + _glDisableVertexAttribArray = reinterpret_cast(_glGetProcAddress("glDisableVertexAttribArray")); + _glGetVertexAttribiv = reinterpret_cast(_glGetProcAddress("glGetVertexAttribiv")); + + m_SupportTexRect = false; // updated in BeginDraw + + return 1; +} + +// --------------------------------------------------------------------------- + +int CTwGraphOpenGL::Shut() +{ + assert(m_Drawing==false); + + UnbindFont(m_FontTexID); + + int Res = 1; + if( UnloadOpenGL()==0 ) + { + g_TwMgr->SetLastError(g_ErrCantUnloadOGL); + Res = 0; + } + + return Res; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::BeginDraw(int _WndWidth, int _WndHeight) +{ + assert(m_Drawing==false && _WndWidth>0 && _WndHeight>0); + m_Drawing = true; + m_WndWidth = _WndWidth; + m_WndHeight = _WndHeight; + + CHECK_GL_ERROR; + +//#if !defined(ANT_OSX) + static bool s_SupportTexRectChecked = false; + if (!s_SupportTexRectChecked) + { + const char *ext = (const char *)_glGetString(GL_EXTENSIONS); + if( ext!=0 && strlen(ext)>0 ) + m_SupportTexRect = (strstr(ext, "GL_ARB_texture_rectangle")!=NULL); + s_SupportTexRectChecked = true; + } +//#endif + + _glPushAttrib(GL_ALL_ATTRIB_BITS); + _glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + + if( _glActiveTextureARB ) + { + _glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &m_PrevActiveTextureARB); + _glGetIntegerv(GL_CLIENT_ACTIVE_TEXTURE_ARB, &m_PrevClientActiveTextureARB); + GLint maxTexUnits = 1; + _glGetIntegerv(GL_MAX_TEXTURE_COORDS, &maxTexUnits); // was GL_MAX_TEXTURE_UNITS_ARB + if( maxTexUnits<1 ) + maxTexUnits = 1; + else if( maxTexUnits > MAX_TEXTURES ) + maxTexUnits = MAX_TEXTURES; + GLint i; + for( i=0; i0 && _WndHeight>0 ) + { + Vp[0] = 0; + Vp[1] = 0; + Vp[2] = _WndWidth; + Vp[3] = _WndHeight; + _glViewport(Vp[0], Vp[1], Vp[2], Vp[3]); + } + _glLoadIdentity(); + //_glOrtho(Vp[0], Vp[0]+Vp[2]-1, Vp[1]+Vp[3]-1, Vp[1], -1, 1); // Doesn't work + _glOrtho(Vp[0], Vp[0]+Vp[2], Vp[1]+Vp[3], Vp[1], -1, 1); + */ + if( _WndWidth>0 && _WndHeight>0 ) + { + Vp[0] = 0; + Vp[1] = 0; + Vp[2] = _WndWidth-1; + Vp[3] = _WndHeight-1; + _glViewport(Vp[0], Vp[1], Vp[2], Vp[3]); + } + _glLoadIdentity(); + _glOrtho(Vp[0], Vp[0]+Vp[2], Vp[1]+Vp[3], Vp[1], -1, 1); + _glGetIntegerv(GL_VIEWPORT, m_ViewportInit); + _glGetFloatv(GL_PROJECTION_MATRIX, m_ProjMatrixInit); + + _glGetFloatv(GL_LINE_WIDTH, &m_PrevLineWidth); + _glDisable(GL_POLYGON_STIPPLE); + _glLineWidth(1); + _glDisable(GL_LINE_SMOOTH); + _glDisable(GL_LINE_STIPPLE); + _glDisable(GL_CULL_FACE); + _glDisable(GL_DEPTH_TEST); + _glDisable(GL_LIGHTING); + _glEnable(GL_BLEND); + _glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + _glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &m_PrevTexEnv); + _glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + _glGetIntegerv(GL_POLYGON_MODE, m_PrevPolygonMode); + _glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + _glDisable(GL_ALPHA_TEST); + //_glEnable(GL_ALPHA_TEST); + //_glAlphaFunc(GL_GREATER, 0); + _glDisable(GL_FOG); + _glDisable(GL_LOGIC_OP); + _glDisable(GL_SCISSOR_TEST); + if( m_MaxClipPlanes<0 ) + { + _glGetIntegerv(GL_MAX_CLIP_PLANES, &m_MaxClipPlanes); + if( m_MaxClipPlanes<0 || m_MaxClipPlanes>255 ) + m_MaxClipPlanes = 6; + } + for( GLint i=0; iMAX_VERTEX_ATTRIBS) + maxVertexAttribs=MAX_VERTEX_ATTRIBS; + + for(int i=0; i MAX_TEXTURES ) + maxTexUnits = MAX_TEXTURES; + GLint i; + for( i=0; iMAX_VERTEX_ATTRIBS) + maxVertexAttribs=MAX_VERTEX_ATTRIBS; + + for(int i=0; i_X1) + ++_X0; + if(_Y0<_Y1) + ++_Y1; + else if(_Y0>_Y1) + ++_Y0; + */ + //const GLfloat dx = +0.0f; + const GLfloat dx = +0.5f; + //GLfloat dy = -0.2f; + const GLfloat dy = -0.5f; + if( _AntiAliased ) + _glEnable(GL_LINE_SMOOTH); + else + _glDisable(GL_LINE_SMOOTH); + _glDisable(GL_TEXTURE_2D); + _glMatrixMode(GL_MODELVIEW); + _glLoadIdentity(); + _glBegin(GL_LINES); + _glColor4ub(GLubyte(_Color0>>16), GLubyte(_Color0>>8), GLubyte(_Color0), GLubyte(_Color0>>24)); + _glVertex2f((GLfloat)_X0+dx, (GLfloat)_Y0+dy); + _glColor4ub(GLubyte(_Color1>>16), GLubyte(_Color1>>8), GLubyte(_Color1), GLubyte(_Color1>>24)); + _glVertex2f((GLfloat)_X1+dx, (GLfloat)_Y1+dy); + //_glVertex2i(_X0, _Y0); + //_glVertex2i(_X1, _Y1); + _glEnd(); + _glDisable(GL_LINE_SMOOTH); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) +{ + assert(m_Drawing==true); + + /* + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + ++_Y1; + else if(_Y0>_Y1) + ++_Y0; + */ + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + --_Y0; + else if(_Y0>_Y1) + --_Y1; + const GLfloat dx = +0.0f; + const GLfloat dy = +0.0f; + + _glDisable(GL_TEXTURE_2D); + _glMatrixMode(GL_MODELVIEW); + _glLoadIdentity(); + //GLubyte r = GLubyte(_Color>>16); + //GLubyte g = GLubyte(_Color>>8); + //GLubyte b = GLubyte(_Color); + //GLubyte a = GLubyte(_Color>>24); + //_glColor4ub(GLubyte(_Color>>16), GLubyte(_Color>>8), GLubyte(_Color), GLubyte(_Color>>24)); + //_glColor4ub(r, g, b, a); + _glBegin(GL_QUADS); + _glColor4ub(GLubyte(_Color00>>16), GLubyte(_Color00>>8), GLubyte(_Color00), GLubyte(_Color00>>24)); + _glVertex2f((GLfloat)_X0+dx, (GLfloat)_Y0+dy); + _glColor4ub(GLubyte(_Color10>>16), GLubyte(_Color10>>8), GLubyte(_Color10), GLubyte(_Color10>>24)); + _glVertex2f((GLfloat)_X1+dx, (GLfloat)_Y0+dy); + _glColor4ub(GLubyte(_Color11>>16), GLubyte(_Color11>>8), GLubyte(_Color11), GLubyte(_Color11>>24)); + _glVertex2f((GLfloat)_X1+dx, (GLfloat)_Y1+dy); + _glColor4ub(GLubyte(_Color01>>16), GLubyte(_Color01>>8), GLubyte(_Color01), GLubyte(_Color01>>24)); + _glVertex2f((GLfloat)_X0+dx, (GLfloat)_Y1+dy); + _glEnd(); +} + +// --------------------------------------------------------------------------- + +void *CTwGraphOpenGL::NewTextObj() +{ + return new CTextObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::DeleteTextObj(void *_TextObj) +{ + assert(_TextObj!=NULL); + delete static_cast(_TextObj); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + assert(_Font!=NULL); + + if( _Font != m_FontTex ) + { + UnbindFont(m_FontTexID); + m_FontTexID = BindFont(_Font); + m_FontTex = _Font; + } + CTextObj *TextObj = static_cast(_TextObj); + TextObj->m_TextVerts.resize(0); + TextObj->m_TextUVs.resize(0); + TextObj->m_BgVerts.resize(0); + TextObj->m_Colors.resize(0); + TextObj->m_BgColors.resize(0); + + int x, x1, y, y1, i, Len; + unsigned char ch; + const unsigned char *Text; + color32 LineColor = COLOR32_RED; + for( int Line=0; Line<_NbLines; ++Line ) + { + x = 0; + y = Line * (_Font->m_CharHeight+_Sep); + y1 = y+_Font->m_CharHeight; + Len = (int)_TextLines[Line].length(); + Text = (const unsigned char *)(_TextLines[Line].c_str()); + if( _LineColors!=NULL ) + LineColor = (_LineColors[Line]&0xff00ff00) | GLubyte(_LineColors[Line]>>16) | (GLubyte(_LineColors[Line])<<16); + + for( i=0; im_CharWidth[ch]; + + TextObj->m_TextVerts.push_back(Vec2(x , y )); + TextObj->m_TextVerts.push_back(Vec2(x1, y )); + TextObj->m_TextVerts.push_back(Vec2(x , y1)); + TextObj->m_TextVerts.push_back(Vec2(x1, y )); + TextObj->m_TextVerts.push_back(Vec2(x1, y1)); + TextObj->m_TextVerts.push_back(Vec2(x , y1)); + + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV1[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV1[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV1[ch])); + + if( _LineColors!=NULL ) + { + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + } + + x = x1; + } + if( _BgWidth>0 ) + { + TextObj->m_BgVerts.push_back(Vec2(-1 , y )); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y )); + TextObj->m_BgVerts.push_back(Vec2(-1 , y1)); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y )); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y1)); + TextObj->m_BgVerts.push_back(Vec2(-1 , y1)); + + if( _LineBgColors!=NULL ) + { + color32 LineBgColor = (_LineBgColors[Line]&0xff00ff00) | GLubyte(_LineBgColors[Line]>>16) | (GLubyte(_LineBgColors[Line])<<16); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + } + } + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + CTextObj *TextObj = static_cast(_TextObj); + + if( TextObj->m_TextVerts.size()<4 && TextObj->m_BgVerts.size()<4 ) + return; // nothing to draw + + _glMatrixMode(GL_MODELVIEW); + _glLoadIdentity(); + _glTranslatef((GLfloat)_X, (GLfloat)_Y, 0); + _glEnableClientState(GL_VERTEX_ARRAY); + if( (_BgColor!=0 || TextObj->m_BgColors.size()==TextObj->m_BgVerts.size()) && TextObj->m_BgVerts.size()>=4 ) + { + _glDisable(GL_TEXTURE_2D); + _glVertexPointer(2, GL_FLOAT, 0, &(TextObj->m_BgVerts[0])); + if( TextObj->m_BgColors.size()==TextObj->m_BgVerts.size() && _BgColor==0 ) + { + _glEnableClientState(GL_COLOR_ARRAY); + _glColorPointer(4, GL_UNSIGNED_BYTE, 0, &(TextObj->m_BgColors[0])); + } + else + { + _glDisableClientState(GL_COLOR_ARRAY); + _glColor4ub(GLubyte(_BgColor>>16), GLubyte(_BgColor>>8), GLubyte(_BgColor), GLubyte(_BgColor>>24)); + } + _glDrawArrays(GL_TRIANGLES, 0, (int)TextObj->m_BgVerts.size()); + } + _glEnable(GL_TEXTURE_2D); + _glBindTexture(GL_TEXTURE_2D, m_FontTexID); + _glEnableClientState(GL_TEXTURE_COORD_ARRAY); + if( TextObj->m_TextVerts.size()>=4 ) + { + _glVertexPointer(2, GL_FLOAT, 0, &(TextObj->m_TextVerts[0])); + _glTexCoordPointer(2, GL_FLOAT, 0, &(TextObj->m_TextUVs[0])); + if( TextObj->m_Colors.size()==TextObj->m_TextVerts.size() && _Color==0 ) + { + _glEnableClientState(GL_COLOR_ARRAY); + _glColorPointer(4, GL_UNSIGNED_BYTE, 0, &(TextObj->m_Colors[0])); + } + else + { + _glDisableClientState(GL_COLOR_ARRAY); + _glColor4ub(GLubyte(_Color>>16), GLubyte(_Color>>8), GLubyte(_Color), GLubyte(_Color>>24)); + } + + _glDrawArrays(GL_TRIANGLES, 0, (int)TextObj->m_TextVerts.size()); + } + + _glDisableClientState(GL_VERTEX_ARRAY); + _glDisableClientState(GL_TEXTURE_COORD_ARRAY); + _glDisableClientState(GL_COLOR_ARRAY); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY) +{ + if( _Width>0 && _Height>0 ) + { + GLint vp[4]; + vp[0] = _X0; + vp[1] = _Y0; + vp[2] = _Width-1; + vp[3] = _Height-1; + _glViewport(vp[0], m_WndHeight-vp[1]-vp[3], vp[2], vp[3]); + + GLint matrixMode = 0; + _glGetIntegerv(GL_MATRIX_MODE, &matrixMode); + _glMatrixMode(GL_PROJECTION); + _glLoadIdentity(); + _glOrtho(_OffsetX, _OffsetX+vp[2], vp[3]-_OffsetY, -_OffsetY, -1, 1); + _glMatrixMode(matrixMode); + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::RestoreViewport() +{ + _glViewport(m_ViewportInit[0], m_ViewportInit[1], m_ViewportInit[2], m_ViewportInit[3]); + + GLint matrixMode = 0; + _glGetIntegerv(GL_MATRIX_MODE, &matrixMode); + _glMatrixMode(GL_PROJECTION); + _glLoadMatrixf(m_ProjMatrixInit); + _glMatrixMode(matrixMode); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::SetScissor(int _X0, int _Y0, int _Width, int _Height) +{ + if( _Width>0 && _Height>0 ) + { + _glScissor(_X0-1, m_WndHeight-_Y0-_Height, _Width-1, _Height); + _glEnable(GL_SCISSOR_TEST); + } + else + _glDisable(GL_SCISSOR_TEST); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode) +{ + assert(m_Drawing==true); + + const GLfloat dx = +0.0f; + const GLfloat dy = +0.0f; + + GLint prevCullFaceMode, prevFrontFace; + _glGetIntegerv(GL_CULL_FACE_MODE, &prevCullFaceMode); + _glGetIntegerv(GL_FRONT_FACE, &prevFrontFace); + GLboolean prevCullEnable = _glIsEnabled(GL_CULL_FACE); + _glCullFace(GL_BACK); + _glEnable(GL_CULL_FACE); + if( _CullMode==CULL_CW ) + _glFrontFace(GL_CCW); + else if( _CullMode==CULL_CCW ) + _glFrontFace(GL_CW); + else + _glDisable(GL_CULL_FACE); + + _glDisable(GL_TEXTURE_2D); + _glMatrixMode(GL_MODELVIEW); + _glLoadIdentity(); + _glBegin(GL_TRIANGLES); + for(int i=0; i<3*_NumTriangles; ++i) + { + color32 col = _Colors[i]; + _glColor4ub(GLubyte(col>>16), GLubyte(col>>8), GLubyte(col), GLubyte(col>>24)); + _glVertex2f((GLfloat)_Vertices[2*i+0]+dx, (GLfloat)_Vertices[2*i+1]+dy); + } + _glEnd(); + + _glCullFace(prevCullFaceMode); + _glFrontFace(prevFrontFace); + if( prevCullEnable ) + _glEnable(GL_CULL_FACE); + else + _glDisable(GL_CULL_FACE); +} + +// --------------------------------------------------------------------------- diff --git a/AntTweakBar/src/TwOpenGL.h b/AntTweakBar/src/TwOpenGL.h new file mode 100644 index 0000000..c87c3bc --- /dev/null +++ b/AntTweakBar/src/TwOpenGL.h @@ -0,0 +1,98 @@ +// --------------------------------------------------------------------------- +// +// @file TwOpenGL.h +// @brief OpenGL graph functions +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_OPENGL_INCLUDED +#define ANT_TW_OPENGL_INCLUDED + +#include "TwGraph.h" + +// --------------------------------------------------------------------------- + +class CTwGraphOpenGL : public ITwGraph +{ +public: + virtual int Init(); + virtual int Shut(); + virtual void BeginDraw(int _WndWidth, int _WndHeight); + virtual void EndDraw(); + virtual bool IsDrawing(); + virtual void Restore(); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) { DrawLine(_X0, _Y0, _X1, _Y1, _Color, _Color, _AntiAliased); } + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11); + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) { DrawRect(_X0, _Y0, _X1, _Y1, _Color, _Color, _Color, _Color); } + virtual void DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode); + + virtual void * NewTextObj(); + virtual void DeleteTextObj(void *_TextObj); + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth); + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor); + + virtual void ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY); + virtual void RestoreViewport(); + virtual void SetScissor(int _X0, int _Y0, int _Width, int _Height); + +protected: + bool m_Drawing; + GLuint m_FontTexID; + const CTexFont * m_FontTex; + GLfloat m_PrevLineWidth; + GLint m_PrevTexEnv; + GLint m_PrevPolygonMode[2]; + GLint m_MaxClipPlanes; + GLint m_PrevTexture; + GLint m_PrevArrayBufferARB; + GLint m_PrevElementArrayBufferARB; + GLboolean m_PrevVertexProgramARB; + GLboolean m_PrevFragmentProgramARB; + GLuint m_PrevProgramObjectARB; + GLboolean m_PrevTexture3D; + enum EMaxTextures { MAX_TEXTURES = 128 }; + GLboolean m_PrevActiveTexture1D[MAX_TEXTURES]; + GLboolean m_PrevActiveTexture2D[MAX_TEXTURES]; + GLboolean m_PrevActiveTexture3D[MAX_TEXTURES]; + GLboolean m_PrevClientTexCoordArray[MAX_TEXTURES]; + GLint m_PrevActiveTextureARB; + GLint m_PrevClientActiveTextureARB; + bool m_SupportTexRect; + GLboolean m_PrevTexRectARB; + GLint m_PrevBlendEquation; + GLint m_PrevBlendEquationRGB; + GLint m_PrevBlendEquationAlpha; + GLint m_PrevBlendSrcRGB; + GLint m_PrevBlendDstRGB; + GLint m_PrevBlendSrcAlpha; + GLint m_PrevBlendDstAlpha; + GLuint m_PrevVertexArray; + GLint m_ViewportInit[4]; + GLfloat m_ProjMatrixInit[16]; + enum EMaxVtxAttribs { MAX_VERTEX_ATTRIBS = 128 }; + GLint m_PrevEnabledVertexAttrib[MAX_VERTEX_ATTRIBS]; + int m_WndWidth; + int m_WndHeight; + + struct Vec2 { GLfloat x, y; Vec2(){} Vec2(GLfloat _X, GLfloat _Y):x(_X),y(_Y){} Vec2(int _X, int _Y):x(GLfloat(_X)),y(GLfloat(_Y)){} }; + struct CTextObj + { + std::vector m_TextVerts; + std::vector m_TextUVs; + std::vector m_BgVerts; + std::vectorm_Colors; + std::vectorm_BgColors; + }; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_OPENGL_INCLUDED diff --git a/AntTweakBar/src/TwOpenGLCore.cpp b/AntTweakBar/src/TwOpenGLCore.cpp new file mode 100644 index 0000000..e431e65 --- /dev/null +++ b/AntTweakBar/src/TwOpenGLCore.cpp @@ -0,0 +1,933 @@ +// --------------------------------------------------------------------------- +// +// @file TwOpenGLCore.cpp +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// --------------------------------------------------------------------------- + +/* +#pragma warning GL3 //// used for development +#define GL3_PROTOTYPES 1 //// +#include //// +#define ANT_OGL_HEADER_INCLUDED //// +*/ + +#if defined ANT_OSX +# include +# define ANT_OGL_HEADER_INCLUDED +#endif +#include "TwPrecomp.h" +#include "LoadOGLCore.h" +#include "TwOpenGLCore.h" +#include "TwMgr.h" + +using namespace std; + +extern const char *g_ErrCantLoadOGL; +extern const char *g_ErrCantUnloadOGL; + +// --------------------------------------------------------------------------- + +#ifdef _DEBUG + static void CheckGLCoreError(const char *file, int line, const char *func) + { + int err=0; + char msg[256]; + while( (err=_glGetError())!=0 ) + { + sprintf(msg, "%s(%d) : [%s] GL_CORE_ERROR=0x%x\n", file, line, func, err); + #ifdef ANT_WINDOWS + OutputDebugString(msg); + #endif + fprintf(stderr, msg); + } + } +# ifdef __FUNCTION__ +# define CHECK_GL_ERROR CheckGLCoreError(__FILE__, __LINE__, __FUNCTION__) +# else +# define CHECK_GL_ERROR CheckGLCoreError(__FILE__, __LINE__, "") +# endif +#else +# define CHECK_GL_ERROR ((void)(0)) +#endif + +// --------------------------------------------------------------------------- + +static GLuint BindFont(const CTexFont *_Font) +{ + GLuint TexID = 0; + _glGenTextures(1, &TexID); + _glBindTexture(GL_TEXTURE_2D, TexID); + _glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE); + _glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); + _glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + _glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + _glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + _glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + _glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, _Font->m_TexWidth, _Font->m_TexHeight, 0, GL_RED, GL_UNSIGNED_BYTE, _Font->m_TexBytes); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); + _glBindTexture(GL_TEXTURE_2D, 0); + + return TexID; +} + +static void UnbindFont(GLuint _FontTexID) +{ + if( _FontTexID>0 ) + _glDeleteTextures(1, &_FontTexID); +} + +// --------------------------------------------------------------------------- + +static GLuint CompileShader(GLuint shader) +{ + _glCompileShader(shader); CHECK_GL_ERROR; + + GLint status; + _glGetShaderiv(shader, GL_COMPILE_STATUS, &status); CHECK_GL_ERROR; + if (status == GL_FALSE) + { + GLint infoLogLength; + _glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); CHECK_GL_ERROR; + + GLchar strInfoLog[256]; + _glGetShaderInfoLog(shader, sizeof(strInfoLog), NULL, strInfoLog); CHECK_GL_ERROR; +#ifdef ANT_WINDOWS + OutputDebugString("Compile failure: "); + OutputDebugString(strInfoLog); + OutputDebugString("\n"); +#endif + fprintf(stderr, "Compile failure: %s\n", strInfoLog); + shader = 0; + } + + return shader; +} + +static GLuint LinkProgram(GLuint program) +{ + _glLinkProgram(program); CHECK_GL_ERROR; + + GLint status; + _glGetProgramiv(program, GL_LINK_STATUS, &status); CHECK_GL_ERROR; + if (status == GL_FALSE) + { + GLint infoLogLength; + _glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength); CHECK_GL_ERROR; + + GLchar strInfoLog[256]; + _glGetProgramInfoLog(program, sizeof(strInfoLog), NULL, strInfoLog); CHECK_GL_ERROR; +#ifdef ANT_WINDOWS + OutputDebugString("Linker failure: "); + OutputDebugString(strInfoLog); + OutputDebugString("\n"); +#endif + fprintf(stderr, "Linker failure: %s\n", strInfoLog); + program = 0; + } + + return program; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::ResizeTriBuffers(size_t _NewSize) +{ + m_TriBufferSize = _NewSize; + + _glBindVertexArray(m_TriVArray); + + _glBindBuffer(GL_ARRAY_BUFFER, m_TriVertices); + _glBufferData(GL_ARRAY_BUFFER, m_TriBufferSize*sizeof(Vec2), 0, GL_DYNAMIC_DRAW); + + _glBindBuffer(GL_ARRAY_BUFFER, m_TriUVs); + _glBufferData(GL_ARRAY_BUFFER, m_TriBufferSize*sizeof(Vec2), 0, GL_DYNAMIC_DRAW); + + _glBindBuffer(GL_ARRAY_BUFFER, m_TriColors); + _glBufferData(GL_ARRAY_BUFFER, m_TriBufferSize*sizeof(color32), 0, GL_DYNAMIC_DRAW); + + CHECK_GL_ERROR; +} + +// --------------------------------------------------------------------------- + +int CTwGraphOpenGLCore::Init() +{ + m_Drawing = false; + m_FontTexID = 0; + m_FontTex = NULL; + + if( LoadOpenGLCore()==0 ) + { + g_TwMgr->SetLastError(g_ErrCantLoadOGL); + return 0; + } + + // Create line/rect shaders + const GLchar *lineRectVS[] = { + "#version 150 core\n" + "in vec3 vertex;" + "in vec4 color;" + "out vec4 fcolor;" + "void main() { gl_Position = vec4(vertex, 1); fcolor = color; }" + }; + m_LineRectVS = _glCreateShader(GL_VERTEX_SHADER); + _glShaderSource(m_LineRectVS, 1, lineRectVS, NULL); + CompileShader(m_LineRectVS); + + const GLchar *lineRectFS[] = { + "#version 150 core\n" + "precision highp float;" + "in vec4 fcolor;" + "out vec4 outColor;" + "void main() { outColor = fcolor; }" + }; + m_LineRectFS = _glCreateShader(GL_FRAGMENT_SHADER); + _glShaderSource(m_LineRectFS, 1, lineRectFS, NULL); + CompileShader(m_LineRectFS); + + m_LineRectProgram = _glCreateProgram(); + _glAttachShader(m_LineRectProgram, m_LineRectVS); + _glAttachShader(m_LineRectProgram, m_LineRectFS); + _glBindAttribLocation(m_LineRectProgram, 0, "vertex"); + _glBindAttribLocation(m_LineRectProgram, 1, "color"); + LinkProgram(m_LineRectProgram); + + // Create line/rect vertex buffer + const GLfloat lineRectInitVertices[] = { 0,0,0, 0,0,0, 0,0,0, 0,0,0 }; + const color32 lineRectInitColors[] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }; + _glGenVertexArrays(1, &m_LineRectVArray); + _glBindVertexArray(m_LineRectVArray); + _glGenBuffers(1, &m_LineRectVertices); + _glBindBuffer(GL_ARRAY_BUFFER, m_LineRectVertices); + _glBufferData(GL_ARRAY_BUFFER, sizeof(lineRectInitVertices), lineRectInitVertices, GL_DYNAMIC_DRAW); + _glGenBuffers(1, &m_LineRectColors); + _glBindBuffer(GL_ARRAY_BUFFER, m_LineRectColors); + _glBufferData(GL_ARRAY_BUFFER, sizeof(lineRectInitColors), lineRectInitColors, GL_DYNAMIC_DRAW); + + // Create triangles shaders + const GLchar *triVS[] = { + "#version 150 core\n" + "uniform vec2 offset;" + "uniform vec2 wndSize;" + "in vec2 vertex;" + "in vec4 color;" + "out vec4 fcolor;" + "void main() { gl_Position = vec4(2.0*(vertex.x+offset.x-0.5)/wndSize.x - 1.0, 1.0 - 2.0*(vertex.y+offset.y-0.5)/wndSize.y, 0, 1); fcolor = color; }" + }; + m_TriVS = _glCreateShader(GL_VERTEX_SHADER); + _glShaderSource(m_TriVS, 1, triVS, NULL); + CompileShader(m_TriVS); + + const GLchar *triUniVS[] = { + "#version 150 core\n" + "uniform vec2 offset;" + "uniform vec2 wndSize;" + "uniform vec4 color;" + "in vec2 vertex;" + "out vec4 fcolor;" + "void main() { gl_Position = vec4(2.0*(vertex.x+offset.x-0.5)/wndSize.x - 1.0, 1.0 - 2.0*(vertex.y+offset.y-0.5)/wndSize.y, 0, 1); fcolor = color; }" + }; + m_TriUniVS = _glCreateShader(GL_VERTEX_SHADER); + _glShaderSource(m_TriUniVS, 1, triUniVS, NULL); + CompileShader(m_TriUniVS); + + m_TriFS = m_TriUniFS = m_LineRectFS; + + m_TriProgram = _glCreateProgram(); + _glAttachShader(m_TriProgram, m_TriVS); + _glAttachShader(m_TriProgram, m_TriFS); + _glBindAttribLocation(m_TriProgram, 0, "vertex"); + _glBindAttribLocation(m_TriProgram, 1, "color"); + LinkProgram(m_TriProgram); + m_TriLocationOffset = _glGetUniformLocation(m_TriProgram, "offset"); + m_TriLocationWndSize = _glGetUniformLocation(m_TriProgram, "wndSize"); + + m_TriUniProgram = _glCreateProgram(); + _glAttachShader(m_TriUniProgram, m_TriUniVS); + _glAttachShader(m_TriUniProgram, m_TriUniFS); + _glBindAttribLocation(m_TriUniProgram, 0, "vertex"); + _glBindAttribLocation(m_TriUniProgram, 1, "color"); + LinkProgram(m_TriUniProgram); + m_TriUniLocationOffset = _glGetUniformLocation(m_TriUniProgram, "offset"); + m_TriUniLocationWndSize = _glGetUniformLocation(m_TriUniProgram, "wndSize"); + m_TriUniLocationColor = _glGetUniformLocation(m_TriUniProgram, "color"); + + const GLchar *triTexFS[] = { + "#version 150 core\n" + "precision highp float;" + "uniform sampler2D tex;" + "in vec2 fuv;" + "in vec4 fcolor;" + "out vec4 outColor;" +// texture2D is deprecated and replaced by texture with GLSL 3.30 but it seems +// that on Mac Lion backward compatibility is not ensured. +#if defined(ANT_OSX) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1070) + "void main() { outColor.rgb = fcolor.bgr; outColor.a = fcolor.a * texture(tex, fuv).r; }" +#else + "void main() { outColor.rgb = fcolor.bgr; outColor.a = fcolor.a * texture2D(tex, fuv).r; }" +#endif + }; + m_TriTexFS = _glCreateShader(GL_FRAGMENT_SHADER); + _glShaderSource(m_TriTexFS, 1, triTexFS, NULL); + CompileShader(m_TriTexFS); + + const GLchar *triTexVS[] = { + "#version 150 core\n" + "uniform vec2 offset;" + "uniform vec2 wndSize;" + "in vec2 vertex;" + "in vec2 uv;" + "in vec4 color;" + "out vec2 fuv;" + "out vec4 fcolor;" + "void main() { gl_Position = vec4(2.0*(vertex.x+offset.x-0.5)/wndSize.x - 1.0, 1.0 - 2.0*(vertex.y+offset.y-0.5)/wndSize.y, 0, 1); fuv = uv; fcolor = color; }" + }; + m_TriTexVS = _glCreateShader(GL_VERTEX_SHADER); + _glShaderSource(m_TriTexVS, 1, triTexVS, NULL); + CompileShader(m_TriTexVS); + + const GLchar *triTexUniVS[] = { + "#version 150 core\n" + "uniform vec2 offset;" + "uniform vec2 wndSize;" + "uniform vec4 color;" + "in vec2 vertex;" + "in vec2 uv;" + "out vec4 fcolor;" + "out vec2 fuv;" + "void main() { gl_Position = vec4(2.0*(vertex.x+offset.x-0.5)/wndSize.x - 1.0, 1.0 - 2.0*(vertex.y+offset.y-0.5)/wndSize.y, 0, 1); fuv = uv; fcolor = color; }" + }; + m_TriTexUniVS = _glCreateShader(GL_VERTEX_SHADER); + _glShaderSource(m_TriTexUniVS, 1, triTexUniVS, NULL); + CompileShader(m_TriTexUniVS); + + m_TriTexUniFS = m_TriTexFS; + + m_TriTexProgram = _glCreateProgram(); + _glAttachShader(m_TriTexProgram, m_TriTexVS); + _glAttachShader(m_TriTexProgram, m_TriTexFS); + _glBindAttribLocation(m_TriTexProgram, 0, "vertex"); + _glBindAttribLocation(m_TriTexProgram, 1, "uv"); + _glBindAttribLocation(m_TriTexProgram, 2, "color"); + LinkProgram(m_TriTexProgram); + m_TriTexLocationOffset = _glGetUniformLocation(m_TriTexProgram, "offset"); + m_TriTexLocationWndSize = _glGetUniformLocation(m_TriTexProgram, "wndSize"); + m_TriTexLocationTexture = _glGetUniformLocation(m_TriTexProgram, "tex"); + + m_TriTexUniProgram = _glCreateProgram(); + _glAttachShader(m_TriTexUniProgram, m_TriTexUniVS); + _glAttachShader(m_TriTexUniProgram, m_TriTexUniFS); + _glBindAttribLocation(m_TriTexUniProgram, 0, "vertex"); + _glBindAttribLocation(m_TriTexUniProgram, 1, "uv"); + _glBindAttribLocation(m_TriTexUniProgram, 2, "color"); + LinkProgram(m_TriTexUniProgram); + m_TriTexUniLocationOffset = _glGetUniformLocation(m_TriTexUniProgram, "offset"); + m_TriTexUniLocationWndSize = _glGetUniformLocation(m_TriTexUniProgram, "wndSize"); + m_TriTexUniLocationColor = _glGetUniformLocation(m_TriTexUniProgram, "color"); + m_TriTexUniLocationTexture = _glGetUniformLocation(m_TriTexUniProgram, "tex"); + + // Create tri vertex buffer + _glGenVertexArrays(1, &m_TriVArray); + _glGenBuffers(1, &m_TriVertices); + _glGenBuffers(1, &m_TriUVs); + _glGenBuffers(1, &m_TriColors); + ResizeTriBuffers(16384); // set initial size + + CHECK_GL_ERROR; + return 1; +} + +// --------------------------------------------------------------------------- + +int CTwGraphOpenGLCore::Shut() +{ + assert(m_Drawing==false); + + UnbindFont(m_FontTexID); + + CHECK_GL_ERROR; + + _glDeleteProgram(m_LineRectProgram); m_LineRectProgram = 0; + _glDeleteShader(m_LineRectVS); m_LineRectVS = 0; + _glDeleteShader(m_LineRectFS); m_LineRectFS = 0; + + _glDeleteProgram(m_TriProgram); m_TriProgram = 0; + _glDeleteShader(m_TriVS); m_TriVS = 0; + + _glDeleteProgram(m_TriUniProgram); m_TriUniProgram = 0; + _glDeleteShader(m_TriUniVS); m_TriUniVS = 0; + + _glDeleteProgram(m_TriTexProgram); m_TriTexProgram = 0; + _glDeleteShader(m_TriTexVS); m_TriTexVS = 0; + _glDeleteShader(m_TriTexFS); m_TriTexFS = 0; + + _glDeleteProgram(m_TriTexUniProgram); m_TriTexUniProgram = 0; + _glDeleteShader(m_TriTexUniVS); m_TriTexUniVS = 0; + + _glDeleteBuffers(1, &m_LineRectVertices); m_LineRectVertices = 0; + _glDeleteBuffers(1, &m_LineRectColors); m_LineRectColors = 0; + _glDeleteVertexArrays(1, &m_LineRectVArray); m_LineRectVArray = 0; + + _glDeleteBuffers(1, &m_TriVertices); m_TriVertices = 0; + _glDeleteBuffers(1, &m_TriColors); m_TriColors = 0; + _glDeleteBuffers(1, &m_TriUVs); m_TriUVs = 0; + _glDeleteVertexArrays(1, &m_TriVArray); m_TriVArray = 0; + + CHECK_GL_ERROR; + + int Res = 1; + if( UnloadOpenGLCore()==0 ) + { + g_TwMgr->SetLastError(g_ErrCantUnloadOGL); + Res = 0; + } + + return Res; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::BeginDraw(int _WndWidth, int _WndHeight) +{ + CHECK_GL_ERROR; + assert(m_Drawing==false && _WndWidth>0 && _WndHeight>0); + m_Drawing = true; + m_WndWidth = _WndWidth; + m_WndHeight = _WndHeight; + m_OffsetX = 0; + m_OffsetY = 0; + + _glGetIntegerv(GL_VIEWPORT, m_PrevViewport); CHECK_GL_ERROR; + if( _WndWidth>0 && _WndHeight>0 ) + { + GLint Vp[4]; + Vp[0] = 0; + Vp[1] = 0; + Vp[2] = _WndWidth-1; + Vp[3] = _WndHeight-1; + _glViewport(Vp[0], Vp[1], Vp[2], Vp[3]); + } + + m_PrevVArray = 0; + _glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&m_PrevVArray); CHECK_GL_ERROR; + _glBindVertexArray(0); CHECK_GL_ERROR; + + m_PrevLineWidth = 1; + _glGetFloatv(GL_LINE_WIDTH, &m_PrevLineWidth); CHECK_GL_ERROR; + _glLineWidth(1); CHECK_GL_ERROR; + + m_PrevLineSmooth = _glIsEnabled(GL_LINE_SMOOTH); + _glDisable(GL_LINE_SMOOTH); CHECK_GL_ERROR; + + m_PrevCullFace = _glIsEnabled(GL_CULL_FACE); + _glDisable(GL_CULL_FACE); CHECK_GL_ERROR; + + m_PrevDepthTest = _glIsEnabled(GL_DEPTH_TEST); + _glDisable(GL_DEPTH_TEST); CHECK_GL_ERROR; + + m_PrevBlend = _glIsEnabled(GL_BLEND); + _glEnable(GL_BLEND); CHECK_GL_ERROR; + + m_PrevScissorTest = _glIsEnabled(GL_SCISSOR_TEST); + _glDisable(GL_SCISSOR_TEST); CHECK_GL_ERROR; + + _glGetIntegerv(GL_SCISSOR_BOX, m_PrevScissorBox); CHECK_GL_ERROR; + + _glGetIntegerv(GL_BLEND_SRC, &m_PrevSrcBlend); CHECK_GL_ERROR; + _glGetIntegerv(GL_BLEND_DST, &m_PrevDstBlend); CHECK_GL_ERROR; + _glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); CHECK_GL_ERROR; + + m_PrevTexture = 0; + _glGetIntegerv(GL_TEXTURE_BINDING_2D, &m_PrevTexture); CHECK_GL_ERROR; + _glBindTexture(GL_TEXTURE_2D, 0); CHECK_GL_ERROR; + + m_PrevProgramObject = 0; + _glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&m_PrevProgramObject); CHECK_GL_ERROR; + _glBindVertexArray(0); CHECK_GL_ERROR; + _glUseProgram(0); CHECK_GL_ERROR; + + m_PrevActiveTexture = 0; + _glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&m_PrevActiveTexture); CHECK_GL_ERROR; + _glActiveTexture(GL_TEXTURE0); + + CHECK_GL_ERROR; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::EndDraw() +{ + assert(m_Drawing==true); + m_Drawing = false; + + _glLineWidth(m_PrevLineWidth); CHECK_GL_ERROR; + + if( m_PrevLineSmooth ) + { + _glEnable(GL_LINE_SMOOTH); CHECK_GL_ERROR; + } + else + { + _glDisable(GL_LINE_SMOOTH); CHECK_GL_ERROR; + } + + if( m_PrevCullFace ) + { + _glEnable(GL_CULL_FACE); CHECK_GL_ERROR; + } + else + { + _glDisable(GL_CULL_FACE); CHECK_GL_ERROR; + } + + if( m_PrevDepthTest ) + { + _glEnable(GL_DEPTH_TEST); CHECK_GL_ERROR; + } + else + { + _glDisable(GL_DEPTH_TEST); CHECK_GL_ERROR; + } + + if( m_PrevBlend ) + { + _glEnable(GL_BLEND); CHECK_GL_ERROR; + } + else + { + _glDisable(GL_BLEND); CHECK_GL_ERROR; + } + + if( m_PrevScissorTest ) + { + _glEnable(GL_SCISSOR_TEST); CHECK_GL_ERROR; + } + else + { + _glDisable(GL_SCISSOR_TEST); CHECK_GL_ERROR; + } + + _glScissor(m_PrevScissorBox[0], m_PrevScissorBox[1], m_PrevScissorBox[2], m_PrevScissorBox[3]); CHECK_GL_ERROR; + + _glBlendFunc(m_PrevSrcBlend, m_PrevDstBlend); CHECK_GL_ERROR; + + _glBindTexture(GL_TEXTURE_2D, m_PrevTexture); CHECK_GL_ERROR; + + _glUseProgram(m_PrevProgramObject); CHECK_GL_ERROR; + + _glBindVertexArray(m_PrevVArray); CHECK_GL_ERROR; + + _glViewport(m_PrevViewport[0], m_PrevViewport[1], m_PrevViewport[2], m_PrevViewport[3]); CHECK_GL_ERROR; + + CHECK_GL_ERROR; +} + +// --------------------------------------------------------------------------- + +bool CTwGraphOpenGLCore::IsDrawing() +{ + return m_Drawing; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::Restore() +{ + UnbindFont(m_FontTexID); + m_FontTexID = 0; + m_FontTex = NULL; +} + +// --------------------------------------------------------------------------- + +static inline float ToNormScreenX(float x, int wndWidth) +{ + return 2.0f*((float)x-0.5f)/wndWidth - 1.0f; +} + +static inline float ToNormScreenY(float y, int wndHeight) +{ + return 1.0f - 2.0f*((float)y-0.5f)/wndHeight; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased) +{ + CHECK_GL_ERROR; + assert(m_Drawing==true); + + //const GLfloat dx = +0.0f; + const GLfloat dx = 0; + //GLfloat dy = -0.2f; + const GLfloat dy = -0.5f; + if( _AntiAliased ) + _glEnable(GL_LINE_SMOOTH); + else + _glDisable(GL_LINE_SMOOTH); + + _glBindVertexArray(m_LineRectVArray); + + GLfloat x0 = ToNormScreenX(_X0+dx + m_OffsetX, m_WndWidth); + GLfloat y0 = ToNormScreenY(_Y0+dy + m_OffsetY, m_WndHeight); + GLfloat x1 = ToNormScreenX(_X1+dx + m_OffsetX, m_WndWidth); + GLfloat y1 = ToNormScreenY(_Y1+dy + m_OffsetY, m_WndHeight); + GLfloat vertices[] = { x0,y0,0, x1,y1,0 }; + _glBindBuffer(GL_ARRAY_BUFFER, m_LineRectVertices); + _glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); + _glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(0); + + color32 colors[] = { _Color0, _Color1 }; + _glBindBuffer(GL_ARRAY_BUFFER, m_LineRectColors); + _glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(colors), colors); + _glVertexAttribPointer(1, GL_BGRA, GL_UNSIGNED_BYTE, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(1); + + _glUseProgram(m_LineRectProgram); + _glDrawArrays(GL_LINES, 0, 2); + + if( _AntiAliased ) + _glDisable(GL_LINE_SMOOTH); + + CHECK_GL_ERROR; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) +{ + CHECK_GL_ERROR; + assert(m_Drawing==true); + + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + --_Y0; + else if(_Y0>_Y1) + --_Y1; + + _glBindVertexArray(m_LineRectVArray); + + GLfloat x0 = ToNormScreenX((float)_X0 + m_OffsetX, m_WndWidth); + GLfloat y0 = ToNormScreenY((float)_Y0 + m_OffsetY, m_WndHeight); + GLfloat x1 = ToNormScreenX((float)_X1 + m_OffsetX, m_WndWidth); + GLfloat y1 = ToNormScreenY((float)_Y1 + m_OffsetY, m_WndHeight); + GLfloat vertices[] = { x0,y0,0, x1,y0,0, x0,y1,0, x1,y1,0 }; + _glBindBuffer(GL_ARRAY_BUFFER, m_LineRectVertices); + _glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); + _glVertexAttribPointer(0, 3, GL_FLOAT, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(0); + + GLuint colors[] = { _Color00, _Color10, _Color01, _Color11 }; + _glBindBuffer(GL_ARRAY_BUFFER, m_LineRectColors); + _glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(colors), colors); + _glVertexAttribPointer(1, GL_BGRA, GL_UNSIGNED_BYTE, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(1); + + _glUseProgram(m_LineRectProgram); + _glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + CHECK_GL_ERROR; +} + +// --------------------------------------------------------------------------- + +void *CTwGraphOpenGLCore::NewTextObj() +{ + return new CTextObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::DeleteTextObj(void *_TextObj) +{ + assert(_TextObj!=NULL); + delete static_cast(_TextObj); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + assert(_Font!=NULL); + + if( _Font != m_FontTex ) + { + UnbindFont(m_FontTexID); + m_FontTexID = BindFont(_Font); + m_FontTex = _Font; + } + CTextObj *TextObj = static_cast(_TextObj); + TextObj->m_TextVerts.resize(0); + TextObj->m_TextUVs.resize(0); + TextObj->m_BgVerts.resize(0); + TextObj->m_Colors.resize(0); + TextObj->m_BgColors.resize(0); + + int x, x1, y, y1, i, Len; + unsigned char ch; + const unsigned char *Text; + color32 LineColor = COLOR32_RED; + for( int Line=0; Line<_NbLines; ++Line ) + { + x = 0; + y = Line * (_Font->m_CharHeight+_Sep); + y1 = y+_Font->m_CharHeight; + Len = (int)_TextLines[Line].length(); + Text = (const unsigned char *)(_TextLines[Line].c_str()); + if( _LineColors!=NULL ) + LineColor = (_LineColors[Line]&0xff00ff00) | GLubyte(_LineColors[Line]>>16) | (GLubyte(_LineColors[Line])<<16); + + for( i=0; im_CharWidth[ch]; + + TextObj->m_TextVerts.push_back(Vec2(x , y )); + TextObj->m_TextVerts.push_back(Vec2(x1, y )); + TextObj->m_TextVerts.push_back(Vec2(x , y1)); + TextObj->m_TextVerts.push_back(Vec2(x1, y )); + TextObj->m_TextVerts.push_back(Vec2(x1, y1)); + TextObj->m_TextVerts.push_back(Vec2(x , y1)); + + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV1[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV1[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV1[ch])); + + if( _LineColors!=NULL ) + { + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + } + + x = x1; + } + if( _BgWidth>0 ) + { + TextObj->m_BgVerts.push_back(Vec2(-1 , y )); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y )); + TextObj->m_BgVerts.push_back(Vec2(-1 , y1)); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y )); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y1)); + TextObj->m_BgVerts.push_back(Vec2(-1 , y1)); + + if( _LineBgColors!=NULL ) + { + color32 LineBgColor = (_LineBgColors[Line]&0xff00ff00) | GLubyte(_LineBgColors[Line]>>16) | (GLubyte(_LineBgColors[Line])<<16); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + } + } + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) +{ + CHECK_GL_ERROR; + assert(m_Drawing==true); + assert(_TextObj!=NULL); + CTextObj *TextObj = static_cast(_TextObj); + + if( TextObj->m_TextVerts.size()<4 && TextObj->m_BgVerts.size()<4 ) + return; // nothing to draw + + // draw character background triangles + if( (_BgColor!=0 || TextObj->m_BgColors.size()==TextObj->m_BgVerts.size()) && TextObj->m_BgVerts.size()>=4 ) + { + size_t numBgVerts = TextObj->m_BgVerts.size(); + if( numBgVerts > m_TriBufferSize ) + ResizeTriBuffers(numBgVerts + 2048); + + _glBindVertexArray(m_TriVArray); + + _glBindBuffer(GL_ARRAY_BUFFER, m_TriVertices); + _glBufferSubData(GL_ARRAY_BUFFER, 0, numBgVerts*sizeof(Vec2), &(TextObj->m_BgVerts[0])); + _glVertexAttribPointer(0, 2, GL_FLOAT, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(0); + _glDisableVertexAttribArray(1); + _glDisableVertexAttribArray(2); + + if( TextObj->m_BgColors.size()==TextObj->m_BgVerts.size() && _BgColor==0 ) + { + _glBindBuffer(GL_ARRAY_BUFFER, m_TriColors); + _glBufferSubData(GL_ARRAY_BUFFER, 0, numBgVerts*sizeof(color32), &(TextObj->m_BgColors[0])); + _glVertexAttribPointer(1, GL_BGRA, GL_UNSIGNED_BYTE, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(1); + + _glUseProgram(m_TriProgram); + _glUniform2f(m_TriLocationOffset, (float)_X, (float)_Y); + _glUniform2f(m_TriLocationWndSize, (float)m_WndWidth, (float)m_WndHeight); + } + else + { + _glUseProgram(m_TriUniProgram); + _glUniform4f(m_TriUniLocationColor, GLfloat((_BgColor>>16)&0xff)/256.0f, GLfloat((_BgColor>>8)&0xff)/256.0f, GLfloat(_BgColor&0xff)/256.0f, GLfloat((_BgColor>>24)&0xff)/256.0f); + _glUniform2f(m_TriUniLocationOffset, (float)_X, (float)_Y); + _glUniform2f(m_TriUniLocationWndSize, (float)m_WndWidth, (float)m_WndHeight); + } + + _glDrawArrays(GL_TRIANGLES, 0, (GLsizei)TextObj->m_BgVerts.size()); + } + + // draw character triangles + if( TextObj->m_TextVerts.size()>=4 ) + { + _glActiveTexture(GL_TEXTURE0); + _glBindTexture(GL_TEXTURE_2D, m_FontTexID); + size_t numTextVerts = TextObj->m_TextVerts.size(); + if( numTextVerts > m_TriBufferSize ) + ResizeTriBuffers(numTextVerts + 2048); + + _glBindVertexArray(m_TriVArray); + _glDisableVertexAttribArray(2); + + _glBindBuffer(GL_ARRAY_BUFFER, m_TriVertices); + _glBufferSubData(GL_ARRAY_BUFFER, 0, numTextVerts*sizeof(Vec2), &(TextObj->m_TextVerts[0])); + _glVertexAttribPointer(0, 2, GL_FLOAT, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(0); + + _glBindBuffer(GL_ARRAY_BUFFER, m_TriUVs); + _glBufferSubData(GL_ARRAY_BUFFER, 0, numTextVerts*sizeof(Vec2), &(TextObj->m_TextUVs[0])); + _glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL); + _glEnableVertexAttribArray(1); + + if( TextObj->m_Colors.size()==TextObj->m_TextVerts.size() && _Color==0 ) + { + _glBindBuffer(GL_ARRAY_BUFFER, m_TriColors); + _glBufferSubData(GL_ARRAY_BUFFER, 0, numTextVerts*sizeof(color32), &(TextObj->m_Colors[0])); + _glVertexAttribPointer(2, GL_BGRA, GL_UNSIGNED_BYTE, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(2); + + _glUseProgram(m_TriTexProgram); + _glUniform2f(m_TriTexLocationOffset, (float)_X, (float)_Y); + _glUniform2f(m_TriTexLocationWndSize, (float)m_WndWidth, (float)m_WndHeight); + _glUniform1i(m_TriTexLocationTexture, 0); + } + else + { + _glUseProgram(m_TriTexUniProgram); + _glUniform4f(m_TriTexUniLocationColor, GLfloat((_Color>>16)&0xff)/256.0f, GLfloat((_Color>>8)&0xff)/256.0f, GLfloat(_Color&0xff)/256.0f, GLfloat((_Color>>24)&0xff)/256.0f); + _glUniform2f(m_TriTexUniLocationOffset, (float)_X, (float)_Y); + _glUniform2f(m_TriTexUniLocationWndSize, (float)m_WndWidth, (float)m_WndHeight); + _glUniform1i(m_TriTexUniLocationTexture, 0); + } + + _glDrawArrays(GL_TRIANGLES, 0, (GLsizei)TextObj->m_TextVerts.size()); + } + + CHECK_GL_ERROR; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY) +{ + // glViewport impacts the NDC; use glScissor instead + m_OffsetX = _X0 + _OffsetX; + m_OffsetY = _Y0 + _OffsetY; + SetScissor(_X0, _Y0, _Width, _Height); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::RestoreViewport() +{ + m_OffsetX = m_OffsetY = 0; + SetScissor(0, 0, 0, 0); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::SetScissor(int _X0, int _Y0, int _Width, int _Height) +{ + if( _Width>0 && _Height>0 ) + { + _glScissor(_X0-1, m_WndHeight-_Y0-_Height, _Width-1, _Height); + _glEnable(GL_SCISSOR_TEST); + } + else + _glDisable(GL_SCISSOR_TEST); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGLCore::DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode) +{ + assert(m_Drawing==true); + + const GLfloat dx = +0.0f; + const GLfloat dy = +0.0f; + + // Backup states + GLint prevCullFaceMode, prevFrontFace; + _glGetIntegerv(GL_CULL_FACE_MODE, &prevCullFaceMode); + _glGetIntegerv(GL_FRONT_FACE, &prevFrontFace); + GLboolean prevCullEnable = _glIsEnabled(GL_CULL_FACE); + _glCullFace(GL_BACK); + _glEnable(GL_CULL_FACE); + if( _CullMode==CULL_CW ) + _glFrontFace(GL_CCW); + else if( _CullMode==CULL_CCW ) + _glFrontFace(GL_CW); + else + _glDisable(GL_CULL_FACE); + + _glUseProgram(m_TriProgram); + _glBindVertexArray(m_TriVArray); + _glUniform2f(m_TriLocationOffset, (float)m_OffsetX+dx, (float)m_OffsetY+dy); + _glUniform2f(m_TriLocationWndSize, (float)m_WndWidth, (float)m_WndHeight); + _glDisableVertexAttribArray(2); + + size_t numVerts = 3*_NumTriangles; + if( numVerts > m_TriBufferSize ) + ResizeTriBuffers(numVerts + 2048); + + _glBindBuffer(GL_ARRAY_BUFFER, m_TriVertices); + _glBufferSubData(GL_ARRAY_BUFFER, 0, numVerts*2*sizeof(int), _Vertices); + _glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0, NULL); + _glEnableVertexAttribArray(0); + + _glBindBuffer(GL_ARRAY_BUFFER, m_TriColors); + _glBufferSubData(GL_ARRAY_BUFFER, 0, numVerts*sizeof(color32), _Colors); + _glVertexAttribPointer(1, GL_BGRA, GL_UNSIGNED_BYTE, GL_TRUE, 0, NULL); + _glEnableVertexAttribArray(1); + + _glDrawArrays(GL_TRIANGLES, 0, (GLsizei)numVerts); + + // Reset states + _glCullFace(prevCullFaceMode); + _glFrontFace(prevFrontFace); + if( prevCullEnable ) + _glEnable(GL_CULL_FACE); + else + _glDisable(GL_CULL_FACE); + + CHECK_GL_ERROR; +} + +// --------------------------------------------------------------------------- diff --git a/AntTweakBar/src/TwOpenGLCore.h b/AntTweakBar/src/TwOpenGLCore.h new file mode 100644 index 0000000..16eebcf --- /dev/null +++ b/AntTweakBar/src/TwOpenGLCore.h @@ -0,0 +1,121 @@ +// --------------------------------------------------------------------------- +// +// @file TwOpenGLCore.h +// @brief OpenGL Core graph functions +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_OPENGL_CORE_INCLUDED +#define ANT_TW_OPENGL_CORE_INCLUDED + +#include "TwGraph.h" + +// --------------------------------------------------------------------------- + +class CTwGraphOpenGLCore : public ITwGraph +{ +public: + virtual int Init(); + virtual int Shut(); + virtual void BeginDraw(int _WndWidth, int _WndHeight); + virtual void EndDraw(); + virtual bool IsDrawing(); + virtual void Restore(); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) { DrawLine(_X0, _Y0, _X1, _Y1, _Color, _Color, _AntiAliased); } + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11); + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) { DrawRect(_X0, _Y0, _X1, _Y1, _Color, _Color, _Color, _Color); } + virtual void DrawTriangles(int _NumTriangles, int *_Vertices, color32 *_Colors, Cull _CullMode); + + virtual void * NewTextObj(); + virtual void DeleteTextObj(void *_TextObj); + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth); + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor); + + virtual void ChangeViewport(int _X0, int _Y0, int _Width, int _Height, int _OffsetX, int _OffsetY); + virtual void RestoreViewport(); + virtual void SetScissor(int _X0, int _Y0, int _Width, int _Height); + +protected: + bool m_Drawing; + GLuint m_FontTexID; + const CTexFont * m_FontTex; + + GLfloat m_PrevLineWidth; + GLint m_PrevActiveTexture; + GLint m_PrevTexture; + GLint m_PrevVArray; + GLboolean m_PrevLineSmooth; + GLboolean m_PrevCullFace; + GLboolean m_PrevDepthTest; + GLboolean m_PrevBlend; + GLint m_PrevSrcBlend; + GLint m_PrevDstBlend; + GLboolean m_PrevScissorTest; + GLint m_PrevScissorBox[4]; + GLint m_PrevViewport[4]; + GLuint m_PrevProgramObject; + + GLuint m_LineRectVS; + GLuint m_LineRectFS; + GLuint m_LineRectProgram; + GLuint m_LineRectVArray; + GLuint m_LineRectVertices; + GLuint m_LineRectColors; + GLuint m_TriVS; + GLuint m_TriFS; + GLuint m_TriProgram; + GLuint m_TriUniVS; + GLuint m_TriUniFS; + GLuint m_TriUniProgram; + GLuint m_TriTexVS; + GLuint m_TriTexFS; + GLuint m_TriTexProgram; + GLuint m_TriTexUniVS; + GLuint m_TriTexUniFS; + GLuint m_TriTexUniProgram; + GLuint m_TriVArray; + GLuint m_TriVertices; + GLuint m_TriUVs; + GLuint m_TriColors; + GLint m_TriLocationOffset; + GLint m_TriLocationWndSize; + GLint m_TriUniLocationOffset; + GLint m_TriUniLocationWndSize; + GLint m_TriUniLocationColor; + GLint m_TriTexLocationOffset; + GLint m_TriTexLocationWndSize; + GLint m_TriTexLocationTexture; + GLint m_TriTexUniLocationOffset; + GLint m_TriTexUniLocationWndSize; + GLint m_TriTexUniLocationColor; + GLint m_TriTexUniLocationTexture; + size_t m_TriBufferSize; + + int m_WndWidth; + int m_WndHeight; + int m_OffsetX; + int m_OffsetY; + + struct Vec2 { GLfloat x, y; Vec2(){} Vec2(GLfloat _X, GLfloat _Y):x(_X),y(_Y){} Vec2(int _X, int _Y):x(GLfloat(_X)),y(GLfloat(_Y)){} }; + struct CTextObj + { + std::vector m_TextVerts; + std::vector m_TextUVs; + std::vector m_BgVerts; + std::vectorm_Colors; + std::vectorm_BgColors; + }; + void ResizeTriBuffers(size_t _NewSize); +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_OPENGL_CORE_INCLUDED diff --git a/AntTweakBar/src/TwPrecomp.cpp b/AntTweakBar/src/TwPrecomp.cpp new file mode 100644 index 0000000..c436088 --- /dev/null +++ b/AntTweakBar/src/TwPrecomp.cpp @@ -0,0 +1 @@ +#include "TwPrecomp.h" diff --git a/AntTweakBar/src/TwPrecomp.h b/AntTweakBar/src/TwPrecomp.h new file mode 100644 index 0000000..1f219bc --- /dev/null +++ b/AntTweakBar/src/TwPrecomp.h @@ -0,0 +1,93 @@ +// --------------------------------------------------------------------------- +// +// @file TwPrecomp.h +// @brief Precompiled header +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_PRECOMP_INCLUDED +#define ANT_TW_PRECOMP_INCLUDED + + +#if defined _MSC_VER +# pragma warning(disable: 4514) // unreferenced inline function has been removed +# pragma warning(disable: 4710) // function not inlined +# pragma warning(disable: 4786) // template name truncated +# pragma warning(disable: 4530) // exceptions not handled +# define _CRT_SECURE_NO_DEPRECATE // visual 8 secure crt warning +#endif + +#include +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER<=1200 +# pragma warning(push, 3) +#endif +#include +#include +#include +#include +#include +#include +#if defined(_MSC_VER) && _MSC_VER<=1200 +# pragma warning(pop) +#endif + +#if defined(_UNIX) +# define ANT_UNIX +# include +# define GLX_GLXEXT_LEGACY +# include +# include +# include +# include +# undef _WIN32 +# undef WIN32 +# undef _WIN64 +# undef WIN64 +# undef _WINDOWS +# undef ANT_WINDOWS +# undef ANT_OSX +#elif defined(_MACOSX) +# define ANT_OSX +# include +# include +# include +# include +# undef _WIN32 +# undef WIN32 +# undef _WIN64 +# undef WIN64 +# undef _WINDOWS +# undef ANT_WINDOWS +# undef ANT_UNIX +#elif defined(_WINDOWS) || defined(WIN32) || defined(WIN64) || defined(_WIN32) || defined(_WIN64) +# define ANT_WINDOWS +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +# endif +# include +# include +#endif + +#if !defined(ANT_OGL_HEADER_INCLUDED) +# if defined(ANT_OSX) +# include +# else +# include // must be included after windows.h +# endif +# define ANT_OGL_HEADER_INCLUDED +#endif + +#endif // !defined ANT_TW_PRECOMP_INCLUDED diff --git a/AntTweakBar/src/d3d10vs2003.h b/AntTweakBar/src/d3d10vs2003.h new file mode 100644 index 0000000..7f32914 --- /dev/null +++ b/AntTweakBar/src/d3d10vs2003.h @@ -0,0 +1,46 @@ +// Workaround to include D3D10.h with VS2003 +#ifndef __out +#define __out +#endif +#ifndef __in +#define __in +#endif +#ifndef __inout +#define __inout +#endif +#ifndef __in_opt +#define __in_opt +#endif +#ifndef __out_opt +#define __out_opt +#endif +#ifndef __inout_opt +#define __inout_opt +#endif +#ifndef __in_ecount +#define __in_ecount(x) +#endif +#ifndef __in_ecount_opt +#define __in_ecount_opt(x) +#endif +#ifndef __out_ecount +#define __out_ecount(x) +#endif +#ifndef __out_ecount_opt +#define __out_ecount_opt(x) +#endif +#ifndef __inout_ecount +#define __inout_ecount(x) +#endif +#ifndef __inout_ecount_opt +#define __inout_ecount_opt(x) +#endif +#ifndef __in_bcount_opt +#define __in_bcount_opt(x) +#endif +#ifndef __out_bcount_opt +#define __out_bcount_opt(x) +#endif +#ifndef __inout_bcount_opt +#define __inout_bcount_opt(x) +#endif diff --git a/AntTweakBar/src/res/FontChars.txt b/AntTweakBar/src/res/FontChars.txt new file mode 100644 index 0000000..888a3e2 --- /dev/null +++ b/AntTweakBar/src/res/FontChars.txt @@ -0,0 +1,232 @@ + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~√ +€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ + ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ +ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß +àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + +032 +033 ! +034 " +035 # +036 $ +037 % +038 & +039 ' +040 ( +041 ) +042 * +043 + +044 , +045 - +046 . +047 / +048 0 +049 1 +050 2 +051 3 +052 4 +053 5 +054 6 +055 7 +056 8 +057 9 +058 : +059 ; +060 < +061 = +062 > +063 ? +064 @ +065 A +066 B +067 C +068 D +069 E +070 F +071 G +072 H +073 I +074 J +075 K +076 L +077 M +078 N +079 O +080 P +081 Q +082 R +083 S +084 T +085 U +086 V +087 W +088 X +089 Y +090 Z +091 [ +092 \ +093 ] +094 ^ +095 _ +096 ` +097 a +098 b +099 c +100 d +101 e +102 f +103 g +104 h +105 i +106 j +107 k +108 l +109 m +110 n +111 o +112 p +113 q +114 r +115 s +116 t +117 u +118 v +119 w +120 x +121 y +122 z +123 { +124 | +125 } +126 ~ +127 √ +128 € +129  +130 ‚ +131 ƒ +132 „ +133 … +134 † +135 ‡ +136 ˆ +137 ‰ +138 Š +139 ‹ +140 Œ +141  +142 Ž +143  +144  +145 ‘ +146 ’ +147 “ +148 ” +149 • +150 – +151 — +152 ˜ +153 ™ +154 š +155 › +156 œ +157  +158 ž +159 Ÿ +160   +161 ¡ +162 ¢ +163 £ +164 ¤ +165 ¥ +166 ¦ +167 § +168 ¨ +169 © +170 ª +171 « +172 ¬ +173 ­ +174 ® +175 ¯ +176 ° +177 ± +178 ² +179 ³ +180 ´ +181 µ +182 ¶ +183 · +184 ¸ +185 ¹ +186 º +187 » +188 ¼ +189 ½ +190 ¾ +191 ¿ +192 À +193 Á +194  +195 à +196 Ä +197 Å +198 Æ +199 Ç +200 È +201 É +202 Ê +203 Ë +204 Ì +205 Í +206 Î +207 Ï +208 Ð +209 Ñ +210 Ò +211 Ó +212 Ô +213 Õ +214 Ö +215 × +216 Ø +217 Ù +218 Ú +219 Û +220 Ü +221 Ý +222 Þ +223 ß +224 à +225 á +226 â +227 ã +228 ä +229 å +230 æ +231 ç +232 è +233 é +234 ê +235 ë +236 ì +237 í +238 î +239 ï +240 ð +241 ñ +242 ò +243 ó +244 ô +245 õ +246 ö +247 ÷ +248 ø +249 ù +250 ú +251 û +252 ü +253 ý +254 þ +255 ÿ diff --git a/AntTweakBar/src/res/FontFixed1.pgm b/AntTweakBar/src/res/FontFixed1.pgm new file mode 100644 index 0000000..55b6d9a --- /dev/null +++ b/AntTweakBar/src/res/FontFixed1.pgm @@ -0,0 +1,28788 @@ +P2 +# CREATOR: GIMP PNM Filter Version 1.1 +257 112 +255 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +56 +255 +4 +0 +0 +0 +0 +0 +212 +44 +76 +180 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +109 +231 +218 +72 +0 +0 +0 +0 +0 +96 +227 +243 +170 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +158 +104 +0 +0 +0 +0 +153 +114 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +172 +128 +0 +0 +12 +164 +241 +234 +133 +1 +0 +0 +22 +179 +237 +255 +4 +0 +0 +0 +141 +220 +246 +236 +164 +22 +0 +0 +94 +216 +242 +243 +194 +56 +0 +0 +0 +0 +0 +186 +255 +4 +0 +0 +52 +255 +244 +244 +244 +91 +0 +0 +1 +120 +223 +244 +225 +62 +0 +0 +244 +244 +244 +244 +249 +242 +0 +0 +62 +200 +245 +242 +181 +35 +0 +0 +46 +196 +244 +232 +139 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +104 +216 +246 +215 +62 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +56 +255 +4 +0 +0 +0 +0 +13 +239 +2 +131 +124 +0 +0 +110 +232 +255 +238 +202 +62 +0 +29 +254 +51 +99 +231 +0 +0 +0 +0 +0 +241 +53 +0 +34 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +45 +225 +4 +0 +0 +0 +0 +30 +237 +15 +0 +0 +0 +0 +99 +95 +52 +255 +11 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +38 +242 +19 +0 +0 +155 +188 +12 +29 +221 +103 +0 +0 +21 +101 +90 +255 +4 +0 +0 +0 +127 +46 +1 +15 +165 +192 +0 +0 +34 +24 +0 +5 +127 +233 +0 +0 +0 +0 +98 +197 +255 +4 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +121 +219 +45 +0 +22 +27 +0 +0 +0 +0 +0 +0 +170 +151 +0 +14 +242 +119 +4 +12 +160 +207 +0 +3 +224 +136 +5 +18 +188 +114 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +114 +38 +2 +133 +225 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +56 +255 +4 +0 +0 +0 +0 +67 +189 +0 +187 +69 +0 +26 +254 +100 +255 +8 +53 +44 +0 +30 +254 +49 +100 +235 +0 +1 +0 +0 +0 +206 +47 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +155 +133 +0 +0 +0 +0 +0 +0 +186 +110 +0 +0 +0 +0 +3 +103 +195 +255 +177 +75 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +156 +144 +0 +0 +5 +244 +63 +0 +0 +112 +200 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +60 +251 +0 +0 +0 +0 +0 +10 +127 +211 +0 +0 +0 +25 +215 +67 +255 +4 +0 +0 +52 +255 +4 +0 +0 +0 +0 +1 +235 +77 +0 +0 +0 +0 +0 +0 +0 +0 +0 +24 +250 +49 +0 +44 +255 +15 +0 +0 +64 +251 +0 +41 +255 +17 +0 +0 +68 +205 +0 +0 +0 +43 +216 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +47 +147 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +197 +97 +11 +0 +0 +0 +0 +0 +0 +0 +0 +69 +248 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +63 +240 +247 +248 +240 +254 +241 +0 +42 +255 +69 +255 +4 +0 +0 +0 +0 +112 +232 +221 +80 +97 +184 +0 +0 +14 +189 +196 +7 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +233 +64 +0 +0 +0 +0 +0 +0 +117 +186 +0 +0 +0 +0 +3 +102 +194 +255 +177 +74 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +26 +244 +30 +0 +0 +37 +255 +37 +175 +0 +66 +244 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +126 +195 +0 +0 +0 +48 +241 +255 +190 +16 +0 +0 +0 +176 +90 +52 +255 +4 +0 +0 +52 +255 +228 +236 +162 +16 +0 +33 +255 +106 +220 +237 +172 +21 +0 +0 +0 +0 +0 +125 +203 +0 +0 +4 +205 +120 +6 +14 +160 +159 +0 +40 +255 +21 +0 +0 +69 +245 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +13 +102 +203 +225 +132 +0 +0 +240 +240 +240 +240 +240 +240 +0 +0 +84 +180 +237 +152 +52 +0 +0 +0 +0 +0 +11 +204 +150 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +190 +66 +54 +202 +0 +0 +2 +196 +220 +255 +106 +32 +0 +0 +0 +0 +13 +116 +184 +93 +4 +0 +0 +176 +114 +109 +159 +0 +52 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +29 +255 +22 +0 +0 +0 +0 +0 +0 +72 +236 +0 +0 +0 +0 +99 +96 +52 +255 +11 +128 +0 +0 +240 +240 +243 +255 +240 +240 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +140 +161 +0 +0 +0 +49 +255 +33 +216 +0 +54 +255 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +68 +236 +45 +0 +0 +0 +0 +0 +27 +198 +133 +0 +0 +87 +189 +0 +52 +255 +4 +0 +0 +19 +40 +0 +29 +197 +168 +0 +49 +255 +146 +9 +15 +182 +176 +0 +0 +0 +0 +3 +226 +100 +0 +0 +0 +28 +210 +252 +255 +182 +7 +0 +2 +223 +142 +6 +20 +186 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +43 +216 +3 +0 +0 +0 +0 +158 +233 +162 +67 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +23 +115 +210 +208 +0 +0 +0 +0 +176 +192 +6 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +7 +239 +9 +118 +138 +0 +0 +0 +5 +109 +255 +153 +234 +112 +0 +0 +88 +179 +76 +110 +231 +220 +0 +28 +255 +16 +0 +176 +110 +68 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +46 +255 +8 +0 +0 +0 +0 +0 +0 +57 +253 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +244 +244 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +17 +241 +43 +0 +0 +0 +37 +255 +17 +0 +0 +66 +244 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +73 +233 +60 +0 +0 +0 +0 +0 +0 +0 +69 +238 +0 +16 +227 +40 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +69 +246 +0 +38 +255 +20 +0 +0 +69 +247 +0 +0 +0 +0 +79 +242 +11 +0 +0 +5 +214 +122 +7 +16 +162 +175 +0 +0 +46 +193 +239 +210 +125 +241 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +202 +215 +114 +23 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +67 +162 +236 +0 +0 +0 +34 +255 +31 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +236 +244 +251 +240 +251 +244 +228 +0 +0 +0 +52 +255 +4 +76 +245 +0 +0 +11 +0 +29 +254 +51 +101 +0 +40 +255 +30 +0 +18 +222 +193 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +29 +255 +23 +0 +0 +0 +0 +0 +0 +72 +237 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +124 +178 +0 +0 +0 +0 +5 +245 +63 +0 +0 +111 +200 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +87 +233 +54 +0 +0 +0 +0 +0 +0 +0 +0 +70 +248 +0 +52 +255 +255 +255 +255 +255 +255 +0 +0 +0 +0 +0 +0 +68 +246 +0 +6 +248 +19 +0 +0 +65 +247 +0 +0 +0 +0 +185 +151 +0 +0 +0 +42 +255 +15 +0 +0 +59 +252 +0 +0 +0 +0 +0 +0 +124 +188 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +46 +147 +234 +180 +86 +0 +0 +244 +244 +244 +244 +244 +244 +0 +0 +39 +133 +226 +197 +97 +10 +0 +0 +0 +51 +255 +4 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +140 +115 +12 +235 +8 +0 +0 +32 +73 +55 +255 +11 +143 +215 +0 +0 +0 +0 +31 +255 +47 +97 +0 +1 +211 +174 +16 +6 +148 +252 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +233 +65 +0 +0 +0 +0 +0 +0 +116 +187 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +44 +220 +3 +0 +0 +0 +0 +9 +234 +58 +0 +0 +0 +0 +0 +155 +186 +12 +28 +220 +103 +0 +0 +0 +8 +58 +255 +11 +8 +0 +0 +105 +232 +47 +0 +0 +0 +0 +0 +101 +32 +0 +25 +193 +173 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +70 +25 +0 +25 +193 +166 +0 +0 +165 +147 +7 +13 +176 +176 +0 +0 +0 +36 +254 +49 +0 +0 +0 +15 +245 +120 +4 +12 +157 +210 +0 +0 +37 +12 +0 +68 +239 +74 +0 +0 +0 +44 +220 +3 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +8 +92 +192 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +235 +142 +41 +0 +0 +0 +0 +0 +0 +4 +24 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +49 +244 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +222 +33 +87 +169 +0 +0 +0 +23 +186 +245 +255 +243 +186 +39 +0 +0 +0 +0 +0 +122 +239 +229 +0 +0 +30 +181 +245 +231 +147 +178 +0 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +155 +133 +0 +0 +0 +0 +0 +0 +185 +111 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +62 +241 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +108 +195 +0 +0 +0 +0 +0 +0 +13 +165 +241 +235 +134 +1 +0 +0 +0 +255 +255 +255 +255 +255 +0 +0 +255 +250 +244 +244 +244 +244 +0 +0 +143 +226 +244 +238 +163 +17 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +134 +236 +245 +236 +155 +13 +0 +0 +16 +167 +238 +242 +175 +22 +0 +0 +0 +139 +203 +0 +0 +0 +0 +0 +68 +203 +246 +243 +185 +39 +0 +0 +104 +235 +244 +212 +88 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +62 +241 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +0 +0 +0 +0 +0 +0 +0 +0 +49 +244 +3 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +45 +225 +4 +0 +0 +0 +0 +29 +237 +16 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +120 +157 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +223 +75 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +120 +157 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +158 +104 +0 +0 +0 +0 +153 +115 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +181 +63 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +31 +119 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +181 +63 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +28 +160 +229 +236 +163 +14 +0 +0 +0 +20 +252 +200 +0 +0 +0 +52 +255 +244 +243 +238 +177 +32 +0 +0 +0 +96 +213 +244 +234 +137 +0 +52 +255 +244 +239 +190 +68 +0 +0 +52 +255 +244 +244 +244 +244 +68 +0 +0 +52 +255 +244 +244 +244 +244 +0 +0 +0 +104 +217 +244 +222 +100 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +244 +246 +255 +244 +244 +0 +0 +0 +0 +137 +244 +246 +255 +4 +0 +52 +255 +4 +0 +0 +137 +216 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +163 +0 +0 +212 +255 +0 +52 +255 +166 +0 +0 +52 +255 +0 +0 +15 +168 +241 +236 +141 +2 +0 +52 +255 +244 +244 +239 +176 +33 +0 +0 +15 +168 +241 +236 +141 +2 +0 +52 +255 +244 +244 +236 +171 +30 +0 +0 +47 +189 +243 +241 +204 +73 +0 +0 +244 +244 +246 +255 +244 +244 +0 +52 +255 +4 +0 +0 +52 +255 +0 +125 +203 +0 +0 +0 +24 +254 +0 +236 +75 +0 +0 +0 +0 +152 +0 +44 +247 +51 +0 +0 +71 +241 +0 +220 +112 +0 +0 +0 +161 +179 +0 +0 +244 +244 +244 +244 +249 +254 +0 +0 +0 +52 +255 +244 +125 +0 +0 +35 +244 +23 +0 +0 +0 +0 +0 +0 +0 +171 +246 +255 +4 +0 +0 +0 +0 +41 +242 +200 +7 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +24 +227 +130 +13 +21 +206 +163 +0 +0 +0 +98 +207 +251 +26 +0 +0 +52 +255 +4 +0 +8 +147 +204 +0 +0 +100 +224 +51 +0 +22 +89 +0 +52 +255 +4 +7 +81 +238 +66 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +106 +221 +46 +0 +29 +89 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +0 +133 +218 +26 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +202 +4 +36 +219 +255 +0 +52 +255 +242 +30 +0 +52 +255 +0 +0 +160 +175 +10 +24 +213 +112 +0 +52 +255 +4 +0 +20 +166 +204 +0 +0 +160 +175 +10 +24 +213 +112 +0 +52 +255 +4 +0 +17 +166 +201 +0 +8 +232 +119 +7 +3 +56 +63 +0 +0 +0 +0 +52 +255 +4 +0 +0 +52 +255 +4 +0 +0 +52 +255 +0 +48 +253 +19 +0 +0 +94 +226 +0 +197 +107 +0 +0 +0 +0 +184 +0 +0 +131 +201 +2 +8 +220 +101 +0 +74 +238 +18 +0 +52 +245 +33 +0 +0 +0 +0 +0 +1 +192 +148 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +168 +135 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +16 +218 +106 +178 +159 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +157 +170 +0 +0 +0 +88 +243 +0 +0 +0 +179 +121 +200 +105 +0 +0 +52 +255 +4 +0 +0 +63 +251 +0 +0 +227 +86 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +125 +186 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +1 +229 +84 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +130 +220 +27 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +141 +66 +115 +140 +255 +0 +52 +255 +150 +143 +0 +52 +255 +0 +6 +246 +54 +0 +0 +105 +204 +0 +52 +255 +4 +0 +0 +60 +253 +0 +6 +246 +54 +0 +0 +105 +204 +0 +52 +255 +4 +0 +0 +59 +252 +0 +46 +255 +15 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +225 +87 +0 +0 +165 +150 +0 +157 +139 +0 +234 +154 +0 +215 +0 +0 +7 +216 +102 +132 +187 +0 +0 +0 +176 +146 +0 +194 +127 +0 +0 +0 +0 +0 +0 +101 +223 +12 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +48 +239 +14 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +3 +184 +122 +0 +8 +193 +112 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +243 +67 +72 +217 +233 +162 +255 +0 +3 +12 +248 +51 +130 +186 +0 +0 +52 +255 +4 +0 +12 +158 +197 +0 +31 +255 +22 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +69 +240 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +32 +255 +22 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +52 +255 +130 +244 +29 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +61 +146 +188 +66 +255 +0 +52 +255 +37 +239 +16 +52 +255 +0 +38 +255 +15 +0 +0 +64 +244 +0 +52 +255 +4 +0 +24 +169 +202 +0 +38 +255 +15 +0 +0 +64 +244 +0 +52 +255 +4 +0 +16 +159 +188 +0 +11 +235 +176 +72 +17 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +148 +157 +0 +1 +234 +73 +0 +118 +170 +31 +225 +207 +0 +246 +0 +0 +0 +62 +237 +237 +32 +0 +0 +0 +31 +241 +124 +221 +8 +0 +0 +0 +0 +0 +25 +238 +68 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +184 +118 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +44 +101 +0 +0 +0 +14 +121 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +255 +32 +242 +102 +5 +147 +255 +0 +4 +86 +235 +1 +59 +250 +16 +0 +52 +255 +240 +241 +254 +223 +32 +0 +48 +255 +6 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +55 +255 +0 +52 +255 +240 +240 +240 +240 +22 +0 +0 +52 +255 +240 +240 +240 +202 +0 +48 +255 +6 +0 +138 +241 +248 +0 +52 +255 +240 +240 +240 +243 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +52 +255 +220 +235 +100 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +6 +209 +182 +52 +255 +0 +52 +255 +4 +169 +120 +52 +255 +0 +49 +255 +5 +0 +0 +54 +255 +0 +52 +255 +240 +240 +231 +169 +31 +0 +49 +255 +5 +0 +0 +54 +255 +0 +52 +255 +240 +244 +255 +173 +11 +0 +0 +38 +160 +229 +253 +188 +37 +0 +0 +0 +0 +52 +255 +4 +0 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +70 +227 +0 +51 +244 +7 +0 +78 +202 +83 +147 +220 +32 +251 +0 +0 +0 +14 +235 +202 +0 +0 +0 +0 +0 +124 +255 +75 +0 +0 +0 +0 +0 +0 +173 +156 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +64 +230 +7 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +255 +54 +255 +13 +0 +62 +255 +0 +4 +167 +167 +0 +4 +240 +92 +0 +52 +255 +4 +0 +18 +164 +181 +0 +31 +255 +22 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +69 +240 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +32 +255 +20 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +3 +0 +52 +255 +33 +86 +243 +35 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +4 +127 +89 +52 +255 +0 +52 +255 +4 +52 +230 +58 +255 +0 +38 +255 +15 +0 +0 +64 +244 +0 +52 +255 +4 +0 +0 +0 +0 +0 +38 +255 +15 +0 +0 +64 +247 +0 +52 +255 +4 +1 +87 +251 +67 +0 +0 +0 +0 +0 +32 +176 +207 +0 +0 +0 +0 +52 +255 +4 +0 +0 +51 +255 +4 +0 +0 +52 +255 +0 +0 +6 +242 +42 +121 +174 +0 +0 +39 +234 +136 +91 +168 +112 +218 +0 +0 +0 +153 +180 +211 +98 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +80 +228 +15 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +200 +101 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +255 +37 +243 +102 +5 +147 +255 +0 +11 +241 +250 +248 +248 +253 +173 +0 +52 +255 +4 +0 +0 +58 +249 +0 +0 +228 +84 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +126 +186 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +1 +230 +78 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +61 +250 +0 +0 +52 +255 +4 +0 +170 +199 +3 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +192 +149 +255 +0 +6 +247 +54 +0 +0 +104 +204 +0 +52 +255 +4 +0 +0 +0 +0 +0 +6 +247 +54 +0 +0 +104 +209 +0 +52 +255 +4 +0 +0 +151 +207 +0 +0 +0 +0 +0 +0 +61 +253 +0 +0 +0 +0 +52 +255 +4 +0 +0 +40 +255 +8 +0 +0 +56 +248 +0 +0 +0 +171 +112 +192 +97 +0 +0 +4 +250 +199 +35 +111 +196 +178 +0 +0 +66 +241 +28 +64 +236 +21 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +14 +228 +75 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +80 +218 +2 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +238 +80 +75 +219 +234 +164 +248 +0 +77 +249 +16 +0 +0 +87 +245 +0 +52 +255 +4 +0 +9 +145 +216 +0 +0 +102 +222 +50 +0 +22 +89 +0 +52 +255 +4 +7 +82 +239 +67 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +109 +215 +40 +0 +81 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +43 +112 +13 +3 +145 +201 +0 +0 +52 +255 +4 +0 +20 +233 +126 +0 +0 +52 +255 +11 +8 +8 +8 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +75 +246 +255 +0 +0 +163 +173 +9 +23 +212 +114 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +162 +173 +9 +23 +212 +123 +0 +52 +255 +4 +0 +0 +25 +246 +0 +14 +123 +29 +0 +18 +163 +202 +0 +0 +0 +0 +52 +255 +4 +0 +0 +5 +232 +107 +3 +9 +151 +190 +0 +0 +0 +93 +195 +248 +21 +0 +0 +0 +216 +233 +0 +54 +254 +139 +0 +10 +221 +108 +0 +0 +168 +163 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +151 +163 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +1 +214 +84 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +146 +193 +1 +0 +0 +0 +0 +0 +155 +179 +0 +0 +0 +11 +245 +0 +52 +255 +244 +243 +239 +184 +44 +0 +0 +0 +99 +214 +244 +237 +140 +0 +52 +255 +244 +240 +191 +69 +0 +0 +52 +255 +244 +244 +244 +244 +99 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +109 +219 +243 +223 +116 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +244 +246 +255 +244 +244 +0 +0 +27 +186 +240 +244 +204 +50 +0 +0 +52 +255 +4 +0 +0 +82 +251 +0 +0 +52 +255 +255 +255 +255 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +1 +213 +255 +0 +0 +16 +171 +241 +237 +143 +3 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +16 +170 +241 +254 +187 +6 +0 +52 +255 +4 +0 +0 +0 +138 +0 +9 +171 +229 +246 +240 +177 +33 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +51 +197 +244 +241 +177 +28 +0 +0 +0 +18 +252 +198 +0 +0 +0 +0 +176 +179 +0 +5 +247 +99 +0 +144 +199 +2 +0 +0 +27 +243 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +254 +247 +244 +244 +244 +244 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +96 +203 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +16 +216 +165 +31 +2 +24 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +87 +237 +57 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +5 +226 +68 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +19 +144 +222 +242 +159 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +58 +12 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +50 +248 +240 +123 +0 +0 +0 +0 +0 +0 +0 +71 +79 +0 +0 +0 +168 +241 +248 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +244 +244 +244 +244 +244 +244 +99 +0 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +9 +124 +20 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +140 +0 +127 +0 +0 +112 +174 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +221 +0 +127 +0 +0 +0 +159 +98 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +166 +243 +244 +102 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +49 +244 +3 +0 +0 +0 +0 +0 +49 +244 +3 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +11 +244 +246 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +158 +239 +209 +0 +0 +0 +0 +52 +255 +4 +0 +0 +11 +244 +233 +119 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +68 +162 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +46 +255 +24 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +37 +255 +46 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +96 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +149 +81 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +103 +213 +244 +239 +180 +36 +0 +52 +255 +122 +232 +241 +159 +9 +0 +0 +12 +151 +233 +244 +202 +40 +0 +0 +26 +183 +244 +223 +133 +255 +0 +0 +13 +156 +236 +241 +165 +12 +0 +19 +244 +246 +255 +244 +244 +102 +0 +0 +25 +182 +244 +221 +127 +255 +0 +52 +255 +111 +233 +235 +80 +0 +0 +0 +0 +244 +246 +255 +4 +0 +0 +0 +45 +244 +246 +255 +4 +0 +0 +0 +52 +255 +4 +0 +122 +210 +0 +0 +0 +52 +255 +4 +0 +0 +0 +255 +173 +246 +137 +195 +245 +114 +0 +52 +255 +111 +233 +235 +80 +0 +0 +0 +29 +182 +242 +237 +157 +11 +0 +52 +255 +121 +231 +241 +161 +10 +0 +0 +26 +183 +244 +222 +130 +255 +0 +0 +52 +255 +78 +217 +244 +175 +0 +0 +0 +109 +226 +245 +229 +114 +0 +19 +244 +246 +255 +244 +244 +152 +0 +52 +255 +4 +0 +52 +255 +4 +0 +51 +242 +9 +0 +0 +73 +228 +0 +226 +63 +0 +0 +0 +0 +140 +0 +13 +219 +93 +0 +0 +173 +156 +0 +40 +250 +19 +0 +0 +50 +245 +0 +0 +209 +244 +244 +246 +255 +0 +0 +0 +0 +0 +51 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +8 +0 +1 +219 +10 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +93 +52 +2 +9 +162 +204 +0 +52 +255 +163 +9 +19 +198 +144 +0 +0 +174 +188 +24 +0 +53 +43 +0 +0 +193 +157 +7 +20 +200 +255 +0 +0 +173 +186 +16 +11 +179 +152 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +189 +167 +10 +19 +199 +255 +0 +52 +255 +121 +2 +133 +219 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +133 +204 +19 +0 +0 +0 +52 +255 +4 +0 +0 +0 +255 +51 +99 +255 +55 +96 +227 +0 +52 +255 +121 +2 +133 +219 +0 +0 +0 +198 +158 +8 +19 +198 +149 +0 +52 +255 +163 +9 +19 +198 +145 +0 +0 +192 +158 +8 +20 +198 +255 +0 +0 +52 +255 +169 +20 +2 +52 +0 +0 +31 +255 +62 +0 +20 +57 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +216 +84 +0 +0 +162 +139 +0 +166 +118 +0 +0 +0 +0 +195 +0 +0 +49 +235 +36 +104 +211 +9 +0 +0 +200 +106 +0 +0 +142 +163 +0 +0 +0 +0 +0 +149 +171 +0 +0 +0 +0 +0 +54 +255 +2 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +50 +255 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +95 +232 +100 +0 +55 +175 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +61 +252 +0 +52 +255 +33 +0 +0 +81 +233 +0 +22 +255 +41 +0 +0 +0 +0 +0 +25 +255 +32 +0 +0 +82 +255 +0 +21 +255 +49 +0 +0 +70 +236 +0 +0 +0 +52 +255 +4 +0 +0 +0 +24 +255 +35 +0 +0 +82 +255 +0 +52 +255 +18 +0 +56 +254 +1 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +146 +227 +15 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +255 +8 +56 +255 +8 +56 +253 +0 +52 +255 +18 +0 +56 +254 +1 +0 +27 +255 +32 +0 +0 +81 +234 +0 +52 +255 +33 +0 +0 +81 +232 +0 +25 +255 +32 +0 +0 +81 +255 +0 +0 +52 +255 +41 +0 +0 +0 +0 +0 +26 +252 +96 +11 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +125 +173 +0 +8 +242 +48 +0 +106 +173 +0 +192 +118 +4 +246 +0 +0 +0 +106 +212 +234 +40 +0 +0 +0 +103 +199 +0 +3 +230 +67 +0 +0 +0 +0 +90 +216 +13 +0 +0 +0 +0 +1 +121 +226 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +22 +252 +74 +0 +0 +0 +0 +115 +225 +233 +149 +42 +25 +0 +15 +54 +177 +0 +136 +94 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +78 +197 +237 +240 +243 +255 +0 +52 +255 +6 +0 +0 +55 +254 +0 +47 +255 +7 +0 +0 +0 +0 +0 +48 +255 +6 +0 +0 +55 +255 +0 +47 +255 +240 +240 +240 +241 +247 +0 +0 +0 +52 +255 +4 +0 +0 +0 +48 +255 +7 +0 +0 +55 +255 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +187 +238 +80 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +255 +4 +52 +255 +4 +52 +255 +0 +55 +255 +4 +0 +52 +255 +4 +0 +48 +255 +6 +0 +0 +55 +254 +0 +52 +255 +6 +0 +0 +55 +254 +0 +48 +255 +6 +0 +0 +55 +255 +0 +0 +52 +255 +6 +0 +0 +0 +0 +0 +0 +84 +186 +239 +208 +75 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +35 +246 +13 +84 +213 +0 +0 +46 +228 +16 +202 +187 +49 +226 +0 +0 +0 +13 +239 +176 +0 +0 +0 +0 +15 +246 +36 +70 +225 +1 +0 +0 +0 +43 +233 +43 +0 +0 +0 +0 +33 +247 +247 +73 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +112 +254 +237 +0 +0 +0 +139 +14 +17 +117 +219 +229 +0 +0 +1 +219 +8 +211 +18 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +24 +251 +86 +5 +0 +65 +255 +0 +52 +255 +32 +0 +0 +80 +232 +0 +22 +255 +41 +0 +0 +0 +0 +0 +25 +255 +32 +0 +0 +81 +255 +0 +22 +255 +21 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +25 +255 +34 +0 +0 +81 +255 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +8 +84 +237 +29 +0 +0 +0 +51 +255 +5 +0 +0 +0 +255 +4 +52 +255 +4 +52 +255 +0 +56 +255 +4 +0 +52 +255 +4 +0 +27 +255 +32 +0 +0 +81 +234 +0 +52 +255 +32 +0 +0 +80 +233 +0 +26 +255 +32 +0 +0 +81 +255 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +4 +126 +237 +0 +0 +0 +51 +255 +4 +0 +0 +0 +48 +255 +8 +0 +66 +255 +4 +0 +0 +0 +199 +94 +173 +122 +0 +0 +2 +239 +110 +116 +189 +116 +166 +0 +0 +0 +166 +166 +222 +90 +0 +0 +0 +0 +166 +128 +162 +131 +0 +0 +0 +13 +216 +90 +0 +0 +0 +0 +0 +0 +3 +137 +210 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +14 +244 +89 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +154 +117 +188 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +33 +255 +68 +0 +26 +189 +255 +0 +52 +255 +160 +8 +17 +195 +143 +0 +0 +177 +185 +23 +0 +50 +42 +0 +0 +194 +158 +7 +19 +198 +255 +0 +0 +176 +162 +17 +0 +32 +76 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +191 +164 +10 +17 +195 +255 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +156 +194 +0 +0 +0 +24 +254 +67 +0 +0 +0 +255 +4 +52 +255 +4 +52 +255 +0 +56 +255 +4 +0 +52 +255 +4 +0 +0 +200 +158 +7 +19 +198 +151 +0 +52 +255 +160 +8 +17 +195 +146 +0 +0 +194 +158 +7 +19 +198 +255 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +31 +72 +8 +2 +124 +230 +0 +0 +0 +30 +255 +51 +0 +0 +0 +15 +251 +62 +0 +147 +255 +4 +0 +0 +0 +108 +195 +246 +32 +0 +0 +0 +182 +228 +42 +120 +228 +106 +0 +0 +103 +217 +11 +55 +238 +39 +0 +0 +0 +70 +222 +242 +36 +0 +0 +0 +172 +148 +0 +0 +0 +0 +0 +0 +0 +0 +57 +254 +1 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +49 +255 +8 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +78 +244 +107 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +114 +231 +243 +204 +108 +255 +0 +52 +255 +120 +232 +240 +159 +9 +0 +0 +14 +153 +234 +244 +206 +41 +0 +0 +28 +184 +244 +223 +132 +255 +0 +0 +14 +155 +234 +244 +218 +111 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +27 +184 +245 +221 +123 +255 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +118 +244 +246 +255 +244 +244 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +11 +217 +0 +0 +0 +0 +121 +240 +244 +114 +0 +255 +4 +52 +255 +4 +52 +255 +0 +56 +255 +4 +0 +52 +255 +4 +0 +0 +31 +184 +243 +238 +160 +12 +0 +52 +255 +120 +232 +241 +160 +10 +0 +0 +28 +185 +244 +223 +130 +255 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +35 +199 +242 +246 +204 +61 +0 +0 +0 +0 +141 +236 +229 +142 +0 +0 +120 +234 +191 +137 +255 +4 +0 +0 +0 +21 +251 +197 +0 +0 +0 +0 +122 +224 +0 +45 +255 +46 +0 +48 +241 +50 +0 +0 +118 +210 +0 +0 +0 +2 +227 +198 +0 +0 +0 +0 +255 +246 +244 +244 +244 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +10 +245 +27 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +72 +240 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +56 +254 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +199 +105 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +50 +255 +5 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +53 +255 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +53 +55 +2 +15 +182 +162 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +121 +215 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +64 +244 +16 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +25 +255 +56 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +106 +232 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +75 +220 +246 +237 +162 +16 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +194 +246 +227 +68 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +203 +237 +92 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +133 +229 +206 +0 +0 +0 +0 +52 +255 +4 +0 +0 +11 +240 +221 +96 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +187 +58 +108 +143 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +102 +10 +58 +54 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +97 +59 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +33 +222 +208 +8 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +60 +194 +183 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +48 +240 +52 +240 +3 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +58 +199 +211 +11 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +184 +184 +143 +119 +77 +39 +156 +0 +0 +0 +73 +164 +22 +196 +26 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +42 +179 +3 +188 +30 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +4 +134 +230 +245 +210 +44 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +57 +219 +243 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +4 +195 +31 +94 +137 +0 +0 +109 +231 +221 +73 +0 +0 +0 +0 +0 +47 +189 +243 +241 +204 +73 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +26 +175 +241 +247 +255 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +244 +244 +244 +244 +249 +254 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +111 +129 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +111 +178 +0 +111 +129 +0 +0 +52 +255 +4 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +156 +224 +40 +191 +0 +0 +0 +196 +0 +196 +159 +147 +211 +0 +0 +0 +0 +125 +231 +62 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +143 +189 +126 +0 +0 +0 +171 +161 +0 +0 +1 +208 +134 +0 +127 +0 +137 +197 +27 +0 +51 +39 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +218 +103 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +254 +51 +101 +235 +0 +0 +0 +0 +8 +233 +119 +7 +3 +56 +63 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +181 +177 +20 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +192 +148 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +206 +69 +0 +0 +0 +0 +0 +0 +62 +241 +1 +0 +0 +0 +0 +206 +94 +0 +206 +69 +0 +0 +62 +241 +1 +66 +241 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +174 +39 +188 +126 +0 +0 +0 +196 +0 +196 +55 +118 +196 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +15 +125 +8 +0 +0 +0 +29 +241 +39 +0 +85 +240 +17 +0 +127 +8 +244 +57 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +31 +249 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +118 +244 +246 +255 +244 +244 +72 +0 +118 +244 +246 +255 +244 +244 +72 +0 +0 +0 +0 +0 +0 +0 +0 +0 +254 +50 +100 +234 +1 +57 +97 +0 +46 +255 +15 +0 +0 +0 +0 +0 +0 +0 +0 +0 +31 +0 +0 +0 +10 +252 +51 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +101 +223 +12 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +35 +255 +14 +0 +0 +0 +0 +0 +0 +118 +157 +0 +0 +0 +0 +35 +255 +18 +35 +255 +14 +0 +0 +120 +157 +0 +143 +157 +0 +0 +0 +0 +84 +234 +231 +76 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +196 +0 +196 +0 +0 +196 +0 +0 +0 +109 +226 +245 +229 +114 +0 +0 +0 +0 +30 +0 +0 +0 +0 +0 +103 +239 +220 +122 +231 +236 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +209 +244 +244 +246 +255 +0 +0 +0 +120 +167 +2 +213 +127 +0 +0 +127 +240 +255 +241 +240 +236 +18 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +74 +210 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +111 +234 +255 +210 +148 +92 +14 +0 +10 +232 +176 +72 +17 +0 +0 +0 +0 +0 +0 +55 +219 +0 +0 +0 +40 +255 +14 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +25 +238 +68 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +178 +63 +0 +0 +0 +0 +52 +255 +4 +52 +255 +4 +0 +0 +181 +63 +0 +225 +63 +0 +0 +0 +0 +234 +255 +255 +232 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +31 +255 +62 +0 +20 +57 +0 +0 +0 +0 +218 +54 +0 +0 +0 +5 +243 +62 +113 +255 +57 +106 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +149 +171 +0 +0 +0 +6 +214 +135 +237 +14 +0 +0 +127 +51 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +22 +240 +247 +250 +240 +150 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +129 +149 +89 +13 +0 +0 +0 +0 +0 +33 +152 +222 +253 +188 +37 +0 +0 +0 +85 +217 +46 +0 +0 +0 +49 +255 +6 +0 +52 +255 +240 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +173 +156 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +234 +255 +255 +232 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +26 +252 +96 +11 +0 +0 +0 +0 +0 +0 +46 +217 +85 +0 +0 +39 +255 +11 +62 +255 +6 +54 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +90 +216 +13 +0 +0 +0 +0 +68 +255 +121 +0 +0 +0 +127 +240 +255 +240 +240 +50 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +156 +126 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +113 +231 +221 +73 +73 +223 +225 +0 +0 +0 +0 +0 +27 +170 +207 +0 +0 +0 +229 +102 +0 +0 +0 +0 +40 +255 +14 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +80 +228 +15 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +84 +235 +233 +79 +0 +0 +244 +244 +244 +244 +244 +244 +244 +0 +244 +244 +244 +244 +244 +244 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +84 +186 +239 +208 +75 +0 +0 +0 +0 +0 +103 +229 +0 +0 +50 +255 +5 +53 +255 +240 +241 +0 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +43 +233 +43 +0 +0 +0 +0 +0 +0 +252 +60 +0 +0 +0 +127 +9 +247 +62 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +200 +85 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +116 +240 +243 +255 +240 +240 +71 +0 +0 +0 +0 +0 +0 +0 +0 +0 +254 +51 +102 +235 +229 +51 +101 +0 +0 +0 +0 +0 +0 +61 +253 +0 +0 +0 +29 +206 +115 +0 +0 +0 +10 +252 +51 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +14 +228 +75 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +126 +237 +0 +0 +0 +0 +116 +206 +29 +0 +0 +39 +255 +11 +60 +255 +8 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +13 +216 +90 +0 +0 +0 +0 +0 +0 +0 +252 +60 +0 +0 +0 +127 +0 +146 +201 +26 +0 +50 +39 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +1 +243 +45 +0 +0 +0 +0 +52 +255 +4 +52 +255 +4 +0 +44 +220 +3 +44 +220 +3 +44 +0 +3 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +254 +47 +99 +235 +230 +47 +97 +0 +15 +135 +41 +5 +30 +171 +202 +0 +0 +0 +0 +12 +180 +0 +0 +0 +0 +181 +177 +19 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +151 +163 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +31 +72 +8 +2 +124 +230 +0 +0 +0 +0 +179 +12 +0 +0 +0 +6 +244 +62 +114 +255 +80 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +172 +148 +0 +0 +0 +0 +0 +0 +0 +0 +252 +60 +0 +0 +0 +127 +0 +6 +140 +231 +245 +213 +44 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +62 +241 +1 +0 +0 +0 +0 +0 +33 +253 +7 +0 +0 +0 +0 +62 +241 +1 +66 +241 +1 +0 +52 +255 +4 +52 +255 +4 +52 +0 +4 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +116 +239 +229 +79 +79 +231 +233 +0 +9 +166 +229 +252 +240 +177 +33 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +26 +177 +242 +247 +255 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +254 +247 +244 +244 +244 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +35 +199 +242 +246 +204 +61 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +105 +240 +221 +111 +222 +244 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +255 +246 +244 +244 +244 +0 +0 +0 +0 +0 +252 +60 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +120 +157 +0 +0 +0 +0 +0 +0 +85 +212 +0 +0 +0 +0 +0 +120 +157 +0 +143 +157 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +181 +63 +0 +0 +0 +0 +30 +11 +195 +131 +0 +0 +0 +0 +0 +181 +63 +0 +225 +63 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +227 +245 +177 +12 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +58 +98 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +8 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +20 +221 +50 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +103 +185 +255 +4 +0 +0 +0 +0 +106 +186 +255 +4 +0 +0 +0 +0 +0 +144 +235 +229 +126 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +49 +244 +3 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +86 +224 +245 +206 +0 +0 +0 +0 +0 +0 +0 +0 +0 +215 +116 +0 +0 +0 +164 +172 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +110 +227 +245 +223 +102 +0 +0 +0 +49 +244 +53 +244 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +122 +237 +237 +102 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +244 +244 +244 +175 +0 +0 +0 +0 +116 +239 +227 +77 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +116 +235 +233 +108 +0 +0 +0 +0 +165 +239 +235 +132 +0 +0 +0 +0 +0 +173 +88 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +40 +184 +245 +255 +246 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +101 +185 +255 +4 +0 +0 +0 +0 +77 +219 +247 +201 +45 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +17 +0 +101 +238 +0 +0 +0 +0 +0 +49 +244 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +11 +245 +105 +1 +43 +0 +0 +0 +0 +0 +0 +0 +0 +0 +62 +241 +25 +0 +61 +236 +23 +0 +0 +0 +0 +52 +255 +4 +0 +0 +33 +255 +60 +0 +26 +51 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +53 +181 +236 +230 +161 +31 +0 +0 +0 +33 +1 +102 +238 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +53 +181 +236 +230 +161 +31 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +30 +254 +51 +99 +236 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +42 +3 +96 +248 +0 +0 +0 +0 +15 +2 +107 +236 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +226 +255 +255 +255 +56 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +14 +244 +93 +2 +142 +209 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +222 +242 +72 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +14 +161 +243 +255 +236 +0 +0 +0 +47 +255 +11 +0 +0 +0 +0 +82 +25 +0 +0 +44 +64 +0 +0 +155 +165 +3 +210 +93 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +15 +230 +104 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +67 +255 +255 +253 +224 +140 +233 +0 +0 +3 +160 +237 +243 +255 +3 +0 +0 +0 +0 +31 +0 +0 +31 +0 +0 +0 +0 +0 +0 +0 +0 +0 +67 +255 +255 +251 +251 +255 +233 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +30 +254 +50 +100 +234 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +113 +173 +0 +0 +0 +0 +0 +244 +239 +67 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +0 +45 +255 +255 +255 +255 +56 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +47 +255 +12 +0 +61 +253 +0 +0 +30 +0 +0 +30 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +108 +224 +0 +0 +0 +0 +0 +44 +255 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +174 +182 +65 +255 +13 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +79 +222 +204 +189 +221 +47 +0 +123 +185 +244 +166 +235 +176 +90 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +100 +237 +188 +46 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +222 +255 +110 +2 +21 +6 +156 +0 +0 +42 +255 +40 +100 +255 +4 +0 +0 +0 +55 +219 +0 +55 +218 +0 +0 +0 +0 +0 +0 +0 +0 +0 +222 +161 +255 +4 +86 +247 +157 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +114 +233 +220 +71 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +65 +191 +12 +0 +0 +0 +0 +0 +0 +107 +224 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +0 +19 +250 +255 +255 +255 +56 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +12 +243 +94 +4 +144 +206 +0 +0 +218 +54 +0 +219 +54 +0 +0 +81 +176 +212 +160 +0 +28 +70 +0 +81 +176 +212 +168 +31 +8 +78 +0 +0 +35 +1 +114 +240 +0 +0 +0 +0 +0 +63 +242 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +22 +255 +48 +52 +255 +4 +0 +0 +172 +243 +255 +240 +240 +37 +0 +0 +17 +230 +49 +97 +201 +0 +0 +0 +0 +101 +255 +50 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +21 +249 +20 +108 +240 +103 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +255 +255 +14 +0 +0 +0 +67 +0 +0 +5 +182 +234 +147 +248 +3 +0 +0 +85 +219 +47 +85 +212 +43 +0 +186 +244 +244 +244 +244 +245 +252 +0 +255 +71 +255 +244 +232 +84 +67 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +240 +240 +243 +255 +240 +240 +0 +0 +0 +56 +182 +13 +0 +0 +0 +0 +0 +42 +1 +116 +239 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +105 +248 +255 +255 +56 +255 +0 +0 +0 +44 +220 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +81 +176 +212 +168 +49 +0 +0 +0 +72 +213 +242 +195 +40 +0 +0 +44 +213 +85 +48 +220 +85 +0 +0 +2 +56 +132 +204 +195 +104 +0 +0 +0 +12 +86 +169 +231 +170 +0 +0 +180 +240 +219 +87 +42 +91 +0 +0 +15 +210 +132 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +48 +255 +11 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +16 +229 +53 +101 +198 +0 +0 +168 +240 +243 +255 +240 +240 +123 +0 +0 +0 +0 +0 +0 +0 +0 +0 +30 +254 +67 +0 +93 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +255 +222 +111 +4 +17 +5 +67 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +229 +109 +0 +229 +89 +0 +0 +0 +0 +0 +0 +0 +52 +255 +0 +255 +71 +255 +9 +178 +76 +67 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +173 +242 +240 +240 +11 +0 +0 +0 +200 +241 +217 +82 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +0 +18 +107 +255 +56 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +89 +229 +0 +109 +229 +0 +150 +216 +167 +92 +18 +0 +0 +0 +92 +177 +230 +162 +79 +8 +0 +0 +21 +98 +143 +151 +148 +110 +60 +0 +0 +186 +168 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +21 +255 +43 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +76 +223 +204 +189 +222 +49 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +117 +241 +119 +83 +210 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +224 +153 +197 +240 +202 +13 +157 +0 +0 +3 +240 +240 +240 +240 +11 +0 +0 +29 +207 +117 +29 +205 +112 +0 +0 +0 +0 +0 +0 +50 +248 +0 +224 +156 +228 +3 +22 +188 +166 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +11 +0 +62 +255 +4 +0 +0 +0 +0 +52 +255 +56 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +228 +240 +240 +240 +172 +0 +0 +113 +205 +29 +118 +207 +29 +0 +49 +4 +0 +0 +146 +255 +4 +0 +130 +71 +5 +87 +225 +232 +129 +0 +21 +53 +7 +0 +2 +174 +255 +0 +40 +255 +20 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +175 +172 +59 +255 +8 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +85 +25 +0 +0 +46 +62 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +43 +182 +246 +51 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +68 +240 +97 +7 +14 +129 +232 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +12 +180 +0 +12 +180 +0 +0 +0 +0 +0 +0 +0 +0 +0 +68 +240 +97 +7 +14 +129 +232 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +99 +3 +157 +255 +18 +0 +0 +0 +0 +52 +255 +56 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +179 +12 +0 +179 +12 +0 +0 +0 +0 +0 +44 +141 +255 +4 +0 +0 +0 +0 +28 +5 +88 +239 +0 +0 +0 +0 +0 +126 +102 +255 +0 +23 +252 +95 +8 +66 +99 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +13 +156 +235 +255 +231 +0 +0 +244 +246 +255 +244 +244 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +127 +213 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +53 +184 +236 +232 +164 +31 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +0 +0 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +53 +184 +236 +232 +164 +31 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +244 +244 +244 +244 +244 +244 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +163 +243 +148 +208 +191 +0 +0 +0 +0 +52 +255 +56 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +0 +0 +0 +0 +0 +0 +136 +53 +255 +4 +0 +0 +0 +0 +0 +9 +168 +67 +0 +0 +0 +0 +84 +94 +52 +255 +0 +0 +101 +231 +249 +202 +68 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +1 +72 +10 +3 +120 +233 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +56 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +33 +65 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +240 +243 +255 +176 +0 +0 +0 +0 +28 +162 +38 +0 +0 +0 +0 +0 +174 +240 +243 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +2 +188 +234 +241 +201 +61 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +23 +116 +25 +116 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +214 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +143 +245 +244 +244 +0 +0 +0 +0 +0 +0 +52 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +116 +199 +178 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +0 +0 +51 +90 +0 +0 +0 +0 +0 +0 +0 +6 +119 +17 +0 +0 +0 +0 +4 +117 +84 +0 +0 +0 +0 +2 +196 +190 +20 +191 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +145 +237 +102 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +99 +44 +0 +0 +0 +0 +0 +0 +0 +48 +95 +0 +0 +0 +0 +0 +41 +128 +38 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +97 +35 +0 +0 +0 +0 +0 +0 +0 +57 +85 +0 +0 +0 +0 +0 +46 +127 +26 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +18 +217 +181 +17 +203 +0 +0 +0 +0 +74 +213 +6 +0 +0 +0 +0 +0 +0 +27 +229 +40 +0 +0 +0 +0 +29 +222 +209 +8 +0 +0 +0 +2 +195 +200 +27 +193 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +101 +212 +8 +0 +0 +0 +0 +0 +0 +29 +234 +61 +0 +0 +0 +0 +42 +226 +218 +16 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +143 +135 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +3 +172 +83 +0 +0 +0 +0 +0 +0 +158 +105 +0 +0 +0 +0 +0 +154 +91 +157 +84 +0 +0 +0 +34 +144 +63 +189 +101 +0 +0 +0 +48 +240 +52 +240 +3 +0 +0 +0 +32 +255 +96 +239 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +39 +201 +20 +0 +0 +0 +0 +0 +25 +203 +35 +0 +0 +0 +0 +24 +188 +62 +188 +22 +0 +0 +0 +48 +240 +52 +240 +3 +0 +0 +0 +0 +42 +195 +12 +0 +0 +0 +0 +0 +29 +198 +25 +0 +0 +0 +0 +22 +184 +66 +185 +14 +0 +0 +0 +48 +240 +52 +240 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +74 +110 +77 +192 +109 +0 +0 +0 +0 +0 +139 +130 +0 +0 +0 +0 +0 +0 +177 +92 +0 +0 +0 +0 +1 +183 +63 +107 +141 +0 +0 +0 +37 +141 +60 +187 +123 +0 +0 +0 +48 +240 +3 +48 +240 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +151 +143 +0 +0 +0 +0 +0 +1 +189 +104 +0 +0 +0 +0 +8 +200 +53 +93 +169 +0 +0 +0 +48 +240 +3 +48 +240 +3 +0 +0 +0 +42 +192 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +20 +246 +100 +217 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +9 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +20 +252 +200 +0 +0 +0 +0 +0 +20 +252 +200 +0 +0 +0 +0 +0 +20 +252 +200 +0 +0 +0 +0 +0 +20 +252 +200 +0 +0 +0 +0 +0 +80 +255 +32 +0 +0 +0 +0 +0 +62 +238 +30 +0 +0 +0 +0 +0 +196 +247 +255 +244 +244 +0 +0 +0 +96 +213 +244 +234 +137 +0 +52 +255 +244 +244 +244 +244 +68 +0 +52 +255 +244 +244 +244 +244 +68 +0 +52 +255 +244 +244 +244 +244 +68 +0 +52 +255 +244 +244 +244 +236 +0 +0 +0 +244 +246 +255 +244 +244 +0 +0 +0 +244 +246 +255 +244 +244 +0 +0 +0 +244 +246 +255 +244 +244 +0 +0 +0 +244 +246 +255 +244 +244 +0 +0 +52 +255 +244 +239 +190 +68 +0 +0 +52 +255 +166 +0 +0 +52 +255 +0 +0 +15 +168 +241 +236 +141 +2 +0 +0 +15 +168 +241 +236 +141 +2 +0 +0 +15 +168 +241 +236 +141 +2 +0 +0 +15 +168 +241 +236 +141 +2 +0 +0 +15 +168 +241 +236 +141 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +13 +166 +240 +239 +148 +152 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +220 +112 +0 +0 +0 +161 +179 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +100 +226 +247 +212 +58 +0 +0 +127 +0 +0 +98 +207 +251 +26 +0 +0 +0 +0 +98 +207 +251 +26 +0 +0 +0 +0 +98 +207 +251 +26 +0 +0 +0 +0 +98 +207 +251 +26 +0 +0 +0 +0 +160 +212 +112 +0 +0 +0 +0 +0 +91 +210 +42 +0 +0 +0 +0 +17 +242 +58 +255 +4 +0 +0 +0 +100 +223 +50 +0 +22 +89 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +7 +81 +238 +66 +0 +52 +255 +242 +30 +0 +52 +255 +0 +0 +160 +175 +10 +24 +213 +112 +0 +0 +160 +175 +10 +24 +213 +112 +0 +0 +160 +175 +10 +24 +213 +112 +0 +0 +160 +175 +10 +24 +213 +112 +0 +0 +160 +175 +10 +24 +213 +112 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +158 +169 +7 +42 +243 +176 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +74 +238 +18 +0 +52 +245 +33 +0 +52 +255 +4 +0 +0 +0 +0 +0 +20 +251 +87 +1 +120 +216 +0 +0 +127 +0 +0 +179 +121 +200 +105 +0 +0 +0 +0 +179 +121 +200 +105 +0 +0 +0 +0 +179 +121 +200 +105 +0 +0 +0 +0 +179 +121 +200 +105 +0 +0 +0 +3 +236 +97 +192 +0 +0 +0 +0 +0 +185 +107 +136 +0 +0 +0 +0 +86 +189 +52 +255 +4 +0 +0 +0 +227 +84 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +0 +125 +186 +0 +52 +255 +150 +143 +0 +52 +255 +0 +6 +246 +54 +0 +0 +105 +204 +0 +6 +246 +54 +0 +0 +105 +204 +0 +6 +246 +54 +0 +0 +105 +204 +0 +6 +246 +54 +0 +0 +105 +204 +0 +6 +246 +54 +0 +0 +105 +204 +0 +0 +123 +22 +0 +0 +66 +81 +0 +5 +246 +57 +0 +52 +245 +208 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +176 +146 +0 +194 +127 +0 +0 +52 +255 +240 +240 +233 +177 +38 +0 +50 +255 +8 +69 +180 +160 +0 +0 +127 +0 +12 +248 +51 +130 +186 +0 +0 +0 +12 +248 +51 +130 +186 +0 +0 +0 +12 +248 +51 +130 +186 +0 +0 +0 +12 +248 +51 +130 +186 +0 +0 +0 +64 +222 +16 +250 +19 +0 +0 +0 +25 +230 +26 +227 +2 +0 +0 +0 +159 +125 +52 +255 +4 +0 +0 +31 +255 +21 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +0 +69 +240 +0 +52 +255 +37 +239 +16 +52 +255 +0 +38 +255 +15 +0 +0 +64 +244 +0 +38 +255 +15 +0 +0 +64 +244 +0 +38 +255 +15 +0 +0 +64 +244 +0 +38 +255 +15 +0 +0 +64 +244 +0 +38 +255 +15 +0 +0 +64 +244 +0 +0 +130 +214 +25 +73 +235 +64 +0 +38 +255 +20 +12 +210 +108 +246 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +31 +241 +124 +221 +8 +0 +0 +52 +255 +4 +0 +18 +164 +208 +0 +52 +255 +30 +251 +36 +0 +0 +0 +127 +0 +86 +235 +1 +59 +250 +16 +0 +0 +86 +235 +1 +59 +250 +16 +0 +0 +86 +235 +1 +59 +250 +16 +0 +0 +86 +235 +1 +59 +250 +16 +0 +0 +144 +164 +0 +213 +96 +0 +0 +0 +117 +182 +0 +230 +68 +0 +0 +1 +231 +61 +52 +255 +240 +240 +0 +48 +255 +6 +0 +0 +0 +0 +0 +52 +255 +240 +240 +240 +240 +22 +0 +52 +255 +240 +240 +240 +240 +22 +0 +52 +255 +240 +240 +240 +240 +22 +0 +52 +255 +240 +240 +240 +187 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +239 +255 +240 +198 +0 +55 +255 +0 +52 +255 +4 +169 +120 +52 +255 +0 +49 +255 +5 +0 +0 +54 +255 +0 +49 +255 +5 +0 +0 +54 +255 +0 +49 +255 +5 +0 +0 +54 +255 +0 +49 +255 +5 +0 +0 +54 +255 +0 +49 +255 +5 +0 +0 +54 +255 +0 +0 +0 +124 +225 +235 +60 +0 +0 +49 +255 +6 +160 +101 +53 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +52 +255 +4 +0 +0 +52 +255 +0 +0 +0 +124 +255 +75 +0 +0 +0 +52 +255 +4 +0 +0 +59 +253 +0 +52 +255 +26 +245 +109 +2 +0 +0 +127 +0 +167 +167 +0 +4 +240 +92 +0 +0 +167 +167 +0 +4 +240 +92 +0 +0 +167 +167 +0 +4 +240 +92 +0 +0 +167 +167 +0 +4 +240 +92 +0 +0 +223 +105 +0 +154 +176 +0 +0 +0 +210 +130 +0 +179 +162 +0 +0 +49 +246 +6 +52 +255 +4 +0 +0 +31 +255 +23 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +0 +69 +240 +0 +52 +255 +4 +52 +230 +58 +255 +0 +38 +255 +15 +0 +0 +64 +244 +0 +38 +255 +15 +0 +0 +64 +244 +0 +38 +255 +15 +0 +0 +64 +244 +0 +38 +255 +15 +0 +0 +64 +244 +0 +38 +255 +15 +0 +0 +64 +244 +0 +0 +0 +80 +241 +224 +31 +0 +0 +40 +255 +92 +164 +0 +63 +245 +0 +51 +255 +4 +0 +0 +52 +255 +0 +51 +255 +4 +0 +0 +52 +255 +0 +51 +255 +4 +0 +0 +52 +255 +0 +51 +255 +4 +0 +0 +52 +255 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +17 +161 +208 +0 +52 +255 +4 +47 +187 +209 +46 +0 +127 +7 +241 +250 +248 +248 +253 +173 +0 +7 +241 +250 +248 +248 +253 +173 +0 +7 +241 +250 +248 +248 +253 +173 +0 +7 +241 +250 +248 +248 +253 +173 +0 +48 +255 +249 +248 +250 +246 +10 +0 +49 +255 +249 +248 +250 +244 +11 +0 +122 +251 +240 +243 +255 +4 +0 +0 +0 +228 +88 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +0 +126 +186 +0 +52 +255 +4 +0 +192 +149 +255 +0 +6 +247 +54 +0 +0 +104 +204 +0 +6 +247 +54 +0 +0 +104 +204 +0 +6 +247 +54 +0 +0 +104 +204 +0 +6 +247 +54 +0 +0 +104 +204 +0 +6 +247 +54 +0 +0 +104 +204 +0 +0 +87 +233 +51 +113 +224 +34 +0 +10 +253 +203 +12 +0 +100 +203 +0 +40 +255 +9 +0 +0 +57 +248 +0 +40 +255 +9 +0 +0 +57 +248 +0 +40 +255 +9 +0 +0 +57 +248 +0 +40 +255 +8 +0 +0 +56 +248 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +240 +240 +234 +178 +38 +0 +52 +255 +4 +0 +0 +116 +220 +0 +127 +74 +249 +16 +0 +0 +87 +245 +0 +74 +249 +16 +0 +0 +87 +245 +0 +74 +249 +16 +0 +0 +87 +245 +0 +74 +249 +16 +0 +0 +87 +245 +0 +128 +211 +0 +0 +15 +248 +80 +0 +143 +187 +0 +0 +5 +234 +94 +0 +195 +109 +0 +52 +255 +4 +0 +0 +0 +102 +228 +62 +5 +34 +99 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +8 +58 +255 +11 +8 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +7 +82 +239 +67 +0 +52 +255 +4 +0 +75 +246 +255 +0 +0 +163 +173 +9 +23 +212 +114 +0 +0 +163 +173 +9 +23 +212 +114 +0 +0 +163 +173 +9 +23 +212 +114 +0 +0 +163 +173 +9 +23 +212 +114 +0 +0 +163 +173 +9 +23 +212 +114 +0 +0 +166 +49 +0 +0 +108 +107 +0 +13 +237 +190 +15 +18 +206 +111 +0 +5 +232 +117 +10 +19 +158 +190 +0 +5 +232 +117 +10 +19 +158 +190 +0 +5 +232 +117 +10 +19 +158 +190 +0 +5 +232 +107 +3 +9 +151 +190 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +34 +8 +2 +118 +240 +0 +127 +155 +179 +0 +0 +0 +11 +245 +0 +155 +179 +0 +0 +0 +11 +245 +0 +155 +179 +0 +0 +0 +11 +245 +0 +155 +179 +0 +0 +0 +11 +245 +0 +208 +126 +0 +0 +0 +176 +160 +0 +232 +94 +0 +0 +0 +144 +188 +0 +251 +31 +0 +52 +255 +244 +244 +0 +0 +0 +99 +214 +255 +240 +135 +0 +52 +255 +244 +244 +244 +244 +99 +0 +52 +255 +244 +244 +244 +244 +99 +0 +52 +255 +244 +244 +244 +244 +99 +0 +52 +255 +244 +244 +244 +244 +22 +0 +0 +244 +246 +255 +244 +244 +0 +0 +0 +244 +246 +255 +244 +244 +0 +0 +0 +255 +255 +255 +255 +255 +0 +0 +0 +244 +246 +255 +244 +244 +0 +0 +52 +255 +244 +240 +191 +69 +0 +0 +52 +255 +4 +0 +1 +213 +255 +0 +0 +16 +171 +241 +237 +143 +3 +0 +0 +16 +171 +241 +237 +143 +3 +0 +0 +16 +171 +241 +237 +143 +3 +0 +0 +16 +171 +241 +237 +143 +3 +0 +0 +16 +171 +241 +237 +143 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +157 +99 +185 +245 +234 +140 +2 +0 +0 +51 +197 +249 +244 +177 +28 +0 +0 +51 +197 +249 +244 +177 +28 +0 +0 +51 +197 +249 +244 +177 +28 +0 +0 +51 +197 +244 +241 +177 +28 +0 +0 +0 +52 +255 +4 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +116 +240 +246 +211 +74 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +107 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +17 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +13 +69 +194 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +233 +241 +107 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +104 +226 +228 +110 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +8 +195 +125 +0 +0 +0 +0 +0 +0 +0 +0 +98 +212 +15 +0 +0 +0 +2 +197 +213 +8 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +241 +45 +96 +248 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +157 +139 +0 +0 +0 +0 +0 +0 +0 +0 +154 +142 +0 +0 +0 +0 +10 +199 +192 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +111 +190 +2 +0 +0 +0 +0 +0 +0 +0 +50 +225 +29 +0 +0 +0 +0 +130 +241 +30 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +11 +187 +114 +0 +0 +0 +0 +0 +0 +0 +1 +161 +149 +1 +0 +0 +0 +24 +211 +193 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +68 +217 +9 +0 +0 +0 +0 +0 +0 +0 +44 +223 +23 +0 +0 +0 +0 +88 +244 +31 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +64 +91 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +0 +18 +213 +67 +0 +0 +0 +0 +0 +0 +46 +220 +30 +0 +0 +0 +0 +115 +148 +123 +138 +0 +0 +0 +14 +196 +237 +203 +189 +27 +0 +0 +0 +240 +3 +49 +244 +3 +0 +0 +0 +105 +226 +228 +110 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +155 +105 +0 +0 +0 +0 +0 +0 +121 +140 +0 +0 +0 +0 +0 +158 +74 +90 +145 +0 +0 +0 +0 +240 +3 +49 +244 +3 +0 +0 +0 +0 +158 +122 +0 +0 +0 +0 +0 +0 +12 +210 +56 +0 +0 +0 +0 +38 +200 +77 +175 +0 +0 +0 +49 +244 +53 +244 +3 +0 +0 +0 +3 +138 +202 +114 +121 +12 +0 +0 +86 +232 +214 +194 +37 +0 +0 +0 +0 +7 +172 +97 +0 +0 +0 +0 +0 +0 +144 +133 +0 +0 +0 +0 +6 +185 +54 +92 +153 +0 +0 +0 +25 +206 +234 +199 +174 +3 +0 +0 +49 +244 +3 +49 +244 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +123 +138 +0 +0 +0 +0 +0 +0 +2 +195 +59 +0 +0 +0 +0 +11 +204 +78 +171 +0 +0 +0 +0 +49 +244 +53 +244 +3 +0 +0 +0 +0 +0 +51 +205 +26 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +49 +244 +53 +244 +3 +0 +0 +127 +0 +0 +0 +32 +105 +0 +0 +0 +0 +0 +0 +91 +46 +0 +0 +0 +0 +2 +113 +7 +1 +111 +7 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +117 +7 +0 +0 +0 +0 +0 +57 +72 +0 +0 +0 +0 +0 +74 +38 +0 +93 +20 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +51 +110 +93 +212 +36 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +24 +0 +0 +0 +1 +109 +6 +0 +0 +0 +0 +0 +35 +80 +0 +0 +0 +0 +0 +49 +64 +0 +96 +15 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +103 +25 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +127 +0 +103 +213 +244 +239 +180 +36 +0 +0 +103 +213 +244 +240 +180 +36 +0 +0 +103 +213 +244 +239 +180 +36 +0 +0 +103 +213 +244 +239 +180 +36 +0 +0 +103 +213 +244 +239 +180 +36 +0 +0 +103 +213 +244 +239 +180 +36 +0 +0 +132 +239 +226 +131 +234 +236 +0 +0 +12 +151 +233 +244 +202 +40 +0 +0 +13 +156 +236 +241 +165 +12 +0 +0 +13 +156 +236 +241 +165 +12 +0 +0 +13 +156 +236 +241 +165 +12 +0 +0 +13 +156 +235 +241 +165 +12 +0 +0 +0 +244 +246 +255 +4 +0 +0 +0 +0 +244 +246 +255 +4 +0 +0 +0 +0 +244 +246 +255 +4 +0 +0 +0 +148 +244 +255 +4 +0 +0 +0 +0 +25 +178 +243 +251 +214 +9 +0 +52 +255 +111 +233 +235 +80 +0 +0 +0 +29 +182 +242 +237 +157 +11 +0 +0 +29 +182 +242 +237 +157 +11 +0 +0 +29 +182 +242 +237 +157 +11 +0 +0 +29 +182 +242 +237 +157 +11 +0 +0 +29 +182 +242 +237 +157 +11 +0 +0 +0 +0 +49 +244 +3 +0 +0 +0 +29 +181 +242 +238 +160 +192 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +40 +250 +19 +0 +0 +50 +245 +0 +52 +255 +121 +231 +241 +161 +10 +0 +93 +212 +0 +0 +0 +221 +87 +0 +127 +0 +93 +52 +2 +9 +162 +204 +0 +0 +93 +52 +2 +10 +165 +204 +0 +0 +93 +52 +2 +9 +162 +204 +0 +0 +93 +52 +2 +9 +162 +204 +0 +0 +93 +52 +2 +9 +162 +204 +0 +0 +93 +52 +2 +9 +159 +204 +0 +0 +48 +4 +120 +255 +57 +104 +0 +0 +174 +188 +24 +0 +53 +43 +0 +0 +173 +187 +16 +11 +178 +153 +0 +0 +173 +187 +16 +11 +178 +153 +0 +0 +173 +186 +16 +11 +179 +152 +0 +0 +173 +177 +14 +11 +179 +152 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +252 +4 +0 +0 +0 +0 +192 +167 +11 +4 +181 +123 +0 +52 +255 +121 +2 +133 +219 +0 +0 +0 +198 +158 +8 +19 +198 +149 +0 +0 +198 +158 +8 +19 +198 +149 +0 +0 +198 +158 +8 +19 +198 +149 +0 +0 +198 +158 +8 +19 +198 +149 +0 +0 +198 +158 +8 +19 +198 +149 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +198 +161 +9 +24 +239 +165 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +200 +106 +0 +0 +142 +163 +0 +52 +255 +163 +9 +19 +198 +145 +0 +11 +244 +36 +0 +48 +244 +10 +0 +127 +0 +0 +0 +0 +0 +61 +252 +0 +0 +0 +0 +0 +0 +62 +252 +0 +0 +0 +0 +0 +0 +61 +252 +0 +0 +0 +0 +0 +0 +61 +252 +0 +0 +0 +0 +0 +0 +61 +252 +0 +0 +0 +0 +0 +0 +57 +252 +0 +0 +0 +0 +55 +255 +6 +54 +0 +22 +255 +41 +0 +0 +0 +0 +0 +21 +255 +50 +0 +0 +67 +236 +0 +21 +255 +50 +0 +0 +67 +236 +0 +21 +255 +49 +0 +0 +70 +236 +0 +21 +255 +37 +0 +0 +70 +236 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +252 +4 +0 +0 +0 +25 +255 +35 +0 +0 +86 +217 +0 +52 +255 +18 +0 +56 +254 +1 +0 +27 +255 +32 +0 +0 +81 +234 +0 +27 +255 +32 +0 +0 +81 +234 +0 +27 +255 +32 +0 +0 +81 +234 +0 +27 +255 +32 +0 +0 +81 +234 +0 +27 +255 +32 +0 +0 +81 +234 +0 +0 +240 +240 +240 +240 +240 +240 +0 +27 +255 +31 +2 +168 +165 +235 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +103 +199 +0 +3 +230 +67 +0 +52 +255 +33 +0 +0 +81 +232 +0 +0 +162 +117 +0 +130 +165 +0 +0 +127 +0 +78 +197 +237 +240 +243 +255 +0 +0 +71 +189 +224 +224 +230 +255 +0 +0 +78 +197 +237 +240 +243 +255 +0 +0 +78 +197 +237 +240 +243 +255 +0 +0 +78 +197 +237 +240 +243 +255 +0 +0 +78 +197 +237 +240 +243 +255 +0 +0 +125 +231 +244 +255 +240 +241 +0 +50 +255 +7 +0 +0 +0 +0 +0 +47 +255 +225 +224 +224 +227 +239 +0 +47 +255 +225 +224 +224 +227 +239 +0 +47 +255 +240 +240 +240 +241 +247 +0 +47 +255 +240 +240 +240 +241 +247 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +252 +4 +0 +0 +0 +48 +255 +7 +0 +0 +56 +254 +0 +52 +255 +4 +0 +52 +255 +4 +0 +48 +255 +6 +0 +0 +55 +254 +0 +48 +255 +6 +0 +0 +55 +254 +0 +48 +255 +6 +0 +0 +55 +254 +0 +48 +255 +6 +0 +0 +55 +254 +0 +48 +255 +6 +0 +0 +55 +254 +0 +0 +0 +0 +0 +0 +0 +0 +0 +48 +255 +7 +152 +111 +54 +255 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +15 +246 +36 +70 +225 +1 +0 +52 +255 +6 +0 +0 +55 +254 +0 +0 +68 +197 +0 +212 +76 +0 +0 +127 +24 +251 +95 +6 +0 +62 +255 +0 +23 +250 +82 +2 +0 +65 +255 +0 +24 +251 +86 +5 +0 +65 +255 +0 +24 +251 +86 +5 +0 +65 +255 +0 +24 +251 +86 +5 +0 +65 +255 +0 +24 +251 +86 +5 +0 +65 +255 +0 +32 +255 +57 +53 +255 +8 +0 +0 +22 +255 +41 +0 +0 +0 +0 +0 +22 +255 +23 +0 +0 +0 +0 +0 +22 +255 +23 +0 +0 +0 +0 +0 +22 +255 +21 +0 +0 +0 +0 +0 +22 +255 +21 +0 +0 +0 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +252 +4 +0 +0 +0 +25 +255 +34 +0 +0 +83 +238 +0 +52 +255 +4 +0 +52 +255 +4 +0 +27 +255 +32 +0 +0 +81 +234 +0 +27 +255 +32 +0 +0 +81 +234 +0 +27 +255 +32 +0 +0 +81 +234 +0 +27 +255 +32 +0 +0 +81 +234 +0 +27 +255 +32 +0 +0 +81 +234 +0 +0 +0 +0 +48 +240 +3 +0 +0 +27 +255 +165 +129 +0 +81 +234 +0 +48 +255 +8 +0 +66 +255 +4 +0 +48 +255 +8 +0 +66 +255 +4 +0 +48 +255 +8 +0 +66 +255 +4 +0 +48 +255 +8 +0 +66 +255 +4 +0 +0 +0 +166 +128 +162 +131 +0 +0 +52 +255 +32 +0 +0 +80 +233 +0 +0 +2 +226 +62 +238 +5 +0 +0 +127 +33 +255 +38 +0 +4 +170 +255 +0 +33 +255 +69 +0 +26 +189 +255 +0 +33 +255 +68 +0 +26 +189 +255 +0 +33 +255 +68 +0 +26 +189 +255 +0 +33 +255 +68 +0 +26 +189 +255 +0 +33 +255 +68 +0 +26 +189 +255 +0 +38 +255 +39 +95 +255 +76 +1 +0 +0 +177 +185 +23 +0 +50 +42 +0 +0 +176 +165 +17 +0 +32 +76 +0 +0 +176 +165 +17 +0 +32 +76 +0 +0 +176 +162 +17 +0 +32 +76 +0 +0 +176 +162 +17 +0 +29 +79 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +252 +4 +0 +0 +0 +0 +194 +163 +8 +21 +202 +156 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +200 +158 +7 +19 +198 +151 +0 +0 +200 +158 +7 +19 +198 +151 +0 +0 +200 +158 +7 +19 +198 +151 +0 +0 +200 +158 +7 +19 +198 +151 +0 +0 +200 +158 +7 +19 +198 +151 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +216 +210 +7 +19 +198 +151 +0 +15 +251 +62 +0 +147 +255 +4 +0 +15 +251 +62 +0 +147 +255 +4 +0 +15 +251 +62 +0 +147 +255 +4 +0 +15 +251 +62 +0 +147 +255 +4 +0 +0 +0 +70 +222 +242 +36 +0 +0 +52 +255 +160 +8 +17 +195 +146 +0 +0 +0 +137 +215 +157 +0 +0 +0 +127 +0 +114 +219 +196 +189 +127 +255 +0 +0 +114 +231 +243 +204 +107 +255 +0 +0 +114 +231 +243 +204 +108 +255 +0 +0 +114 +231 +243 +204 +108 +255 +0 +0 +114 +231 +243 +204 +108 +255 +0 +0 +113 +230 +243 +205 +106 +255 +0 +0 +154 +245 +215 +95 +224 +242 +0 +0 +14 +153 +237 +255 +207 +42 +0 +0 +14 +155 +234 +244 +218 +111 +0 +0 +14 +155 +234 +244 +218 +111 +0 +0 +14 +155 +234 +244 +218 +111 +0 +0 +14 +153 +233 +244 +220 +120 +0 +0 +118 +244 +246 +255 +244 +244 +0 +0 +108 +224 +230 +255 +224 +224 +0 +0 +108 +224 +230 +255 +224 +224 +0 +22 +244 +244 +255 +244 +244 +34 +0 +0 +27 +180 +242 +238 +161 +13 +0 +52 +255 +4 +0 +52 +255 +4 +0 +0 +31 +184 +243 +238 +160 +12 +0 +0 +31 +184 +243 +238 +160 +12 +0 +0 +31 +184 +243 +238 +160 +12 +0 +0 +31 +184 +243 +238 +160 +12 +0 +0 +31 +184 +243 +238 +160 +12 +0 +0 +0 +0 +0 +0 +0 +0 +0 +95 +164 +178 +242 +238 +160 +12 +0 +0 +120 +234 +191 +137 +255 +4 +0 +0 +120 +234 +191 +137 +255 +4 +0 +0 +120 +234 +191 +137 +255 +4 +0 +0 +120 +234 +191 +137 +255 +4 +0 +0 +0 +2 +227 +198 +0 +0 +0 +52 +255 +120 +232 +241 +160 +10 +0 +0 +0 +43 +255 +72 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +187 +14 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +40 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +199 +105 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +18 +232 +4 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +10 +1 +167 +67 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +64 +244 +16 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +0 +0 +132 +148 +0 +0 +0 +0 +127 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +64 +242 +213 +19 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +203 +237 +92 +0 +0 +0 +0 +52 +255 +4 +0 +0 +0 +0 +0 +11 +243 +209 +25 +0 +0 +0 +0 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 +127 +127 +127 +127 +127 +127 +127 +0 diff --git a/AntTweakBar/src/res/FontLargeAA.pgm b/AntTweakBar/src/res/FontLargeAA.pgm new file mode 100644 index 0000000..a70fbdd --- /dev/null +++ b/AntTweakBar/src/res/FontLargeAA.pgm @@ -0,0 +1,1197 @@ +P2 +# Created by Paint Shop Pro +276 120 +255 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 +4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 0 +0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 59 245 125 175 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 241 89 0 0 12 235 201 89 255 166 0 0 0 0 0 172 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 21 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 +0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 138 247 34 0 12 +232 89 138 225 21 0 0 0 0 138 125 7 199 34 0 0 0 0 138 125 0 0 0 0 138 +255 255 201 0 0 0 59 215 21 0 0 0 0 59 245 255 255 166 0 0 0 59 241 89 +0 7 206 201 0 0 89 251 89 0 59 215 21 172 89 59 192 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 0 0 138 255 251 89 0 0 0 0 0 +138 201 0 0 0 7 206 255 255 255 166 0 0 7 206 255 255 255 201 0 0 0 0 0 +0 138 251 89 0 0 175 255 255 255 255 225 21 0 0 12 235 255 255 125 89 255 +255 255 255 255 251 89 0 12 235 255 255 225 21 0 0 59 245 255 255 166 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 59 245 255 255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 +4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 89 247 +34 0 12 232 89 138 201 0 0 0 0 7 202 89 59 215 21 0 0 12 235 255 255 255 +166 0 59 241 89 12 235 125 0 0 172 89 0 0 0 0 7 206 166 0 89 251 89 0 0 +12 228 34 0 89 247 34 0 0 0 175 201 0 0 89 251 191 194 247 34 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 175 201 0 12 235 +125 0 0 138 255 255 201 0 0 0 12 182 0 0 59 245 125 0 12 206 21 0 12 235 +166 0 0 0 0 89 255 251 89 0 0 175 201 0 0 0 0 0 0 89 255 125 0 0 0 0 0 +0 0 0 89 251 89 12 235 166 0 7 206 201 0 59 245 125 0 12 235 166 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 89 166 0 0 138 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 +0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 12 +228 34 89 201 0 0 0 0 12 206 21 89 166 0 0 12 235 125 138 125 59 192 0 +89 247 34 7 206 166 0 89 201 0 0 0 0 0 12 235 125 0 12 232 89 0 0 12 228 +34 0 175 201 0 0 0 0 59 241 89 0 0 7 206 166 0 0 0 0 0 0 0 138 166 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 21 59 241 89 0 0 138 225 21 0 +0 0 175 201 0 0 0 0 0 0 0 7 206 201 0 0 0 0 0 0 175 201 0 0 0 59 241 132 +241 89 0 0 175 201 0 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 7 206 201 0 59 241 +89 0 0 138 225 21 138 225 21 0 0 138 225 21 89 255 125 0 0 89 255 125 0 +0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 +0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 0 0 +0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 0 0 0 0 0 0 +0 89 255 255 255 255 255 255 255 125 59 238 34 138 125 0 0 0 89 247 34 +7 206 166 7 202 89 0 0 0 0 0 0 175 225 21 138 225 21 0 0 0 0 0 12 235 125 +0 0 0 0 7 206 125 0 89 251 191 194 247 34 0 0 0 0 0 138 166 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 89 247 34 0 0 89 247 34 0 0 0 175 201 +0 0 0 0 0 0 0 12 235 166 0 0 0 0 0 59 245 125 0 0 12 235 125 59 241 89 +0 0 175 201 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 89 247 34 0 12 235 201 +0 0 175 201 0 138 225 21 0 0 89 247 34 89 255 125 0 0 89 255 125 0 0 0 +0 0 12 235 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 175 255 251 89 0 0 0 0 +0 0 0 0 138 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 +0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 0 0 0 0 +0 0 0 0 0 175 125 7 199 34 0 0 12 235 166 138 125 0 0 0 59 241 89 12 235 +125 89 201 12 235 255 251 89 0 0 7 206 255 166 0 59 241 89 0 0 0 59 238 +34 0 0 0 0 0 175 166 59 215 21 172 89 59 192 0 0 0 0 0 138 166 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 138 247 34 0 0 89 247 34 0 0 0 +175 201 0 0 0 0 0 0 0 89 251 89 0 0 0 89 255 247 34 0 0 7 206 166 0 59 +241 89 0 0 175 255 255 255 225 21 0 89 251 226 255 255 247 34 0 0 0 7 206 +166 0 0 0 12 235 255 255 201 0 0 89 255 125 0 0 138 247 34 0 0 0 0 0 0 +0 0 0 0 0 89 255 255 166 0 0 0 0 0 175 255 255 255 255 255 255 225 21 0 +0 0 0 59 245 255 201 0 0 0 0 0 175 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 +0 0 89 225 21 0 0 0 0 0 0 0 0 0 7 199 34 59 215 21 0 0 0 59 245 255 255 +201 0 0 0 138 255 255 201 12 228 34 175 166 0 138 201 0 12 235 125 89 255 +125 59 241 89 0 0 0 59 238 34 0 0 0 0 0 138 201 0 0 0 172 89 0 0 0 7 206 +255 255 255 255 255 255 247 34 0 0 0 0 89 255 255 255 166 0 0 0 0 0 59 +238 34 0 138 247 34 0 0 89 247 34 0 0 0 175 201 0 0 0 0 0 0 59 245 166 +0 0 0 0 0 0 12 235 166 0 138 201 0 0 59 241 89 0 0 0 0 0 12 235 201 0 138 +251 89 0 0 175 225 21 0 0 89 247 34 0 0 7 206 166 0 175 255 166 0 0 89 +255 255 255 223 247 34 0 0 0 0 0 0 0 0 0 0 175 247 34 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 225 21 0 0 175 225 21 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 +0 0 127 0 0 0 0 0 59 215 21 0 0 0 0 0 0 0 12 235 255 255 255 255 255 255 +166 0 0 0 0 138 125 175 225 21 0 0 0 0 0 138 166 7 206 125 0 89 247 34 +138 225 21 0 89 255 166 215 21 0 0 0 59 238 34 0 0 0 0 0 138 201 0 0 0 +0 0 0 0 0 0 0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 201 0 +0 89 247 34 0 0 89 247 34 0 0 0 175 201 0 0 0 0 0 12 235 201 0 0 0 0 0 +0 0 0 138 225 21 175 255 255 255 255 255 255 125 0 0 0 0 0 138 247 34 89 +247 34 0 0 59 241 89 0 7 206 166 0 0 0 138 247 34 0 0 138 247 34 0 0 0 +0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 89 255 255 166 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 59 245 255 201 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 166 0 175 125 0 0 0 0 0 0 138 +125 89 247 34 0 0 0 0 12 228 34 7 206 125 0 89 247 34 138 247 34 0 0 89 +255 166 0 0 0 0 59 238 34 0 0 0 0 0 175 166 0 0 0 0 0 0 0 0 0 0 0 0 138 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 0 59 241 89 0 0 138 225 +21 0 0 0 175 201 0 0 0 0 12 235 201 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 +0 59 241 89 0 0 0 0 0 0 138 225 21 59 241 89 0 0 59 241 89 0 89 247 34 +0 0 0 138 247 34 0 0 89 251 89 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 12 235 255 225 21 0 0 175 255 255 255 255 255 255 225 21 0 0 175 +255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 89 247 +34 0 0 0 0 0 0 0 0 0 175 125 7 199 34 0 0 0 89 201 0 138 125 175 201 0 +0 0 0 0 138 166 0 0 175 166 0 138 201 0 89 255 166 0 0 89 255 255 125 0 +0 0 12 235 125 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 0 +0 0 138 255 125 0 0 0 0 0 0 175 247 34 59 238 34 0 0 0 175 201 0 12 235 +125 0 0 0 0 175 201 0 0 0 12 235 166 0 0 0 0 0 89 166 0 0 59 245 166 0 +0 0 0 0 59 241 89 0 59 215 21 0 12 235 166 0 7 206 201 0 0 175 225 21 7 +206 166 0 0 0 0 59 245 166 0 7 206 225 21 0 0 0 0 175 225 21 0 89 255 125 +0 0 12 235 201 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 138 201 +0 0 0 0 0 0 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 0 0 89 247 +34 0 0 0 0 0 0 0 0 7 199 34 59 215 21 0 0 0 12 235 255 255 255 201 0 0 +0 0 0 59 215 21 0 0 12 235 255 251 89 0 0 89 255 255 255 201 0 89 255 0 +0 0 0 175 201 0 0 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 +201 0 0 0 0 0 0 0 175 247 34 138 201 0 0 0 0 0 138 255 251 89 0 0 0 138 +255 255 255 255 166 0 89 255 255 255 255 255 247 34 12 235 255 255 255 +166 0 0 0 0 0 0 59 241 89 0 12 235 255 255 255 166 0 0 0 7 206 255 255 +225 21 0 138 247 34 0 0 0 0 0 59 245 255 255 201 0 0 0 175 255 255 201 +0 0 0 89 255 125 0 0 89 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 4 4 4 4 4 4 4 4 52 4 4 4 4 4 4 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 175 201 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 0 0 175 125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 201 0 0 89 251 89 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 0 0 0 0 0 0 12 232 89 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 201 0 0 201 201 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 0 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +127 0 127 127 127 0 127 127 127 127 0 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 +201 0 138 201 0 0 0 0 89 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 175 255 255 255 247 34 0 0 0 0 0 7 206 251 89 0 0 12 0 +235 255 255 255 255 201 0 0 0 0 59 245 255 255 255 201 12 0 235 255 255 +255 255 166 0 0 0 12 235 255 255 255 255 255 127 12 235 255 255 255 255 +251 89 0 0 12 235 255 255 255 251 89 12 235 166 0 0 0 12 235 125 89 255 +255 255 201 0 0 175 255 255 225 21 12 235 166 0 0 7 206 251 102 0 235 166 +0 0 0 0 12 235 251 89 0 0 0 89 255 225 21 12 235 251 89 0 0 12 235 125 +0 0 0 138 255 255 166 0 0 0 12 235 255 255 255 251 89 0 0 0 0 175 255 255 +201 0 0 0 12 235 255 255 255 251 89 0 0 0 12 235 255 255 255 247 47 235 +255 255 255 255 255 255 255 138 0 235 125 0 0 0 59 245 133 206 166 0 0 +0 0 59 245 255 133 201 0 0 0 138 251 89 0 0 12 235 133 206 247 34 0 0 0 +175 229 216 225 21 0 0 0 138 247 124 255 255 255 255 255 255 125 7 206 +125 0 0 0 59 238 34 0 0 0 0 0 12 235 125 0 0 0 0 175 247 34 0 0 0 0 0 0 +0 0 0 0 127 0 0 59 245 166 0 0 0 59 245 166 0 0 0 0 59 245 255 166 0 0 +12 0 235 166 0 0 59 245 125 0 0 138 255 125 0 0 7 202 102 0 235 166 0 0 +59 245 225 21 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 89 255 166 +0 0 0 89 127 12 235 166 0 0 0 12 235 125 0 12 235 125 0 0 0 0 0 138 225 +21 12 235 166 0 7 206 225 21 12 0 235 166 0 0 0 0 12 235 255 166 0 0 7 +206 255 225 21 12 235 255 201 0 0 12 235 125 0 59 245 166 0 0 138 251 89 +0 12 235 166 0 0 138 251 89 0 89 255 125 0 0 89 255 125 0 12 235 166 0 +0 138 251 89 0 12 235 166 0 0 7 202 89 0 0 0 138 225 21 0 0 12 0 235 125 +0 0 0 59 245 125 138 225 21 0 0 0 138 225 151 34 247 34 0 0 175 255 125 +0 0 89 247 34 12 235 166 0 0 89 247 34 59 245 125 0 0 59 245 125 0 0 0 +0 0 138 247 34 7 206 125 0 0 0 7 206 125 0 0 0 0 0 12 235 125 0 0 0 138 +225 187 201 0 0 0 0 0 0 0 0 0 0 127 0 12 232 89 0 0 0 0 0 12 232 89 0 0 +0 138 225 151 225 21 0 12 0 235 166 0 0 12 235 166 0 12 235 166 0 0 0 0 +0 12 0 235 166 0 0 0 12 235 166 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 +0 0 12 235 166 0 0 0 0 0 0 12 235 166 0 0 0 12 235 125 0 12 235 125 0 0 +0 0 0 138 225 21 12 235 166 0 175 225 21 0 12 0 235 166 0 0 0 0 12 235 +166 238 34 0 59 215 187 225 21 12 235 166 245 125 0 12 235 125 12 235 125 +0 0 0 0 138 247 34 12 235 166 0 0 12 235 166 12 235 125 0 0 0 0 138 247 +34 12 235 166 0 0 12 235 166 0 89 247 34 0 0 0 0 0 0 0 0 138 225 21 0 0 +12 0 235 125 0 0 0 59 245 125 59 241 89 0 0 7 206 166 59 0 241 89 0 12 +232 194 201 0 0 138 225 21 0 89 251 89 12 235 166 0 0 138 247 34 7 206 +201 0 0 0 0 0 59 245 125 0 7 206 125 0 0 0 0 138 201 0 0 0 0 0 12 235 125 +0 0 59 241 89 12 235 166 0 0 0 0 0 0 0 0 0 127 0 175 166 0 59 245 255 255 +247 34 138 201 0 0 7 206 166 59 241 89 0 12 0 235 166 0 0 89 251 89 0 89 +247 34 0 0 0 0 0 12 0 235 166 0 0 0 0 138 225 21 12 235 166 0 0 0 0 0 12 +235 166 0 0 0 0 0 89 247 34 0 0 0 0 0 0 12 235 166 0 0 0 12 235 125 0 12 +235 125 0 0 0 0 0 138 225 21 12 235 166 175 247 34 0 0 12 0 235 166 0 0 +0 0 12 235 133 206 166 0 175 166 175 225 21 12 235 125 138 225 21 12 235 +125 89 247 34 0 0 0 0 59 245 125 12 235 166 0 0 12 235 166 89 247 34 0 +0 0 0 59 245 125 12 235 166 0 0 12 235 125 0 89 255 125 0 0 0 0 0 0 0 0 +138 225 21 0 0 12 0 235 125 0 0 0 59 245 125 7 206 201 0 0 59 241 89 7 +0 206 166 0 59 215 111 225 21 7 206 166 0 0 0 175 225 187 225 21 0 0 12 +235 166 89 247 34 0 0 0 0 7 206 201 0 0 7 206 125 0 0 0 0 89 225 21 0 0 +0 0 12 235 125 0 12 235 166 0 0 59 241 89 0 0 0 0 0 0 0 0 127 0 202 89 +12 235 125 0 12 228 34 59 215 0 0 59 241 89 7 206 166 0 12 0 235 255 255 +255 255 166 0 0 138 225 21 0 0 0 0 0 12 0 235 166 0 0 0 0 89 247 34 12 +235 255 255 255 255 247 34 12 235 255 255 255 255 247 0 163 225 21 0 0 +0 0 0 0 12 235 255 255 255 255 255 255 125 0 12 235 125 0 0 0 0 0 138 225 +21 12 235 255 247 34 0 0 0 12 0 235 166 0 0 0 0 12 235 125 89 225 34 228 +34 175 225 21 12 235 125 12 235 125 12 235 125 138 225 21 0 0 0 0 12 235 +166 12 235 166 0 0 175 247 34 138 225 21 0 0 0 0 12 235 166 12 235 166 +0 0 175 225 21 0 0 175 255 255 225 21 0 0 0 0 0 138 225 21 0 0 12 0 235 +125 0 0 0 59 245 125 0 138 247 34 0 138 225 21 0 0 175 201 0 138 201 12 +232 89 12 235 125 0 0 0 12 235 251 89 0 0 0 0 89 255 255 125 0 0 0 0 0 +138 247 34 0 0 7 206 125 0 0 0 0 12 232 89 0 0 0 0 12 235 125 7 206 201 +0 0 0 0 138 251 89 0 0 0 0 0 0 0 127 7 228 34 89 225 21 0 12 228 34 12 +228 0 0 138 225 21 0 138 225 21 12 0 235 166 0 0 12 235 201 0 138 225 21 +0 0 0 0 0 12 0 235 166 0 0 0 0 89 247 34 12 235 166 0 0 0 0 0 12 235 166 +0 0 0 0 0 138 225 21 0 12 235 255 255 127 12 235 166 0 0 0 12 235 125 0 +12 235 125 0 0 0 0 0 138 225 21 12 235 229 216 225 21 0 0 12 0 235 166 +0 0 0 0 12 235 125 12 235 223 201 0 175 225 21 12 235 125 0 138 225 34 +235 125 138 225 21 0 0 0 0 12 235 166 12 235 255 255 255 247 34 0 138 225 +21 0 0 0 0 12 235 166 12 235 255 255 255 166 0 0 0 0 0 0 89 255 255 247 +34 0 0 0 138 225 21 0 0 12 0 235 125 0 0 0 59 245 125 0 59 245 125 7 206 +166 0 0 0 89 247 34 175 125 7 206 125 89 247 34 0 0 0 12 235 251 89 0 0 +0 0 7 206 225 21 0 0 0 0 59 245 125 0 0 0 7 206 125 0 0 0 0 0 175 166 0 +0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 12 228 34 89 225 +21 0 12 228 34 59 215 0 7 206 255 255 255 255 251 89 12 0 235 166 0 0 0 +138 247 0 124 247 34 0 0 0 0 0 12 0 235 166 0 0 0 0 138 225 21 12 235 166 +0 0 0 0 0 12 235 166 0 0 0 0 0 89 247 34 0 0 0 0 175 127 12 235 166 0 0 +0 12 235 125 0 12 235 125 0 0 0 0 0 138 225 21 12 235 166 59 245 201 0 +0 12 0 235 166 0 0 0 0 12 235 125 0 138 251 89 0 175 225 21 12 235 125 +0 12 235 138 235 125 89 247 34 0 0 0 0 59 245 125 12 235 166 0 0 0 0 0 +89 247 34 0 0 0 0 59 245 125 12 235 166 0 175 247 34 0 0 0 0 0 0 0 59 245 +166 0 0 0 138 225 21 0 0 12 0 235 125 0 0 0 59 241 89 0 7 206 201 59 241 +89 0 0 0 59 241 102 232 89 0 138 201 138 225 21 0 0 0 175 201 175 225 21 +0 0 0 0 175 225 21 0 0 0 7 206 201 0 0 0 0 7 206 125 0 0 0 0 0 89 225 21 +0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 12 232 89 59 241 +89 0 89 247 34 89 201 0 59 241 89 0 0 7 206 166 12 0 235 166 0 0 0 138 +225 0 81 245 166 0 0 0 0 0 12 0 235 166 0 0 0 12 235 166 0 12 235 166 0 +0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 175 127 12 235 166 0 0 +0 12 235 125 0 12 235 125 0 0 0 0 0 138 225 21 12 235 166 0 89 255 166 +0 12 0 235 166 0 0 0 0 12 235 125 0 12 182 0 0 175 225 21 12 235 125 0 +0 138 232 245 125 12 235 125 0 0 0 0 138 247 34 12 235 166 0 0 0 0 0 12 +235 125 0 0 0 0 138 247 34 12 235 166 0 7 206 225 21 0 0 0 0 0 0 12 235 +166 0 0 0 138 225 21 0 0 12 0 235 166 0 0 0 89 251 89 0 0 138 247 163 225 +21 0 0 0 7 206 200 215 21 0 89 225 187 166 0 0 0 89 251 89 12 235 166 0 +0 0 0 175 225 21 0 0 0 138 247 34 0 0 0 0 7 206 125 0 0 0 0 0 12 232 89 +0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 12 175 166 0 89 +255 255 210 235 255 255 125 0 138 225 21 0 0 0 138 247 47 0 235 166 0 0 +59 245 166 0 0 138 255 125 0 0 7 202 102 0 235 166 0 0 12 235 225 21 0 +12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 138 255 125 0 0 0 175 127 12 +235 166 0 0 0 12 235 125 0 12 235 125 0 0 0 0 7 206 201 0 12 235 166 0 +0 138 255 125 12 0 235 166 0 0 0 12 0 235 125 0 0 0 0 0 175 225 21 12 235 +125 0 0 12 235 255 125 0 89 255 125 0 0 89 251 89 0 12 235 166 0 0 0 0 +0 0 89 255 125 0 0 89 255 125 0 12 235 166 0 0 12 235 201 0 138 166 0 0 +0 138 251 89 0 0 0 138 225 21 0 0 0 0 138 247 34 0 7 206 225 21 0 0 12 +235 255 166 0 0 0 0 0 175 255 201 0 0 12 235 255 125 0 0 12 235 166 0 0 +138 251 89 0 0 0 175 225 21 0 0 89 251 89 0 0 0 0 0 7 206 125 0 0 0 0 0 +0 175 166 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 59 241 +89 0 0 0 0 0 0 0 0 7 206 166 0 0 0 0 59 245 138 0 235 255 255 255 255 125 +0 0 0 0 59 245 255 255 255 201 12 0 235 255 255 255 255 166 0 0 0 12 235 +255 255 255 255 255 127 12 235 166 0 0 0 0 0 0 0 59 245 255 255 255 225 +21 12 235 166 0 0 0 12 235 125 89 255 255 255 210 127 235 255 255 225 21 +0 12 235 166 0 0 0 175 255 127 0 235 255 255 255 247 47 0 235 125 0 0 0 +0 0 175 225 21 12 235 125 0 0 0 138 255 125 0 0 0 175 255 255 201 0 0 0 +12 235 166 0 0 0 0 0 0 0 0 175 255 255 201 0 0 0 12 235 166 0 0 0 89 255 +225 34 235 255 255 255 247 34 0 0 0 0 138 225 21 0 0 0 0 0 138 255 255 +255 201 0 0 0 0 0 175 251 89 0 0 0 0 0 89 255 166 0 0 7 206 247 34 0 7 +206 225 21 0 0 7 206 225 21 0 0 175 225 21 0 0 138 255 255 255 255 255 +255 166 7 206 125 0 0 0 0 0 0 138 201 0 0 0 12 235 125 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 89 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 7 206 125 0 0 0 0 0 0 59 238 34 0 0 12 235 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 7 206 255 255 255 225 21 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 251 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 7 206 125 0 0 0 0 0 0 7 206 125 0 0 12 235 125 0 0 0 +0 0 0 0 0 0 0 245 255 255 255 255 255 255 127 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 +255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 201 0 0 0 0 0 0 89 89 255 255 +255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 59 245 166 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 12 235 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 12 235 +255 247 0 0 0 0 0 0 0 12 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 +0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 251 89 0 7 206 125 0 89 255 251 89 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 84 84 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 7 206 +125 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 +225 21 0 0 0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 12 12 235 125 0 0 0 +0 0 59 245 102 0 89 247 34 12 235 125 0 0 0 0 0 12 235 125 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +59 241 89 0 0 0 7 206 125 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +4 4 4 4 4 4 4 4 100 252 252 84 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 +235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 12 0 +235 125 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 +0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 7 206 125 0 0 0 59 238 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 20 236 252 164 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 0 12 235 255 255 255 166 0 12 235 166 245 255 247 34 0 0 12 +235 255 255 247 34 0 34 235 255 255 255 225 21 0 12 235 255 255 225 29 +0 206 255 255 255 127 0 12 235 255 255 255 225 21 12 235 138 235 255 247 +34 0 12 235 102 175 255 247 34 12 235 125 0 59 245 201 0 12 235 125 12 +0 235 166 245 255 225 29 206 255 251 89 0 12 235 138 235 255 247 34 0 0 +12 235 255 255 201 0 0 12 235 166 245 255 251 89 0 0 12 235 255 255 255 +225 21 12 235 138 235 247 127 34 138 255 255 255 206 0 206 255 255 255 +201 59 241 89 0 0 89 247 42 206 201 0 0 0 138 225 187 201 0 0 138 225 21 +0 59 241 187 226 247 34 0 7 206 206 206 201 0 0 0 138 225 151 255 255 255 +255 247 0 0 89 247 34 0 0 0 7 206 125 0 0 0 59 238 34 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 4 4 4 4 4 4 4 148 252 236 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 12 206 +21 0 59 245 125 12 235 247 34 0 138 225 21 12 235 166 0 0 134 102 0 235 +166 0 0 138 225 21 12 235 125 0 0 175 201 12 0 235 125 0 0 12 235 166 0 +0 138 225 21 12 235 247 34 0 175 201 0 12 235 102 0 89 247 34 12 235 125 +12 235 166 0 0 12 235 125 12 0 235 225 21 12 235 251 89 0 175 201 0 12 +235 247 34 0 175 201 0 12 235 166 0 7 206 201 0 12 235 225 21 0 175 225 +21 12 235 166 0 0 138 225 21 12 235 247 34 0 0 89 247 34 0 12 206 34 0 +235 125 0 0 59 241 89 0 0 89 247 34 89 247 34 0 7 206 166 138 225 21 7 +206 251 89 0 89 225 138 34 235 201 0 138 225 21 89 247 34 0 7 206 166 0 +0 0 7 206 166 0 0 89 225 21 0 0 0 7 206 125 0 0 0 59 241 89 0 0 0 0 138 +251 89 0 0 7 202 89 0 0 4 4 4 4 4 4 52 252 252 108 4 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 0 0 7 206 102 12 235 125 0 0 59 241 89 138 225 21 0 0 0 34 +89 225 21 0 0 138 225 21 89 225 21 0 0 89 247 47 0 235 125 0 0 89 225 21 +0 0 138 225 21 12 235 125 0 0 89 247 34 12 235 102 0 89 247 34 12 235 138 +235 166 0 0 0 12 235 125 12 0 235 125 0 7 206 166 0 0 138 225 21 12 235 +125 0 0 89 247 34 138 225 21 0 0 59 238 34 12 235 125 0 0 59 241 89 89 +225 21 0 0 138 225 21 12 235 125 0 0 0 138 225 21 0 0 0 12 0 235 125 0 +0 59 241 89 0 0 89 247 34 12 235 125 0 59 241 89 59 238 34 12 228 198 166 +0 175 166 59 0 89 251 132 241 89 0 12 235 125 0 59 238 34 0 0 0 138 225 +21 0 12 235 166 0 0 0 0 7 206 125 0 0 0 0 175 201 0 0 0 138 166 12 235 +166 0 12 232 89 0 0 12 84 4 4 4 4 204 252 204 4 4 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 +0 0 0 59 245 255 255 255 102 12 235 125 0 0 12 235 125 175 201 0 0 0 0 +0 175 201 0 0 0 138 225 21 175 255 255 255 255 255 247 47 0 235 125 0 0 +175 201 0 0 0 138 225 21 12 235 125 0 0 89 247 34 12 235 102 0 89 247 34 +12 235 255 225 21 0 0 0 12 235 125 12 0 235 125 0 7 206 166 0 0 138 225 +21 12 235 125 0 0 89 247 34 175 201 0 0 0 12 232 89 12 235 125 0 0 12 235 +125 175 201 0 0 0 138 225 21 12 235 125 0 0 0 59 245 255 247 34 0 12 0 +235 125 0 0 59 241 89 0 0 89 247 34 0 175 201 0 138 201 0 12 235 125 89 +201 89 225 29 206 125 12 0 0 175 255 166 0 0 0 175 201 0 138 201 0 0 0 +89 251 89 0 138 247 34 0 0 0 0 0 7 206 125 0 0 0 0 0 89 255 125 7 202 89 +0 89 251 89 89 201 0 0 0 172 252 84 4 4 100 252 252 60 4 4 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 0 89 255 166 0 7 206 102 12 235 125 0 0 12 235 125 175 201 +0 0 0 0 0 175 201 0 0 0 138 225 21 175 201 0 0 0 0 0 12 0 235 125 0 0 175 +201 0 0 0 138 225 21 12 235 125 0 0 89 247 34 12 235 102 0 89 247 34 12 +235 138 235 201 0 0 0 12 235 125 12 0 235 125 0 7 206 166 0 0 138 225 21 +12 235 125 0 0 89 247 34 175 201 0 0 0 12 232 89 12 235 125 0 0 12 235 +125 175 201 0 0 0 138 225 21 12 235 125 0 0 0 0 0 138 255 255 201 12 0 +235 125 0 0 59 241 89 0 0 89 247 34 0 89 247 42 206 125 0 0 175 166 175 +125 12 232 102 232 89 0 0 0 175 255 201 0 0 0 89 247 47 235 125 0 0 12 +235 166 0 0 0 12 235 125 0 0 0 0 7 206 125 0 0 0 0 138 201 0 0 12 232 89 +0 0 59 245 225 21 0 0 0 196 252 244 60 20 236 252 156 4 4 4 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 0 175 201 0 0 7 206 102 12 235 125 0 0 59 241 89 138 225 21 +0 0 0 34 89 225 21 0 0 138 225 21 138 247 34 0 0 0 0 12 0 235 125 0 0 138 +225 21 0 0 138 225 21 12 235 125 0 0 89 247 34 12 235 102 0 89 247 34 12 +235 125 59 245 125 0 0 12 235 125 12 0 235 125 0 7 206 166 0 0 138 225 +21 12 235 125 0 0 89 247 34 138 225 21 0 0 89 247 34 12 235 125 0 0 59 +241 89 138 225 21 0 0 138 225 21 12 235 125 0 0 0 0 0 0 0 89 247 47 0 235 +125 0 0 59 241 89 0 0 89 247 34 0 12 235 166 238 34 0 0 138 210 228 34 +0 175 166 215 21 0 0 89 251 159 251 89 0 0 12 235 191 247 34 0 0 175 225 +21 0 0 0 0 138 225 21 0 0 0 7 206 125 0 0 0 12 232 89 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 20 220 252 236 180 252 244 28 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 +138 225 21 0 138 255 102 12 235 125 0 7 206 201 0 12 235 166 0 0 134 132 +0 245 125 0 59 245 225 21 12 235 201 0 0 12 206 34 0 235 125 0 0 59 245 +125 0 12 235 225 21 12 235 125 0 0 89 247 34 12 235 102 0 89 247 34 12 +235 125 0 138 251 89 0 12 235 125 12 0 235 125 0 7 206 166 0 0 138 225 +21 12 235 125 0 0 89 247 34 12 235 166 0 7 206 201 0 12 235 125 0 7 206 +201 0 59 245 125 0 12 235 225 21 12 235 125 0 0 0 138 125 0 0 138 225 29 +0 206 166 0 0 7 206 166 0 59 245 247 34 0 0 175 255 201 0 0 0 59 245 225 +21 0 89 255 201 0 0 12 235 166 0 175 225 21 0 0 138 255 166 0 0 89 251 +89 0 0 0 0 0 89 247 34 0 0 0 7 206 125 0 0 0 59 238 34 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 4 36 236 252 252 252 108 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 +7 206 255 255 171 206 102 12 232 226 255 255 225 21 0 0 12 235 255 255 +247 34 0 89 255 255 247 163 225 21 0 7 206 255 255 247 34 12 0 235 125 +0 0 0 89 255 255 247 163 225 21 12 235 125 0 0 89 247 34 12 235 102 0 89 +247 34 12 235 125 0 0 175 251 34 0 235 125 12 0 235 125 0 7 206 166 0 0 +138 225 21 12 235 125 0 0 89 247 34 0 12 235 255 255 201 0 0 12 235 255 +255 255 225 21 0 0 89 255 255 247 163 225 21 12 235 125 0 0 0 89 255 255 +255 247 34 0 0 89 255 255 127 0 59 245 255 225 111 247 34 0 0 59 245 125 +0 0 0 12 235 166 0 0 59 245 125 7 0 206 225 21 0 12 235 201 0 0 59 241 +89 0 0 175 255 255 255 255 247 0 0 89 247 34 0 0 0 7 206 125 0 0 0 59 238 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 60 252 252 204 4 4 4 4 4 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 +89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 7 +206 125 0 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 76 252 60 4 4 +4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 12 232 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 +0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 +0 0 0 12 235 125 0 0 0 7 206 125 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 76 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +12 235 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 255 251 89 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 +125 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 +247 34 0 0 0 0 0 0 0 0 0 0 0 0 89 255 251 89 0 7 206 125 0 89 255 247 34 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 0 127 127 127 0 127 127 127 127 127 127 127 0 +127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 175 166 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 206 125 0 175 166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 225 21 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 125 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 125 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 0 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 0 138 201 0 7 206 166 12 235 +125 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 125 +0 0 0 0 0 175 171 206 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 125 0 +31 206 130 255 166 175 247 34 0 0 89 255 125 175 247 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 247 34 138 166 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 241 132 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 59 241 132 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +59 245 255 255 255 125 0 12 235 255 255 255 255 255 225 21 0 0 0 0 0 0 +0 0 175 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 +0 0 175 125 0 0 0 0 89 225 21 59 238 34 0 0 138 255 255 201 0 0 0 59 215 +21 0 0 0 0 0 0 0 0 0 12 235 255 255 255 247 34 0 0 0 0 0 0 0 12 235 255 +255 255 255 255 255 255 255 251 89 0 12 235 255 255 255 255 255 225 21 +0 89 255 255 255 255 255 255 125 0 12 235 255 255 255 255 255 225 21 0 +0 12 235 255 255 255 255 255 225 21 7 206 201 0 50 206 56 255 201 12 235 +125 0 0 138 225 29 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 202 89 89 255 225 21 0 89 255 255 255 225 81 245 201 0 138 251 +89 0 0 138 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 +255 255 255 225 21 0 0 0 138 255 166 7 206 225 21 0 0 0 138 247 34 0 0 +0 0 127 0 89 255 125 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 89 +247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 +125 0 0 0 0 0 0 0 0 0 0 0 59 241 89 12 235 125 0 0 172 89 0 0 0 0 0 0 0 +0 0 12 235 166 0 0 7 202 89 0 0 0 0 0 0 89 255 201 0 0 12 235 125 0 0 0 +0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 138 247 34 0 12 146 0 0 0 0 0 +144 21 0 0 12 146 0 0 0 0 0 144 21 0 89 225 21 71 157 22 191 225 21 175 +201 0 7 206 125 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 59 196 199 47 206 184 89 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 +0 0 0 59 245 125 0 0 59 245 125 0 0 0 0 0 127 12 235 166 0 0 0 0 0 0 12 +146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 12 235 255 255 255 255 127 34 235 255 255 255 255 225 21 0 +0 0 0 0 0 0 0 89 247 34 7 206 166 0 89 201 0 0 0 0 0 0 0 0 0 0 89 247 34 +0 0 0 0 0 0 0 0 59 115 12 235 166 0 0 0 12 235 125 0 0 0 0 0 0 12 146 0 +0 0 0 0 144 21 0 0 0 0 0 59 245 125 0 0 12 146 0 0 0 0 0 144 21 0 0 12 +146 0 0 0 0 0 144 21 0 7 202 89 117 104 0 29 202 89 59 215 21 59 215 21 +138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 175 125 0 59 192 89 223 125 172 89 0 138 255 255 255 201 12 182 +0 0 0 0 0 175 255 255 125 0 89 255 255 247 34 0 0 12 146 0 0 0 0 0 144 +21 0 138 255 255 255 255 247 34 138 247 34 7 206 201 0 0 0 0 0 0 127 89 +251 89 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 7 206 166 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 125 0 0 0 +0 0 0 0 0 0 0 0 89 247 34 7 206 166 7 202 89 0 0 0 0 0 0 0 0 0 0 89 255 +125 0 0 0 0 0 0 0 89 255 125 89 247 34 0 0 0 12 235 125 0 0 0 0 0 0 12 +146 0 0 0 0 0 144 21 0 0 0 0 7 206 201 0 0 0 12 146 0 0 0 0 0 144 21 0 +0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 +255 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 +125 0 59 192 12 228 34 172 89 89 247 34 0 12 206 29 206 201 0 0 7 206 166 +0 7 206 255 225 21 0 89 247 34 0 12 146 0 0 0 0 0 144 21 0 0 0 0 7 206 +166 0 12 235 166 89 247 34 0 0 0 0 0 0 127 245 255 255 255 255 255 201 +0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 59 245 255 255 255 127 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 125 0 0 0 0 0 0 0 +0 0 0 0 59 241 89 12 235 125 89 201 12 235 255 251 89 0 89 255 255 225 +21 0 175 255 255 225 21 0 0 0 89 251 89 0 138 225 21 0 0 0 12 235 255 255 +255 255 225 21 0 12 146 0 0 0 0 0 144 21 0 0 0 0 138 247 34 0 0 0 12 146 +0 0 0 0 0 144 21 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 12 235 255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 59 192 0 0 0 172 89 138 225 21 0 0 0 +0 7 206 225 21 138 225 21 0 0 89 251 89 0 0 12 235 125 0 12 146 0 0 0 0 +0 144 21 0 0 0 0 138 225 21 0 0 89 255 255 125 0 0 0 0 0 0 0 127 138 225 +21 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 59 241 89 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 12 235 255 255 255 255 +225 21 0 0 0 0 0 0 0 0 0 138 255 255 201 12 228 34 175 166 0 138 201 7 +206 125 7 206 166 0 0 0 89 255 255 247 34 59 241 89 0 0 138 225 21 0 0 +0 12 235 125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 59 245 125 0 0 0 +0 12 146 0 0 0 0 0 144 21 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 59 245 255 255 255 207 235 255 255 255 255 255 255 +207 235 255 255 255 255 255 255 255 255 255 255 255 225 21 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 247 34 0 0 0 0 175 166 175 201 0 0 0 +59 245 255 255 255 255 255 125 0 12 146 0 0 0 0 0 144 21 0 0 0 89 251 89 +0 0 0 7 206 225 21 0 0 0 0 0 0 0 127 245 255 255 255 255 255 125 0 0 12 +146 0 0 0 0 0 144 21 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 138 166 7 206 125 0 89 247 94 241 89 0 138 201 0 0 0 0 0 59 245 166 +0 89 251 89 0 89 247 34 0 0 0 12 235 125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 +21 0 0 7 206 201 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 12 146 0 0 0 0 0 +144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 255 166 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 138 255 255 201 0 7 206 225 21 175 201 0 0 0 59 241 89 0 0 0 0 +0 0 12 146 0 0 0 0 0 144 21 0 0 12 235 166 0 0 0 0 0 175 225 21 0 0 0 0 +0 0 0 127 89 255 125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 89 +247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 +175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 7 206 125 0 89 247 94 241 +89 0 138 201 0 0 0 0 0 12 235 166 0 0 89 255 125 12 235 166 0 0 0 12 235 +125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 138 247 34 0 0 0 0 0 12 146 +0 0 0 0 0 144 21 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 245 255 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 42 206 201 0 0 89 +225 21 0 0 89 255 125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 175 225 21 +0 0 0 0 0 175 225 21 0 0 0 0 0 0 0 127 0 175 251 89 0 0 0 0 0 12 146 0 +0 0 0 0 144 21 0 59 245 166 0 0 138 225 21 0 0 0 59 245 166 138 251 89 +7 206 201 0 12 235 125 0 59 241 89 0 0 0 175 125 0 0 0 0 0 175 125 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 175 166 0 138 201 7 206 125 7 206 +166 138 166 0 0 0 138 251 89 0 0 0 59 115 0 89 255 201 0 0 12 235 125 0 +0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 89 251 89 0 0 0 0 0 0 12 146 0 0 0 +0 0 144 21 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 138 225 34 182 0 0 0 7 206 166 0 +7 206 255 247 34 0 0 175 125 0 12 146 0 0 0 0 0 144 21 0 89 251 89 0 0 +0 0 0 0 175 225 21 0 0 0 0 0 0 0 127 0 0 138 255 255 255 255 125 0 12 235 +255 255 255 255 255 225 21 0 138 247 34 0 7 206 166 0 0 0 0 89 247 34 175 +201 0 7 206 201 0 12 235 125 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 59 215 21 0 0 12 235 255 251 89 0 89 255 255 225 +21 12 235 255 255 255 247 34 0 0 0 0 0 0 0 0 12 235 255 255 255 255 255 +255 255 255 251 89 0 12 235 255 255 255 255 255 225 21 0 138 255 255 255 +255 255 255 166 0 12 235 255 255 255 255 255 225 21 0 0 12 235 255 255 +255 255 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 89 255 255 255 247 34 0 0 0 0 0 0 0 175 255 255 125 0 138 255 255 +255 125 0 0 12 235 255 255 255 255 255 225 21 0 175 255 255 255 255 247 +0 0 0 175 225 21 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 175 166 0 255 255 201 0 0 0 0 0 175 166 12 232 89 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 +228 34 0 0 0 0 0 0 0 0 12 232 89 59 215 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 0 127 127 0 127 127 127 127 127 0 127 127 127 127 +127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 245 255 255 255 255 255 255 225 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 225 21 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 +34 0 0 0 0 59 192 0 0 0 0 0 7 206 255 255 225 21 0 0 0 0 0 0 0 0 138 247 +34 0 0 89 251 89 0 7 206 125 0 0 7 206 255 255 255 166 0 89 251 89 138 +247 34 0 0 0 0 7 206 255 255 255 247 34 0 0 0 0 175 255 255 251 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 255 247 +34 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 12 +235 255 247 34 0 0 7 206 255 251 89 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 +0 89 255 255 255 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 0 +59 245 255 247 34 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 175 166 0 0 0 0 +0 0 89 201 0 0 0 0 175 166 0 0 0 0 0 59 245 255 201 0 0 0 59 241 89 0 0 +0 0 0 59 245 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 +0 0 0 0 59 192 0 0 0 0 0 175 201 0 0 144 21 0 0 0 0 0 0 0 0 7 206 166 0 +7 206 166 0 0 7 206 125 0 7 206 201 0 0 89 166 0 0 0 0 0 0 0 0 0 0 89 255 +125 0 0 0 59 245 166 0 0 0 0 0 0 12 206 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 59 245 166 0 0 0 0 0 0 0 0 0 0 59 +241 89 0 138 201 0 0 0 0 0 138 166 0 0 0 0 0 168 34 7 206 166 0 0 172 89 +0 175 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 166 89 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 251 89 0 0 12 235 125 0 138 225 21 0 0 +0 0 0 0 0 0 7 206 255 201 0 0 0 89 225 21 0 0 0 0 7 206 255 201 0 0 0 89 +225 21 0 0 0 0 12 206 21 12 235 125 0 0 175 166 0 0 0 0 0 0 59 245 125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 175 255 255 255 +166 0 0 12 235 125 0 0 0 0 89 225 21 0 0 12 232 89 0 89 247 34 89 247 34 +0 0 7 206 125 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 21 0 0 0 0 +0 7 206 125 0 0 7 206 255 255 247 34 0 0 0 85 89 0 85 89 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 89 225 21 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 89 201 +0 0 12 228 34 0 0 0 0 138 166 0 0 0 0 0 0 0 7 206 125 0 0 7 206 255 166 +0 0 0 0 0 0 0 0 0 12 235 125 0 0 89 247 34 175 255 255 255 166 89 225 21 +0 89 255 125 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 89 225 21 0 12 232 89 59 +115 0 59 115 0 0 0 0 0 89 201 0 0 7 206 125 0 0 0 0 0 0 0 89 201 0 0 7 +206 125 0 0 0 0 0 0 0 0 12 232 89 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 225 21 0 0 138 247 94 192 12 182 +0 0 12 235 125 0 0 0 0 0 175 255 255 255 255 166 0 0 7 206 171 206 166 +0 0 0 7 206 125 0 7 206 251 89 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 59 245 +255 255 201 0 12 228 34 12 235 166 0 12 228 34 0 0 138 251 89 138 247 34 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 138 255 255 255 125 0 12 228 34 +0 0 0 0 0 0 0 0 59 241 89 0 138 201 0 0 0 0 0 138 166 0 0 0 0 0 0 0 175 +201 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 12 235 125 0 0 89 247 34 175 255 +255 255 166 89 225 21 0 89 255 125 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 138 +225 21 0 12 235 125 12 235 166 59 245 166 0 0 0 0 89 201 0 0 89 225 21 +0 0 0 0 0 0 0 89 201 0 0 89 225 21 0 0 0 0 0 0 12 235 255 125 0 0 175 125 +0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 +225 21 0 12 235 125 59 192 0 0 0 0 12 235 125 0 0 0 0 0 59 215 21 59 238 +34 0 0 0 89 255 247 34 0 0 0 7 206 125 0 0 7 206 255 255 247 34 0 0 0 0 +0 0 0 0 59 192 0 12 235 166 0 7 176 21 0 175 125 59 238 34 0 12 228 34 +0 138 247 34 138 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 192 0 0 138 +201 0 89 247 34 0 175 125 0 0 0 0 0 0 0 0 0 89 255 255 225 21 0 7 206 255 +255 255 255 255 255 247 34 0 12 235 125 0 0 0 7 176 21 0 175 201 0 0 0 +0 0 0 0 0 12 235 125 0 0 89 247 34 89 255 255 255 166 89 225 21 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 89 225 21 0 12 232 89 0 12 235 166 12 +235 166 0 0 0 89 201 0 7 206 125 0 12 235 166 0 0 0 0 89 201 0 7 206 125 +89 255 255 255 125 0 0 0 0 7 206 125 89 225 21 0 138 225 21 0 0 0 138 255 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 59 241 89 59 +192 0 0 0 12 235 255 255 255 225 21 0 0 138 166 0 7 202 89 0 0 0 7 206 +166 0 0 0 0 0 0 0 0 7 206 125 0 12 235 201 0 0 0 0 0 0 0 0 89 166 0 89 +247 34 0 0 0 0 0 89 166 12 232 89 0 138 247 34 89 247 34 59 238 34 0 0 +12 235 255 255 255 255 255 255 247 34 89 255 255 255 166 89 166 0 0 138 +201 0 138 225 21 0 89 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 +0 0 0 0 7 206 255 255 255 247 34 0 59 245 255 247 34 0 0 0 0 0 0 0 0 12 +235 125 0 0 89 247 34 0 89 255 255 166 89 225 21 0 0 0 0 0 0 0 0 0 0 0 +0 0 89 255 255 255 166 0 12 235 125 0 138 225 21 0 0 12 235 125 12 235 +125 0 0 89 201 0 89 201 0 7 206 223 166 0 0 0 0 89 201 0 89 201 0 89 125 +0 138 225 21 12 182 0 7 206 133 206 125 0 89 232 215 21 0 7 206 247 34 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 59 241 89 59 +192 0 0 0 0 12 235 125 0 0 0 0 0 59 215 21 59 238 34 0 59 245 255 255 255 +255 225 21 0 0 0 0 0 59 241 89 0 0 138 225 21 0 0 0 0 0 0 0 89 166 0 89 +247 34 0 0 0 0 0 89 166 0 138 255 255 176 228 34 0 138 247 34 138 247 34 +0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 89 166 0 0 138 255 255 225 21 0 0 89 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 89 247 34 0 0 0 138 166 89 225 +21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 247 34 0 0 12 235 +166 12 235 166 0 0 0 0 0 12 232 89 0 175 166 138 166 0 0 0 0 0 0 12 232 +89 0 0 0 0 138 201 0 0 89 255 255 201 89 225 21 89 225 81 215 21 0 138 +247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 12 235 +125 59 192 0 0 0 0 59 241 89 0 0 0 0 0 175 255 255 255 255 166 0 0 0 7 +206 166 0 0 0 0 7 206 125 0 12 235 201 0 7 206 166 0 0 0 0 0 0 0 0 59 192 +0 12 235 166 0 7 176 21 0 175 125 0 0 0 0 0 0 0 0 0 138 251 89 138 247 +34 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 59 192 0 0 138 201 59 245 166 0 0 +175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 89 247 34 0 0 0 138 166 +89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 166 +59 245 166 0 0 0 0 0 0 138 201 0 138 201 0 138 166 0 0 0 0 0 0 138 201 +0 0 0 0 89 247 34 0 0 0 0 0 7 206 125 59 238 34 59 215 21 0 175 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 0 175 225 81 +192 12 182 0 7 206 125 0 0 0 0 0 89 225 21 0 0 12 232 89 0 0 7 206 166 +0 0 0 0 7 206 125 0 0 59 245 255 255 166 0 0 0 0 0 0 0 0 0 7 202 89 0 59 +245 255 255 166 0 12 228 34 0 0 0 0 0 0 0 0 0 0 85 89 0 85 89 0 0 0 0 0 +0 0 59 238 34 0 0 0 0 0 7 202 89 0 138 201 0 59 245 225 34 228 34 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 255 255 255 255 247 34 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 201 0 0 175 247 34 0 0 0 138 166 +89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 115 0 +59 115 0 0 0 0 0 0 12 232 89 0 175 255 255 255 255 201 0 0 0 0 12 232 89 +0 0 0 138 201 0 0 0 0 0 0 0 89 201 0 89 255 255 255 255 247 34 138 251 +89 0 7 176 21 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 247 34 0 0 0 +175 255 255 255 166 0 89 255 255 255 255 255 247 34 0 0 0 0 0 0 0 0 0 0 +7 206 166 0 0 0 0 7 206 125 0 0 0 0 0 138 255 166 0 0 0 0 0 0 0 0 0 89 +225 21 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 59 238 34 0 0 0 0 0 0 89 225 21 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 12 235 191 255 255 166 238 34 0 0 0 138 166 89 225 21 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 201 0 0 +0 0 0 138 166 0 0 0 0 0 175 201 0 0 0 89 255 255 255 255 125 0 0 0 12 232 +89 0 0 0 0 59 215 21 0 0 138 255 255 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 0 0 0 0 0 0 0 0 0 0 0 0 59 192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 0 +89 255 125 0 0 0 59 245 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 59 245 166 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 12 235 125 0 0 0 0 0 0 0 0 138 166 89 225 21 0 0 0 0 0 0 0 0 0 175 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 59 192 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 7 199 34 +0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 255 247 34 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 +255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 138 166 +89 225 21 0 0 0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 7 206 125 0 7 206 255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 138 225 +21 0 0 0 0 0 12 235 125 0 0 0 0 19 172 255 190 11 0 0 0 0 138 255 201 7 +202 89 0 0 0 0 0 0 0 0 0 0 7 206 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 59 138 225 21 0 0 0 0 0 0 59 245 201 0 0 0 19 172 +255 190 11 0 0 0 0 0 0 0 0 0 7 206 225 21 0 0 0 59 245 201 19 172 255 190 +11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 251 89 89 201 0 0 0 0 0 175 +201 0 0 0 0 0 0 0 0 7 206 225 21 0 0 0 0 0 19 172 255 190 11 0 0 0 0 0 +175 255 166 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 0 0 0 0 12 175 247 34 0 0 0 19 172 255 +190 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 247 34 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 0 0 7 206 125 0 0 0 0 0 138 201 0 0 0 0 0 136 190 +45 196 145 0 0 0 59 215 21 175 255 166 0 0 0 175 225 29 206 166 0 0 7 202 +89 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 209 125 +0 0 0 0 0 0 138 225 21 0 0 0 136 190 45 196 145 0 0 0 175 225 29 206 166 +0 0 12 235 125 0 0 12 138 225 21 136 190 45 196 145 159 251 89 138 247 +34 0 0 0 0 0 0 0 0 0 0 0 175 125 59 245 247 34 0 0 0 0 0 12 232 89 0 0 +0 0 0 0 0 175 166 0 0 0 0 0 0 12 136 190 45 196 145 0 0 0 0 138 166 12 +235 255 125 0 0 0 0 7 206 166 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 138 201 0 0 0 0 0 136 190 45 +196 145 34 0 0 0 89 251 89 138 247 34 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 7 202 89 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 +255 125 0 0 0 0 127 0 0 7 206 251 89 0 0 0 0 7 206 251 89 0 0 0 0 7 206 +251 89 0 0 0 0 0 7 206 251 89 0 0 0 0 7 206 251 89 0 0 0 0 12 235 255 125 +0 0 0 0 0 89 255 255 255 255 255 255 255 255 125 0 0 0 59 245 255 255 255 +201 12 235 255 255 255 255 255 125 12 235 255 255 255 255 255 125 12 235 +255 255 255 255 255 125 12 235 255 255 255 255 255 125 89 255 255 255 201 +89 255 255 255 201 89 255 255 255 201 89 255 255 255 201 0 175 255 255 +255 255 201 0 0 0 12 235 251 89 0 0 12 235 125 0 0 0 138 255 255 166 0 +0 0 0 0 0 138 255 255 166 0 0 0 0 0 0 138 255 255 166 0 0 0 0 0 0 138 255 +255 166 0 0 0 0 0 0 138 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 +255 255 201 89 251 89 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 +125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 7 206 225 21 +0 0 0 138 247 0 235 166 0 0 0 0 0 0 138 225 21 7 206 166 0 0 0 127 0 0 +59 245 255 166 0 0 0 0 59 245 255 166 0 0 0 0 59 245 255 166 0 0 0 0 0 +59 245 255 166 0 0 0 0 59 245 255 166 0 0 0 0 59 245 255 166 0 0 0 0 0 +175 201 7 206 166 0 0 0 0 0 0 0 138 255 125 0 0 7 202 102 235 166 0 0 0 +0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 12 +235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 175 201 0 0 7 +206 251 89 0 12 235 255 201 0 0 12 235 125 0 59 245 166 0 0 138 251 89 +0 0 59 245 166 0 0 138 251 89 0 0 59 245 166 0 0 138 251 89 0 0 59 245 +166 0 0 138 251 89 0 0 59 245 166 0 0 138 251 89 0 0 0 0 0 0 0 0 0 0 0 +0 59 245 166 0 0 89 255 166 0 12 235 125 0 0 0 59 245 125 12 235 125 0 +0 0 59 245 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 +0 59 245 125 0 0 59 245 125 12 235 166 0 0 0 0 0 12 235 125 0 0 175 201 +0 0 0 127 0 0 138 225 151 225 21 0 0 0 138 225 151 225 21 0 0 0 138 225 +151 225 21 0 0 0 0 138 225 151 225 21 0 0 0 138 225 151 225 21 0 0 0 138 +225 151 225 21 0 0 0 59 241 89 7 206 166 0 0 0 0 0 0 12 235 166 0 0 0 0 +0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 +166 0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 +0 0 175 201 0 0 0 0 175 225 21 12 235 166 245 125 0 12 235 125 12 235 125 +0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 +247 34 12 235 125 0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 34 0 138 +225 21 0 0 0 175 201 0 12 235 125 0 0 7 202 159 247 34 12 235 125 0 0 0 +59 245 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 12 235 +125 0 0 0 59 245 125 0 0 138 247 34 7 206 201 0 12 235 255 255 255 251 +89 0 12 235 125 0 12 235 125 0 0 0 127 0 7 206 166 59 241 89 0 0 7 206 +166 59 241 89 0 0 7 206 166 59 241 89 0 0 0 7 206 166 59 241 89 0 0 7 206 +166 59 241 89 0 0 7 206 166 59 241 89 0 0 0 138 225 21 7 206 166 0 0 0 +0 0 0 89 247 34 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 +235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 +12 235 125 0 0 12 235 125 0 0 175 201 0 0 0 0 59 241 89 12 235 125 138 +225 21 12 235 125 89 247 34 0 0 0 0 59 245 125 89 247 34 0 0 0 0 59 245 +125 89 247 34 0 0 0 0 59 245 125 89 247 34 0 0 0 0 59 245 125 89 247 34 +0 0 0 0 59 245 125 0 0 175 225 21 0 175 225 21 0 89 247 34 0 0 138 166 +12 235 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 12 235 +125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 0 0 12 235 166 89 247 +34 0 12 235 166 0 0 138 251 89 12 235 133 206 255 125 0 0 0 0 127 0 59 +241 89 7 206 166 0 0 59 241 89 7 206 166 0 0 59 241 89 7 206 166 0 0 0 +59 241 89 7 206 166 0 0 59 241 89 7 206 166 0 0 59 241 89 7 206 166 0 0 +12 235 125 0 7 206 255 255 255 255 247 34 0 138 225 21 0 0 0 0 0 12 235 +255 255 255 255 247 34 12 235 255 255 255 255 247 34 12 235 255 255 255 +255 247 34 12 235 255 255 255 255 247 34 0 12 235 125 0 0 12 235 125 0 +0 12 235 125 0 0 12 235 125 0 206 255 255 255 247 34 0 12 235 125 12 235 +125 12 235 125 12 235 125 138 225 21 0 0 0 0 12 235 166 138 225 21 0 0 +0 0 12 235 166 138 225 21 0 0 0 0 12 235 166 138 225 21 0 0 0 0 12 235 +166 138 225 21 0 0 0 0 12 235 166 0 0 0 175 225 187 225 21 0 0 138 225 +21 0 59 215 21 7 206 166 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 +245 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 0 0 0 89 +255 255 125 0 0 12 235 166 0 0 12 235 166 12 235 125 0 7 206 201 0 0 0 +127 0 138 225 21 0 138 225 21 0 138 225 21 0 138 225 21 0 138 225 21 0 +138 225 21 0 0 138 225 21 0 138 225 21 0 138 225 21 0 138 225 21 0 138 +225 21 0 138 225 21 0 89 255 255 255 255 255 166 0 0 0 0 0 0 138 225 21 +0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 +0 12 235 166 0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 +235 125 0 0 175 201 0 0 0 0 12 235 125 12 235 125 0 138 225 34 235 125 +138 225 21 0 0 0 0 12 235 166 138 225 21 0 0 0 0 12 235 166 138 225 21 +0 0 0 0 12 235 166 138 225 21 0 0 0 0 12 235 166 138 225 21 0 0 0 0 12 +235 166 0 0 0 0 175 225 21 0 0 0 138 225 21 7 202 89 0 7 206 166 12 235 +125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 +125 12 235 125 0 0 0 59 245 125 0 0 0 7 206 225 21 0 0 12 235 166 0 0 12 +235 166 12 235 125 0 0 59 241 89 0 0 127 7 206 255 255 255 255 251 89 7 +206 255 255 255 255 251 89 7 206 255 255 255 255 251 89 0 7 206 255 255 +255 255 251 89 7 206 255 255 255 255 251 89 7 206 255 255 255 255 251 89 +7 206 166 0 0 7 206 166 0 0 0 0 0 0 89 247 34 0 0 0 0 0 12 235 166 0 0 +0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 +12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 175 201 0 0 +0 0 59 241 89 12 235 125 0 12 235 138 235 125 89 247 34 0 0 0 0 59 245 +125 89 247 34 0 0 0 0 59 245 125 89 247 34 0 0 0 0 59 245 125 89 247 34 +0 0 0 0 59 245 125 89 247 34 0 0 0 0 59 245 125 0 0 0 175 225 187 225 21 +0 0 138 247 34 175 125 0 0 12 235 125 12 235 125 0 0 0 59 241 89 12 235 +125 0 0 0 59 241 89 12 235 125 0 0 0 59 241 89 12 235 125 0 0 0 59 241 +89 0 0 0 0 175 225 21 0 0 12 235 166 0 0 175 247 34 12 235 125 0 0 12 235 +125 0 0 127 59 241 89 0 0 7 206 166 59 241 89 0 0 7 206 166 59 241 89 0 +0 7 206 166 0 59 241 89 0 0 7 206 166 59 241 89 0 0 7 206 166 59 241 89 +0 0 7 206 166 59 241 89 0 0 7 206 166 0 0 0 0 0 0 59 245 166 0 0 0 0 0 +12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 +0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 +175 201 0 0 0 0 175 225 21 12 235 125 0 0 138 232 245 125 12 235 125 0 +0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 +34 12 235 125 0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 34 0 0 175 +225 21 0 175 225 21 0 59 245 191 201 0 0 0 89 225 21 12 235 166 0 0 0 89 +251 89 12 235 166 0 0 0 89 251 89 12 235 166 0 0 0 89 251 89 12 235 166 +0 0 0 89 251 89 0 0 0 0 175 225 21 0 0 12 235 255 255 255 247 34 0 12 235 +125 0 0 59 241 89 0 0 127 138 225 21 0 0 0 138 247 163 225 21 0 0 0 138 +247 163 225 21 0 0 0 138 247 34 138 225 21 0 0 0 138 247 163 225 21 0 0 +0 138 247 163 225 21 0 0 0 138 247 198 225 21 0 0 7 206 166 0 0 0 0 0 0 +0 138 255 125 0 0 7 202 102 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 +166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 12 235 +125 0 0 12 235 125 0 0 175 201 0 0 7 206 251 89 0 12 235 125 0 0 12 235 +255 125 0 89 255 125 0 0 89 251 89 0 0 89 255 125 0 0 89 251 89 0 0 89 +255 125 0 0 89 251 89 0 0 89 255 125 0 0 89 251 89 0 0 89 255 125 0 0 89 +251 89 0 0 138 225 21 0 0 0 175 201 0 0 138 251 89 0 0 89 251 89 0 0 138 +247 34 0 7 206 225 21 0 138 247 34 0 7 206 225 21 0 138 247 34 0 7 206 +225 21 0 138 247 34 0 7 206 225 21 0 0 0 0 175 225 21 0 0 12 235 166 0 +0 0 0 0 12 235 125 0 0 175 225 21 0 0 127 206 166 0 0 0 0 59 245 255 166 +0 0 0 0 59 245 255 166 0 0 0 0 59 245 133 206 166 0 0 0 0 59 245 255 166 +0 0 0 0 59 245 255 166 0 0 0 0 59 245 255 125 0 0 0 7 206 255 255 255 255 +255 125 0 0 0 59 245 255 255 255 201 12 235 255 255 255 255 255 125 12 +235 255 255 255 255 255 125 12 235 255 255 255 255 255 125 12 235 255 255 +255 255 255 125 89 255 255 255 201 89 255 255 255 201 89 255 255 255 201 +89 255 255 255 201 0 175 255 255 255 255 225 21 0 0 12 235 125 0 0 0 138 +255 125 0 0 0 175 255 255 201 0 0 0 0 0 0 175 255 255 201 0 0 0 0 0 0 175 +255 255 201 0 0 0 0 0 0 175 255 255 201 0 0 0 0 0 0 175 255 255 201 0 0 +0 0 0 0 0 0 0 0 0 0 0 7 202 97 206 255 255 201 0 0 0 0 0 138 255 255 255 +201 0 0 0 0 138 255 255 255 201 0 0 0 0 138 255 255 255 201 0 0 0 0 138 +255 255 255 201 0 0 0 0 0 0 175 225 21 0 0 12 235 166 0 0 0 0 0 12 235 +133 206 255 225 21 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 175 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 0 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 7 206 225 21 +0 0 0 0 0 12 235 225 21 0 0 89 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 7 206 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 247 +34 0 0 0 0 0 0 0 138 251 89 0 0 59 245 247 34 0 0 0 0 0 0 0 0 0 175 247 +34 0 0 175 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 225 21 +0 0 0 0 0 0 0 138 255 125 0 0 0 12 235 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 251 89 0 0 0 0 0 0 +7 206 225 21 0 0 0 7 206 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 166 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 59 241 89 0 0 0 0 +0 89 247 34 0 0 7 206 138 235 125 0 0 89 255 225 21 175 125 0 0 0 0 0 0 +0 0 0 138 201 0 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 +235 125 0 0 0 0 0 0 12 235 125 0 0 0 175 171 206 166 0 0 0 0 0 0 0 0 0 +7 206 166 0 59 245 255 166 238 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 125 59 +215 21 0 0 59 241 89 0 0 0 0 0 0 7 206 166 0 0 0 0 138 201 175 201 0 0 +0 12 235 251 89 89 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 206 166 0 0 0 0 0 0 89 247 34 0 0 0 0 89 225 151 201 0 0 0 0 +0 0 0 0 0 0 0 0 0 175 201 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 138 201 0 0 0 0 7 206 125 0 0 0 138 201 0 89 225 21 +12 228 34 138 255 201 0 0 0 138 247 34 175 225 21 0 138 201 0 138 201 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 21 0 0 0 0 0 89 225 +21 0 0 89 247 34 59 241 89 0 59 241 89 89 247 34 0 0 89 225 21 175 127 +215 21 206 247 42 206 0 138 255 247 42 206 125 0 0 138 166 12 235 251 89 +0 0 0 0 138 201 0 0 0 0 0 0 89 225 21 0 0 0 59 241 89 12 235 125 0 0 175 +125 59 245 247 34 0 0 12 235 125 89 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 175 166 0 0 0 0 12 232 89 7 206 125 0 +0 12 235 166 59 245 125 0 0 0 59 238 34 0 12 235 125 0 0 0 0 0 0 89 247 +34 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 247 34 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 251 89 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 12 235 255 255 255 166 0 12 235 255 +255 255 166 0 12 235 255 255 255 166 0 12 235 255 255 255 166 0 0 12 235 +255 255 255 166 0 12 235 255 255 255 166 0 12 235 255 255 255 166 0 175 +255 255 125 0 0 12 235 255 255 125 0 0 12 235 255 255 225 21 0 0 12 235 +255 255 225 21 0 12 235 255 255 225 21 0 12 235 255 255 225 21 0 12 235 +125 12 235 125 12 235 125 12 235 125 0 12 235 125 89 251 89 0 12 235 138 +235 255 247 34 0 0 12 235 255 255 201 0 0 0 12 235 255 255 201 0 0 0 12 +235 255 255 201 0 0 0 12 235 255 255 201 0 0 0 12 235 255 255 201 0 0 0 +0 0 0 175 247 34 0 0 0 12 235 255 255 255 166 0 59 241 89 0 0 89 247 34 +59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 42 +206 201 0 0 0 138 232 245 166 245 255 251 89 7 206 201 0 0 0 138 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 12 206 21 0 59 245 125 12 206 21 0 59 245 125 12 206 +21 0 59 245 125 12 206 21 0 59 245 125 0 12 206 21 0 59 245 125 12 206 +21 0 59 245 125 12 206 21 0 12 235 255 125 0 7 206 166 12 235 166 0 0 172 +102 0 235 125 0 0 175 201 0 12 235 125 0 0 175 201 12 235 125 0 0 175 201 +12 235 125 0 0 175 201 0 12 235 125 12 235 125 12 235 125 12 235 125 0 +0 0 0 0 175 201 0 12 235 247 34 0 175 201 0 12 235 166 0 7 206 201 0 12 +235 166 0 7 206 201 0 12 235 166 0 7 206 201 0 12 235 166 0 7 206 201 0 +12 235 166 0 7 206 201 0 0 0 0 0 175 247 34 0 0 12 235 166 0 12 235 201 +0 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 +34 59 241 89 0 0 89 247 34 89 247 34 0 7 206 176 235 225 21 0 175 225 21 +89 247 34 0 7 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 7 206 166 0 0 0 0 7 +206 166 0 0 0 0 7 206 166 0 0 0 0 7 206 166 0 0 0 0 0 7 206 166 0 0 0 0 +7 206 166 0 0 0 0 0 175 201 0 0 0 89 225 138 225 21 0 0 0 0 89 225 21 0 +0 89 247 34 89 225 21 0 0 89 247 124 225 21 0 0 89 247 124 225 21 0 0 89 +247 34 12 235 125 12 235 125 12 235 125 12 235 125 0 89 255 255 255 255 +247 34 12 235 125 0 0 89 247 34 138 225 21 0 0 59 238 34 138 225 21 0 0 +59 238 34 138 225 21 0 0 59 238 34 138 225 21 0 0 59 238 34 138 225 21 +0 0 59 238 34 0 0 0 0 0 0 0 0 0 138 225 21 0 172 132 238 34 59 241 89 0 +0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 +0 89 247 34 12 235 125 0 59 238 47 235 125 0 0 59 241 89 12 235 125 0 59 +238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 59 245 255 255 255 166 0 59 245 255 255 +255 166 0 59 245 255 255 255 166 0 59 245 255 255 255 166 0 0 59 245 255 +255 255 166 0 59 245 255 255 255 166 0 89 255 255 255 255 255 255 255 255 +255 247 175 201 0 0 0 0 0 175 255 255 255 255 255 247 34 175 255 255 255 +255 255 247 198 255 255 255 255 255 247 198 255 255 255 255 255 247 34 +12 235 125 12 235 125 12 235 125 12 235 125 89 251 89 0 0 59 241 89 12 +235 125 0 0 89 247 34 175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 175 +201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 7 206 +255 255 255 255 255 255 251 226 201 0 89 166 12 232 89 59 241 89 0 0 89 +247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 +247 34 0 175 201 0 138 201 12 235 125 0 0 12 235 125 0 175 201 0 138 201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 89 255 166 0 7 206 166 89 255 166 0 7 206 166 89 +255 166 0 7 206 166 89 255 166 0 7 206 166 0 89 255 166 0 7 206 166 89 +255 166 0 7 206 166 138 255 125 0 0 175 201 0 0 0 0 0 175 201 0 0 0 0 0 +175 201 0 0 0 0 0 0 175 201 0 0 0 0 0 175 201 0 0 0 0 0 175 201 0 0 0 0 +0 0 12 235 125 12 235 125 12 235 125 12 235 125 175 201 0 0 0 59 241 89 +12 235 125 0 0 89 247 34 175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 +175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 +0 0 0 0 0 0 0 0 0 175 201 7 176 21 12 232 89 59 241 89 0 0 89 247 34 59 +241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 0 +89 247 47 235 125 12 235 125 0 0 12 235 125 0 89 247 47 235 125 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 175 201 0 0 7 206 166 175 201 0 0 7 206 166 175 201 0 0 +7 206 166 175 201 0 0 7 206 166 0 175 201 0 0 7 206 166 175 201 0 0 7 206 +166 175 201 0 0 0 138 225 21 0 0 0 0 138 225 21 0 0 0 0 138 247 34 0 0 +0 0 0 138 247 34 0 0 0 0 138 247 34 0 0 0 0 138 247 34 0 0 0 0 0 12 235 +125 12 235 125 12 235 125 12 235 125 175 201 0 0 0 89 247 34 12 235 125 +0 0 89 247 34 138 225 21 0 0 89 247 34 138 225 21 0 0 89 247 34 138 225 +21 0 0 89 247 34 138 225 21 0 0 89 247 34 138 225 21 0 0 89 247 34 0 0 +0 0 175 247 34 0 0 138 225 151 125 0 89 247 34 59 241 89 0 0 89 247 34 +59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 +0 12 235 191 247 34 12 235 125 0 0 59 241 89 0 12 235 191 247 34 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 138 225 21 0 138 255 166 138 225 21 0 138 255 166 138 +225 21 0 138 255 166 138 225 21 0 138 255 166 0 138 225 21 0 138 255 166 +138 225 21 0 138 255 166 89 247 34 0 89 255 255 166 0 0 12 206 12 235 166 +0 0 127 102 0 235 201 0 0 12 206 21 12 235 201 0 0 12 206 34 235 201 0 +0 12 206 34 235 201 0 0 12 206 21 12 235 125 12 235 125 12 235 125 12 235 +125 89 255 125 0 7 206 166 0 12 235 125 0 0 89 247 34 12 235 166 0 7 206 +201 0 12 235 166 0 7 206 201 0 12 235 166 0 7 206 201 0 12 235 166 0 7 +206 201 0 12 235 166 0 7 206 201 0 0 0 0 0 175 247 34 0 0 12 235 201 0 +7 206 201 0 7 206 166 0 59 245 247 34 7 206 166 0 59 245 247 34 7 206 166 +0 59 245 247 34 7 206 166 0 59 245 247 34 0 0 138 255 166 0 12 235 125 +0 7 206 201 0 0 0 138 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 7 206 255 255 171 +206 166 7 206 255 255 171 206 166 7 206 255 255 171 206 166 7 206 255 255 +171 206 166 0 7 206 255 255 171 206 166 7 206 255 255 171 206 166 0 89 +255 255 201 0 0 175 255 255 247 34 0 12 235 255 255 166 0 0 7 206 255 255 +247 34 0 0 7 206 255 255 247 34 0 7 206 255 255 247 34 0 7 206 255 255 +247 34 0 12 235 125 12 235 125 12 235 125 12 235 125 0 89 255 255 255 201 +0 0 12 235 125 0 0 89 247 34 0 12 235 255 255 201 0 0 0 12 235 255 255 +201 0 0 0 12 235 255 255 201 0 0 0 12 235 255 255 201 0 0 0 12 235 255 +255 201 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 255 201 0 0 0 59 245 255 225 +111 247 34 0 59 245 255 225 111 247 34 0 59 245 255 225 111 247 34 0 59 +245 255 225 111 247 34 0 0 59 241 89 0 12 235 255 255 255 225 21 0 0 0 +59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 12 235 125 0 0 0 0 0 0 0 +138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 166 0 0 12 235 125 0 0 0 0 0 0 7 206 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +12 235 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 12 235 125 0 0 0 0 0 0 89 247 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 0 127 127 0 127 127 0 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 diff --git a/AntTweakBar/src/res/FontNormal.pgm b/AntTweakBar/src/res/FontNormal.pgm new file mode 100644 index 0000000..5d7d12f --- /dev/null +++ b/AntTweakBar/src/res/FontNormal.pgm @@ -0,0 +1,895 @@ +P2 +# Created by Paint Shop Pro +253 106 +255 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 +0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 255 0 0 0 0 255 0 0 0 0 0 255 255 +255 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 255 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 255 255 0 0 0 0 0 +255 0 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 0 0 0 255 0 0 255 +255 255 255 255 255 0 0 0 255 255 255 0 0 255 255 255 255 255 255 0 0 255 +255 255 255 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 255 255 +255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 +0 0 0 0 255 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 0 0 0 255 0 0 0 0 255 0 +255 0 0 0 0 255 0 0 0 0 255 255 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 +0 0 255 0 255 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 255 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 0 0 255 255 +255 255 255 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 +0 0 0 255 0 0 0 0 0 0 255 255 0 0 0 0 255 255 255 255 255 255 0 0 0 0 255 +255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 255 255 0 0 0 0 255 255 0 0 255 0 0 +255 255 0 0 0 255 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 +255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 255 255 0 0 255 0 0 0 255 +0 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 255 255 255 +0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 255 255 255 255 255 255 0 0 0 0 0 255 255 0 +0 0 0 0 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 255 255 +255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 255 +0 0 0 0 0 0 0 0 255 0 255 255 255 255 255 255 0 0 0 0 0 0 255 0 255 0 0 +0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 255 255 255 255 255 0 0 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 255 +0 255 0 0 0 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 +0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 +0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 0 255 0 0 0 0 0 255 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 255 0 255 +0 0 0 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 +255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 +0 0 255 0 0 0 255 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 255 0 255 0 0 0 0 0 0 255 255 255 0 0 0 0 0 255 0 0 0 0 255 255 +0 0 0 255 255 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 255 255 +255 0 0 0 255 255 255 255 255 0 255 255 255 255 255 255 0 0 255 255 255 +255 0 0 0 0 0 0 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 +0 0 0 0 0 0 255 255 255 255 0 0 0 255 255 255 0 0 0 0 255 0 0 0 255 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 0 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 0 127 127 127 +127 0 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 255 0 0 0 0 0 255 255 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 +255 255 255 0 0 0 0 0 0 0 255 0 0 0 0 255 255 255 255 255 0 0 0 0 255 255 +255 255 0 255 255 255 255 255 0 0 0 255 255 255 255 255 255 0 255 255 255 +255 255 0 0 0 255 255 255 255 0 0 255 0 0 0 0 0 255 0 255 255 255 0 0 255 +255 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 255 0 0 0 0 255 255 0 255 +255 0 0 0 0 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 255 0 0 0 0 +255 255 255 255 0 0 0 255 255 255 255 0 0 0 0 255 255 255 255 0 0 255 255 +255 255 255 255 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 255 255 255 +255 255 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 0 0 0 0 255 255 0 0 +0 0 255 0 255 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 +0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 +0 255 0 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 0 0 0 255 255 0 0 0 0 255 +255 0 255 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 +0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 255 0 0 255 +0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 255 0 255 255 255 255 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 +0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 +255 0 0 0 255 0 0 0 0 0 255 0 255 0 0 255 0 255 0 255 0 255 0 0 0 255 0 +255 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 +255 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 +0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 0 +255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 0 +0 255 0 0 255 0 0 0 255 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 +0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 255 0 +255 0 0 255 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 +0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 +255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 +0 0 255 0 0 0 0 255 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 0 0 255 0 0 255 0 0 255 0 0 0 255 +0 0 255 255 255 255 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 255 +255 255 255 255 0 255 255 255 255 255 0 255 0 0 0 255 255 255 0 255 255 +255 255 255 255 255 0 0 255 0 0 0 0 0 255 0 255 255 0 0 0 0 0 255 0 0 0 +0 0 255 0 255 0 0 255 0 255 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 255 255 255 0 0 0 0 255 255 +255 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 +255 0 0 255 0 255 0 0 255 0 0 0 0 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 0 0 255 0 0 255 0 0 255 +0 0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 +0 0 0 0 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 255 0 0 255 +0 255 0 0 0 255 0 255 0 255 0 0 0 0 0 0 255 0 255 255 255 255 255 0 0 255 +0 0 0 0 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 +255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 255 0 255 0 0 0 255 0 0 255 0 0 255 255 255 255 255 0 0 255 0 0 0 +0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 +255 0 0 0 255 0 0 0 0 0 255 0 0 255 255 0 0 255 0 255 0 0 0 255 0 255 0 +255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 +0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 0 255 0 255 +0 0 0 0 0 255 255 0 0 0 255 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 0 255 255 255 255 +255 255 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 +0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 +0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 0 0 0 255 0 +0 0 0 0 0 255 0 255 0 0 0 0 255 255 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 +0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 +0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 255 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 255 255 +255 255 0 0 0 0 255 255 255 255 0 255 255 255 255 255 0 0 0 255 255 255 +255 255 255 0 255 0 0 0 0 0 0 0 255 255 255 255 255 0 255 0 0 0 0 0 255 +0 255 255 255 0 255 255 255 0 0 255 0 0 0 0 255 0 255 255 255 255 255 0 +255 0 0 0 0 0 0 255 0 255 0 0 0 0 255 255 0 0 0 255 255 255 255 0 0 0 255 +0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 255 0 0 0 0 255 0 0 255 255 255 255 +0 0 0 0 0 255 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 255 255 255 255 +255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 255 255 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 255 0 0 +255 255 255 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 255 +0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 255 255 255 0 0 255 0 255 255 +255 0 0 0 255 255 255 255 0 0 255 255 255 255 255 0 0 255 255 255 255 0 +0 255 255 255 255 0 255 255 255 255 255 0 255 0 255 255 255 0 0 255 0 255 +255 0 255 0 0 0 255 0 255 0 255 255 255 255 0 255 255 255 0 0 255 0 255 +255 255 0 0 0 255 255 255 255 0 0 255 0 255 255 255 0 0 0 255 255 255 255 +255 0 255 0 255 0 0 255 255 255 0 255 255 255 255 0 255 0 0 0 0 255 0 255 +0 0 0 255 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 +255 255 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 255 0 255 255 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 255 255 0 0 0 255 0 255 0 0 255 +0 255 0 0 255 0 0 255 0 255 0 0 0 255 0 0 0 255 0 255 255 0 0 0 255 0 255 +0 0 0 0 255 0 255 255 0 0 0 255 0 255 0 0 0 0 255 0 255 255 0 0 255 0 0 +0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 0 0 255 +0 0 255 0 255 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 +0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 +0 0 255 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 0 255 +0 0 0 255 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 255 0 0 0 255 0 0 0 +255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 +0 255 255 255 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 +255 255 255 255 255 0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 255 0 255 255 0 0 0 0 255 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 0 255 0 0 0 255 0 255 0 255 +0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 0 255 255 0 0 0 0 0 0 +255 0 0 0 0 0 255 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 255 0 255 0 255 0 0 0 255 0 255 +0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 0 255 0 +0 255 0 255 0 0 0 255 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 255 +255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 255 +255 0 255 0 0 0 0 255 0 0 255 0 0 255 0 0 0 255 255 0 255 0 0 0 0 255 0 +255 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 +0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 255 255 0 255 0 0 +0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 255 0 0 0 255 0 0 0 0 0 255 0 0 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 255 255 255 255 0 255 255 +255 255 255 0 0 0 255 255 255 255 0 0 255 255 255 0 255 0 0 255 255 255 +255 0 0 0 255 0 0 0 255 255 255 0 255 0 255 0 0 0 0 255 0 255 0 0 255 0 +255 0 0 0 255 0 255 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 255 +255 255 255 0 0 255 255 255 255 255 0 0 0 255 255 255 0 255 0 255 0 0 0 +255 255 255 0 0 0 0 255 255 0 0 255 255 255 0 255 0 0 0 255 0 0 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 255 255 255 0 0 0 255 +0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 +255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 +255 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 0 127 127 127 127 127 0 +127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 0 127 127 0 127 127 127 127 127 0 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 255 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 +0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 255 +0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 127 0 0 255 +255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 +255 0 0 255 0 0 0 255 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 255 255 255 +0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 +255 255 255 255 255 255 0 255 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 0 255 0 0 +0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 255 255 0 0 0 255 255 255 0 255 0 0 0 255 0 0 255 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 +255 0 0 255 255 0 0 255 0 0 0 0 0 255 0 127 0 255 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 255 255 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0 255 0 0 255 0 0 +255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 255 0 0 0 255 0 255 0 255 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 255 255 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 127 255 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 +0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 255 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 +0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 +0 255 0 255 0 0 255 255 255 0 0 255 0 0 0 0 255 255 255 255 0 255 255 255 +0 0 0 0 255 0 0 0 0 0 0 0 255 0 255 255 255 255 0 0 255 0 0 0 255 0 0 127 +255 255 255 255 255 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 +0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 255 0 0 +0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 255 +0 0 0 127 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 255 255 0 0 255 0 0 255 255 0 0 0 255 255 0 0 0 255 255 +255 255 0 0 0 255 0 0 0 255 0 0 0 0 0 255 255 255 255 255 0 0 0 255 0 0 +0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 +0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 127 255 255 255 255 255 255 0 0 0 255 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 0 0 255 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 255 0 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 +0 255 0 0 0 0 255 255 255 255 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 +0 0 0 0 0 255 0 0 0 0 127 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 0 +0 0 0 255 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 +0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 +0 0 255 0 0 0 0 127 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 +0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 +0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 255 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 +0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 +0 0 255 0 0 0 0 127 0 0 255 255 255 255 0 0 0 255 255 255 255 255 255 255 +255 255 0 0 255 0 0 0 255 0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 255 0 +0 0 255 255 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 0 255 255 255 +255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 +255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 0 0 0 0 0 0 0 0 255 255 255 255 0 255 255 255 255 0 0 0 255 255 +255 255 255 255 255 255 255 0 255 255 255 255 0 0 0 0 255 0 0 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 0 127 127 0 127 127 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 0 +127 127 0 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 +255 0 0 0 0 255 255 255 255 0 0 255 0 0 255 0 0 0 0 0 255 255 255 255 0 +0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 0 0 0 255 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 255 255 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 255 +255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +0 0 0 0 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 255 0 0 0 255 0 0 +0 0 0 0 0 0 0 255 255 0 0 0 255 0 0 0 0 0 0 255 255 0 0 0 0 255 0 0 0 0 +0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 0 255 255 255 255 0 0 255 0 0 0 0 +0 255 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 255 255 0 0 255 0 0 0 0 255 255 255 0 0 0 255 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 255 255 0 0 255 0 0 0 0 0 0 0 0 +0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 255 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 255 0 255 255 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 255 0 0 0 255 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 +0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 255 0 0 0 255 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 +0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 255 255 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 255 255 255 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 255 0 0 +0 0 255 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 255 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 +0 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 +255 255 255 0 0 255 255 255 255 0 0 255 255 255 0 0 0 0 0 0 0 0 0 255 0 +0 0 0 255 0 0 255 255 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 255 255 0 0 0 0 +255 0 0 255 0 255 255 255 0 0 0 0 0 0 255 0 255 0 0 255 255 0 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 +0 255 0 255 0 0 0 255 255 255 255 255 0 0 0 255 0 0 255 0 0 0 255 255 255 +255 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 +0 255 0 0 0 255 255 255 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 +0 255 255 255 0 255 0 0 255 255 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 +0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 0 0 +255 0 0 255 255 255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 +255 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 0 +0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 255 0 255 +0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 +0 255 255 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 255 0 0 0 0 0 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 255 0 0 0 0 255 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 0 255 +255 255 255 255 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 255 0 0 0 0 255 255 255 255 0 255 255 255 255 255 255 0 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 +255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 255 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 255 0 0 0 +0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 255 255 255 255 0 0 0 0 255 +0 0 0 0 0 0 255 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 255 255 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 255 0 255 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 0 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 255 +0 0 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 255 255 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 255 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 +255 0 0 0 0 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 +255 0 255 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 +0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 255 255 0 255 0 0 0 0 0 +0 0 0 0 0 255 0 255 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 255 0 255 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 255 255 255 255 0 255 255 +255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 255 255 255 0 255 +255 255 255 255 255 0 255 255 255 0 255 255 255 0 255 255 255 0 255 255 +255 0 0 255 255 255 255 0 0 0 255 255 0 0 0 0 255 0 0 0 255 255 255 255 +0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 255 255 +255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 +0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 127 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 +255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 255 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 +255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 +0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 127 0 0 255 0 255 0 0 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 +255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 255 0 0 0 255 0 255 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 255 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 +0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 0 0 255 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 +255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 +255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 +0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 255 0 0 0 0 0 255 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 255 0 +255 0 0 0 255 0 0 0 0 255 0 255 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 255 255 255 +255 0 255 0 0 0 0 0 0 255 255 255 255 255 255 0 255 255 255 255 255 255 +0 255 255 255 255 255 255 0 255 255 255 255 255 255 0 0 255 0 0 0 255 0 +0 0 255 0 0 0 255 0 0 255 255 255 255 0 0 255 0 255 0 0 255 0 0 255 0 255 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 +0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 127 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 +255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +255 255 255 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 +0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 255 0 0 0 0 0 0 255 0 255 0 +0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 +0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 255 0 0 0 0 0 255 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 127 0 255 +255 255 255 255 0 0 0 255 255 255 255 255 0 0 0 255 255 255 255 255 0 0 +0 255 255 255 255 255 0 0 0 255 255 255 255 255 0 0 0 255 255 255 255 255 +0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 255 0 0 0 0 0 0 255 0 255 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 +255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 +255 0 0 0 0 255 255 255 255 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +127 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 +0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 +0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +255 0 0 0 0 255 255 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 +0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 +0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 127 255 0 0 0 0 0 255 0 255 0 0 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 255 255 255 255 255 0 0 0 255 255 255 255 0 +255 255 255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 255 255 +255 0 255 255 255 255 255 255 0 255 255 255 0 255 255 255 0 255 255 255 +0 255 255 255 0 0 255 255 255 255 0 0 0 255 0 0 0 0 255 255 0 0 0 255 255 +255 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 +255 255 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 +255 0 0 0 0 0 255 255 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 0 127 127 127 0 127 127 +127 0 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 255 0 0 0 0 0 0 255 0 0 +0 0 255 255 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 255 255 0 0 +0 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 +255 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 255 0 0 0 0 0 255 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 0 0 0 0 255 0 0 0 0 255 +0 0 255 0 255 0 255 255 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 +0 255 0 0 255 0 0 0 255 0 255 0 255 0 255 255 0 255 0 0 255 0 255 0 0 0 +255 0 255 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 +0 255 255 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 +0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 255 255 255 0 0 0 255 255 255 0 0 0 255 255 255 0 0 0 255 255 255 +0 0 0 255 255 255 0 0 0 255 255 255 0 0 0 255 255 255 0 0 255 255 0 0 0 +0 255 255 255 255 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 +255 255 0 0 0 255 255 255 255 0 0 0 255 0 255 0 0 255 0 0 255 0 0 255 255 +0 255 0 0 255 0 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 +0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 +0 0 0 255 0 0 0 0 0 0 255 255 255 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 255 255 +255 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 +255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 0 255 +0 255 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 255 +0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 255 0 255 255 0 0 0 255 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 +0 0 255 0 0 255 0 0 255 255 255 255 255 0 255 0 0 0 0 255 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 255 0 0 0 0 255 0 255 0 0 +0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 0 0 255 0 0 0 +0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 255 255 0 0 +255 255 255 255 0 0 255 255 255 255 0 0 255 255 255 255 0 0 255 255 255 +255 0 0 255 255 255 255 0 0 255 255 255 255 255 255 255 255 255 0 255 0 +0 0 0 0 255 255 255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 +255 255 255 0 255 255 255 255 255 255 0 0 255 0 255 0 0 255 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 255 255 255 255 +255 255 0 255 0 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 0 0 255 0 0 0 0 255 0 0 255 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 0 0 255 0 255 0 0 0 255 0 255 +0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 +0 255 0 0 255 0 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 +0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 +0 255 0 0 0 255 0 255 0 0 0 255 255 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 +0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 +0 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 +255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 255 0 255 0 0 0 255 +255 0 255 0 0 0 255 255 0 255 0 0 0 255 255 0 0 0 255 0 0 0 255 0 0 0 0 +255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 255 255 0 0 255 +255 255 255 0 0 255 255 255 255 0 0 255 255 255 255 0 0 255 255 255 255 +0 0 255 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 0 255 255 255 255 +0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 +255 255 255 0 0 0 255 0 255 0 0 255 0 0 255 0 0 255 255 255 255 0 0 255 +0 0 0 0 255 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 +255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 0 0 0 255 0 0 0 0 +0 255 255 255 255 0 0 0 0 255 255 255 0 255 0 0 255 255 255 0 255 0 0 255 +255 255 0 255 0 0 255 255 255 0 255 0 0 0 255 0 0 0 255 255 255 255 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 0 127 0 127 127 0 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/AntTweakBar/src/res/FontNormalAA.pgm b/AntTweakBar/src/res/FontNormalAA.pgm new file mode 100644 index 0000000..90c8860 --- /dev/null +++ b/AntTweakBar/src/res/FontNormalAA.pgm @@ -0,0 +1,1012 @@ +P2 +# Created by Paint Shop Pro +264 106 +255 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 +0 0 0 4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 +59 241 97 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 168 34 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 251 89 0 0 89 255 125 89 255 125 0 0 0 0 +7 199 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 +0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 59 238 42 +206 125 0 0 0 0 7 199 34 89 166 0 0 0 0 168 34 0 0 0 175 255 255 166 0 +0 7 202 89 0 0 0 0 59 245 255 251 89 0 0 0 59 238 34 0 12 232 89 0 0 89 +247 34 0 59 245 206 199 124 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 7 202 89 0 12 235 255 247 34 0 0 0 0 12 232 89 0 0 12 235 +255 255 251 89 0 7 206 255 255 255 125 0 0 0 0 138 251 89 0 0 59 245 255 +255 255 251 89 0 0 89 255 255 166 0 89 255 255 255 255 255 201 0 0 59 245 +255 255 125 0 0 12 235 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 247 34 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 138 225 21 59 238 34 175 125 0 0 0 0 59 192 0 172 +89 0 0 59 245 255 255 251 89 89 247 34 12 228 34 0 138 166 0 0 0 0 12 235 +125 0 175 225 21 0 0 59 238 34 0 138 201 0 0 0 0 175 166 0 0 0 89 255 201 +0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 215 21 0 175 +166 0 138 201 0 0 7 206 255 251 89 0 0 59 192 0 0 138 247 34 59 192 0 0 +89 251 89 0 0 59 245 251 89 0 0 59 241 89 0 0 0 0 0 89 247 34 0 0 0 0 0 +0 0 7 206 166 0 7 206 125 0 89 247 34 7 206 166 0 138 225 21 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 0 0 0 175 166 0 0 0 0 0 +0 0 89 125 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 +0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 12 206 +21 175 125 0 0 89 255 255 255 255 255 255 166 59 241 89 168 34 138 125 +89 225 21 7 202 89 12 228 34 0 0 0 0 12 232 89 0 138 201 0 0 0 12 206 21 +7 202 89 0 0 0 0 59 215 21 59 245 206 199 124 255 125 0 0 0 0 7 202 89 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 12 232 89 0 59 238 34 0 0 +0 59 241 89 0 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 12 232 132 241 89 +0 0 59 241 89 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 89 247 34 0 12 232 89 0 +12 232 89 59 241 89 0 59 241 89 0 138 247 34 0 0 138 247 34 0 0 0 0 0 12 +235 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 166 0 0 0 0 0 0 0 0 0 138 +225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 +0 0 4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 172 +89 59 192 0 0 59 238 34 168 34 0 0 89 247 34 12 228 34 138 166 0 0 0 0 +0 0 138 251 159 247 34 0 0 0 0 0 0 59 238 34 0 0 0 0 7 202 89 0 0 7 199 +34 0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 59 +241 89 0 59 241 89 0 0 0 59 241 89 0 0 0 0 0 0 89 247 34 0 0 0 0 138 201 +0 7 206 125 59 241 89 0 0 59 245 255 255 251 89 0 12 235 255 255 255 125 +0 0 0 0 7 206 166 0 0 0 175 251 89 138 201 0 59 241 89 0 12 235 125 0 138 +247 34 0 0 138 247 34 0 0 0 59 245 247 34 0 0 0 0 7 206 255 255 255 255 +255 255 125 0 0 0 0 138 255 201 0 0 0 0 0 0 89 251 89 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 0 12 206 21 138 125 0 0 7 206 255 +247 34 0 0 0 175 255 255 166 59 215 21 175 255 255 125 0 0 138 171 206 +166 0 175 201 0 0 0 0 89 201 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 12 235 +255 255 255 255 255 255 125 0 0 0 0 138 255 255 251 89 0 0 0 0 0 59 215 +21 0 59 241 89 0 59 241 89 0 0 0 59 241 89 0 0 0 0 0 12 235 166 0 0 0 138 +255 255 125 0 175 201 0 59 241 89 0 0 0 0 0 0 175 247 34 59 241 89 0 89 +247 34 0 0 0 89 247 34 0 0 0 89 255 255 255 125 0 12 235 166 0 59 245 125 +0 0 0 0 0 0 0 0 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 89 251 89 0 0 7 206 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 201 +0 0 0 0 0 0 0 12 235 255 255 255 255 255 225 21 0 0 0 175 255 251 89 0 +0 0 0 0 175 125 89 225 21 59 238 34 89 225 21 12 235 166 175 166 0 0 0 +0 89 201 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 59 241 89 0 59 241 89 0 0 0 59 241 89 +0 0 0 0 12 235 166 0 0 0 0 0 0 59 241 97 206 255 255 255 255 255 125 0 +0 0 0 0 59 241 89 59 238 34 0 12 235 125 0 0 12 235 125 0 0 0 12 232 89 +0 59 245 125 0 89 255 255 232 241 89 0 0 0 0 0 0 0 0 0 0 0 0 59 245 247 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 201 0 0 0 0 7 206 125 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 +4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 12 206 21 +0 0 0 0 0 168 34 175 166 0 0 0 0 59 215 21 138 201 0 12 228 34 138 225 +21 0 12 235 251 89 0 0 0 0 59 215 21 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 +0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 12 232 89 0 +59 238 34 0 0 0 59 241 89 0 0 0 12 235 166 0 0 0 0 0 0 0 12 235 125 0 0 +0 59 241 89 0 0 0 0 0 0 59 241 89 12 232 89 0 12 232 89 0 0 138 225 21 +0 0 0 59 238 34 0 7 206 166 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 12 235 247 34 0 0 7 206 255 255 255 255 255 255 125 0 0 138 255 166 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 +0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 0 0 0 0 +0 0 0 0 172 89 89 166 0 0 0 89 166 0 168 42 206 125 0 0 0 7 202 89 0 89 +225 21 59 238 34 89 251 89 0 0 175 255 201 0 0 0 0 7 202 89 0 0 0 0 59 +215 21 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 0 0 138 247 34 0 0 0 0 0 7 206 +201 0 12 228 34 0 0 0 175 166 0 138 201 0 0 0 0 59 241 89 0 0 12 235 166 +0 0 0 0 89 166 0 0 89 251 89 0 0 0 59 241 89 0 0 59 192 0 0 175 225 21 +0 175 201 0 138 225 21 0 12 235 125 0 0 0 0 12 235 166 0 59 241 89 0 0 +0 7 206 166 0 0 138 247 34 0 0 59 245 125 0 0 0 0 0 0 0 12 232 89 0 0 0 +0 0 0 0 0 0 0 0 175 166 0 0 0 0 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 12 206 21 138 125 0 0 0 12 235 255 +255 255 166 0 0 0 0 138 201 0 0 0 175 255 255 125 0 0 138 255 255 255 125 +12 235 247 0 0 0 0 138 201 0 0 0 0 175 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 206 166 0 0 0 0 0 0 7 206 201 0 89 201 0 0 0 0 12 235 255 247 +34 0 0 7 206 255 255 255 225 21 89 255 255 255 255 255 166 59 245 255 255 +251 89 0 0 0 0 59 241 89 0 0 12 235 255 255 225 21 0 0 12 235 255 251 89 +0 0 175 225 21 0 0 0 0 0 59 245 255 255 125 0 0 89 255 255 166 0 0 0 138 +247 34 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 +0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 168 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 +4 4 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 168 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 +255 125 89 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 +0 0 0 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 +127 127 127 127 0 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 0 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 0 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 125 138 166 0 0 0 89 255 255 247 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 89 255 255 +255 255 166 0 0 0 0 0 12 235 225 21 0 0 59 245 255 255 255 251 89 0 0 0 +59 245 255 255 251 89 59 245 255 255 255 247 34 0 0 59 245 255 255 255 +255 127 81 245 255 255 255 255 127 0 0 59 245 255 255 255 166 0 59 241 +89 0 0 0 59 241 89 89 255 255 255 125 7 206 255 251 89 59 241 89 0 0 89 +255 166 59 241 89 0 0 0 0 59 245 225 21 0 0 7 206 251 89 59 245 247 34 +0 0 59 241 89 0 0 138 255 255 255 166 0 0 59 245 255 255 255 225 21 0 0 +0 138 255 255 255 166 0 0 59 245 255 255 255 251 89 0 0 0 59 245 255 255 +201 89 255 255 255 255 255 255 255 125 59 241 89 0 0 0 59 241 97 206 166 +0 0 0 0 175 201 175 201 0 0 7 206 201 0 0 0 175 171 206 225 21 0 0 59 245 +166 245 125 0 0 0 89 251 89 89 255 255 255 255 255 127 0 228 34 0 0 59 +215 21 0 0 0 0 12 228 34 0 0 0 59 245 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 175 225 21 0 0 0 175 225 21 0 0 0 89 232 241 89 0 0 59 +241 89 0 0 138 225 21 0 89 255 125 0 0 59 192 59 241 89 0 0 175 251 89 +0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 89 255 125 0 0 7 199 34 59 241 +89 0 0 0 59 241 89 0 59 241 89 0 0 0 59 241 89 59 241 89 0 59 241 89 0 +59 241 89 0 0 0 0 59 245 255 125 0 0 89 255 251 89 59 245 255 201 0 0 59 +241 89 0 138 251 89 0 12 235 166 0 59 241 89 0 7 206 225 21 0 138 251 89 +0 12 235 166 0 59 241 89 0 0 138 247 34 0 12 235 125 0 7 176 21 0 0 59 +241 89 0 0 0 59 241 89 0 0 0 59 241 89 138 225 21 0 0 12 235 125 89 225 +21 0 59 245 247 34 0 12 232 89 12 235 166 0 7 206 166 0 89 247 34 0 7 206 +125 0 0 0 0 0 7 206 166 12 228 34 0 0 7 202 89 0 0 0 0 12 228 34 0 0 12 +235 133 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 138 201 0 138 +255 255 255 125 138 166 0 0 7 206 166 175 166 0 0 59 241 89 0 0 89 247 +34 7 206 166 0 0 0 0 0 59 241 89 0 0 0 175 225 21 59 241 89 0 0 0 0 59 +241 89 0 0 0 0 7 206 166 0 0 0 0 0 0 59 241 89 0 0 0 59 241 89 0 59 241 +89 0 0 0 59 241 89 59 241 89 59 241 89 0 0 59 241 89 0 0 0 0 59 241 159 +225 21 0 175 166 241 89 59 241 132 241 89 0 59 241 89 12 235 166 0 0 0 +89 247 34 59 241 89 0 0 89 247 34 12 235 166 0 0 0 89 247 34 59 241 89 +0 0 59 241 89 0 59 238 34 0 0 0 0 0 0 59 241 89 0 0 0 59 241 89 0 0 0 59 +241 89 59 241 89 0 0 89 225 21 59 241 89 0 89 206 202 89 0 59 238 34 0 +89 251 89 138 225 21 0 0 175 201 0 138 225 21 0 0 0 0 0 175 225 21 12 228 +34 0 0 0 138 166 0 0 0 0 12 228 34 0 7 206 166 0 12 235 125 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 7 202 89 89 225 21 7 206 125 12 206 21 0 59 238 +34 89 247 34 0 59 241 89 0 0 175 201 0 59 241 89 0 0 0 0 0 59 241 89 0 +0 0 59 241 89 59 241 89 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 0 +59 241 89 0 0 0 59 241 89 0 59 241 89 0 0 0 59 241 89 59 241 102 232 89 +0 0 0 59 241 89 0 0 0 0 59 241 102 232 89 59 215 81 241 89 59 241 89 138 +225 21 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 7 206 201 0 59 241 +89 0 0 0 59 241 89 59 241 89 0 0 175 201 0 0 12 235 166 0 0 0 0 0 0 59 +241 89 0 0 0 59 241 89 0 0 0 59 241 89 7 206 166 0 0 175 166 0 7 206 125 +0 175 125 175 166 0 138 201 0 0 0 175 255 251 89 0 0 0 59 245 166 241 89 +0 0 0 0 0 89 247 34 0 12 228 34 0 0 0 89 201 0 0 0 0 12 228 34 12 235 201 +0 0 0 59 245 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 59 215 21 175 125 +0 7 206 125 7 199 34 0 138 201 0 12 235 125 0 59 245 255 255 255 247 34 +0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 59 241 89 59 245 255 255 255 255 +127 59 245 255 255 255 255 127 59 241 89 0 0 0 0 0 0 59 245 255 255 255 +255 255 251 89 0 59 241 89 0 0 0 59 241 89 59 245 255 247 34 0 0 0 59 241 +89 0 0 0 0 59 241 89 138 201 175 166 59 241 89 59 241 89 12 235 125 59 +241 89 59 241 89 0 0 0 12 235 125 59 245 255 255 255 201 0 0 59 241 89 +0 0 0 12 235 125 59 245 255 255 255 125 0 0 0 0 59 245 255 255 125 0 0 +0 59 241 89 0 0 0 59 241 89 0 0 0 59 241 89 0 138 225 21 59 241 89 0 0 +175 201 7 202 89 89 201 0 175 166 0 0 0 12 235 166 0 0 0 0 0 138 255 166 +0 0 0 0 0 59 245 125 0 0 12 228 34 0 0 0 12 228 34 0 0 0 12 228 34 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 59 215 21 175 125 0 7 +206 125 7 199 34 7 206 125 0 0 175 201 0 59 241 89 0 0 89 247 34 59 241 +89 0 0 0 0 0 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 0 59 241 89 0 0 +0 0 59 241 89 0 59 245 255 251 89 59 241 89 0 0 0 59 241 89 0 59 241 89 +0 0 0 59 241 89 59 241 89 175 225 21 0 0 59 241 89 0 0 0 0 59 241 89 12 +235 247 34 59 241 89 59 241 89 0 89 247 94 241 89 59 241 89 0 0 0 59 241 +89 59 241 89 0 0 0 0 0 59 241 89 0 0 0 59 241 89 59 241 89 12 235 166 0 +0 0 0 0 0 0 138 251 89 0 0 59 241 89 0 0 0 59 241 89 0 0 0 59 241 89 0 +12 232 89 138 225 21 0 0 89 225 81 215 21 12 228 47 232 89 0 0 0 175 255 +251 89 0 0 0 0 59 241 89 0 0 0 0 7 206 201 0 0 0 12 228 34 0 0 0 0 175 +125 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +12 228 34 89 201 0 7 206 125 59 215 21 59 245 255 255 255 255 247 34 59 +241 89 0 0 59 241 89 7 206 166 0 0 0 0 0 59 241 89 0 0 0 138 225 21 59 +241 89 0 0 0 0 59 241 89 0 0 0 0 7 206 166 0 0 0 59 241 89 59 241 89 0 +0 0 59 241 89 0 59 241 89 0 0 0 59 241 89 59 241 89 7 206 201 0 0 59 241 +89 0 0 0 0 59 241 89 0 175 166 0 59 241 89 59 241 89 0 7 206 200 241 89 +12 235 166 0 0 0 89 247 34 59 241 89 0 0 0 0 0 12 235 166 0 0 0 89 247 +34 59 241 89 0 59 245 125 0 0 0 0 0 0 12 232 89 0 0 59 241 89 0 0 0 12 +232 89 0 0 0 59 238 34 0 0 175 171 206 166 0 0 0 12 232 159 201 0 7 202 +132 215 21 0 0 89 247 34 175 225 21 0 0 0 59 241 89 0 0 0 0 138 225 21 +0 0 0 12 228 34 0 0 0 0 89 201 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 138 201 7 206 255 251 226 255 255 166 0 +138 201 0 0 0 12 235 125 59 241 89 0 0 138 247 34 0 89 255 125 0 0 59 192 +59 241 89 0 0 138 251 89 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 89 255 +125 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 59 241 89 0 0 0 89 247 34 +59 241 89 0 12 235 166 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 59 241 89 +59 241 89 0 0 59 245 251 89 0 138 251 89 0 59 245 166 0 59 241 89 0 0 0 +0 0 0 138 251 89 0 59 245 166 0 59 241 89 0 0 138 251 89 0 89 166 0 0 89 +247 34 0 0 59 241 89 0 0 0 0 138 225 21 0 7 206 166 0 0 0 89 255 251 89 +0 0 0 7 206 255 125 0 0 138 255 201 0 0 12 235 125 0 12 235 166 0 0 0 59 +241 89 0 0 0 89 251 89 0 0 0 0 12 228 34 0 0 0 0 12 228 34 0 0 12 228 34 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 7 206 225 21 0 +0 0 0 0 0 7 206 125 0 0 0 0 175 201 59 245 255 255 255 247 34 0 0 0 59 +245 255 255 251 89 59 245 255 255 255 225 21 0 0 59 245 255 255 255 255 +127 81 241 89 0 0 0 0 0 0 59 245 255 255 255 201 0 59 241 89 0 0 0 59 241 +89 89 255 255 255 138 235 255 255 125 0 59 241 89 0 0 89 255 201 59 245 +255 255 255 255 166 59 241 89 0 0 0 0 59 241 89 59 241 89 0 0 0 175 251 +89 0 0 138 255 255 255 166 0 0 59 241 89 0 0 0 0 0 0 0 138 255 255 255 +166 0 0 59 241 89 0 0 0 175 251 89 12 235 255 255 251 89 0 0 0 59 241 89 +0 0 0 0 0 59 245 255 251 89 0 0 0 0 12 235 201 0 0 0 0 0 138 251 89 0 0 +89 255 125 0 7 206 225 21 0 0 89 255 125 0 0 59 241 89 0 0 0 175 255 255 +255 255 255 127 0 228 34 0 0 0 0 0 175 125 0 0 12 228 34 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 89 255 255 255 255 125 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 +228 34 0 0 0 0 0 89 201 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 138 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 125 0 0 0 12 228 +124 255 255 247 34 0 0 0 0 0 0 0 0 0 245 255 255 255 255 255 255 0 0 0 +0 0 0 0 0 0 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 89 255 125 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 89 255 255 166 0 0 0 0 0 +0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 255 201 0 12 228 +34 0 0 89 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 116 116 +4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 59 241 89 0 0 0 0 0 0 0 0 0 59 241 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 +0 0 0 59 241 89 0 0 0 0 59 241 89 0 89 251 89 59 241 89 0 0 0 0 59 241 +89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 +21 0 0 12 228 34 0 0 0 0 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 +4 4 28 244 252 52 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 +241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 59 241 89 0 +0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 59 241 +89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 +0 0 0 12 228 34 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 +4 180 252 164 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 7 206 255 255 255 +125 0 59 241 194 255 251 89 0 0 7 206 255 255 201 0 12 235 255 255 251 +89 0 12 235 255 251 89 7 206 255 255 247 34 0 12 235 255 255 251 89 59 +241 194 255 255 125 0 59 241 89 89 255 251 89 59 241 89 0 138 251 89 59 +241 89 59 241 159 255 255 125 89 255 255 166 0 59 241 194 255 255 125 0 +0 0 12 235 255 247 34 0 59 241 194 255 255 125 0 0 12 235 255 255 251 89 +59 241 159 255 201 0 138 255 255 247 34 206 255 255 255 166 59 241 89 0 +59 241 97 206 166 0 0 12 235 125 175 201 0 7 206 166 0 7 206 133 206 225 +21 0 89 255 255 166 0 0 12 235 125 138 255 255 255 255 166 0 0 138 166 +0 0 0 12 228 34 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 +76 252 244 20 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 89 247 34 +59 245 166 0 138 225 21 7 206 201 0 0 0 7 206 166 0 59 241 89 7 206 125 +0 89 225 21 59 241 89 0 0 7 206 166 0 59 241 89 59 245 166 0 89 247 34 +59 241 89 0 59 241 89 59 241 89 138 225 21 0 59 241 89 59 245 201 0 89 +255 201 0 89 247 34 59 245 166 0 89 247 34 0 7 206 166 0 138 225 21 59 +245 166 0 138 247 34 7 206 166 0 59 241 89 59 245 201 0 0 59 238 34 0 130 +34 59 241 89 0 0 59 241 89 0 59 241 89 89 247 34 0 89 247 34 138 225 21 +12 235 225 21 12 232 89 7 206 166 12 235 125 89 247 34 0 89 247 34 0 0 +0 89 247 34 0 0 138 166 0 0 0 12 228 34 0 0 0 0 89 225 21 0 0 7 206 247 +34 0 0 89 201 0 0 4 4 68 12 4 4 4 220 252 108 4 4 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 0 0 59 +241 89 0 59 241 89 59 238 34 0 59 238 34 59 241 89 0 0 59 241 89 0 59 241 +89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 159 201 0 0 0 59 +241 89 59 241 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 +89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 +0 59 241 89 0 0 0 59 241 89 0 0 59 241 89 0 59 241 89 12 235 125 0 175 +166 0 59 238 34 89 171 202 89 89 225 21 0 59 241 226 201 0 12 235 125 0 +175 166 0 0 0 12 235 125 0 0 59 238 34 0 0 0 12 228 34 0 0 0 0 7 206 125 +0 7 202 89 12 235 166 0 175 125 0 0 4 60 244 172 4 4 132 252 212 4 4 4 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 89 255 255 255 251 89 59 241 89 +0 59 241 89 59 238 34 0 0 0 59 238 34 0 59 241 89 59 245 255 255 255 251 +0 59 241 89 0 0 59 238 34 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 +59 241 89 59 245 255 225 21 0 0 59 241 89 59 241 89 0 59 241 89 0 59 241 +89 59 241 89 0 59 241 89 0 59 238 34 0 12 232 89 59 241 89 0 12 232 89 +59 238 34 0 59 241 89 59 241 89 0 0 0 175 255 255 201 0 59 241 89 0 0 59 +241 89 0 59 241 89 0 175 201 12 232 89 0 7 206 125 172 89 138 166 138 201 +0 0 0 138 247 34 0 0 175 201 12 232 89 0 0 7 206 166 0 0 175 225 21 0 0 +0 0 12 228 34 0 0 0 0 0 0 175 225 34 206 21 0 0 175 255 166 0 0 0 4 52 +244 252 140 36 244 252 60 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 59 +241 89 0 59 241 89 59 241 89 0 59 238 34 59 241 89 0 0 0 59 241 89 0 59 +241 89 59 238 34 0 0 0 0 59 241 89 0 0 59 241 89 0 59 241 89 59 241 89 +0 59 241 89 59 241 89 0 59 241 89 59 241 97 206 201 0 0 59 241 89 59 241 +89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 0 59 241 89 +59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 0 0 0 0 59 245 +125 59 241 89 0 0 59 241 89 0 59 241 89 0 59 238 124 225 21 0 0 175 176 +206 21 59 215 187 125 0 0 59 245 255 201 0 0 89 247 124 225 21 0 0 138 +225 21 0 0 0 59 241 89 0 0 0 12 228 34 0 0 0 0 12 235 125 0 0 0 0 0 0 0 +0 0 0 0 0 4 4 76 252 252 220 252 164 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 89 247 34 0 89 251 89 59 241 89 0 175 201 0 7 206 201 0 0 0 +7 206 166 0 138 251 89 7 206 166 0 7 199 34 59 241 89 0 0 7 206 166 0 138 +251 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 12 235 166 +0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 7 +206 166 0 138 225 21 59 241 89 0 138 225 21 7 206 166 0 89 251 89 59 241 +89 0 0 89 125 0 12 232 89 12 232 89 0 12 12 235 125 0 175 251 89 0 7 206 +255 125 0 0 0 89 255 201 0 7 206 247 34 0 7 206 166 59 245 125 0 7 206 +255 125 0 0 59 241 89 0 0 0 0 0 138 166 0 0 0 12 228 34 0 0 0 0 89 225 +21 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 100 252 252 244 28 4 4 4 4 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 175 255 255 232 241 89 59 245 255 255 247 34 +0 0 12 235 255 255 201 0 59 245 255 200 241 89 0 12 235 255 251 89 0 59 +241 89 0 0 0 12 235 255 200 241 89 59 241 89 0 59 241 89 59 241 89 0 59 +241 89 59 241 89 0 59 245 201 59 241 89 59 241 89 0 59 241 89 0 59 241 +89 59 241 89 0 59 241 89 0 0 12 235 255 247 34 0 59 245 166 255 247 34 +0 0 59 245 255 166 241 89 59 241 89 0 0 59 245 255 255 166 0 0 138 255 +255 125 0 89 255 255 166 241 89 0 0 138 247 34 0 0 0 59 245 125 0 0 138 +225 21 7 206 225 21 0 138 251 0 0 138 247 34 0 0 175 255 255 255 255 166 +0 0 138 166 0 0 0 12 228 34 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 4 +4 4 4 132 252 108 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 +0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 0 0 0 138 +201 0 0 0 12 228 34 0 0 0 0 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 +116 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 166 255 255 +247 34 0 0 0 0 0 0 0 0 0 0 0 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 59 +241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 7 206 255 +201 0 12 228 34 0 0 89 255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 +4 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 0 127 127 127 0 127 127 127 +127 127 127 0 127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 89 247 34 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 59 238 34 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 +225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +12 235 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 138 201 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 0 0 0 0 7 199 34 0 0 0 0 138 255 +201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 251 89 0 0 138 255 251 97 206 201 0 0 138 +251 102 235 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 +201 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 7 206 166 12 232 89 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 12 235 127 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 175 255 255 255 225 21 59 245 255 255 255 +255 255 125 0 0 0 0 0 0 0 7 206 255 247 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 7 199 34 0 0 0 0 0 7 199 34 0 0 0 138 225 21 175 166 0 0 175 255 255 +166 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 59 245 255 255 201 0 0 0 0 0 0 0 0 +59 245 255 255 255 255 255 255 255 255 125 0 59 245 255 255 255 255 255 +125 0 0 89 255 255 255 255 255 225 21 59 245 255 255 255 255 255 125 0 +0 0 59 245 255 255 255 255 255 125 7 206 166 0 0 175 171 206 166 89 247 +34 0 175 201 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +12 228 34 175 255 125 0 0 89 255 255 255 125 175 251 89 89 255 125 0 7 +206 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 255 255 +255 255 125 0 0 7 206 255 125 59 245 125 0 0 0 89 251 89 0 0 0 0 0 0 0 +127 7 206 225 21 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 0 175 201 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 255 255 255 125 0 59 245 255 +255 255 255 125 0 0 0 0 0 0 0 89 247 34 12 228 34 0 138 166 0 0 0 0 0 0 +0 0 0 0 12 235 125 0 7 176 21 0 0 0 0 0 0 138 251 89 0 0 138 201 0 0 0 +0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 7 206 166 0 59 115 0 0 0 0 59 115 +0 0 0 59 115 0 0 0 0 59 115 0 89 201 0 12 232 89 89 201 7 202 89 12 232 +89 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 199 34 0 172 132 196 199 163 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 0 89 247 34 0 7 +206 125 0 0 0 0 0 0 0 0 127 89 247 34 0 0 0 0 0 59 115 0 0 0 0 59 115 0 +0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 +0 0 0 0 7 199 34 0 0 0 0 0 0 0 0 0 89 225 21 7 202 89 12 228 34 0 0 0 0 +0 0 0 0 0 0 59 238 34 0 0 0 0 0 0 0 130 34 59 241 89 0 0 0 138 201 0 0 +0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 175 225 21 0 59 115 0 0 0 0 59 +115 0 0 0 59 115 0 0 0 0 59 115 0 12 228 34 59 192 0 12 228 34 138 166 +59 215 21 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 7 199 34 0 172 89 175 166 138 125 0 138 255 255 247 34 12 +146 0 0 0 0 89 255 255 255 125 12 235 255 255 125 0 0 0 59 115 0 0 0 0 +59 115 0 138 255 255 255 255 127 0 175 201 0 138 225 21 0 0 0 0 0 0 0 0 +127 245 255 255 255 255 255 125 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 12 +232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 0 0 0 0 7 199 +34 0 0 0 0 0 0 0 0 0 89 247 34 12 228 34 138 166 0 0 0 0 0 0 0 0 0 0 0 +12 235 166 0 0 0 0 0 0 175 225 21 138 225 21 0 0 0 138 201 0 0 0 0 0 0 +59 115 0 0 0 0 59 115 0 0 0 0 0 89 247 34 0 0 59 115 0 0 0 0 59 115 0 0 +0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 172 +89 0 0 138 125 59 238 34 0 130 34 7 206 201 0 0 59 241 89 0 12 235 255 +125 0 59 241 89 0 0 59 115 0 0 0 0 59 115 0 0 0 0 89 247 34 0 59 245 166 +241 89 0 0 0 0 0 0 0 0 0 127 138 225 21 0 0 0 0 0 59 115 0 0 0 0 59 115 +0 0 0 0 0 89 255 255 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 +34 0 0 0 0 0 7 199 34 0 0 0 0 0 0 0 0 0 0 175 255 255 166 59 215 21 175 +255 255 125 0 89 255 255 201 0 0 0 59 245 255 255 125 0 12 235 166 0 0 +138 225 21 0 0 0 138 255 255 255 255 247 34 0 59 115 0 0 0 0 59 115 0 0 +0 0 59 245 125 0 0 0 59 115 0 0 0 0 59 115 0 0 0 59 115 0 0 0 0 59 115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 251 102 0 255 255 255 255 +255 0 245 255 255 255 255 255 255 255 255 255 255 127 21 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 138 247 34 138 201 0 0 0 175 +201 0 0 0 175 166 0 0 59 115 0 0 0 0 59 115 0 0 0 12 235 125 0 0 0 138 +255 166 0 0 0 0 0 0 0 0 0 0 127 245 255 255 255 255 225 21 0 59 115 0 0 +0 0 59 115 0 0 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 7 199 34 0 0 0 59 245 255 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 175 +125 89 225 21 59 238 47 232 89 7 206 125 0 0 0 0 0 138 251 89 12 235 166 +0 0 138 225 21 0 0 0 138 201 0 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 7 +206 201 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 59 115 0 0 0 0 59 115 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 255 255 201 0 +0 0 138 247 34 175 201 0 0 0 138 255 255 255 255 255 166 0 0 59 115 0 0 +0 0 59 115 0 0 7 206 166 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 127 89 251 +89 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 0 0 0 0 7 199 34 0 0 0 0 0 0 0 0 0 +0 0 0 0 59 215 21 138 201 0 12 228 47 228 34 0 175 166 0 0 0 0 0 12 232 +89 0 0 175 225 21 59 241 89 0 0 0 138 201 0 0 0 0 0 0 59 115 0 0 0 0 59 +115 0 0 0 138 225 21 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 59 115 0 0 0 0 +59 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 166 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 +245 125 7 206 201 0 0 138 201 0 0 0 175 201 0 0 0 0 0 0 0 59 115 0 0 0 +0 59 115 0 0 138 225 21 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 127 7 206 +247 34 0 0 0 0 59 115 0 0 0 0 59 115 0 59 245 125 0 0 175 166 0 0 0 59 +245 125 175 225 29 206 166 0 89 247 34 7 206 166 0 0 0 7 199 34 0 0 0 0 +0 7 199 34 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 89 225 21 59 238 47 232 89 +7 206 125 0 89 166 0 0 89 247 34 0 0 0 130 34 0 138 255 125 0 0 138 201 +0 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 89 251 89 0 0 0 0 0 59 115 0 0 0 +0 59 115 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 89 125 0 12 232 89 12 146 0 0 0 59 241 89 0 12 235 247 +34 0 0 89 125 0 0 59 115 0 0 0 0 59 115 0 59 241 89 0 0 0 0 0 59 241 89 +0 0 0 0 0 0 0 0 0 0 127 0 0 175 255 255 255 225 21 59 245 255 255 255 255 +255 125 0 138 225 21 0 12 235 125 0 0 0 138 225 34 235 125 7 206 166 0 +89 247 34 7 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +138 201 0 0 0 175 255 255 125 0 89 255 255 201 0 0 12 235 255 255 251 89 +0 0 0 0 0 0 0 0 89 255 255 255 255 255 255 255 255 255 125 0 59 245 255 +255 255 255 255 125 0 0 175 255 255 255 255 255 247 34 59 245 255 255 255 +255 255 125 0 0 0 59 245 255 255 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 255 166 0 0 0 0 0 0 0 89 255 255 +255 125 59 245 255 255 201 0 0 0 59 245 255 255 255 255 255 125 0 175 255 +255 255 255 127 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 175 166 0 255 255 201 0 0 0 0 175 166 59 238 34 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 0 0 +0 0 0 0 0 12 228 34 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 0 127 127 0 127 127 0 127 127 127 127 0 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 245 255 255 255 255 255 +251 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 +0 0 0 138 125 0 0 0 0 59 245 255 255 125 0 0 0 0 0 0 0 0 138 225 21 0 0 +175 166 0 12 228 34 0 0 59 245 255 255 247 34 0 89 225 29 206 166 0 0 0 +0 0 89 255 255 255 255 125 0 0 0 7 206 255 255 247 34 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 255 125 0 0 0 0 0 0 0 +0 0 0 0 0 138 255 255 166 0 0 0 0 7 202 89 0 0 0 0 0 12 235 255 125 0 0 +175 255 255 225 21 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 138 255 255 255 +255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 0 0 89 255 255 225 21 0 0 +0 0 0 0 0 0 0 0 0 138 166 0 0 0 89 225 21 0 0 0 0 0 138 166 0 0 0 89 225 +21 0 0 0 12 235 255 255 166 0 0 7 206 125 0 0 0 0 0 0 89 247 34 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 0 0 0 138 125 0 0 0 12 +235 125 0 59 115 0 0 0 0 0 0 0 0 7 206 125 0 59 215 21 0 12 228 34 0 12 +235 125 0 0 168 34 0 0 0 0 0 0 0 0 0 0 175 225 21 0 0 0 175 225 21 0 0 +0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 225 +21 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 59 238 34 7 206 125 0 0 0 7 202 89 +0 0 0 0 7 199 34 59 238 34 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 89 255 255 255 125 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 247 34 0 +59 241 89 0 175 201 0 0 0 0 0 0 0 0 0 7 206 255 166 0 0 12 232 89 0 0 0 +0 7 206 255 166 0 0 12 232 89 0 0 0 0 0 0 0 59 215 21 0 89 201 0 0 0 0 +0 0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 7 +206 255 255 251 89 0 59 241 89 0 0 0 138 201 0 0 0 138 201 0 0 89 225 21 +175 125 0 0 12 228 34 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 +89 255 255 247 34 89 201 0 0 89 255 255 255 166 0 0 0 0 168 34 7 151 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 7 206 255 255 225 21 89 201 0 0 0 +0 0 0 0 0 0 89 166 0 0 138 166 0 0 0 7 202 89 0 0 0 0 0 0 0 59 238 34 0 +7 206 255 125 0 0 0 0 0 0 0 0 0 59 238 34 0 0 175 166 0 175 255 255 255 +125 175 125 0 138 247 34 0 0 0 0 0 0 0 0 0 0 12 228 34 0 89 201 0 0 89 +225 0 81 115 0 134 89 0 0 0 0 0 138 166 0 0 138 166 0 0 0 0 0 0 0 138 166 +0 0 138 166 0 0 0 0 0 0 59 245 247 34 0 12 232 89 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 201 0 7 206 201 138 125 +138 125 0 59 241 89 0 0 0 0 175 255 255 255 225 21 0 0 7 206 166 215 21 +0 0 12 228 34 0 0 138 255 255 251 89 0 0 0 0 0 0 0 0 0 12 206 21 59 241 +89 0 134 89 0 172 89 59 238 34 0 138 166 0 0 7 206 201 12 235 125 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 12 206 21 7 202 89 12 235 125 0 172 89 0 0 0 0 +0 0 0 0 59 238 34 7 206 125 12 235 255 255 255 255 255 255 125 0 0 0 12 +235 125 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 59 238 34 0 0 175 166 0 175 255 +255 255 125 175 125 0 138 247 34 0 0 0 0 0 0 0 0 0 0 12 228 34 0 89 201 +0 0 89 225 0 29 206 166 59 245 125 0 0 0 0 138 166 0 12 228 34 0 175 225 +21 0 0 0 138 166 0 12 228 42 206 255 255 166 0 0 0 0 12 228 34 138 166 +0 89 247 34 0 0 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 138 201 0 59 241 89 138 125 0 0 59 245 255 255 255 125 0 0 138 166 +0 89 201 0 0 0 0 89 255 125 0 0 0 0 0 0 0 7 206 125 0 138 251 89 0 0 0 +0 0 0 0 0 89 166 0 138 201 0 0 0 0 0 89 166 59 215 21 0 175 166 0 59 245 +125 89 251 89 0 0 12 235 255 255 255 255 255 255 125 138 255 255 251 89 +127 166 0 7 202 89 12 232 89 0 89 166 0 0 0 0 0 0 0 0 0 138 255 255 166 +0 0 0 0 7 202 89 0 0 0 0 0 59 241 89 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 +0 59 238 34 0 0 175 166 0 89 255 255 255 125 175 125 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 12 228 34 0 59 241 89 0 175 201 0 0 0 175 201 7 206 201 0 0 0 +138 166 0 175 166 0 138 200 215 21 0 0 0 138 166 0 175 166 7 151 0 89 247 +34 0 0 0 59 238 47 228 34 59 219 209 34 0 0 0 89 255 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 59 238 34 138 125 0 0 0 59 +241 89 0 0 0 0 138 166 0 89 201 0 0 59 245 255 255 255 255 125 0 0 0 0 +0 59 238 34 0 7 206 125 0 0 0 0 0 0 0 0 89 166 0 138 201 0 0 0 0 0 89 166 +0 175 255 255 223 166 0 12 235 125 59 241 89 0 0 0 0 0 0 0 0 0 175 125 +0 0 0 0 0 138 125 0 7 206 255 255 125 0 0 59 157 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 7 202 89 0 0 0 0 7 206 255 255 255 166 7 206 255 255 201 0 +0 0 0 0 0 0 0 0 59 238 34 0 0 175 166 0 0 89 255 255 125 175 125 0 0 0 +0 0 0 0 0 0 0 0 0 0 89 255 255 251 89 0 89 255 255 225 21 0 0 0 175 225 +29 206 166 0 0 0 138 166 59 215 21 59 215 81 215 21 0 0 0 138 166 59 215 +21 0 0 0 89 225 21 59 245 255 255 125 138 166 7 202 97 199 34 0 0 89 251 +89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 59 241 +89 138 125 0 0 0 89 247 34 0 0 0 0 175 255 255 255 225 21 0 0 0 12 232 +89 0 0 0 12 228 34 0 12 235 225 21 59 215 21 0 0 0 0 0 0 0 0 12 206 21 +59 241 89 0 134 89 0 172 89 0 0 0 0 0 0 0 0 7 206 201 12 235 125 0 0 0 +0 0 0 0 0 175 125 0 0 0 0 0 12 206 21 7 202 89 7 206 125 0 172 89 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 238 34 0 0 175 166 0 0 0 0 175 125 175 125 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 166 59 245 125 0 0 0 0 0 0 +175 125 12 228 34 59 215 21 0 0 0 0 0 175 125 0 0 0 12 232 89 0 0 0 0 0 +59 238 34 175 125 7 199 34 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 0 0 0 0 138 225 21 7 206 201 138 125 138 125 7 202 89 0 0 0 +0 138 201 0 0 0 138 166 0 0 0 12 232 89 0 0 0 12 228 34 0 0 0 175 255 255 +166 0 0 0 0 0 0 0 0 0 0 138 166 0 89 255 255 247 34 89 201 0 0 0 0 0 0 +0 0 0 0 0 168 34 7 151 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 0 138 166 7 202 +89 0 89 247 124 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 255 255 +255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 125 0 7 206 +166 0 0 0 0 175 125 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 59 115 0 134 89 0 0 0 0 0 0 59 215 21 59 245 255 255 255 225 21 0 +0 0 59 215 21 0 0 59 238 34 0 0 0 0 0 0 175 125 7 206 255 255 255 251 89 +0 138 247 34 0 59 157 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 +21 0 7 206 255 255 251 89 138 255 255 255 255 255 166 0 0 0 0 0 0 0 0 0 +0 12 232 89 0 0 0 12 228 34 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 175 +225 21 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 175 225 21 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 198 +255 251 194 166 0 0 0 0 175 125 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 0 0 0 89 225 21 0 0 0 +7 206 125 0 0 12 235 255 255 255 166 0 0 0 89 225 21 0 0 0 12 228 34 0 +0 0 175 255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 +34 0 7 176 21 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 255 125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 +255 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 0 0 0 175 +125 175 125 0 0 0 0 0 0 0 0 59 215 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +12 228 34 0 7 206 255 255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 0 0 0 175 125 175 125 +0 0 0 0 0 0 59 245 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 0 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 +127 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 89 +255 125 0 0 0 0 0 0 12 235 201 0 0 0 0 12 235 251 89 0 0 0 0 175 255 125 +89 201 0 0 0 0 0 0 0 0 0 0 0 59 245 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 0 0 0 138 251 89 0 0 0 12 235 251 +89 0 0 0 0 0 0 0 0 7 206 225 21 0 0 0 89 255 125 0 89 255 225 21 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 247 34 172 89 0 0 0 0 7 206 225 21 0 0 +0 0 0 0 0 89 255 125 0 0 0 0 0 0 89 255 225 21 0 0 0 0 12 235 247 34 172 +89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 +255 125 0 0 0 0 0 0 0 7 206 225 21 0 0 0 0 89 255 225 21 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 89 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 89 247 34 0 0 0 0 0 175 166 0 0 0 0 7 206 125 59 241 89 0 0 89 201 12 +235 247 34 0 0 7 206 166 59 241 89 0 0 12 228 34 59 215 21 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 89 247 34 0 0 0 7 +206 125 59 241 89 0 7 206 166 59 238 34 0 0 175 166 0 0 59 241 89 0 89 +247 34 138 201 59 238 34 138 201 0 0 0 0 0 0 0 0 0 0 0 175 125 89 255 201 +0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 59 238 34 138 225 +21 0 0 0 175 125 89 255 201 0 0 0 0 59 238 34 138 201 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 0 0 0 138 201 0 0 0 0 +0 59 238 34 138 225 21 0 0 0 59 238 34 138 201 0 0 0 0 12 232 89 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 59 215 21 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 125 0 +0 0 0 127 0 0 12 235 225 21 0 0 0 0 12 235 225 21 0 0 0 0 12 235 225 21 +0 0 0 0 12 235 225 21 0 0 0 0 12 235 225 21 0 0 0 0 12 235 225 21 0 0 0 +0 0 175 255 255 255 255 255 255 255 166 0 0 138 255 255 255 251 89 59 245 +255 255 255 255 127 81 245 255 255 255 255 225 21 59 245 255 255 255 255 +127 81 245 255 255 255 255 127 111 255 255 255 125 89 255 255 255 125 89 +255 255 255 125 89 255 255 255 125 7 206 255 255 255 255 125 0 0 59 245 +247 34 0 0 59 241 89 0 0 0 138 255 255 255 166 0 0 0 0 138 255 255 255 +166 0 0 0 0 0 138 255 255 255 166 0 0 0 0 138 255 255 255 166 0 0 0 0 138 +255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 255 255 210 235 166 +59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 +241 89 59 241 89 0 0 0 59 241 132 245 125 0 0 0 89 251 89 12 232 89 0 0 +0 0 7 206 166 0 89 251 89 0 0 0 127 0 0 89 232 241 89 0 0 0 0 89 232 241 +89 0 0 0 0 89 232 241 89 0 0 0 0 89 232 241 89 0 0 0 0 89 232 241 89 0 +0 0 0 89 232 241 89 0 0 0 0 12 232 89 89 225 21 0 0 0 0 0 175 247 34 0 +0 59 192 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 0 59 241 +89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 7 206 +166 0 0 59 245 201 0 59 245 255 201 0 0 59 241 89 0 0 138 251 89 0 12 235 +166 0 0 138 251 89 0 12 235 166 0 0 0 138 251 89 0 12 235 166 0 0 138 251 +89 0 12 235 166 0 0 138 251 89 0 12 235 166 0 0 0 138 166 0 0 0 12 228 +34 0 0 175 247 34 0 0 175 225 21 59 241 89 0 0 0 59 241 89 59 241 89 0 +0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 89 247 +34 0 7 206 125 0 12 232 89 0 0 0 0 59 241 89 0 12 232 89 0 0 0 127 0 7 +206 166 175 166 0 0 0 7 206 166 175 166 0 0 0 7 206 166 175 166 0 0 0 7 +206 166 175 166 0 0 0 7 206 166 175 166 0 0 0 0 175 166 175 166 0 0 0 0 +138 225 21 89 225 21 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 0 59 241 +89 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 59 241 +89 0 0 59 241 89 0 0 59 241 89 0 7 206 166 0 0 0 59 245 125 59 241 132 +241 89 0 59 241 89 0 12 235 166 0 0 0 89 247 34 12 235 166 0 0 0 89 247 +34 0 12 235 166 0 0 0 89 247 34 12 235 166 0 0 0 89 247 34 12 235 166 0 +0 0 89 247 34 0 0 12 235 125 0 12 235 125 0 0 59 241 89 0 0 138 176 235 +166 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 +59 241 89 59 241 89 0 0 0 59 241 89 0 175 201 0 138 225 21 0 12 235 255 +255 255 225 21 59 238 34 0 138 225 21 0 0 0 127 0 59 238 34 89 247 34 0 +0 59 238 34 89 247 34 0 0 59 238 34 89 247 34 0 0 59 238 34 89 247 34 0 +0 59 238 34 89 247 34 0 0 59 241 89 89 225 21 0 0 7 206 125 0 89 225 21 +0 0 0 0 138 225 21 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 +89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 +0 59 241 89 0 7 206 166 0 0 0 7 206 166 59 241 89 138 225 21 59 241 89 +0 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 59 241 89 0 0 0 +59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 0 0 12 +235 138 235 125 0 0 0 138 225 21 0 59 215 21 175 201 59 241 89 0 0 0 59 +241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 +0 0 59 241 89 0 59 245 166 241 89 0 0 12 232 89 0 0 175 225 59 238 47 235 +225 21 0 0 0 0 127 0 138 201 0 12 235 125 0 0 138 201 0 12 235 125 0 0 +138 201 0 12 235 125 0 0 138 201 0 12 235 125 0 0 138 201 0 12 235 125 +0 0 138 225 21 12 235 125 0 0 89 247 34 0 89 255 255 255 255 251 89 138 +225 21 0 0 0 0 0 59 245 255 255 255 255 127 59 245 255 255 255 255 166 +0 59 245 255 255 255 255 127 59 245 255 255 255 255 127 0 59 241 89 0 0 +59 241 89 0 0 59 241 89 0 0 59 241 89 7 206 255 255 255 166 0 0 175 201 +59 241 89 12 235 125 59 241 89 0 59 241 89 0 0 0 12 235 125 59 241 89 0 +0 0 12 235 125 0 59 241 89 0 0 0 12 235 125 59 241 89 0 0 0 12 235 125 +59 241 89 0 0 0 12 235 125 0 0 0 0 12 235 125 0 0 0 0 138 225 21 7 199 +34 0 138 225 81 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 +89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 0 138 255 166 0 0 0 12 232 +89 0 0 89 247 59 238 34 0 59 245 125 0 0 0 127 7 206 125 0 0 175 201 0 +7 206 125 0 0 175 201 0 7 206 125 0 0 175 201 0 7 206 125 0 0 175 201 0 +7 206 125 0 0 175 201 0 7 206 125 0 0 175 201 0 7 206 255 255 255 255 225 +21 0 0 0 0 138 225 21 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 +241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 +0 0 59 241 89 0 7 206 166 0 0 0 7 206 166 59 241 89 0 89 247 94 241 89 +0 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 59 241 89 0 0 0 +59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 0 0 12 +235 138 235 125 0 0 0 138 225 21 175 125 0 0 175 201 59 241 89 0 0 0 59 +241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 +0 0 59 241 89 0 0 59 241 89 0 0 0 12 232 89 0 7 206 201 59 238 34 0 0 138 +201 0 0 0 127 59 245 255 255 255 255 247 34 59 245 255 255 255 255 247 +34 59 245 255 255 255 255 247 34 59 245 255 255 255 255 247 34 59 245 255 +255 255 255 247 34 59 245 255 255 255 255 247 34 59 241 89 0 0 89 225 21 +0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 +89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 +0 59 241 89 0 7 206 166 0 0 0 59 241 89 59 241 89 0 7 206 200 241 89 0 +12 235 166 0 0 0 89 247 34 12 235 166 0 0 0 89 247 34 0 12 235 166 0 0 +0 89 247 34 12 235 166 0 0 0 89 247 34 12 235 166 0 0 0 89 247 34 0 0 12 +235 125 0 12 235 125 0 0 59 241 159 166 0 0 12 235 166 12 232 89 0 0 0 +59 238 34 12 232 89 0 0 0 59 238 34 12 232 89 0 0 0 59 238 34 12 232 89 +0 0 0 59 238 34 0 0 59 241 89 0 0 0 12 235 255 255 255 201 0 59 238 34 +0 0 138 201 0 0 0 127 138 201 0 0 0 12 235 125 138 201 0 0 0 12 235 125 +138 201 0 0 0 12 235 125 138 201 0 0 0 12 235 125 138 201 0 0 0 12 235 +125 138 201 0 0 0 12 235 125 175 201 0 0 0 89 225 21 0 0 0 0 0 175 247 +34 0 0 59 192 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 0 59 +241 89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 +7 206 166 0 0 59 245 201 0 59 241 89 0 0 59 245 251 89 0 0 138 251 89 0 +59 245 166 0 0 138 251 89 0 59 245 166 0 0 0 138 251 89 0 59 245 166 0 +0 138 251 89 0 59 245 166 0 0 138 251 89 0 59 245 166 0 0 0 138 166 0 0 +0 12 228 34 0 0 175 247 34 0 7 206 225 21 0 138 225 21 0 7 206 166 0 0 +138 225 21 0 7 206 166 0 0 138 225 21 0 7 206 166 0 0 138 225 21 0 7 206 +166 0 0 0 59 241 89 0 0 0 12 232 89 0 0 0 0 59 238 34 0 12 235 125 0 0 +0 127 206 125 0 0 0 0 175 206 206 125 0 0 0 0 175 206 206 125 0 0 0 0 175 +206 206 125 0 0 0 0 175 206 206 125 0 0 0 0 175 206 206 125 0 0 0 0 175 +232 245 125 0 0 0 89 255 255 255 255 255 166 0 0 138 255 255 255 251 89 +59 245 255 255 255 255 127 81 245 255 255 255 255 225 21 59 245 255 255 +255 255 127 81 245 255 255 255 255 127 111 255 255 255 125 89 255 255 255 +125 89 255 255 255 125 89 255 255 255 125 7 206 255 255 255 255 125 0 0 +59 241 89 0 0 0 175 251 89 0 0 0 138 255 255 255 166 0 0 0 0 138 255 255 +255 166 0 0 0 0 0 138 255 255 255 166 0 0 0 0 138 255 255 255 166 0 0 0 +0 138 255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 194 255 255 255 201 +0 0 0 0 59 245 255 251 89 0 0 0 0 59 245 255 251 89 0 0 0 0 59 245 255 +251 89 0 0 0 0 59 245 255 251 89 0 0 0 0 59 241 89 0 0 0 12 232 89 0 0 +0 0 59 238 47 235 255 166 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 166 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 0 +0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 201 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 7 206 +225 21 0 0 0 0 0 12 235 201 0 0 0 138 255 201 0 0 0 59 245 225 29 202 89 +0 0 0 0 0 0 0 0 138 166 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7 206 225 21 0 0 0 0 0 12 235 201 0 0 0 89 255 225 21 0 0 0 0 0 0 0 0 175 +247 34 0 12 235 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 59 245 225 29 202 89 +0 0 138 251 89 0 0 0 0 0 7 206 225 21 0 0 0 89 255 225 21 0 0 59 245 225 +29 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 225 +21 0 0 0 0 0 89 255 125 0 0 0 89 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 138 +251 89 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 175 +166 0 0 0 0 7 206 166 0 0 0 89 225 21 175 201 0 7 202 89 138 255 166 0 +0 89 247 34 175 166 0 0 138 166 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 7 206 166 0 0 0 0 0 175 166 0 0 0 89 247 34 138 201 0 0 89 247 +34 175 201 0 0 138 201 0 175 200 215 34 235 247 47 232 0 138 255 225 111 +225 21 0 0 172 89 138 255 166 0 0 0 0 89 225 21 0 0 0 0 175 201 0 0 0 0 +89 247 34 138 201 0 0 172 89 138 255 166 0 0 59 238 34 138 201 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 0 0 0 0 59 241 89 0 0 0 89 +247 34 138 201 0 0 0 59 238 34 138 201 0 0 0 89 247 34 0 0 59 238 34 0 +0 0 0 0 138 225 29 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 201 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 225 21 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 12 235 166 0 0 0 0 0 0 0 0 89 166 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 7 206 255 255 255 125 0 7 206 255 255 255 +125 0 7 206 255 255 255 125 0 7 206 255 255 255 125 0 7 206 255 255 255 +125 0 12 235 255 255 251 89 0 12 235 255 255 251 89 59 245 255 166 0 0 +59 245 255 255 201 0 12 235 255 251 89 0 0 12 235 255 251 89 0 0 12 235 +255 251 89 0 0 12 235 255 251 89 0 59 238 34 59 238 34 59 238 34 59 238 +34 0 59 241 89 175 225 21 0 59 241 194 255 255 125 0 0 12 235 255 247 34 +0 0 12 235 255 247 34 0 0 0 12 235 255 247 34 0 0 12 235 255 247 34 0 0 +12 235 255 247 34 0 0 0 0 0 12 235 166 0 0 0 0 7 206 255 255 225 21 0 59 +241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 +89 0 59 241 97 206 166 0 0 12 235 125 59 238 163 255 255 201 7 206 166 +0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 89 247 34 0 0 0 0 89 247 +34 0 0 0 0 89 247 34 0 0 0 0 89 247 34 0 0 0 0 89 247 34 0 0 0 0 138 225 +21 0 0 0 0 89 255 225 21 0 138 201 59 245 125 0 0 0 7 206 125 0 89 225 +21 7 206 125 0 89 225 21 7 206 125 0 89 225 21 7 206 125 0 89 225 21 59 +238 34 59 238 34 59 238 34 59 238 34 0 0 0 0 12 235 125 0 59 245 166 0 +89 247 34 7 206 166 0 138 225 21 7 206 166 0 138 225 21 0 7 206 166 0 138 +225 21 7 206 166 0 138 225 21 7 206 166 0 138 225 21 0 0 0 0 0 0 0 0 0 +0 12 232 89 0 138 251 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 +59 241 89 0 59 241 89 0 59 241 89 0 59 241 89 89 247 34 0 89 247 34 59 +245 166 0 7 206 166 89 247 34 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +59 241 89 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 +59 241 89 0 0 0 0 59 238 34 0 0 0 0 12 232 89 0 0 59 238 127 225 21 0 0 +0 59 238 34 0 59 238 34 59 238 34 0 59 238 34 59 238 34 0 59 238 34 59 +238 34 0 59 238 34 59 238 34 59 238 34 59 238 34 59 238 34 0 138 255 255 +255 255 201 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 +241 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 +89 0 12 235 255 255 255 255 255 255 166 138 201 0 59 157 175 201 0 59 241 +89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 +0 59 241 89 12 235 125 0 175 166 0 59 238 34 0 0 138 225 34 235 125 0 175 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 89 255 255 255 251 89 0 89 255 255 255 251 +89 0 89 255 255 255 251 89 0 89 255 255 255 251 89 0 89 255 255 255 251 +89 0 138 255 255 255 247 34 0 175 255 255 255 255 255 255 255 255 251 127 +201 0 0 0 0 59 245 255 255 255 251 89 59 245 255 255 255 251 89 59 245 +255 255 255 251 89 59 245 255 255 255 251 89 59 238 34 59 238 34 59 238 +34 59 238 34 138 247 34 0 0 138 201 0 59 241 89 0 59 241 89 59 238 34 0 +12 232 89 59 238 34 0 12 232 89 0 59 238 34 0 12 232 89 59 238 34 0 12 +232 89 59 238 34 0 12 232 89 0 0 0 0 0 0 0 0 0 0 175 201 7 176 21 138 201 +0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 +241 89 0 59 241 89 0 175 201 12 232 89 0 59 238 34 0 0 138 225 21 175 201 +12 232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 59 241 89 0 59 241 89 59 241 89 0 59 +241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 +138 247 34 0 59 238 34 138 225 21 0 12 232 89 0 0 0 0 138 201 0 0 0 0 59 +238 34 0 0 0 0 59 238 34 0 0 0 0 59 238 34 0 0 0 0 59 238 34 0 0 0 0 59 +238 34 59 238 34 59 238 34 59 238 34 175 201 0 0 0 138 166 0 59 241 89 +0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 0 59 +241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 0 0 0 12 235 166 0 +0 0 138 201 134 89 0 175 166 0 59 241 89 0 59 241 89 59 241 89 0 59 241 +89 59 241 89 0 59 241 89 0 59 241 89 0 59 241 89 0 89 247 124 225 21 0 +59 238 34 0 0 138 201 0 89 247 124 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 89 247 +34 0 89 251 89 89 247 34 0 89 251 89 89 247 34 0 89 251 89 89 247 34 0 +89 251 89 89 247 34 0 89 251 89 175 201 0 0 175 247 34 175 201 0 0 59 245 +225 21 0 7 199 94 245 125 0 0 0 7 206 166 0 7 199 34 7 206 166 0 7 199 +34 7 206 166 0 7 199 34 7 206 166 0 7 199 34 59 238 34 59 238 34 59 238 +34 59 238 34 138 247 34 0 12 232 89 0 59 241 89 0 59 241 89 7 206 166 0 +138 225 21 7 206 166 0 138 225 21 0 7 206 166 0 138 225 21 7 206 166 0 +138 225 21 7 206 166 0 138 225 21 0 0 0 0 12 235 166 0 0 0 59 245 166 0 +59 241 89 0 12 235 125 0 175 251 89 12 235 125 0 175 251 89 12 235 125 +0 175 251 89 0 12 235 125 0 175 251 89 0 7 206 255 125 0 0 59 238 34 0 +12 235 125 0 7 206 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 175 255 255 232 +241 89 0 175 255 255 232 241 89 0 175 255 255 232 241 89 0 175 255 255 +232 241 89 0 175 255 255 232 241 89 12 235 255 255 166 238 34 12 235 255 +255 225 21 89 255 255 251 89 0 89 255 255 255 201 0 12 235 255 251 89 0 +0 12 235 255 251 89 0 0 12 235 255 251 89 0 0 12 235 255 251 89 0 59 238 +34 59 238 34 59 238 34 59 238 34 0 138 255 255 255 125 0 0 59 241 89 0 +59 241 89 0 12 235 255 247 34 0 0 12 235 255 247 34 0 0 0 12 235 255 247 +34 0 0 12 235 255 247 34 0 0 12 235 255 247 34 0 0 0 0 0 0 0 0 0 0 0 7 +206 255 255 225 21 0 0 0 89 255 255 166 241 89 0 89 255 255 166 241 89 +0 89 255 255 166 241 89 0 0 89 255 255 166 241 89 0 0 138 247 34 0 0 59 +245 166 255 255 166 0 0 0 138 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 215 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 59 238 34 0 0 0 0 0 +12 232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 12 235 255 125 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 138 225 21 0 0 0 59 238 34 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 0 127 127 0 127 127 +0 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/AntTweakBar/src/res/FontSmall.pgm b/AntTweakBar/src/res/FontSmall.pgm new file mode 100644 index 0000000..1e21a3b --- /dev/null +++ b/AntTweakBar/src/res/FontSmall.pgm @@ -0,0 +1,603 @@ +P2 +# Created by Paint Shop Pro +211 84 +255 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 255 0 255 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 0 0 255 255 0 0 +0 255 0 0 0 0 255 255 0 0 0 255 0 0 255 0 0 255 0 0 255 0 255 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 0 255 0 0 255 255 +255 0 0 255 255 255 0 0 0 0 0 255 0 255 255 255 255 0 0 255 255 0 0 255 +255 255 255 0 0 255 255 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 0 0 0 255 0 255 0 255 0 0 0 255 0 0 255 0 0 255 255 255 255 +0 255 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 255 0 0 255 +255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 +255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 255 0 255 0 0 0 0 255 0 0 0 0 0 +0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 255 0 0 0 0 0 0 255 255 255 255 255 255 255 0 255 0 0 0 255 0 0 +255 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 255 0 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 +0 0 255 0 0 0 0 255 0 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 +255 0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 255 255 0 0 0 0 0 0 +0 0 0 255 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 255 0 0 0 0 0 0 0 255 0 255 0 0 0 255 255 0 0 0 0 255 255 0 +255 0 255 255 0 0 0 255 255 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 +0 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 0 0 255 0 0 0 255 255 0 0 255 0 0 255 0 255 255 255 0 0 255 255 255 +0 0 0 0 255 0 0 0 255 255 0 0 0 255 255 255 0 0 255 0 0 255 0 0 0 255 255 +0 0 0 255 255 255 255 255 255 0 0 0 0 255 255 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 255 0 0 0 0 0 255 255 255 255 255 +255 0 0 0 255 255 0 0 0 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 255 0 0 0 0 0 255 0 +0 255 0 0 255 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 255 255 255 255 255 0 +0 0 255 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 255 0 0 255 0 255 0 0 255 255 0 0 0 255 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 255 0 +0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 +0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 0 0 0 255 255 +0 0 0 255 255 255 255 255 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 255 +255 255 255 0 0 0 0 255 0 0 0 255 255 0 0 0 255 255 0 0 255 0 0 255 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 255 +255 0 0 255 255 255 0 255 255 255 255 0 255 255 255 0 0 0 0 0 255 0 255 +255 255 0 0 0 255 255 0 0 255 0 0 0 0 0 255 255 0 0 0 255 255 0 0 0 255 +0 0 255 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 0 127 0 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 0 127 0 127 127 0 127 127 127 0 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 0 127 127 127 0 127 0 127 +127 127 0 127 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 127 0 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 255 0 0 0 255 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 255 255 255 0 0 0 0 0 +255 255 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 255 255 255 255 0 0 +0 255 255 255 255 255 0 255 255 255 255 255 0 0 0 255 255 255 0 0 255 0 +0 0 0 255 0 255 255 255 0 0 255 255 0 255 0 0 0 255 0 255 0 0 0 255 255 +0 0 0 255 255 0 255 0 0 0 0 255 0 0 0 255 255 255 0 0 0 255 255 255 255 +0 0 0 0 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 255 255 +255 255 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 255 0 0 255 0 +255 0 0 255 0 255 0 0 0 255 0 255 255 255 255 0 255 0 0 255 0 0 0 0 255 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 0 +0 0 255 0 0 0 0 255 255 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 255 0 0 +0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 +0 0 255 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 0 255 255 0 0 0 255 255 0 +255 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 +0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 255 +0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 255 0 0 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 +0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 255 0 255 0 0 0 255 0 0 +0 255 0 255 0 255 0 255 0 255 0 255 0 0 255 0 255 0 0 0 0 0 255 0 255 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 255 0 255 0 255 0 0 255 255 +0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 255 0 255 +0 0 255 0 0 255 0 0 255 255 255 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 +0 255 255 255 255 0 0 255 255 255 255 0 0 255 0 0 255 255 255 0 255 255 +255 255 255 255 0 0 255 0 0 0 0 255 0 255 255 0 0 0 0 255 0 0 0 255 0 255 +0 255 0 255 0 255 0 0 255 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 255 255 255 0 0 0 255 255 255 0 0 0 0 255 0 0 0 255 +0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 255 0 255 0 255 0 0 255 255 0 0 0 +0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 255 0 255 0 255 255 255 +255 255 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 +0 255 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 255 0 255 0 0 0 255 255 0 255 +0 0 0 0 0 255 0 255 255 255 255 0 0 255 0 0 0 0 0 255 0 255 0 255 0 0 0 +0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 255 +0 255 0 255 0 0 255 255 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 +0 0 255 255 255 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 0 255 0 +255 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 +0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 +255 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 0 0 255 +0 0 255 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 +255 0 0 0 0 255 0 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 255 255 255 0 0 0 0 255 +255 255 0 0 255 255 255 255 0 0 0 255 255 255 255 255 0 255 0 0 0 0 0 0 +0 255 255 255 255 0 255 0 0 0 0 255 0 255 255 255 0 255 255 0 0 255 0 0 +0 255 0 255 255 255 255 255 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 255 +255 0 0 0 255 0 0 0 0 0 0 0 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 +255 0 0 0 0 255 0 0 0 0 255 255 255 255 0 0 0 0 255 255 0 0 0 0 255 0 0 +0 255 0 0 255 0 0 255 0 0 0 255 0 0 0 255 255 255 255 0 255 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +0 0 0 0 0 255 255 0 0 0 0 0 0 0 255 255 255 255 255 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 +127 127 127 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 127 +0 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 +127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 0 127 +127 0 127 127 127 0 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 +255 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 4 4 +4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 4 4 4 4 12 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 255 255 0 0 255 255 255 0 0 0 255 255 0 0 255 255 255 0 0 +255 255 0 0 255 255 255 0 255 255 255 0 255 255 255 0 0 255 0 255 255 0 +255 0 0 255 0 255 0 255 255 255 0 255 255 0 0 255 255 255 0 0 0 255 255 +0 0 255 255 255 0 0 0 255 255 255 0 255 0 255 255 255 255 0 255 255 0 255 +0 0 255 0 255 0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 255 0 255 0 0 0 255 +0 255 255 255 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 4 4 4 4 0 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +255 0 255 0 0 255 0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 +0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 255 0 0 255 0 255 0 0 255 0 0 +255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 255 0 +255 0 0 0 255 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 0 +255 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 255 +0 0 255 0 0 255 4 4 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 0 0 0 0 255 255 255 0 255 0 0 255 0 255 0 0 0 255 0 0 255 0 +255 255 255 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 +255 0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 +0 255 0 255 0 0 255 0 255 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 255 +0 0 255 0 255 0 255 0 255 0 0 255 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 +0 0 255 0 0 0 0 255 0 255 0 0 255 255 0 0 0 255 255 4 255 255 0 4 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 255 0 0 255 0 255 0 +0 255 0 255 0 0 0 255 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 255 0 255 0 +0 255 0 255 0 0 255 0 255 0 255 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 +255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 +0 255 0 0 255 0 0 255 0 255 0 0 0 255 255 0 255 255 0 0 0 255 0 0 0 255 +0 255 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 255 255 255 0 255 255 255 0 0 0 255 255 0 0 255 255 255 0 0 255 255 255 +0 255 0 0 0 255 255 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 +0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 255 255 0 0 255 255 255 0 0 0 255 +255 255 0 255 0 0 255 255 255 0 0 255 0 0 255 255 255 0 0 0 255 0 0 0 0 +255 0 0 0 255 0 0 255 0 255 0 0 0 255 0 0 0 255 255 255 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 20 0 255 0 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 0 127 127 127 127 0 +127 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 0 127 127 0 127 127 127 127 +0 127 0 127 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 0 127 127 0 127 127 127 0 127 127 0 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 0 127 127 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 +0 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +255 255 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +0 255 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 255 255 255 0 0 255 255 255 255 255 255 255 0 0 0 0 0 0 255 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 255 255 0 0 +0 255 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 255 255 255 255 255 255 +0 0 255 255 255 255 255 255 255 0 255 255 255 255 0 0 255 255 255 255 255 +255 255 0 0 255 255 255 255 255 255 255 0 255 0 0 255 255 0 255 0 0 255 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 255 255 255 255 0 255 +0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 +0 255 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 255 255 255 255 0 255 255 255 255 255 0 0 0 0 0 0 255 0 0 255 0 255 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 255 +0 0 255 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +255 255 255 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 255 0 255 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 +0 255 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 255 0 +255 255 255 0 255 0 0 0 255 255 0 255 255 0 0 0 255 0 0 0 0 0 255 0 255 +255 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 255 255 255 255 255 0 0 0 0 0 0 0 255 255 0 255 0 255 +255 0 255 255 0 0 0 255 255 255 0 0 255 0 0 255 0 0 0 255 255 255 255 0 +0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 +0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 255 255 255 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 255 +0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 +0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 255 255 0 255 255 255 255 0 255 255 255 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 255 255 +255 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 +0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 0 255 0 0 0 255 +0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 255 255 255 0 0 255 255 255 255 255 255 255 0 0 255 +0 255 0 0 0 0 255 0 255 0 255 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 0 255 255 0 255 255 0 0 255 255 255 255 0 0 0 0 0 0 255 +255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 0 255 255 255 255 +0 0 255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 255 255 0 0 0 0 0 255 255 0 255 255 255 0 0 255 255 255 255 255 +255 255 0 255 255 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 255 0 0 0 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 +127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 0 127 0 127 +127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +0 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 0 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 255 0 0 0 0 0 0 0 255 0 +0 0 255 0 255 0 0 255 255 255 0 0 255 0 255 0 0 0 255 255 255 255 0 0 255 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 255 255 255 0 255 255 255 0 0 255 0 0 0 0 0 0 +0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 0 0 0 0 0 0 255 +0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 255 255 255 0 0 255 0 0 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 +0 255 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 255 +0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 0 255 +0 0 0 0 0 0 0 0 0 0 255 255 0 255 0 0 255 0 0 0 0 0 0 255 255 0 255 0 0 +0 0 0 255 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 255 0 0 255 255 255 0 0 255 0 0 0 0 255 255 255 0 0 0 255 +0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 255 255 0 255 +0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 255 255 255 0 0 255 0 0 0 0 0 +0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 255 +255 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 255 0 255 0 255 0 0 0 255 +0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 255 0 255 0 255 0 0 255 255 255 0 0 0 255 0 255 +0 0 0 0 255 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 +255 255 0 255 0 255 0 0 0 255 255 255 255 255 0 0 0 0 255 0 255 0 0 255 +0 255 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 0 0 255 255 255 0 255 255 +0 0 0 0 0 0 255 0 0 255 0 255 255 0 255 0 0 255 0 0 0 0 0 0 0 255 255 255 +0 255 255 0 0 0 255 0 255 0 0 255 255 0 0 255 255 0 0 0 255 0 255 0 255 +255 0 0 255 255 0 255 0 255 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +255 0 255 0 255 0 0 0 255 0 0 0 0 255 255 255 0 0 0 255 255 255 0 0 0 0 +255 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 +0 0 0 255 0 255 255 0 255 0 255 255 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 255 0 255 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 255 0 255 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 255 0 255 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +255 255 255 0 0 0 0 0 0 255 0 0 255 255 0 0 255 0 0 0 0 0 255 0 255 0 0 +0 0 0 0 255 0 0 0 0 255 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 255 255 255 255 0 0 0 255 +0 0 0 255 0 0 0 0 255 0 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 255 0 0 255 255 255 0 255 255 255 255 0 0 0 0 0 0 0 0 0 255 0 0 0 +255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 255 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 255 +255 0 0 255 0 0 0 0 255 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 +0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 127 127 127 0 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 0 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 0 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 +127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 0 255 255 0 0 0 255 0 0 255 +0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 0 255 +0 255 0 0 0 0 0 0 0 0 0 255 0 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 255 0 0 0 0 255 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 255 +0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 127 0 0 255 255 +0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 +0 0 0 0 0 255 255 0 0 0 0 0 255 255 255 255 255 0 0 0 255 255 255 0 0 255 +255 255 255 255 0 255 255 255 255 255 0 255 255 255 255 255 0 255 255 255 +255 255 0 255 255 255 0 255 255 255 0 255 255 255 0 255 255 255 0 255 255 +255 255 0 0 0 255 0 0 0 0 255 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 +0 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 +0 0 0 0 0 0 0 0 255 255 255 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 +255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 +255 0 127 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 +255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 255 0 255 0 0 0 0 0 255 +0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 255 0 0 0 255 0 +0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 +255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 255 0 0 0 +0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 +0 0 255 255 255 0 0 255 0 0 255 0 127 0 255 0 0 255 0 0 0 255 0 0 255 0 +0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 +0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 +0 255 0 255 0 255 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 +0 255 0 0 0 255 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 255 0 255 0 0 127 +0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 +0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 0 0 +0 0 0 255 255 255 255 0 0 255 255 255 255 0 0 255 255 255 255 0 0 255 255 +255 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 255 255 0 0 255 +0 255 0 0 255 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 255 0 255 0 0 255 +0 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 +255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 127 255 255 +255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 255 255 255 0 255 +255 255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 255 255 255 +0 0 255 255 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 +0 0 255 0 255 0 0 0 255 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 +255 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 127 255 0 +0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 255 +0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 +0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 255 +255 0 0 255 0 0 255 0 127 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 +0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 255 +255 255 255 0 0 0 255 255 255 0 0 255 255 255 255 255 0 255 255 255 255 +255 0 255 255 255 255 255 0 255 255 255 255 255 0 255 255 255 0 255 255 +255 0 255 255 255 0 255 255 255 0 255 255 255 255 0 0 0 255 0 0 0 0 255 +0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 +255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 255 0 0 0 255 0 255 0 255 255 +255 0 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 +0 0 0 255 255 255 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +0 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 255 255 0 255 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 +0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 255 255 0 255 +0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 255 +0 0 0 0 255 0 0 0 255 0 255 0 255 0 255 255 0 0 255 0 255 0 0 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 255 0 0 255 0 +255 0 0 255 0 255 0 255 0 255 255 0 255 0 0 255 255 0 255 0 255 255 0 0 +0 255 0 0 0 0 255 0 0 0 255 0 255 0 255 0 255 255 0 255 0 0 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 255 0 0 255 0 255 0 +0 0 255 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 +255 0 0 0 255 255 0 0 255 255 255 0 255 255 0 0 0 255 255 0 0 255 255 0 +0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 0 255 0 0 255 0 0 255 +0 0 0 0 255 0 255 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 +0 255 255 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 255 0 0 255 +0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 0 255 0 255 255 255 +0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 0 0 0 +0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 255 +0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 255 +0 255 0 0 255 0 0 255 0 0 255 255 255 0 255 0 0 255 0 255 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 255 255 255 255 255 +0 255 0 0 255 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 +0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 +0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 255 255 255 0 255 0 0 0 +255 255 255 255 0 255 255 255 255 0 255 255 255 255 0 255 255 255 255 0 +0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 +255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 255 +0 255 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 +255 0 255 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 +255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 +0 255 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 +0 255 0 0 0 0 255 0 0 0 255 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 255 0 0 255 255 255 0 0 255 +255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 0 255 +255 255 0 0 255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 +255 255 255 0 0 255 0 255 0 0 255 0 0 255 0 0 255 255 0 0 255 0 0 255 0 +0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 +0 0 0 0 0 0 0 255 255 255 0 0 0 255 255 255 0 0 255 255 255 0 0 255 255 +255 0 0 255 255 255 0 0 0 255 0 0 0 255 255 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 0 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 127 0 +127 127 127 127 0 127 127 127 127 0 127 127 0 127 0 127 127 0 127 127 0 +127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 +127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/AntTweakBar/src/res/TwXCursors.h b/AntTweakBar/src/res/TwXCursors.h new file mode 100644 index 0000000..c9ca9db --- /dev/null +++ b/AntTweakBar/src/res/TwXCursors.h @@ -0,0 +1,908 @@ +// --------------------------------------------------------------------------- +// +// @file TwXCursors.h +// @brief Bitmaps data for cursors +// @author Philippe Decaudin +// @license This file is part of the AntTweakBar library. +// For conditions of distribution and use, see License.txt +// +// note: Private header +// +// --------------------------------------------------------------------------- + + +static int g_CurHot[][2] = +{ + {16, 15}, // curs00 + {16, 15}, // curs01 + {16, 15}, // curs02 + {16, 15}, // curs03 + {16, 15}, // curs04 + {16, 15}, // curs05 + {16, 15}, // curs06 + {16, 15}, // curs07 + {16, 15}, // curs08 + {16, 15}, // curs09 + {16, 15}, // curs10 + {16, 15}, // curs11 + {16, 15}, // curs12 + {16, 15} // curs13 +}; + + +static bool g_CurPict[][32*32] = +{ + { // curs00 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs01 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs02 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs03 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs04 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs05 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs06 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs07 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs08 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs09 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs11 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs12 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs13 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } +}; + + +static bool g_CurMask[][32*32] = +{ + { // mask00 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask01 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask02 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask03 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask04 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask05 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask06 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask07 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask08 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask09 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }, + { // mask10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask11 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask12 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask13 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } +}; diff --git a/AntTweakBar/src/res/cur00000.cur b/AntTweakBar/src/res/cur00000.cur new file mode 100644 index 0000000000000000000000000000000000000000..46c0fbcfe06a5e9a43bf303352a79c5fa5069632 GIT binary patch literal 326 zcmaJ*F%E)25S#-O8>3Xl3a+%Yv>*{*1~K-&$@mfc0i^|DoPmN0<}$mtyEA(SBnXHR z$Z)_V07n34Q7u$r&@q}ZP9ae;4U*GkEv7B7JL!>)7Ry;_=lu;lVuNQk)3y7aTW7s} usr)O@AC}PTl>B_j*N-gvnt53dWqup3`Q;`Hp$Fjr9T<^{F#m@Egrn!!mi=v@fJ55? zH7YzEa0BolEFludC+oA{T)|Js%xnwfFQg)60%E?|y1dMx3(44yk>$5hQ z=MsPOj6DnbHb_=8A4Ue~O5A}pEZ%Sj2Q~CCz>_^6GaY@SIu)v8rTRq|Vt=9MlaK1} TMcFlsp@O5+afde=J`bg18WxrOV!+9<0zpJy?4JuTZFWD1v01v_xF?hxh+y7Bc~h z!F$L#QW`h|H$_L>6{9bzU3@jG5s4C!wQTeZ$_pGy(`Q%fuct@;a&_U{K6hBJ2m9Y9 zr!CPyNImAi^bec#7I}^$-5@e_p&I+Th}X;ryQyWGKgBGeT6Rt937SA6&0;2f0WoNE Ao&W#< literal 0 HcmV?d00001 diff --git a/AntTweakBar/src/res/cur00005.cur b/AntTweakBar/src/res/cur00005.cur new file mode 100644 index 0000000000000000000000000000000000000000..8e2142ebc032dab4efdb8fee230c16ed760634b5 GIT binary patch literal 326 zcmZvWJr06E6oh91!&WXfwrpu>X$QxmFpQ8&r=zS)?&Ah~%{V@wl0KsctKg)Ur}|v1wq}9yZBFPDy5M zbg`pV&bB4|lm3yE{1C9vc?M>iQ RFjn&{?qXK!$S>cF`~Y7~a!&vN literal 0 HcmV?d00001 diff --git a/AntTweakBar/src/res/cur00006.cur b/AntTweakBar/src/res/cur00006.cur new file mode 100644 index 0000000000000000000000000000000000000000..02f5aad32e222c0986d3ee0fece0715a47be991d GIT binary patch literal 326 zcmY+8%?ZLl5QX2y9C8qnlL!jgqenZ?UaY_h60iVUu#^Q4mSJEk2wrj!pKn}4^ex}~ zF*7?r1_$qf3MIAE~rDN!B)jT>4v0-Tqi=q*pl%it~&4_j)~Z-HW)kdS(8IKVfjlr V&*CQHo$QsUDXhONYYjI1(Ho$ebOHbX literal 0 HcmV?d00001 diff --git a/AntTweakBar/src/res/cur00007.cur b/AntTweakBar/src/res/cur00007.cur new file mode 100644 index 0000000000000000000000000000000000000000..59d9b7d6d2ba6411ee1c0ea3859799c4cfb249dd GIT binary patch literal 326 zcmZ9GI}(CG5JY>>&~h;`Az%XoLvJ7fhcZ$!uHrE~%HDv~fTHbLRH~S*H=nMl-T?|2 zVgyPATnsn@I15Q=gz0&7InSw3aXd)Qjk3wbaD&+sA)VB>qRGq-owmN%OC}N6mJ2?+ z{@eN2Mw-)RU&tT&$FKI#4ICeX=sDguOgphRrf`r}iCX%VoK}oA`3?&{uXlW=bXM6f M`^uk_U@r!K09kNuLI3~& literal 0 HcmV?d00001 diff --git a/AntTweakBar/src/res/cur00008.cur b/AntTweakBar/src/res/cur00008.cur new file mode 100644 index 0000000000000000000000000000000000000000..0785b19f11f97f0211bd1e4e2158d3e6199bfdc6 GIT binary patch literal 326 zcmYk1O^U)m5QSg2E?fw4CBg{Fa+cmeujC05m;-o)IZA^Ik72+Q$ZWC@pI=1-Q_WYe zew%J7E2(Lul`8F$w3hS@lyrc^3F}7xb{Pr6Y`=r>QzNuKcjUct`c=-2G=~L^6%eML zd2~)b5&5i87d5Gc&~YtR<6*%UEa79k!5;omwyn#icG*@Q9x%ZDWZ$m#g+an+Wj|{6 b(1|hMk9XmL~W_ZJxC&i7gT(sSD4!I2*~&oxks|5tun;rX?Ixl6gj2WK~*V zhhYh$J=o&%bOU{0VB)^s-sO*^w)$|+r8nPwo&49W=}Aq{y$ou(upXHF$|^paNQZ^A TlWvZ+V_kJL&dtPI?7w;d-B)kB literal 0 HcmV?d00001 diff --git a/AntTweakBar/src/res/cur00010.cur b/AntTweakBar/src/res/cur00010.cur new file mode 100644 index 0000000000000000000000000000000000000000..bb8b5f0a6d2026a8353572b98ce08569aba3d0fa GIT binary patch literal 326 zcmah@OA5j;5PcJ+WFZ(3#6_W5y37sg!3r(ZgQY8%UZK$5p$O7(lC)44;tTIH!!Q{@ zfnY6QaD*e^4B#r17H&e47tlmaqQn9Nm^p=SHBv^_z`W+g(#ESFyBTw3 zb4NbA0EY~4Y4E?w4O={Qc3;L84B}A^3q?wg8k$^;G z!0ZLlgA@Js;oUpUiCl^CB&&Z|bU?n1gG|HJUcV(`Qh>blSyE X!^Uv~C%dz1Skin5IWrOpWO2AIOIw@d11#CV34AgR|QWC-tu?l?}R) z3y<0?sg|70hDCG19x3>S-#9ppTc?2<8r4u?P<_peJrT@FH8$U-4InmyE)|nE-1)cF P%=?599m@_^JfQjpiz0Q= literal 0 HcmV?d00001 diff --git a/AntTweakBar/src/res/cur00013.cur b/AntTweakBar/src/res/cur00013.cur new file mode 100644 index 0000000000000000000000000000000000000000..16356062761e23c7b2b3c6c6dd4e5f11ede2cb48 GIT binary patch literal 326 zcmZur!41P85Ho52 +#include +#include + +#include "DDSTextureLoader.h" + +#if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#pragma comment(lib,"dxguid.lib") +#endif + +using namespace DirectX; + +//-------------------------------------------------------------------------------------- +// Macros +//-------------------------------------------------------------------------------------- +#ifndef MAKEFOURCC + #define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \ + ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) +#endif /* defined(MAKEFOURCC) */ + +//-------------------------------------------------------------------------------------- +// DDS file structure definitions +// +// See DDS.h in the 'Texconv' sample and the 'DirectXTex' library +//-------------------------------------------------------------------------------------- +#pragma pack(push,1) + +const uint32_t DDS_MAGIC = 0x20534444; // "DDS " + +struct DDS_PIXELFORMAT +{ + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; +}; + +#define DDS_FOURCC 0x00000004 // DDPF_FOURCC +#define DDS_RGB 0x00000040 // DDPF_RGB +#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE +#define DDS_ALPHA 0x00000002 // DDPF_ALPHA +#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV + +#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH + +#define DDS_HEIGHT 0x00000002 // DDSD_HEIGHT +#define DDS_WIDTH 0x00000004 // DDSD_WIDTH + +#define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +#define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +#define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +#define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +#define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +#define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ + +#define DDS_CUBEMAP_ALLFACES ( DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX |\ + DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY |\ + DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEZ ) + +#define DDS_CUBEMAP 0x00000200 // DDSCAPS2_CUBEMAP + +enum DDS_MISC_FLAGS2 +{ + DDS_MISC_FLAGS2_ALPHA_MODE_MASK = 0x7L, +}; + +struct DDS_HEADER +{ + uint32_t size; + uint32_t flags; + uint32_t height; + uint32_t width; + uint32_t pitchOrLinearSize; + uint32_t depth; // only if DDS_HEADER_FLAGS_VOLUME is set in flags + uint32_t mipMapCount; + uint32_t reserved1[11]; + DDS_PIXELFORMAT ddspf; + uint32_t caps; + uint32_t caps2; + uint32_t caps3; + uint32_t caps4; + uint32_t reserved2; +}; + +struct DDS_HEADER_DXT10 +{ + DXGI_FORMAT dxgiFormat; + uint32_t resourceDimension; + uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG + uint32_t arraySize; + uint32_t miscFlags2; +}; + +#pragma pack(pop) + +//-------------------------------------------------------------------------------------- +namespace +{ + +struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } }; + +typedef public std::unique_ptr ScopedHandle; + +inline HANDLE safe_handle( HANDLE h ) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; } + +template +inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_ const char (&name)[TNameLength]) +{ +#if defined(_DEBUG) || defined(PROFILE) + resource->SetPrivateData(WKPDID_D3DDebugObjectName, TNameLength - 1, name); +#else + UNREFERENCED_PARAMETER(resource); + UNREFERENCED_PARAMETER(name); +#endif +} + +}; + +//-------------------------------------------------------------------------------------- +static HRESULT LoadTextureDataFromFile( _In_z_ const wchar_t* fileName, + std::unique_ptr& ddsData, + DDS_HEADER** header, + uint8_t** bitData, + size_t* bitSize + ) +{ + if (!header || !bitData || !bitSize) + { + return E_POINTER; + } + + // open the file +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + ScopedHandle hFile( safe_handle( CreateFile2( fileName, + GENERIC_READ, + FILE_SHARE_READ, + OPEN_EXISTING, + nullptr ) ) ); +#else + ScopedHandle hFile( safe_handle( CreateFileW( fileName, + GENERIC_READ, + FILE_SHARE_READ, + nullptr, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + nullptr ) ) ); +#endif + + if ( !hFile ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + // Get the file size + LARGE_INTEGER FileSize = { 0 }; + +#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) + FILE_STANDARD_INFO fileInfo; + if ( !GetFileInformationByHandleEx( hFile.get(), FileStandardInfo, &fileInfo, sizeof(fileInfo) ) ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + FileSize = fileInfo.EndOfFile; +#else + GetFileSizeEx( hFile.get(), &FileSize ); +#endif + + // File is too big for 32-bit allocation, so reject read + if (FileSize.HighPart > 0) + { + return E_FAIL; + } + + // Need at least enough data to fill the header and magic number to be a valid DDS + if (FileSize.LowPart < ( sizeof(DDS_HEADER) + sizeof(uint32_t) ) ) + { + return E_FAIL; + } + + // create enough space for the file data + ddsData.reset( new (std::nothrow) uint8_t[ FileSize.LowPart ] ); + if (!ddsData) + { + return E_OUTOFMEMORY; + } + + // read the data in + DWORD BytesRead = 0; + if (!ReadFile( hFile.get(), + ddsData.get(), + FileSize.LowPart, + &BytesRead, + nullptr + )) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + if (BytesRead < FileSize.LowPart) + { + return E_FAIL; + } + + // DDS files always start with the same magic number ("DDS ") + uint32_t dwMagicNumber = *( const uint32_t* )( ddsData.get() ); + if (dwMagicNumber != DDS_MAGIC) + { + return E_FAIL; + } + + auto hdr = reinterpret_cast( ddsData.get() + sizeof( uint32_t ) ); + + // Verify header to validate DDS file + if (hdr->size != sizeof(DDS_HEADER) || + hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) + { + return E_FAIL; + } + + // Check for DX10 extension + bool bDXT10Header = false; + if ((hdr->ddspf.flags & DDS_FOURCC) && + (MAKEFOURCC( 'D', 'X', '1', '0' ) == hdr->ddspf.fourCC)) + { + // Must be long enough for both headers and magic value + if (FileSize.LowPart < ( sizeof(DDS_HEADER) + sizeof(uint32_t) + sizeof(DDS_HEADER_DXT10) ) ) + { + return E_FAIL; + } + + bDXT10Header = true; + } + + // setup the pointers in the process request + *header = hdr; + ptrdiff_t offset = sizeof( uint32_t ) + sizeof( DDS_HEADER ) + + (bDXT10Header ? sizeof( DDS_HEADER_DXT10 ) : 0); + *bitData = ddsData.get() + offset; + *bitSize = FileSize.LowPart - offset; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Return the BPP for a particular format +//-------------------------------------------------------------------------------------- +static size_t BitsPerPixel( _In_ DXGI_FORMAT fmt ) +{ + switch( fmt ) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + return 128; + + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: + return 96; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DXGI_FORMAT_Y416: + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + return 64; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R11G11B10_FLOAT: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DXGI_FORMAT_AYUV: + case DXGI_FORMAT_Y410: + case DXGI_FORMAT_YUY2: + return 32; + + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + return 24; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_A8P8: + case DXGI_FORMAT_B4G4R4A4_UNORM: + return 16; + + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_420_OPAQUE: + case DXGI_FORMAT_NV11: + return 12; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + return 8; + + case DXGI_FORMAT_R1_UNORM: + return 1; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + return 4; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + return 8; + + default: + return 0; + } +} + + +//-------------------------------------------------------------------------------------- +// Get surface information for a particular format +//-------------------------------------------------------------------------------------- +static void GetSurfaceInfo( _In_ size_t width, + _In_ size_t height, + _In_ DXGI_FORMAT fmt, + _Out_opt_ size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows ) +{ + size_t numBytes = 0; + size_t rowBytes = 0; + size_t numRows = 0; + + bool bc = false; + bool packed = false; + bool planar = false; + size_t bpe = 0; + switch (fmt) + { + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + bc=true; + bpe = 8; + break; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + bc = true; + bpe = 16; + break; + + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_YUY2: + packed = true; + bpe = 4; + break; + + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + packed = true; + bpe = 8; + break; + + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_420_OPAQUE: + planar = true; + bpe = 2; + break; + + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + planar = true; + bpe = 4; + break; + } + + if (bc) + { + size_t numBlocksWide = 0; + if (width > 0) + { + numBlocksWide = std::max( 1, (width + 3) / 4 ); + } + size_t numBlocksHigh = 0; + if (height > 0) + { + numBlocksHigh = std::max( 1, (height + 3) / 4 ); + } + rowBytes = numBlocksWide * bpe; + numRows = numBlocksHigh; + numBytes = rowBytes * numBlocksHigh; + } + else if (packed) + { + rowBytes = ( ( width + 1 ) >> 1 ) * bpe; + numRows = height; + numBytes = rowBytes * height; + } + else if ( fmt == DXGI_FORMAT_NV11 ) + { + rowBytes = ( ( width + 3 ) >> 2 ) * 4; + numRows = height * 2; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data + numBytes = rowBytes * numRows; + } + else if (planar) + { + rowBytes = ( ( width + 1 ) >> 1 ) * bpe; + numBytes = ( rowBytes * height ) + ( ( rowBytes * height + 1 ) >> 1 ); + numRows = height + ( ( height + 1 ) >> 1 ); + } + else + { + size_t bpp = BitsPerPixel( fmt ); + rowBytes = ( width * bpp + 7 ) / 8; // round up to nearest byte + numRows = height; + numBytes = rowBytes * height; + } + + if (outNumBytes) + { + *outNumBytes = numBytes; + } + if (outRowBytes) + { + *outRowBytes = rowBytes; + } + if (outNumRows) + { + *outNumRows = numRows; + } +} + + +//-------------------------------------------------------------------------------------- +#define ISBITMASK( r,g,b,a ) ( ddpf.RBitMask == r && ddpf.GBitMask == g && ddpf.BBitMask == b && ddpf.ABitMask == a ) + +static DXGI_FORMAT GetDXGIFormat( const DDS_PIXELFORMAT& ddpf ) +{ + if (ddpf.flags & DDS_RGB) + { + // Note that sRGB formats are written using the "DX10" extended header + + switch (ddpf.RGBBitCount) + { + case 32: + if (ISBITMASK(0x000000ff,0x0000ff00,0x00ff0000,0xff000000)) + { + return DXGI_FORMAT_R8G8B8A8_UNORM; + } + + if (ISBITMASK(0x00ff0000,0x0000ff00,0x000000ff,0xff000000)) + { + return DXGI_FORMAT_B8G8R8A8_UNORM; + } + + if (ISBITMASK(0x00ff0000,0x0000ff00,0x000000ff,0x00000000)) + { + return DXGI_FORMAT_B8G8R8X8_UNORM; + } + + // No DXGI format maps to ISBITMASK(0x000000ff,0x0000ff00,0x00ff0000,0x00000000) aka D3DFMT_X8B8G8R8 + + // Note that many common DDS reader/writers (including D3DX) swap the + // the RED/BLUE masks for 10:10:10:2 formats. We assume + // below that the 'backwards' header mask is being used since it is most + // likely written by D3DX. The more robust solution is to use the 'DX10' + // header extension and specify the DXGI_FORMAT_R10G10B10A2_UNORM format directly + + // For 'correct' writers, this should be 0x000003ff,0x000ffc00,0x3ff00000 for RGB data + if (ISBITMASK(0x3ff00000,0x000ffc00,0x000003ff,0xc0000000)) + { + return DXGI_FORMAT_R10G10B10A2_UNORM; + } + + // No DXGI format maps to ISBITMASK(0x000003ff,0x000ffc00,0x3ff00000,0xc0000000) aka D3DFMT_A2R10G10B10 + + if (ISBITMASK(0x0000ffff,0xffff0000,0x00000000,0x00000000)) + { + return DXGI_FORMAT_R16G16_UNORM; + } + + if (ISBITMASK(0xffffffff,0x00000000,0x00000000,0x00000000)) + { + // Only 32-bit color channel format in D3D9 was R32F + return DXGI_FORMAT_R32_FLOAT; // D3DX writes this out as a FourCC of 114 + } + break; + + case 24: + // No 24bpp DXGI formats aka D3DFMT_R8G8B8 + break; + + case 16: + if (ISBITMASK(0x7c00,0x03e0,0x001f,0x8000)) + { + return DXGI_FORMAT_B5G5R5A1_UNORM; + } + if (ISBITMASK(0xf800,0x07e0,0x001f,0x0000)) + { + return DXGI_FORMAT_B5G6R5_UNORM; + } + + // No DXGI format maps to ISBITMASK(0x7c00,0x03e0,0x001f,0x0000) aka D3DFMT_X1R5G5B5 + + if (ISBITMASK(0x0f00,0x00f0,0x000f,0xf000)) + { + return DXGI_FORMAT_B4G4R4A4_UNORM; + } + + // No DXGI format maps to ISBITMASK(0x0f00,0x00f0,0x000f,0x0000) aka D3DFMT_X4R4G4B4 + + // No 3:3:2, 3:3:2:8, or paletted DXGI formats aka D3DFMT_A8R3G3B2, D3DFMT_R3G3B2, D3DFMT_P8, D3DFMT_A8P8, etc. + break; + } + } + else if (ddpf.flags & DDS_LUMINANCE) + { + if (8 == ddpf.RGBBitCount) + { + if (ISBITMASK(0x000000ff,0x00000000,0x00000000,0x00000000)) + { + return DXGI_FORMAT_R8_UNORM; // D3DX10/11 writes this out as DX10 extension + } + + // No DXGI format maps to ISBITMASK(0x0f,0x00,0x00,0xf0) aka D3DFMT_A4L4 + } + + if (16 == ddpf.RGBBitCount) + { + if (ISBITMASK(0x0000ffff,0x00000000,0x00000000,0x00000000)) + { + return DXGI_FORMAT_R16_UNORM; // D3DX10/11 writes this out as DX10 extension + } + if (ISBITMASK(0x000000ff,0x00000000,0x00000000,0x0000ff00)) + { + return DXGI_FORMAT_R8G8_UNORM; // D3DX10/11 writes this out as DX10 extension + } + } + } + else if (ddpf.flags & DDS_ALPHA) + { + if (8 == ddpf.RGBBitCount) + { + return DXGI_FORMAT_A8_UNORM; + } + } + else if (ddpf.flags & DDS_BUMPDUDV) + { + if (16 == ddpf.RGBBitCount) + { + if (ISBITMASK(0x00ff, 0xff00, 0x0000, 0x0000)) + { + return DXGI_FORMAT_R8G8_SNORM; // D3DX10/11 writes this out as DX10 extension + } + } + + if (32 == ddpf.RGBBitCount) + { + if (ISBITMASK(0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000)) + { + return DXGI_FORMAT_R8G8B8A8_SNORM; // D3DX10/11 writes this out as DX10 extension + } + if (ISBITMASK(0x0000ffff, 0xffff0000, 0x00000000, 0x00000000)) + { + return DXGI_FORMAT_R16G16_SNORM; // D3DX10/11 writes this out as DX10 extension + } + + // No DXGI format maps to ISBITMASK(0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000) aka D3DFMT_A2W10V10U10 + } + } + else if (ddpf.flags & DDS_FOURCC) + { + if (MAKEFOURCC( 'D', 'X', 'T', '1' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC1_UNORM; + } + if (MAKEFOURCC( 'D', 'X', 'T', '3' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC2_UNORM; + } + if (MAKEFOURCC( 'D', 'X', 'T', '5' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC3_UNORM; + } + + // While pre-multiplied alpha isn't directly supported by the DXGI formats, + // they are basically the same as these BC formats so they can be mapped + if (MAKEFOURCC( 'D', 'X', 'T', '2' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC2_UNORM; + } + if (MAKEFOURCC( 'D', 'X', 'T', '4' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC3_UNORM; + } + + if (MAKEFOURCC( 'A', 'T', 'I', '1' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC4_UNORM; + } + if (MAKEFOURCC( 'B', 'C', '4', 'U' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC4_UNORM; + } + if (MAKEFOURCC( 'B', 'C', '4', 'S' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC4_SNORM; + } + + if (MAKEFOURCC( 'A', 'T', 'I', '2' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC5_UNORM; + } + if (MAKEFOURCC( 'B', 'C', '5', 'U' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC5_UNORM; + } + if (MAKEFOURCC( 'B', 'C', '5', 'S' ) == ddpf.fourCC) + { + return DXGI_FORMAT_BC5_SNORM; + } + + // BC6H and BC7 are written using the "DX10" extended header + + if (MAKEFOURCC( 'R', 'G', 'B', 'G' ) == ddpf.fourCC) + { + return DXGI_FORMAT_R8G8_B8G8_UNORM; + } + if (MAKEFOURCC( 'G', 'R', 'G', 'B' ) == ddpf.fourCC) + { + return DXGI_FORMAT_G8R8_G8B8_UNORM; + } + + if (MAKEFOURCC('Y','U','Y','2') == ddpf.fourCC) + { + return DXGI_FORMAT_YUY2; + } + + // Check for D3DFORMAT enums being set here + switch( ddpf.fourCC ) + { + case 36: // D3DFMT_A16B16G16R16 + return DXGI_FORMAT_R16G16B16A16_UNORM; + + case 110: // D3DFMT_Q16W16V16U16 + return DXGI_FORMAT_R16G16B16A16_SNORM; + + case 111: // D3DFMT_R16F + return DXGI_FORMAT_R16_FLOAT; + + case 112: // D3DFMT_G16R16F + return DXGI_FORMAT_R16G16_FLOAT; + + case 113: // D3DFMT_A16B16G16R16F + return DXGI_FORMAT_R16G16B16A16_FLOAT; + + case 114: // D3DFMT_R32F + return DXGI_FORMAT_R32_FLOAT; + + case 115: // D3DFMT_G32R32F + return DXGI_FORMAT_R32G32_FLOAT; + + case 116: // D3DFMT_A32B32G32R32F + return DXGI_FORMAT_R32G32B32A32_FLOAT; + } + } + + return DXGI_FORMAT_UNKNOWN; +} + + +//-------------------------------------------------------------------------------------- +static DXGI_FORMAT MakeSRGB( _In_ DXGI_FORMAT format ) +{ + switch( format ) + { + case DXGI_FORMAT_R8G8B8A8_UNORM: + return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + + case DXGI_FORMAT_BC1_UNORM: + return DXGI_FORMAT_BC1_UNORM_SRGB; + + case DXGI_FORMAT_BC2_UNORM: + return DXGI_FORMAT_BC2_UNORM_SRGB; + + case DXGI_FORMAT_BC3_UNORM: + return DXGI_FORMAT_BC3_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8A8_UNORM: + return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8X8_UNORM: + return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + + case DXGI_FORMAT_BC7_UNORM: + return DXGI_FORMAT_BC7_UNORM_SRGB; + + default: + return format; + } +} + + +//-------------------------------------------------------------------------------------- +static HRESULT FillInitData( _In_ size_t width, + _In_ size_t height, + _In_ size_t depth, + _In_ size_t mipCount, + _In_ size_t arraySize, + _In_ DXGI_FORMAT format, + _In_ size_t maxsize, + _In_ size_t bitSize, + _In_reads_bytes_(bitSize) const uint8_t* bitData, + _Out_ size_t& twidth, + _Out_ size_t& theight, + _Out_ size_t& tdepth, + _Out_ size_t& skipMip, + _Out_writes_(mipCount*arraySize) D3D11_SUBRESOURCE_DATA* initData ) +{ + if ( !bitData || !initData ) + { + return E_POINTER; + } + + skipMip = 0; + twidth = 0; + theight = 0; + tdepth = 0; + + size_t NumBytes = 0; + size_t RowBytes = 0; + const uint8_t* pSrcBits = bitData; + const uint8_t* pEndBits = bitData + bitSize; + + size_t index = 0; + for( size_t j = 0; j < arraySize; j++ ) + { + size_t w = width; + size_t h = height; + size_t d = depth; + for( size_t i = 0; i < mipCount; i++ ) + { + GetSurfaceInfo( w, + h, + format, + &NumBytes, + &RowBytes, + nullptr + ); + + if ( (mipCount <= 1) || !maxsize || (w <= maxsize && h <= maxsize && d <= maxsize) ) + { + if ( !twidth ) + { + twidth = w; + theight = h; + tdepth = d; + } + + assert(index < mipCount * arraySize); + _Analysis_assume_(index < mipCount * arraySize); + initData[index].pSysMem = ( const void* )pSrcBits; + initData[index].SysMemPitch = static_cast( RowBytes ); + initData[index].SysMemSlicePitch = static_cast( NumBytes ); + ++index; + } + else if ( !j ) + { + // Count number of skipped mipmaps (first item only) + ++skipMip; + } + + if (pSrcBits + (NumBytes*d) > pEndBits) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + pSrcBits += NumBytes * d; + + w = w >> 1; + h = h >> 1; + d = d >> 1; + if (w == 0) + { + w = 1; + } + if (h == 0) + { + h = 1; + } + if (d == 0) + { + d = 1; + } + } + } + + return (index > 0) ? S_OK : E_FAIL; +} + + +//-------------------------------------------------------------------------------------- +static HRESULT CreateD3DResources( _In_ ID3D11Device* d3dDevice, + _In_ uint32_t resDim, + _In_ size_t width, + _In_ size_t height, + _In_ size_t depth, + _In_ size_t mipCount, + _In_ size_t arraySize, + _In_ DXGI_FORMAT format, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _In_ bool isCubeMap, + _In_reads_opt_(mipCount*arraySize) D3D11_SUBRESOURCE_DATA* initData, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView ) +{ + if ( !d3dDevice ) + return E_POINTER; + + HRESULT hr = E_FAIL; + + if ( forceSRGB ) + { + format = MakeSRGB( format ); + } + + switch ( resDim ) + { + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + { + D3D11_TEXTURE1D_DESC desc; + desc.Width = static_cast( width ); + desc.MipLevels = static_cast( mipCount ); + desc.ArraySize = static_cast( arraySize ); + desc.Format = format; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE; + + ID3D11Texture1D* tex = nullptr; + hr = d3dDevice->CreateTexture1D( &desc, + initData, + &tex + ); + if (SUCCEEDED( hr ) && tex != 0) + { + if (textureView != 0) + { + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc; + memset( &SRVDesc, 0, sizeof( SRVDesc ) ); + SRVDesc.Format = format; + + if (arraySize > 1) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; + SRVDesc.Texture1DArray.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + SRVDesc.Texture1DArray.ArraySize = static_cast( arraySize ); + } + else + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; + SRVDesc.Texture1D.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + } + + hr = d3dDevice->CreateShaderResourceView( tex, + &SRVDesc, + textureView + ); + if ( FAILED(hr) ) + { + tex->Release(); + return hr; + } + } + + if (texture != 0) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); + } + } + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + { + D3D11_TEXTURE2D_DESC desc; + desc.Width = static_cast( width ); + desc.Height = static_cast( height ); + desc.MipLevels = static_cast( mipCount ); + desc.ArraySize = static_cast( arraySize ); + desc.Format = format; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + if ( isCubeMap ) + { + desc.MiscFlags = miscFlags | D3D11_RESOURCE_MISC_TEXTURECUBE; + } + else + { + desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE; + } + + ID3D11Texture2D* tex = nullptr; + hr = d3dDevice->CreateTexture2D( &desc, + initData, + &tex + ); + if (SUCCEEDED( hr ) && tex != 0) + { + if (textureView != 0) + { + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc; + memset( &SRVDesc, 0, sizeof( SRVDesc ) ); + SRVDesc.Format = format; + + if ( isCubeMap ) + { + if (arraySize > 6) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; + SRVDesc.TextureCubeArray.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + + // Earlier we set arraySize to (NumCubes * 6) + SRVDesc.TextureCubeArray.NumCubes = static_cast( arraySize / 6 ); + } + else + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; + SRVDesc.TextureCube.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + } + } + else if (arraySize > 1) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; + SRVDesc.Texture2DArray.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + SRVDesc.Texture2DArray.ArraySize = static_cast( arraySize ); + } + else + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.Texture2D.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + } + + hr = d3dDevice->CreateShaderResourceView( tex, + &SRVDesc, + textureView + ); + if ( FAILED(hr) ) + { + tex->Release(); + return hr; + } + } + + if (texture != 0) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); + } + } + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + { + D3D11_TEXTURE3D_DESC desc; + desc.Width = static_cast( width ); + desc.Height = static_cast( height ); + desc.Depth = static_cast( depth ); + desc.MipLevels = static_cast( mipCount ); + desc.Format = format; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE; + + ID3D11Texture3D* tex = nullptr; + hr = d3dDevice->CreateTexture3D( &desc, + initData, + &tex + ); + if (SUCCEEDED( hr ) && tex != 0) + { + if (textureView != 0) + { + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc; + memset( &SRVDesc, 0, sizeof( SRVDesc ) ); + SRVDesc.Format = format; + + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + SRVDesc.Texture3D.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + + hr = d3dDevice->CreateShaderResourceView( tex, + &SRVDesc, + textureView + ); + if ( FAILED(hr) ) + { + tex->Release(); + return hr; + } + } + + if (texture != 0) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); + } + } + } + break; + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +static HRESULT CreateTextureFromDDS( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_ const DDS_HEADER* header, + _In_reads_bytes_(bitSize) const uint8_t* bitData, + _In_ size_t bitSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView ) +{ + HRESULT hr = S_OK; + + UINT width = header->width; + UINT height = header->height; + UINT depth = header->depth; + + uint32_t resDim = D3D11_RESOURCE_DIMENSION_UNKNOWN; + UINT arraySize = 1; + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; + bool isCubeMap = false; + + size_t mipCount = header->mipMapCount; + if (0 == mipCount) + { + mipCount = 1; + } + + if ((header->ddspf.flags & DDS_FOURCC) && + (MAKEFOURCC( 'D', 'X', '1', '0' ) == header->ddspf.fourCC )) + { + auto d3d10ext = reinterpret_cast( (const char*)header + sizeof(DDS_HEADER) ); + + arraySize = d3d10ext->arraySize; + if (arraySize == 0) + { + return HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); + } + + switch( d3d10ext->dxgiFormat ) + { + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + case DXGI_FORMAT_A8P8: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + + default: + if ( BitsPerPixel( d3d10ext->dxgiFormat ) == 0 ) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + } + + format = d3d10ext->dxgiFormat; + + switch ( d3d10ext->resourceDimension ) + { + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + // D3DX writes 1D textures with a fixed Height of 1 + if ((header->flags & DDS_HEIGHT) && height != 1) + { + return HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); + } + height = depth = 1; + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + if (d3d10ext->miscFlag & D3D11_RESOURCE_MISC_TEXTURECUBE) + { + arraySize *= 6; + isCubeMap = true; + } + depth = 1; + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + if (!(header->flags & DDS_HEADER_FLAGS_VOLUME)) + { + return HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); + } + + if (arraySize > 1) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + break; + + default: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + resDim = d3d10ext->resourceDimension; + } + else + { + format = GetDXGIFormat( header->ddspf ); + + if (format == DXGI_FORMAT_UNKNOWN) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + if (header->flags & DDS_HEADER_FLAGS_VOLUME) + { + resDim = D3D11_RESOURCE_DIMENSION_TEXTURE3D; + } + else + { + if (header->caps2 & DDS_CUBEMAP) + { + // We require all six faces to be defined + if ((header->caps2 & DDS_CUBEMAP_ALLFACES ) != DDS_CUBEMAP_ALLFACES) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + arraySize = 6; + isCubeMap = true; + } + + depth = 1; + resDim = D3D11_RESOURCE_DIMENSION_TEXTURE2D; + + // Note there's no way for a legacy Direct3D 9 DDS to express a '1D' texture + } + + assert( BitsPerPixel( format ) != 0 ); + } + + // Bound sizes (for security purposes we don't trust DDS file metadata larger than the D3D 11.x hardware requirements) + if (mipCount > D3D11_REQ_MIP_LEVELS) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + switch ( resDim ) + { + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + if ((arraySize > D3D11_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || + (width > D3D11_REQ_TEXTURE1D_U_DIMENSION) ) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + if ( isCubeMap ) + { + // This is the right bound because we set arraySize to (NumCubes*6) above + if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || + (width > D3D11_REQ_TEXTURECUBE_DIMENSION) || + (height > D3D11_REQ_TEXTURECUBE_DIMENSION)) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + } + else if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || + (width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION) || + (height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION)) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + if ((arraySize > 1) || + (width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || + (height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || + (depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) ) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + break; + + default: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + bool autogen = false; + if ( mipCount == 1 && d3dContext != 0 && textureView != 0 ) // Must have context and shader-view to auto generate mipmaps + { + // See if format is supported for auto-gen mipmaps (varies by feature level) + UINT fmtSupport = 0; + hr = d3dDevice->CheckFormatSupport( format, &fmtSupport ); + if ( SUCCEEDED(hr) && ( fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN ) ) + { + // 10level9 feature levels do not support auto-gen mipgen for volume textures + if ( ( resDim != D3D11_RESOURCE_DIMENSION_TEXTURE3D ) + || ( d3dDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_10_0 ) ) + { + autogen = true; + } + } + } + + if ( autogen ) + { + // Create texture with auto-generated mipmaps + ID3D11Resource* tex = nullptr; + hr = CreateD3DResources( d3dDevice, resDim, width, height, depth, 0, arraySize, + format, usage, + bindFlags | D3D11_BIND_RENDER_TARGET, + cpuAccessFlags, + miscFlags | D3D11_RESOURCE_MISC_GENERATE_MIPS, forceSRGB, + isCubeMap, nullptr, &tex, textureView ); + if ( SUCCEEDED(hr) ) + { + size_t numBytes = 0; + size_t rowBytes = 0; + GetSurfaceInfo( width, height, format, &numBytes, &rowBytes, nullptr ); + + if ( numBytes > bitSize ) + { + (*textureView)->Release(); + *textureView = nullptr; + tex->Release(); + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + D3D11_SHADER_RESOURCE_VIEW_DESC desc; + (*textureView)->GetDesc( &desc ); + + UINT mipLevels = 1; + + switch( desc.ViewDimension ) + { + case D3D_SRV_DIMENSION_TEXTURE1D: mipLevels = desc.Texture1D.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE1DARRAY: mipLevels = desc.Texture1DArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE2D: mipLevels = desc.Texture2D.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE2DARRAY: mipLevels = desc.Texture2DArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURECUBE: mipLevels = desc.TextureCube.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURECUBEARRAY:mipLevels = desc.TextureCubeArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE3D: mipLevels = desc.Texture3D.MipLevels; break; + default: + (*textureView)->Release(); + *textureView = nullptr; + tex->Release(); + return E_UNEXPECTED; + } + + if ( arraySize > 1 ) + { + const uint8_t* pSrcBits = bitData; + const uint8_t* pEndBits = bitData + bitSize; + for( UINT item = 0; item < arraySize; ++item ) + { + if ( (pSrcBits + numBytes) > pEndBits ) + { + (*textureView)->Release(); + *textureView = nullptr; + tex->Release(); + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + UINT res = D3D11CalcSubresource( 0, item, mipLevels ); + d3dContext->UpdateSubresource( tex, res, nullptr, pSrcBits, static_cast(rowBytes), static_cast(numBytes) ); + pSrcBits += numBytes; + } + } + else + { + d3dContext->UpdateSubresource( tex, 0, nullptr, bitData, static_cast(rowBytes), static_cast(numBytes) ); + } + + d3dContext->GenerateMips( *textureView ); + + if ( texture ) + { + *texture = tex; + } + else + { + tex->Release(); + } + } + } + else + { + // Create the texture + std::unique_ptr initData( new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ] ); + if ( !initData ) + { + return E_OUTOFMEMORY; + } + + size_t skipMip = 0; + size_t twidth = 0; + size_t theight = 0; + size_t tdepth = 0; + hr = FillInitData( width, height, depth, mipCount, arraySize, format, maxsize, bitSize, bitData, + twidth, theight, tdepth, skipMip, initData.get() ); + + if ( SUCCEEDED(hr) ) + { + hr = CreateD3DResources( d3dDevice, resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, + format, usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + isCubeMap, initData.get(), texture, textureView ); + + if ( FAILED(hr) && !maxsize && (mipCount > 1) ) + { + // Retry with a maxsize determined by feature level + switch( d3dDevice->GetFeatureLevel() ) + { + case D3D_FEATURE_LEVEL_9_1: + case D3D_FEATURE_LEVEL_9_2: + if ( isCubeMap ) + { + maxsize = 512 /*D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION*/; + } + else + { + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) + ? 256 /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : 2048 /*D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + } + break; + + case D3D_FEATURE_LEVEL_9_3: + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) + ? 256 /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : 4096 /*D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + break; + + default: // D3D_FEATURE_LEVEL_10_0 & D3D_FEATURE_LEVEL_10_1 + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) + ? 2048 /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : 8192 /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + break; + } + + hr = FillInitData( width, height, depth, mipCount, arraySize, format, maxsize, bitSize, bitData, + twidth, theight, tdepth, skipMip, initData.get() ); + if ( SUCCEEDED(hr) ) + { + hr = CreateD3DResources( d3dDevice, resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, + format, usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + isCubeMap, initData.get(), texture, textureView ); + } + } + } + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +static DDS_ALPHA_MODE GetAlphaMode( _In_ const DDS_HEADER* header ) +{ + if ( header->ddspf.flags & DDS_FOURCC ) + { + if ( MAKEFOURCC( 'D', 'X', '1', '0' ) == header->ddspf.fourCC ) + { + auto d3d10ext = reinterpret_cast( (const char*)header + sizeof(DDS_HEADER) ); + auto mode = static_cast( d3d10ext->miscFlags2 & DDS_MISC_FLAGS2_ALPHA_MODE_MASK ); + switch( mode ) + { + case DDS_ALPHA_MODE_STRAIGHT: + case DDS_ALPHA_MODE_PREMULTIPLIED: + case DDS_ALPHA_MODE_OPAQUE: + case DDS_ALPHA_MODE_CUSTOM: + return mode; + } + } + else if ( ( MAKEFOURCC( 'D', 'X', 'T', '2' ) == header->ddspf.fourCC ) + || ( MAKEFOURCC( 'D', 'X', 'T', '4' ) == header->ddspf.fourCC ) ) + { + return DDS_ALPHA_MODE_PREMULTIPLIED; + } + } + + return DDS_ALPHA_MODE_UNKNOWN; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromMemory( ID3D11Device* d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode ) +{ + return CreateDDSTextureFromMemoryEx( d3dDevice, nullptr, ddsData, ddsDataSize, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView, alphaMode ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromMemory( ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const uint8_t* ddsData, + size_t ddsDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode ) +{ + return CreateDDSTextureFromMemoryEx( d3dDevice, d3dContext, ddsData, ddsDataSize, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView, alphaMode ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode ) +{ + return CreateDDSTextureFromMemoryEx( d3dDevice, nullptr, ddsData, ddsDataSize, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView, alphaMode ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const uint8_t* ddsData, + size_t ddsDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode ) +{ + if ( texture ) + { + *texture = nullptr; + } + if ( textureView ) + { + *textureView = nullptr; + } + if ( alphaMode ) + { + *alphaMode = DDS_ALPHA_MODE_UNKNOWN; + } + + if (!d3dDevice || !ddsData || (!texture && !textureView)) + { + return E_INVALIDARG; + } + + // Validate DDS file in memory + if (ddsDataSize < (sizeof(uint32_t) + sizeof(DDS_HEADER))) + { + return E_FAIL; + } + + uint32_t dwMagicNumber = *( const uint32_t* )( ddsData ); + if (dwMagicNumber != DDS_MAGIC) + { + return E_FAIL; + } + + auto header = reinterpret_cast( ddsData + sizeof( uint32_t ) ); + + // Verify header to validate DDS file + if (header->size != sizeof(DDS_HEADER) || + header->ddspf.size != sizeof(DDS_PIXELFORMAT)) + { + return E_FAIL; + } + + // Check for DX10 extension + bool bDXT10Header = false; + if ((header->ddspf.flags & DDS_FOURCC) && + (MAKEFOURCC( 'D', 'X', '1', '0' ) == header->ddspf.fourCC) ) + { + // Must be long enough for both headers and magic value + if (ddsDataSize < (sizeof(DDS_HEADER) + sizeof(uint32_t) + sizeof(DDS_HEADER_DXT10))) + { + return E_FAIL; + } + + bDXT10Header = true; + } + + ptrdiff_t offset = sizeof( uint32_t ) + + sizeof( DDS_HEADER ) + + (bDXT10Header ? sizeof( DDS_HEADER_DXT10 ) : 0); + + HRESULT hr = CreateTextureFromDDS( d3dDevice, d3dContext, header, + ddsData + offset, ddsDataSize - offset, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView ); + if ( SUCCEEDED(hr) ) + { + if (texture != 0 && *texture != 0) + { + SetDebugObjectName(*texture, "DDSTextureLoader"); + } + + if (textureView != 0 && *textureView != 0) + { + SetDebugObjectName(*textureView, "DDSTextureLoader"); + } + + if ( alphaMode ) + *alphaMode = GetAlphaMode( header ); + } + + return hr; +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromFile( ID3D11Device* d3dDevice, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode ) +{ + return CreateDDSTextureFromFileEx( d3dDevice, nullptr, fileName, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView, alphaMode ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromFile( ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode ) +{ + return CreateDDSTextureFromFileEx( d3dDevice, d3dContext, fileName, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView, alphaMode ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode ) +{ + return CreateDDSTextureFromFileEx( d3dDevice, nullptr, fileName, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView, alphaMode ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode ) +{ + if ( texture ) + { + *texture = nullptr; + } + if ( textureView ) + { + *textureView = nullptr; + } + if ( alphaMode ) + { + *alphaMode = DDS_ALPHA_MODE_UNKNOWN; + } + + if (!d3dDevice || !fileName || (!texture && !textureView)) + { + return E_INVALIDARG; + } + + DDS_HEADER* header = nullptr; + uint8_t* bitData = nullptr; + size_t bitSize = 0; + + std::unique_ptr ddsData; + HRESULT hr = LoadTextureDataFromFile( fileName, + ddsData, + &header, + &bitData, + &bitSize + ); + if (FAILED(hr)) + { + return hr; + } + + hr = CreateTextureFromDDS( d3dDevice, d3dContext, header, + bitData, bitSize, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView ); + + if ( SUCCEEDED(hr) ) + { +#if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) + if (texture != 0 || textureView != 0) + { + CHAR strFileA[MAX_PATH]; + int result = WideCharToMultiByte( CP_ACP, + WC_NO_BEST_FIT_CHARS, + fileName, + -1, + strFileA, + MAX_PATH, + nullptr, + FALSE + ); + if ( result > 0 ) + { + const CHAR* pstrName = strrchr( strFileA, '\\' ); + if (!pstrName) + { + pstrName = strFileA; + } + else + { + pstrName++; + } + + if (texture != 0 && *texture != 0) + { + (*texture)->SetPrivateData( WKPDID_D3DDebugObjectName, + static_cast( strnlen_s(pstrName, MAX_PATH) ), + pstrName + ); + } + + if (textureView != 0 && *textureView != 0 ) + { + (*textureView)->SetPrivateData( WKPDID_D3DDebugObjectName, + static_cast( strnlen_s(pstrName, MAX_PATH) ), + pstrName + ); + } + } + } +#endif + + if ( alphaMode ) + *alphaMode = GetAlphaMode( header ); + } + + return hr; +} diff --git a/DXUT11/Core/DDSTextureLoader.h b/DXUT11/Core/DDSTextureLoader.h new file mode 100644 index 0000000..122df9f --- /dev/null +++ b/DXUT11/Core/DDSTextureLoader.h @@ -0,0 +1,133 @@ +//-------------------------------------------------------------------------------------- +// File: DDSTextureLoader.h +// +// Functions for loading a DDS texture and creating a Direct3D 11 runtime resource for it +// +// Note these functions are useful as a light-weight runtime loader for DDS files. For +// a full-featured DDS file reader, writer, and texture processing pipeline see +// the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include +#include + + +namespace DirectX +{ + enum DDS_ALPHA_MODE + { + DDS_ALPHA_MODE_UNKNOWN = 0, + DDS_ALPHA_MODE_STRAIGHT = 1, + DDS_ALPHA_MODE_PREMULTIPLIED = 2, + DDS_ALPHA_MODE_OPAQUE = 3, + DDS_ALPHA_MODE_CUSTOM = 4, + }; + + // Standard version + HRESULT CreateDDSTextureFromMemory( _In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr + ); + + HRESULT CreateDDSTextureFromFile( _In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr + ); + + // Standard version with optional auto-gen mipmap support + HRESULT CreateDDSTextureFromMemory( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr + ); + + HRESULT CreateDDSTextureFromFile( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr + ); + + // Extended version + HRESULT CreateDDSTextureFromMemoryEx( _In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr + ); + + HRESULT CreateDDSTextureFromFileEx( _In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr + ); + + // Extended version with optional auto-gen mipmap support + HRESULT CreateDDSTextureFromMemoryEx( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr + ); + + HRESULT CreateDDSTextureFromFileEx( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr + ); +} \ No newline at end of file diff --git a/DXUT11/Core/DXUT.cpp b/DXUT11/Core/DXUT.cpp new file mode 100644 index 0000000..3f25070 --- /dev/null +++ b/DXUT11/Core/DXUT.cpp @@ -0,0 +1,4480 @@ +//-------------------------------------------------------------------------------------- +// File: DXUT.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "DXUT.h" + +#ifndef NDEBUG +#include +#endif + +#define DXUT_MIN_WINDOW_SIZE_X 200 +#define DXUT_MIN_WINDOW_SIZE_Y 200 +#define DXUT_COUNTER_STAT_LENGTH 2048 + + +//-------------------------------------------------------------------------------------- +// Thread safety +//-------------------------------------------------------------------------------------- +CRITICAL_SECTION g_cs; +bool g_bThreadSafe = true; + + +//-------------------------------------------------------------------------------------- +// Automatically enters & leaves the CS upon object creation/deletion +//-------------------------------------------------------------------------------------- +class DXUTLock +{ +public: +#pragma prefast( suppress:26166, "g_bThreadSafe controls behavior" ) + inline _Acquires_lock_(g_cs) DXUTLock() { if( g_bThreadSafe ) EnterCriticalSection( &g_cs ); } +#pragma prefast( suppress:26165, "g_bThreadSafe controls behavior" ) + inline _Releases_lock_(g_cs) ~DXUTLock() { if( g_bThreadSafe ) LeaveCriticalSection( &g_cs ); } +}; + +//-------------------------------------------------------------------------------------- +// Helper macros to build member functions that access member variables with thread safety +//-------------------------------------------------------------------------------------- +#define SET_ACCESSOR( x, y ) inline void Set##y( x t ) { DXUTLock l; m_state.m_##y = t; }; +#define GET_ACCESSOR( x, y ) inline x Get##y() { DXUTLock l; return m_state.m_##y; }; +#define GET_SET_ACCESSOR( x, y ) SET_ACCESSOR( x, y ) GET_ACCESSOR( x, y ) + +#define SETP_ACCESSOR( x, y ) inline void Set##y( x* t ) { DXUTLock l; m_state.m_##y = *t; }; +#define GETP_ACCESSOR( x, y ) inline x* Get##y() { DXUTLock l; return &m_state.m_##y; }; +#define GETP_SETP_ACCESSOR( x, y ) SETP_ACCESSOR( x, y ) GETP_ACCESSOR( x, y ) + + +//-------------------------------------------------------------------------------------- +// Stores timer callback info +//-------------------------------------------------------------------------------------- +struct DXUT_TIMER +{ + LPDXUTCALLBACKTIMER pCallbackTimer; + void* pCallbackUserContext; + float fTimeoutInSecs; + float fCountdown; + bool bEnabled; + UINT nID; +}; + + +//-------------------------------------------------------------------------------------- +// Stores DXUT state and data access is done with thread safety (if g_bThreadSafe==true) +//-------------------------------------------------------------------------------------- +class DXUTState +{ +protected: + struct STATE + { + DXUTDeviceSettings* m_CurrentDeviceSettings; // current device settings + IDXGIFactory1* m_DXGIFactory; // DXGI Factory object + IDXGIAdapter1* m_DXGIAdapter; // The DXGI adapter object for the D3D11 device + IDXGIOutput** m_DXGIOutputArray; // The array of output obj for the D3D11 adapter obj + UINT m_DXGIOutputArraySize; // Number of elements in m_D3D11OutputArray + IDXGISwapChain* m_DXGISwapChain; // the D3D11 swapchain + DXGI_SURFACE_DESC m_BackBufferSurfaceDescDXGI; // D3D11 back buffer surface description + bool m_RenderingOccluded; // Rendering is occluded by another window + bool m_DoNotStoreBufferSize; // Do not store the buffer size on WM_SIZE messages + + // D3D11 specific + ID3D11Device* m_D3D11Device; // the D3D11 rendering device + ID3D11DeviceContext* m_D3D11DeviceContext; // the D3D11 immediate device context + D3D_FEATURE_LEVEL m_D3D11FeatureLevel; // the D3D11 feature level that this device supports + ID3D11Texture2D* m_D3D11DepthStencil; // the D3D11 depth stencil texture (optional) + ID3D11DepthStencilView* m_D3D11DepthStencilView; // the D3D11 depth stencil view (optional) + ID3D11RenderTargetView* m_D3D11RenderTargetView; // the D3D11 render target view + ID3D11RasterizerState* m_D3D11RasterizerState; // the D3D11 Rasterizer state + + // D3D11.1 specific + ID3D11Device1* m_D3D11Device1; // the D3D11.1 rendering device + ID3D11DeviceContext1* m_D3D11DeviceContext1; // the D3D11.1 immediate device context + +#ifdef USE_DIRECT3D11_2 + // D3D11.2 specific + ID3D11Device2* m_D3D11Device2; // the D3D11.2 rendering device + ID3D11DeviceContext2* m_D3D11DeviceContext2; // the D3D11.2 immediate device context +#endif + +#ifdef USE_DIRECT3D11_3 + // D3D11.3 specific + ID3D11Device3* m_D3D11Device3; // the D3D11.3 rendering device + ID3D11DeviceContext3* m_D3D11DeviceContext3; // the D3D11.3 immediate device context +#endif + + // General + HWND m_HWNDFocus; // the main app focus window + HWND m_HWNDDeviceFullScreen; // the main app device window in fullscreen mode + HWND m_HWNDDeviceWindowed; // the main app device window in windowed mode + HMONITOR m_AdapterMonitor; // the monitor of the adapter + HMENU m_Menu; // handle to menu + + UINT m_FullScreenBackBufferWidthAtModeChange; // back buffer size of fullscreen mode right before switching to windowed mode. Used to restore to same resolution when toggling back to fullscreen + UINT m_FullScreenBackBufferHeightAtModeChange; // back buffer size of fullscreen mode right before switching to windowed mode. Used to restore to same resolution when toggling back to fullscreen + UINT m_WindowBackBufferWidthAtModeChange; // back buffer size of windowed mode right before switching to fullscreen mode. Used to restore to same resolution when toggling back to windowed mode + UINT m_WindowBackBufferHeightAtModeChange; // back buffer size of windowed mode right before switching to fullscreen mode. Used to restore to same resolution when toggling back to windowed mode + DWORD m_WindowedStyleAtModeChange; // window style + WINDOWPLACEMENT m_WindowedPlacement;// record of windowed HWND position/show state/etc + bool m_TopmostWhileWindowed; // if true, the windowed HWND is topmost + bool m_Minimized; // if true, the HWND is minimized + bool m_Maximized; // if true, the HWND is maximized + bool m_MinimizedWhileFullscreen; // if true, the HWND is minimized due to a focus switch away when fullscreen mode + bool m_IgnoreSizeChange; // if true, DXUT won't reset the device upon HWND size change + + double m_Time; // current time in seconds + double m_AbsoluteTime; // absolute time in seconds + float m_ElapsedTime; // time elapsed since last frame + + HINSTANCE m_HInstance; // handle to the app instance + double m_LastStatsUpdateTime; // last time the stats were updated + DWORD m_LastStatsUpdateFrames; // frames count since last time the stats were updated + float m_FPS; // frames per second + int m_CurrentFrameNumber; // the current frame number + HHOOK m_KeyboardHook; // handle to keyboard hook + bool m_AllowShortcutKeysWhenFullscreen; // if true, when fullscreen enable shortcut keys (Windows keys, StickyKeys shortcut, ToggleKeys shortcut, FilterKeys shortcut) + bool m_AllowShortcutKeysWhenWindowed; // if true, when windowed enable shortcut keys (Windows keys, StickyKeys shortcut, ToggleKeys shortcut, FilterKeys shortcut) + bool m_AllowShortcutKeys; // if true, then shortcut keys are currently disabled (Windows key, etc) + bool m_CallDefWindowProc; // if true, DXUTStaticWndProc will call DefWindowProc for unhandled messages. Applications rendering to a dialog may need to set this to false. + STICKYKEYS m_StartupStickyKeys; // StickyKey settings upon startup so they can be restored later + TOGGLEKEYS m_StartupToggleKeys; // ToggleKey settings upon startup so they can be restored later + FILTERKEYS m_StartupFilterKeys; // FilterKey settings upon startup so they can be restored later + + bool m_HandleEscape; // if true, then DXUT will handle escape to quit + bool m_HandleAltEnter; // if true, then DXUT will handle alt-enter to toggle fullscreen + bool m_HandlePause; // if true, then DXUT will handle pause to toggle time pausing + bool m_ShowMsgBoxOnError; // if true, then msgboxes are displayed upon errors + bool m_NoStats; // if true, then DXUTGetFrameStats() and DXUTGetDeviceStats() will return blank strings + bool m_ClipCursorWhenFullScreen; // if true, then DXUT will keep the cursor from going outside the window when full screen + bool m_ShowCursorWhenFullScreen; // if true, then DXUT will show a cursor when full screen + bool m_ConstantFrameTime; // if true, then elapsed frame time will always be 0.05f seconds which is good for debugging or automated capture + float m_TimePerFrame; // the constant time per frame in seconds, only valid if m_ConstantFrameTime==true + bool m_WireframeMode; // if true, then D3DRS_FILLMODE==D3DFILL_WIREFRAME else D3DRS_FILLMODE==D3DFILL_SOLID + bool m_AutoChangeAdapter; // if true, then the adapter will automatically change if the window is different monitor + bool m_WindowCreatedWithDefaultPositions; // if true, then CW_USEDEFAULT was used and the window should be moved to the right adapter + int m_ExitCode; // the exit code to be returned to the command line + + bool m_DXUTInited; // if true, then DXUTInit() has succeeded + bool m_WindowCreated; // if true, then DXUTCreateWindow() or DXUTSetWindow() has succeeded + bool m_DeviceCreated; // if true, then DXUTCreateDevice() has succeeded + + bool m_DXUTInitCalled; // if true, then DXUTInit() was called + bool m_WindowCreateCalled; // if true, then DXUTCreateWindow() or DXUTSetWindow() was called + bool m_DeviceCreateCalled; // if true, then DXUTCreateDevice() was called + + bool m_DeviceObjectsCreated; // if true, then DeviceCreated callback has been called (if non-NULL) + bool m_DeviceObjectsReset; // if true, then DeviceReset callback has been called (if non-NULL) + bool m_InsideDeviceCallback; // if true, then the framework is inside an app device callback + bool m_InsideMainloop; // if true, then the framework is inside the main loop + bool m_Active; // if true, then the app is the active top level window + bool m_TimePaused; // if true, then time is paused + bool m_RenderingPaused; // if true, then rendering is paused + int m_PauseRenderingCount; // pause rendering ref count + int m_PauseTimeCount; // pause time ref count + bool m_DeviceLost; // if true, then the device is lost and needs to be reset + bool m_NotifyOnMouseMove; // if true, include WM_MOUSEMOVE in mousecallback + bool m_Automation; // if true, automation is enabled + bool m_InSizeMove; // if true, app is inside a WM_ENTERSIZEMOVE + UINT m_TimerLastID; // last ID of the DXUT timer + bool m_MessageWhenD3D11NotAvailable; + + D3D_FEATURE_LEVEL m_OverrideForceFeatureLevel; // if != -1, then overrid to use a featurelevel + WCHAR m_ScreenShotName[256]; // command line screen shot name + bool m_SaveScreenShot; // command line save screen shot + bool m_ExitAfterScreenShot; // command line exit after screen shot + + int m_OverrideAdapterOrdinal; // if != -1, then override to use this adapter ordinal + bool m_OverrideWindowed; // if true, then force to start windowed + int m_OverrideOutput; // if != -1, then override to use the particular output on the adapter + bool m_OverrideFullScreen; // if true, then force to start full screen + int m_OverrideStartX; // if != -1, then override to this X position of the window + int m_OverrideStartY; // if != -1, then override to this Y position of the window + int m_OverrideWidth; // if != 0, then override to this width + int m_OverrideHeight; // if != 0, then override to this height + bool m_OverrideForceHAL; // if true, then force to HAL device (failing if one doesn't exist) + bool m_OverrideForceREF; // if true, then force to REF device (failing if one doesn't exist) + bool m_OverrideForceWARP; // if true, then force to WARP device (failing if one doesn't exist) + bool m_OverrideConstantFrameTime; // if true, then force to constant frame time + float m_OverrideConstantTimePerFrame; // the constant time per frame in seconds if m_OverrideConstantFrameTime==true + int m_OverrideQuitAfterFrame; // if != 0, then it will force the app to quit after that frame + int m_OverrideForceVsync; // if == 0, then it will force the app to use D3DPRESENT_INTERVAL_IMMEDIATE, if == 1 force use of D3DPRESENT_INTERVAL_DEFAULT + bool m_AppCalledWasKeyPressed; // true if the app ever calls DXUTWasKeyPressed(). Allows for optimzation + bool m_ReleasingSwapChain; // if true, the app is releasing its swapchain + bool m_IsInGammaCorrectMode; // Tell DXUTRes and DXUTMisc that we are in gamma correct mode + + LPDXUTCALLBACKMODIFYDEVICESETTINGS m_ModifyDeviceSettingsFunc; // modify Direct3D device settings callback + LPDXUTCALLBACKDEVICEREMOVED m_DeviceRemovedFunc; // Direct3D device removed callback + LPDXUTCALLBACKFRAMEMOVE m_FrameMoveFunc; // frame move callback + LPDXUTCALLBACKKEYBOARD m_KeyboardFunc; // keyboard callback + LPDXUTCALLBACKMOUSE m_MouseFunc; // mouse callback + LPDXUTCALLBACKMSGPROC m_WindowMsgFunc; // window messages callback + + LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE m_IsD3D11DeviceAcceptableFunc; // D3D11 is device acceptable callback + LPDXUTCALLBACKD3D11DEVICECREATED m_D3D11DeviceCreatedFunc; // D3D11 device created callback + LPDXUTCALLBACKD3D11SWAPCHAINRESIZED m_D3D11SwapChainResizedFunc; // D3D11 SwapChain reset callback + LPDXUTCALLBACKD3D11SWAPCHAINRELEASING m_D3D11SwapChainReleasingFunc; // D3D11 SwapChain lost callback + LPDXUTCALLBACKD3D11DEVICEDESTROYED m_D3D11DeviceDestroyedFunc; // D3D11 device destroyed callback + LPDXUTCALLBACKD3D11FRAMERENDER m_D3D11FrameRenderFunc; // D3D11 frame render callback + + void* m_ModifyDeviceSettingsFuncUserContext; // user context for modify Direct3D device settings callback + void* m_DeviceRemovedFuncUserContext; // user context for Direct3D device removed callback + void* m_FrameMoveFuncUserContext; // user context for frame move callback + void* m_KeyboardFuncUserContext; // user context for keyboard callback + void* m_MouseFuncUserContext; // user context for mouse callback + void* m_WindowMsgFuncUserContext; // user context for window messages callback + + void* m_IsD3D11DeviceAcceptableFuncUserContext; // user context for is D3D11 device acceptable callback + void* m_D3D11DeviceCreatedFuncUserContext; // user context for D3D11 device created callback + void* m_D3D11SwapChainResizedFuncUserContext; // user context for D3D11 SwapChain resized callback + void* m_D3D11SwapChainReleasingFuncUserContext; // user context for D3D11 SwapChain releasing callback + void* m_D3D11DeviceDestroyedFuncUserContext; // user context for D3D11 device destroyed callback + void* m_D3D11FrameRenderFuncUserContext; // user context for D3D11 frame render callback + + bool m_Keys[256]; // array of key state + bool m_LastKeys[256]; // array of last key state + bool m_MouseButtons[5]; // array of mouse states + + std::vector* m_TimerList; // list of DXUT_TIMER structs + WCHAR m_StaticFrameStats[256]; // static part of frames stats + WCHAR m_FPSStats[64]; // fps stats + WCHAR m_FrameStats[256]; // frame stats (fps, width, etc) + WCHAR m_DeviceStats[256]; // device stats (description, device type, etc) + WCHAR m_WindowTitle[256]; // window title + }; + + STATE m_state; + +public: + DXUTState() { Create(); } + ~DXUTState() { Destroy(); } + + void Create() + { + g_bThreadSafe = true; + (void)InitializeCriticalSectionAndSpinCount( &g_cs, 1000 ); + + ZeroMemory( &m_state, sizeof( STATE ) ); + m_state.m_OverrideStartX = -1; + m_state.m_OverrideStartY = -1; + m_state.m_OverrideForceFeatureLevel = (D3D_FEATURE_LEVEL)0; + m_state.m_ScreenShotName[0] = 0; + m_state.m_SaveScreenShot = false; + m_state.m_ExitAfterScreenShot = false; + m_state.m_OverrideAdapterOrdinal = -1; + m_state.m_OverrideOutput = -1; + m_state.m_OverrideForceVsync = -1; + m_state.m_AutoChangeAdapter = true; + m_state.m_ShowMsgBoxOnError = true; + m_state.m_AllowShortcutKeysWhenWindowed = true; + m_state.m_Active = true; + m_state.m_CallDefWindowProc = true; + m_state.m_HandleEscape = true; + m_state.m_HandleAltEnter = true; + m_state.m_HandlePause = true; + m_state.m_IsInGammaCorrectMode = true; + m_state.m_FPS = 1.0f; + m_state.m_MessageWhenD3D11NotAvailable = true; + } + + void Destroy() + { + SAFE_DELETE( m_state.m_TimerList ); + DXUTShutdown(); + DeleteCriticalSection( &g_cs ); + } + + // Macros to define access functions for thread safe access into m_state + GET_SET_ACCESSOR( DXUTDeviceSettings*, CurrentDeviceSettings ); + + // D3D11 specific + GET_SET_ACCESSOR( IDXGIFactory1*, DXGIFactory ); + GET_SET_ACCESSOR( IDXGIAdapter1*, DXGIAdapter ); + GET_SET_ACCESSOR( IDXGIOutput**, DXGIOutputArray ); + GET_SET_ACCESSOR( UINT, DXGIOutputArraySize ); + GET_SET_ACCESSOR( IDXGISwapChain*, DXGISwapChain ); + GETP_SETP_ACCESSOR( DXGI_SURFACE_DESC, BackBufferSurfaceDescDXGI ); + GET_SET_ACCESSOR( bool, RenderingOccluded ); + GET_SET_ACCESSOR( bool, DoNotStoreBufferSize ); + + GET_SET_ACCESSOR( ID3D11Device*, D3D11Device ); + GET_SET_ACCESSOR( ID3D11DeviceContext*, D3D11DeviceContext ); + GET_SET_ACCESSOR( D3D_FEATURE_LEVEL, D3D11FeatureLevel ); + GET_SET_ACCESSOR( ID3D11Texture2D*, D3D11DepthStencil ); + GET_SET_ACCESSOR( ID3D11DepthStencilView*, D3D11DepthStencilView ); + GET_SET_ACCESSOR( ID3D11RenderTargetView*, D3D11RenderTargetView ); + GET_SET_ACCESSOR( ID3D11RasterizerState*, D3D11RasterizerState ); + + GET_SET_ACCESSOR( ID3D11Device1*, D3D11Device1 ); + GET_SET_ACCESSOR( ID3D11DeviceContext1*, D3D11DeviceContext1 ); + +#ifdef USE_DIRECT3D11_2 + GET_SET_ACCESSOR(ID3D11Device2*, D3D11Device2); + GET_SET_ACCESSOR(ID3D11DeviceContext2*, D3D11DeviceContext2); +#endif + +#ifdef USE_DIRECT3D11_3 + GET_SET_ACCESSOR(ID3D11Device3*, D3D11Device3); + GET_SET_ACCESSOR(ID3D11DeviceContext3*, D3D11DeviceContext3); +#endif + + GET_SET_ACCESSOR( HWND, HWNDFocus ); + GET_SET_ACCESSOR( HWND, HWNDDeviceFullScreen ); + GET_SET_ACCESSOR( HWND, HWNDDeviceWindowed ); + GET_SET_ACCESSOR( HMONITOR, AdapterMonitor ); + GET_SET_ACCESSOR( HMENU, Menu ); + + GET_SET_ACCESSOR( UINT, FullScreenBackBufferWidthAtModeChange ); + GET_SET_ACCESSOR( UINT, FullScreenBackBufferHeightAtModeChange ); + GET_SET_ACCESSOR( UINT, WindowBackBufferWidthAtModeChange ); + GET_SET_ACCESSOR( UINT, WindowBackBufferHeightAtModeChange ); + GETP_SETP_ACCESSOR( WINDOWPLACEMENT, WindowedPlacement ); + GET_SET_ACCESSOR( DWORD, WindowedStyleAtModeChange ); + GET_SET_ACCESSOR( bool, TopmostWhileWindowed ); + GET_SET_ACCESSOR( bool, Minimized ); + GET_SET_ACCESSOR( bool, Maximized ); + GET_SET_ACCESSOR( bool, MinimizedWhileFullscreen ); + GET_SET_ACCESSOR( bool, IgnoreSizeChange ); + + GET_SET_ACCESSOR( double, Time ); + GET_SET_ACCESSOR( double, AbsoluteTime ); + GET_SET_ACCESSOR( float, ElapsedTime ); + + GET_SET_ACCESSOR( HINSTANCE, HInstance ); + GET_SET_ACCESSOR( double, LastStatsUpdateTime ); + GET_SET_ACCESSOR( DWORD, LastStatsUpdateFrames ); + GET_SET_ACCESSOR( float, FPS ); + GET_SET_ACCESSOR( int, CurrentFrameNumber ); + GET_SET_ACCESSOR( HHOOK, KeyboardHook ); + GET_SET_ACCESSOR( bool, AllowShortcutKeysWhenFullscreen ); + GET_SET_ACCESSOR( bool, AllowShortcutKeysWhenWindowed ); + GET_SET_ACCESSOR( bool, AllowShortcutKeys ); + GET_SET_ACCESSOR( bool, CallDefWindowProc ); + GET_SET_ACCESSOR( STICKYKEYS, StartupStickyKeys ); + GET_SET_ACCESSOR( TOGGLEKEYS, StartupToggleKeys ); + GET_SET_ACCESSOR( FILTERKEYS, StartupFilterKeys ); + + GET_SET_ACCESSOR( bool, HandleEscape ); + GET_SET_ACCESSOR( bool, HandleAltEnter ); + GET_SET_ACCESSOR( bool, HandlePause ); + GET_SET_ACCESSOR( bool, ShowMsgBoxOnError ); + GET_SET_ACCESSOR( bool, NoStats ); + GET_SET_ACCESSOR( bool, ClipCursorWhenFullScreen ); + GET_SET_ACCESSOR( bool, ShowCursorWhenFullScreen ); + GET_SET_ACCESSOR( bool, ConstantFrameTime ); + GET_SET_ACCESSOR( float, TimePerFrame ); + GET_SET_ACCESSOR( bool, WireframeMode ); + GET_SET_ACCESSOR( bool, AutoChangeAdapter ); + GET_SET_ACCESSOR( bool, WindowCreatedWithDefaultPositions ); + GET_SET_ACCESSOR( int, ExitCode ); + + GET_SET_ACCESSOR( bool, DXUTInited ); + GET_SET_ACCESSOR( bool, WindowCreated ); + GET_SET_ACCESSOR( bool, DeviceCreated ); + GET_SET_ACCESSOR( bool, DXUTInitCalled ); + GET_SET_ACCESSOR( bool, WindowCreateCalled ); + GET_SET_ACCESSOR( bool, DeviceCreateCalled ); + GET_SET_ACCESSOR( bool, InsideDeviceCallback ); + GET_SET_ACCESSOR( bool, InsideMainloop ); + GET_SET_ACCESSOR( bool, DeviceObjectsCreated ); + GET_SET_ACCESSOR( bool, DeviceObjectsReset ); + GET_SET_ACCESSOR( bool, Active ); + GET_SET_ACCESSOR( bool, RenderingPaused ); + GET_SET_ACCESSOR( bool, TimePaused ); + GET_SET_ACCESSOR( int, PauseRenderingCount ); + GET_SET_ACCESSOR( int, PauseTimeCount ); + GET_SET_ACCESSOR( bool, DeviceLost ); + GET_SET_ACCESSOR( bool, NotifyOnMouseMove ); + GET_SET_ACCESSOR( bool, Automation ); + GET_SET_ACCESSOR( bool, InSizeMove ); + GET_SET_ACCESSOR( UINT, TimerLastID ); + GET_SET_ACCESSOR( bool, MessageWhenD3D11NotAvailable ); + GET_SET_ACCESSOR( bool, AppCalledWasKeyPressed ); + + GET_SET_ACCESSOR( D3D_FEATURE_LEVEL, OverrideForceFeatureLevel ); + GET_ACCESSOR( WCHAR*, ScreenShotName ); + GET_SET_ACCESSOR( bool, SaveScreenShot ); + GET_SET_ACCESSOR( bool, ExitAfterScreenShot ); + + GET_SET_ACCESSOR( int, OverrideAdapterOrdinal ); + GET_SET_ACCESSOR( bool, OverrideWindowed ); + GET_SET_ACCESSOR( int, OverrideOutput ); + GET_SET_ACCESSOR( bool, OverrideFullScreen ); + GET_SET_ACCESSOR( int, OverrideStartX ); + GET_SET_ACCESSOR( int, OverrideStartY ); + GET_SET_ACCESSOR( int, OverrideWidth ); + GET_SET_ACCESSOR( int, OverrideHeight ); + GET_SET_ACCESSOR( bool, OverrideForceHAL ); + GET_SET_ACCESSOR( bool, OverrideForceREF ); + GET_SET_ACCESSOR( bool, OverrideForceWARP ); + GET_SET_ACCESSOR( bool, OverrideConstantFrameTime ); + GET_SET_ACCESSOR( float, OverrideConstantTimePerFrame ); + GET_SET_ACCESSOR( int, OverrideQuitAfterFrame ); + GET_SET_ACCESSOR( int, OverrideForceVsync ); + GET_SET_ACCESSOR( bool, ReleasingSwapChain ); + GET_SET_ACCESSOR( bool, IsInGammaCorrectMode ); + + GET_SET_ACCESSOR( LPDXUTCALLBACKMODIFYDEVICESETTINGS, ModifyDeviceSettingsFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKDEVICEREMOVED, DeviceRemovedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKFRAMEMOVE, FrameMoveFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKKEYBOARD, KeyboardFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKMOUSE, MouseFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKMSGPROC, WindowMsgFunc ); + + GET_SET_ACCESSOR( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE, IsD3D11DeviceAcceptableFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11DEVICECREATED, D3D11DeviceCreatedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11SWAPCHAINRESIZED, D3D11SwapChainResizedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11SWAPCHAINRELEASING, D3D11SwapChainReleasingFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11DEVICEDESTROYED, D3D11DeviceDestroyedFunc ); + GET_SET_ACCESSOR( LPDXUTCALLBACKD3D11FRAMERENDER, D3D11FrameRenderFunc ); + + GET_SET_ACCESSOR( void*, ModifyDeviceSettingsFuncUserContext ); + GET_SET_ACCESSOR( void*, DeviceRemovedFuncUserContext ); + GET_SET_ACCESSOR( void*, FrameMoveFuncUserContext ); + GET_SET_ACCESSOR( void*, KeyboardFuncUserContext ); + GET_SET_ACCESSOR( void*, MouseFuncUserContext ); + GET_SET_ACCESSOR( void*, WindowMsgFuncUserContext ); + + GET_SET_ACCESSOR( void*, IsD3D11DeviceAcceptableFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11DeviceCreatedFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11DeviceDestroyedFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11SwapChainResizedFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11SwapChainReleasingFuncUserContext ); + GET_SET_ACCESSOR( void*, D3D11FrameRenderFuncUserContext ); + + GET_SET_ACCESSOR( std::vector*, TimerList ); + GET_ACCESSOR( bool*, Keys ); + GET_ACCESSOR( bool*, LastKeys ); + GET_ACCESSOR( bool*, MouseButtons ); + GET_ACCESSOR( WCHAR*, StaticFrameStats ); + GET_ACCESSOR( WCHAR*, FPSStats ); + GET_ACCESSOR( WCHAR*, FrameStats ); + GET_ACCESSOR( WCHAR*, DeviceStats ); + GET_ACCESSOR( WCHAR*, WindowTitle ); +}; + + +//-------------------------------------------------------------------------------------- +// Global state +//-------------------------------------------------------------------------------------- +DXUTState* g_pDXUTState = nullptr; + +HRESULT WINAPI DXUTCreateState() +{ + if( !g_pDXUTState ) + { + g_pDXUTState = new (std::nothrow) DXUTState; + if( !g_pDXUTState ) + return E_OUTOFMEMORY; + } + return S_OK; +} + +void WINAPI DXUTDestroyState() +{ + SAFE_DELETE( g_pDXUTState ); +} + +class DXUTMemoryHelper +{ +public: + DXUTMemoryHelper() { DXUTCreateState(); } + ~DXUTMemoryHelper() { DXUTDestroyState(); } +}; + +DXUTState& GetDXUTState() +{ + // This class will auto create the memory when its first accessed and delete it after the program exits WinMain. + // However the application can also call DXUTCreateState() & DXUTDestroyState() independantly if its wants + static DXUTMemoryHelper memory; + assert( g_pDXUTState ); + _Analysis_assume_( g_pDXUTState ); + return *g_pDXUTState; +} + + +//-------------------------------------------------------------------------------------- +// Internal functions forward declarations +//-------------------------------------------------------------------------------------- +void DXUTParseCommandLine( _In_z_ WCHAR* strCommandLine, + _In_ bool bIgnoreFirstCommand = true ); +bool DXUTIsNextArg( _Inout_ WCHAR*& strCmdLine, _In_ const WCHAR* strArg ); +bool DXUTGetCmdParam( _Inout_ WCHAR*& strCmdLine, _Out_cap_(cchDest) WCHAR* strFlag, _In_ int cchDest ); +void DXUTAllowShortcutKeys( _In_ bool bAllowKeys ); +void DXUTUpdateStaticFrameStats(); +void DXUTUpdateFrameStats(); + +LRESULT CALLBACK DXUTStaticWndProc( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); +void DXUTHandleTimers(); +void DXUTDisplayErrorMessage( _In_ HRESULT hr ); +int DXUTMapButtonToArrayIndex( _In_ BYTE vButton ); + +HRESULT DXUTChangeDevice( _In_ DXUTDeviceSettings* pNewDeviceSettings, + _In_ bool bClipWindowToSingleAdapter ); + +bool DXUTCanDeviceBeReset( _In_ DXUTDeviceSettings* pOldDeviceSettings, + _In_ DXUTDeviceSettings* pNewDeviceSettings, + _In_ ID3D11Device* pd3d11DeviceFromApp ); + + +HRESULT DXUTDelayLoadDXGI(); +HRESULT DXUTSnapDeviceSettingsToEnumDevice( _In_ DXUTDeviceSettings* pDeviceSettings, _In_ bool forceEnum, _In_ D3D_FEATURE_LEVEL forceFL = D3D_FEATURE_LEVEL(0) ); +void DXUTUpdateDeviceSettingsWithOverrides( _Inout_ DXUTDeviceSettings* pDeviceSettings ); +void DXUTCheckForDXGIFullScreenSwitch(); +void DXUTResizeDXGIBuffers( _In_ UINT Width, _In_ UINT Height, _In_ BOOL bFullscreen ); +void DXUTCheckForDXGIBufferChange(); +void DXUTCheckForWindowSizeChange(); +void DXUTCheckForWindowChangingMonitors(); +void DXUTCleanup3DEnvironment( _In_ bool bReleaseSettings ); +HMONITOR DXUTGetMonitorFromAdapter( _In_ DXUTDeviceSettings* pDeviceSettings ); +HRESULT DXUTGetAdapterOrdinalFromMonitor( _In_ HMONITOR hMonitor, _Out_ UINT* pAdapterOrdinal ); +HRESULT DXUTGetOutputOrdinalFromMonitor( _In_ HMONITOR hMonitor, _Out_ UINT* pOutputOrdinal ); +HRESULT DXUTHandleDeviceRemoved(); +void DXUTUpdateBackBufferDesc(); +void DXUTSetupCursor(); + +// Direct3D 11 +HRESULT DXUTCreateD3D11Views( _In_ ID3D11Device* pd3dDevice, _In_ ID3D11DeviceContext* pd3dDeviceContext, _In_ DXUTDeviceSettings* pDeviceSettings ); +HRESULT DXUTCreate3DEnvironment11(); +HRESULT DXUTReset3DEnvironment11(); +void DXUTUpdateD3D11DeviceStats( _In_ D3D_DRIVER_TYPE DeviceType, _In_ D3D_FEATURE_LEVEL featureLevel, _In_ DXGI_ADAPTER_DESC* pAdapterDesc ); + + +//-------------------------------------------------------------------------------------- +// Internal helper functions +//-------------------------------------------------------------------------------------- +UINT DXUTGetBackBufferWidthFromDS( _In_ DXUTDeviceSettings* pNewDeviceSettings ) +{ + return pNewDeviceSettings->d3d11.sd.BufferDesc.Width; +} +UINT DXUTGetBackBufferHeightFromDS( _In_ DXUTDeviceSettings* pNewDeviceSettings ) +{ + return pNewDeviceSettings->d3d11.sd.BufferDesc.Height; +} +bool DXUTGetIsWindowedFromDS( _In_ DXUTDeviceSettings* pNewDeviceSettings ) +{ + if (!pNewDeviceSettings) + return true; + + return pNewDeviceSettings->d3d11.sd.Windowed ? true : false; +} + + +//-------------------------------------------------------------------------------------- +// External state access functions +//-------------------------------------------------------------------------------------- +bool WINAPI DXUTGetMSAASwapChainCreated() +{ + DXUTDeviceSettings *psettings = GetDXUTState().GetCurrentDeviceSettings(); + if ( !psettings ) + return false; + return (psettings->d3d11.sd.SampleDesc.Count > 1); +} +D3D_FEATURE_LEVEL WINAPI DXUTGetD3D11DeviceFeatureLevel() { return GetDXUTState().GetD3D11FeatureLevel(); } +IDXGISwapChain* WINAPI DXUTGetDXGISwapChain() { return GetDXUTState().GetDXGISwapChain(); } +ID3D11RenderTargetView* WINAPI DXUTGetD3D11RenderTargetView() { return GetDXUTState().GetD3D11RenderTargetView(); } +ID3D11DepthStencilView* WINAPI DXUTGetD3D11DepthStencilView() { return GetDXUTState().GetD3D11DepthStencilView(); } +const DXGI_SURFACE_DESC* WINAPI DXUTGetDXGIBackBufferSurfaceDesc() { return GetDXUTState().GetBackBufferSurfaceDescDXGI(); } +HINSTANCE WINAPI DXUTGetHINSTANCE() { return GetDXUTState().GetHInstance(); } +HWND WINAPI DXUTGetHWND() { return DXUTIsWindowed() ? GetDXUTState().GetHWNDDeviceWindowed() : GetDXUTState().GetHWNDDeviceFullScreen(); } +HWND WINAPI DXUTGetHWNDFocus() { return GetDXUTState().GetHWNDFocus(); } +HWND WINAPI DXUTGetHWNDDeviceFullScreen() { return GetDXUTState().GetHWNDDeviceFullScreen(); } +HWND WINAPI DXUTGetHWNDDeviceWindowed() { return GetDXUTState().GetHWNDDeviceWindowed(); } +RECT WINAPI DXUTGetWindowClientRect() { RECT rc; GetClientRect( DXUTGetHWND(), &rc ); return rc; } +LONG WINAPI DXUTGetWindowWidth() { RECT rc = DXUTGetWindowClientRect(); return ((LONG)rc.right - rc.left); } +LONG WINAPI DXUTGetWindowHeight() { RECT rc = DXUTGetWindowClientRect(); return ((LONG)rc.bottom - rc.top); } +RECT WINAPI DXUTGetWindowClientRectAtModeChange() { RECT rc = { 0, 0, static_cast( GetDXUTState().GetWindowBackBufferWidthAtModeChange() ), static_cast( GetDXUTState().GetWindowBackBufferHeightAtModeChange() ) }; return rc; } +RECT WINAPI DXUTGetFullsceenClientRectAtModeChange() { RECT rc = { 0, 0, static_cast( GetDXUTState().GetFullScreenBackBufferWidthAtModeChange() ), static_cast( GetDXUTState().GetFullScreenBackBufferHeightAtModeChange() ) }; return rc; } +double WINAPI DXUTGetTime() { return GetDXUTState().GetTime(); } +float WINAPI DXUTGetElapsedTime() { return GetDXUTState().GetElapsedTime(); } +float WINAPI DXUTGetFPS() { return GetDXUTState().GetFPS(); } +LPCWSTR WINAPI DXUTGetWindowTitle() { return GetDXUTState().GetWindowTitle(); } +LPCWSTR WINAPI DXUTGetDeviceStats() { return GetDXUTState().GetDeviceStats(); } +bool WINAPI DXUTIsRenderingPaused() { return GetDXUTState().GetPauseRenderingCount() > 0; } +bool WINAPI DXUTIsTimePaused() { return GetDXUTState().GetPauseTimeCount() > 0; } +bool WINAPI DXUTIsActive() { return GetDXUTState().GetActive(); } +int WINAPI DXUTGetExitCode() { return GetDXUTState().GetExitCode(); } +bool WINAPI DXUTGetShowMsgBoxOnError() { return GetDXUTState().GetShowMsgBoxOnError(); } +bool WINAPI DXUTGetAutomation() { return GetDXUTState().GetAutomation(); } +bool WINAPI DXUTIsWindowed() { return DXUTGetIsWindowedFromDS( GetDXUTState().GetCurrentDeviceSettings() ); } +bool WINAPI DXUTIsInGammaCorrectMode() { return GetDXUTState().GetIsInGammaCorrectMode(); } +IDXGIFactory1* WINAPI DXUTGetDXGIFactory() { DXUTDelayLoadDXGI(); return GetDXUTState().GetDXGIFactory(); } + +ID3D11Device* WINAPI DXUTGetD3D11Device() { return GetDXUTState().GetD3D11Device(); } +ID3D11DeviceContext* WINAPI DXUTGetD3D11DeviceContext() { return GetDXUTState().GetD3D11DeviceContext(); } +ID3D11Device1* WINAPI DXUTGetD3D11Device1() { return GetDXUTState().GetD3D11Device1(); } +ID3D11DeviceContext1* WINAPI DXUTGetD3D11DeviceContext1() { return GetDXUTState().GetD3D11DeviceContext1(); } + +#ifdef USE_DIRECT3D11_2 +ID3D11Device2* WINAPI DXUTGetD3D11Device2() { return GetDXUTState().GetD3D11Device2(); } +ID3D11DeviceContext2* WINAPI DXUTGetD3D11DeviceContext2() { return GetDXUTState().GetD3D11DeviceContext2(); } +#endif + +#ifdef USE_DIRECT3D11_3 +ID3D11Device3* WINAPI DXUTGetD3D11Device3() { return GetDXUTState().GetD3D11Device3(); } +ID3D11DeviceContext3* WINAPI DXUTGetD3D11DeviceContext3() { return GetDXUTState().GetD3D11DeviceContext3(); } +#endif + +//-------------------------------------------------------------------------------------- +// External callback setup functions +//-------------------------------------------------------------------------------------- + +// General callbacks +void WINAPI DXUTSetCallbackDeviceChanging( _In_ LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetModifyDeviceSettingsFunc( pCallback ); GetDXUTState().SetModifyDeviceSettingsFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackDeviceRemoved( _In_ LPDXUTCALLBACKDEVICEREMOVED pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetDeviceRemovedFunc( pCallback ); GetDXUTState().SetDeviceRemovedFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackFrameMove( _In_ LPDXUTCALLBACKFRAMEMOVE pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetFrameMoveFunc( pCallback ); GetDXUTState().SetFrameMoveFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackKeyboard( _In_ LPDXUTCALLBACKKEYBOARD pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetKeyboardFunc( pCallback ); GetDXUTState().SetKeyboardFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackMouse( _In_ LPDXUTCALLBACKMOUSE pCallback, bool bIncludeMouseMove, _In_opt_ void* pUserContext ) { GetDXUTState().SetMouseFunc( pCallback ); GetDXUTState().SetNotifyOnMouseMove( bIncludeMouseMove ); GetDXUTState().SetMouseFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackMsgProc( _In_ LPDXUTCALLBACKMSGPROC pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetWindowMsgFunc( pCallback ); GetDXUTState().SetWindowMsgFuncUserContext( pUserContext ); } + +// Direct3D 11 callbacks +void WINAPI DXUTSetCallbackD3D11DeviceAcceptable( _In_ LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetIsD3D11DeviceAcceptableFunc( pCallback ); GetDXUTState().SetIsD3D11DeviceAcceptableFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11DeviceCreated( _In_ LPDXUTCALLBACKD3D11DEVICECREATED pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetD3D11DeviceCreatedFunc( pCallback ); GetDXUTState().SetD3D11DeviceCreatedFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11SwapChainResized( _In_ LPDXUTCALLBACKD3D11SWAPCHAINRESIZED pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetD3D11SwapChainResizedFunc( pCallback ); GetDXUTState().SetD3D11SwapChainResizedFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11FrameRender( _In_ LPDXUTCALLBACKD3D11FRAMERENDER pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetD3D11FrameRenderFunc( pCallback ); GetDXUTState().SetD3D11FrameRenderFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11SwapChainReleasing( _In_ LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetD3D11SwapChainReleasingFunc( pCallback ); GetDXUTState().SetD3D11SwapChainReleasingFuncUserContext( pUserContext ); } +void WINAPI DXUTSetCallbackD3D11DeviceDestroyed( _In_ LPDXUTCALLBACKD3D11DEVICEDESTROYED pCallback, _In_opt_ void* pUserContext ) { GetDXUTState().SetD3D11DeviceDestroyedFunc( pCallback ); GetDXUTState().SetD3D11DeviceDestroyedFuncUserContext( pUserContext ); } +void DXUTGetCallbackD3D11DeviceAcceptable( _In_ LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE* ppCallback, _Outptr_ void** ppUserContext ) { *ppCallback = GetDXUTState().GetIsD3D11DeviceAcceptableFunc(); *ppUserContext = GetDXUTState().GetIsD3D11DeviceAcceptableFuncUserContext(); } + + +//-------------------------------------------------------------------------------------- +// Optionally parses the command line and sets if default hotkeys are handled +// +// Possible command line parameters are: +// -forcefeaturelevel:fl forces app to use a specified direct3D11 feature level +// -screenshotexit:filename save a screenshot to the filename.bmp and exit. +// -adapter:# forces app to use this adapter # (fails if the adapter doesn't exist) +// -output:# forces app to use a particular output on the adapter (fails if the output doesn't exist) +// -windowed forces app to start windowed +// -fullscreen forces app to start full screen +// -forcehal forces app to use HAL (fails if HAL doesn't exist) +// -forceref forces app to use REF (fails if REF doesn't exist) +// -forcewarp forces app to use WARP (fails if WARP doesn't exist) +// -forcevsync:# if # is 0, then vsync is disabled +// -width:# forces app to use # for width. for full screen, it will pick the closest possible supported mode +// -height:# forces app to use # for height. for full screen, it will pick the closest possible supported mode +// -startx:# forces app to use # for the x coord of the window position for windowed mode +// -starty:# forces app to use # for the y coord of the window position for windowed mode +// -constantframetime:# forces app to use constant frame time, where # is the time/frame in seconds +// -quitafterframe:x forces app to quit after # frames +// -noerrormsgboxes prevents the display of message boxes generated by the framework so the application can be run without user interaction +// -nostats prevents the display of the stats +// -automation a hint to other components that automation is active +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT WINAPI DXUTInit( bool bParseCommandLine, + bool bShowMsgBoxOnError, + WCHAR* strExtraCommandLineParams, + bool bThreadSafeDXUT ) +{ + g_bThreadSafe = bThreadSafeDXUT; + + HRESULT hr = CoInitializeEx( nullptr, COINIT_MULTITHREADED ); + if ( FAILED(hr) ) + return hr; + + GetDXUTState().SetDXUTInitCalled( true ); + + // Not always needed, but lets the app create GDI dialogs + InitCommonControls(); + + // Save the current sticky/toggle/filter key settings so DXUT can restore them later + STICKYKEYS sk = {sizeof(STICKYKEYS), 0}; + if ( !SystemParametersInfo(SPI_GETSTICKYKEYS, sizeof(STICKYKEYS), &sk, 0) ) + memset( &sk, 0, sizeof(sk) ); + GetDXUTState().SetStartupStickyKeys( sk ); + + TOGGLEKEYS tk = {sizeof(TOGGLEKEYS), 0}; + if ( !SystemParametersInfo(SPI_GETTOGGLEKEYS, sizeof(TOGGLEKEYS), &tk, 0) ) + memset( &tk, 0, sizeof(tk) ); + GetDXUTState().SetStartupToggleKeys( tk ); + + FILTERKEYS fk = {sizeof(FILTERKEYS), 0}; + if ( !SystemParametersInfo(SPI_GETFILTERKEYS, sizeof(FILTERKEYS), &fk, 0) ) + memset( &fk, 0, sizeof(fk) ); + GetDXUTState().SetStartupFilterKeys( fk ); + + GetDXUTState().SetShowMsgBoxOnError( bShowMsgBoxOnError ); + + if( bParseCommandLine ) + DXUTParseCommandLine( GetCommandLine() ); + if( strExtraCommandLineParams ) + DXUTParseCommandLine( strExtraCommandLineParams, false ); + + // Reset the timer + DXUTGetGlobalTimer()->Reset(); + + GetDXUTState().SetDXUTInited( true ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Parses the command line for parameters. See DXUTInit() for list +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void DXUTParseCommandLine(WCHAR* strCommandLine, + bool bIgnoreFirstCommand ) +{ + WCHAR* strCmdLine; + WCHAR strFlag[MAX_PATH]; + + int nNumArgs; + auto pstrArgList = CommandLineToArgvW( strCommandLine, &nNumArgs ); + int iArgStart = 0; + if( bIgnoreFirstCommand ) + iArgStart = 1; + for( int iArg = iArgStart; iArg < nNumArgs; iArg++ ) + { + strCmdLine = pstrArgList[iArg]; + + // Handle flag args + if( *strCmdLine == L'/' || *strCmdLine == L'-' ) + { + strCmdLine++; + + if( DXUTIsNextArg( strCmdLine, L"forcefeaturelevel" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { +#ifdef USE_DIRECT3D11_3 + if (_wcsnicmp(strFlag, L"D3D_FEATURE_LEVEL_12_1", MAX_PATH) == 0) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_12_1); + } + else if (_wcsnicmp(strFlag, L"D3D_FEATURE_LEVEL_12_0", MAX_PATH) == 0) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_12_0); + } + else +#endif + if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_11_1", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_11_1); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_11_0", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_11_0); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_10_1", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_10_1); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_10_0", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_10_0); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_9_3", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_9_3); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_9_2", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_9_2); + }else if (_wcsnicmp( strFlag, L"D3D_FEATURE_LEVEL_9_1", MAX_PATH) == 0 ) { + GetDXUTState().SetOverrideForceFeatureLevel(D3D_FEATURE_LEVEL_9_1); + } + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"adapter" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + int nAdapter = _wtoi( strFlag ); + GetDXUTState().SetOverrideAdapterOrdinal( nAdapter ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"windowed" ) ) + { + GetDXUTState().SetOverrideWindowed( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"output" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + int Output = _wtoi( strFlag ); + GetDXUTState().SetOverrideOutput( Output ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"fullscreen" ) ) + { + GetDXUTState().SetOverrideFullScreen( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"forcehal" ) ) + { + GetDXUTState().SetOverrideForceHAL( true ); + continue; + } + if( DXUTIsNextArg( strCmdLine, L"screenshotexit" ) ) { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + GetDXUTState().SetExitAfterScreenShot( true ); + GetDXUTState().SetSaveScreenShot( true ); + swprintf_s( GetDXUTState().GetScreenShotName(), 256, L"%ls.bmp", strFlag ); + continue; + } + } + if( DXUTIsNextArg( strCmdLine, L"forceref" ) ) + { + GetDXUTState().SetOverrideForceREF( true ); + continue; + } + if( DXUTIsNextArg( strCmdLine, L"forcewarp" ) ) + { + GetDXUTState().SetOverrideForceWARP( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"forcevsync" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + int nOn = _wtoi( strFlag ); + GetDXUTState().SetOverrideForceVsync( nOn ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"width" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + int nWidth = _wtoi( strFlag ); + GetDXUTState().SetOverrideWidth( nWidth ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"height" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + int nHeight = _wtoi( strFlag ); + GetDXUTState().SetOverrideHeight( nHeight ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"startx" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + int nX = _wtoi( strFlag ); + GetDXUTState().SetOverrideStartX( nX ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"starty" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + int nY = _wtoi( strFlag ); + GetDXUTState().SetOverrideStartY( nY ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"constantframetime" ) ) + { + float fTimePerFrame; + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + fTimePerFrame = ( float )wcstod( strFlag, nullptr ); + else + fTimePerFrame = 0.0333f; + GetDXUTState().SetOverrideConstantFrameTime( true ); + GetDXUTState().SetOverrideConstantTimePerFrame( fTimePerFrame ); + DXUTSetConstantFrameTime( true, fTimePerFrame ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"quitafterframe" ) ) + { + if( DXUTGetCmdParam( strCmdLine, strFlag, MAX_PATH ) ) + { + int nFrame = _wtoi( strFlag ); + GetDXUTState().SetOverrideQuitAfterFrame( nFrame ); + continue; + } + } + + if( DXUTIsNextArg( strCmdLine, L"noerrormsgboxes" ) ) + { + GetDXUTState().SetShowMsgBoxOnError( false ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"nostats" ) ) + { + GetDXUTState().SetNoStats( true ); + continue; + } + + if( DXUTIsNextArg( strCmdLine, L"automation" ) ) + { + GetDXUTState().SetAutomation( true ); + continue; + } + } + + // Unrecognized flag + wcscpy_s( strFlag, MAX_PATH, strCmdLine ); + WCHAR* strSpace = strFlag; + while( *strSpace && ( *strSpace > L' ' ) ) + strSpace++; + *strSpace = 0; + + DXUTOutputDebugString( L"Unrecognized flag: %ls", strFlag ); + strCmdLine += wcslen( strFlag ); + } + + LocalFree( pstrArgList ); +} + + +//-------------------------------------------------------------------------------------- +// Helper function for DXUTParseCommandLine +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool DXUTIsNextArg( WCHAR*& strCmdLine, const WCHAR* strArg ) +{ + size_t nArgLen = wcslen( strArg ); + size_t nCmdLen = wcslen( strCmdLine ); + + if( nCmdLen >= nArgLen && + _wcsnicmp( strCmdLine, strArg, nArgLen ) == 0 && + ( strCmdLine[nArgLen] == 0 || strCmdLine[nArgLen] == L':' ) ) + { + strCmdLine += nArgLen; + return true; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +// Helper function for DXUTParseCommandLine. Updates strCmdLine and strFlag +// Example: if strCmdLine=="-width:1024 -forceref" +// then after: strCmdLine==" -forceref" and strFlag=="1024" +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool DXUTGetCmdParam( WCHAR*& strCmdLine, WCHAR* strFlag, int cchDest ) +{ + if( *strCmdLine == L':' ) + { + strCmdLine++; // Skip ':' + + // Place nul terminator in strFlag after current token + wcscpy_s( strFlag, cchDest, strCmdLine ); + + WCHAR* strSpace = strFlag; + int count = 0; + while( *strSpace && ( *strSpace > L' ' ) && (count < cchDest) ) + { + ++strSpace; + ++count; + } + *strSpace = 0; + + // Update strCmdLine + strCmdLine += wcslen( strFlag ); + return true; + } + else + { + strFlag[0] = 0; + return false; + } +} + + +//-------------------------------------------------------------------------------------- +// Creates a window with the specified window title, icon, menu, and +// starting position. If DXUTInit() has not already been called, it will +// call it with the default parameters. Instead of calling this, you can +// call DXUTSetWindow() to use an existing window. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT WINAPI DXUTCreateWindow( const WCHAR* strWindowTitle, HINSTANCE hInstance, + HICON hIcon, HMENU hMenu, int x, int y ) +{ + HRESULT hr; + + // Not allowed to call this from inside the device callbacks + if( GetDXUTState().GetInsideDeviceCallback() ) + return DXUT_ERR_MSGBOX( L"DXUTCreateWindow", E_FAIL ); + + GetDXUTState().SetWindowCreateCalled( true ); + + if( !GetDXUTState().GetDXUTInited() ) + { + // If DXUTInit() was already called and failed, then fail. + // DXUTInit() must first succeed for this function to succeed + if( GetDXUTState().GetDXUTInitCalled() ) + return E_FAIL; + + // If DXUTInit() hasn't been called, then automatically call it + // with default params + hr = DXUTInit(); + if( FAILED( hr ) ) + return hr; + } + + if( !DXUTGetHWNDFocus() ) + { + if( !hInstance ) + hInstance = ( HINSTANCE )GetModuleHandle( nullptr ); + GetDXUTState().SetHInstance( hInstance ); + + WCHAR szExePath[MAX_PATH]; + GetModuleFileName( nullptr, szExePath, MAX_PATH ); + if( !hIcon ) // If the icon is NULL, then use the first one found in the exe + hIcon = ExtractIcon( hInstance, szExePath, 0 ); + + // Register the windows class + WNDCLASS wndClass; + wndClass.style = CS_DBLCLKS; + wndClass.lpfnWndProc = DXUTStaticWndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = hInstance; + wndClass.hIcon = hIcon; + wndClass.hCursor = LoadCursor( nullptr, IDC_ARROW ); + wndClass.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH ); + wndClass.lpszMenuName = nullptr; + wndClass.lpszClassName = L"Direct3DWindowClass"; + + if( !RegisterClass( &wndClass ) ) + { + DWORD dwError = GetLastError(); + if( dwError != ERROR_CLASS_ALREADY_EXISTS ) + return DXUT_ERR_MSGBOX( L"RegisterClass", HRESULT_FROM_WIN32(dwError) ); + } + + // Override the window's initial & size position if there were cmd line args + if( GetDXUTState().GetOverrideStartX() != -1 ) + x = GetDXUTState().GetOverrideStartX(); + if( GetDXUTState().GetOverrideStartY() != -1 ) + y = GetDXUTState().GetOverrideStartY(); + + GetDXUTState().SetWindowCreatedWithDefaultPositions( false ); + if( x == CW_USEDEFAULT && y == CW_USEDEFAULT ) + GetDXUTState().SetWindowCreatedWithDefaultPositions( true ); + + // Find the window's initial size, but it might be changed later + int nDefaultWidth = 800; + int nDefaultHeight = 600; + if( GetDXUTState().GetOverrideWidth() != 0 ) + nDefaultWidth = GetDXUTState().GetOverrideWidth(); + if( GetDXUTState().GetOverrideHeight() != 0 ) + nDefaultHeight = GetDXUTState().GetOverrideHeight(); + + RECT rc; + SetRect( &rc, 0, 0, nDefaultWidth, nDefaultHeight ); + AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, ( hMenu ) ? true : false ); + + WCHAR* strCachedWindowTitle = GetDXUTState().GetWindowTitle(); + wcscpy_s( strCachedWindowTitle, 256, strWindowTitle ); + + // Create the render window + HWND hWnd = CreateWindow( L"Direct3DWindowClass", strWindowTitle, WS_OVERLAPPEDWINDOW, + x, y, ( rc.right - rc.left ), ( rc.bottom - rc.top ), 0, + hMenu, hInstance, 0 ); + if( !hWnd ) + { + DWORD dwError = GetLastError(); + return DXUT_ERR_MSGBOX( L"CreateWindow", HRESULT_FROM_WIN32(dwError) ); + } + + GetDXUTState().SetWindowCreated( true ); + GetDXUTState().SetHWNDFocus( hWnd ); + GetDXUTState().SetHWNDDeviceFullScreen( hWnd ); + GetDXUTState().SetHWNDDeviceWindowed( hWnd ); + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Sets a previously created window for the framework to use. If DXUTInit() +// has not already been called, it will call it with the default parameters. +// Instead of calling this, you can call DXUTCreateWindow() to create a new window. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT WINAPI DXUTSetWindow( HWND hWndFocus, HWND hWndDeviceFullScreen, HWND hWndDeviceWindowed, bool bHandleMessages ) +{ + HRESULT hr; + + // Not allowed to call this from inside the device callbacks + if( GetDXUTState().GetInsideDeviceCallback() ) + return DXUT_ERR_MSGBOX( L"DXUTCreateWindow", E_FAIL ); + + GetDXUTState().SetWindowCreateCalled( true ); + + // To avoid confusion, we do not allow any HWND to be nullptr here. The + // caller must pass in valid HWND for all three parameters. The same + // HWND may be used for more than one parameter. + if( !hWndFocus || !hWndDeviceFullScreen || !hWndDeviceWindowed ) + return DXUT_ERR_MSGBOX( L"DXUTSetWindow", E_INVALIDARG ); + + // If subclassing the window, set the pointer to the local window procedure + if( bHandleMessages ) + { + // Switch window procedures + LONG_PTR nResult = SetWindowLongPtr( hWndFocus, GWLP_WNDPROC, (LONG_PTR)DXUTStaticWndProc ); + + DWORD dwError = GetLastError(); + if( nResult == 0 ) + return DXUT_ERR_MSGBOX( L"SetWindowLongPtr", HRESULT_FROM_WIN32(dwError) ); + } + + if( !GetDXUTState().GetDXUTInited() ) + { + // If DXUTInit() was already called and failed, then fail. + // DXUTInit() must first succeed for this function to succeed + if( GetDXUTState().GetDXUTInitCalled() ) + return E_FAIL; + + // If DXUTInit() hasn't been called, then automatically call it + // with default params + hr = DXUTInit(); + if( FAILED( hr ) ) + return hr; + } + + WCHAR* strCachedWindowTitle = GetDXUTState().GetWindowTitle(); + GetWindowText( hWndFocus, strCachedWindowTitle, 255 ); + strCachedWindowTitle[255] = 0; + + HINSTANCE hInstance = ( HINSTANCE )( LONG_PTR )GetWindowLongPtr( hWndFocus, GWLP_HINSTANCE ); + GetDXUTState().SetHInstance( hInstance ); + GetDXUTState().SetWindowCreatedWithDefaultPositions( false ); + GetDXUTState().SetWindowCreated( true ); + GetDXUTState().SetHWNDFocus( hWndFocus ); + GetDXUTState().SetHWNDDeviceFullScreen( hWndDeviceFullScreen ); + GetDXUTState().SetHWNDDeviceWindowed( hWndDeviceWindowed ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Handles window messages +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +LRESULT CALLBACK DXUTStaticWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + + // Consolidate the keyboard messages and pass them to the app's keyboard callback + if( uMsg == WM_KEYDOWN || + uMsg == WM_SYSKEYDOWN || + uMsg == WM_KEYUP || + uMsg == WM_SYSKEYUP ) + { + bool bKeyDown = ( uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN ); + DWORD dwMask = ( 1 << 29 ); + bool bAltDown = ( ( lParam & dwMask ) != 0 ); + + bool* bKeys = GetDXUTState().GetKeys(); + bKeys[ ( BYTE )( wParam & 0xFF ) ] = bKeyDown; + + LPDXUTCALLBACKKEYBOARD pCallbackKeyboard = GetDXUTState().GetKeyboardFunc(); + if( pCallbackKeyboard ) + pCallbackKeyboard( ( UINT )wParam, bKeyDown, bAltDown, GetDXUTState().GetKeyboardFuncUserContext() ); + } + + // Consolidate the mouse button messages and pass them to the app's mouse callback + if( uMsg == WM_LBUTTONDOWN || + uMsg == WM_LBUTTONUP || + uMsg == WM_LBUTTONDBLCLK || + uMsg == WM_MBUTTONDOWN || + uMsg == WM_MBUTTONUP || + uMsg == WM_MBUTTONDBLCLK || + uMsg == WM_RBUTTONDOWN || + uMsg == WM_RBUTTONUP || + uMsg == WM_RBUTTONDBLCLK || + uMsg == WM_XBUTTONDOWN || + uMsg == WM_XBUTTONUP || + uMsg == WM_XBUTTONDBLCLK || + uMsg == WM_MOUSEWHEEL || + ( GetDXUTState().GetNotifyOnMouseMove() && uMsg == WM_MOUSEMOVE ) ) + { + int xPos = ( short )LOWORD( lParam ); + int yPos = ( short )HIWORD( lParam ); + + if( uMsg == WM_MOUSEWHEEL ) + { + // WM_MOUSEWHEEL passes screen mouse coords + // so convert them to client coords + POINT pt; + pt.x = xPos; pt.y = yPos; + ScreenToClient( hWnd, &pt ); + xPos = pt.x; yPos = pt.y; + } + + int nMouseWheelDelta = 0; + if( uMsg == WM_MOUSEWHEEL ) + nMouseWheelDelta = ( short )HIWORD( wParam ); + + int nMouseButtonState = LOWORD( wParam ); + bool bLeftButton = ( ( nMouseButtonState & MK_LBUTTON ) != 0 ); + bool bRightButton = ( ( nMouseButtonState & MK_RBUTTON ) != 0 ); + bool bMiddleButton = ( ( nMouseButtonState & MK_MBUTTON ) != 0 ); + bool bSideButton1 = ( ( nMouseButtonState & MK_XBUTTON1 ) != 0 ); + bool bSideButton2 = ( ( nMouseButtonState & MK_XBUTTON2 ) != 0 ); + + bool* bMouseButtons = GetDXUTState().GetMouseButtons(); + bMouseButtons[0] = bLeftButton; + bMouseButtons[1] = bMiddleButton; + bMouseButtons[2] = bRightButton; + bMouseButtons[3] = bSideButton1; + bMouseButtons[4] = bSideButton2; + + LPDXUTCALLBACKMOUSE pCallbackMouse = GetDXUTState().GetMouseFunc(); + if( pCallbackMouse ) + pCallbackMouse( bLeftButton, bRightButton, bMiddleButton, bSideButton1, bSideButton2, nMouseWheelDelta, + xPos, yPos, GetDXUTState().GetMouseFuncUserContext() ); + } + + // TODO - WM_POINTER for touch when on Windows 8.0 + + // Pass all messages to the app's MsgProc callback, and don't + // process further messages if the apps says not to. + LPDXUTCALLBACKMSGPROC pCallbackMsgProc = GetDXUTState().GetWindowMsgFunc(); + if( pCallbackMsgProc ) + { + bool bNoFurtherProcessing = false; + LRESULT nResult = pCallbackMsgProc( hWnd, uMsg, wParam, lParam, &bNoFurtherProcessing, + GetDXUTState().GetWindowMsgFuncUserContext() ); + if( bNoFurtherProcessing ) + return nResult; + } + + switch( uMsg ) + { + case WM_PAINT: + { + // Handle paint messages when the app is paused + if( DXUTIsRenderingPaused() && + GetDXUTState().GetDeviceObjectsCreated() && GetDXUTState().GetDeviceObjectsReset() ) + { + HRESULT hr; + double fTime = DXUTGetTime(); + float fElapsedTime = DXUTGetElapsedTime(); + + { + auto pd3dDevice = DXUTGetD3D11Device(); + auto pDeferred = DXUTGetD3D11DeviceContext(); + if( pd3dDevice ) + { + LPDXUTCALLBACKD3D11FRAMERENDER pCallbackFrameRender = GetDXUTState().GetD3D11FrameRenderFunc(); + if( pCallbackFrameRender && + !GetDXUTState().GetRenderingOccluded() ) + { + pCallbackFrameRender( pd3dDevice,pDeferred, fTime, fElapsedTime, + GetDXUTState().GetD3D11FrameRenderFuncUserContext() ); + } + + DWORD dwFlags = 0; + if( GetDXUTState().GetRenderingOccluded() ) + dwFlags = DXGI_PRESENT_TEST; + else + dwFlags = GetDXUTState().GetCurrentDeviceSettings()->d3d11.PresentFlags; + + auto pSwapChain = DXUTGetDXGISwapChain(); + hr = pSwapChain->Present( 0, dwFlags ); + if( DXGI_STATUS_OCCLUDED == hr ) + { + // There is a window covering our entire rendering area. + // Don't render until we're visible again. + GetDXUTState().SetRenderingOccluded( true ); + } + else if( SUCCEEDED( hr ) ) + { + if( GetDXUTState().GetRenderingOccluded() ) + { + // Now that we're no longer occluded + // allow us to render again + GetDXUTState().SetRenderingOccluded( false ); + } + } + } + } + } + break; + } + + case WM_SIZE: + + if( SIZE_MINIMIZED == wParam ) + { + DXUTPause( true, true ); // Pause while we're minimized + + GetDXUTState().SetMinimized( true ); + GetDXUTState().SetMaximized( false ); + } + else + { + RECT rcCurrentClient; + GetClientRect( DXUTGetHWND(), &rcCurrentClient ); + if( rcCurrentClient.top == 0 && rcCurrentClient.bottom == 0 ) + { + // Rapidly clicking the task bar to minimize and restore a window + // can cause a WM_SIZE message with SIZE_RESTORED when + // the window has actually become minimized due to rapid change + // so just ignore this message + } + else if( SIZE_MAXIMIZED == wParam ) + { + if( GetDXUTState().GetMinimized() ) + DXUTPause( false, false ); // Unpause since we're no longer minimized + GetDXUTState().SetMinimized( false ); + GetDXUTState().SetMaximized( true ); + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + } + else if( SIZE_RESTORED == wParam ) + { + //DXUTCheckForDXGIFullScreenSwitch(); + if( GetDXUTState().GetMaximized() ) + { + GetDXUTState().SetMaximized( false ); + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + } + else if( GetDXUTState().GetMinimized() ) + { + DXUTPause( false, false ); // Unpause since we're no longer minimized + GetDXUTState().SetMinimized( false ); + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + } + else if( GetDXUTState().GetInSizeMove() ) + { + // If we're neither maximized nor minimized, the window size + // is changing by the user dragging the window edges. In this + // case, we don't reset the device yet -- we wait until the + // user stops dragging, and a WM_EXITSIZEMOVE message comes. + } + else + { + // This WM_SIZE come from resizing the window via an API like SetWindowPos() so + // resize and reset the device now. + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + } + } + } + break; + + case WM_GETMINMAXINFO: + ( ( MINMAXINFO* )lParam )->ptMinTrackSize.x = DXUT_MIN_WINDOW_SIZE_X; + ( ( MINMAXINFO* )lParam )->ptMinTrackSize.y = DXUT_MIN_WINDOW_SIZE_Y; + break; + + case WM_ENTERSIZEMOVE: + // Halt frame movement while the app is sizing or moving + DXUTPause( true, true ); + GetDXUTState().SetInSizeMove( true ); + break; + + case WM_EXITSIZEMOVE: + DXUTPause( false, false ); + DXUTCheckForWindowSizeChange(); + DXUTCheckForWindowChangingMonitors(); + GetDXUTState().SetInSizeMove( false ); + break; + + case WM_SETCURSOR: + if( DXUTIsActive() && !DXUTIsWindowed() ) + { + if( !GetDXUTState().GetShowCursorWhenFullScreen() ) + SetCursor( nullptr ); + + return true; // prevent Windows from setting cursor to window class cursor + } + break; + + case WM_ACTIVATEAPP: + if( wParam == TRUE && !DXUTIsActive() ) // Handle only if previously not active + { + GetDXUTState().SetActive( true ); + + // Enable controller rumble & input when activating app + DXUTEnableXInput( true ); + + // The GetMinimizedWhileFullscreen() varible is used instead of !DXUTIsWindowed() + // to handle the rare case toggling to windowed mode while the fullscreen application + // is minimized and thus making the pause count wrong + if( GetDXUTState().GetMinimizedWhileFullscreen() ) + { + GetDXUTState().SetMinimizedWhileFullscreen( false ); + + DXUTToggleFullScreen(); + } + + // Upon returning to this app, potentially disable shortcut keys + // (Windows key, accessibility shortcuts) + DXUTAllowShortcutKeys( ( DXUTIsWindowed() ) ? GetDXUTState().GetAllowShortcutKeysWhenWindowed() : + GetDXUTState().GetAllowShortcutKeysWhenFullscreen() ); + + } + else if( wParam == FALSE && DXUTIsActive() ) // Handle only if previously active + { + GetDXUTState().SetActive( false ); + + // Disable any controller rumble & input when de-activating app + DXUTEnableXInput( false ); + + if( !DXUTIsWindowed() ) + { + // Going from full screen to a minimized state + ClipCursor( nullptr ); // don't limit the cursor anymore + GetDXUTState().SetMinimizedWhileFullscreen( true ); + } + + // Restore shortcut keys (Windows key, accessibility shortcuts) to original state + // + // This is important to call here if the shortcuts are disabled, + // because if this is not done then the Windows key will continue to + // be disabled while this app is running which is very bad. + // If the app crashes, the Windows key will return to normal. + DXUTAllowShortcutKeys( true ); + } + break; + + case WM_ENTERMENULOOP: + // Pause the app when menus are displayed + DXUTPause( true, true ); + break; + + case WM_EXITMENULOOP: + DXUTPause( false, false ); + break; + + case WM_MENUCHAR: + // A menu is active and the user presses a key that does not correspond to any mnemonic or accelerator key + // So just ignore and don't beep + return MAKELRESULT( 0, MNC_CLOSE ); + break; + + case WM_NCHITTEST: + // Prevent the user from selecting the menu in full screen mode + if( !DXUTIsWindowed() ) + return HTCLIENT; + break; + + case WM_POWERBROADCAST: + switch( wParam ) + { + case PBT_APMQUERYSUSPEND: + // At this point, the app should save any data for open + // network connections, files, etc., and prepare to go into + // a suspended mode. The app can use the MsgProc callback + // to handle this if desired. + return true; + + case PBT_APMRESUMESUSPEND: + // At this point, the app should recover any data, network + // connections, files, etc., and resume running from when + // the app was suspended. The app can use the MsgProc callback + // to handle this if desired. + + // QPC may lose consistency when suspending, so reset the timer + // upon resume. + DXUTGetGlobalTimer()->Reset(); + GetDXUTState().SetLastStatsUpdateTime( 0 ); + return true; + } + break; + + case WM_SYSCOMMAND: + // Prevent moving/sizing in full screen mode + switch( ( wParam & 0xFFF0 ) ) + { + case SC_MOVE: + case SC_SIZE: + case SC_MAXIMIZE: + case SC_KEYMENU: + if( !DXUTIsWindowed() ) + return 0; + break; + } + break; + + case WM_KEYDOWN: + { + switch( wParam ) + { + case VK_ESCAPE: + { + if( GetDXUTState().GetHandleEscape() ) + SendMessage( hWnd, WM_CLOSE, 0, 0 ); + break; + } + + case VK_PAUSE: + { + if( GetDXUTState().GetHandlePause() ) + { + bool bTimePaused = DXUTIsTimePaused(); + bTimePaused = !bTimePaused; + if( bTimePaused ) + DXUTPause( true, false ); + else + DXUTPause( false, false ); + } + break; + } + } + break; + } + + case WM_CLOSE: + { + HMENU hMenu; + hMenu = GetMenu( hWnd ); + if( hMenu ) + DestroyMenu( hMenu ); + DestroyWindow( hWnd ); + UnregisterClass( L"Direct3DWindowClass", nullptr ); + GetDXUTState().SetHWNDFocus( nullptr ); + GetDXUTState().SetHWNDDeviceFullScreen( nullptr ); + GetDXUTState().SetHWNDDeviceWindowed( nullptr ); + return 0; + } + + case WM_DESTROY: + PostQuitMessage( 0 ); + break; + } + + // Don't allow the F10 key to act as a shortcut to the menu bar + // by not passing these messages to the DefWindowProc only when + // there's no menu present + if( !GetDXUTState().GetCallDefWindowProc() || !GetDXUTState().GetMenu() && + ( uMsg == WM_SYSKEYDOWN || uMsg == WM_SYSKEYUP ) && wParam == VK_F10 ) + return 0; + else + return DefWindowProc( hWnd, uMsg, wParam, lParam ); +} + + +//-------------------------------------------------------------------------------------- +// Handles app's message loop and rendering when idle. If DXUTCreateDevice() +// has not already been called, it will call DXUTCreateWindow() with the default parameters. +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTMainLoop( _In_opt_ HACCEL hAccel ) +{ + HRESULT hr; + + // Not allowed to call this from inside the device callbacks or reenter + if( GetDXUTState().GetInsideDeviceCallback() || GetDXUTState().GetInsideMainloop() ) + { + if( ( GetDXUTState().GetExitCode() == 0 ) || ( GetDXUTState().GetExitCode() == 10 ) ) + GetDXUTState().SetExitCode( 1 ); + return DXUT_ERR_MSGBOX( L"DXUTMainLoop", E_FAIL ); + } + + GetDXUTState().SetInsideMainloop( true ); + + // If DXUTCreateDevice() has not already been called, + // then call DXUTCreateDevice() with the default parameters. + if( !GetDXUTState().GetDeviceCreated() ) + { + if( GetDXUTState().GetDeviceCreateCalled() ) + { + if( ( GetDXUTState().GetExitCode() == 0 ) || ( GetDXUTState().GetExitCode() == 10 ) ) + GetDXUTState().SetExitCode( 1 ); + return E_FAIL; // DXUTCreateDevice() must first succeed for this function to succeed + } + + hr = DXUTCreateDevice(D3D_FEATURE_LEVEL_10_0, true, 800, 600); + if( FAILED( hr ) ) + { + if( ( GetDXUTState().GetExitCode() == 0 ) || ( GetDXUTState().GetExitCode() == 10 ) ) + GetDXUTState().SetExitCode( 1 ); + return hr; + } + } + + HWND hWnd = DXUTGetHWND(); + + // DXUTInit() must have been called and succeeded for this function to proceed + // DXUTCreateWindow() or DXUTSetWindow() must have been called and succeeded for this function to proceed + // DXUTCreateDevice() or DXUTCreateDeviceFromSettings() must have been called and succeeded for this function to proceed + if( !GetDXUTState().GetDXUTInited() || !GetDXUTState().GetWindowCreated() || !GetDXUTState().GetDeviceCreated() ) + { + if( ( GetDXUTState().GetExitCode() == 0 ) || ( GetDXUTState().GetExitCode() == 10 ) ) + GetDXUTState().SetExitCode( 1 ); + return DXUT_ERR_MSGBOX( L"DXUTMainLoop", E_FAIL ); + } + + // Now we're ready to receive and process Windows messages. + bool bGotMsg; + MSG msg; + msg.message = WM_NULL; + PeekMessage( &msg, nullptr, 0U, 0U, PM_NOREMOVE ); + + while( WM_QUIT != msg.message ) + { + // Use PeekMessage() so we can use idle time to render the scene. + bGotMsg = ( PeekMessage( &msg, nullptr, 0U, 0U, PM_REMOVE ) != 0 ); + + if( bGotMsg ) + { + // Translate and dispatch the message + if( !hAccel || !hWnd || + 0 == TranslateAccelerator( hWnd, hAccel, &msg ) ) + { + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + } + else + { + // Render a frame during idle time (no messages are waiting) + DXUTRender3DEnvironment(); + } + } + + // Cleanup the accelerator table + if( hAccel ) + DestroyAcceleratorTable( hAccel ); + + GetDXUTState().SetInsideMainloop( false ); + + return S_OK; +} + + +//====================================================================================== +//====================================================================================== +// Direct3D section +//====================================================================================== +//====================================================================================== +_Use_decl_annotations_ +HRESULT WINAPI DXUTCreateDevice(D3D_FEATURE_LEVEL reqFL, bool bWindowed, int nSuggestedWidth, int nSuggestedHeight) +{ + HRESULT hr = S_OK; + + // Not allowed to call this from inside the device callbacks + if( GetDXUTState().GetInsideDeviceCallback() ) + return DXUT_ERR_MSGBOX( L"DXUTCreateDevice", E_FAIL ); + + GetDXUTState().SetDeviceCreateCalled( true ); + + // If DXUTCreateWindow() or DXUTSetWindow() has not already been called, + // then call DXUTCreateWindow() with the default parameters. + if( !GetDXUTState().GetWindowCreated() ) + { + // If DXUTCreateWindow() or DXUTSetWindow() was already called and failed, then fail. + // DXUTCreateWindow() or DXUTSetWindow() must first succeed for this function to succeed + if( GetDXUTState().GetWindowCreateCalled() ) + return E_FAIL; + + // If DXUTCreateWindow() or DXUTSetWindow() hasn't been called, then + // automatically call DXUTCreateWindow() with default params + hr = DXUTCreateWindow(); + if( FAILED( hr ) ) + return hr; + } + + DXUTDeviceSettings deviceSettings; + DXUTApplyDefaultDeviceSettings(&deviceSettings); + deviceSettings.MinimumFeatureLevel = reqFL; + deviceSettings.d3d11.sd.BufferDesc.Width = nSuggestedWidth; + deviceSettings.d3d11.sd.BufferDesc.Height = nSuggestedHeight; + deviceSettings.d3d11.sd.Windowed = bWindowed; + + DXUTUpdateDeviceSettingsWithOverrides(&deviceSettings); + + GetDXUTState().SetWindowBackBufferWidthAtModeChange(deviceSettings.d3d11.sd.BufferDesc.Width); + GetDXUTState().SetWindowBackBufferHeightAtModeChange(deviceSettings.d3d11.sd.BufferDesc.Height); + GetDXUTState().SetFullScreenBackBufferWidthAtModeChange(deviceSettings.d3d11.sd.BufferDesc.Width); + GetDXUTState().SetFullScreenBackBufferHeightAtModeChange(deviceSettings.d3d11.sd.BufferDesc.Height); + + // Change to a Direct3D device created from the new device settings. + // If there is an existing device, then either reset or recreated the scene + hr = DXUTChangeDevice( &deviceSettings, true ); + + if ( hr == DXUTERR_NODIRECT3D && GetDXUTState().GetMessageWhenD3D11NotAvailable() ) + { + OSVERSIONINFOEX osv; + memset( &osv, 0, sizeof(osv) ); + osv.dwOSVersionInfoSize = sizeof(osv); +#pragma warning( suppress : 4996 28159 ) + GetVersionEx( (LPOSVERSIONINFO)&osv ); + + if ( ( osv.dwMajorVersion > 6 ) + || ( osv.dwMajorVersion == 6 && osv.dwMinorVersion >= 1 ) + || ( osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0 && osv.dwBuildNumber > 6002 ) ) + { + MessageBox( 0, L"Direct3D 11 components were not found.", L"Error", MB_ICONEXCLAMATION ); + // This should not happen, but is here for completeness as the system could be + // corrupted or some future OS version could pull D3D11.DLL for some reason + } + else if ( osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0 && osv.dwBuildNumber == 6002 ) + { + MessageBox( 0, L"Direct3D 11 components were not found, but are available for"\ + L" this version of Windows.\n"\ + L"For details see Microsoft Knowledge Base Article #971644\n"\ + L"http://go.microsoft.com/fwlink/?LinkId=160189", L"Error", MB_ICONEXCLAMATION ); + } + else if ( osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0 ) + { + MessageBox( 0, L"Direct3D 11 components were not found. Please install the latest Service Pack.\n"\ + L"For details see Microsoft Knowledge Base Article #935791\n"\ + L"http://support.microsoft.com/kb/935791/", L"Error", MB_ICONEXCLAMATION ); + } + else + { + MessageBox( 0, L"Direct3D 11 is not supported on this OS.", L"Error", MB_ICONEXCLAMATION ); + } + } + + if( FAILED( hr ) ) + return hr; + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Tells the framework to change to a device created from the passed in device settings +// If DXUTCreateWindow() has not already been called, it will call it with the +// default parameters. Instead of calling this, you can call DXUTCreateDevice() +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT WINAPI DXUTCreateDeviceFromSettings( DXUTDeviceSettings* pDeviceSettings, bool bClipWindowToSingleAdapter ) +{ + if ( !pDeviceSettings ) + return E_INVALIDARG; + + HRESULT hr; + + GetDXUTState().SetDeviceCreateCalled( true ); + + // If DXUTCreateWindow() or DXUTSetWindow() has not already been called, + // then call DXUTCreateWindow() with the default parameters. + if( !GetDXUTState().GetWindowCreated() ) + { + // If DXUTCreateWindow() or DXUTSetWindow() was already called and failed, then fail. + // DXUTCreateWindow() or DXUTSetWindow() must first succeed for this function to succeed + if( GetDXUTState().GetWindowCreateCalled() ) + return E_FAIL; + + // If DXUTCreateWindow() or DXUTSetWindow() hasn't been called, then + // automatically call DXUTCreateWindow() with default params + hr = DXUTCreateWindow(); + if( FAILED( hr ) ) + return hr; + } + + DXUTUpdateDeviceSettingsWithOverrides(pDeviceSettings); + + GetDXUTState().SetWindowBackBufferWidthAtModeChange(pDeviceSettings->d3d11.sd.BufferDesc.Width); + GetDXUTState().SetWindowBackBufferHeightAtModeChange(pDeviceSettings->d3d11.sd.BufferDesc.Height); + GetDXUTState().SetFullScreenBackBufferWidthAtModeChange(pDeviceSettings->d3d11.sd.BufferDesc.Width); + GetDXUTState().SetFullScreenBackBufferHeightAtModeChange(pDeviceSettings->d3d11.sd.BufferDesc.Height); + + // Change to a Direct3D device created from the new device settings. + // If there is an existing device, then either reset or recreate the scene + hr = DXUTChangeDevice( pDeviceSettings, bClipWindowToSingleAdapter ); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// All device changes are sent to this function. It looks at the current +// device (if any) and the new device and determines the best course of action. It +// also remembers and restores the window state if toggling between windowed and fullscreen +// as well as sets the proper window and system state for switching to the new device. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DXUTChangeDevice( DXUTDeviceSettings* pNewDeviceSettings, + bool bClipWindowToSingleAdapter ) +{ + if ( GetDXUTState().GetReleasingSwapChain() ) + return S_FALSE; + + HRESULT hr = S_OK; + DXUTDeviceSettings* pOldDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + + if( !pNewDeviceSettings ) + return S_FALSE; + + hr = DXUTDelayLoadDXGI(); + + if( FAILED( hr ) ) + return hr; + + // Make a copy of the pNewDeviceSettings on the heap + DXUTDeviceSettings* pNewDeviceSettingsOnHeap = new (std::nothrow) DXUTDeviceSettings; + if( !pNewDeviceSettingsOnHeap ) + return E_OUTOFMEMORY; + memcpy( pNewDeviceSettingsOnHeap, pNewDeviceSettings, sizeof( DXUTDeviceSettings ) ); + pNewDeviceSettings = pNewDeviceSettingsOnHeap; + + GetDXUTState().SetCurrentDeviceSettings(pNewDeviceSettingsOnHeap); + hr = DXUTSnapDeviceSettingsToEnumDevice(pNewDeviceSettingsOnHeap, false); + + if( FAILED( hr ) ) // the call will fail if no valid devices were found + { + DXUTDisplayErrorMessage( hr ); + return DXUT_ERR( L"DXUTFindValidDeviceSettings", hr ); + } + + // If the ModifyDeviceSettings callback is non-NULL, then call it to let the app + // change the settings or reject the device change by returning false. + LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallbackModifyDeviceSettings = GetDXUTState().GetModifyDeviceSettingsFunc(); + if( pCallbackModifyDeviceSettings ) + { + bool bContinue = pCallbackModifyDeviceSettings( pNewDeviceSettings, + GetDXUTState().GetModifyDeviceSettingsFuncUserContext() ); + if( !bContinue ) + { + // The app rejected the device change by returning false, so just use the current device if there is one. + if( !pOldDeviceSettings ) + DXUTDisplayErrorMessage( DXUTERR_NOCOMPATIBLEDEVICES ); + SAFE_DELETE( pNewDeviceSettings ); + return E_ABORT; + } + if( !GetDXUTState().GetDXGIFactory() ) // if DXUTShutdown() was called in the modify callback, just return + { + SAFE_DELETE( pNewDeviceSettings ); + return S_FALSE; + } + DXUTSnapDeviceSettingsToEnumDevice(pNewDeviceSettingsOnHeap, false); // modify the app specified settings to the closed enumerated settigns + + if( FAILED( hr ) ) // the call will fail if no valid devices were found + { + DXUTDisplayErrorMessage( hr ); + return DXUT_ERR( L"DXUTFindValidDeviceSettings", hr ); + } + + } + + GetDXUTState().SetCurrentDeviceSettings( pNewDeviceSettingsOnHeap ); + + DXUTPause( true, true ); + + // Take note if the backbuffer width & height are 0 now as they will change after pd3dDevice->Reset() + bool bKeepCurrentWindowSize = false; + if( DXUTGetBackBufferWidthFromDS( pNewDeviceSettings ) == 0 && + DXUTGetBackBufferHeightFromDS( pNewDeviceSettings ) == 0 ) + bKeepCurrentWindowSize = true; + + ////////////////////////// + // Before reset + ///////////////////////// + + if( DXUTGetIsWindowedFromDS( pNewDeviceSettings ) ) + { + // Going to windowed mode + if( pOldDeviceSettings && !DXUTGetIsWindowedFromDS( pOldDeviceSettings ) ) + { + // Going from fullscreen -> windowed + GetDXUTState().SetFullScreenBackBufferWidthAtModeChange( DXUTGetBackBufferWidthFromDS( + pOldDeviceSettings ) ); + GetDXUTState().SetFullScreenBackBufferHeightAtModeChange( DXUTGetBackBufferHeightFromDS( + pOldDeviceSettings ) ); + } + } + else + { + // Going to fullscreen mode + if( !pOldDeviceSettings || ( pOldDeviceSettings && DXUTGetIsWindowedFromDS( pOldDeviceSettings ) ) ) + { + // Transistioning to full screen mode from a standard window so + if( pOldDeviceSettings ) + { + GetDXUTState().SetWindowBackBufferWidthAtModeChange( DXUTGetBackBufferWidthFromDS( + pOldDeviceSettings ) ); + GetDXUTState().SetWindowBackBufferHeightAtModeChange( DXUTGetBackBufferHeightFromDS( + pOldDeviceSettings ) ); + } + } + } + + if( pOldDeviceSettings ) + DXUTCleanup3DEnvironment( false ); + + // Create the D3D device and call the app's device callbacks + hr = DXUTCreate3DEnvironment11(); + if( FAILED( hr ) ) + { + SAFE_DELETE( pOldDeviceSettings ); + DXUTCleanup3DEnvironment( true ); + DXUTDisplayErrorMessage( hr ); + DXUTPause( false, false ); + GetDXUTState().SetIgnoreSizeChange( false ); + return hr; + } + + // Enable/disable StickKeys shortcut, ToggleKeys shortcut, FilterKeys shortcut, and Windows key + // to prevent accidental task switching + DXUTAllowShortcutKeys( ( DXUTGetIsWindowedFromDS( pNewDeviceSettings ) ) ? + GetDXUTState().GetAllowShortcutKeysWhenWindowed() : + GetDXUTState().GetAllowShortcutKeysWhenFullscreen() ); + + HMONITOR hAdapterMonitor = DXUTGetMonitorFromAdapter( pNewDeviceSettings ); + GetDXUTState().SetAdapterMonitor( hAdapterMonitor ); + + // Update the device stats text + DXUTUpdateStaticFrameStats(); + + if( pOldDeviceSettings && !DXUTGetIsWindowedFromDS( pOldDeviceSettings ) && + DXUTGetIsWindowedFromDS( pNewDeviceSettings ) ) + { + // Going from fullscreen -> windowed + + // Restore the show state, and positions/size of the window to what it was + // It is important to adjust the window size + // after resetting the device rather than beforehand to ensure + // that the monitor resolution is correct and does not limit the size of the new window. + auto pwp = GetDXUTState().GetWindowedPlacement(); + SetWindowPlacement( DXUTGetHWNDDeviceWindowed(), pwp ); + + // Also restore the z-order of window to previous state + HWND hWndInsertAfter = GetDXUTState().GetTopmostWhileWindowed() ? HWND_TOPMOST : HWND_NOTOPMOST; + SetWindowPos( DXUTGetHWNDDeviceWindowed(), hWndInsertAfter, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE ); + } + + // Check to see if the window needs to be resized. + // Handle cases where the window is minimized and maxmimized as well. + + bool bNeedToResize = false; + if( DXUTGetIsWindowedFromDS( pNewDeviceSettings ) && // only resize if in windowed mode + !bKeepCurrentWindowSize ) // only resize if pp.BackbufferWidth/Height were not 0 + { + UINT nClientWidth; + UINT nClientHeight; + if( IsIconic( DXUTGetHWNDDeviceWindowed() ) ) + { + // Window is currently minimized. To tell if it needs to resize, + // get the client rect of window when its restored the + // hard way using GetWindowPlacement() + WINDOWPLACEMENT wp; + ZeroMemory( &wp, sizeof( WINDOWPLACEMENT ) ); + wp.length = sizeof( WINDOWPLACEMENT ); + GetWindowPlacement( DXUTGetHWNDDeviceWindowed(), &wp ); + + if( ( wp.flags & WPF_RESTORETOMAXIMIZED ) != 0 && wp.showCmd == SW_SHOWMINIMIZED ) + { + // WPF_RESTORETOMAXIMIZED means that when the window is restored it will + // be maximized. So maximize the window temporarily to get the client rect + // when the window is maximized. GetSystemMetrics( SM_CXMAXIMIZED ) will give this + // information if the window is on the primary but this will work on multimon. + ShowWindow( DXUTGetHWNDDeviceWindowed(), SW_RESTORE ); + RECT rcClient; + GetClientRect( DXUTGetHWNDDeviceWindowed(), &rcClient ); + nClientWidth = ( UINT )( rcClient.right - rcClient.left ); + nClientHeight = ( UINT )( rcClient.bottom - rcClient.top ); + ShowWindow( DXUTGetHWNDDeviceWindowed(), SW_MINIMIZE ); + } + else + { + // Use wp.rcNormalPosition to get the client rect, but wp.rcNormalPosition + // includes the window frame so subtract it + RECT rcFrame = {0}; + AdjustWindowRect( &rcFrame, GetDXUTState().GetWindowedStyleAtModeChange(), GetDXUTState().GetMenu() != 0 ); + LONG nFrameWidth = rcFrame.right - rcFrame.left; + LONG nFrameHeight = rcFrame.bottom - rcFrame.top; + nClientWidth = ( UINT )( wp.rcNormalPosition.right - wp.rcNormalPosition.left - nFrameWidth ); + nClientHeight = ( UINT )( wp.rcNormalPosition.bottom - wp.rcNormalPosition.top - nFrameHeight ); + } + } + else + { + // Window is restored or maximized so just get its client rect + RECT rcClient; + GetClientRect( DXUTGetHWNDDeviceWindowed(), &rcClient ); + nClientWidth = ( UINT )( rcClient.right - rcClient.left ); + nClientHeight = ( UINT )( rcClient.bottom - rcClient.top ); + } + + // Now that we know the client rect, compare it against the back buffer size + // to see if the client rect is already the right size + if( nClientWidth != DXUTGetBackBufferWidthFromDS( pNewDeviceSettings ) || + nClientHeight != DXUTGetBackBufferHeightFromDS( pNewDeviceSettings ) ) + { + bNeedToResize = true; + } + + if( bClipWindowToSingleAdapter && !IsIconic( DXUTGetHWNDDeviceWindowed() ) ) + { + // Get the rect of the monitor attached to the adapter + MONITORINFO miAdapter; + miAdapter.cbSize = sizeof( MONITORINFO ); + hAdapterMonitor = DXUTGetMonitorFromAdapter( pNewDeviceSettings ); + DXUTGetMonitorInfo( hAdapterMonitor, &miAdapter ); + HMONITOR hWindowMonitor = DXUTMonitorFromWindow( DXUTGetHWND(), MONITOR_DEFAULTTOPRIMARY ); + + // Get the rect of the window + RECT rcWindow; + GetWindowRect( DXUTGetHWNDDeviceWindowed(), &rcWindow ); + + // Check if the window rect is fully inside the adapter's vitural screen rect + if( ( rcWindow.left < miAdapter.rcWork.left || + rcWindow.right > miAdapter.rcWork.right || + rcWindow.top < miAdapter.rcWork.top || + rcWindow.bottom > miAdapter.rcWork.bottom ) ) + { + if( hWindowMonitor == hAdapterMonitor && IsZoomed( DXUTGetHWNDDeviceWindowed() ) ) + { + // If the window is maximized and on the same monitor as the adapter, then + // no need to clip to single adapter as the window is already clipped + // even though the rcWindow rect is outside of the miAdapter.rcWork + } + else + { + bNeedToResize = true; + } + } + } + } + + // Only resize window if needed + + if( bNeedToResize ) + { + // Need to resize, so if window is maximized or minimized then restore the window + if( IsIconic( DXUTGetHWNDDeviceWindowed() ) ) + ShowWindow( DXUTGetHWNDDeviceWindowed(), SW_RESTORE ); + if( IsZoomed( DXUTGetHWNDDeviceWindowed() ) ) // doing the IsIconic() check first also handles the WPF_RESTORETOMAXIMIZED case + ShowWindow( DXUTGetHWNDDeviceWindowed(), SW_RESTORE ); + + if( bClipWindowToSingleAdapter ) + { + // Get the rect of the monitor attached to the adapter + MONITORINFO miAdapter; + miAdapter.cbSize = sizeof( MONITORINFO ); + hAdapterMonitor = DXUTGetMonitorFromAdapter( pNewDeviceSettings ); + DXUTGetMonitorInfo( hAdapterMonitor, &miAdapter ); + + // Get the rect of the monitor attached to the window + MONITORINFO miWindow; + miWindow.cbSize = sizeof( MONITORINFO ); + DXUTGetMonitorInfo( DXUTMonitorFromWindow( DXUTGetHWND(), MONITOR_DEFAULTTOPRIMARY ), &miWindow ); + + // Do something reasonable if the BackBuffer size is greater than the monitor size + int nAdapterMonitorWidth = miAdapter.rcWork.right - miAdapter.rcWork.left; + int nAdapterMonitorHeight = miAdapter.rcWork.bottom - miAdapter.rcWork.top; + + int nClientWidth = DXUTGetBackBufferWidthFromDS( pNewDeviceSettings ); + int nClientHeight = DXUTGetBackBufferHeightFromDS( pNewDeviceSettings ); + + // Get the rect of the window + RECT rcWindow; + GetWindowRect( DXUTGetHWNDDeviceWindowed(), &rcWindow ); + + // Make a window rect with a client rect that is the same size as the backbuffer + RECT rcResizedWindow; + rcResizedWindow.left = 0; + rcResizedWindow.right = nClientWidth; + rcResizedWindow.top = 0; + rcResizedWindow.bottom = nClientHeight; + AdjustWindowRect( &rcResizedWindow, GetWindowLong( DXUTGetHWNDDeviceWindowed(), GWL_STYLE ), + GetDXUTState().GetMenu() != 0 ); + + int nWindowWidth = rcResizedWindow.right - rcResizedWindow.left; + int nWindowHeight = rcResizedWindow.bottom - rcResizedWindow.top; + + if( nWindowWidth > nAdapterMonitorWidth ) + nWindowWidth = nAdapterMonitorWidth; + if( nWindowHeight > nAdapterMonitorHeight ) + nWindowHeight = nAdapterMonitorHeight; + + if( rcResizedWindow.left < miAdapter.rcWork.left || + rcResizedWindow.top < miAdapter.rcWork.top || + rcResizedWindow.right > miAdapter.rcWork.right || + rcResizedWindow.bottom > miAdapter.rcWork.bottom ) + { + int nWindowOffsetX = ( nAdapterMonitorWidth - nWindowWidth ) / 2; + int nWindowOffsetY = ( nAdapterMonitorHeight - nWindowHeight ) / 2; + + rcResizedWindow.left = miAdapter.rcWork.left + nWindowOffsetX; + rcResizedWindow.top = miAdapter.rcWork.top + nWindowOffsetY; + rcResizedWindow.right = miAdapter.rcWork.left + nWindowOffsetX + nWindowWidth; + rcResizedWindow.bottom = miAdapter.rcWork.top + nWindowOffsetY + nWindowHeight; + } + + // Resize the window. It is important to adjust the window size + // after resetting the device rather than beforehand to ensure + // that the monitor resolution is correct and does not limit the size of the new window. + SetWindowPos( DXUTGetHWNDDeviceWindowed(), 0, rcResizedWindow.left, rcResizedWindow.top, nWindowWidth, + nWindowHeight, SWP_NOZORDER ); + } + else + { + // Make a window rect with a client rect that is the same size as the backbuffer + RECT rcWindow = {0}; + rcWindow.right = (long)( DXUTGetBackBufferWidthFromDS(pNewDeviceSettings) ); + rcWindow.bottom = (long)( DXUTGetBackBufferHeightFromDS(pNewDeviceSettings) ); + AdjustWindowRect( &rcWindow, GetWindowLong( DXUTGetHWNDDeviceWindowed(), GWL_STYLE ), GetDXUTState().GetMenu() != 0 ); + + // Resize the window. It is important to adjust the window size + // after resetting the device rather than beforehand to ensure + // that the monitor resolution is correct and does not limit the size of the new window. + int cx = ( int )( rcWindow.right - rcWindow.left ); + int cy = ( int )( rcWindow.bottom - rcWindow.top ); + SetWindowPos( DXUTGetHWNDDeviceWindowed(), 0, 0, 0, cx, cy, SWP_NOZORDER | SWP_NOMOVE ); + } + + // Its possible that the new window size is not what we asked for. + // No window can be sized larger than the desktop, so see if the Windows OS resized the + // window to something smaller to fit on the desktop. Also if WM_GETMINMAXINFO + // will put a limit on the smallest/largest window size. + RECT rcClient; + GetClientRect( DXUTGetHWNDDeviceWindowed(), &rcClient ); + UINT nClientWidth = ( UINT )( rcClient.right - rcClient.left ); + UINT nClientHeight = ( UINT )( rcClient.bottom - rcClient.top ); + if( nClientWidth != DXUTGetBackBufferWidthFromDS( pNewDeviceSettings ) || + nClientHeight != DXUTGetBackBufferHeightFromDS( pNewDeviceSettings ) ) + { + // If its different, then resize the backbuffer again. This time create a backbuffer that matches the + // client rect of the current window w/o resizing the window. + auto deviceSettings = DXUTGetDeviceSettings(); + deviceSettings.d3d11.sd.BufferDesc.Width = 0; + deviceSettings.d3d11.sd.BufferDesc.Height = 0; + + hr = DXUTChangeDevice( &deviceSettings, bClipWindowToSingleAdapter ); + if( FAILED( hr ) ) + { + SAFE_DELETE( pOldDeviceSettings ); + DXUTCleanup3DEnvironment( true ); + DXUTPause( false, false ); + GetDXUTState().SetIgnoreSizeChange( false ); + return hr; + } + } + } + + //if (DXUTGetIsWindowedFromDS( pNewDeviceSettings )) { + // RECT rcFrame = {0}; + // AdjustWindowRect( &rcFrame, GetDXUTState().GetWindowedStyleAtModeChange(), GetDXUTState().GetMenu() ); + // } + + // Make the window visible + if( !IsWindowVisible( DXUTGetHWND() ) ) + ShowWindow( DXUTGetHWND(), SW_SHOW ); + + // Ensure that the display doesn't power down when fullscreen but does when windowed + if( !DXUTIsWindowed() ) + SetThreadExecutionState( ES_DISPLAY_REQUIRED | ES_CONTINUOUS ); + else + SetThreadExecutionState( ES_CONTINUOUS ); + + SAFE_DELETE( pOldDeviceSettings ); + GetDXUTState().SetIgnoreSizeChange( false ); + DXUTPause( false, false ); + GetDXUTState().SetDeviceCreated( true ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Creates a DXGI factory object if one has not already been created +//-------------------------------------------------------------------------------------- +HRESULT DXUTDelayLoadDXGI() +{ + auto pDXGIFactory = GetDXUTState().GetDXGIFactory(); + if( !pDXGIFactory ) + { + HRESULT hr = DXUT_Dynamic_CreateDXGIFactory1( IID_PPV_ARGS(&pDXGIFactory) ); + if ( FAILED(hr) ) + return hr; + + GetDXUTState().SetDXGIFactory( pDXGIFactory ); + if( !pDXGIFactory ) + { + return DXUTERR_NODIRECT3D; + } + + // DXGI 1.1 implies Direct3D 11 + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Updates the device settings with default values.. +//-------------------------------------------------------------------------------------- +void DXUTUpdateDeviceSettingsWithOverrides( _Inout_ DXUTDeviceSettings* pDeviceSettings ) +{ + // Override with settings from the command line + if( GetDXUTState().GetOverrideWidth() != 0 ) + { + pDeviceSettings->d3d11.sd.BufferDesc.Width = GetDXUTState().GetOverrideWidth(); + } + if( GetDXUTState().GetOverrideHeight() != 0 ) + { + pDeviceSettings->d3d11.sd.BufferDesc.Height = GetDXUTState().GetOverrideHeight(); + } + + if( GetDXUTState().GetOverrideAdapterOrdinal() != -1 ) + { + pDeviceSettings->d3d11.AdapterOrdinal = GetDXUTState().GetOverrideAdapterOrdinal(); + } + + if( GetDXUTState().GetOverrideFullScreen() ) + { + pDeviceSettings->d3d11.sd.Windowed = FALSE; + } + + if( GetDXUTState().GetOverrideWindowed() ) + { + pDeviceSettings->d3d11.sd.Windowed = TRUE; + } + + if( GetDXUTState().GetOverrideForceHAL() ) + { + pDeviceSettings->d3d11.DriverType = D3D_DRIVER_TYPE_HARDWARE; + } + + if( GetDXUTState().GetOverrideForceREF() ) + { + pDeviceSettings->d3d11.DriverType = D3D_DRIVER_TYPE_REFERENCE; + } + + if( GetDXUTState().GetOverrideForceWARP() ) + { + pDeviceSettings->d3d11.DriverType = D3D_DRIVER_TYPE_WARP; + pDeviceSettings->d3d11.sd.Windowed = TRUE; + } + + if( GetDXUTState().GetOverrideForceVsync() == 0 ) + { + pDeviceSettings->d3d11.SyncInterval = 0; + } + else if( GetDXUTState().GetOverrideForceVsync() == 1 ) + { + pDeviceSettings->d3d11.SyncInterval = 1; + } + + if (GetDXUTState().GetOverrideForceFeatureLevel() != 0) + { + pDeviceSettings->d3d11.DeviceFeatureLevel = GetDXUTState().GetOverrideForceFeatureLevel(); + } +} + + +//-------------------------------------------------------------------------------------- +// Sets the viewport, render target view, and depth stencil view. +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTSetupD3D11Views( _In_ ID3D11DeviceContext* pd3dDeviceContext ) +{ + HRESULT hr = S_OK; + + // Setup the viewport to match the backbuffer + D3D11_VIEWPORT vp; + vp.Width = (FLOAT)DXUTGetDXGIBackBufferSurfaceDesc()->Width; + vp.Height = (FLOAT)DXUTGetDXGIBackBufferSurfaceDesc()->Height; + vp.MinDepth = 0; + vp.MaxDepth = 1; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + pd3dDeviceContext->RSSetViewports( 1, &vp ); + + // Set the render targets + auto pRTV = GetDXUTState().GetD3D11RenderTargetView(); + auto pDSV = GetDXUTState().GetD3D11DepthStencilView(); + pd3dDeviceContext->OMSetRenderTargets( 1, &pRTV, pDSV ); + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Creates a render target view, and depth stencil texture and view. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DXUTCreateD3D11Views( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext, + DXUTDeviceSettings* pDeviceSettings ) +{ + HRESULT hr = S_OK; + auto pSwapChain = DXUTGetDXGISwapChain(); + ID3D11DepthStencilView* pDSV = nullptr; + ID3D11RenderTargetView* pRTV = nullptr; + + // Get the back buffer and desc + ID3D11Texture2D* pBackBuffer; + hr = pSwapChain->GetBuffer( 0, IID_PPV_ARGS(&pBackBuffer) ); + if( FAILED( hr ) ) + return hr; + D3D11_TEXTURE2D_DESC backBufferSurfaceDesc; + pBackBuffer->GetDesc( &backBufferSurfaceDesc ); + + // Create the render target view + hr = pd3dDevice->CreateRenderTargetView( pBackBuffer, nullptr, &pRTV ); + SAFE_RELEASE( pBackBuffer ); + if( FAILED( hr ) ) + return hr; + DXUT_SetDebugName( pRTV, "DXUT" ); + GetDXUTState().SetD3D11RenderTargetView( pRTV ); + + if( pDeviceSettings->d3d11.AutoCreateDepthStencil ) + { + // Create depth stencil texture + ID3D11Texture2D* pDepthStencil = nullptr; + D3D11_TEXTURE2D_DESC descDepth; + descDepth.Width = backBufferSurfaceDesc.Width; + descDepth.Height = backBufferSurfaceDesc.Height; + descDepth.MipLevels = 1; + descDepth.ArraySize = 1; + descDepth.Format = pDeviceSettings->d3d11.AutoDepthStencilFormat; + descDepth.SampleDesc.Count = pDeviceSettings->d3d11.sd.SampleDesc.Count; + descDepth.SampleDesc.Quality = pDeviceSettings->d3d11.sd.SampleDesc.Quality; + descDepth.Usage = D3D11_USAGE_DEFAULT; + descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; + descDepth.CPUAccessFlags = 0; + descDepth.MiscFlags = 0; + hr = pd3dDevice->CreateTexture2D( &descDepth, nullptr, &pDepthStencil ); + if( FAILED( hr ) ) + return hr; + DXUT_SetDebugName( pDepthStencil, "DXUT" ); + GetDXUTState().SetD3D11DepthStencil( pDepthStencil ); + + // Create the depth stencil view + D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; + descDSV.Format = descDepth.Format; + descDSV.Flags = 0; + if( descDepth.SampleDesc.Count > 1 ) + descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS; + else + descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + descDSV.Texture2D.MipSlice = 0; + hr = pd3dDevice->CreateDepthStencilView( pDepthStencil, &descDSV, &pDSV ); + if( FAILED( hr ) ) + return hr; + DXUT_SetDebugName( pDSV, "DXUT" ); + GetDXUTState().SetD3D11DepthStencilView( pDSV ); + } + + hr = DXUTSetupD3D11Views( pd3dImmediateContext ); + if( FAILED( hr ) ) + return hr; + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Creates the 3D environment +//-------------------------------------------------------------------------------------- +HRESULT DXUTCreate3DEnvironment11() +{ + HRESULT hr = S_OK; + + ID3D11Device* pd3d11Device = nullptr; + ID3D11DeviceContext* pd3dImmediateContext = nullptr; + D3D_FEATURE_LEVEL FeatureLevel = D3D_FEATURE_LEVEL_11_1; + + IDXGISwapChain* pSwapChain = nullptr; + auto pNewDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + assert( pNewDeviceSettings ); + _Analysis_assume_( pNewDeviceSettings ); + + auto pDXGIFactory = DXUTGetDXGIFactory(); + assert( pDXGIFactory ); + _Analysis_assume_( pDXGIFactory ); + hr = pDXGIFactory->MakeWindowAssociation( DXUTGetHWND(), 0 ); + + // Try to create the device with the chosen settings + IDXGIAdapter1* pAdapter = nullptr; + + hr = S_OK; + D3D_DRIVER_TYPE ddt = pNewDeviceSettings->d3d11.DriverType; + if( pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_HARDWARE ) + { + hr = pDXGIFactory->EnumAdapters1( pNewDeviceSettings->d3d11.AdapterOrdinal, &pAdapter ); + if ( FAILED( hr) ) + { + return E_FAIL; + } + ddt = D3D_DRIVER_TYPE_UNKNOWN; + } + else if (pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_WARP) + { + ddt = D3D_DRIVER_TYPE_WARP; + pAdapter = nullptr; + } + else if (pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE) + { + ddt = D3D_DRIVER_TYPE_REFERENCE; + pAdapter = nullptr; + } + + if( SUCCEEDED( hr ) ) + { + hr = DXUT_Dynamic_D3D11CreateDevice( pAdapter, + ddt, + ( HMODULE )0, + pNewDeviceSettings->d3d11.CreateFlags, + &pNewDeviceSettings->d3d11.DeviceFeatureLevel, + 1, + D3D11_SDK_VERSION, + &pd3d11Device, + &FeatureLevel, + &pd3dImmediateContext + ); + + if ( FAILED( hr ) ) + { + pAdapter = nullptr; + // Remote desktop does not allow you to enumerate the adapter. In this case, we let D3D11 do the enumeration. + if ( ddt == D3D_DRIVER_TYPE_UNKNOWN ) + { + hr = DXUT_Dynamic_D3D11CreateDevice( pAdapter, + D3D_DRIVER_TYPE_HARDWARE, + ( HMODULE )0, + pNewDeviceSettings->d3d11.CreateFlags, + &pNewDeviceSettings->d3d11.DeviceFeatureLevel, + 1, + D3D11_SDK_VERSION, + &pd3d11Device, + &FeatureLevel, + &pd3dImmediateContext + ); + } + if ( FAILED ( hr ) ) + { + DXUT_ERR( L"D3D11CreateDevice", hr ); + return DXUTERR_CREATINGDEVICE; + } + } + } + +#ifndef NDEBUG + if( SUCCEEDED( hr ) ) + { + ID3D11Debug * d3dDebug = nullptr; + if( SUCCEEDED( pd3d11Device->QueryInterface(IID_PPV_ARGS(&d3dDebug) ) ) ) + { + ID3D11InfoQueue* infoQueue = nullptr; + if( SUCCEEDED( d3dDebug->QueryInterface( IID_PPV_ARGS(&infoQueue) ) ) ) + { + // ignore some "expected" errors + D3D11_MESSAGE_ID denied [] = + { + D3D11_MESSAGE_ID_SETPRIVATEDATA_CHANGINGPARAMS, + }; + + D3D11_INFO_QUEUE_FILTER filter; + memset( &filter, 0, sizeof(filter) ); + filter.DenyList.NumIDs = _countof(denied); + filter.DenyList.pIDList = denied; + infoQueue->AddStorageFilterEntries( &filter ); + infoQueue->Release(); + } + d3dDebug->Release(); + } + } +#endif + + if( SUCCEEDED( hr ) ) + { + IDXGIDevice1* pDXGIDev = nullptr; + hr = pd3d11Device->QueryInterface( IID_PPV_ARGS(&pDXGIDev) ); + if( SUCCEEDED( hr ) && pDXGIDev ) + { + if ( !pAdapter ) + { + IDXGIAdapter *pTempAdapter = nullptr; + V_RETURN( pDXGIDev->GetAdapter( &pTempAdapter ) ); + V_RETURN( pTempAdapter->QueryInterface( IID_PPV_ARGS(&pAdapter) ) ); + V_RETURN( pAdapter->GetParent( IID_PPV_ARGS(&pDXGIFactory) ) ); + SAFE_RELEASE ( pTempAdapter ); + if ( GetDXUTState().GetDXGIFactory() != pDXGIFactory ) + GetDXUTState().GetDXGIFactory()->Release(); + GetDXUTState().SetDXGIFactory( pDXGIFactory ); + } + } + SAFE_RELEASE( pDXGIDev ); + GetDXUTState().SetDXGIAdapter( pAdapter ); + } + + if( FAILED( hr ) ) + { + DXUT_ERR( L"D3D11CreateDevice", hr ); + return DXUTERR_CREATINGDEVICE; + } + + // set default render state to msaa enabled + D3D11_RASTERIZER_DESC drd = { + D3D11_FILL_SOLID, //D3D11_FILL_MODE FillMode; + D3D11_CULL_BACK,//D3D11_CULL_MODE CullMode; + FALSE, //BOOL FrontCounterClockwise; + 0, //INT DepthBias; + 0.0f,//FLOAT DepthBiasClamp; + 0.0f,//FLOAT SlopeScaledDepthBias; + TRUE,//BOOL DepthClipEnable; + FALSE,//BOOL ScissorEnable; + TRUE,//BOOL MultisampleEnable; + FALSE//BOOL AntialiasedLineEnable; + }; + ID3D11RasterizerState* pRS = nullptr; + hr = pd3d11Device->CreateRasterizerState(&drd, &pRS); + if ( FAILED( hr ) ) + { + DXUT_ERR( L"CreateRasterizerState", hr ); + return DXUTERR_CREATINGDEVICE; + } + DXUT_SetDebugName( pRS, "DXUT Default" ); + GetDXUTState().SetD3D11RasterizerState(pRS); + pd3dImmediateContext->RSSetState(pRS); + + // Enumerate its outputs. + UINT OutputCount, iOutput; + for( OutputCount = 0; ; ++OutputCount ) + { + IDXGIOutput* pOutput; + if( FAILED( pAdapter->EnumOutputs( OutputCount, &pOutput ) ) ) + break; + SAFE_RELEASE( pOutput ); + } + auto ppOutputArray = new (std::nothrow) IDXGIOutput*[OutputCount]; + if( !ppOutputArray ) + return E_OUTOFMEMORY; + for( iOutput = 0; iOutput < OutputCount; ++iOutput ) + pAdapter->EnumOutputs( iOutput, ppOutputArray + iOutput ); + GetDXUTState().SetDXGIOutputArray( ppOutputArray ); + GetDXUTState().SetDXGIOutputArraySize( OutputCount ); + + // Create the swapchain + hr = pDXGIFactory->CreateSwapChain( pd3d11Device, &pNewDeviceSettings->d3d11.sd, &pSwapChain ); + if( FAILED( hr ) ) + { + DXUT_ERR( L"CreateSwapChain", hr ); + return DXUTERR_CREATINGDEVICE; + } + + GetDXUTState().SetD3D11Device( pd3d11Device ); + GetDXUTState().SetD3D11DeviceContext( pd3dImmediateContext ); + GetDXUTState().SetD3D11FeatureLevel( FeatureLevel ); + GetDXUTState().SetDXGISwapChain( pSwapChain ); + + assert( pd3d11Device ); + _Analysis_assume_( pd3d11Device ); + + assert( pd3dImmediateContext ); + _Analysis_assume_( pd3dImmediateContext ); + + // Direct3D 11.1 + { + ID3D11Device1* pd3d11Device1 = nullptr; + hr = pd3d11Device->QueryInterface(IID_PPV_ARGS(&pd3d11Device1)); + if( SUCCEEDED( hr ) && pd3d11Device1 ) + { + GetDXUTState().SetD3D11Device1( pd3d11Device1 ); + + ID3D11DeviceContext1* pd3dImmediateContext1 = nullptr; + hr = pd3dImmediateContext->QueryInterface(IID_PPV_ARGS(&pd3dImmediateContext1)); + if( SUCCEEDED( hr ) && pd3dImmediateContext1 ) + { + GetDXUTState().SetD3D11DeviceContext1( pd3dImmediateContext1 ); + } + } + } + +#ifdef USE_DIRECT3D11_2 + // Direct3D 11.2 + { + ID3D11Device2* pd3d11Device2 = nullptr; + hr = pd3d11Device->QueryInterface(IID_PPV_ARGS(&pd3d11Device2)); + if (SUCCEEDED(hr) && pd3d11Device2) + { + GetDXUTState().SetD3D11Device2(pd3d11Device2); + + ID3D11DeviceContext2* pd3dImmediateContext2 = nullptr; + hr = pd3dImmediateContext->QueryInterface(IID_PPV_ARGS(&pd3dImmediateContext2)); + if (SUCCEEDED(hr) && pd3dImmediateContext2) + { + GetDXUTState().SetD3D11DeviceContext2(pd3dImmediateContext2); + } + } + } +#endif + +#ifdef USE_DIRECT3D11_3 + // Direct3D 11.3 + { + ID3D11Device3* pd3d11Device3 = nullptr; + hr = pd3d11Device->QueryInterface( IID_PPV_ARGS(&pd3d11Device3) ); + if (SUCCEEDED(hr) && pd3d11Device3) + { + GetDXUTState().SetD3D11Device3(pd3d11Device3); + + ID3D11DeviceContext3* pd3dImmediateContext3 = nullptr; + hr = pd3dImmediateContext->QueryInterface(IID_PPV_ARGS(&pd3dImmediateContext3)); + if (SUCCEEDED(hr) && pd3dImmediateContext3) + { + GetDXUTState().SetD3D11DeviceContext3(pd3dImmediateContext3); + } + } + } +#endif + + // If switching to REF, set the exit code to 11. If switching to HAL and exit code was 11, then set it back to 0. + if( pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE && GetDXUTState().GetExitCode() == 0 ) + GetDXUTState().SetExitCode( 10 ); + else if( pNewDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_HARDWARE && GetDXUTState().GetExitCode() == 10 ) + GetDXUTState().SetExitCode( 0 ); + + // Update back buffer desc before calling app's device callbacks + DXUTUpdateBackBufferDesc(); + + // Setup cursor based on current settings (window/fullscreen mode, show cursor state, clip cursor state) + DXUTSetupCursor(); + + // Update the device stats text + auto pd3dEnum = DXUTGetD3D11Enumeration(); + assert( pd3dEnum ); + _Analysis_assume_( pd3dEnum ); + auto pAdapterInfo = pd3dEnum->GetAdapterInfo( pNewDeviceSettings->d3d11.AdapterOrdinal ); + DXUTUpdateD3D11DeviceStats( pNewDeviceSettings->d3d11.DriverType, pNewDeviceSettings->d3d11.DeviceFeatureLevel, &pAdapterInfo->AdapterDesc ); + + // Call the app's device created callback if non-NULL + auto pBackBufferSurfaceDesc = DXUTGetDXGIBackBufferSurfaceDesc(); + GetDXUTState().SetInsideDeviceCallback( true ); + auto pCallbackDeviceCreated = GetDXUTState().GetD3D11DeviceCreatedFunc(); + hr = S_OK; + if( pCallbackDeviceCreated ) + hr = pCallbackDeviceCreated( DXUTGetD3D11Device(), pBackBufferSurfaceDesc, + GetDXUTState().GetD3D11DeviceCreatedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( !DXUTGetD3D11Device() ) // Handle DXUTShutdown from inside callback + return E_FAIL; + if( FAILED( hr ) ) + { + DXUT_ERR( L"DeviceCreated callback", hr ); + return ( hr == DXUTERR_MEDIANOTFOUND ) ? DXUTERR_MEDIANOTFOUND : DXUTERR_CREATINGDEVICEOBJECTS; + } + GetDXUTState().SetDeviceObjectsCreated( true ); + + // Setup the render target view and viewport + hr = DXUTCreateD3D11Views( pd3d11Device, pd3dImmediateContext, pNewDeviceSettings ); + if( FAILED( hr ) ) + { + DXUT_ERR( L"DXUTCreateD3D11Views", hr ); + return DXUTERR_CREATINGDEVICEOBJECTS; + } + + // Call the app's swap chain reset callback if non-NULL + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D11SWAPCHAINRESIZED pCallbackSwapChainResized = GetDXUTState().GetD3D11SwapChainResizedFunc(); + hr = S_OK; + if( pCallbackSwapChainResized ) + hr = pCallbackSwapChainResized( DXUTGetD3D11Device(), pSwapChain, pBackBufferSurfaceDesc, + GetDXUTState().GetD3D11SwapChainResizedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( !DXUTGetD3D11Device() ) // Handle DXUTShutdown from inside callback + return E_FAIL; + if( FAILED( hr ) ) + { + DXUT_ERR( L"DeviceReset callback", hr ); + return ( hr == DXUTERR_MEDIANOTFOUND ) ? DXUTERR_MEDIANOTFOUND : DXUTERR_RESETTINGDEVICEOBJECTS; + } + GetDXUTState().SetDeviceObjectsReset( true ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Resets the 3D environment by: +// - Calls the device lost callback +// - Resets the device +// - Stores the back buffer description +// - Sets up the full screen Direct3D cursor if requested +// - Calls the device reset callback +//-------------------------------------------------------------------------------------- +HRESULT DXUTReset3DEnvironment11() +{ + HRESULT hr; + + GetDXUTState().SetDeviceObjectsReset( false ); + DXUTPause( true, true ); + + bool bDeferredDXGIAction = false; + auto pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + auto pSwapChain = DXUTGetDXGISwapChain(); + assert( pSwapChain ); + _Analysis_assume_( pSwapChain ); + + DXGI_SWAP_CHAIN_DESC SCDesc; + if ( FAILED( pSwapChain->GetDesc(&SCDesc)) ) + memset( &SCDesc, 0, sizeof(SCDesc) ); + + // Resize backbuffer and target of the swapchain in case they have changed. + // For windowed mode, use the client rect as the desired size. Unlike D3D9, + // we can't use 0 for width or height. Therefore, fill in the values from + // the window size. For fullscreen mode, the width and height should have + // already been filled with the desktop resolution, so don't change it. + if( pDeviceSettings->d3d11.sd.Windowed && SCDesc.Windowed ) + { + RECT rcWnd; + GetClientRect( DXUTGetHWND(), &rcWnd ); + pDeviceSettings->d3d11.sd.BufferDesc.Width = rcWnd.right - rcWnd.left; + pDeviceSettings->d3d11.sd.BufferDesc.Height = rcWnd.bottom - rcWnd.top; + } + + // If the app wants to switch from windowed to fullscreen or vice versa, + // call the swapchain's SetFullscreenState + // mode. + if( SCDesc.Windowed != pDeviceSettings->d3d11.sd.Windowed ) + { + // Set the fullscreen state + if( pDeviceSettings->d3d11.sd.Windowed ) + { + V_RETURN( pSwapChain->SetFullscreenState( FALSE, nullptr ) ); + bDeferredDXGIAction = true; + } + else + { + // Set fullscreen state by setting the display mode to fullscreen, then changing the resolution + // to the desired value. + + // SetFullscreenState causes a WM_SIZE message to be sent to the window. The WM_SIZE message calls + // DXUTCheckForDXGIBufferChange which normally stores the new height and width in + // pDeviceSettings->d3d11.sd.BufferDesc. SetDoNotStoreBufferSize tells DXUTCheckForDXGIBufferChange + // not to store the height and width so that we have the correct values when calling ResizeTarget. + + GetDXUTState().SetDoNotStoreBufferSize( true ); + V_RETURN( pSwapChain->SetFullscreenState( TRUE, nullptr ) ); + GetDXUTState().SetDoNotStoreBufferSize( false ); + + V_RETURN( pSwapChain->ResizeTarget( &pDeviceSettings->d3d11.sd.BufferDesc ) ); + bDeferredDXGIAction = true; + } + } + else + { + if( pDeviceSettings->d3d11.sd.BufferDesc.Width == SCDesc.BufferDesc.Width && + pDeviceSettings->d3d11.sd.BufferDesc.Height == SCDesc.BufferDesc.Height && + pDeviceSettings->d3d11.sd.BufferDesc.Format != SCDesc.BufferDesc.Format ) + { + DXUTResizeDXGIBuffers( 0, 0, !pDeviceSettings->d3d11.sd.Windowed ); + bDeferredDXGIAction = true; + } + else if( pDeviceSettings->d3d11.sd.BufferDesc.Width != SCDesc.BufferDesc.Width || + pDeviceSettings->d3d11.sd.BufferDesc.Height != SCDesc.BufferDesc.Height ) + { + V_RETURN( pSwapChain->ResizeTarget( &pDeviceSettings->d3d11.sd.BufferDesc ) ); + bDeferredDXGIAction = true; + } + } + + // If no deferred DXGI actions are to take place, mark the device as reset. + // If there is a deferred DXGI action, then the device isn't reset until DXGI sends us a + // window message. Only then can we mark the device as reset. + if( !bDeferredDXGIAction ) + GetDXUTState().SetDeviceObjectsReset( true ); + DXUTPause( false, false ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Render the 3D environment by: +// - Checking if the device is lost and trying to reset it if it is +// - Get the elapsed time since the last frame +// - Calling the app's framemove and render callback +// - Calling Present() +//-------------------------------------------------------------------------------------- +void WINAPI DXUTRender3DEnvironment() +{ + HRESULT hr; + + auto pd3dDevice = DXUTGetD3D11Device(); + if( !pd3dDevice ) + return; + + auto pd3dImmediateContext = DXUTGetD3D11DeviceContext(); + if( !pd3dImmediateContext ) + return; + + auto pSwapChain = DXUTGetDXGISwapChain(); + if( !pSwapChain ) + return; + + if( DXUTIsRenderingPaused() || !DXUTIsActive() || GetDXUTState().GetRenderingOccluded() ) + { + // Window is minimized/paused/occluded/or not exclusive so yield CPU time to other processes + Sleep( 50 ); + } + + // Get the app's time, in seconds. Skip rendering if no time elapsed + double fTime, fAbsTime; float fElapsedTime; + DXUTGetGlobalTimer()->GetTimeValues( &fTime, &fAbsTime, &fElapsedTime ); + + // Store the time for the app + if( GetDXUTState().GetConstantFrameTime() ) + { + fElapsedTime = GetDXUTState().GetTimePerFrame(); + fTime = DXUTGetTime() + fElapsedTime; + } + + GetDXUTState().SetTime( fTime ); + GetDXUTState().SetAbsoluteTime( fAbsTime ); + GetDXUTState().SetElapsedTime( fElapsedTime ); + + // Update the FPS stats + DXUTUpdateFrameStats(); + + DXUTHandleTimers(); + + // Animate the scene by calling the app's frame move callback + LPDXUTCALLBACKFRAMEMOVE pCallbackFrameMove = GetDXUTState().GetFrameMoveFunc(); + if( pCallbackFrameMove ) + { + pCallbackFrameMove( fTime, fElapsedTime, GetDXUTState().GetFrameMoveFuncUserContext() ); + pd3dDevice = DXUTGetD3D11Device(); + if( !pd3dDevice ) // Handle DXUTShutdown from inside callback + return; + } + + if( !GetDXUTState().GetRenderingPaused() ) + { + // Render the scene by calling the app's render callback + LPDXUTCALLBACKD3D11FRAMERENDER pCallbackFrameRender = GetDXUTState().GetD3D11FrameRenderFunc(); + if( pCallbackFrameRender && !GetDXUTState().GetRenderingOccluded() ) + { + pCallbackFrameRender( pd3dDevice, pd3dImmediateContext, fTime, fElapsedTime, + GetDXUTState().GetD3D11FrameRenderFuncUserContext() ); + + pd3dDevice = DXUTGetD3D11Device(); + if( !pd3dDevice ) // Handle DXUTShutdown from inside callback + return; + } + +#if defined(DEBUG) || defined(_DEBUG) + // The back buffer should always match the client rect + // if the Direct3D backbuffer covers the entire window + RECT rcClient; + GetClientRect( DXUTGetHWND(), &rcClient ); + if( !IsIconic( DXUTGetHWND() ) ) + { + GetClientRect( DXUTGetHWND(), &rcClient ); + + assert( DXUTGetDXGIBackBufferSurfaceDesc()->Width == (UINT)rcClient.right ); + assert( DXUTGetDXGIBackBufferSurfaceDesc()->Height == (UINT)rcClient.bottom ); + } +#endif + } + + if ( GetDXUTState().GetSaveScreenShot() ) + { + DXUTSnapD3D11Screenshot( GetDXUTState().GetScreenShotName(), false ); + } + if ( GetDXUTState().GetExitAfterScreenShot() ) + { + DXUTShutdown(); + return; + } + + DWORD dwFlags = 0; + if( GetDXUTState().GetRenderingOccluded() ) + dwFlags = DXGI_PRESENT_TEST; + else + dwFlags = GetDXUTState().GetCurrentDeviceSettings()->d3d11.PresentFlags; + UINT SyncInterval = GetDXUTState().GetCurrentDeviceSettings()->d3d11.SyncInterval; + + // Show the frame on the primary surface. + hr = pSwapChain->Present( SyncInterval, dwFlags ); + if( DXGI_STATUS_OCCLUDED == hr ) + { + // There is a window covering our entire rendering area. + // Don't render until we're visible again. + GetDXUTState().SetRenderingOccluded( true ); + } + else if( DXGI_ERROR_DEVICE_RESET == hr ) + { + // If a mode change happened, we must reset the device + if( FAILED( hr = DXUTReset3DEnvironment11() ) ) + { + if( DXUTERR_RESETTINGDEVICEOBJECTS == hr || + DXUTERR_MEDIANOTFOUND == hr ) + { + DXUTDisplayErrorMessage( hr ); + DXUTShutdown(); + return; + } + else + { + // Reset failed, but the device wasn't lost so something bad happened, + // so recreate the device to try to recover + auto pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( FAILED( DXUTChangeDevice( pDeviceSettings, false ) ) ) + { + DXUTShutdown(); + return; + } + + // How to handle display orientation changes in full-screen mode? + } + } + } + else if( DXGI_ERROR_DEVICE_REMOVED == hr ) + { + // Use a callback to ask the app if it would like to find a new device. + // If no device removed callback is set, then look for a new device + if( FAILED( DXUTHandleDeviceRemoved() ) ) + { + // Perhaps get more information from pD3DDevice->GetDeviceRemovedReason()? + DXUTDisplayErrorMessage( DXUTERR_DEVICEREMOVED ); + DXUTShutdown(); + return; + } + } + else if( SUCCEEDED( hr ) ) + { + if( GetDXUTState().GetRenderingOccluded() ) + { + // Now that we're no longer occluded + // allow us to render again + GetDXUTState().SetRenderingOccluded( false ); + } + } + + // Update current frame # + int nFrame = GetDXUTState().GetCurrentFrameNumber(); + nFrame++; + GetDXUTState().SetCurrentFrameNumber( nFrame ); + + // Check to see if the app should shutdown due to cmdline + if( GetDXUTState().GetOverrideQuitAfterFrame() != 0 ) + { + if( nFrame > GetDXUTState().GetOverrideQuitAfterFrame() ) + DXUTShutdown(); + } + + return; +} + + +//-------------------------------------------------------------------------------------- +// Cleans up the 3D environment by: +// - Calls the device lost callback +// - Calls the device destroyed callback +// - Releases the D3D device +//-------------------------------------------------------------------------------------- +void DXUTCleanup3DEnvironment( _In_ bool bReleaseSettings ) +{ + auto pd3dDevice = DXUTGetD3D11Device(); + + if( pd3dDevice ) + { + if (GetDXUTState().GetD3D11RasterizerState()) + GetDXUTState().GetD3D11RasterizerState()->Release(); + + // Call the app's SwapChain lost callback + GetDXUTState().SetInsideDeviceCallback( true ); + if( GetDXUTState().GetDeviceObjectsReset() ) + { + LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallbackSwapChainReleasing = + GetDXUTState().GetD3D11SwapChainReleasingFunc(); + if( pCallbackSwapChainReleasing ) + pCallbackSwapChainReleasing( GetDXUTState().GetD3D11SwapChainReleasingFuncUserContext() ); + GetDXUTState().SetDeviceObjectsReset( false ); + } + + // Release our old depth stencil texture and view + auto pDS = GetDXUTState().GetD3D11DepthStencil(); + SAFE_RELEASE( pDS ); + GetDXUTState().SetD3D11DepthStencil( nullptr ); + auto pDSV = GetDXUTState().GetD3D11DepthStencilView(); + SAFE_RELEASE( pDSV ); + GetDXUTState().SetD3D11DepthStencilView( nullptr ); + + // Cleanup the render target view + auto pRTV = GetDXUTState().GetD3D11RenderTargetView(); + SAFE_RELEASE( pRTV ); + GetDXUTState().SetD3D11RenderTargetView( nullptr ); + + // Call the app's device destroyed callback + if( GetDXUTState().GetDeviceObjectsCreated() ) + { + auto pCallbackDeviceDestroyed = GetDXUTState().GetD3D11DeviceDestroyedFunc(); + if( pCallbackDeviceDestroyed ) + pCallbackDeviceDestroyed( GetDXUTState().GetD3D11DeviceDestroyedFuncUserContext() ); + GetDXUTState().SetDeviceObjectsCreated( false ); + } + + GetDXUTState().SetInsideDeviceCallback( false ); + + // Release the swap chain + GetDXUTState().SetReleasingSwapChain( true ); + auto pSwapChain = DXUTGetDXGISwapChain(); + if( pSwapChain ) + { + pSwapChain->SetFullscreenState( FALSE, 0 ); + } + SAFE_RELEASE( pSwapChain ); + GetDXUTState().SetDXGISwapChain( nullptr ); + GetDXUTState().SetReleasingSwapChain( false ); + + // Release the outputs. + auto ppOutputArray = GetDXUTState().GetDXGIOutputArray(); + UINT OutputCount = GetDXUTState().GetDXGIOutputArraySize(); + for( UINT o = 0; o < OutputCount; ++o ) + SAFE_RELEASE( ppOutputArray[o] ); + delete[] ppOutputArray; + GetDXUTState().SetDXGIOutputArray( nullptr ); + GetDXUTState().SetDXGIOutputArraySize( 0 ); + + // Release the D3D adapter. + auto pAdapter = GetDXUTState().GetDXGIAdapter(); + SAFE_RELEASE( pAdapter ); + GetDXUTState().SetDXGIAdapter( nullptr ); + + // Call ClearState to avoid tons of messy debug spew telling us that we're deleting bound objects + auto pImmediateContext = DXUTGetD3D11DeviceContext(); + assert( pImmediateContext ); + pImmediateContext->ClearState(); + pImmediateContext->Flush(); + + // Release the D3D11 immediate context (if it exists) because it has a extra ref count on it + SAFE_RELEASE( pImmediateContext ); + GetDXUTState().SetD3D11DeviceContext( nullptr ); + + auto pImmediateContext1 = DXUTGetD3D11DeviceContext1(); + SAFE_RELEASE( pImmediateContext1 ); + GetDXUTState().SetD3D11DeviceContext1( nullptr ); + +#ifdef USE_DIRECT3D11_2 + auto pImmediateContext2 = DXUTGetD3D11DeviceContext2(); + SAFE_RELEASE(pImmediateContext2); + GetDXUTState().SetD3D11DeviceContext2(nullptr); +#endif + +#ifdef USE_DIRECT3D11_3 + auto pImmediateContext3 = DXUTGetD3D11DeviceContext3(); + SAFE_RELEASE(pImmediateContext3); + GetDXUTState().SetD3D11DeviceContext3(nullptr); +#endif + + // Report live objects + if ( pd3dDevice ) + { +#ifndef NDEBUG + ID3D11Debug * d3dDebug = nullptr; + if( SUCCEEDED( pd3dDevice->QueryInterface( IID_PPV_ARGS(&d3dDebug) ) ) ) + { + d3dDebug->ReportLiveDeviceObjects( D3D11_RLDO_SUMMARY | D3D11_RLDO_DETAIL ); + d3dDebug->Release(); + } +#endif + + auto pd3dDevice1 = DXUTGetD3D11Device1(); + SAFE_RELEASE( pd3dDevice1 ); + GetDXUTState().SetD3D11Device1(nullptr); + +#ifdef USE_DIRECT3D11_2 + auto pd3dDevice2 = DXUTGetD3D11Device2(); + SAFE_RELEASE(pd3dDevice2); + GetDXUTState().SetD3D11Device2(nullptr); +#endif + +#ifdef USE_DIRECT3D11_3 + auto pd3dDevice3 = DXUTGetD3D11Device3(); + SAFE_RELEASE(pd3dDevice3); + GetDXUTState().SetD3D11Device3(nullptr); +#endif + + // Release the D3D device and in debug configs, displays a message box if there + // are unrelease objects. + UINT references = pd3dDevice->Release(); + if( references > 0 ) + { + DXUTDisplayErrorMessage( DXUTERR_NONZEROREFCOUNT ); + DXUT_ERR( L"DXUTCleanup3DEnvironment", DXUTERR_NONZEROREFCOUNT ); + } + } + GetDXUTState().SetD3D11Device( nullptr ); + +#ifndef NDEBUG + { + IDXGIDebug* dxgiDebug = nullptr; + if ( SUCCEEDED( DXUT_Dynamic_DXGIGetDebugInterface( IID_IDXGIDebug, reinterpret_cast( &dxgiDebug ) ) ) ) + { + dxgiDebug->ReportLiveObjects( DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_ALL ); + dxgiDebug->Release(); + } + } +#endif + + if( bReleaseSettings ) + { + auto pOldDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + SAFE_DELETE(pOldDeviceSettings); + GetDXUTState().SetCurrentDeviceSettings( nullptr ); + } + + auto pBackBufferSurfaceDesc = GetDXUTState().GetBackBufferSurfaceDescDXGI(); + ZeroMemory( pBackBufferSurfaceDesc, sizeof( DXGI_SURFACE_DESC ) ); + + GetDXUTState().SetDeviceCreated( false ); + } +} + + +//-------------------------------------------------------------------------------------- +// Low level keyboard hook to disable Windows key to prevent accidental task switching. +//-------------------------------------------------------------------------------------- +LRESULT CALLBACK DXUTLowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam ) +{ + if( nCode < 0 || nCode != HC_ACTION ) // do not process message + return CallNextHookEx( GetDXUTState().GetKeyboardHook(), nCode, wParam, lParam ); + + bool bEatKeystroke = false; + auto p = reinterpret_cast( lParam ); + switch( wParam ) + { + case WM_KEYDOWN: + case WM_KEYUP: + { + bEatKeystroke = ( !GetDXUTState().GetAllowShortcutKeys() && + ( p->vkCode == VK_LWIN || p->vkCode == VK_RWIN ) ); + break; + } + } + + if( bEatKeystroke ) + return 1; + else + return CallNextHookEx( GetDXUTState().GetKeyboardHook(), nCode, wParam, lParam ); +} + + +//-------------------------------------------------------------------------------------- +// Controls how DXUT behaves when fullscreen and windowed mode with regard to +// shortcut keys (Windows keys, StickyKeys shortcut, ToggleKeys shortcut, FilterKeys shortcut) +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void WINAPI DXUTSetShortcutKeySettings( bool bAllowWhenFullscreen, bool bAllowWhenWindowed ) +{ + GetDXUTState().SetAllowShortcutKeysWhenWindowed( bAllowWhenWindowed ); + GetDXUTState().SetAllowShortcutKeysWhenFullscreen( bAllowWhenFullscreen ); + + // DXUTInit() records initial accessibility states so don't change them until then + if( GetDXUTState().GetDXUTInited() ) + { + if( DXUTIsWindowed() ) + DXUTAllowShortcutKeys( GetDXUTState().GetAllowShortcutKeysWhenWindowed() ); + else + DXUTAllowShortcutKeys( GetDXUTState().GetAllowShortcutKeysWhenFullscreen() ); + } +} + + +//-------------------------------------------------------------------------------------- +// Enables/disables Windows keys, and disables or restores the StickyKeys/ToggleKeys/FilterKeys +// shortcut to help prevent accidental task switching +//-------------------------------------------------------------------------------------- +void DXUTAllowShortcutKeys( _In_ bool bAllowKeys ) +{ + GetDXUTState().SetAllowShortcutKeys( bAllowKeys ); + + if( bAllowKeys ) + { + // Restore StickyKeys/etc to original state and enable Windows key + STICKYKEYS sk = GetDXUTState().GetStartupStickyKeys(); + TOGGLEKEYS tk = GetDXUTState().GetStartupToggleKeys(); + FILTERKEYS fk = GetDXUTState().GetStartupFilterKeys(); + + SystemParametersInfo( SPI_SETSTICKYKEYS, sizeof( STICKYKEYS ), &sk, 0 ); + SystemParametersInfo( SPI_SETTOGGLEKEYS, sizeof( TOGGLEKEYS ), &tk, 0 ); + SystemParametersInfo( SPI_SETFILTERKEYS, sizeof( FILTERKEYS ), &fk, 0 ); + + // Remove the keyboard hoook when it isn't needed to prevent any slow down of other apps + if( GetDXUTState().GetKeyboardHook() ) + { + UnhookWindowsHookEx( GetDXUTState().GetKeyboardHook() ); + GetDXUTState().SetKeyboardHook( nullptr ); + } + } + else + { + // Set low level keyboard hook if haven't already + if( !GetDXUTState().GetKeyboardHook() ) + { + // Set the low-level hook procedure. + HHOOK hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, DXUTLowLevelKeyboardProc, + GetModuleHandle( nullptr ), 0 ); + GetDXUTState().SetKeyboardHook( hKeyboardHook ); + } + + // Disable StickyKeys/etc shortcuts but if the accessibility feature is on, + // then leave the settings alone as its probably being usefully used + + STICKYKEYS skOff = GetDXUTState().GetStartupStickyKeys(); + if( ( skOff.dwFlags & SKF_STICKYKEYSON ) == 0 ) + { + // Disable the hotkey and the confirmation + skOff.dwFlags &= ~SKF_HOTKEYACTIVE; + skOff.dwFlags &= ~SKF_CONFIRMHOTKEY; + + SystemParametersInfo( SPI_SETSTICKYKEYS, sizeof( STICKYKEYS ), &skOff, 0 ); + } + + TOGGLEKEYS tkOff = GetDXUTState().GetStartupToggleKeys(); + if( ( tkOff.dwFlags & TKF_TOGGLEKEYSON ) == 0 ) + { + // Disable the hotkey and the confirmation + tkOff.dwFlags &= ~TKF_HOTKEYACTIVE; + tkOff.dwFlags &= ~TKF_CONFIRMHOTKEY; + + SystemParametersInfo( SPI_SETTOGGLEKEYS, sizeof( TOGGLEKEYS ), &tkOff, 0 ); + } + + FILTERKEYS fkOff = GetDXUTState().GetStartupFilterKeys(); + if( ( fkOff.dwFlags & FKF_FILTERKEYSON ) == 0 ) + { + // Disable the hotkey and the confirmation + fkOff.dwFlags &= ~FKF_HOTKEYACTIVE; + fkOff.dwFlags &= ~FKF_CONFIRMHOTKEY; + + SystemParametersInfo( SPI_SETFILTERKEYS, sizeof( FILTERKEYS ), &fkOff, 0 ); + } + } +} + + +//-------------------------------------------------------------------------------------- +// Pauses time or rendering. Keeps a ref count so pausing can be layered +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void WINAPI DXUTPause( bool bPauseTime, bool bPauseRendering ) +{ + int nPauseTimeCount = GetDXUTState().GetPauseTimeCount(); + if( bPauseTime ) nPauseTimeCount++; + else + nPauseTimeCount--; + if( nPauseTimeCount < 0 ) nPauseTimeCount = 0; + GetDXUTState().SetPauseTimeCount( nPauseTimeCount ); + + int nPauseRenderingCount = GetDXUTState().GetPauseRenderingCount(); + if( bPauseRendering ) nPauseRenderingCount++; + else + nPauseRenderingCount--; + if( nPauseRenderingCount < 0 ) nPauseRenderingCount = 0; + GetDXUTState().SetPauseRenderingCount( nPauseRenderingCount ); + + if( nPauseTimeCount > 0 ) + { + // Stop the scene from animating + DXUTGetGlobalTimer()->Stop(); + } + else + { + // Restart the timer + DXUTGetGlobalTimer()->Start(); + } + + GetDXUTState().SetRenderingPaused( nPauseRenderingCount > 0 ); + GetDXUTState().SetTimePaused( nPauseTimeCount > 0 ); +} + + +//-------------------------------------------------------------------------------------- +// Starts a user defined timer callback +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT WINAPI DXUTSetTimer( LPDXUTCALLBACKTIMER pCallbackTimer, float fTimeoutInSecs, UINT* pnIDEvent, + void* pCallbackUserContext ) +{ + if( !pCallbackTimer ) + return DXUT_ERR_MSGBOX( L"DXUTSetTimer", E_INVALIDARG ); + + DXUT_TIMER DXUTTimer; + DXUTTimer.pCallbackTimer = pCallbackTimer; + DXUTTimer.pCallbackUserContext = pCallbackUserContext; + DXUTTimer.fTimeoutInSecs = fTimeoutInSecs; + DXUTTimer.fCountdown = fTimeoutInSecs; + DXUTTimer.bEnabled = true; + DXUTTimer.nID = GetDXUTState().GetTimerLastID() + 1; + GetDXUTState().SetTimerLastID( DXUTTimer.nID ); + + auto pTimerList = GetDXUTState().GetTimerList(); + if( !pTimerList ) + { + pTimerList = new (std::nothrow) std::vector; + if( !pTimerList ) + return E_OUTOFMEMORY; + GetDXUTState().SetTimerList( pTimerList ); + } + + pTimerList->push_back( DXUTTimer ); + + if( pnIDEvent ) + *pnIDEvent = DXUTTimer.nID; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Stops a user defined timer callback +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTKillTimer( _In_ UINT nIDEvent ) +{ + auto pTimerList = GetDXUTState().GetTimerList(); + if( !pTimerList ) + return S_FALSE; + + bool bFound = false; + + for( auto it = pTimerList->begin(); it != pTimerList->end(); ++it ) + { + DXUT_TIMER DXUTTimer = *it; + if( DXUTTimer.nID == nIDEvent ) + { + DXUTTimer.bEnabled = false; + *it = DXUTTimer; + bFound = true; + break; + } + } + + if( !bFound ) + return DXUT_ERR_MSGBOX( L"DXUTKillTimer", E_INVALIDARG ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Internal helper function to handle calling the user defined timer callbacks +//-------------------------------------------------------------------------------------- +void DXUTHandleTimers() +{ + float fElapsedTime = DXUTGetElapsedTime(); + + auto pTimerList = GetDXUTState().GetTimerList(); + if( !pTimerList ) + return; + + // Walk through the list of timer callbacks + for( auto it = pTimerList->begin(); it != pTimerList->end(); ++it ) + { + DXUT_TIMER DXUTTimer = *it; + if( DXUTTimer.bEnabled ) + { + DXUTTimer.fCountdown -= fElapsedTime; + + // Call the callback if count down expired + if( DXUTTimer.fCountdown < 0 ) + { + DXUTTimer.pCallbackTimer( DXUTTimer.nID, DXUTTimer.pCallbackUserContext ); + // The callback my have changed the timer. + DXUTTimer = *it; + DXUTTimer.fCountdown = DXUTTimer.fTimeoutInSecs; + } + *it = DXUTTimer; + } + } +} + + +//-------------------------------------------------------------------------------------- +// Display an custom error msg box +//-------------------------------------------------------------------------------------- +void DXUTDisplayErrorMessage( _In_ HRESULT hr ) +{ + WCHAR strBuffer[512]; + + int nExitCode; + bool bFound = true; + switch( hr ) + { + case DXUTERR_NODIRECT3D: + { + nExitCode = 2; + wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Could not initialize Direct3D 11. " ); + break; + } + case DXUTERR_NOCOMPATIBLEDEVICES: + nExitCode = 3; + if( GetSystemMetrics(SM_REMOTESESSION) != 0 ) + wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Direct3D does not work over a remote session." ); + else + wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Could not find any compatible Direct3D devices." ); + break; + case DXUTERR_MEDIANOTFOUND: nExitCode = 4; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Could not find required media." ); break; + case DXUTERR_NONZEROREFCOUNT: nExitCode = 5; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"The Direct3D device has a non-zero reference count, meaning some objects were not released." ); break; + case DXUTERR_CREATINGDEVICE: nExitCode = 6; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Failed creating the Direct3D device." ); break; + case DXUTERR_RESETTINGDEVICE: nExitCode = 7; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"Failed resetting the Direct3D device." ); break; + case DXUTERR_CREATINGDEVICEOBJECTS: nExitCode = 8; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"An error occurred in the device create callback function." ); break; + case DXUTERR_RESETTINGDEVICEOBJECTS: nExitCode = 9; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"An error occurred in the device reset callback function." ); break; + // nExitCode 10 means the app exited using a REF device + case DXUTERR_DEVICEREMOVED: nExitCode = 11; wcscpy_s( strBuffer, ARRAYSIZE(strBuffer), L"The Direct3D device was removed." ); break; + default: bFound = false; nExitCode = 1; break; // nExitCode 1 means the API was incorrectly called + + } + + GetDXUTState().SetExitCode(nExitCode); + + bool bShowMsgBoxOnError = GetDXUTState().GetShowMsgBoxOnError(); + if( bFound && bShowMsgBoxOnError ) + { + if( DXUTGetWindowTitle()[0] == 0 ) + MessageBox( DXUTGetHWND(), strBuffer, L"DXUT Application", MB_ICONERROR | MB_OK ); + else + MessageBox( DXUTGetHWND(), strBuffer, DXUTGetWindowTitle(), MB_ICONERROR | MB_OK ); + } +} + + +//-------------------------------------------------------------------------------------- +// Internal function to map MK_* to an array index +//-------------------------------------------------------------------------------------- +int DXUTMapButtonToArrayIndex( _In_ BYTE vButton ) +{ + switch( vButton ) + { + case MK_LBUTTON: + return 0; + case VK_MBUTTON: + case MK_MBUTTON: + return 1; + case MK_RBUTTON: + return 2; + case VK_XBUTTON1: + case MK_XBUTTON1: + return 3; + case VK_XBUTTON2: + case MK_XBUTTON2: + return 4; + } + + return 0; +} + + +//-------------------------------------------------------------------------------------- +// Toggle between full screen and windowed +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTToggleFullScreen() +{ + auto deviceSettings = DXUTGetDeviceSettings(); + if ( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_WARP ) + { + // WARP driver type doesn't support fullscreen + return S_FALSE; + } + + auto orginalDeviceSettings = DXUTGetDeviceSettings(); + + deviceSettings.d3d11.sd.Windowed = !deviceSettings.d3d11.sd.Windowed; + + HRESULT hr; + if (!deviceSettings.d3d11.sd.Windowed) + { + DXGI_MODE_DESC adapterDesktopDisplayMode; + hr = DXUTGetD3D11AdapterDisplayMode( deviceSettings.d3d11.AdapterOrdinal, 0, &adapterDesktopDisplayMode ); + if ( FAILED(hr) ) + { + static const DXGI_MODE_DESC s_adapterDesktopDisplayMode = + { + 800, 600, { 0, 0 }, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB + }; + memcpy(&adapterDesktopDisplayMode, &s_adapterDesktopDisplayMode, sizeof(DXGI_MODE_DESC)); + } + + deviceSettings.d3d11.sd.BufferDesc = adapterDesktopDisplayMode; + } + else + { + RECT r = DXUTGetWindowClientRectAtModeChange(); + deviceSettings.d3d11.sd.BufferDesc.Height = r.bottom; + deviceSettings.d3d11.sd.BufferDesc.Width = r.right; + } + + hr = DXUTChangeDevice( &deviceSettings, false ); + + // If hr == E_ABORT, this means the app rejected the device settings in the ModifySettingsCallback so nothing changed + if( FAILED( hr ) && ( hr != E_ABORT ) ) + { + // Failed creating device, try to switch back. + HRESULT hr2 = DXUTChangeDevice( &orginalDeviceSettings, false ); + if( FAILED( hr2 ) ) + { + // If this failed, then shutdown + DXUTShutdown(); + } + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Toggle between HAL/REF and WARP +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTToggleWARP () +{ + auto deviceSettings = DXUTGetDeviceSettings(); + + if ( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_HARDWARE || deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) + { + if ( !deviceSettings.d3d11.sd.Windowed ) + { + // WARP driver type doesn't support fullscreen + return S_FALSE; + } + + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_WARP; + } + else if ( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_WARP ) + { + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_HARDWARE; + } + + HRESULT hr = DXUTSnapDeviceSettingsToEnumDevice(&deviceSettings, false); + if( SUCCEEDED( hr ) ) + { + DXUTDeviceSettings orginalDeviceSettings = DXUTGetDeviceSettings(); + + // Create a Direct3D device using the new device settings. + // If there is an existing device, then it will either reset or recreate the scene. + hr = DXUTChangeDevice( &deviceSettings, false ); + + // If hr == E_ABORT, this means the app rejected the device settings in the ModifySettingsCallback so nothing changed + if( FAILED( hr ) && ( hr != E_ABORT ) ) + { + // Failed creating device, try to switch back. + HRESULT hr2 = DXUTChangeDevice( &orginalDeviceSettings, false ); + if( FAILED( hr2 ) ) + { + // If this failed, then shutdown + DXUTShutdown(); + } + } + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Toggle between HAL/WARP and REF +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTToggleREF() +{ + auto deviceSettings = DXUTGetDeviceSettings(); + + if ( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_HARDWARE ) + { + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_REFERENCE; + } + else if ( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) + { + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_HARDWARE; + } + else if ( deviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_WARP ) + { + if ( !deviceSettings.d3d11.sd.Windowed ) + { + // WARP driver type doesn't support fullscreen + return S_FALSE; + } + + deviceSettings.d3d11.DriverType = D3D_DRIVER_TYPE_REFERENCE; + } + + HRESULT hr = DXUTSnapDeviceSettingsToEnumDevice(&deviceSettings, false); + if( SUCCEEDED( hr ) ) + { + auto orginalDeviceSettings = DXUTGetDeviceSettings(); + + // Create a Direct3D device using the new device settings. + // If there is an existing device, then it will either reset or recreate the scene. + hr = DXUTChangeDevice( &deviceSettings, false ); + + // If hr == E_ABORT, this means the app rejected the device settings in the ModifySettingsCallback so nothing changed + if( FAILED( hr ) && ( hr != E_ABORT ) ) + { + // Failed creating device, try to switch back. + HRESULT hr2 = DXUTChangeDevice( &orginalDeviceSettings, false ); + if( FAILED( hr2 ) ) + { + // If this failed, then shutdown + DXUTShutdown(); + } + } + } + + return hr; +} + +//-------------------------------------------------------------------------------------- +// Checks to see if DXGI has switched us out of fullscreen or windowed mode +//-------------------------------------------------------------------------------------- +void DXUTCheckForDXGIFullScreenSwitch() +{ + auto pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + auto pSwapChain = DXUTGetDXGISwapChain(); + assert( pSwapChain ); + _Analysis_assume_( pSwapChain ); + DXGI_SWAP_CHAIN_DESC SCDesc; + if ( FAILED(pSwapChain->GetDesc(&SCDesc)) ) + memset( &SCDesc, 0, sizeof(SCDesc) ); + + BOOL bIsWindowed = ( BOOL )DXUTIsWindowed(); + if( bIsWindowed != SCDesc.Windowed ) + { + pDeviceSettings->d3d11.sd.Windowed = SCDesc.Windowed; + + auto deviceSettings = DXUTGetDeviceSettings(); + + if( bIsWindowed ) + { + GetDXUTState().SetWindowBackBufferWidthAtModeChange( deviceSettings.d3d11.sd.BufferDesc.Width ); + GetDXUTState().SetWindowBackBufferHeightAtModeChange( deviceSettings.d3d11.sd.BufferDesc.Height ); + } + else + { + GetDXUTState().SetFullScreenBackBufferWidthAtModeChange( deviceSettings.d3d11.sd.BufferDesc.Width ); + GetDXUTState().SetFullScreenBackBufferHeightAtModeChange( deviceSettings.d3d11.sd.BufferDesc.Height ); + } + } +} + +_Use_decl_annotations_ +void DXUTResizeDXGIBuffers( UINT Width, UINT Height, BOOL bFullScreen ) +{ + HRESULT hr = S_OK; + RECT rcCurrentClient; + GetClientRect( DXUTGetHWND(), &rcCurrentClient ); + + auto pDevSettings = GetDXUTState().GetCurrentDeviceSettings(); + assert( pDevSettings ); + _Analysis_assume_( pDevSettings ); + + auto pSwapChain = DXUTGetDXGISwapChain(); + + auto pd3dDevice = DXUTGetD3D11Device(); + assert( pd3dDevice ); + _Analysis_assume_( pd3dDevice ); + + auto pd3dImmediateContext = DXUTGetD3D11DeviceContext(); + assert( pd3dImmediateContext ); + _Analysis_assume_( pd3dImmediateContext ); + + // Determine if we're fullscreen + pDevSettings->d3d11.sd.Windowed = !bFullScreen; + + // Call releasing + GetDXUTState().SetInsideDeviceCallback( true ); + LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallbackSwapChainReleasing = GetDXUTState().GetD3D11SwapChainReleasingFunc + (); + if( pCallbackSwapChainReleasing ) + pCallbackSwapChainReleasing( GetDXUTState().GetD3D11SwapChainResizedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + + // Release our old depth stencil texture and view + auto pDS = GetDXUTState().GetD3D11DepthStencil(); + SAFE_RELEASE( pDS ); + GetDXUTState().SetD3D11DepthStencil( nullptr ); + auto pDSV = GetDXUTState().GetD3D11DepthStencilView(); + SAFE_RELEASE( pDSV ); + GetDXUTState().SetD3D11DepthStencilView( nullptr ); + + // Release our old render target view + auto pRTV = GetDXUTState().GetD3D11RenderTargetView(); + SAFE_RELEASE( pRTV ); + GetDXUTState().SetD3D11RenderTargetView( nullptr ); + + // Alternate between 0 and DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH when resizing buffers. + // When in windowed mode, we want 0 since this allows the app to change to the desktop + // resolution from windowed mode during alt+enter. However, in fullscreen mode, we want + // the ability to change display modes from the Device Settings dialog. Therefore, we + // want to set the DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH flag. + UINT Flags = 0; + if( bFullScreen ) + Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + + // ResizeBuffers + V( pSwapChain->ResizeBuffers( pDevSettings->d3d11.sd.BufferCount, + Width, + Height, + pDevSettings->d3d11.sd.BufferDesc.Format, + Flags ) ); + + if( !GetDXUTState().GetDoNotStoreBufferSize() ) + { + pDevSettings->d3d11.sd.BufferDesc.Width = ( UINT )rcCurrentClient.right; + pDevSettings->d3d11.sd.BufferDesc.Height = ( UINT )rcCurrentClient.bottom; + } + + // Save off backbuffer desc + DXUTUpdateBackBufferDesc(); + + // Update the device stats text + DXUTUpdateStaticFrameStats(); + + // Setup the render target view and viewport + hr = DXUTCreateD3D11Views( pd3dDevice, pd3dImmediateContext, pDevSettings ); + if( FAILED( hr ) ) + { + DXUT_ERR( L"DXUTCreateD3D11Views", hr ); + return; + } + + // Setup cursor based on current settings (window/fullscreen mode, show cursor state, clip cursor state) + DXUTSetupCursor(); + + // Call the app's SwapChain reset callback + GetDXUTState().SetInsideDeviceCallback( true ); + auto pBackBufferSurfaceDesc = DXUTGetDXGIBackBufferSurfaceDesc(); + LPDXUTCALLBACKD3D11SWAPCHAINRESIZED pCallbackSwapChainResized = GetDXUTState().GetD3D11SwapChainResizedFunc(); + hr = S_OK; + if( pCallbackSwapChainResized ) + hr = pCallbackSwapChainResized( pd3dDevice, pSwapChain, pBackBufferSurfaceDesc, + GetDXUTState().GetD3D11SwapChainResizedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + if( FAILED( hr ) ) + { + // If callback failed, cleanup + DXUT_ERR( L"DeviceResetCallback", hr ); + if( hr != DXUTERR_MEDIANOTFOUND ) + hr = DXUTERR_RESETTINGDEVICEOBJECTS; + + GetDXUTState().SetInsideDeviceCallback( true ); + pCallbackSwapChainReleasing = + GetDXUTState().GetD3D11SwapChainReleasingFunc(); + if( pCallbackSwapChainReleasing ) + pCallbackSwapChainReleasing( GetDXUTState().GetD3D11SwapChainResizedFuncUserContext() ); + GetDXUTState().SetInsideDeviceCallback( false ); + DXUTPause( false, false ); + PostQuitMessage( 0 ); + } + else + { + GetDXUTState().SetDeviceObjectsReset( true ); + DXUTPause( false, false ); + } +} + +//-------------------------------------------------------------------------------------- +// Checks if DXGI buffers need to change +//-------------------------------------------------------------------------------------- +void DXUTCheckForDXGIBufferChange() +{ + if(DXUTGetDXGISwapChain() && !GetDXUTState().GetReleasingSwapChain() ) + { + //DXUTgetdxgi + auto pSwapChain = DXUTGetDXGISwapChain(); + assert(pSwapChain); + _Analysis_assume_(pSwapChain); + +// workaround for SAL bug in DXGI header +#pragma warning(push) +#pragma warning( disable:4616 6309 6387 ) + // Determine if we're fullscreen + BOOL bFullScreen; + if ( FAILED(pSwapChain->GetFullscreenState(&bFullScreen, nullptr)) ) + bFullScreen = FALSE; +#pragma warning(pop) + + DXUTResizeDXGIBuffers( 0, 0, bFullScreen ); + + ShowWindow( DXUTGetHWND(), SW_SHOW ); + } +} + +//-------------------------------------------------------------------------------------- +// Checks if the window client rect has changed and if it has, then reset the device +//-------------------------------------------------------------------------------------- +void DXUTCheckForWindowSizeChange() +{ + // Skip the check for various reasons + + if( GetDXUTState().GetIgnoreSizeChange() || !GetDXUTState().GetDeviceCreated() ) + return; + + DXUTCheckForDXGIBufferChange(); +} + + +//-------------------------------------------------------------------------------------- +// Checks to see if the HWND changed monitors, and if it did it creates a device +// from the monitor's adapter and recreates the scene. +//-------------------------------------------------------------------------------------- +void DXUTCheckForWindowChangingMonitors() +{ + // Skip this check for various reasons + if( !GetDXUTState().GetAutoChangeAdapter() || + GetDXUTState().GetIgnoreSizeChange() || !GetDXUTState().GetDeviceCreated() || !DXUTIsWindowed() ) + return; + + HRESULT hr; + HMONITOR hWindowMonitor = DXUTMonitorFromWindow( DXUTGetHWND(), MONITOR_DEFAULTTOPRIMARY ); + HMONITOR hAdapterMonitor = GetDXUTState().GetAdapterMonitor(); + if( hWindowMonitor != hAdapterMonitor ) + { + UINT newOrdinal; + if( SUCCEEDED( DXUTGetAdapterOrdinalFromMonitor( hWindowMonitor, &newOrdinal ) ) ) + { + // Find the closest valid device settings with the new ordinal + auto deviceSettings = DXUTGetDeviceSettings(); + deviceSettings.d3d11.AdapterOrdinal = newOrdinal; + UINT newOutput; + if( SUCCEEDED( DXUTGetOutputOrdinalFromMonitor( hWindowMonitor, &newOutput ) ) ) + deviceSettings.d3d11.Output = newOutput; + + hr = DXUTSnapDeviceSettingsToEnumDevice( &deviceSettings, false ); + if( SUCCEEDED( hr ) ) + { + // Create a Direct3D device using the new device settings. + // If there is an existing device, then it will either reset or recreate the scene. + hr = DXUTChangeDevice( &deviceSettings, false ); + + // If hr == E_ABORT, this means the app rejected the device settings in the ModifySettingsCallback + if( hr == E_ABORT ) + { + // so nothing changed and keep from attempting to switch adapters next time + GetDXUTState().SetAutoChangeAdapter( false ); + } + else if( FAILED( hr ) ) + { + DXUTShutdown(); + DXUTPause( false, false ); + return; + } + } + } + } +} + + +//-------------------------------------------------------------------------------------- +// Returns the HMONITOR attached to an adapter/output +//-------------------------------------------------------------------------------------- +HMONITOR DXUTGetMonitorFromAdapter( _In_ DXUTDeviceSettings* pDeviceSettings ) +{ + auto pD3DEnum = DXUTGetD3D11Enumeration(); + assert( pD3DEnum ); + _Analysis_assume_( pD3DEnum ); + auto pOutputInfo = pD3DEnum->GetOutputInfo( pDeviceSettings->d3d11.AdapterOrdinal, + pDeviceSettings->d3d11.Output ); + if( !pOutputInfo ) + return 0; + return DXUTMonitorFromRect( &pOutputInfo->Desc.DesktopCoordinates, MONITOR_DEFAULTTONEAREST ); +} + + +//-------------------------------------------------------------------------------------- +// Look for an adapter ordinal that is tied to a HMONITOR +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DXUTGetAdapterOrdinalFromMonitor( HMONITOR hMonitor, UINT* pAdapterOrdinal ) +{ + *pAdapterOrdinal = 0; + + // Get the monitor handle information + MONITORINFOEX mi; + mi.cbSize = sizeof( MONITORINFOEX ); + DXUTGetMonitorInfo( hMonitor, &mi ); + + // Search for this monitor in our enumeration hierarchy. + auto pd3dEnum = DXUTGetD3D11Enumeration(); + auto pAdapterList = pd3dEnum->GetAdapterInfoList(); + for( auto it = pAdapterList->cbegin(); it != pAdapterList->cend(); ++it ) + { + auto pAdapterInfo = *it; + for( auto jit = pAdapterInfo->outputInfoList.cbegin(); jit != pAdapterInfo->outputInfoList.cend(); ++jit ) + { + auto pOutputInfo = *jit; + // Convert output device name from MBCS to Unicode + if( wcsncmp( pOutputInfo->Desc.DeviceName, mi.szDevice, sizeof( mi.szDevice ) / sizeof + ( mi.szDevice[0] ) ) == 0 ) + { + *pAdapterOrdinal = pAdapterInfo->AdapterOrdinal; + return S_OK; + } + } + } + return E_FAIL; +} + + +//-------------------------------------------------------------------------------------- +// Look for a monitor ordinal that is tied to a HMONITOR (D3D11-only) +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DXUTGetOutputOrdinalFromMonitor( HMONITOR hMonitor, UINT* pOutputOrdinal ) +{ + // Get the monitor handle information + MONITORINFOEX mi; + mi.cbSize = sizeof( MONITORINFOEX ); + DXUTGetMonitorInfo( hMonitor, &mi ); + + // Search for this monitor in our enumeration hierarchy. + auto pd3dEnum = DXUTGetD3D11Enumeration(); + auto pAdapterList = pd3dEnum->GetAdapterInfoList(); + for( auto it = pAdapterList->cbegin(); it != pAdapterList->cend(); ++it ) + { + auto pAdapterInfo = *it; + for( auto jit = pAdapterInfo->outputInfoList.cbegin(); jit != pAdapterInfo->outputInfoList.cend(); ++jit ) + { + auto pOutputInfo = *jit; + DXGI_OUTPUT_DESC Desc; + if ( FAILED(pOutputInfo->m_pOutput->GetDesc(&Desc)) ) + memset( &Desc, 0, sizeof(Desc) ); + + if( hMonitor == Desc.Monitor ) + { + *pOutputOrdinal = pOutputInfo->Output; + return S_OK; + } + } + } + + return E_FAIL; +} + + +//-------------------------------------------------------------------------------------- +// This method is called when D3DERR_DEVICEREMOVED is returned from an API. DXUT +// calls the application's DeviceRemoved callback to inform it of the event. The +// application returns true if it wants DXUT to look for a closest device to run on. +// If no device is found, or the app returns false, DXUT shuts down. +//-------------------------------------------------------------------------------------- +HRESULT DXUTHandleDeviceRemoved() +{ + HRESULT hr = S_OK; + + // Device has been removed. Call the application's callback if set. If no callback + // has been set, then just look for a new device + bool bLookForNewDevice = true; + LPDXUTCALLBACKDEVICEREMOVED pDeviceRemovedFunc = GetDXUTState().GetDeviceRemovedFunc(); + if( pDeviceRemovedFunc ) + bLookForNewDevice = pDeviceRemovedFunc( GetDXUTState().GetDeviceRemovedFuncUserContext() ); + + if( bLookForNewDevice ) + { + auto pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + + + hr = DXUTSnapDeviceSettingsToEnumDevice( pDeviceSettings, false); + if( SUCCEEDED( hr ) ) + { + // Change to a Direct3D device created from the new device settings + // that is compatible with the removed device. + hr = DXUTChangeDevice( pDeviceSettings, false ); + if( SUCCEEDED( hr ) ) + return S_OK; + } + } + + // The app does not wish to continue or continuing is not possible. + return DXUTERR_DEVICEREMOVED; +} + + +//-------------------------------------------------------------------------------------- +// Stores back buffer surface desc in GetDXUTState().GetBackBufferSurfaceDesc10() +//-------------------------------------------------------------------------------------- +void DXUTUpdateBackBufferDesc() +{ + HRESULT hr; + ID3D11Texture2D* pBackBuffer; + auto pSwapChain = GetDXUTState().GetDXGISwapChain(); + assert( pSwapChain ); + _Analysis_assume_( pSwapChain ); + hr = pSwapChain->GetBuffer( 0, IID_PPV_ARGS(&pBackBuffer) ); + auto pBBufferSurfaceDesc = GetDXUTState().GetBackBufferSurfaceDescDXGI(); + ZeroMemory( pBBufferSurfaceDesc, sizeof( DXGI_SURFACE_DESC ) ); + if( SUCCEEDED( hr ) ) + { + D3D11_TEXTURE2D_DESC TexDesc; + pBackBuffer->GetDesc( &TexDesc ); + pBBufferSurfaceDesc->Width = ( UINT )TexDesc.Width; + pBBufferSurfaceDesc->Height = ( UINT )TexDesc.Height; + pBBufferSurfaceDesc->Format = TexDesc.Format; + pBBufferSurfaceDesc->SampleDesc = TexDesc.SampleDesc; + SAFE_RELEASE( pBackBuffer ); + } +} + + +//-------------------------------------------------------------------------------------- +// Setup cursor based on current settings (window/fullscreen mode, show cursor state, clip cursor state) +//-------------------------------------------------------------------------------------- +void DXUTSetupCursor() +{ + // Clip cursor if requested + if( !DXUTIsWindowed() && GetDXUTState().GetClipCursorWhenFullScreen() ) + { + // Confine cursor to full screen window + RECT rcWindow; + GetWindowRect( DXUTGetHWNDDeviceFullScreen(), &rcWindow ); + ClipCursor( &rcWindow ); + } + else + { + ClipCursor( nullptr ); + } +} + + +//-------------------------------------------------------------------------------------- +// Updates the static part of the frame stats so it doesn't have be generated every frame +//-------------------------------------------------------------------------------------- +void DXUTUpdateStaticFrameStats() +{ + if( GetDXUTState().GetNoStats() ) + return; + + auto pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( !pDeviceSettings ) + return; + + // D3D11 + auto pd3dEnum = DXUTGetD3D11Enumeration(); + if( !pd3dEnum ) + return; + + auto pDeviceSettingsCombo = pd3dEnum->GetDeviceSettingsCombo( + pDeviceSettings->d3d11.AdapterOrdinal, + pDeviceSettings->d3d11.sd.BufferDesc.Format, pDeviceSettings->d3d11.sd.Windowed ); + if( !pDeviceSettingsCombo ) + return; + + WCHAR strFmt[100]; + wcscpy_s( strFmt, 100, DXUTDXGIFormatToString( pDeviceSettingsCombo->BackBufferFormat, false ) ); + + WCHAR strMultiSample[100]; + swprintf_s( strMultiSample, 100, L" (MS%u, Q%u)", pDeviceSettings->d3d11.sd.SampleDesc.Count, + pDeviceSettings->d3d11.sd.SampleDesc.Quality ); + auto pstrStaticFrameStats = GetDXUTState().GetStaticFrameStats(); + swprintf_s( pstrStaticFrameStats, 256, L"D3D11 %%ls Vsync %ls (%ux%u), %ls%ls", + ( pDeviceSettings->d3d11.SyncInterval == 0 ) ? L"off" : L"on", + pDeviceSettings->d3d11.sd.BufferDesc.Width, pDeviceSettings->d3d11.sd.BufferDesc.Height, + strFmt, strMultiSample ); +} + + +//-------------------------------------------------------------------------------------- +// Updates the frames/sec stat once per second +//-------------------------------------------------------------------------------------- +void DXUTUpdateFrameStats() +{ + if( GetDXUTState().GetNoStats() ) + return; + + // Keep track of the frame count + double fLastTime = GetDXUTState().GetLastStatsUpdateTime(); + DWORD dwFrames = GetDXUTState().GetLastStatsUpdateFrames(); + double fAbsTime = GetDXUTState().GetAbsoluteTime(); + dwFrames++; + GetDXUTState().SetLastStatsUpdateFrames( dwFrames ); + + // Update the scene stats once per second + if( fAbsTime - fLastTime > 1.0f ) + { + float fFPS = ( float )( dwFrames / ( fAbsTime - fLastTime ) ); + GetDXUTState().SetFPS( fFPS ); + GetDXUTState().SetLastStatsUpdateTime( fAbsTime ); + GetDXUTState().SetLastStatsUpdateFrames( 0 ); + + auto pstrFPS = GetDXUTState().GetFPSStats(); + swprintf_s( pstrFPS, 64, L"%0.2f fps ", fFPS ); + } +} + + +//-------------------------------------------------------------------------------------- +// Returns a string describing the current device. If bShowFPS is true, then +// the string contains the frames/sec. If "-nostats" was used in +// the command line, the string will be blank +//-------------------------------------------------------------------------------------- +LPCWSTR WINAPI DXUTGetFrameStats( _In_ bool bShowFPS ) +{ + auto pstrFrameStats = GetDXUTState().GetFrameStats(); + const WCHAR* pstrFPS = ( bShowFPS ) ? GetDXUTState().GetFPSStats() : L""; + WCHAR* pstrStats = GetDXUTState().GetStaticFrameStats(); + swprintf_s( pstrFrameStats, 256, pstrStats, pstrFPS ); + return pstrFrameStats; +} + + +//-------------------------------------------------------------------------------------- +// Updates the string which describes the device +//-------------------------------------------------------------------------------------- +#pragma warning( suppress : 6101 ) +_Use_decl_annotations_ +void DXUTUpdateD3D11DeviceStats( D3D_DRIVER_TYPE DeviceType, D3D_FEATURE_LEVEL featureLevel, DXGI_ADAPTER_DESC* pAdapterDesc ) +{ + if( GetDXUTState().GetNoStats() ) + return; + + // Store device description + auto pstrDeviceStats = GetDXUTState().GetDeviceStats(); + if( DeviceType == D3D_DRIVER_TYPE_REFERENCE ) + wcscpy_s( pstrDeviceStats, 256, L"REFERENCE" ); + else if( DeviceType == D3D_DRIVER_TYPE_HARDWARE ) + wcscpy_s( pstrDeviceStats, 256, L"HARDWARE" ); + else if( DeviceType == D3D_DRIVER_TYPE_SOFTWARE ) + wcscpy_s( pstrDeviceStats, 256, L"SOFTWARE" ); + else if( DeviceType == D3D_DRIVER_TYPE_WARP ) + wcscpy_s( pstrDeviceStats, 256, L"WARP" ); + + if( DeviceType == D3D_DRIVER_TYPE_HARDWARE ) + { + // Be sure not to overflow m_strDeviceStats when appending the adapter + // description, since it can be long. + wcscat_s( pstrDeviceStats, 256, L": " ); + + // Try to get a unique description from the CD3D11EnumDeviceSettingsCombo + auto pDeviceSettings = GetDXUTState().GetCurrentDeviceSettings(); + if( !pDeviceSettings ) + return; + + auto pd3dEnum = DXUTGetD3D11Enumeration(); + assert( pd3dEnum ); + _Analysis_assume_( pd3dEnum ); + auto pDeviceSettingsCombo = pd3dEnum->GetDeviceSettingsCombo( + pDeviceSettings->d3d11.AdapterOrdinal, + pDeviceSettings->d3d11.sd.BufferDesc.Format, pDeviceSettings->d3d11.sd.Windowed ); + if( pDeviceSettingsCombo ) + wcscat_s( pstrDeviceStats, 256, pDeviceSettingsCombo->pAdapterInfo->szUniqueDescription ); + else + wcscat_s( pstrDeviceStats, 256, pAdapterDesc->Description ); + } + + switch( featureLevel ) + { + case D3D_FEATURE_LEVEL_9_1: + wcscat_s( pstrDeviceStats, 256, L" (FL 9.1)" ); + break; + case D3D_FEATURE_LEVEL_9_2: + wcscat_s( pstrDeviceStats, 256, L" (FL 9.2)" ); + break; + case D3D_FEATURE_LEVEL_9_3: + wcscat_s( pstrDeviceStats, 256, L" (FL 9.3)" ); + break; + case D3D_FEATURE_LEVEL_10_0: + wcscat_s( pstrDeviceStats, 256, L" (FL 10.0)" ); + break; + case D3D_FEATURE_LEVEL_10_1: + wcscat_s( pstrDeviceStats, 256, L" (FL 10.1)" ); + break; + case D3D_FEATURE_LEVEL_11_0: + wcscat_s( pstrDeviceStats, 256, L" (FL 11.0)" ); + break; + case D3D_FEATURE_LEVEL_11_1: + wcscat_s( pstrDeviceStats, 256, L" (FL 11.1)" ); + break; +#ifdef USE_DIRECT3D11_3 + case D3D_FEATURE_LEVEL_12_0: + wcscat_s(pstrDeviceStats, 256, L" (FL 12.0)"); + break; + case D3D_FEATURE_LEVEL_12_1: + wcscat_s(pstrDeviceStats, 256, L" (FL 12.1)"); + break; +#endif + } +} + + +//-------------------------------------------------------------------------------------- +// Misc functions +//-------------------------------------------------------------------------------------- +DXUTDeviceSettings WINAPI DXUTGetDeviceSettings() +{ + // Return a copy of device settings of the current device. If no device exists yet, then + // return a blank device settings struct + auto pDS = GetDXUTState().GetCurrentDeviceSettings(); + if( pDS ) + { + return *pDS; + } + else + { + DXUTDeviceSettings ds; + ZeroMemory( &ds, sizeof( DXUTDeviceSettings ) ); + return ds; + } +} + +bool WINAPI DXUTIsVsyncEnabled() +{ + auto pDS = GetDXUTState().GetCurrentDeviceSettings(); + if( pDS ) + { + return ( pDS->d3d11.SyncInterval == 0 ); + } + else + { + return true; + } +}; + +bool WINAPI DXUTIsKeyDown( _In_ BYTE vKey ) +{ + bool* bKeys = GetDXUTState().GetKeys(); + if( vKey >= 0xA0 && vKey <= 0xA5 ) // VK_LSHIFT, VK_RSHIFT, VK_LCONTROL, VK_RCONTROL, VK_LMENU, VK_RMENU + return GetAsyncKeyState( vKey ) != 0; // these keys only are tracked via GetAsyncKeyState() + else if( vKey >= 0x01 && vKey <= 0x06 && vKey != 0x03 ) // mouse buttons (VK_*BUTTON) + return DXUTIsMouseButtonDown( vKey ); + else + return bKeys[vKey]; +} + +bool WINAPI DXUTWasKeyPressed( _In_ BYTE vKey ) +{ + bool* bLastKeys = GetDXUTState().GetLastKeys(); + bool* bKeys = GetDXUTState().GetKeys(); + GetDXUTState().SetAppCalledWasKeyPressed( true ); + return ( !bLastKeys[vKey] && bKeys[vKey] ); +} + +bool WINAPI DXUTIsMouseButtonDown( _In_ BYTE vButton ) +{ + bool* bMouseButtons = GetDXUTState().GetMouseButtons(); + int nIndex = DXUTMapButtonToArrayIndex( vButton ); + return bMouseButtons[nIndex]; +} + +void WINAPI DXUTSetMultimonSettings( _In_ bool bAutoChangeAdapter ) +{ + GetDXUTState().SetAutoChangeAdapter( bAutoChangeAdapter ); +} + +_Use_decl_annotations_ +void WINAPI DXUTSetHotkeyHandling( bool bAltEnterToToggleFullscreen, bool bEscapeToQuit, bool bPauseToToggleTimePause ) +{ + GetDXUTState().SetHandleEscape( bEscapeToQuit ); + GetDXUTState().SetHandleAltEnter( bAltEnterToToggleFullscreen ); + GetDXUTState().SetHandlePause( bPauseToToggleTimePause ); +} + +_Use_decl_annotations_ +void WINAPI DXUTSetCursorSettings( bool bShowCursorWhenFullScreen, bool bClipCursorWhenFullScreen ) +{ + GetDXUTState().SetClipCursorWhenFullScreen( bClipCursorWhenFullScreen ); + GetDXUTState().SetShowCursorWhenFullScreen( bShowCursorWhenFullScreen ); + DXUTSetupCursor(); +} + +void WINAPI DXUTSetWindowSettings( _In_ bool bCallDefWindowProc ) +{ + GetDXUTState().SetCallDefWindowProc( bCallDefWindowProc ); +} + +_Use_decl_annotations_ +void WINAPI DXUTSetConstantFrameTime( bool bEnabled, float fTimePerFrame ) +{ + if( GetDXUTState().GetOverrideConstantFrameTime() ) + { + bEnabled = GetDXUTState().GetOverrideConstantFrameTime(); + fTimePerFrame = GetDXUTState().GetOverrideConstantTimePerFrame(); + } + GetDXUTState().SetConstantFrameTime( bEnabled ); + GetDXUTState().SetTimePerFrame( fTimePerFrame ); +} + + +//-------------------------------------------------------------------------------------- +// Resets the state associated with DXUT +//-------------------------------------------------------------------------------------- +void WINAPI DXUTResetFrameworkState() +{ + GetDXUTState().Destroy(); + GetDXUTState().Create(); +} + + +//-------------------------------------------------------------------------------------- +// Closes down the window. When the window closes, it will cleanup everything +//-------------------------------------------------------------------------------------- +void WINAPI DXUTShutdown( _In_ int nExitCode ) +{ + HWND hWnd = DXUTGetHWND(); + if( hWnd ) + SendMessage( hWnd, WM_CLOSE, 0, 0 ); + + GetDXUTState().SetExitCode( nExitCode ); + + DXUTCleanup3DEnvironment( true ); + + // Restore shortcut keys (Windows key, accessibility shortcuts) to original state + // This is important to call here if the shortcuts are disabled, + // because accessibility setting changes are permanent. + // This means that if this is not done then the accessibility settings + // might not be the same as when the app was started. + // If the app crashes without restoring the settings, this is also true so it + // would be wise to backup/restore the settings from a file so they can be + // restored when the crashed app is run again. + DXUTAllowShortcutKeys( true ); + + // Shutdown D3D11 + auto pDXGIFactory = GetDXUTState().GetDXGIFactory(); + SAFE_RELEASE( pDXGIFactory ); + GetDXUTState().SetDXGIFactory( nullptr ); +} + + +//-------------------------------------------------------------------------------------- +// Tells DXUT whether to operate in gamma correct mode +//-------------------------------------------------------------------------------------- +void WINAPI DXUTSetIsInGammaCorrectMode( _In_ bool bGammaCorrect ) +{ + GetDXUTState().SetIsInGammaCorrectMode( bGammaCorrect ); +} + + +//-------------------------------------------------------------------------------------- +void DXUTApplyDefaultDeviceSettings(DXUTDeviceSettings *modifySettings) +{ + ZeroMemory( modifySettings, sizeof( DXUTDeviceSettings ) ); + + modifySettings->d3d11.AdapterOrdinal = 0; + modifySettings->d3d11.AutoCreateDepthStencil = true; + modifySettings->d3d11.AutoDepthStencilFormat = DXGI_FORMAT_D24_UNORM_S8_UINT; +#if defined(DEBUG) || defined(_DEBUG) + modifySettings->d3d11.CreateFlags |= D3D11_CREATE_DEVICE_DEBUG; +#else + modifySettings->d3d11.CreateFlags = 0; +#endif + modifySettings->d3d11.DriverType = D3D_DRIVER_TYPE_HARDWARE; + modifySettings->d3d11.Output = 0; + modifySettings->d3d11.PresentFlags = 0; + modifySettings->d3d11.sd.BufferCount = 2; + modifySettings->d3d11.sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + modifySettings->d3d11.sd.BufferDesc.Height = 600; + modifySettings->d3d11.sd.BufferDesc.RefreshRate.Numerator = 0; + modifySettings->d3d11.sd.BufferDesc.RefreshRate.Denominator = 0; + modifySettings->d3d11.sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + modifySettings->d3d11.sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + modifySettings->d3d11.sd.BufferDesc.Width = 800; + modifySettings->d3d11.sd.BufferUsage = 32; + modifySettings->d3d11.sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH ; + modifySettings->d3d11.sd.OutputWindow = DXUTGetHWND(); + modifySettings->d3d11.sd.SampleDesc.Count = 1; + modifySettings->d3d11.sd.SampleDesc.Quality = 0; + modifySettings->d3d11.sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + modifySettings->d3d11.sd.Windowed = TRUE; + modifySettings->d3d11.SyncInterval = 0; +} + + +//-------------------------------------------------------------------------------------- +// Update settings based on what is enumeratabled +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DXUTSnapDeviceSettingsToEnumDevice( DXUTDeviceSettings* pDeviceSettings, bool forceEnum, D3D_FEATURE_LEVEL forceFL ) +{ + if( GetSystemMetrics(SM_REMOTESESSION) != 0 ) + { + pDeviceSettings->d3d11.sd.Windowed = TRUE; + } + int bestModeIndex=0; + int bestMSAAIndex=0; + + //DXUTSetDefaultDeviceSettings + CD3D11Enumeration *pEnum = DXUTGetD3D11Enumeration( forceEnum, true, forceFL); + + CD3D11EnumAdapterInfo* pAdapterInfo = nullptr; + auto pAdapterList = pEnum->GetAdapterInfoList(); + for( auto it = pAdapterList->cbegin(); it != pAdapterList->cend(); ++it ) + { + auto tempAdapterInfo = *it; + if (tempAdapterInfo->AdapterOrdinal == pDeviceSettings->d3d11.AdapterOrdinal) pAdapterInfo = tempAdapterInfo; + } + if ( !pAdapterInfo ) + { + if ( pAdapterList->empty() || pDeviceSettings->d3d11.AdapterOrdinal > 0 ) + { + return E_FAIL; // no adapters found. + } + pAdapterInfo = *pAdapterList->cbegin(); + } + CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo = nullptr; + float biggestScore = 0; + + for( size_t iDeviceCombo = 0; iDeviceCombo < pAdapterInfo->deviceSettingsComboList.size(); iDeviceCombo++ ) + { + CD3D11EnumDeviceSettingsCombo* tempDeviceSettingsCombo = pAdapterInfo->deviceSettingsComboList[ iDeviceCombo ]; + + int bestMode; + int bestMSAA; + float score = DXUTRankD3D11DeviceCombo(tempDeviceSettingsCombo, &(pDeviceSettings->d3d11), bestMode, bestMSAA ); + if (score > biggestScore) + { + biggestScore = score; + pDeviceSettingsCombo = tempDeviceSettingsCombo; + bestModeIndex = bestMode; + bestMSAAIndex = bestMSAA; + } + } + if (!pDeviceSettingsCombo ) + { + return E_FAIL; // no settings found. + } + + pDeviceSettings->d3d11.AdapterOrdinal = pDeviceSettingsCombo->AdapterOrdinal; + pDeviceSettings->d3d11.DriverType = pDeviceSettingsCombo->DeviceType; + pDeviceSettings->d3d11.Output = pDeviceSettingsCombo->Output; + + pDeviceSettings->d3d11.sd.Windowed = pDeviceSettingsCombo->Windowed; + if( GetSystemMetrics(SM_REMOTESESSION) != 0 ) + { + pDeviceSettings->d3d11.sd.Windowed = TRUE; + } + if (pDeviceSettingsCombo->pOutputInfo) + { + auto bestDisplayMode = pDeviceSettingsCombo->pOutputInfo->displayModeList[ bestModeIndex ]; + if (!pDeviceSettingsCombo->Windowed) + { + pDeviceSettings->d3d11.sd.BufferDesc.Height = bestDisplayMode.Height; + pDeviceSettings->d3d11.sd.BufferDesc.Width = bestDisplayMode.Width; + pDeviceSettings->d3d11.sd.BufferDesc.RefreshRate.Numerator = bestDisplayMode.RefreshRate.Numerator; + pDeviceSettings->d3d11.sd.BufferDesc.RefreshRate.Denominator = bestDisplayMode.RefreshRate.Denominator; + pDeviceSettings->d3d11.sd.BufferDesc.Scaling = bestDisplayMode.Scaling; + pDeviceSettings->d3d11.sd.BufferDesc.ScanlineOrdering = bestDisplayMode.ScanlineOrdering; + } + } + if (pDeviceSettings->d3d11.DeviceFeatureLevel == 0) + pDeviceSettings->d3d11.DeviceFeatureLevel = pDeviceSettingsCombo->pDeviceInfo->SelectedLevel; + + if ( pDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_WARP ) + { + D3D_FEATURE_LEVEL maxWarpFL = pEnum->GetWARPFeaturevel(); + + if ( pDeviceSettings->d3d11.DeviceFeatureLevel > maxWarpFL ) + pDeviceSettings->d3d11.DeviceFeatureLevel = maxWarpFL; + } + + if ( pDeviceSettings->d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) + { + D3D_FEATURE_LEVEL maxRefFL = pEnum->GetREFFeaturevel(); + + if ( pDeviceSettings->d3d11.DeviceFeatureLevel > maxRefFL ) + pDeviceSettings->d3d11.DeviceFeatureLevel = maxRefFL; + } + + pDeviceSettings->d3d11.sd.SampleDesc.Count = pDeviceSettingsCombo->multiSampleCountList[ bestMSAAIndex ]; + if (pDeviceSettings->d3d11.sd.SampleDesc.Quality > pDeviceSettingsCombo->multiSampleQualityList[ bestMSAAIndex ] - 1) + pDeviceSettings->d3d11.sd.SampleDesc.Quality = pDeviceSettingsCombo->multiSampleQualityList[ bestMSAAIndex ] - 1; + + pDeviceSettings->d3d11.sd.BufferDesc.Format = pDeviceSettingsCombo->BackBufferFormat; + + return S_OK; +} diff --git a/DXUT11/Core/DXUT.h b/DXUT11/Core/DXUT.h new file mode 100644 index 0000000..46a2cdf --- /dev/null +++ b/DXUT11/Core/DXUT.h @@ -0,0 +1,341 @@ +//-------------------------------------------------------------------------------------- +// File: DXUT.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +#ifndef UNICODE +#error "DXUT requires a Unicode build." +#endif + +#ifndef STRICT +#define STRICT +#endif + +// If app hasn't choosen, set to work with Windows Vista and beyond +#ifndef WINVER +#define WINVER 0x0600 +#endif +#ifndef _WIN32_WINDOWS +#define _WIN32_WINDOWS 0x0600 +#endif +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 +#endif + +#if (_WIN32_WINNT >= 0x0A00) && !defined(USE_DIRECT3D11_3) +#define USE_DIRECT3D11_3 +#endif + +#if (_WIN32_WINNT >= 0x0603) && !defined(USE_DIRECT3D11_2) +#define USE_DIRECT3D11_2 +#endif + +#if defined(USE_DIRECT3D11_3) && !defined(USE_DIRECT3D11_2) +#define USE_DIRECT3D11_2 +#endif + +// #define DXUT_AUTOLIB to automatically include the libs needed for DXUT +#ifdef DXUT_AUTOLIB +#pragma comment( lib, "comctl32.lib" ) +#pragma comment( lib, "dxguid.lib" ) +#pragma comment( lib, "d3dcompiler.lib" ) +#pragma comment( lib, "ole32.lib" ) +#pragma comment( lib, "uuid.lib" ) +#endif + +#pragma warning( disable : 4481 ) + +// Standard Windows includes +#if !defined(NOMINMAX) +#define NOMINMAX +#endif + +#include +#include +#include +#include // for InitCommonControls() +#include // for ExtractIcon() +#include // for placement new +#include +#include +#include +#include + +// CRT's memory leak detection +#if defined(DEBUG) || defined(_DEBUG) +#include +#endif + +// Direct3D11 includes +#include +#include +#include +#include + +#ifdef USE_DIRECT3D11_2 +#include +#endif + +#ifdef USE_DIRECT3D11_3 +#include +#endif + +// DirectXMath includes +#include +#include + +// WIC includes +#include + +// XInput includes +#include + +// HRESULT translation for Direct3D and other APIs +#include "dxerr.h" + +// STL includes +#include +#include +#include + +#if defined(DEBUG) || defined(_DEBUG) +#ifndef V +#define V(x) { hr = (x); if( FAILED(hr) ) { DXUTTrace( __FILE__, (DWORD)__LINE__, hr, L#x, true ); } } +#endif +#ifndef V_RETURN +#define V_RETURN(x) { hr = (x); if( FAILED(hr) ) { return DXUTTrace( __FILE__, (DWORD)__LINE__, hr, L#x, true ); } } +#endif +#else +#ifndef V +#define V(x) { hr = (x); } +#endif +#ifndef V_RETURN +#define V_RETURN(x) { hr = (x); if( FAILED(hr) ) { return hr; } } +#endif +#endif + +#ifndef SAFE_DELETE +#define SAFE_DELETE(p) { if (p) { delete (p); (p) = nullptr; } } +#endif +#ifndef SAFE_DELETE_ARRAY +#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p) = nullptr; } } +#endif +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p) = nullptr; } } +#endif + +#ifndef D3DCOLOR_ARGB +#define D3DCOLOR_ARGB(a,r,g,b) \ + ((DWORD)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff))) +#endif + +#define DXUT_VERSION 1115 + +//-------------------------------------------------------------------------------------- +// Structs +//-------------------------------------------------------------------------------------- +struct DXUTD3D11DeviceSettings +{ + UINT AdapterOrdinal; + D3D_DRIVER_TYPE DriverType; + UINT Output; + DXGI_SWAP_CHAIN_DESC sd; + UINT32 CreateFlags; + UINT32 SyncInterval; + DWORD PresentFlags; + bool AutoCreateDepthStencil; // DXUT will create the depth stencil resource and view if true + DXGI_FORMAT AutoDepthStencilFormat; + D3D_FEATURE_LEVEL DeviceFeatureLevel; +}; + +struct DXUTDeviceSettings +{ + D3D_FEATURE_LEVEL MinimumFeatureLevel; + DXUTD3D11DeviceSettings d3d11; +}; + + +//-------------------------------------------------------------------------------------- +// Error codes +//-------------------------------------------------------------------------------------- +#define DXUTERR_NODIRECT3D MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0901) +#define DXUTERR_NOCOMPATIBLEDEVICES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0902) +#define DXUTERR_MEDIANOTFOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0903) +#define DXUTERR_NONZEROREFCOUNT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0904) +#define DXUTERR_CREATINGDEVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0905) +#define DXUTERR_RESETTINGDEVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0906) +#define DXUTERR_CREATINGDEVICEOBJECTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0907) +#define DXUTERR_RESETTINGDEVICEOBJECTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0908) +#define DXUTERR_DEVICEREMOVED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x090A) + + +//-------------------------------------------------------------------------------------- +// Callback registration +//-------------------------------------------------------------------------------------- + +// General callbacks +typedef void (CALLBACK *LPDXUTCALLBACKFRAMEMOVE)( _In_ double fTime, _In_ float fElapsedTime, _In_opt_ void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKKEYBOARD)( _In_ UINT nChar, _In_ bool bKeyDown, _In_ bool bAltDown, _In_opt_ void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKMOUSE)( _In_ bool bLeftButtonDown, _In_ bool bRightButtonDown, _In_ bool bMiddleButtonDown, + _In_ bool bSideButton1Down, _In_ bool bSideButton2Down, _In_ int nMouseWheelDelta, + _In_ int xPos, _In_ int yPos, _In_opt_ void* pUserContext ); +typedef LRESULT (CALLBACK *LPDXUTCALLBACKMSGPROC)( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam, + _Out_ bool* pbNoFurtherProcessing, _In_opt_ void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKTIMER)( _In_ UINT idEvent, _In_opt_ void* pUserContext ); +typedef bool (CALLBACK *LPDXUTCALLBACKMODIFYDEVICESETTINGS)( _In_ DXUTDeviceSettings* pDeviceSettings, _In_opt_ void* pUserContext ); +typedef bool (CALLBACK *LPDXUTCALLBACKDEVICEREMOVED)( _In_opt_ void* pUserContext ); + +class CD3D11EnumAdapterInfo; +class CD3D11EnumDeviceInfo; + +// Direct3D 11 callbacks +typedef bool (CALLBACK *LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE)( _In_ const CD3D11EnumAdapterInfo *AdapterInfo, _In_ UINT Output, _In_ const CD3D11EnumDeviceInfo *DeviceInfo, + _In_ DXGI_FORMAT BackBufferFormat, _In_ bool bWindowed, _In_opt_ void* pUserContext ); +typedef HRESULT (CALLBACK *LPDXUTCALLBACKD3D11DEVICECREATED)( _In_ ID3D11Device* pd3dDevice, _In_ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, _In_opt_ void* pUserContext ); +typedef HRESULT (CALLBACK *LPDXUTCALLBACKD3D11SWAPCHAINRESIZED)( _In_ ID3D11Device* pd3dDevice, _In_ IDXGISwapChain *pSwapChain, _In_ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, _In_opt_ void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D11FRAMERENDER)( _In_ ID3D11Device* pd3dDevice, _In_ ID3D11DeviceContext* pd3dImmediateContext, _In_ double fTime, _In_ float fElapsedTime, _In_opt_ void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D11SWAPCHAINRELEASING)( _In_opt_ void* pUserContext ); +typedef void (CALLBACK *LPDXUTCALLBACKD3D11DEVICEDESTROYED)( _In_opt_ void* pUserContext ); + +// General callbacks +void WINAPI DXUTSetCallbackFrameMove( _In_ LPDXUTCALLBACKFRAMEMOVE pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackKeyboard( _In_ LPDXUTCALLBACKKEYBOARD pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackMouse( _In_ LPDXUTCALLBACKMOUSE pCallback, bool bIncludeMouseMove = false, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackMsgProc( _In_ LPDXUTCALLBACKMSGPROC pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackDeviceChanging( _In_ LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackDeviceRemoved( _In_ LPDXUTCALLBACKDEVICEREMOVED pCallback, _In_opt_ void* pUserContext = nullptr ); + +// Direct3D 11 callbacks +void WINAPI DXUTSetCallbackD3D11DeviceAcceptable( _In_ LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackD3D11DeviceCreated( _In_ LPDXUTCALLBACKD3D11DEVICECREATED pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackD3D11SwapChainResized( _In_ LPDXUTCALLBACKD3D11SWAPCHAINRESIZED pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackD3D11FrameRender( _In_ LPDXUTCALLBACKD3D11FRAMERENDER pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackD3D11SwapChainReleasing( _In_ LPDXUTCALLBACKD3D11SWAPCHAINRELEASING pCallback, _In_opt_ void* pUserContext = nullptr ); +void WINAPI DXUTSetCallbackD3D11DeviceDestroyed( _In_ LPDXUTCALLBACKD3D11DEVICEDESTROYED pCallback, _In_opt_ void* pUserContext = nullptr ); + + +//-------------------------------------------------------------------------------------- +// Initialization +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTInit( _In_ bool bParseCommandLine = true, + _In_ bool bShowMsgBoxOnError = true, + _In_opt_ WCHAR* strExtraCommandLineParams = nullptr, + _In_ bool bThreadSafeDXUT = false ); + +// Choose either DXUTCreateWindow or DXUTSetWindow. If using DXUTSetWindow, consider using DXUTStaticWndProc +HRESULT WINAPI DXUTCreateWindow( _In_z_ const WCHAR* strWindowTitle = L"Direct3D Window", + _In_opt_ HINSTANCE hInstance = nullptr, _In_opt_ HICON hIcon = nullptr, _In_opt_ HMENU hMenu = nullptr, + _In_ int x = CW_USEDEFAULT, _In_ int y = CW_USEDEFAULT ); +HRESULT WINAPI DXUTSetWindow( _In_ HWND hWndFocus, _In_ HWND hWndDeviceFullScreen, _In_ HWND hWndDeviceWindowed, _In_ bool bHandleMessages = true ); +LRESULT CALLBACK DXUTStaticWndProc( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); + +// Choose either DXUTCreateDevice or DXUTCreateD3DDeviceFromSettings + +HRESULT WINAPI DXUTCreateDevice(_In_ D3D_FEATURE_LEVEL reqFL, _In_ bool bWindowed= true, _In_ int nSuggestedWidth =0,_In_ int nSuggestedHeight =0 ); +HRESULT WINAPI DXUTCreateDeviceFromSettings( _In_ DXUTDeviceSettings* pDeviceSettings, _In_ bool bClipWindowToSingleAdapter = true ); + +// Choose either DXUTMainLoop or implement your own main loop +HRESULT WINAPI DXUTMainLoop( _In_opt_ HACCEL hAccel = nullptr ); + +// If not using DXUTMainLoop consider using DXUTRender3DEnvironment +void WINAPI DXUTRender3DEnvironment(); + + +//-------------------------------------------------------------------------------------- +// Common Tasks +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTToggleFullScreen(); +HRESULT WINAPI DXUTToggleREF(); +HRESULT WINAPI DXUTToggleWARP(); +void WINAPI DXUTPause( _In_ bool bPauseTime, _In_ bool bPauseRendering ); +void WINAPI DXUTSetConstantFrameTime( _In_ bool bConstantFrameTime, _In_ float fTimePerFrame = 0.0333f ); +void WINAPI DXUTSetCursorSettings( _In_ bool bShowCursorWhenFullScreen = false, _In_ bool bClipCursorWhenFullScreen = false ); +void WINAPI DXUTSetHotkeyHandling( _In_ bool bAltEnterToToggleFullscreen = true, _In_ bool bEscapeToQuit = true, _In_ bool bPauseToToggleTimePause = true ); +void WINAPI DXUTSetMultimonSettings( _In_ bool bAutoChangeAdapter = true ); +void WINAPI DXUTSetShortcutKeySettings( _In_ bool bAllowWhenFullscreen = false, _In_ bool bAllowWhenWindowed = true ); // Controls the Windows key, and accessibility shortcut keys +void WINAPI DXUTSetWindowSettings( _In_ bool bCallDefWindowProc = true ); +HRESULT WINAPI DXUTSetTimer( _In_ LPDXUTCALLBACKTIMER pCallbackTimer, _In_ float fTimeoutInSecs = 1.0f, _Out_opt_ UINT* pnIDEvent = nullptr, _In_opt_ void* pCallbackUserContext = nullptr ); +HRESULT WINAPI DXUTKillTimer( _In_ UINT nIDEvent ); +void WINAPI DXUTResetFrameworkState(); +void WINAPI DXUTShutdown( _In_ int nExitCode = 0 ); +void WINAPI DXUTSetIsInGammaCorrectMode( _In_ bool bGammaCorrect ); +bool WINAPI DXUTGetMSAASwapChainCreated(); + + +//-------------------------------------------------------------------------------------- +// State Retrieval +//-------------------------------------------------------------------------------------- + +// Direct3D 11.x (These do not addref unlike typical Get* APIs) +IDXGIFactory1* WINAPI DXUTGetDXGIFactory(); +IDXGISwapChain* WINAPI DXUTGetDXGISwapChain(); +const DXGI_SURFACE_DESC* WINAPI DXUTGetDXGIBackBufferSurfaceDesc(); +HRESULT WINAPI DXUTSetupD3D11Views( _In_ ID3D11DeviceContext* pd3dDeviceContext ); // Supports immediate or deferred context +D3D_FEATURE_LEVEL WINAPI DXUTGetD3D11DeviceFeatureLevel(); // Returns the D3D11 devices current feature level +ID3D11RenderTargetView* WINAPI DXUTGetD3D11RenderTargetView(); +ID3D11DepthStencilView* WINAPI DXUTGetD3D11DepthStencilView(); + +ID3D11Device* WINAPI DXUTGetD3D11Device(); +ID3D11DeviceContext* WINAPI DXUTGetD3D11DeviceContext(); + +ID3D11Device1* WINAPI DXUTGetD3D11Device1(); +ID3D11DeviceContext1* WINAPI DXUTGetD3D11DeviceContext1(); + +#ifdef USE_DIRECT3D11_2 +ID3D11Device2* WINAPI DXUTGetD3D11Device2(); +ID3D11DeviceContext2* WINAPI DXUTGetD3D11DeviceContext2(); +#endif + +#ifdef USE_DIRECT3D11_3 +ID3D11Device3* WINAPI DXUTGetD3D11Device3(); +ID3D11DeviceContext3* WINAPI DXUTGetD3D11DeviceContext3(); +#endif + +// General +DXUTDeviceSettings WINAPI DXUTGetDeviceSettings(); +HINSTANCE WINAPI DXUTGetHINSTANCE(); +HWND WINAPI DXUTGetHWND(); +HWND WINAPI DXUTGetHWNDFocus(); +HWND WINAPI DXUTGetHWNDDeviceFullScreen(); +HWND WINAPI DXUTGetHWNDDeviceWindowed(); +RECT WINAPI DXUTGetWindowClientRect(); +LONG WINAPI DXUTGetWindowWidth(); +LONG WINAPI DXUTGetWindowHeight(); +RECT WINAPI DXUTGetWindowClientRectAtModeChange(); // Useful for returning to windowed mode with the same resolution as before toggle to full screen mode +RECT WINAPI DXUTGetFullsceenClientRectAtModeChange(); // Useful for returning to full screen mode with the same resolution as before toggle to windowed mode +double WINAPI DXUTGetTime(); +float WINAPI DXUTGetElapsedTime(); +bool WINAPI DXUTIsWindowed(); +bool WINAPI DXUTIsInGammaCorrectMode(); +float WINAPI DXUTGetFPS(); +LPCWSTR WINAPI DXUTGetWindowTitle(); +LPCWSTR WINAPI DXUTGetFrameStats( _In_ bool bIncludeFPS = false ); +LPCWSTR WINAPI DXUTGetDeviceStats(); + +bool WINAPI DXUTIsVsyncEnabled(); +bool WINAPI DXUTIsRenderingPaused(); +bool WINAPI DXUTIsTimePaused(); +bool WINAPI DXUTIsActive(); +int WINAPI DXUTGetExitCode(); +bool WINAPI DXUTGetShowMsgBoxOnError(); +bool WINAPI DXUTGetAutomation(); // Returns true if -automation parameter is used to launch the app +bool WINAPI DXUTIsKeyDown( _In_ BYTE vKey ); // Pass a virtual-key code, ex. VK_F1, 'A', VK_RETURN, VK_LSHIFT, etc +bool WINAPI DXUTWasKeyPressed( _In_ BYTE vKey ); // Like DXUTIsKeyDown() but return true only if the key was just pressed +bool WINAPI DXUTIsMouseButtonDown( _In_ BYTE vButton ); // Pass a virtual-key code: VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_XBUTTON1, VK_XBUTTON2 +HRESULT WINAPI DXUTCreateState(); // Optional method to create DXUT's memory. If its not called by the application it will be automatically called when needed +void WINAPI DXUTDestroyState(); // Optional method to destroy DXUT's memory. If its not called by the application it will be automatically called after the application exits WinMain + +//-------------------------------------------------------------------------------------- +// DXUT core layer includes +//-------------------------------------------------------------------------------------- +#include "DXUTmisc.h" +#include "DXUTDevice11.h" diff --git a/DXUT11/Core/DXUTDevice11.cpp b/DXUT11/Core/DXUTDevice11.cpp new file mode 100644 index 0000000..bc2fe7b --- /dev/null +++ b/DXUT11/Core/DXUTDevice11.cpp @@ -0,0 +1,1276 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTDevice11.cpp +// +// Enumerates D3D adapters, devices, modes, etc. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "DXUT.h" + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +extern void DXUTGetCallbackD3D11DeviceAcceptable( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE* ppCallbackIsDeviceAcceptable, void** ppUserContext ); + +static int __cdecl SortModesCallback( const void* arg1, const void* arg2 ); + +CD3D11Enumeration* g_pDXUTD3D11Enumeration = nullptr; + +HRESULT WINAPI DXUTCreateD3D11Enumeration() +{ + if( !g_pDXUTD3D11Enumeration ) + { + g_pDXUTD3D11Enumeration = new (std::nothrow) CD3D11Enumeration(); + if( !g_pDXUTD3D11Enumeration ) + return E_OUTOFMEMORY; + } + return S_OK; +} + +void WINAPI DXUTDestroyD3D11Enumeration() +{ + SAFE_DELETE( g_pDXUTD3D11Enumeration ); +} + +class DXUTMemoryHelperD3D11Enum +{ +public: +DXUTMemoryHelperD3D11Enum() { DXUTCreateD3D11Enumeration(); } +~DXUTMemoryHelperD3D11Enum() { DXUTDestroyD3D11Enumeration(); } +}; + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +CD3D11Enumeration* WINAPI DXUTGetD3D11Enumeration( bool bForceEnumerate, bool bEnumerateAllAdapterFormats, D3D_FEATURE_LEVEL forceFL ) +{ + // Using an static class with accessor function to allow control of the construction order + static DXUTMemoryHelperD3D11Enum d3d11enumMemory; + if( g_pDXUTD3D11Enumeration && ( !g_pDXUTD3D11Enumeration->HasEnumerated() || bForceEnumerate ) ) + { + g_pDXUTD3D11Enumeration->SetEnumerateAllAdapterFormats( bEnumerateAllAdapterFormats ); + LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE pCallbackIsDeviceAcceptable; + void* pUserContext; + DXUTGetCallbackD3D11DeviceAcceptable( &pCallbackIsDeviceAcceptable, &pUserContext ); + g_pDXUTD3D11Enumeration->SetForceFeatureLevel(forceFL); + + g_pDXUTD3D11Enumeration->Enumerate( pCallbackIsDeviceAcceptable, pUserContext ); + } + + return g_pDXUTD3D11Enumeration; +} + + +//-------------------------------------------------------------------------------------- +CD3D11Enumeration::CD3D11Enumeration() : + m_bHasEnumerated(false), + m_IsD3D11DeviceAcceptableFunc(nullptr), + m_pIsD3D11DeviceAcceptableFuncUserContext(nullptr), + m_bEnumerateAllAdapterFormats(false), + m_forceFL(D3D_FEATURE_LEVEL(0)), + m_warpFL(D3D_FEATURE_LEVEL_10_1), + m_refFL(D3D_FEATURE_LEVEL_11_0) +{ + ResetPossibleDepthStencilFormats(); +} + + +//-------------------------------------------------------------------------------------- +CD3D11Enumeration::~CD3D11Enumeration() +{ + ClearAdapterInfoList(); +} + + +//-------------------------------------------------------------------------------------- +// Enumerate for each adapter all of the supported display modes, +// device types, adapter formats, back buffer formats, window/full screen support, +// depth stencil formats, multisampling types/qualities, and presentations intervals. +// +// For each combination of device type (HAL/REF), adapter format, back buffer format, and +// IsWindowed it will call the app's ConfirmDevice callback. This allows the app +// to reject or allow that combination based on its caps/etc. It also allows the +// app to change the BehaviorFlags. The BehaviorFlags defaults non-pure HWVP +// if supported otherwise it will default to SWVP, however the app can change this +// through the ConfirmDevice callback. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CD3D11Enumeration::Enumerate( LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE IsD3D11DeviceAcceptableFunc, + void* pIsD3D11DeviceAcceptableFuncUserContext ) +{ + CDXUTPerfEventGenerator eventGenerator( DXUT_PERFEVENTCOLOR, L"DXUT D3D11 Enumeration" ); + HRESULT hr; + auto pFactory = DXUTGetDXGIFactory(); + if( !pFactory ) + return E_FAIL; + + m_bHasEnumerated = true; + m_IsD3D11DeviceAcceptableFunc = IsD3D11DeviceAcceptableFunc; + m_pIsD3D11DeviceAcceptableFuncUserContext = pIsD3D11DeviceAcceptableFuncUserContext; + + ClearAdapterInfoList(); + + for( int index = 0; ; ++index ) + { + IDXGIAdapter* pAdapter = nullptr; + hr = pFactory->EnumAdapters( index, &pAdapter ); + if( FAILED( hr ) ) // DXGIERR_NOT_FOUND is expected when the end of the list is hit + break; + + IDXGIAdapter2* pAdapter2 = nullptr; + if ( SUCCEEDED( pAdapter->QueryInterface( __uuidof(IDXGIAdapter2), ( LPVOID* )&pAdapter2 ) ) ) + { + // Succeeds on DirectX 11.1 Runtime systems + DXGI_ADAPTER_DESC2 desc; + hr = pAdapter2->GetDesc2( &desc ); + pAdapter2->Release(); + + if ( SUCCEEDED(hr) && ( desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE ) ) + { + // Skip "always there" Microsoft Basics Display Driver + pAdapter->Release(); + continue; + } + } + + auto pAdapterInfo = new (std::nothrow) CD3D11EnumAdapterInfo; + if( !pAdapterInfo ) + { + SAFE_RELEASE( pAdapter ); + return E_OUTOFMEMORY; + } + pAdapterInfo->AdapterOrdinal = index; + pAdapter->GetDesc( &pAdapterInfo->AdapterDesc ); + pAdapterInfo->m_pAdapter = pAdapter; + + // Enumerate the device driver types on the adapter. + hr = EnumerateDevices( pAdapterInfo ); + if( FAILED( hr ) ) + { + delete pAdapterInfo; + continue; + } + + hr = EnumerateOutputs( pAdapterInfo ); + if( FAILED( hr ) || pAdapterInfo->outputInfoList.empty() ) + { + delete pAdapterInfo; + continue; + } + + // Get info for each devicecombo on this device + if( FAILED( hr = EnumerateDeviceCombos( pAdapterInfo ) ) ) + { + delete pAdapterInfo; + continue; + } + + m_AdapterInfoList.push_back( pAdapterInfo ); + } + + // If we did not get an adapter then we should still enumerate WARP and Ref. + if (m_AdapterInfoList.size() == 0) + { + auto pAdapterInfo = new (std::nothrow) CD3D11EnumAdapterInfo; + if( !pAdapterInfo ) + { + return E_OUTOFMEMORY; + } + pAdapterInfo->bAdapterUnavailable = true; + + hr = EnumerateDevices( pAdapterInfo ); + + // Get info for each devicecombo on this device + if( FAILED( hr = EnumerateDeviceCombosNoAdapter( pAdapterInfo ) ) ) + { + delete pAdapterInfo; + } + + if (SUCCEEDED(hr)) m_AdapterInfoList.push_back( pAdapterInfo ); + } + + // + // Check for 2 or more adapters with the same name. Append the name + // with some instance number if that's the case to help distinguish + // them. + // + bool bUniqueDesc = true; + for( size_t i = 0; i < m_AdapterInfoList.size(); i++ ) + { + auto pAdapterInfo1 = m_AdapterInfoList[ i ]; + + for( size_t j = i + 1; j < m_AdapterInfoList.size(); j++ ) + { + auto pAdapterInfo2 = m_AdapterInfoList[ j ]; + if( wcsncmp( pAdapterInfo1->AdapterDesc.Description, + pAdapterInfo2->AdapterDesc.Description, DXGI_MAX_DEVICE_IDENTIFIER_STRING ) == 0 ) + { + bUniqueDesc = false; + break; + } + } + + if( !bUniqueDesc ) + break; + } + + for( auto it = m_AdapterInfoList.begin(); it != m_AdapterInfoList.end(); ++it ) + { + wcscpy_s((*it)->szUniqueDescription, DXGI_MAX_DEVICE_IDENTIFIER_STRING, (*it)->AdapterDesc.Description); + if( !bUniqueDesc ) + { + WCHAR sz[32]; + swprintf_s( sz, 32, L" (#%u)", (*it)->AdapterOrdinal ); + wcscat_s( (*it)->szUniqueDescription, DXGI_MAX_DEVICE_IDENTIFIER_STRING, sz ); + } + } + + // Check WARP max feature level + { + static const D3D_FEATURE_LEVEL fLvlWarp[] = + { +#ifdef USE_DIRECT3D11_3 + D3D_FEATURE_LEVEL_12_1, D3D_FEATURE_LEVEL_12_0, +#endif + D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1 + }; + + ID3D11Device* pDevice = nullptr; + hr = DXUT_Dynamic_D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_WARP, 0, 0, fLvlWarp, _countof(fLvlWarp), + D3D11_SDK_VERSION, &pDevice, &m_warpFL, nullptr ); + if ( hr == E_INVALIDARG ) + { +#ifdef USE_DIRECT3D11_3 + // DirectX 11.1 runtime will not recognize FL 12.x, so try without it + hr = DXUT_Dynamic_D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_WARP, 0, 0, &fLvlWarp[2], _countof(fLvlWarp) - 2, + D3D11_SDK_VERSION, &pDevice, &m_warpFL, nullptr); + if (hr == E_INVALIDARG) + { + // DirectX 11.0 runtime will not recognize FL 11.1+, so try without it + hr = DXUT_Dynamic_D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_WARP, 0, 0, &fLvlWarp[3], _countof(fLvlWarp) - 3, + D3D11_SDK_VERSION, &pDevice, &m_warpFL, nullptr); + } +#else + // DirectX 11.0 runtime will not recognize FL 11.1, so try without it + hr = DXUT_Dynamic_D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_WARP, 0, 0, &fLvlWarp[1], _countof(fLvlWarp) - 1, + D3D11_SDK_VERSION, &pDevice, &m_warpFL, nullptr ); +#endif + } + + if ( SUCCEEDED(hr) ) + { + pDevice->Release(); + } + else + m_warpFL = D3D_FEATURE_LEVEL_10_1; + } + + // Check REF max feature level + { + static const D3D_FEATURE_LEVEL fLvlRef[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1 }; + + ID3D11Device* pDevice = nullptr; + hr = DXUT_Dynamic_D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_REFERENCE, 0, 0, fLvlRef, _countof(fLvlRef), + D3D11_SDK_VERSION, &pDevice, &m_refFL, nullptr ); + if ( hr == E_INVALIDARG ) + { + // DirectX 11.0 runtime will not recognize FL 11.1, so try without it + hr = DXUT_Dynamic_D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_REFERENCE, 0, 0, &fLvlRef[1], _countof(fLvlRef) - 1, + D3D11_SDK_VERSION, &pDevice, &m_refFL, nullptr ); + } + + if ( SUCCEEDED(hr) ) + { + pDevice->Release(); + } + else + m_refFL = D3D_FEATURE_LEVEL_11_0; + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3D11Enumeration::EnumerateOutputs( _In_ CD3D11EnumAdapterInfo* pAdapterInfo ) +{ + HRESULT hr; + IDXGIOutput* pOutput; + + for( int iOutput = 0; ; ++iOutput ) + { + pOutput = nullptr; + hr = pAdapterInfo->m_pAdapter->EnumOutputs( iOutput, &pOutput ); + if( DXGI_ERROR_NOT_FOUND == hr ) + { + return S_OK; + } + else if( FAILED( hr ) ) + { + return hr; //Something bad happened. + } + else //Success! + { + auto pOutputInfo = new (std::nothrow) CD3D11EnumOutputInfo; + if( !pOutputInfo ) + { + SAFE_RELEASE( pOutput ); + return E_OUTOFMEMORY; + } + pOutputInfo->Output = iOutput; + pOutputInfo->m_pOutput = pOutput; + pOutput->GetDesc( &pOutputInfo->Desc ); + + EnumerateDisplayModes( pOutputInfo ); + if( pOutputInfo->displayModeList.empty() ) + { + // If this output has no valid display mode, do not save it. + delete pOutputInfo; + continue; + } + + pAdapterInfo->outputInfoList.push_back( pOutputInfo ); + } + } +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3D11Enumeration::EnumerateDisplayModes( _In_ CD3D11EnumOutputInfo* pOutputInfo ) +{ + HRESULT hr = S_OK; + DXGI_FORMAT allowedAdapterFormatArray[] = + { + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, //This is DXUT's preferred mode + + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_FORMAT_R16G16B16A16_FLOAT, + DXGI_FORMAT_R10G10B10A2_UNORM + }; + int allowedAdapterFormatArrayCount = sizeof( allowedAdapterFormatArray ) / sizeof( allowedAdapterFormatArray[0] ); + + // Swap perferred modes for apps running in linear space + DXGI_FORMAT RemoteMode = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + if( !DXUTIsInGammaCorrectMode() ) + { + allowedAdapterFormatArray[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + allowedAdapterFormatArray[1] = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + RemoteMode = DXGI_FORMAT_R8G8B8A8_UNORM; + } + + // The fast path only enumerates R8G8B8A8_UNORM_SRGB modes + if( !m_bEnumerateAllAdapterFormats ) + allowedAdapterFormatArrayCount = 1; + + for( int f = 0; f < allowedAdapterFormatArrayCount; ++f ) + { + // Fast-path: Try to grab at least 512 modes. + // This is to avoid calling GetDisplayModeList more times than necessary. + // GetDisplayModeList is an expensive call. + UINT NumModes = 512; + auto pDesc = new (std::nothrow) DXGI_MODE_DESC[ NumModes ]; + assert( pDesc ); + if( !pDesc ) + return E_OUTOFMEMORY; + + hr = pOutputInfo->m_pOutput->GetDisplayModeList( allowedAdapterFormatArray[f], + DXGI_ENUM_MODES_SCALING, + &NumModes, + pDesc ); + if( DXGI_ERROR_NOT_FOUND == hr ) + { + SAFE_DELETE_ARRAY( pDesc ); + NumModes = 0; + break; + } + else if( MAKE_DXGI_HRESULT( 34 ) == hr && RemoteMode == allowedAdapterFormatArray[f] ) + { + // DXGI cannot enumerate display modes over a remote session. Therefore, create a fake display + // mode for the current screen resolution for the remote session. + if( 0 != GetSystemMetrics( 0x1000 ) ) // SM_REMOTESESSION + { + DEVMODE DevMode; + DevMode.dmSize = sizeof( DEVMODE ); + if( EnumDisplaySettings( nullptr, ENUM_CURRENT_SETTINGS, &DevMode ) ) + { + NumModes = 1; + pDesc[0].Width = DevMode.dmPelsWidth; + pDesc[0].Height = DevMode.dmPelsHeight; + pDesc[0].Format = DXGI_FORMAT_R8G8B8A8_UNORM; + pDesc[0].RefreshRate.Numerator = 0; + pDesc[0].RefreshRate.Denominator = 0; + pDesc[0].ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE; + pDesc[0].Scaling = DXGI_MODE_SCALING_CENTERED; + hr = S_OK; + } + } + } + else if( DXGI_ERROR_MORE_DATA == hr ) + { + // Slow path. There were more than 512 modes. + SAFE_DELETE_ARRAY( pDesc ); + hr = pOutputInfo->m_pOutput->GetDisplayModeList( allowedAdapterFormatArray[f], + DXGI_ENUM_MODES_SCALING, + &NumModes, + nullptr ); + if( FAILED( hr ) ) + { + NumModes = 0; + break; + } + + pDesc = new (std::nothrow) DXGI_MODE_DESC[ NumModes ]; + assert( pDesc ); + if( !pDesc ) + return E_OUTOFMEMORY; + + hr = pOutputInfo->m_pOutput->GetDisplayModeList( allowedAdapterFormatArray[f], + DXGI_ENUM_MODES_SCALING, + &NumModes, + pDesc ); + if( FAILED( hr ) ) + { + SAFE_DELETE_ARRAY( pDesc ); + NumModes = 0; + break; + } + + } + + if( 0 == NumModes && 0 == f ) + { + // No R8G8B8A8_UNORM_SRGB modes! + // Abort the fast-path if we're on it + allowedAdapterFormatArrayCount = sizeof( allowedAdapterFormatArray ) / sizeof + ( allowedAdapterFormatArray[0] ); + SAFE_DELETE_ARRAY( pDesc ); + continue; + } + + if( SUCCEEDED( hr ) ) + { + for( UINT m = 0; m < NumModes; m++ ) + { +#pragma warning ( suppress : 6385 ) + pOutputInfo->displayModeList.push_back( pDesc[m] ); + } + } + + SAFE_DELETE_ARRAY( pDesc ); + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CD3D11Enumeration::EnumerateDevices( _In_ CD3D11EnumAdapterInfo* pAdapterInfo ) +{ + HRESULT hr; + auto deviceSettings = DXUTGetDeviceSettings(); + const D3D_DRIVER_TYPE devTypeArray[] = + { + D3D_DRIVER_TYPE_HARDWARE, + D3D_DRIVER_TYPE_WARP, + D3D_DRIVER_TYPE_REFERENCE + }; + const UINT devTypeArrayCount = sizeof( devTypeArray ) / sizeof( devTypeArray[0] ); + + // Enumerate each Direct3D device type + for( UINT iDeviceType = 0; iDeviceType < devTypeArrayCount; iDeviceType++ ) + { + auto pDeviceInfo = new (std::nothrow) CD3D11EnumDeviceInfo; + if( !pDeviceInfo ) + return E_OUTOFMEMORY; + + // Fill struct w/ AdapterOrdinal and D3D_DRIVER_TYPE + pDeviceInfo->AdapterOrdinal = pAdapterInfo->AdapterOrdinal; + pDeviceInfo->DeviceType = devTypeArray[iDeviceType]; + + static const D3D_FEATURE_LEVEL FeatureLevels[] = + { +#ifdef USE_DIRECT3D11_3 + D3D_FEATURE_LEVEL_12_1, + D3D_FEATURE_LEVEL_12_0, +#endif + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, + D3D_FEATURE_LEVEL_9_2, + D3D_FEATURE_LEVEL_9_1 + }; + UINT NumFeatureLevels = ARRAYSIZE( FeatureLevels ); + + // Call D3D11CreateDevice to ensure that this is a D3D11 device. + ID3D11Device* pd3dDevice = nullptr; + ID3D11DeviceContext* pd3dDeviceContext = nullptr; + hr = DXUT_Dynamic_D3D11CreateDevice( (devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? pAdapterInfo->m_pAdapter : nullptr, + (devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? D3D_DRIVER_TYPE_UNKNOWN : devTypeArray[iDeviceType], + ( HMODULE )0, + 0, + FeatureLevels, + NumFeatureLevels, + D3D11_SDK_VERSION, + &pd3dDevice, + &pDeviceInfo->MaxLevel, + &pd3dDeviceContext ); + + if ( hr == E_INVALIDARG ) + { +#ifdef USE_DIRECT3D11_3 + // DirectX 11.1 runtime will not recognize FL 12.x, so try without it + hr = DXUT_Dynamic_D3D11CreateDevice((devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? pAdapterInfo->m_pAdapter : nullptr, + (devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? D3D_DRIVER_TYPE_UNKNOWN : devTypeArray[iDeviceType], + (HMODULE)0, 0, + &FeatureLevels[2], NumFeatureLevels - 2, + D3D11_SDK_VERSION, &pd3dDevice, &pDeviceInfo->MaxLevel, + &pd3dDeviceContext); + + if (hr == E_INVALIDARG) + { + // DirectX 11.0 runtime will not recognize FL 11.1, so try without it + hr = DXUT_Dynamic_D3D11CreateDevice((devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? pAdapterInfo->m_pAdapter : nullptr, + (devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? D3D_DRIVER_TYPE_UNKNOWN : devTypeArray[iDeviceType], + (HMODULE)0, 0, + &FeatureLevels[3], NumFeatureLevels - 3, + D3D11_SDK_VERSION, &pd3dDevice, &pDeviceInfo->MaxLevel, + &pd3dDeviceContext); + } +#else + // DirectX 11.0 runtime will not recognize FL 11.1, so try without it + hr = DXUT_Dynamic_D3D11CreateDevice( (devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? pAdapterInfo->m_pAdapter : nullptr, + (devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? D3D_DRIVER_TYPE_UNKNOWN : devTypeArray[iDeviceType], + ( HMODULE )0, 0, + &FeatureLevels[1], NumFeatureLevels - 1, + D3D11_SDK_VERSION, &pd3dDevice, &pDeviceInfo->MaxLevel, + &pd3dDeviceContext ); +#endif + } + + if ( FAILED(hr) ) + { + delete pDeviceInfo; + continue; + } + else if ( pDeviceInfo->MaxLevel < deviceSettings.MinimumFeatureLevel ) + { + delete pDeviceInfo; + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE( pd3dDeviceContext ); + continue; + } + + if (m_forceFL == 0 || m_forceFL == pDeviceInfo->MaxLevel) + { + pDeviceInfo->SelectedLevel = pDeviceInfo->MaxLevel; + } + else if (m_forceFL > pDeviceInfo->MaxLevel) + { + delete pDeviceInfo; + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE( pd3dDeviceContext ); + continue; + } + else + { + // A device was created with a higher feature level that the user-specified feature level. + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE( pd3dDeviceContext ); + D3D_FEATURE_LEVEL rtFL; + hr = DXUT_Dynamic_D3D11CreateDevice( (devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? pAdapterInfo->m_pAdapter : nullptr, + (devTypeArray[iDeviceType] == D3D_DRIVER_TYPE_HARDWARE) ? D3D_DRIVER_TYPE_UNKNOWN : devTypeArray[iDeviceType], + ( HMODULE )0, + 0, + &m_forceFL, + 1, + D3D11_SDK_VERSION, + &pd3dDevice, + &rtFL, + &pd3dDeviceContext ); + + if( SUCCEEDED( hr ) && rtFL == m_forceFL ) + { + pDeviceInfo->SelectedLevel = m_forceFL; + } + else + { + delete pDeviceInfo; + if ( SUCCEEDED(hr) ) + { + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE( pd3dDeviceContext ); + } + continue; + } + } + + D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS ho; + hr = pd3dDevice->CheckFeatureSupport(D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &ho, sizeof(ho)); + if ( FAILED(hr) ) + memset( &ho, 0, sizeof(ho) ); + + pDeviceInfo->ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x = ho.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x; + SAFE_RELEASE( pd3dDeviceContext ); + SAFE_RELEASE( pd3dDevice ); + pAdapterInfo->deviceInfoList.push_back( pDeviceInfo ); + } + + return S_OK; +} + + +HRESULT CD3D11Enumeration::EnumerateDeviceCombosNoAdapter( _In_ CD3D11EnumAdapterInfo* pAdapterInfo ) +{ + // Iterate through each combination of device driver type, output, + // adapter format, and backbuffer format to build the adapter's device combo list. + // + + for( auto dit = pAdapterInfo->deviceInfoList.cbegin(); dit != pAdapterInfo->deviceInfoList.cend(); ++dit ) + { + DXGI_FORMAT BufferFormatArray[] = + { + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, //This is DXUT's preferred mode + + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_FORMAT_R16G16B16A16_FLOAT, + DXGI_FORMAT_R10G10B10A2_UNORM + }; + + // Swap perferred modes for apps running in linear space + if( !DXUTIsInGammaCorrectMode() ) + { + BufferFormatArray[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + BufferFormatArray[1] = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + } + + for( UINT iBufferFormat = 0; iBufferFormat < _countof( BufferFormatArray ); iBufferFormat++ ) + { + DXGI_FORMAT BufferFormat = BufferFormatArray[iBufferFormat]; + + // determine if there are any modes for this particular format + + // If an application callback function has been provided, make sure this device + // is acceptable to the app. + if( m_IsD3D11DeviceAcceptableFunc ) + { + if( !m_IsD3D11DeviceAcceptableFunc( pAdapterInfo, + 0, + *dit, + BufferFormat, + TRUE, + m_pIsD3D11DeviceAcceptableFuncUserContext ) ) + continue; + } + + // At this point, we have an adapter/device/backbufferformat/iswindowed + // DeviceCombo that is supported by the system. We still + // need to find one or more suitable depth/stencil buffer format, + // multisample type, and present interval. + CD3D11EnumDeviceSettingsCombo* pDeviceCombo = new (std::nothrow) CD3D11EnumDeviceSettingsCombo; + if( !pDeviceCombo ) + return E_OUTOFMEMORY; + + pDeviceCombo->AdapterOrdinal = (*dit)->AdapterOrdinal; + pDeviceCombo->DeviceType = (*dit)->DeviceType; + pDeviceCombo->BackBufferFormat = BufferFormat; + pDeviceCombo->Windowed = TRUE; + pDeviceCombo->Output = 0; + pDeviceCombo->pAdapterInfo = pAdapterInfo; + pDeviceCombo->pDeviceInfo = (*dit); + pDeviceCombo->pOutputInfo = nullptr; + + BuildMultiSampleQualityList( BufferFormat, pDeviceCombo ); + + pAdapterInfo->deviceSettingsComboList.push_back( pDeviceCombo ); + } + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CD3D11Enumeration::EnumerateDeviceCombos( CD3D11EnumAdapterInfo* pAdapterInfo ) +{ + // Iterate through each combination of device driver type, output, + // adapter format, and backbuffer format to build the adapter's device combo list. + // + for( size_t output = 0; output < pAdapterInfo->outputInfoList.size(); ++output ) + { + auto pOutputInfo = pAdapterInfo->outputInfoList[ output ]; + + for( size_t device = 0; device < pAdapterInfo->deviceInfoList.size(); ++device ) + { + auto pDeviceInfo = pAdapterInfo->deviceInfoList[ device ]; + + DXGI_FORMAT backBufferFormatArray[] = + { + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, //This is DXUT's preferred mode + + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_FORMAT_R16G16B16A16_FLOAT, + DXGI_FORMAT_R10G10B10A2_UNORM + }; + + // Swap perferred modes for apps running in linear space + if( !DXUTIsInGammaCorrectMode() ) + { + backBufferFormatArray[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + backBufferFormatArray[1] = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + } + + for( UINT iBackBufferFormat = 0; iBackBufferFormat < _countof( backBufferFormatArray ); iBackBufferFormat++ ) + { + DXGI_FORMAT backBufferFormat = backBufferFormatArray[iBackBufferFormat]; + + for( int nWindowed = 0; nWindowed < 2; nWindowed++ ) + { + if( !nWindowed && pOutputInfo->displayModeList.size() == 0 ) + continue; + + // determine if there are any modes for this particular format + size_t iModes = 0; + for( size_t i = 0; i < pOutputInfo->displayModeList.size(); i++ ) + { + if( backBufferFormat == pOutputInfo->displayModeList[ i ].Format ) + ++iModes; + } + if( !iModes ) + continue; + + // If an application callback function has been provided, make sure this device + // is acceptable to the app. + if( m_IsD3D11DeviceAcceptableFunc ) + { + if( !m_IsD3D11DeviceAcceptableFunc( pAdapterInfo, static_cast( output ), + pDeviceInfo, backBufferFormat, + FALSE != nWindowed, + m_pIsD3D11DeviceAcceptableFuncUserContext ) ) + continue; + } + + // At this point, we have an adapter/device/backbufferformat/iswindowed + // DeviceCombo that is supported by the system. We still + // need to find one or more suitable depth/stencil buffer format, + // multisample type, and present interval. + auto pDeviceCombo = new (std::nothrow) CD3D11EnumDeviceSettingsCombo; + if( !pDeviceCombo ) + return E_OUTOFMEMORY; + + pDeviceCombo->AdapterOrdinal = pDeviceInfo->AdapterOrdinal; + pDeviceCombo->DeviceType = pDeviceInfo->DeviceType; + pDeviceCombo->BackBufferFormat = backBufferFormat; + pDeviceCombo->Windowed = ( nWindowed != 0 ); + pDeviceCombo->Output = pOutputInfo->Output; + pDeviceCombo->pAdapterInfo = pAdapterInfo; + pDeviceCombo->pDeviceInfo = pDeviceInfo; + pDeviceCombo->pOutputInfo = pOutputInfo; + + BuildMultiSampleQualityList( backBufferFormat, pDeviceCombo ); + + pAdapterInfo->deviceSettingsComboList.push_back( pDeviceCombo ); + } + } + } + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Release all the allocated CD3D11EnumAdapterInfo objects and empty the list +//-------------------------------------------------------------------------------------- +void CD3D11Enumeration::ClearAdapterInfoList() +{ + for( auto it = m_AdapterInfoList.begin(); it != m_AdapterInfoList.end(); ++it ) + { + auto pAdapterInfo = *it; + delete pAdapterInfo; + } + m_AdapterInfoList.clear(); +} + + +//-------------------------------------------------------------------------------------- +void CD3D11Enumeration::ResetPossibleDepthStencilFormats() +{ + m_DepthStencilPossibleList.clear(); + m_DepthStencilPossibleList.push_back( DXGI_FORMAT_D32_FLOAT_S8X24_UINT ); + m_DepthStencilPossibleList.push_back( DXGI_FORMAT_D32_FLOAT ); + m_DepthStencilPossibleList.push_back( DXGI_FORMAT_D24_UNORM_S8_UINT ); + m_DepthStencilPossibleList.push_back( DXGI_FORMAT_D16_UNORM ); +} + + +//-------------------------------------------------------------------------------------- +void CD3D11Enumeration::SetEnumerateAllAdapterFormats( _In_ bool bEnumerateAllAdapterFormats ) +{ + m_bEnumerateAllAdapterFormats = bEnumerateAllAdapterFormats; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CD3D11Enumeration::BuildMultiSampleQualityList( DXGI_FORMAT fmt, CD3D11EnumDeviceSettingsCombo* pDeviceCombo ) +{ + ID3D11Device* pd3dDevice = nullptr; + ID3D11DeviceContext* pd3dDeviceContext = nullptr; + IDXGIAdapter* pAdapter = nullptr; + + D3D_FEATURE_LEVEL *FeatureLevels = &(pDeviceCombo->pDeviceInfo->SelectedLevel); + D3D_FEATURE_LEVEL returnedFeatureLevel; + + UINT NumFeatureLevels = 1; + + HRESULT hr = DXUT_Dynamic_D3D11CreateDevice( pAdapter, + pDeviceCombo->DeviceType, + ( HMODULE )0, + 0, + FeatureLevels, + NumFeatureLevels, + D3D11_SDK_VERSION, + &pd3dDevice, + &returnedFeatureLevel, + &pd3dDeviceContext ) ; + + if( FAILED( hr)) return; + + if (returnedFeatureLevel != pDeviceCombo->pDeviceInfo->SelectedLevel) return; + + for( int i = 1; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; ++i ) + { + UINT Quality; + if( SUCCEEDED( pd3dDevice->CheckMultisampleQualityLevels( fmt, i, &Quality ) ) && Quality > 0 ) + { + //From D3D10 docs: When multisampling a texture, the number of quality levels available for an adapter is dependent on the texture + //format used and the number of samples requested. The maximum sample count is defined by + //D3D10_MAX_MULTISAMPLE_SAMPLE_COUNT in d3d10.h. If the returned value of pNumQualityLevels is 0, + //the format and sample count combination is not supported for the installed adapter. + + if (Quality != 0) { + pDeviceCombo->multiSampleCountList.push_back( i ); + pDeviceCombo->multiSampleQualityList.push_back( Quality ); + } + } + } + + SAFE_RELEASE( pAdapter ); + SAFE_RELEASE( pd3dDevice ); + SAFE_RELEASE (pd3dDeviceContext); +} + + +//-------------------------------------------------------------------------------------- +// Call GetAdapterInfoList() after Enumerate() to get a STL vector of +// CD3D11EnumAdapterInfo* +//-------------------------------------------------------------------------------------- +std::vector * CD3D11Enumeration::GetAdapterInfoList() +{ + return &m_AdapterInfoList; +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumAdapterInfo* CD3D11Enumeration::GetAdapterInfo( _In_ UINT AdapterOrdinal ) const +{ + for( auto it = m_AdapterInfoList.cbegin(); it != m_AdapterInfoList.cend(); ++it ) + { + if( (*it)->AdapterOrdinal == AdapterOrdinal ) + return *it; + } + + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +CD3D11EnumDeviceInfo* CD3D11Enumeration::GetDeviceInfo( UINT AdapterOrdinal, D3D_DRIVER_TYPE DeviceType ) const +{ + auto pAdapterInfo = GetAdapterInfo( AdapterOrdinal ); + if( pAdapterInfo ) + { + for( auto it = pAdapterInfo->deviceInfoList.cbegin(); it != pAdapterInfo->deviceInfoList.cend(); ++it ) + { + if( (*it)->DeviceType == DeviceType ) + return *it; + } + } + + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +CD3D11EnumOutputInfo* CD3D11Enumeration::GetOutputInfo( UINT AdapterOrdinal, UINT Output ) const +{ + auto pAdapterInfo = GetAdapterInfo( AdapterOrdinal ); + if( pAdapterInfo && pAdapterInfo->outputInfoList.size() > size_t( Output ) ) + { + return pAdapterInfo->outputInfoList[ Output ]; + } + + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +CD3D11EnumDeviceSettingsCombo* CD3D11Enumeration::GetDeviceSettingsCombo( UINT AdapterOrdinal, + DXGI_FORMAT BackBufferFormat, BOOL Windowed ) const +{ + auto pAdapterInfo = GetAdapterInfo( AdapterOrdinal ); + if( pAdapterInfo ) + { + for( size_t iDeviceCombo = 0; iDeviceCombo < pAdapterInfo->deviceSettingsComboList.size(); iDeviceCombo++ ) + { + auto pDeviceSettingsCombo = pAdapterInfo->deviceSettingsComboList[ iDeviceCombo ]; + if( pDeviceSettingsCombo->BackBufferFormat == BackBufferFormat && + pDeviceSettingsCombo->Windowed == Windowed ) + return pDeviceSettingsCombo; + } + } + + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumOutputInfo::~CD3D11EnumOutputInfo() +{ + SAFE_RELEASE( m_pOutput ); + displayModeList.clear(); +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumDeviceInfo::~CD3D11EnumDeviceInfo() +{ +} + + +//-------------------------------------------------------------------------------------- +CD3D11EnumAdapterInfo::~CD3D11EnumAdapterInfo() +{ + for( size_t j = 0; j < outputInfoList.size(); ++j ) + { + auto pOutputInfo = outputInfoList[ j ]; + delete pOutputInfo; + } + outputInfoList.clear(); + + for( size_t j = 0; j < deviceInfoList.size(); ++j ) + { + auto pDeviceInfo = deviceInfoList[ j ]; + delete pDeviceInfo; + } + deviceInfoList.clear(); + + for( size_t j = 0; j < deviceSettingsComboList.size(); ++j ) + { + auto pDeviceCombo = deviceSettingsComboList[ j ]; + delete pDeviceCombo; + } + deviceSettingsComboList.clear(); + + SAFE_RELEASE( m_pAdapter ); +} + +//-------------------------------------------------------------------------------------- +// Returns the number of color channel bits in the specified DXGI_FORMAT +//-------------------------------------------------------------------------------------- +UINT WINAPI DXUTGetDXGIColorChannelBits( DXGI_FORMAT fmt ) +{ + switch( fmt ) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: + return 32; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + return 16; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + return 10; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + return 8; + + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: + return 5; + + case DXGI_FORMAT_B4G4R4A4_UNORM: + return 4; + + default: + return 0; + } +} + +//-------------------------------------------------------------------------------------- +// Returns a ranking number that describes how closely this device +// combo matches the optimal combo based on the match options and the optimal device settings +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +float DXUTRankD3D11DeviceCombo( CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo, + DXUTD3D11DeviceSettings* pOptimalDeviceSettings, + int &bestModeIndex, + int &bestMSAAIndex + ) +{ + float fCurRanking = 0.0f; + + // Arbitrary weights. Gives preference to the ordinal, device type, and windowed + const float fAdapterOrdinalWeight = 1000.0f; + const float fAdapterOutputWeight = 500.0f; + const float fDeviceTypeWeight = 100.0f; + const float fWARPOverRefWeight = 80.0f; + + const float fWindowWeight = 10.0f; + const float fResolutionWeight = 1.0f; + const float fBackBufferFormatWeight = 1.0f; + const float fMultiSampleWeight = 1.0f; + + //--------------------- + // Adapter ordinal + //--------------------- + if( pDeviceSettingsCombo->AdapterOrdinal == pOptimalDeviceSettings->AdapterOrdinal ) + fCurRanking += fAdapterOrdinalWeight; + + //--------------------- + // Adapter ordinal + //--------------------- + if( pDeviceSettingsCombo->Output == pOptimalDeviceSettings->Output ) + fCurRanking += fAdapterOutputWeight; + + //--------------------- + // Device type + //--------------------- + if( pDeviceSettingsCombo->DeviceType == pOptimalDeviceSettings->DriverType ) + fCurRanking += fDeviceTypeWeight; + else if (pDeviceSettingsCombo->DeviceType == D3D_DRIVER_TYPE_WARP && pOptimalDeviceSettings->DriverType == D3D_DRIVER_TYPE_HARDWARE) { + fCurRanking += fWARPOverRefWeight; + } + + // Slightly prefer HAL + if( pDeviceSettingsCombo->DeviceType == D3D_DRIVER_TYPE_HARDWARE ) + fCurRanking += 0.1f; + + //--------------------- + // Windowed + //--------------------- + if( pDeviceSettingsCombo->Windowed == pOptimalDeviceSettings->sd.Windowed ) + fCurRanking += fWindowWeight; + + //--------------------- + // Resolution/Refresh Rate + //--------------------- + bestModeIndex=0; + + if( pDeviceSettingsCombo->pOutputInfo ) + { + bool bResolutionFound = false; + float best = FLT_MAX; + + if ( !pDeviceSettingsCombo->Windowed + && !pOptimalDeviceSettings->sd.Windowed + && ( pOptimalDeviceSettings->sd.BufferDesc.RefreshRate.Numerator > 0 || pOptimalDeviceSettings->sd.BufferDesc.RefreshRate.Denominator > 0 ) ) + { + // Match both Resolution & Refresh Rate + for( size_t idm = 0; idm < pDeviceSettingsCombo->pOutputInfo->displayModeList.size() && !bResolutionFound; idm++ ) + { + auto displayMode = pDeviceSettingsCombo->pOutputInfo->displayModeList[ idm ]; + + float refreshDiff = fabs( ( float( displayMode.RefreshRate.Numerator ) / float( displayMode.RefreshRate.Denominator ) ) - + ( float( pOptimalDeviceSettings->sd.BufferDesc.RefreshRate.Numerator ) / float( pOptimalDeviceSettings->sd.BufferDesc.RefreshRate.Denominator ) ) ); + + if( displayMode.Width == pOptimalDeviceSettings->sd.BufferDesc.Width + && displayMode.Height == pOptimalDeviceSettings->sd.BufferDesc.Height + && ( refreshDiff < 0.1f ) ) + { + bResolutionFound = true; + bestModeIndex = static_cast( idm ); + break; + } + + float current = refreshDiff + + fabs( float( displayMode.Width ) - float ( pOptimalDeviceSettings->sd.BufferDesc.Width ) ) + + fabs( float( displayMode.Height ) - float ( pOptimalDeviceSettings->sd.BufferDesc.Height ) ); + + if( current < best ) + { + best = current; + bestModeIndex = static_cast( idm ); + } + } + } + else + { + // Match just Resolution + for( size_t idm = 0; idm < pDeviceSettingsCombo->pOutputInfo->displayModeList.size() && !bResolutionFound; idm++ ) + { + auto displayMode = pDeviceSettingsCombo->pOutputInfo->displayModeList[ idm ]; + + if( displayMode.Width == pOptimalDeviceSettings->sd.BufferDesc.Width + && displayMode.Height == pOptimalDeviceSettings->sd.BufferDesc.Height ) + { + bResolutionFound = true; + bestModeIndex = static_cast( idm ); + break; + } + + float current = fabs( float( displayMode.Width ) - float ( pOptimalDeviceSettings->sd.BufferDesc.Width ) ) + + fabs( float( displayMode.Height ) - float ( pOptimalDeviceSettings->sd.BufferDesc.Height ) ); + + if( current < best ) + { + best = current; + bestModeIndex = static_cast( idm ); + } + } + } + + if( bResolutionFound ) + fCurRanking += fResolutionWeight; + } + + //--------------------- + // Back buffer format + //--------------------- + if( pDeviceSettingsCombo->BackBufferFormat == pOptimalDeviceSettings->sd.BufferDesc.Format ) + { + fCurRanking += fBackBufferFormatWeight; + } + else + { + int nBitDepthDelta = abs( ( long )DXUTGetDXGIColorChannelBits( pDeviceSettingsCombo->BackBufferFormat ) - + ( long )DXUTGetDXGIColorChannelBits( + pOptimalDeviceSettings->sd.BufferDesc.Format ) ); + float fScale = std::max( 0.9f - ( float )nBitDepthDelta * 0.2f, 0.0f ); + fCurRanking += fScale * fBackBufferFormatWeight; + } + + //--------------------- + // Back buffer count + //--------------------- + // No caps for the back buffer count + + //--------------------- + // Multisample + //--------------------- + bool bMultiSampleFound = false; + bestMSAAIndex = 0; + for( size_t i = 0; i < pDeviceSettingsCombo->multiSampleCountList.size(); i++ ) + { + UINT Count = pDeviceSettingsCombo->multiSampleCountList[ i ]; + + if( Count == pOptimalDeviceSettings->sd.SampleDesc.Count ) + { + bestMSAAIndex = static_cast( i ); + bMultiSampleFound = true; + break; + } + } + if( bMultiSampleFound ) + fCurRanking += fMultiSampleWeight; + + //--------------------- + // Swap effect + //--------------------- + // No caps for swap effects + + //--------------------- + // Depth stencil + //--------------------- + // No caps for swap effects + + //--------------------- + // Present flags + //--------------------- + // No caps for the present flags + + //--------------------- + // Present interval + //--------------------- + // No caps for the present flags + + return fCurRanking; +} + + +//-------------------------------------------------------------------------------------- +// Returns the DXGI_MODE_DESC struct for a given adapter and output +//-------------------------------------------------------------------------------------- +#pragma warning ( suppress : 6101 ) +_Use_decl_annotations_ +HRESULT WINAPI DXUTGetD3D11AdapterDisplayMode( UINT AdapterOrdinal, UINT nOutput, DXGI_MODE_DESC* pModeDesc ) +{ + if( !pModeDesc ) + return E_INVALIDARG; + + auto pD3DEnum = DXUTGetD3D11Enumeration(); + if ( !pD3DEnum ) + return E_POINTER; + + auto pOutputInfo = pD3DEnum->GetOutputInfo( AdapterOrdinal, nOutput ); + if( pOutputInfo ) + { + pModeDesc->Width = 800; + pModeDesc->Height = 600; + pModeDesc->RefreshRate.Numerator = 0; + pModeDesc->RefreshRate.Denominator = 0; + pModeDesc->Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + pModeDesc->Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + pModeDesc->ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + + DXGI_OUTPUT_DESC Desc; + if ( FAILED(pOutputInfo->m_pOutput->GetDesc(&Desc))) + memset( &Desc, 0, sizeof(Desc) ); + pModeDesc->Width = Desc.DesktopCoordinates.right - Desc.DesktopCoordinates.left; + pModeDesc->Height = Desc.DesktopCoordinates.bottom - Desc.DesktopCoordinates.top; + + // This should not be required with DXGI 1.1 support for BGRA... + if( pModeDesc->Format == DXGI_FORMAT_B8G8R8A8_UNORM ) + pModeDesc->Format = DXGI_FORMAT_R8G8B8A8_UNORM; + } + + return S_OK; +} diff --git a/DXUT11/Core/DXUTDevice11.h b/DXUT11/Core/DXUTDevice11.h new file mode 100644 index 0000000..1e38a63 --- /dev/null +++ b/DXUT11/Core/DXUTDevice11.h @@ -0,0 +1,210 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTDevice11.h +// +// Enumerates D3D adapters, devices, modes, etc. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +void DXUTApplyDefaultDeviceSettings(DXUTDeviceSettings *modifySettings); + +//-------------------------------------------------------------------------------------- +// Functions to get bit depth from formats +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTGetD3D11AdapterDisplayMode( _In_ UINT AdapterOrdinal, _In_ UINT Output, _Out_ DXGI_MODE_DESC* pModeDesc ); + + + + +//-------------------------------------------------------------------------------------- +// Optional memory create/destory functions. If not call, these will be called automatically +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateD3D11Enumeration(); +void WINAPI DXUTDestroyD3D11Enumeration(); + + + + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +class CD3D11EnumAdapterInfo; +class CD3D11EnumDeviceInfo; +class CD3D11EnumOutputInfo; +struct CD3D11EnumDeviceSettingsCombo; + + + +//-------------------------------------------------------------------------------------- +// Enumerates available Direct3D11 adapters, devices, modes, etc. +//-------------------------------------------------------------------------------------- +class CD3D11Enumeration +{ +public: + // These should be called before Enumerate(). + // + // Use these calls and the IsDeviceAcceptable to control the contents of + // the enumeration object, which affects the device selection and the device settings dialog. + void SetResolutionMinMax( _In_ UINT nMinWidth, _In_ UINT nMinHeight, _In_ UINT nMaxWidth, _In_ UINT nMaxHeight ); + void SetRefreshMinMax( _In_ UINT nMin, _In_ UINT nMax ); + void SetForceFeatureLevel( _In_ D3D_FEATURE_LEVEL forceFL) { m_forceFL = forceFL; } + void SetMultisampleQualityMax( _In_ UINT nMax ); + void ResetPossibleDepthStencilFormats(); + void SetEnumerateAllAdapterFormats( _In_ bool bEnumerateAllAdapterFormats ); + + // Call Enumerate() to enumerate available D3D11 adapters, devices, modes, etc. + bool HasEnumerated() { return m_bHasEnumerated; } + HRESULT Enumerate( _In_ LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE IsD3D11DeviceAcceptableFunc, + _In_opt_ void* pIsD3D11DeviceAcceptableFuncUserContext ); + + // These should be called after Enumerate() is called + std::vector* GetAdapterInfoList(); + CD3D11EnumAdapterInfo* GetAdapterInfo( _In_ UINT AdapterOrdinal ) const; + CD3D11EnumDeviceInfo* GetDeviceInfo( _In_ UINT AdapterOrdinal, _In_ D3D_DRIVER_TYPE DeviceType ) const; + CD3D11EnumOutputInfo* GetOutputInfo( _In_ UINT AdapterOrdinal, _In_ UINT Output ) const; + CD3D11EnumDeviceSettingsCombo* GetDeviceSettingsCombo( _In_ DXUTD3D11DeviceSettings* pDeviceSettings ) const { return GetDeviceSettingsCombo( pDeviceSettings->AdapterOrdinal, pDeviceSettings->sd.BufferDesc.Format, pDeviceSettings->sd.Windowed ); } + CD3D11EnumDeviceSettingsCombo* GetDeviceSettingsCombo( _In_ UINT AdapterOrdinal, _In_ DXGI_FORMAT BackBufferFormat, _In_ BOOL Windowed ) const; + D3D_FEATURE_LEVEL GetWARPFeaturevel() const { return m_warpFL; } + D3D_FEATURE_LEVEL GetREFFeaturevel() const { return m_refFL; } + + ~CD3D11Enumeration(); + +private: + friend HRESULT WINAPI DXUTCreateD3D11Enumeration(); + + // Use DXUTGetD3D11Enumeration() to access global instance + CD3D11Enumeration(); + + bool m_bHasEnumerated; + LPDXUTCALLBACKISD3D11DEVICEACCEPTABLE m_IsD3D11DeviceAcceptableFunc; + void* m_pIsD3D11DeviceAcceptableFuncUserContext; + + std::vector m_DepthStencilPossibleList; + + bool m_bEnumerateAllAdapterFormats; + D3D_FEATURE_LEVEL m_forceFL; + D3D_FEATURE_LEVEL m_warpFL; + D3D_FEATURE_LEVEL m_refFL; + + std::vector m_AdapterInfoList; + + HRESULT EnumerateOutputs( _In_ CD3D11EnumAdapterInfo *pAdapterInfo ); + HRESULT EnumerateDevices( _In_ CD3D11EnumAdapterInfo *pAdapterInfo ); + HRESULT EnumerateDeviceCombos( _In_ CD3D11EnumAdapterInfo* pAdapterInfo ); + HRESULT EnumerateDeviceCombosNoAdapter( _In_ CD3D11EnumAdapterInfo* pAdapterInfo ); + + HRESULT EnumerateDisplayModes( _In_ CD3D11EnumOutputInfo *pOutputInfo ); + void BuildMultiSampleQualityList( _In_ DXGI_FORMAT fmt, _In_ CD3D11EnumDeviceSettingsCombo* pDeviceCombo ); + void ClearAdapterInfoList(); +}; + +CD3D11Enumeration* WINAPI DXUTGetD3D11Enumeration(_In_ bool bForceEnumerate = false, _In_ bool EnumerateAllAdapterFormats = true, _In_ D3D_FEATURE_LEVEL forceFL = ((D3D_FEATURE_LEVEL )0) ); + + +#define DXGI_MAX_DEVICE_IDENTIFIER_STRING 128 + +//-------------------------------------------------------------------------------------- +// A class describing an adapter which contains a unique adapter ordinal +// that is installed on the system +//-------------------------------------------------------------------------------------- +class CD3D11EnumAdapterInfo +{ + const CD3D11EnumAdapterInfo &operator = ( const CD3D11EnumAdapterInfo &rhs ); + +public: + CD3D11EnumAdapterInfo() : + AdapterOrdinal( 0 ), + m_pAdapter( nullptr ), + bAdapterUnavailable(false) + { + *szUniqueDescription = 0; + memset( &AdapterDesc, 0, sizeof(AdapterDesc) ); + } + ~CD3D11EnumAdapterInfo(); + + UINT AdapterOrdinal; + DXGI_ADAPTER_DESC AdapterDesc; + WCHAR szUniqueDescription[DXGI_MAX_DEVICE_IDENTIFIER_STRING]; + IDXGIAdapter *m_pAdapter; + bool bAdapterUnavailable; + + std::vector outputInfoList; // Array of CD3D11EnumOutputInfo* + std::vector deviceInfoList; // Array of CD3D11EnumDeviceInfo* + // List of CD3D11EnumDeviceSettingsCombo* with a unique set + // of BackBufferFormat, and Windowed + std::vector deviceSettingsComboList; +}; + + +class CD3D11EnumOutputInfo +{ + const CD3D11EnumOutputInfo &operator = ( const CD3D11EnumOutputInfo &rhs ); + +public: + CD3D11EnumOutputInfo() : + AdapterOrdinal( 0 ), + Output( 0 ), + m_pOutput( nullptr ) {} + ~CD3D11EnumOutputInfo(); + + UINT AdapterOrdinal; + UINT Output; + IDXGIOutput* m_pOutput; + DXGI_OUTPUT_DESC Desc; + + std::vector displayModeList; // Array of supported D3DDISPLAYMODEs +}; + + +//-------------------------------------------------------------------------------------- +// A class describing a Direct3D11 device that contains a unique supported driver type +//-------------------------------------------------------------------------------------- +class CD3D11EnumDeviceInfo +{ + const CD3D11EnumDeviceInfo& operator =( const CD3D11EnumDeviceInfo& rhs ); + +public: + ~CD3D11EnumDeviceInfo(); + + UINT AdapterOrdinal; + D3D_DRIVER_TYPE DeviceType; + D3D_FEATURE_LEVEL SelectedLevel; + D3D_FEATURE_LEVEL MaxLevel; + BOOL ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x; +}; + + +//-------------------------------------------------------------------------------------- +// A struct describing device settings that contains a unique combination of +// adapter format, back buffer format, and windowed that is compatible with a +// particular Direct3D device and the app. +//-------------------------------------------------------------------------------------- +struct CD3D11EnumDeviceSettingsCombo +{ + UINT AdapterOrdinal; + D3D_DRIVER_TYPE DeviceType; + DXGI_FORMAT BackBufferFormat; + BOOL Windowed; + UINT Output; + + std::vector multiSampleCountList; // List of valid sampling counts (multisampling) + std::vector multiSampleQualityList; // List of number of quality levels for each multisample count + + CD3D11EnumAdapterInfo* pAdapterInfo; + CD3D11EnumDeviceInfo* pDeviceInfo; + CD3D11EnumOutputInfo* pOutputInfo; +}; + +float DXUTRankD3D11DeviceCombo( _In_ CD3D11EnumDeviceSettingsCombo* pDeviceSettingsCombo, + _In_ DXUTD3D11DeviceSettings* pOptimalDeviceSettings, + _Out_ int &bestModeIndex, + _Out_ int &bestMSAAIndex + ); diff --git a/DXUT11/Core/DXUT_2013.vcxproj b/DXUT11/Core/DXUT_2013.vcxproj new file mode 100644 index 0000000..cec2f70 --- /dev/null +++ b/DXUT11/Core/DXUT_2013.vcxproj @@ -0,0 +1,425 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_2013.vcxproj.filters b/DXUT11/Core/DXUT_2013.vcxproj.filters new file mode 100644 index 0000000..78f1ab4 --- /dev/null +++ b/DXUT11/Core/DXUT_2013.vcxproj.filters @@ -0,0 +1,29 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUT_2013_Win10.vcxproj b/DXUT11/Core/DXUT_2013_Win10.vcxproj new file mode 100644 index 0000000..c1b9f49 --- /dev/null +++ b/DXUT11/Core/DXUT_2013_Win10.vcxproj @@ -0,0 +1,431 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_2013_Win10.vcxproj.filters b/DXUT11/Core/DXUT_2013_Win10.vcxproj.filters new file mode 100644 index 0000000..78f1ab4 --- /dev/null +++ b/DXUT11/Core/DXUT_2013_Win10.vcxproj.filters @@ -0,0 +1,29 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUT_2015.vcxproj b/DXUT11/Core/DXUT_2015.vcxproj new file mode 100644 index 0000000..6d6c522 --- /dev/null +++ b/DXUT11/Core/DXUT_2015.vcxproj @@ -0,0 +1,425 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_2015.vcxproj.filters b/DXUT11/Core/DXUT_2015.vcxproj.filters new file mode 100644 index 0000000..78f1ab4 --- /dev/null +++ b/DXUT11/Core/DXUT_2015.vcxproj.filters @@ -0,0 +1,29 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUT_2015_Win10.vcxproj b/DXUT11/Core/DXUT_2015_Win10.vcxproj new file mode 100644 index 0000000..17c9780 --- /dev/null +++ b/DXUT11/Core/DXUT_2015_Win10.vcxproj @@ -0,0 +1,426 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + 10.0.14393.0 + + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_2015_Win10.vcxproj.filters b/DXUT11/Core/DXUT_2015_Win10.vcxproj.filters new file mode 100644 index 0000000..78f1ab4 --- /dev/null +++ b/DXUT11/Core/DXUT_2015_Win10.vcxproj.filters @@ -0,0 +1,29 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUT_2017_Win10.vcxproj b/DXUT11/Core/DXUT_2017_Win10.vcxproj new file mode 100644 index 0000000..1d53d13 --- /dev/null +++ b/DXUT11/Core/DXUT_2017_Win10.vcxproj @@ -0,0 +1,426 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + 10.0.14393.0 + + + + StaticLibrary + Unicode + v141 + + + StaticLibrary + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_2017_Win10.vcxproj.filters b/DXUT11/Core/DXUT_2017_Win10.vcxproj.filters new file mode 100644 index 0000000..78f1ab4 --- /dev/null +++ b/DXUT11/Core/DXUT_2017_Win10.vcxproj.filters @@ -0,0 +1,29 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUT_DirectXTK_2013.vcxproj b/DXUT11/Core/DXUT_DirectXTK_2013.vcxproj new file mode 100644 index 0000000..7990f78 --- /dev/null +++ b/DXUT11/Core/DXUT_DirectXTK_2013.vcxproj @@ -0,0 +1,425 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_DirectXTK_2013.vcxproj.filters b/DXUT11/Core/DXUT_DirectXTK_2013.vcxproj.filters new file mode 100644 index 0000000..153fbf3 --- /dev/null +++ b/DXUT11/Core/DXUT_DirectXTK_2013.vcxproj.filters @@ -0,0 +1,23 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUT_DirectXTK_2015.vcxproj b/DXUT11/Core/DXUT_DirectXTK_2015.vcxproj new file mode 100644 index 0000000..3a3fc0e --- /dev/null +++ b/DXUT11/Core/DXUT_DirectXTK_2015.vcxproj @@ -0,0 +1,425 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_DirectXTK_2015.vcxproj.filters b/DXUT11/Core/DXUT_DirectXTK_2015.vcxproj.filters new file mode 100644 index 0000000..153fbf3 --- /dev/null +++ b/DXUT11/Core/DXUT_DirectXTK_2015.vcxproj.filters @@ -0,0 +1,23 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj b/DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj new file mode 100644 index 0000000..8a830e1 --- /dev/null +++ b/DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj @@ -0,0 +1,426 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + 10.0.14393.0 + + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj.filters b/DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj.filters new file mode 100644 index 0000000..153fbf3 --- /dev/null +++ b/DXUT11/Core/DXUT_DirectXTK_2015_Win10.vcxproj.filters @@ -0,0 +1,23 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUT_DirectXTK_2017.vcxproj b/DXUT11/Core/DXUT_DirectXTK_2017.vcxproj new file mode 100644 index 0000000..f32b85d --- /dev/null +++ b/DXUT11/Core/DXUT_DirectXTK_2017.vcxproj @@ -0,0 +1,426 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUT + {85344B7F-5AA0-4e12-A065-D1333D11F6CA} + DXUT + Win32Proj + 10.0.15063.0 + + + + StaticLibrary + Unicode + v141 + + + StaticLibrary + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUT + + + true + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUT + + + false + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUT + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Core/DXUT_DirectXTK_2017.vcxproj.filters b/DXUT11/Core/DXUT_DirectXTK_2017.vcxproj.filters new file mode 100644 index 0000000..153fbf3 --- /dev/null +++ b/DXUT11/Core/DXUT_DirectXTK_2017.vcxproj.filters @@ -0,0 +1,23 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Core/DXUTmisc.cpp b/DXUT11/Core/DXUTmisc.cpp new file mode 100644 index 0000000..ead9407 --- /dev/null +++ b/DXUT11/Core/DXUTmisc.cpp @@ -0,0 +1,1280 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTMisc.cpp +// +// Shortcut macros and functions for using DX objects +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "dxut.h" +#include + +#include "ScreenGrab.h" + + +#define DXUT_GAMEPAD_TRIGGER_THRESHOLD 30 + +CDXUTTimer* WINAPI DXUTGetGlobalTimer() +{ + // Using an accessor function gives control of the construction order + static CDXUTTimer timer; + return &timer; +} + + +//-------------------------------------------------------------------------------------- +CDXUTTimer::CDXUTTimer() +{ + m_bTimerStopped = true; + m_llQPFTicksPerSec = 0; + + m_llStopTime = 0; + m_llLastElapsedTime = 0; + m_llBaseTime = 0; + + // Use QueryPerformanceFrequency to get the frequency of the counter + LARGE_INTEGER qwTicksPerSec = { 0 }; + QueryPerformanceFrequency( &qwTicksPerSec ); + m_llQPFTicksPerSec = qwTicksPerSec.QuadPart; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::Reset() +{ + LARGE_INTEGER qwTime = GetAdjustedCurrentTime(); + + m_llBaseTime = qwTime.QuadPart; + m_llLastElapsedTime = qwTime.QuadPart; + m_llStopTime = 0; + m_bTimerStopped = FALSE; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::Start() +{ + // Get the current time + LARGE_INTEGER qwTime = { 0 }; + QueryPerformanceCounter( &qwTime ); + + if( m_bTimerStopped ) + m_llBaseTime += qwTime.QuadPart - m_llStopTime; + m_llStopTime = 0; + m_llLastElapsedTime = qwTime.QuadPart; + m_bTimerStopped = FALSE; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::Stop() +{ + if( !m_bTimerStopped ) + { + LARGE_INTEGER qwTime = { 0 }; + QueryPerformanceCounter( &qwTime ); + m_llStopTime = qwTime.QuadPart; + m_llLastElapsedTime = qwTime.QuadPart; + m_bTimerStopped = TRUE; + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTimer::Advance() +{ + m_llStopTime += m_llQPFTicksPerSec / 10; +} + + +//-------------------------------------------------------------------------------------- +double CDXUTTimer::GetAbsoluteTime() const +{ + LARGE_INTEGER qwTime = { 0 }; + QueryPerformanceCounter( &qwTime ); + + double fTime = qwTime.QuadPart / ( double )m_llQPFTicksPerSec; + + return fTime; +} + + +//-------------------------------------------------------------------------------------- +double CDXUTTimer::GetTime() const +{ + LARGE_INTEGER qwTime = GetAdjustedCurrentTime(); + + double fAppTime = ( double )( qwTime.QuadPart - m_llBaseTime ) / ( double )m_llQPFTicksPerSec; + + return fAppTime; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTTimer::GetTimeValues( double* pfTime, double* pfAbsoluteTime, float* pfElapsedTime ) +{ + assert( pfTime && pfAbsoluteTime && pfElapsedTime ); + + LARGE_INTEGER qwTime = GetAdjustedCurrentTime(); + + float fElapsedTime = (float) ((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec); + m_llLastElapsedTime = qwTime.QuadPart; + + // Clamp the timer to non-negative values to ensure the timer is accurate. + // fElapsedTime can be outside this range if processor goes into a + // power save mode or we somehow get shuffled to another processor. + // However, the main thread should call SetThreadAffinityMask to ensure that + // we don't get shuffled to another processor. Other worker threads should NOT call + // SetThreadAffinityMask, but use a shared copy of the timer data gathered from + // the main thread. + if( fElapsedTime < 0.0f ) + fElapsedTime = 0.0f; + + *pfAbsoluteTime = qwTime.QuadPart / ( double )m_llQPFTicksPerSec; + *pfTime = ( qwTime.QuadPart - m_llBaseTime ) / ( double )m_llQPFTicksPerSec; + *pfElapsedTime = fElapsedTime; +} + + +//-------------------------------------------------------------------------------------- +float CDXUTTimer::GetElapsedTime() +{ + LARGE_INTEGER qwTime = GetAdjustedCurrentTime(); + + double fElapsedTime = (float) ((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec); + m_llLastElapsedTime = qwTime.QuadPart; + + // See the explanation about clamping in CDXUTTimer::GetTimeValues() + if( fElapsedTime < 0.0f ) + fElapsedTime = 0.0f; + + return ( float )fElapsedTime; +} + + +//-------------------------------------------------------------------------------------- +// If stopped, returns time when stopped otherwise returns current time +//-------------------------------------------------------------------------------------- +LARGE_INTEGER CDXUTTimer::GetAdjustedCurrentTime() const +{ + LARGE_INTEGER qwTime; + if( m_llStopTime != 0 ) + qwTime.QuadPart = m_llStopTime; + else + QueryPerformanceCounter( &qwTime ); + return qwTime; +} + +//-------------------------------------------------------------------------------------- +// Limit the current thread to one processor (the current one). This ensures that timing code +// runs on only one processor, and will not suffer any ill effects from power management. +// See "Game Timing and Multicore Processors" for more details +//-------------------------------------------------------------------------------------- +void CDXUTTimer::LimitThreadAffinityToCurrentProc() +{ + HANDLE hCurrentProcess = GetCurrentProcess(); + + // Get the processor affinity mask for this process + DWORD_PTR dwProcessAffinityMask = 0; + DWORD_PTR dwSystemAffinityMask = 0; + + if( GetProcessAffinityMask( hCurrentProcess, &dwProcessAffinityMask, &dwSystemAffinityMask ) != 0 && + dwProcessAffinityMask ) + { + // Find the lowest processor that our process is allows to run against + DWORD_PTR dwAffinityMask = ( dwProcessAffinityMask & ( ( ~dwProcessAffinityMask ) + 1 ) ); + + // Set this as the processor that our thread must always run against + // This must be a subset of the process affinity mask + HANDLE hCurrentThread = GetCurrentThread(); + if( INVALID_HANDLE_VALUE != hCurrentThread ) + { + SetThreadAffinityMask( hCurrentThread, dwAffinityMask ); + CloseHandle( hCurrentThread ); + } + } + + CloseHandle( hCurrentProcess ); +} + + +//-------------------------------------------------------------------------------------- +// Returns the string for the given DXGI_FORMAT. +//-------------------------------------------------------------------------------------- +#define DXUTDXGIFMTSTR( a ) case a: pstr = L#a; break; + +_Use_decl_annotations_ +LPCWSTR WINAPI DXUTDXGIFormatToString( DXGI_FORMAT format, bool bWithPrefix ) +{ + const WCHAR* pstr = nullptr; + switch( format ) + { + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32B32A32_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32B32A32_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32B32A32_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32B32A32_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32B32_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32B32_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32B32_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32B32_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16B16A16_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16B16A16_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16B16A16_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16B16A16_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16B16A16_SNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16B16A16_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G32_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32G8X24_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_D32_FLOAT_S8X24_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_X32_TYPELESS_G8X24_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R10G10B10A2_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R10G10B10A2_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R10G10B10A2_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R11G11B10_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8B8A8_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8B8A8_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8B8A8_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8B8A8_SNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8B8A8_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16_SNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16G16_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_D32_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R32_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R24G8_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_D24_UNORM_S8_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R24_UNORM_X8_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_X24_TYPELESS_G8_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8_SNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16_FLOAT) + DXUTDXGIFMTSTR(DXGI_FORMAT_D16_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16_SNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R16_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8_UINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8_SNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8_SINT) + DXUTDXGIFMTSTR(DXGI_FORMAT_A8_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R1_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R9G9B9E5_SHAREDEXP) + DXUTDXGIFMTSTR(DXGI_FORMAT_R8G8_B8G8_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_G8R8_G8B8_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC1_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC1_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC1_UNORM_SRGB) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC2_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC2_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC2_UNORM_SRGB) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC3_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC3_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC3_UNORM_SRGB) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC4_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC4_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC4_SNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC5_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC5_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC5_SNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_B5G6R5_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_B5G5R5A1_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_B8G8R8A8_UNORM) + + // DXGI 1.1 + DXUTDXGIFMTSTR(DXGI_FORMAT_B8G8R8X8_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_B8G8R8A8_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_B8G8R8A8_UNORM_SRGB) + DXUTDXGIFMTSTR(DXGI_FORMAT_B8G8R8X8_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_B8G8R8X8_UNORM_SRGB) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC6H_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC6H_UF16) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC6H_SF16) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC7_TYPELESS) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC7_UNORM) + DXUTDXGIFMTSTR(DXGI_FORMAT_BC7_UNORM_SRGB) + + // DXGI 1.2 + DXUTDXGIFMTSTR(DXGI_FORMAT_B4G4R4A4_UNORM) + + default: + pstr = L"Unknown format"; break; + } + if( bWithPrefix || !wcsstr( pstr, L"DXGI_FORMAT_" ) ) + return pstr; + else + return pstr + wcslen( L"DXGI_FORMAT_" ); +} + +#undef DXUTDXGIFMTSTR + + +//-------------------------------------------------------------------------------------- +// Outputs to the debug stream a formatted Unicode string with a variable-argument list. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +VOID WINAPI DXUTOutputDebugStringW( LPCWSTR strMsg, ... ) +{ +#if defined(DEBUG) || defined(_DEBUG) + WCHAR strBuffer[512]; + + va_list args; + va_start(args, strMsg); + vswprintf_s( strBuffer, 512, strMsg, args ); + strBuffer[511] = L'\0'; + va_end(args); + + OutputDebugString( strBuffer ); +#else + UNREFERENCED_PARAMETER( strMsg ); +#endif +} + + +//-------------------------------------------------------------------------------------- +// Outputs to the debug stream a formatted MBCS string with a variable-argument list. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +VOID WINAPI DXUTOutputDebugStringA( LPCSTR strMsg, ... ) +{ +#if defined(DEBUG) || defined(_DEBUG) + CHAR strBuffer[512]; + + va_list args; + va_start(args, strMsg); + sprintf_s( strBuffer, 512, strMsg, args ); + strBuffer[511] = '\0'; + va_end(args); + + OutputDebugStringA( strBuffer ); +#else + UNREFERENCED_PARAMETER( strMsg ); +#endif +} + + +//-------------------------------------------------------------------------------------- +// Direct3D dynamic linking support -- calls top-level D3D APIs with graceful +// failure if APIs are not present. +//-------------------------------------------------------------------------------------- + +// Function prototypes +typedef INT (WINAPI * LPD3DPERF_BEGINEVENT)(DWORD, LPCWSTR); +typedef INT (WINAPI * LPD3DPERF_ENDEVENT)(void); +typedef VOID (WINAPI * LPD3DPERF_SETMARKER)(DWORD, LPCWSTR); +typedef VOID (WINAPI * LPD3DPERF_SETREGION)(DWORD, LPCWSTR); +typedef BOOL (WINAPI * LPD3DPERF_QUERYREPEATFRAME)(void); +typedef VOID (WINAPI * LPD3DPERF_SETOPTIONS)( DWORD dwOptions ); +typedef DWORD (WINAPI * LPD3DPERF_GETSTATUS)(); +typedef HRESULT (WINAPI * LPCREATEDXGIFACTORY)(REFIID, void ** ); +typedef HRESULT (WINAPI * LPDXGIGETDEBUGINTERFACE)(REFIID, void ** ); + +// Module and function pointers +static HMODULE s_hModD3D9 = nullptr; +static LPD3DPERF_BEGINEVENT s_DynamicD3DPERF_BeginEvent = nullptr; +static LPD3DPERF_ENDEVENT s_DynamicD3DPERF_EndEvent = nullptr; +static LPD3DPERF_SETMARKER s_DynamicD3DPERF_SetMarker = nullptr; +static LPD3DPERF_SETREGION s_DynamicD3DPERF_SetRegion = nullptr; +static LPD3DPERF_QUERYREPEATFRAME s_DynamicD3DPERF_QueryRepeatFrame = nullptr; +static LPD3DPERF_SETOPTIONS s_DynamicD3DPERF_SetOptions = nullptr; +static LPD3DPERF_GETSTATUS s_DynamicD3DPERF_GetStatus = nullptr; +static HMODULE s_hModDXGI = nullptr; +static HMODULE s_hModDXGIDebug = nullptr; +static LPCREATEDXGIFACTORY s_DynamicCreateDXGIFactory = nullptr; +static LPDXGIGETDEBUGINTERFACE s_DynamicDXGIGetDebugInterface = nullptr; +static HMODULE s_hModD3D11 = nullptr; +static PFN_D3D11_CREATE_DEVICE s_DynamicD3D11CreateDevice = nullptr; + +// Ensure function pointers are initialized +static bool DXUT_EnsureD3D9APIs() +{ + // If the module is non-NULL, this function has already been called. Note + // that this doesn't guarantee that all ProcAddresses were found. + if( s_hModD3D9 ) + return true; + + // This could fail in theory, but not on any modern version of Windows + s_hModD3D9 = LoadLibraryEx( L"d3d9.dll", nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if( s_hModD3D9 ) + { + // TODO - Use 11.1 perf APIs instead? + s_DynamicD3DPERF_BeginEvent = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModD3D9, "D3DPERF_BeginEvent" ) ) ); + s_DynamicD3DPERF_EndEvent = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModD3D9, "D3DPERF_EndEvent" ) ) ); + s_DynamicD3DPERF_SetMarker = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModD3D9, "D3DPERF_SetMarker" ) ) ); + s_DynamicD3DPERF_SetRegion = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModD3D9, "D3DPERF_SetRegion" ) ) ); + s_DynamicD3DPERF_QueryRepeatFrame = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModD3D9, "D3DPERF_QueryRepeatFrame" ) ) ); + s_DynamicD3DPERF_SetOptions = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModD3D9, "D3DPERF_SetOptions" ) ) ); + s_DynamicD3DPERF_GetStatus = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModD3D9, "D3DPERF_GetStatus" ) ) ); + } + + return s_hModD3D9 != nullptr; +} + +bool DXUT_EnsureD3D11APIs() +{ + // If both modules are non-NULL, this function has already been called. Note + // that this doesn't guarantee that all ProcAddresses were found. + if( s_hModD3D11 && s_hModDXGI ) + return true; + + // This may fail if Direct3D 11 isn't installed + s_hModD3D11 = LoadLibraryEx( L"d3d11.dll", nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if( s_hModD3D11 ) + { + s_DynamicD3D11CreateDevice = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModD3D11, "D3D11CreateDevice" ) ) ); + } + + if( !s_DynamicCreateDXGIFactory ) + { + s_hModDXGI = LoadLibraryEx( L"dxgi.dll", nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if( s_hModDXGI ) + { + s_DynamicCreateDXGIFactory = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModDXGI, "CreateDXGIFactory1" ) ) ); + } + + if ( !s_DynamicDXGIGetDebugInterface ) + { + s_hModDXGIDebug = LoadLibraryEx( L"dxgidebug.dll", nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if ( s_hModDXGIDebug ) + { + s_DynamicDXGIGetDebugInterface = reinterpret_cast( reinterpret_cast( GetProcAddress( s_hModDXGIDebug, "DXGIGetDebugInterface" ) ) ); + } + } + + return ( s_hModDXGI ) && ( s_hModD3D11 ); + } + + return s_hModD3D11 != nullptr; +} + +int WINAPI DXUT_Dynamic_D3DPERF_BeginEvent( _In_ DWORD col, _In_z_ LPCWSTR wszName ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_BeginEvent ) + return s_DynamicD3DPERF_BeginEvent( col, wszName ); + else + return -1; +} + +int WINAPI DXUT_Dynamic_D3DPERF_EndEvent() +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_EndEvent ) + return s_DynamicD3DPERF_EndEvent(); + else + return -1; +} + +void WINAPI DXUT_Dynamic_D3DPERF_SetMarker( _In_ DWORD col, _In_z_ LPCWSTR wszName ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetMarker ) + s_DynamicD3DPERF_SetMarker( col, wszName ); +} + +void WINAPI DXUT_Dynamic_D3DPERF_SetRegion( _In_ DWORD col, _In_z_ LPCWSTR wszName ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetRegion ) + s_DynamicD3DPERF_SetRegion( col, wszName ); +} + +BOOL WINAPI DXUT_Dynamic_D3DPERF_QueryRepeatFrame() +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_QueryRepeatFrame ) + return s_DynamicD3DPERF_QueryRepeatFrame(); + else + return FALSE; +} + +void WINAPI DXUT_Dynamic_D3DPERF_SetOptions( _In_ DWORD dwOptions ) +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_SetOptions ) + s_DynamicD3DPERF_SetOptions( dwOptions ); +} + +DWORD WINAPI DXUT_Dynamic_D3DPERF_GetStatus() +{ + if( DXUT_EnsureD3D9APIs() && s_DynamicD3DPERF_GetStatus ) + return s_DynamicD3DPERF_GetStatus(); + else + return 0; +} + +_Use_decl_annotations_ +HRESULT WINAPI DXUT_Dynamic_CreateDXGIFactory1( REFIID rInterface, void** ppOut ) +{ + if( DXUT_EnsureD3D11APIs() && s_DynamicCreateDXGIFactory ) + return s_DynamicCreateDXGIFactory( rInterface, ppOut ); + else + return DXUTERR_NODIRECT3D; +} + +_Use_decl_annotations_ +HRESULT WINAPI DXUT_Dynamic_DXGIGetDebugInterface( REFIID rInterface, void** ppOut ) +{ + if( DXUT_EnsureD3D11APIs() && s_DynamicDXGIGetDebugInterface ) + return s_DynamicDXGIGetDebugInterface( rInterface, ppOut ); + else + return E_NOTIMPL; +} + +_Use_decl_annotations_ +HRESULT WINAPI DXUT_Dynamic_D3D11CreateDevice( IDXGIAdapter* pAdapter, + D3D_DRIVER_TYPE DriverType, + HMODULE Software, + UINT32 Flags, + const D3D_FEATURE_LEVEL* pFeatureLevels, + UINT FeatureLevels, + UINT32 SDKVersion, + ID3D11Device** ppDevice, + D3D_FEATURE_LEVEL* pFeatureLevel, + ID3D11DeviceContext** ppImmediateContext ) +{ + if( DXUT_EnsureD3D11APIs() && s_DynamicD3D11CreateDevice ) + return s_DynamicD3D11CreateDevice( pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, + SDKVersion, ppDevice, pFeatureLevel, ppImmediateContext ); + else + return DXUTERR_NODIRECT3D; +} + +#define TRACE_ID(iD) case iD: return L#iD; + +//-------------------------------------------------------------------------------------- +const WCHAR* WINAPI DXUTTraceWindowsMessage( _In_ UINT uMsg ) +{ + switch( uMsg ) + { + TRACE_ID(WM_NULL); + TRACE_ID(WM_CREATE); + TRACE_ID(WM_DESTROY); + TRACE_ID(WM_MOVE); + TRACE_ID(WM_SIZE); + TRACE_ID(WM_ACTIVATE); + TRACE_ID(WM_SETFOCUS); + TRACE_ID(WM_KILLFOCUS); + TRACE_ID(WM_ENABLE); + TRACE_ID(WM_SETREDRAW); + TRACE_ID(WM_SETTEXT); + TRACE_ID(WM_GETTEXT); + TRACE_ID(WM_GETTEXTLENGTH); + TRACE_ID(WM_PAINT); + TRACE_ID(WM_CLOSE); + TRACE_ID(WM_QUERYENDSESSION); + TRACE_ID(WM_QUERYOPEN); + TRACE_ID(WM_ENDSESSION); + TRACE_ID(WM_QUIT); + TRACE_ID(WM_ERASEBKGND); + TRACE_ID(WM_SYSCOLORCHANGE); + TRACE_ID(WM_SHOWWINDOW); + TRACE_ID(WM_WININICHANGE); + TRACE_ID(WM_DEVMODECHANGE); + TRACE_ID(WM_ACTIVATEAPP); + TRACE_ID(WM_FONTCHANGE); + TRACE_ID(WM_TIMECHANGE); + TRACE_ID(WM_CANCELMODE); + TRACE_ID(WM_SETCURSOR); + TRACE_ID(WM_MOUSEACTIVATE); + TRACE_ID(WM_CHILDACTIVATE); + TRACE_ID(WM_QUEUESYNC); + TRACE_ID(WM_GETMINMAXINFO); + TRACE_ID(WM_PAINTICON); + TRACE_ID(WM_ICONERASEBKGND); + TRACE_ID(WM_NEXTDLGCTL); + TRACE_ID(WM_SPOOLERSTATUS); + TRACE_ID(WM_DRAWITEM); + TRACE_ID(WM_MEASUREITEM); + TRACE_ID(WM_DELETEITEM); + TRACE_ID(WM_VKEYTOITEM); + TRACE_ID(WM_CHARTOITEM); + TRACE_ID(WM_SETFONT); + TRACE_ID(WM_GETFONT); + TRACE_ID(WM_SETHOTKEY); + TRACE_ID(WM_GETHOTKEY); + TRACE_ID(WM_QUERYDRAGICON); + TRACE_ID(WM_COMPAREITEM); + TRACE_ID(WM_GETOBJECT); + TRACE_ID(WM_COMPACTING); + TRACE_ID(WM_COMMNOTIFY); + TRACE_ID(WM_WINDOWPOSCHANGING); + TRACE_ID(WM_WINDOWPOSCHANGED); + TRACE_ID(WM_POWER); + TRACE_ID(WM_COPYDATA); + TRACE_ID(WM_CANCELJOURNAL); + TRACE_ID(WM_NOTIFY); + TRACE_ID(WM_INPUTLANGCHANGEREQUEST); + TRACE_ID(WM_INPUTLANGCHANGE); + TRACE_ID(WM_TCARD); + TRACE_ID(WM_HELP); + TRACE_ID(WM_USERCHANGED); + TRACE_ID(WM_NOTIFYFORMAT); + TRACE_ID(WM_CONTEXTMENU); + TRACE_ID(WM_STYLECHANGING); + TRACE_ID(WM_STYLECHANGED); + TRACE_ID(WM_DISPLAYCHANGE); + TRACE_ID(WM_GETICON); + TRACE_ID(WM_SETICON); + TRACE_ID(WM_NCCREATE); + TRACE_ID(WM_NCDESTROY); + TRACE_ID(WM_NCCALCSIZE); + TRACE_ID(WM_NCHITTEST); + TRACE_ID(WM_NCPAINT); + TRACE_ID(WM_NCACTIVATE); + TRACE_ID(WM_GETDLGCODE); + TRACE_ID(WM_SYNCPAINT); + TRACE_ID(WM_NCMOUSEMOVE); + TRACE_ID(WM_NCLBUTTONDOWN); + TRACE_ID(WM_NCLBUTTONUP); + TRACE_ID(WM_NCLBUTTONDBLCLK); + TRACE_ID(WM_NCRBUTTONDOWN); + TRACE_ID(WM_NCRBUTTONUP); + TRACE_ID(WM_NCRBUTTONDBLCLK); + TRACE_ID(WM_NCMBUTTONDOWN); + TRACE_ID(WM_NCMBUTTONUP); + TRACE_ID(WM_NCMBUTTONDBLCLK); + TRACE_ID(WM_NCXBUTTONDOWN); + TRACE_ID(WM_NCXBUTTONUP); + TRACE_ID(WM_NCXBUTTONDBLCLK); + TRACE_ID(WM_INPUT); + TRACE_ID(WM_KEYDOWN); + TRACE_ID(WM_KEYUP); + TRACE_ID(WM_CHAR); + TRACE_ID(WM_DEADCHAR); + TRACE_ID(WM_SYSKEYDOWN); + TRACE_ID(WM_SYSKEYUP); + TRACE_ID(WM_SYSCHAR); + TRACE_ID(WM_SYSDEADCHAR); + TRACE_ID(WM_UNICHAR); + TRACE_ID(WM_IME_STARTCOMPOSITION); + TRACE_ID(WM_IME_ENDCOMPOSITION); + TRACE_ID(WM_IME_COMPOSITION); + TRACE_ID(WM_INITDIALOG); + TRACE_ID(WM_COMMAND); + TRACE_ID(WM_SYSCOMMAND); + TRACE_ID(WM_TIMER); + TRACE_ID(WM_HSCROLL); + TRACE_ID(WM_VSCROLL); + TRACE_ID(WM_INITMENU); + TRACE_ID(WM_INITMENUPOPUP); + TRACE_ID(WM_MENUSELECT); + TRACE_ID(WM_MENUCHAR); + TRACE_ID(WM_ENTERIDLE); + TRACE_ID(WM_MENURBUTTONUP); + TRACE_ID(WM_MENUDRAG); + TRACE_ID(WM_MENUGETOBJECT); + TRACE_ID(WM_UNINITMENUPOPUP); + TRACE_ID(WM_MENUCOMMAND); + TRACE_ID(WM_CHANGEUISTATE); + TRACE_ID(WM_UPDATEUISTATE); + TRACE_ID(WM_QUERYUISTATE); + TRACE_ID(WM_CTLCOLORMSGBOX); + TRACE_ID(WM_CTLCOLOREDIT); + TRACE_ID(WM_CTLCOLORLISTBOX); + TRACE_ID(WM_CTLCOLORBTN); + TRACE_ID(WM_CTLCOLORDLG); + TRACE_ID(WM_CTLCOLORSCROLLBAR); + TRACE_ID(WM_CTLCOLORSTATIC); + TRACE_ID(MN_GETHMENU); + TRACE_ID(WM_MOUSEMOVE); + TRACE_ID(WM_LBUTTONDOWN); + TRACE_ID(WM_LBUTTONUP); + TRACE_ID(WM_LBUTTONDBLCLK); + TRACE_ID(WM_RBUTTONDOWN); + TRACE_ID(WM_RBUTTONUP); + TRACE_ID(WM_RBUTTONDBLCLK); + TRACE_ID(WM_MBUTTONDOWN); + TRACE_ID(WM_MBUTTONUP); + TRACE_ID(WM_MBUTTONDBLCLK); + TRACE_ID(WM_MOUSEWHEEL); + TRACE_ID(WM_XBUTTONDOWN); + TRACE_ID(WM_XBUTTONUP); + TRACE_ID(WM_XBUTTONDBLCLK); + TRACE_ID(WM_PARENTNOTIFY); + TRACE_ID(WM_ENTERMENULOOP); + TRACE_ID(WM_EXITMENULOOP); + TRACE_ID(WM_NEXTMENU); + TRACE_ID(WM_SIZING); + TRACE_ID(WM_CAPTURECHANGED); + TRACE_ID(WM_MOVING); + TRACE_ID(WM_POWERBROADCAST); + TRACE_ID(WM_DEVICECHANGE); + TRACE_ID(WM_MDICREATE); + TRACE_ID(WM_MDIDESTROY); + TRACE_ID(WM_MDIACTIVATE); + TRACE_ID(WM_MDIRESTORE); + TRACE_ID(WM_MDINEXT); + TRACE_ID(WM_MDIMAXIMIZE); + TRACE_ID(WM_MDITILE); + TRACE_ID(WM_MDICASCADE); + TRACE_ID(WM_MDIICONARRANGE); + TRACE_ID(WM_MDIGETACTIVE); + TRACE_ID(WM_MDISETMENU); + TRACE_ID(WM_ENTERSIZEMOVE); + TRACE_ID(WM_EXITSIZEMOVE); + TRACE_ID(WM_DROPFILES); + TRACE_ID(WM_MDIREFRESHMENU); + TRACE_ID(WM_IME_SETCONTEXT); + TRACE_ID(WM_IME_NOTIFY); + TRACE_ID(WM_IME_CONTROL); + TRACE_ID(WM_IME_COMPOSITIONFULL); + TRACE_ID(WM_IME_SELECT); + TRACE_ID(WM_IME_CHAR); + TRACE_ID(WM_IME_REQUEST); + TRACE_ID(WM_IME_KEYDOWN); + TRACE_ID(WM_IME_KEYUP); + TRACE_ID(WM_MOUSEHOVER); + TRACE_ID(WM_MOUSELEAVE); + TRACE_ID(WM_NCMOUSEHOVER); + TRACE_ID(WM_NCMOUSELEAVE); + TRACE_ID(WM_WTSSESSION_CHANGE); + TRACE_ID(WM_TABLET_FIRST); + TRACE_ID(WM_TABLET_LAST); + TRACE_ID(WM_CUT); + TRACE_ID(WM_COPY); + TRACE_ID(WM_PASTE); + TRACE_ID(WM_CLEAR); + TRACE_ID(WM_UNDO); + TRACE_ID(WM_RENDERFORMAT); + TRACE_ID(WM_RENDERALLFORMATS); + TRACE_ID(WM_DESTROYCLIPBOARD); + TRACE_ID(WM_DRAWCLIPBOARD); + TRACE_ID(WM_PAINTCLIPBOARD); + TRACE_ID(WM_VSCROLLCLIPBOARD); + TRACE_ID(WM_SIZECLIPBOARD); + TRACE_ID(WM_ASKCBFORMATNAME); + TRACE_ID(WM_CHANGECBCHAIN); + TRACE_ID(WM_HSCROLLCLIPBOARD); + TRACE_ID(WM_QUERYNEWPALETTE); + TRACE_ID(WM_PALETTEISCHANGING); + TRACE_ID(WM_PALETTECHANGED); + TRACE_ID(WM_HOTKEY); + TRACE_ID(WM_PRINT); + TRACE_ID(WM_PRINTCLIENT); + TRACE_ID(WM_APPCOMMAND); + TRACE_ID(WM_THEMECHANGED); + TRACE_ID(WM_HANDHELDFIRST); + TRACE_ID(WM_HANDHELDLAST); + TRACE_ID(WM_AFXFIRST); + TRACE_ID(WM_AFXLAST); + TRACE_ID(WM_PENWINFIRST); + TRACE_ID(WM_PENWINLAST); + TRACE_ID(WM_APP); + default: + return L"Unknown"; + } +} + + +//-------------------------------------------------------------------------------------- +// Multimon API handling for OSes with or without multimon API support +//-------------------------------------------------------------------------------------- +#define DXUT_PRIMARY_MONITOR ((HMONITOR)0x12340042) +typedef HMONITOR ( WINAPI* LPMONITORFROMWINDOW )( HWND, DWORD ); +typedef BOOL ( WINAPI* LPGETMONITORINFO )( HMONITOR, LPMONITORINFO ); +typedef HMONITOR ( WINAPI* LPMONITORFROMRECT )( LPCRECT lprcScreenCoords, DWORD dwFlags ); + +#pragma warning( suppress : 6101 ) +_Use_decl_annotations_ +BOOL WINAPI DXUTGetMonitorInfo( HMONITOR hMonitor, LPMONITORINFO lpMonitorInfo ) +{ + static bool s_bInited = false; + static LPGETMONITORINFO s_pFnGetMonitorInfo = nullptr; + if( !s_bInited ) + { + s_bInited = true; + HMODULE hUser32 = GetModuleHandle( L"USER32" ); + if( hUser32 ) + { + s_pFnGetMonitorInfo = reinterpret_cast( reinterpret_cast( GetProcAddress( hUser32, "GetMonitorInfoW" ) ) ); + } + } + + if( s_pFnGetMonitorInfo ) + return s_pFnGetMonitorInfo( hMonitor, lpMonitorInfo ); + + RECT rcWork; + if( ( hMonitor == DXUT_PRIMARY_MONITOR ) && lpMonitorInfo && ( lpMonitorInfo->cbSize >= sizeof( MONITORINFO ) ) && + SystemParametersInfoA( SPI_GETWORKAREA, 0, &rcWork, 0 ) ) + { + lpMonitorInfo->rcMonitor.left = 0; + lpMonitorInfo->rcMonitor.top = 0; + lpMonitorInfo->rcMonitor.right = GetSystemMetrics( SM_CXSCREEN ); + lpMonitorInfo->rcMonitor.bottom = GetSystemMetrics( SM_CYSCREEN ); + lpMonitorInfo->rcWork = rcWork; + lpMonitorInfo->dwFlags = MONITORINFOF_PRIMARY; + return TRUE; + } + return FALSE; +} + + +_Use_decl_annotations_ +HMONITOR WINAPI DXUTMonitorFromWindow( HWND hWnd, DWORD dwFlags ) +{ + static bool s_bInited = false; + static LPMONITORFROMWINDOW s_pFnGetMonitorFromWindow = nullptr; + if( !s_bInited ) + { + s_bInited = true; + HMODULE hUser32 = GetModuleHandle( L"USER32" ); + if( hUser32 ) s_pFnGetMonitorFromWindow = reinterpret_cast( reinterpret_cast( GetProcAddress( hUser32, + "MonitorFromWindow" ) ) ); + } + + if( s_pFnGetMonitorFromWindow ) + return s_pFnGetMonitorFromWindow( hWnd, dwFlags ); + else + return DXUT_PRIMARY_MONITOR; +} + + +_Use_decl_annotations_ +HMONITOR WINAPI DXUTMonitorFromRect( LPCRECT lprcScreenCoords, DWORD dwFlags ) +{ + static bool s_bInited = false; + static LPMONITORFROMRECT s_pFnGetMonitorFromRect = nullptr; + if( !s_bInited ) + { + s_bInited = true; + HMODULE hUser32 = GetModuleHandle( L"USER32" ); + if( hUser32 ) s_pFnGetMonitorFromRect = reinterpret_cast( reinterpret_cast( GetProcAddress( hUser32, "MonitorFromRect" ) ) ); + } + + if( s_pFnGetMonitorFromRect ) + return s_pFnGetMonitorFromRect( lprcScreenCoords, dwFlags ); + else + return DXUT_PRIMARY_MONITOR; +} + + +//-------------------------------------------------------------------------------------- +// Get the desktop resolution of an adapter. This isn't the same as the current resolution +// from GetAdapterDisplayMode since the device might be fullscreen +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void WINAPI DXUTGetDesktopResolution( UINT AdapterOrdinal, UINT* pWidth, UINT* pHeight ) +{ + auto DeviceSettings = DXUTGetDeviceSettings(); + + WCHAR strDeviceName[256] = {0}; + DEVMODE devMode; + ZeroMemory( &devMode, sizeof( DEVMODE ) ); + devMode.dmSize = sizeof( DEVMODE ); + + auto pd3dEnum = DXUTGetD3D11Enumeration(); + assert( pd3dEnum ); + _Analysis_assume_( pd3dEnum ); + auto pOutputInfo = pd3dEnum->GetOutputInfo( AdapterOrdinal, DeviceSettings.d3d11.Output ); + if( pOutputInfo ) + { + wcscpy_s( strDeviceName, 256, pOutputInfo->Desc.DeviceName ); + } + + EnumDisplaySettings( strDeviceName, ENUM_REGISTRY_SETTINGS, &devMode ); + + if( pWidth ) + *pWidth = devMode.dmPelsWidth; + if( pHeight ) + *pHeight = devMode.dmPelsHeight; +} + + +//-------------------------------------------------------------------------------------- +// Display error msg box to help debug +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT WINAPI DXUTTrace( const CHAR* strFile, DWORD dwLine, HRESULT hr, + const WCHAR* strMsg, bool bPopMsgBox ) +{ + bool bShowMsgBoxOnError = DXUTGetShowMsgBoxOnError(); + if( bPopMsgBox && bShowMsgBoxOnError == false ) + bPopMsgBox = false; + + WCHAR buff[ MAX_PATH ]; + int result = MultiByteToWideChar( CP_ACP, + MB_PRECOMPOSED, + strFile, + -1, + buff, + MAX_PATH ); + if ( !result ) + { + wcscpy_s( buff, L"*ERROR*" ); + } + + return DXTraceW( buff, dwLine, hr, strMsg, bPopMsgBox ); +} + +typedef DWORD ( WINAPI* LPXINPUTGETSTATE )( DWORD dwUserIndex, XINPUT_STATE* pState ); +typedef DWORD ( WINAPI* LPXINPUTSETSTATE )( DWORD dwUserIndex, XINPUT_VIBRATION* pVibration ); +typedef DWORD ( WINAPI* LPXINPUTGETCAPABILITIES )( DWORD dwUserIndex, DWORD dwFlags, + XINPUT_CAPABILITIES* pCapabilities ); +typedef void ( WINAPI* LPXINPUTENABLE )( BOOL bEnable ); + +//-------------------------------------------------------------------------------------- +// Does extra processing on XInput data to make it slightly more convenient to use +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DXUTGetGamepadState( DWORD dwPort, DXUT_GAMEPAD* pGamePad, bool bThumbstickDeadZone, + bool bSnapThumbstickToCardinals ) +{ + if( dwPort >= DXUT_MAX_CONTROLLERS || !pGamePad ) + return E_FAIL; + + static LPXINPUTGETSTATE s_pXInputGetState = nullptr; + static LPXINPUTGETCAPABILITIES s_pXInputGetCapabilities = nullptr; + if( !s_pXInputGetState || !s_pXInputGetCapabilities ) + { + HINSTANCE hInst = LoadLibraryEx( XINPUT_DLL, nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if( hInst ) + { + s_pXInputGetState = reinterpret_cast( reinterpret_cast( GetProcAddress( hInst, "XInputGetState" ) ) ); + s_pXInputGetCapabilities = reinterpret_cast( reinterpret_cast( GetProcAddress( hInst, "XInputGetCapabilities" ) ) ); + } + } + if( !s_pXInputGetState ) + return E_FAIL; + + XINPUT_STATE InputState; + DWORD dwResult = s_pXInputGetState( dwPort, &InputState ); + + // Track insertion and removals + BOOL bWasConnected = pGamePad->bConnected; + pGamePad->bConnected = ( dwResult == ERROR_SUCCESS ); + pGamePad->bRemoved = ( bWasConnected && !pGamePad->bConnected ); + pGamePad->bInserted = ( !bWasConnected && pGamePad->bConnected ); + + // Don't update rest of the state if not connected + if( !pGamePad->bConnected ) + return S_OK; + + // Store the capabilities of the device + if( pGamePad->bInserted ) + { + ZeroMemory( pGamePad, sizeof( DXUT_GAMEPAD ) ); + pGamePad->bConnected = true; + pGamePad->bInserted = true; + if( s_pXInputGetCapabilities ) + s_pXInputGetCapabilities( dwPort, XINPUT_DEVTYPE_GAMEPAD, &pGamePad->caps ); + } + + // Copy gamepad to local structure (assumes that XINPUT_GAMEPAD at the front in CONTROLER_STATE) + memcpy( pGamePad, &InputState.Gamepad, sizeof( XINPUT_GAMEPAD ) ); + + if( bSnapThumbstickToCardinals ) + { + // Apply deadzone to each axis independantly to slightly snap to up/down/left/right + if( pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && + pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) + pGamePad->sThumbLX = 0; + if( pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && + pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) + pGamePad->sThumbLY = 0; + if( pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && + pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) + pGamePad->sThumbRX = 0; + if( pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && + pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) + pGamePad->sThumbRY = 0; + } + else if( bThumbstickDeadZone ) + { + // Apply deadzone if centered + if( ( pGamePad->sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && + pGamePad->sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) && + ( pGamePad->sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE && + pGamePad->sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ) ) + { + pGamePad->sThumbLX = 0; + pGamePad->sThumbLY = 0; + } + if( ( pGamePad->sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && + pGamePad->sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) && + ( pGamePad->sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE && + pGamePad->sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ) ) + { + pGamePad->sThumbRX = 0; + pGamePad->sThumbRY = 0; + } + } + + // Convert [-1,+1] range + pGamePad->fThumbLX = pGamePad->sThumbLX / 32767.0f; + pGamePad->fThumbLY = pGamePad->sThumbLY / 32767.0f; + pGamePad->fThumbRX = pGamePad->sThumbRX / 32767.0f; + pGamePad->fThumbRY = pGamePad->sThumbRY / 32767.0f; + + // Get the boolean buttons that have been pressed since the last call. + // Each button is represented by one bit. + pGamePad->wPressedButtons = ( pGamePad->wLastButtons ^ pGamePad->wButtons ) & pGamePad->wButtons; + pGamePad->wLastButtons = pGamePad->wButtons; + + // Figure out if the left trigger has been pressed or released + bool bPressed = ( pGamePad->bLeftTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD ); + pGamePad->bPressedLeftTrigger = ( bPressed ) ? !pGamePad->bLastLeftTrigger : false; + pGamePad->bLastLeftTrigger = bPressed; + + // Figure out if the right trigger has been pressed or released + bPressed = ( pGamePad->bRightTrigger > DXUT_GAMEPAD_TRIGGER_THRESHOLD ); + pGamePad->bPressedRightTrigger = ( bPressed ) ? !pGamePad->bLastRightTrigger : false; + pGamePad->bLastRightTrigger = bPressed; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Don't pause the game or deactive the window without first stopping rumble otherwise +// the controller will continue to rumble +//-------------------------------------------------------------------------------------- +void DXUTEnableXInput( _In_ bool bEnable ) +{ + static LPXINPUTENABLE s_pXInputEnable = nullptr; + if( !s_pXInputEnable ) + { + HINSTANCE hInst = LoadLibraryEx( XINPUT_DLL, nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if( hInst ) + s_pXInputEnable = reinterpret_cast( reinterpret_cast( GetProcAddress( hInst, "XInputEnable" ) ) ); + } + + if( s_pXInputEnable ) + s_pXInputEnable( bEnable ); +} + + +//-------------------------------------------------------------------------------------- +// Don't pause the game or deactive the window without first stopping rumble otherwise +// the controller will continue to rumble +//-------------------------------------------------------------------------------------- +HRESULT DXUTStopRumbleOnAllControllers() +{ + static LPXINPUTSETSTATE s_pXInputSetState = nullptr; + if( !s_pXInputSetState ) + { + HINSTANCE hInst = LoadLibraryEx( XINPUT_DLL, nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if( hInst ) + s_pXInputSetState = reinterpret_cast( reinterpret_cast( GetProcAddress( hInst, "XInputSetState" ) ) ); + } + if( !s_pXInputSetState ) + return E_FAIL; + + XINPUT_VIBRATION vibration; + vibration.wLeftMotorSpeed = 0; + vibration.wRightMotorSpeed = 0; + for( int iUserIndex = 0; iUserIndex < DXUT_MAX_CONTROLLERS; iUserIndex++ ) + s_pXInputSetState( iUserIndex, &vibration ); + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +// Helper functions to create SRGB formats from typeless formats and vice versa +//-------------------------------------------------------------------------------------- +DXGI_FORMAT MAKE_SRGB( _In_ DXGI_FORMAT format ) +{ + if( !DXUTIsInGammaCorrectMode() ) + return format; + + switch( format ) + { + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + return DXGI_FORMAT_BC1_UNORM_SRGB; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + return DXGI_FORMAT_BC2_UNORM_SRGB; + + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + return DXGI_FORMAT_BC3_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + return DXGI_FORMAT_BC7_UNORM_SRGB; + }; + + return format; +} + +//-------------------------------------------------------------------------------------- +DXGI_FORMAT MAKE_TYPELESS( _In_ DXGI_FORMAT format ) +{ + switch( format ) + { + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + return DXGI_FORMAT_R32G32B32A32_TYPELESS; + + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: + return DXGI_FORMAT_R32G32B32_TYPELESS; + + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + return DXGI_FORMAT_R16G16B16A16_TYPELESS; + + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + return DXGI_FORMAT_R32G32_TYPELESS; + + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + return DXGI_FORMAT_R10G10B10A2_TYPELESS; + + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + return DXGI_FORMAT_R8G8B8A8_TYPELESS; + + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + return DXGI_FORMAT_R16G16_TYPELESS; + + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + return DXGI_FORMAT_R32_TYPELESS; + + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: + return DXGI_FORMAT_R8G8_TYPELESS; + + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: + return DXGI_FORMAT_R16_TYPELESS; + + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: + return DXGI_FORMAT_R8_TYPELESS; + + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + return DXGI_FORMAT_BC1_TYPELESS; + + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + return DXGI_FORMAT_BC2_TYPELESS; + + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + return DXGI_FORMAT_BC3_TYPELESS; + + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + return DXGI_FORMAT_BC4_TYPELESS; + + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + return DXGI_FORMAT_BC5_TYPELESS; + + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + return DXGI_FORMAT_B8G8R8A8_TYPELESS; + + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + return DXGI_FORMAT_B8G8R8X8_TYPELESS; + + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + return DXGI_FORMAT_BC6H_TYPELESS; + + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + return DXGI_FORMAT_BC7_TYPELESS; + + default: + return format; + } +} + +//-------------------------------------------------------------------------------------- +HRESULT DXUTSnapD3D11Screenshot( _In_z_ LPCWSTR szFileName, _In_ bool usedds ) +{ + IDXGISwapChain *pSwap = DXUTGetDXGISwapChain(); + + if (!pSwap) + return E_FAIL; + + ID3D11Texture2D* pBackBuffer; + HRESULT hr = pSwap->GetBuffer( 0, __uuidof( *pBackBuffer ), ( LPVOID* )&pBackBuffer ); + if (hr != S_OK) + return hr; + + auto dc = DXUTGetD3D11DeviceContext(); + if (!dc) { + SAFE_RELEASE(pBackBuffer); + return E_FAIL; + } + + if ( usedds ) + { + hr = DirectX::SaveDDSTextureToFile( dc, pBackBuffer, szFileName ); + } + else + { + hr = DirectX::SaveWICTextureToFile( dc, pBackBuffer, GUID_ContainerFormatBmp, szFileName ); + } + + SAFE_RELEASE(pBackBuffer); + + return hr; + +} diff --git a/DXUT11/Core/DXUTmisc.h b/DXUT11/Core/DXUTmisc.h new file mode 100644 index 0000000..9706ccc --- /dev/null +++ b/DXUT11/Core/DXUTmisc.h @@ -0,0 +1,298 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTMisc.h +// +// Helper functions for Direct3D programming. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +//-------------------------------------------------------------------------------------- +// XInput helper state/function +// This performs extra processing on XInput gamepad data to make it slightly more convenient to use +// +// Example usage: +// +// DXUT_GAMEPAD gamepad[4]; +// for( DWORD iPort=0; iPortSetPrivateData( WKPDID_D3DDebugObjectName, (UINT)strlen(pstrName), pstrName ); +} +inline void DXUT_SetDebugName( _In_ ID3D11Device* pObj, _In_z_ const CHAR* pstrName ) +{ + if ( pObj ) + pObj->SetPrivateData( WKPDID_D3DDebugObjectName, (UINT)strlen(pstrName), pstrName ); +} +inline void DXUT_SetDebugName( _In_ ID3D11DeviceChild* pObj, _In_z_ const CHAR* pstrName ) +{ + if ( pObj ) + pObj->SetPrivateData( WKPDID_D3DDebugObjectName, (UINT)strlen(pstrName), pstrName ); +} +#else +#define DXUT_SetDebugName( pObj, pstrName ) +#endif + + +//-------------------------------------------------------------------------------------- +// Some D3DPERF APIs take a color that can be used when displaying user events in +// performance analysis tools. The following constants are provided for your +// convenience, but you can use any colors you like. +//-------------------------------------------------------------------------------------- +const DWORD DXUT_PERFEVENTCOLOR = 0xFFC86464; +const DWORD DXUT_PERFEVENTCOLOR2 = 0xFF64C864; +const DWORD DXUT_PERFEVENTCOLOR3 = 0xFF6464C8; + +//-------------------------------------------------------------------------------------- +// The following macros provide a convenient way for your code to call the D3DPERF +// functions only when PROFILE is defined. If PROFILE is not defined (as for the final +// release version of a program), these macros evaluate to nothing, so no detailed event +// information is embedded in your shipping program. It is recommended that you create +// and use three build configurations for your projects: +// Debug (nonoptimized code, asserts active, PROFILE defined to assist debugging) +// Profile (optimized code, asserts disabled, PROFILE defined to assist optimization) +// Release (optimized code, asserts disabled, PROFILE not defined) +//-------------------------------------------------------------------------------------- +#ifdef PROFILE +// PROFILE is defined, so these macros call the D3DPERF functions +#define DXUT_BeginPerfEvent( color, pstrMessage ) DXUT_Dynamic_D3DPERF_BeginEvent( color, pstrMessage ) +#define DXUT_EndPerfEvent() DXUT_Dynamic_D3DPERF_EndEvent() +#define DXUT_SetPerfMarker( color, pstrMessage ) DXUT_Dynamic_D3DPERF_SetMarker( color, pstrMessage ) +#else +// PROFILE is not defined, so these macros do nothing +#define DXUT_BeginPerfEvent( color, pstrMessage ) (__noop) +#define DXUT_EndPerfEvent() (__noop) +#define DXUT_SetPerfMarker( color, pstrMessage ) (__noop) +#endif + +//-------------------------------------------------------------------------------------- +// CDXUTPerfEventGenerator is a helper class that makes it easy to attach begin and end +// events to a block of code. Simply define a CDXUTPerfEventGenerator variable anywhere +// in a block of code, and the class's constructor will call DXUT_BeginPerfEvent when +// the block of code begins, and the class's destructor will call DXUT_EndPerfEvent when +// the block ends. +//-------------------------------------------------------------------------------------- +class CDXUTPerfEventGenerator +{ +public: +CDXUTPerfEventGenerator( _In_ DWORD color, _In_z_ LPCWSTR pstrMessage ) +{ +#ifdef PROFILE + DXUT_BeginPerfEvent( color, pstrMessage ); +#else + UNREFERENCED_PARAMETER(color); + UNREFERENCED_PARAMETER(pstrMessage); +#endif +} +~CDXUTPerfEventGenerator() +{ + DXUT_EndPerfEvent(); +} +}; + + +//-------------------------------------------------------------------------------------- +// Multimon handling to support OSes with or without multimon API support. +// Purposely avoiding the use of multimon.h so DXUT.lib doesn't require +// COMPILE_MULTIMON_STUBS and cause complication with MFC or other users of multimon.h +//-------------------------------------------------------------------------------------- +#ifndef MONITOR_DEFAULTTOPRIMARY +#define MONITORINFOF_PRIMARY 0x00000001 +#define MONITOR_DEFAULTTONULL 0x00000000 +#define MONITOR_DEFAULTTOPRIMARY 0x00000001 +#define MONITOR_DEFAULTTONEAREST 0x00000002 +typedef struct tagMONITORINFO +{ + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; +} MONITORINFO, *LPMONITORINFO; +typedef struct tagMONITORINFOEXW : public tagMONITORINFO +{ + WCHAR szDevice[CCHDEVICENAME]; +} MONITORINFOEXW, *LPMONITORINFOEXW; +typedef MONITORINFOEXW MONITORINFOEX; +typedef LPMONITORINFOEXW LPMONITORINFOEX; +#endif + +HMONITOR WINAPI DXUTMonitorFromWindow( _In_ HWND hWnd, _In_ DWORD dwFlags ); +HMONITOR WINAPI DXUTMonitorFromRect( _In_ LPCRECT lprcScreenCoords, _In_ DWORD dwFlags ); +BOOL WINAPI DXUTGetMonitorInfo( _In_ HMONITOR hMonitor, _Out_ LPMONITORINFO lpMonitorInfo ); +void WINAPI DXUTGetDesktopResolution( _In_ UINT AdapterOrdinal, _Out_ UINT* pWidth, _Out_ UINT* pHeight ); + + +//-------------------------------------------------------------------------------------- +// Helper functions to create SRGB formats from typeless formats and vice versa +//-------------------------------------------------------------------------------------- +DXGI_FORMAT MAKE_SRGB( _In_ DXGI_FORMAT format ); +DXGI_FORMAT MAKE_TYPELESS( _In_ DXGI_FORMAT format ); diff --git a/DXUT11/Core/ScreenGrab.cpp b/DXUT11/Core/ScreenGrab.cpp new file mode 100644 index 0000000..7f3a2ab --- /dev/null +++ b/DXUT11/Core/ScreenGrab.cpp @@ -0,0 +1,1150 @@ +//-------------------------------------------------------------------------------------- +// File: ScreenGrab.cpp +// +// Function for capturing a 2D texture and saving it to a file (aka a 'screenshot' +// when used on a Direct3D 11 Render Target). +// +// Note these functions are useful as a light-weight runtime screen grabber. For +// full-featured texture capture, DDS writer, and texture processing pipeline, +// see the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- +#include "dxut.h" + +// Does not capture 1D textures or 3D textures (volume maps) + +// Does not capture mipmap chains, only the top-most texture level is saved + +// For 2D array textures and cubemaps, it captures only the first image in the array + +#include +#include + +#include + +#include + +#include +#include + +#include "ScreenGrab.h" + +using Microsoft::WRL::ComPtr; + +//-------------------------------------------------------------------------------------- +// Macros +//-------------------------------------------------------------------------------------- +#ifndef MAKEFOURCC + #define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \ + ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) +#endif /* defined(MAKEFOURCC) */ + +//-------------------------------------------------------------------------------------- +// DDS file structure definitions +// +// See DDS.h in the 'Texconv' sample and the 'DirectXTex' library +//-------------------------------------------------------------------------------------- +namespace +{ + #pragma pack(push,1) + + #define DDS_MAGIC 0x20534444 // "DDS " + + struct DDS_PIXELFORMAT + { + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; + }; + + #define DDS_FOURCC 0x00000004 // DDPF_FOURCC + #define DDS_RGB 0x00000040 // DDPF_RGB + #define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS + #define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE + #define DDS_LUMINANCEA 0x00020001 // DDPF_LUMINANCE | DDPF_ALPHAPIXELS + #define DDS_ALPHA 0x00000002 // DDPF_ALPHA + #define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV + + #define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT + #define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT + #define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH + #define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE + + #define DDS_HEIGHT 0x00000002 // DDSD_HEIGHT + #define DDS_WIDTH 0x00000004 // DDSD_WIDTH + + #define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE + + typedef struct + { + uint32_t size; + uint32_t flags; + uint32_t height; + uint32_t width; + uint32_t pitchOrLinearSize; + uint32_t depth; // only if DDS_HEADER_FLAGS_VOLUME is set in flags + uint32_t mipMapCount; + uint32_t reserved1[11]; + DDS_PIXELFORMAT ddspf; + uint32_t caps; + uint32_t caps2; + uint32_t caps3; + uint32_t caps4; + uint32_t reserved2; + } DDS_HEADER; + + typedef struct + { + DXGI_FORMAT dxgiFormat; + uint32_t resourceDimension; + uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG + uint32_t arraySize; + uint32_t reserved; + } DDS_HEADER_DXT10; + + #pragma pack(pop) + + const DDS_PIXELFORMAT DDSPF_DXT1 = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_DXT3 = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','3'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_DXT5 = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','5'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_BC4_UNORM = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','4','U'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_BC4_SNORM = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','4','S'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_BC5_UNORM = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','5','U'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_BC5_SNORM = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','5','S'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_R8G8_B8G8 = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('R','G','B','G'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_G8R8_G8B8 = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('G','R','G','B'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_YUY2 = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('Y','U','Y','2'), 0, 0, 0, 0, 0 }; + + const DDS_PIXELFORMAT DDSPF_A8R8G8B8 = + { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; + + const DDS_PIXELFORMAT DDSPF_X8R8G8B8 = + { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 }; + + const DDS_PIXELFORMAT DDSPF_A8B8G8R8 = + { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; + + const DDS_PIXELFORMAT DDSPF_G16R16 = + { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000 }; + + const DDS_PIXELFORMAT DDSPF_R5G6B5 = + { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000 }; + + const DDS_PIXELFORMAT DDSPF_A1R5G5B5 = + { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000 }; + + const DDS_PIXELFORMAT DDSPF_A4R4G4B4 = + { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000 }; + + const DDS_PIXELFORMAT DDSPF_L8 = + { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 8, 0xff, 0x00, 0x00, 0x00 }; + + const DDS_PIXELFORMAT DDSPF_L16 = + { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 16, 0xffff, 0x0000, 0x0000, 0x0000 }; + + const DDS_PIXELFORMAT DDSPF_A8L8 = + { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 16, 0x00ff, 0x0000, 0x0000, 0xff00 }; + + const DDS_PIXELFORMAT DDSPF_A8 = + { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0x00, 0x00, 0x00, 0xff }; + + const DDS_PIXELFORMAT DDSPF_V8U8 = + { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 16, 0x00ff, 0xff00, 0x0000, 0x0000 }; + + const DDS_PIXELFORMAT DDSPF_Q8W8V8U8 = + { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; + + const DDS_PIXELFORMAT DDSPF_V16U16 = + { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x0000ffff, 0xffff0000, 0x00000000, 0x00000000 }; + + // DXGI_FORMAT_R10G10B10A2_UNORM should be written using DX10 extension to avoid D3DX 10:10:10:2 reversal issue + + // This indicates the DDS_HEADER_DXT10 extension is present (the format is in dxgiFormat) + const DDS_PIXELFORMAT DDSPF_DX10 = + { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','1','0'), 0, 0, 0, 0, 0 }; + + //----------------------------------------------------------------------------- + struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } }; + + typedef public std::unique_ptr ScopedHandle; + + inline HANDLE safe_handle( HANDLE h ) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; } + + class auto_delete_file + { + public: + auto_delete_file(HANDLE hFile) : m_handle(hFile) {} + ~auto_delete_file() + { + if (m_handle) + { + FILE_DISPOSITION_INFO info = {0}; + info.DeleteFile = TRUE; + (void)SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); + } + } + + void clear() { m_handle = 0; } + + private: + HANDLE m_handle; + + auto_delete_file(const auto_delete_file&) = delete; + auto_delete_file& operator=(const auto_delete_file&) = delete; + }; + + class auto_delete_file_wic + { + public: + auto_delete_file_wic(ComPtr& hFile, LPCWSTR szFile) : m_handle(hFile), m_filename(szFile) {} + ~auto_delete_file_wic() + { + if (m_filename) + { + m_handle.Reset(); + DeleteFileW(m_filename); + } + } + + void clear() { m_filename = 0; } + + private: + LPCWSTR m_filename; + ComPtr& m_handle; + + auto_delete_file_wic(const auto_delete_file_wic&) = delete; + auto_delete_file_wic& operator=(const auto_delete_file_wic&) = delete; + }; + + //-------------------------------------------------------------------------------------- + // Return the BPP for a particular format + //-------------------------------------------------------------------------------------- + size_t BitsPerPixel( _In_ DXGI_FORMAT fmt ) + { + switch( fmt ) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + return 128; + + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: + return 96; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DXGI_FORMAT_Y416: + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + return 64; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R11G11B10_FLOAT: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DXGI_FORMAT_AYUV: + case DXGI_FORMAT_Y410: + case DXGI_FORMAT_YUY2: + return 32; + + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + return 24; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_A8P8: + case DXGI_FORMAT_B4G4R4A4_UNORM: + return 16; + + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_420_OPAQUE: + case DXGI_FORMAT_NV11: + return 12; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + return 8; + + case DXGI_FORMAT_R1_UNORM: + return 1; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + return 4; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + return 8; + + default: + return 0; + } + } + + + //-------------------------------------------------------------------------------------- + // Determines if the format is block compressed + //-------------------------------------------------------------------------------------- + bool IsCompressed( _In_ DXGI_FORMAT fmt ) + { + switch ( fmt ) + { + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + return true; + + default: + return false; + } + } + + + //-------------------------------------------------------------------------------------- + // Get surface information for a particular format + //-------------------------------------------------------------------------------------- + void GetSurfaceInfo( + _In_ size_t width, + _In_ size_t height, + _In_ DXGI_FORMAT fmt, + _Out_opt_ size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows ) + { + size_t numBytes = 0; + size_t rowBytes = 0; + size_t numRows = 0; + + bool bc = false; + bool packed = false; + bool planar = false; + size_t bpe = 0; + switch (fmt) + { + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + bc=true; + bpe = 8; + break; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + bc = true; + bpe = 16; + break; + + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_YUY2: + packed = true; + bpe = 4; + break; + + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + packed = true; + bpe = 8; + break; + + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_420_OPAQUE: + planar = true; + bpe = 2; + break; + + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + planar = true; + bpe = 4; + break; + } + + if (bc) + { + size_t numBlocksWide = 0; + if (width > 0) + { + numBlocksWide = std::max( 1, (width + 3) / 4 ); + } + size_t numBlocksHigh = 0; + if (height > 0) + { + numBlocksHigh = std::max( 1, (height + 3) / 4 ); + } + rowBytes = numBlocksWide * bpe; + numRows = numBlocksHigh; + numBytes = rowBytes * numBlocksHigh; + } + else if (packed) + { + rowBytes = ( ( width + 1 ) >> 1 ) * bpe; + numRows = height; + numBytes = rowBytes * height; + } + else if ( fmt == DXGI_FORMAT_NV11 ) + { + rowBytes = ( ( width + 3 ) >> 2 ) * 4; + numRows = height * 2; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data + numBytes = rowBytes * numRows; + } + else if (planar) + { + rowBytes = ( ( width + 1 ) >> 1 ) * bpe; + numBytes = ( rowBytes * height ) + ( ( rowBytes * height + 1 ) >> 1 ); + numRows = height + ( ( height + 1 ) >> 1 ); + } + else + { + size_t bpp = BitsPerPixel( fmt ); + rowBytes = ( width * bpp + 7 ) / 8; // round up to nearest byte + numRows = height; + numBytes = rowBytes * height; + } + + if (outNumBytes) + { + *outNumBytes = numBytes; + } + if (outRowBytes) + { + *outRowBytes = rowBytes; + } + if (outNumRows) + { + *outNumRows = numRows; + } + } + + + //-------------------------------------------------------------------------------------- + DXGI_FORMAT EnsureNotTypeless( DXGI_FORMAT fmt ) + { + // Assumes UNORM or FLOAT; doesn't use UINT or SINT + switch( fmt ) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_FLOAT; + case DXGI_FORMAT_R32G32B32_TYPELESS: return DXGI_FORMAT_R32G32B32_FLOAT; + case DXGI_FORMAT_R16G16B16A16_TYPELESS: return DXGI_FORMAT_R16G16B16A16_UNORM; + case DXGI_FORMAT_R32G32_TYPELESS: return DXGI_FORMAT_R32G32_FLOAT; + case DXGI_FORMAT_R10G10B10A2_TYPELESS: return DXGI_FORMAT_R10G10B10A2_UNORM; + case DXGI_FORMAT_R8G8B8A8_TYPELESS: return DXGI_FORMAT_R8G8B8A8_UNORM; + case DXGI_FORMAT_R16G16_TYPELESS: return DXGI_FORMAT_R16G16_UNORM; + case DXGI_FORMAT_R32_TYPELESS: return DXGI_FORMAT_R32_FLOAT; + case DXGI_FORMAT_R8G8_TYPELESS: return DXGI_FORMAT_R8G8_UNORM; + case DXGI_FORMAT_R16_TYPELESS: return DXGI_FORMAT_R16_UNORM; + case DXGI_FORMAT_R8_TYPELESS: return DXGI_FORMAT_R8_UNORM; + case DXGI_FORMAT_BC1_TYPELESS: return DXGI_FORMAT_BC1_UNORM; + case DXGI_FORMAT_BC2_TYPELESS: return DXGI_FORMAT_BC2_UNORM; + case DXGI_FORMAT_BC3_TYPELESS: return DXGI_FORMAT_BC3_UNORM; + case DXGI_FORMAT_BC4_TYPELESS: return DXGI_FORMAT_BC4_UNORM; + case DXGI_FORMAT_BC5_TYPELESS: return DXGI_FORMAT_BC5_UNORM; + case DXGI_FORMAT_B8G8R8A8_TYPELESS: return DXGI_FORMAT_B8G8R8A8_UNORM; + case DXGI_FORMAT_B8G8R8X8_TYPELESS: return DXGI_FORMAT_B8G8R8X8_UNORM; + case DXGI_FORMAT_BC7_TYPELESS: return DXGI_FORMAT_BC7_UNORM; + default: return fmt; + } + } + + + //-------------------------------------------------------------------------------------- + HRESULT CaptureTexture( + _In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _Inout_ D3D11_TEXTURE2D_DESC& desc, + _Inout_ ComPtr& pStaging ) + { + if ( !pContext || !pSource ) + return E_INVALIDARG; + + D3D11_RESOURCE_DIMENSION resType = D3D11_RESOURCE_DIMENSION_UNKNOWN; + pSource->GetType( &resType ); + + if ( resType != D3D11_RESOURCE_DIMENSION_TEXTURE2D ) + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + + ComPtr pTexture; + HRESULT hr = pSource->QueryInterface( IID_PPV_ARGS( pTexture.GetAddressOf() ) ); + if ( FAILED(hr) ) + return hr; + + assert( pTexture ); + + pTexture->GetDesc( &desc ); + + ComPtr d3dDevice; + pContext->GetDevice( d3dDevice.GetAddressOf() ); + + if ( desc.SampleDesc.Count > 1 ) + { + // MSAA content must be resolved before being copied to a staging texture + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + + ComPtr pTemp; + hr = d3dDevice->CreateTexture2D( &desc, 0, pTemp.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + assert( pTemp ); + + DXGI_FORMAT fmt = EnsureNotTypeless( desc.Format ); + + UINT support = 0; + hr = d3dDevice->CheckFormatSupport( fmt, &support ); + if ( FAILED(hr) ) + return hr; + + if ( !(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE) ) + return E_FAIL; + + for( UINT item = 0; item < desc.ArraySize; ++item ) + { + for( UINT level = 0; level < desc.MipLevels; ++level ) + { + UINT index = D3D11CalcSubresource( level, item, desc.MipLevels ); + pContext->ResolveSubresource( pTemp.Get(), index, pSource, index, fmt ); + } + } + + desc.BindFlags = 0; + desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.Usage = D3D11_USAGE_STAGING; + + hr = d3dDevice->CreateTexture2D( &desc, 0, pStaging.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + assert( pStaging ); + + pContext->CopyResource( pStaging.Get(), pTemp.Get() ); + } + else if ( (desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ) ) + { + // Handle case where the source is already a staging texture we can use directly + pStaging = pTexture; + } + else + { + // Otherwise, create a staging texture from the non-MSAA source + desc.BindFlags = 0; + desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.Usage = D3D11_USAGE_STAGING; + + hr = d3dDevice->CreateTexture2D( &desc, 0, pStaging.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + assert( pStaging ); + + pContext->CopyResource( pStaging.Get(), pSource ); + } + + return S_OK; + } +} // anonymous namespace + +extern bool g_WIC2; + +extern IWICImagingFactory* _GetWIC(); + +//-------------------------------------------------------------------------------------- +HRESULT DirectX::SaveDDSTextureToFile( _In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _In_z_ LPCWSTR fileName ) +{ + if ( !fileName ) + return E_INVALIDARG; + + D3D11_TEXTURE2D_DESC desc = { 0 }; + ComPtr pStaging; + HRESULT hr = CaptureTexture( pContext, pSource, desc, pStaging ); + if ( FAILED(hr) ) + return hr; + + // Create file +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + ScopedHandle hFile( safe_handle( CreateFile2( fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, 0 ) ) ); +#else + ScopedHandle hFile( safe_handle( CreateFileW( fileName, GENERIC_WRITE | DELETE, 0, 0, CREATE_ALWAYS, 0, 0 ) ) ); +#endif + if ( !hFile ) + return HRESULT_FROM_WIN32( GetLastError() ); + + auto_delete_file delonfail(hFile.get()); + + // Setup header + const size_t MAX_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10); + uint8_t fileHeader[ MAX_HEADER_SIZE ]; + + *reinterpret_cast(&fileHeader[0]) = DDS_MAGIC; + + auto header = reinterpret_cast( &fileHeader[0] + sizeof(uint32_t) ); + size_t headerSize = sizeof(uint32_t) + sizeof(DDS_HEADER); + memset( header, 0, sizeof(DDS_HEADER) ); + header->size = sizeof( DDS_HEADER ); + header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP; + header->height = desc.Height; + header->width = desc.Width; + header->mipMapCount = 1; + header->caps = DDS_SURFACE_FLAGS_TEXTURE; + + // Try to use a legacy .DDS pixel format for better tools support, otherwise fallback to 'DX10' header extension + DDS_HEADER_DXT10* extHeader = nullptr; + switch( desc.Format ) + { + case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R16G16_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8G8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R16_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC1_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC2_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC3_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC4_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC4_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC5_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC5_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_B5G6R5_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8G8_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R16G16_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.1 + case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.1 + case DXGI_FORMAT_YUY2: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.2 + case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.2 + + // Legacy D3DX formats using D3DFMT enum value as FourCC + case DXGI_FORMAT_R32G32B32A32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; // D3DFMT_A32B32G32R32F + case DXGI_FORMAT_R16G16B16A16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 113; break; // D3DFMT_A16B16G16R16F + case DXGI_FORMAT_R16G16B16A16_UNORM: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 36; break; // D3DFMT_A16B16G16R16 + case DXGI_FORMAT_R16G16B16A16_SNORM: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 110; break; // D3DFMT_Q16W16V16U16 + case DXGI_FORMAT_R32G32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 115; break; // D3DFMT_G32R32F + case DXGI_FORMAT_R16G16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 112; break; // D3DFMT_G16R16F + case DXGI_FORMAT_R32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 114; break; // D3DFMT_R32F + case DXGI_FORMAT_R16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 111; break; // D3DFMT_R16F + + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + case DXGI_FORMAT_A8P8: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + + default: + memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DX10, sizeof(DDS_PIXELFORMAT) ); + + headerSize += sizeof(DDS_HEADER_DXT10); + extHeader = reinterpret_cast( reinterpret_cast(&fileHeader[0]) + sizeof(uint32_t) + sizeof(DDS_HEADER) ); + memset( extHeader, 0, sizeof(DDS_HEADER_DXT10) ); + extHeader->dxgiFormat = desc.Format; + extHeader->resourceDimension = D3D11_RESOURCE_DIMENSION_TEXTURE2D; + extHeader->arraySize = 1; + break; + } + + size_t rowPitch, slicePitch, rowCount; + GetSurfaceInfo( desc.Width, desc.Height, desc.Format, &slicePitch, &rowPitch, &rowCount ); + + if ( IsCompressed( desc.Format ) ) + { + header->flags |= DDS_HEADER_FLAGS_LINEARSIZE; + header->pitchOrLinearSize = static_cast( slicePitch ); + } + else + { + header->flags |= DDS_HEADER_FLAGS_PITCH; + header->pitchOrLinearSize = static_cast( rowPitch ); + } + + // Setup pixels + std::unique_ptr pixels( new (std::nothrow) uint8_t[ slicePitch ] ); + if (!pixels) + return E_OUTOFMEMORY; + + D3D11_MAPPED_SUBRESOURCE mapped; + hr = pContext->Map( pStaging.Get(), 0, D3D11_MAP_READ, 0, &mapped ); + if ( FAILED(hr) ) + return hr; + + auto sptr = reinterpret_cast( mapped.pData ); + if ( !sptr ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return E_POINTER; + } + + uint8_t* dptr = pixels.get(); + + size_t msize = std::min( rowPitch, mapped.RowPitch ); + for( size_t h = 0; h < rowCount; ++h ) + { + memcpy_s( dptr, rowPitch, sptr, msize ); + sptr += mapped.RowPitch; + dptr += rowPitch; + } + + pContext->Unmap( pStaging.Get(), 0 ); + + // Write header & pixels + DWORD bytesWritten; + if ( !WriteFile( hFile.get(), fileHeader, static_cast( headerSize ), &bytesWritten, 0 ) ) + return HRESULT_FROM_WIN32( GetLastError() ); + + if ( bytesWritten != headerSize ) + return E_FAIL; + + if ( !WriteFile( hFile.get(), pixels.get(), static_cast( slicePitch ), &bytesWritten, 0 ) ) + return HRESULT_FROM_WIN32( GetLastError() ); + + if ( bytesWritten != slicePitch ) + return E_FAIL; + + delonfail.clear(); + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +HRESULT DirectX::SaveWICTextureToFile( _In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _In_ REFGUID guidContainerFormat, + _In_z_ LPCWSTR fileName, + _In_opt_ const GUID* targetFormat, + _In_opt_ std::function setCustomProps ) +{ + if ( !fileName ) + return E_INVALIDARG; + + D3D11_TEXTURE2D_DESC desc = { 0 }; + ComPtr pStaging; + HRESULT hr = CaptureTexture( pContext, pSource, desc, pStaging ); + if ( FAILED(hr) ) + return hr; + + // Determine source format's WIC equivalent + WICPixelFormatGUID pfGuid; + bool sRGB = false; + switch ( desc.Format ) + { + case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break; + case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break; + case DXGI_FORMAT_R16G16B16A16_UNORM: pfGuid = GUID_WICPixelFormat64bppRGBA; break; + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102XR; break; // DXGI 1.1 + case DXGI_FORMAT_R10G10B10A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102; break; + case DXGI_FORMAT_B5G5R5A1_UNORM: pfGuid = GUID_WICPixelFormat16bppBGRA5551; break; + case DXGI_FORMAT_B5G6R5_UNORM: pfGuid = GUID_WICPixelFormat16bppBGR565; break; + case DXGI_FORMAT_R32_FLOAT: pfGuid = GUID_WICPixelFormat32bppGrayFloat; break; + case DXGI_FORMAT_R16_FLOAT: pfGuid = GUID_WICPixelFormat16bppGrayHalf; break; + case DXGI_FORMAT_R16_UNORM: pfGuid = GUID_WICPixelFormat16bppGray; break; + case DXGI_FORMAT_R8_UNORM: pfGuid = GUID_WICPixelFormat8bppGray; break; + case DXGI_FORMAT_A8_UNORM: pfGuid = GUID_WICPixelFormat8bppAlpha; break; + + case DXGI_FORMAT_R8G8B8A8_UNORM: + pfGuid = GUID_WICPixelFormat32bppRGBA; + break; + + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + pfGuid = GUID_WICPixelFormat32bppRGBA; + sRGB = true; + break; + + case DXGI_FORMAT_B8G8R8A8_UNORM: // DXGI 1.1 + pfGuid = GUID_WICPixelFormat32bppBGRA; + break; + + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: // DXGI 1.1 + pfGuid = GUID_WICPixelFormat32bppBGRA; + sRGB = true; + break; + + case DXGI_FORMAT_B8G8R8X8_UNORM: // DXGI 1.1 + pfGuid = GUID_WICPixelFormat32bppBGR; + break; + + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: // DXGI 1.1 + pfGuid = GUID_WICPixelFormat32bppBGR; + sRGB = true; + break; + + default: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + IWICImagingFactory* pWIC = _GetWIC(); + if ( !pWIC ) + return E_NOINTERFACE; + + ComPtr stream; + hr = pWIC->CreateStream( stream.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + hr = stream->InitializeFromFilename( fileName, GENERIC_WRITE ); + if ( FAILED(hr) ) + return hr; + + auto_delete_file_wic delonfail(stream, fileName); + + ComPtr encoder; + hr = pWIC->CreateEncoder( guidContainerFormat, 0, encoder.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + hr = encoder->Initialize( stream.Get(), WICBitmapEncoderNoCache ); + if ( FAILED(hr) ) + return hr; + + ComPtr frame; + ComPtr props; + hr = encoder->CreateNewFrame( frame.GetAddressOf(), props.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + if ( targetFormat && memcmp( &guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID) ) == 0 && g_WIC2 ) + { + // Opt-in to the WIC2 support for writing 32-bit Windows BMP files with an alpha channel + PROPBAG2 option = { 0 }; + option.pstrName = const_cast(L"EnableV5Header32bppBGRA"); + + VARIANT varValue; + varValue.vt = VT_BOOL; + varValue.boolVal = VARIANT_TRUE; + (void)props->Write( 1, &option, &varValue ); + } + + if ( setCustomProps ) + { + setCustomProps( props.Get() ); + } + + hr = frame->Initialize( props.Get() ); + if ( FAILED(hr) ) + return hr; + + hr = frame->SetSize( desc.Width , desc.Height ); + if ( FAILED(hr) ) + return hr; + + hr = frame->SetResolution( 72, 72 ); + if ( FAILED(hr) ) + return hr; + + // Pick a target format + WICPixelFormatGUID targetGuid; + if ( targetFormat ) + { + targetGuid = *targetFormat; + } + else + { + // Screenshots dont typically include the alpha channel of the render target + switch ( desc.Format ) + { +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + if ( g_WIC2 ) + { + targetGuid = GUID_WICPixelFormat96bppRGBFloat; + } + else + { + targetGuid = GUID_WICPixelFormat24bppBGR; + } + break; +#endif + + case DXGI_FORMAT_R16G16B16A16_UNORM: targetGuid = GUID_WICPixelFormat48bppBGR; break; + case DXGI_FORMAT_B5G5R5A1_UNORM: targetGuid = GUID_WICPixelFormat16bppBGR555; break; + case DXGI_FORMAT_B5G6R5_UNORM: targetGuid = GUID_WICPixelFormat16bppBGR565; break; + + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_A8_UNORM: + targetGuid = GUID_WICPixelFormat8bppGray; + break; + + default: + targetGuid = GUID_WICPixelFormat24bppBGR; + break; + } + } + + hr = frame->SetPixelFormat( &targetGuid ); + if ( FAILED(hr) ) + return hr; + + if ( targetFormat && memcmp( targetFormat, &targetGuid, sizeof(WICPixelFormatGUID) ) != 0 ) + { + // Requested output pixel format is not supported by the WIC codec + return E_FAIL; + } + + // Encode WIC metadata + ComPtr metawriter; + if ( SUCCEEDED( frame->GetMetadataQueryWriter( metawriter.GetAddressOf() ) ) ) + { + PROPVARIANT value; + PropVariantInit( &value ); + + value.vt = VT_LPSTR; + value.pszVal = const_cast("DirectXTK"); + + if ( memcmp( &guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID) ) == 0 ) + { + // Set Software name + (void)metawriter->SetMetadataByName( L"/tEXt/{str=Software}", &value ); + + // Set sRGB chunk + if ( sRGB ) + { + value.vt = VT_UI1; + value.bVal = 0; + (void)metawriter->SetMetadataByName( L"/sRGB/RenderingIntent", &value ); + } + } + else + { + // Set Software name + (void)metawriter->SetMetadataByName( L"System.ApplicationName", &value ); + + if ( sRGB ) + { + // Set EXIF Colorspace of sRGB + value.vt = VT_UI2; + value.uiVal = 1; + (void)metawriter->SetMetadataByName( L"System.Image.ColorSpace", &value ); + } + } + } + + D3D11_MAPPED_SUBRESOURCE mapped; + hr = pContext->Map( pStaging.Get(), 0, D3D11_MAP_READ, 0, &mapped ); + if ( FAILED(hr) ) + return hr; + + if ( memcmp( &targetGuid, &pfGuid, sizeof(WICPixelFormatGUID) ) != 0 ) + { + // Conversion required to write + ComPtr source; + hr = pWIC->CreateBitmapFromMemory( desc.Width, desc.Height, pfGuid, + mapped.RowPitch, mapped.RowPitch * desc.Height, + reinterpret_cast( mapped.pData ), source.GetAddressOf() ); + if ( FAILED(hr) ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return hr; + } + + ComPtr FC; + hr = pWIC->CreateFormatConverter( FC.GetAddressOf() ); + if ( FAILED(hr) ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return hr; + } + + BOOL canConvert = FALSE; + hr = FC->CanConvert( pfGuid, targetGuid, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + + hr = FC->Initialize( source.Get(), targetGuid, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeMedianCut ); + if ( FAILED(hr) ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return hr; + } + + WICRect rect = { 0, 0, static_cast( desc.Width ), static_cast( desc.Height ) }; + hr = frame->WriteSource( FC.Get(), &rect ); + if ( FAILED(hr) ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return hr; + } + } + else + { + // No conversion required + hr = frame->WritePixels( desc.Height, mapped.RowPitch, mapped.RowPitch * desc.Height, reinterpret_cast( mapped.pData ) ); + if ( FAILED(hr) ) + return hr; + } + + pContext->Unmap( pStaging.Get(), 0 ); + + hr = frame->Commit(); + if ( FAILED(hr) ) + return hr; + + hr = encoder->Commit(); + if ( FAILED(hr) ) + return hr; + + delonfail.clear(); + + return S_OK; +} diff --git a/DXUT11/Core/ScreenGrab.h b/DXUT11/Core/ScreenGrab.h new file mode 100644 index 0000000..d643073 --- /dev/null +++ b/DXUT11/Core/ScreenGrab.h @@ -0,0 +1,43 @@ +//-------------------------------------------------------------------------------------- +// File: ScreenGrab.h +// +// Function for capturing a 2D texture and saving it to a file (aka a 'screenshot' +// when used on a Direct3D 11 Render Target). +// +// Note these functions are useful as a light-weight runtime screen grabber. For +// full-featured texture capture, DDS writer, and texture processing pipeline, +// see the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include + +#include +#include +#include + + +namespace DirectX +{ + HRESULT SaveDDSTextureToFile( _In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _In_z_ LPCWSTR fileName ); + + HRESULT SaveWICTextureToFile( _In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _In_ REFGUID guidContainerFormat, + _In_z_ LPCWSTR fileName, + _In_opt_ const GUID* targetFormat = nullptr, + _In_opt_ std::function setCustomProps = nullptr ); +} \ No newline at end of file diff --git a/DXUT11/Core/WICTextureLoader.cpp b/DXUT11/Core/WICTextureLoader.cpp new file mode 100644 index 0000000..bb4f937 --- /dev/null +++ b/DXUT11/Core/WICTextureLoader.cpp @@ -0,0 +1,933 @@ +//-------------------------------------------------------------------------------------- +// File: WICTextureLoader.cpp +// +// Function for loading a WIC image and creating a Direct3D 11 runtime texture for it +// (auto-generating mipmaps if possible) +// +// Note: Assumes application has already called CoInitializeEx +// +// Warning: CreateWICTexture* functions are not thread-safe if given a d3dContext instance for +// auto-gen mipmap support. +// +// Note these functions are useful for images created as simple 2D textures. For +// more complex resources, DDSTextureLoader is an excellent light-weight runtime loader. +// For a full-featured DDS file reader, writer, and texture processing pipeline see +// the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- +#include "dxut.h" + +// We could load multi-frame images (TIFF/GIF) into a texture array. +// For now, we just load the first frame (note: DirectXTex supports multi-frame images) + +#include +#include + +#include + +#include + +#include + +#include "WICTextureLoader.h" + +#if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#pragma comment(lib,"dxguid.lib") +#endif + +using Microsoft::WRL::ComPtr; + +bool g_WIC2 = false; + +//-------------------------------------------------------------------------------------- +IWICImagingFactory* _GetWIC() +{ + static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; + + IWICImagingFactory* factory = nullptr; + InitOnceExecuteOnce(&s_initOnce, + [](PINIT_ONCE, PVOID, PVOID *factory) -> BOOL + { + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + HRESULT hr = CoCreateInstance( + CLSID_WICImagingFactory2, + nullptr, + CLSCTX_INPROC_SERVER, + __uuidof(IWICImagingFactory2), + factory + ); + + if ( SUCCEEDED(hr) ) + { + // WIC2 is available on Windows 10, Windows 8.x, and Windows 7 SP1 with KB 2670838 installed + g_WIC2 = true; + return TRUE; + } + else + { + hr = CoCreateInstance( + CLSID_WICImagingFactory1, + nullptr, + CLSCTX_INPROC_SERVER, + __uuidof(IWICImagingFactory), + factory + ); + return SUCCEEDED(hr) ? TRUE : FALSE; + } + #else + return SUCCEEDED( CoCreateInstance( + CLSID_WICImagingFactory, + nullptr, + CLSCTX_INPROC_SERVER, + __uuidof(IWICImagingFactory), + factory) ) ? TRUE : FALSE; + #endif + }, nullptr, reinterpret_cast(&factory)); + + return factory; +} + +namespace +{ + //-------------------------------------------------------------------------------------- + template + inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_ const char (&name)[TNameLength]) + { + #if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) + resource->SetPrivateData(WKPDID_D3DDebugObjectName, TNameLength - 1, name); + #else + UNREFERENCED_PARAMETER(resource); + UNREFERENCED_PARAMETER(name); + #endif + } + + //------------------------------------------------------------------------------------- + // WIC Pixel Format Translation Data + //------------------------------------------------------------------------------------- + struct WICTranslate + { + GUID wic; + DXGI_FORMAT format; + }; + + const WICTranslate g_WICFormats[] = + { + { GUID_WICPixelFormat128bppRGBAFloat, DXGI_FORMAT_R32G32B32A32_FLOAT }, + + { GUID_WICPixelFormat64bppRGBAHalf, DXGI_FORMAT_R16G16B16A16_FLOAT }, + { GUID_WICPixelFormat64bppRGBA, DXGI_FORMAT_R16G16B16A16_UNORM }, + + { GUID_WICPixelFormat32bppRGBA, DXGI_FORMAT_R8G8B8A8_UNORM }, + { GUID_WICPixelFormat32bppBGRA, DXGI_FORMAT_B8G8R8A8_UNORM }, // DXGI 1.1 + { GUID_WICPixelFormat32bppBGR, DXGI_FORMAT_B8G8R8X8_UNORM }, // DXGI 1.1 + + { GUID_WICPixelFormat32bppRGBA1010102XR, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM }, // DXGI 1.1 + { GUID_WICPixelFormat32bppRGBA1010102, DXGI_FORMAT_R10G10B10A2_UNORM }, + + { GUID_WICPixelFormat16bppBGRA5551, DXGI_FORMAT_B5G5R5A1_UNORM }, + { GUID_WICPixelFormat16bppBGR565, DXGI_FORMAT_B5G6R5_UNORM }, + + { GUID_WICPixelFormat32bppGrayFloat, DXGI_FORMAT_R32_FLOAT }, + { GUID_WICPixelFormat16bppGrayHalf, DXGI_FORMAT_R16_FLOAT }, + { GUID_WICPixelFormat16bppGray, DXGI_FORMAT_R16_UNORM }, + { GUID_WICPixelFormat8bppGray, DXGI_FORMAT_R8_UNORM }, + + { GUID_WICPixelFormat8bppAlpha, DXGI_FORMAT_A8_UNORM }, + }; + + //------------------------------------------------------------------------------------- + // WIC Pixel Format nearest conversion table + //------------------------------------------------------------------------------------- + + struct WICConvert + { + GUID source; + GUID target; + }; + + const WICConvert g_WICConvert[] = + { + // Note target GUID in this conversion table must be one of those directly supported formats (above). + + { GUID_WICPixelFormatBlackWhite, GUID_WICPixelFormat8bppGray }, // DXGI_FORMAT_R8_UNORM + + { GUID_WICPixelFormat1bppIndexed, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + { GUID_WICPixelFormat2bppIndexed, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + { GUID_WICPixelFormat4bppIndexed, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + { GUID_WICPixelFormat8bppIndexed, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + + { GUID_WICPixelFormat2bppGray, GUID_WICPixelFormat8bppGray }, // DXGI_FORMAT_R8_UNORM + { GUID_WICPixelFormat4bppGray, GUID_WICPixelFormat8bppGray }, // DXGI_FORMAT_R8_UNORM + + { GUID_WICPixelFormat16bppGrayFixedPoint, GUID_WICPixelFormat16bppGrayHalf }, // DXGI_FORMAT_R16_FLOAT + { GUID_WICPixelFormat32bppGrayFixedPoint, GUID_WICPixelFormat32bppGrayFloat }, // DXGI_FORMAT_R32_FLOAT + + { GUID_WICPixelFormat16bppBGR555, GUID_WICPixelFormat16bppBGRA5551 }, // DXGI_FORMAT_B5G5R5A1_UNORM + + { GUID_WICPixelFormat32bppBGR101010, GUID_WICPixelFormat32bppRGBA1010102 }, // DXGI_FORMAT_R10G10B10A2_UNORM + + { GUID_WICPixelFormat24bppBGR, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + { GUID_WICPixelFormat24bppRGB, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + { GUID_WICPixelFormat32bppPBGRA, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + { GUID_WICPixelFormat32bppPRGBA, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + + { GUID_WICPixelFormat48bppRGB, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + { GUID_WICPixelFormat48bppBGR, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + { GUID_WICPixelFormat64bppBGRA, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + { GUID_WICPixelFormat64bppPRGBA, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + { GUID_WICPixelFormat64bppPBGRA, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + + { GUID_WICPixelFormat48bppRGBFixedPoint, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT + { GUID_WICPixelFormat48bppBGRFixedPoint, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT + { GUID_WICPixelFormat64bppRGBAFixedPoint, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT + { GUID_WICPixelFormat64bppBGRAFixedPoint, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT + { GUID_WICPixelFormat64bppRGBFixedPoint, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT + { GUID_WICPixelFormat64bppRGBHalf, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT + { GUID_WICPixelFormat48bppRGBHalf, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT + + { GUID_WICPixelFormat128bppPRGBAFloat, GUID_WICPixelFormat128bppRGBAFloat }, // DXGI_FORMAT_R32G32B32A32_FLOAT + { GUID_WICPixelFormat128bppRGBFloat, GUID_WICPixelFormat128bppRGBAFloat }, // DXGI_FORMAT_R32G32B32A32_FLOAT + { GUID_WICPixelFormat128bppRGBAFixedPoint, GUID_WICPixelFormat128bppRGBAFloat }, // DXGI_FORMAT_R32G32B32A32_FLOAT + { GUID_WICPixelFormat128bppRGBFixedPoint, GUID_WICPixelFormat128bppRGBAFloat }, // DXGI_FORMAT_R32G32B32A32_FLOAT + { GUID_WICPixelFormat32bppRGBE, GUID_WICPixelFormat128bppRGBAFloat }, // DXGI_FORMAT_R32G32B32A32_FLOAT + + { GUID_WICPixelFormat32bppCMYK, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + { GUID_WICPixelFormat64bppCMYK, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + { GUID_WICPixelFormat40bppCMYKAlpha, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + { GUID_WICPixelFormat80bppCMYKAlpha, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + { GUID_WICPixelFormat32bppRGB, GUID_WICPixelFormat32bppRGBA }, // DXGI_FORMAT_R8G8B8A8_UNORM + { GUID_WICPixelFormat64bppRGB, GUID_WICPixelFormat64bppRGBA }, // DXGI_FORMAT_R16G16B16A16_UNORM + { GUID_WICPixelFormat64bppPRGBAHalf, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT + #endif + + // We don't support n-channel formats + }; + + + //--------------------------------------------------------------------------------- + DXGI_FORMAT _WICToDXGI( const GUID& guid ) + { + for( size_t i=0; i < _countof(g_WICFormats); ++i ) + { + if ( memcmp( &g_WICFormats[i].wic, &guid, sizeof(GUID) ) == 0 ) + return g_WICFormats[i].format; + } + + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + if ( g_WIC2 ) + { + if ( memcmp( &GUID_WICPixelFormat96bppRGBFloat, &guid, sizeof(GUID) ) == 0 ) + return DXGI_FORMAT_R32G32B32_FLOAT; + } + #endif + + return DXGI_FORMAT_UNKNOWN; + } + + //--------------------------------------------------------------------------------- + size_t _WICBitsPerPixel( REFGUID targetGuid ) + { + IWICImagingFactory* pWIC = _GetWIC(); + if ( !pWIC ) + return 0; + + ComPtr cinfo; + if ( FAILED( pWIC->CreateComponentInfo( targetGuid, cinfo.GetAddressOf() ) ) ) + return 0; + + WICComponentType type; + if ( FAILED( cinfo->GetComponentType( &type ) ) ) + return 0; + + if ( type != WICPixelFormat ) + return 0; + + ComPtr pfinfo; + if ( FAILED( cinfo.As( &pfinfo ) ) ) + return 0; + + UINT bpp; + if ( FAILED( pfinfo->GetBitsPerPixel( &bpp ) ) ) + return 0; + + return bpp; + } + + + //-------------------------------------------------------------------------------------- + DXGI_FORMAT MakeSRGB( _In_ DXGI_FORMAT format ) + { + switch( format ) + { + case DXGI_FORMAT_R8G8B8A8_UNORM: + return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + + case DXGI_FORMAT_BC1_UNORM: + return DXGI_FORMAT_BC1_UNORM_SRGB; + + case DXGI_FORMAT_BC2_UNORM: + return DXGI_FORMAT_BC2_UNORM_SRGB; + + case DXGI_FORMAT_BC3_UNORM: + return DXGI_FORMAT_BC3_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8A8_UNORM: + return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8X8_UNORM: + return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + + case DXGI_FORMAT_BC7_UNORM: + return DXGI_FORMAT_BC7_UNORM_SRGB; + + default: + return format; + } + } + + + //--------------------------------------------------------------------------------- + HRESULT CreateTextureFromWIC( + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_ IWICBitmapFrameDecode *frame, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView ) + { + UINT width, height; + HRESULT hr = frame->GetSize( &width, &height ); + if ( FAILED(hr) ) + return hr; + + assert( width > 0 && height > 0 ); + + if ( !maxsize ) + { + // This is a bit conservative because the hardware could support larger textures than + // the Feature Level defined minimums, but doing it this way is much easier and more + // performant for WIC than the 'fail and retry' model used by DDSTextureLoader + + switch( d3dDevice->GetFeatureLevel() ) + { + case D3D_FEATURE_LEVEL_9_1: + case D3D_FEATURE_LEVEL_9_2: + maxsize = 2048 /*D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + break; + + case D3D_FEATURE_LEVEL_9_3: + maxsize = 4096 /*D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + break; + + case D3D_FEATURE_LEVEL_10_0: + case D3D_FEATURE_LEVEL_10_1: + maxsize = 8192 /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + break; + + default: + maxsize = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; + break; + } + } + + assert( maxsize > 0 ); + + UINT twidth, theight; + if ( width > maxsize || height > maxsize ) + { + float ar = static_cast(height) / static_cast(width); + if ( width > height ) + { + twidth = static_cast( maxsize ); + theight = static_cast( static_cast(maxsize) * ar ); + } + else + { + theight = static_cast( maxsize ); + twidth = static_cast( static_cast(maxsize) / ar ); + } + assert( twidth <= maxsize && theight <= maxsize ); + } + else + { + twidth = width; + theight = height; + } + + // Determine format + WICPixelFormatGUID pixelFormat; + hr = frame->GetPixelFormat( &pixelFormat ); + if ( FAILED(hr) ) + return hr; + + WICPixelFormatGUID convertGUID; + memcpy( &convertGUID, &pixelFormat, sizeof(WICPixelFormatGUID) ); + + size_t bpp = 0; + + DXGI_FORMAT format = _WICToDXGI( pixelFormat ); + if ( format == DXGI_FORMAT_UNKNOWN ) + { + if ( memcmp( &GUID_WICPixelFormat96bppRGBFixedPoint, &pixelFormat, sizeof(WICPixelFormatGUID) ) == 0 ) + { + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + if ( g_WIC2 ) + { + memcpy( &convertGUID, &GUID_WICPixelFormat96bppRGBFloat, sizeof(WICPixelFormatGUID) ); + format = DXGI_FORMAT_R32G32B32_FLOAT; + } + else + #endif + { + memcpy( &convertGUID, &GUID_WICPixelFormat128bppRGBAFloat, sizeof(WICPixelFormatGUID) ); + format = DXGI_FORMAT_R32G32B32A32_FLOAT; + } + } + else + { + for( size_t i=0; i < _countof(g_WICConvert); ++i ) + { + if ( memcmp( &g_WICConvert[i].source, &pixelFormat, sizeof(WICPixelFormatGUID) ) == 0 ) + { + memcpy( &convertGUID, &g_WICConvert[i].target, sizeof(WICPixelFormatGUID) ); + + format = _WICToDXGI( g_WICConvert[i].target ); + assert( format != DXGI_FORMAT_UNKNOWN ); + bpp = _WICBitsPerPixel( convertGUID ); + break; + } + } + } + + if ( format == DXGI_FORMAT_UNKNOWN ) + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + else + { + bpp = _WICBitsPerPixel( pixelFormat ); + } + + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + if ( (format == DXGI_FORMAT_R32G32B32_FLOAT) && d3dContext != 0 && textureView != 0 ) + { + // Special case test for optional device support for autogen mipchains for R32G32B32_FLOAT + UINT fmtSupport = 0; + hr = d3dDevice->CheckFormatSupport( DXGI_FORMAT_R32G32B32_FLOAT, &fmtSupport ); + if ( FAILED(hr) || !( fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN ) ) + { + // Use R32G32B32A32_FLOAT instead which is required for Feature Level 10.0 and up + memcpy( &convertGUID, &GUID_WICPixelFormat128bppRGBAFloat, sizeof(WICPixelFormatGUID) ); + format = DXGI_FORMAT_R32G32B32A32_FLOAT; + bpp = 128; + } + } + #endif + + if ( !bpp ) + return E_FAIL; + + // Handle sRGB formats + if ( forceSRGB ) + { + format = MakeSRGB( format ); + } + else + { + ComPtr metareader; + if ( SUCCEEDED( frame->GetMetadataQueryReader( metareader.GetAddressOf() ) ) ) + { + GUID containerFormat; + if ( SUCCEEDED( metareader->GetContainerFormat( &containerFormat ) ) ) + { + // Check for sRGB colorspace metadata + bool sRGB = false; + + PROPVARIANT value; + PropVariantInit( &value ); + + if ( memcmp( &containerFormat, &GUID_ContainerFormatPng, sizeof(GUID) ) == 0 ) + { + // Check for sRGB chunk + if ( SUCCEEDED( metareader->GetMetadataByName( L"/sRGB/RenderingIntent", &value ) ) && value.vt == VT_UI1 ) + { + sRGB = true; + } + } + else if ( SUCCEEDED( metareader->GetMetadataByName( L"System.Image.ColorSpace", &value ) ) && value.vt == VT_UI2 && value.uiVal == 1 ) + { + sRGB = true; + } + + PropVariantClear( &value ); + + if ( sRGB ) + format = MakeSRGB( format ); + } + } + } + + // Verify our target format is supported by the current device + // (handles WDDM 1.0 or WDDM 1.1 device driver cases as well as DirectX 11.0 Runtime without 16bpp format support) + UINT support = 0; + hr = d3dDevice->CheckFormatSupport( format, &support ); + if ( FAILED(hr) || !(support & D3D11_FORMAT_SUPPORT_TEXTURE2D) ) + { + // Fallback to RGBA 32-bit format which is supported by all devices + memcpy( &convertGUID, &GUID_WICPixelFormat32bppRGBA, sizeof(WICPixelFormatGUID) ); + format = DXGI_FORMAT_R8G8B8A8_UNORM; + bpp = 32; + } + + // Allocate temporary memory for image + size_t rowPitch = ( twidth * bpp + 7 ) / 8; + size_t imageSize = rowPitch * theight; + + std::unique_ptr temp( new (std::nothrow) uint8_t[ imageSize ] ); + if (!temp) + return E_OUTOFMEMORY; + + // Load image data + if ( memcmp( &convertGUID, &pixelFormat, sizeof(GUID) ) == 0 + && twidth == width + && theight == height ) + { + // No format conversion or resize needed + hr = frame->CopyPixels( 0, static_cast( rowPitch ), static_cast( imageSize ), temp.get() ); + if ( FAILED(hr) ) + return hr; + } + else if ( twidth != width || theight != height ) + { + // Resize + IWICImagingFactory* pWIC = _GetWIC(); + if ( !pWIC ) + return E_NOINTERFACE; + + ComPtr scaler; + hr = pWIC->CreateBitmapScaler( scaler.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + hr = scaler->Initialize( frame, twidth, theight, WICBitmapInterpolationModeFant ); + if ( FAILED(hr) ) + return hr; + + WICPixelFormatGUID pfScaler; + hr = scaler->GetPixelFormat( &pfScaler ); + if ( FAILED(hr) ) + return hr; + + if ( memcmp( &convertGUID, &pfScaler, sizeof(GUID) ) == 0 ) + { + // No format conversion needed + hr = scaler->CopyPixels( 0, static_cast( rowPitch ), static_cast( imageSize ), temp.get() ); + if ( FAILED(hr) ) + return hr; + } + else + { + ComPtr FC; + hr = pWIC->CreateFormatConverter( FC.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + BOOL canConvert = FALSE; + hr = FC->CanConvert( pfScaler, convertGUID, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + + hr = FC->Initialize( scaler.Get(), convertGUID, WICBitmapDitherTypeErrorDiffusion, nullptr, 0, WICBitmapPaletteTypeMedianCut ); + if ( FAILED(hr) ) + return hr; + + hr = FC->CopyPixels( 0, static_cast( rowPitch ), static_cast( imageSize ), temp.get() ); + if ( FAILED(hr) ) + return hr; + } + } + else + { + // Format conversion but no resize + IWICImagingFactory* pWIC = _GetWIC(); + if ( !pWIC ) + return E_NOINTERFACE; + + ComPtr FC; + hr = pWIC->CreateFormatConverter( FC.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + BOOL canConvert = FALSE; + hr = FC->CanConvert( pixelFormat, convertGUID, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + + hr = FC->Initialize( frame, convertGUID, WICBitmapDitherTypeErrorDiffusion, nullptr, 0, WICBitmapPaletteTypeMedianCut ); + if ( FAILED(hr) ) + return hr; + + hr = FC->CopyPixels( 0, static_cast( rowPitch ), static_cast( imageSize ), temp.get() ); + if ( FAILED(hr) ) + return hr; + } + + // See if format is supported for auto-gen mipmaps (varies by feature level) + bool autogen = false; + if ( d3dContext != 0 && textureView != 0 ) // Must have context and shader-view to auto generate mipmaps + { + UINT fmtSupport = 0; + hr = d3dDevice->CheckFormatSupport( format, &fmtSupport ); + if ( SUCCEEDED(hr) && ( fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN ) ) + { + autogen = true; + } + } + + // Create texture + D3D11_TEXTURE2D_DESC desc; + desc.Width = twidth; + desc.Height = theight; + desc.MipLevels = (autogen) ? 0 : 1; + desc.ArraySize = 1; + desc.Format = format; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = usage; + desc.CPUAccessFlags = cpuAccessFlags; + + if ( autogen ) + { + desc.BindFlags = bindFlags | D3D11_BIND_RENDER_TARGET; + desc.MiscFlags = miscFlags | D3D11_RESOURCE_MISC_GENERATE_MIPS; + } + else + { + desc.BindFlags = bindFlags; + desc.MiscFlags = miscFlags; + } + + D3D11_SUBRESOURCE_DATA initData; + initData.pSysMem = temp.get(); + initData.SysMemPitch = static_cast( rowPitch ); + initData.SysMemSlicePitch = static_cast( imageSize ); + + ID3D11Texture2D* tex = nullptr; + hr = d3dDevice->CreateTexture2D( &desc, (autogen) ? nullptr : &initData, &tex ); + if ( SUCCEEDED(hr) && tex != 0 ) + { + if (textureView != 0) + { + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; + SRVDesc.Format = desc.Format; + + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.Texture2D.MipLevels = (autogen) ? -1 : 1; + + hr = d3dDevice->CreateShaderResourceView( tex, &SRVDesc, textureView ); + if ( FAILED(hr) ) + { + tex->Release(); + return hr; + } + + if ( autogen ) + { + assert( d3dContext != 0 ); + d3dContext->UpdateSubresource( tex, 0, nullptr, temp.get(), static_cast(rowPitch), static_cast(imageSize) ); + d3dContext->GenerateMips( *textureView ); + } + } + + if (texture != 0) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "WICTextureLoader"); + tex->Release(); + } + } + + return hr; + } +} // anonymous namespace + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::CreateWICTextureFromMemory( ID3D11Device* d3dDevice, + const uint8_t* wicData, + size_t wicDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize ) +{ + return CreateWICTextureFromMemoryEx( d3dDevice, nullptr, wicData, wicDataSize, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateWICTextureFromMemory( ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const uint8_t* wicData, + size_t wicDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize ) +{ + return CreateWICTextureFromMemoryEx( d3dDevice, d3dContext, wicData, wicDataSize, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateWICTextureFromMemoryEx( ID3D11Device* d3dDevice, + const uint8_t* wicData, + size_t wicDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView ) +{ + return CreateWICTextureFromMemoryEx( d3dDevice, nullptr, wicData, wicDataSize, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateWICTextureFromMemoryEx( ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const uint8_t* wicData, + size_t wicDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView ) +{ + if ( texture ) + { + *texture = nullptr; + } + if ( textureView ) + { + *textureView = nullptr; + } + + if (!d3dDevice || !wicData || (!texture && !textureView)) + return E_INVALIDARG; + + if ( !wicDataSize ) + return E_FAIL; + + if ( wicDataSize > UINT32_MAX ) + return HRESULT_FROM_WIN32( ERROR_FILE_TOO_LARGE ); + + IWICImagingFactory* pWIC = _GetWIC(); + if ( !pWIC ) + return E_NOINTERFACE; + + // Create input stream for memory + ComPtr stream; + HRESULT hr = pWIC->CreateStream( stream.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + hr = stream->InitializeFromMemory( const_cast( wicData ), static_cast( wicDataSize ) ); + if ( FAILED(hr) ) + return hr; + + // Initialize WIC + ComPtr decoder; + hr = pWIC->CreateDecoderFromStream( stream.Get(), 0, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + ComPtr frame; + hr = decoder->GetFrame( 0, frame.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + hr = CreateTextureFromWIC( d3dDevice, d3dContext, frame.Get(), maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView ); + if ( FAILED(hr)) + return hr; + + if (texture != 0 && *texture != 0) + { + SetDebugObjectName(*texture, "WICTextureLoader"); + } + + if (textureView != 0 && *textureView != 0) + { + SetDebugObjectName(*textureView, "WICTextureLoader"); + } + + return hr; +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::CreateWICTextureFromFile( ID3D11Device* d3dDevice, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize ) +{ + return CreateWICTextureFromFileEx( d3dDevice, nullptr, fileName, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateWICTextureFromFile( ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize ) +{ + return CreateWICTextureFromFileEx( d3dDevice, d3dContext, fileName, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateWICTextureFromFileEx( ID3D11Device* d3dDevice, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView ) +{ + return CreateWICTextureFromFileEx( d3dDevice, nullptr, fileName, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView ); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateWICTextureFromFileEx( ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView ) +{ + if ( texture ) + { + *texture = nullptr; + } + if ( textureView ) + { + *textureView = nullptr; + } + + if (!d3dDevice || !fileName || (!texture && !textureView)) + return E_INVALIDARG; + + IWICImagingFactory* pWIC = _GetWIC(); + if ( !pWIC ) + return E_NOINTERFACE; + + // Initialize WIC + ComPtr decoder; + HRESULT hr = pWIC->CreateDecoderFromFilename( fileName, 0, GENERIC_READ, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + ComPtr frame; + hr = decoder->GetFrame( 0, frame.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + hr = CreateTextureFromWIC( d3dDevice, d3dContext, frame.Get(), maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView ); + +#if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) + if ( SUCCEEDED(hr) ) + { + if (texture != 0 || textureView != 0) + { + CHAR strFileA[MAX_PATH]; + int result = WideCharToMultiByte( CP_ACP, + WC_NO_BEST_FIT_CHARS, + fileName, + -1, + strFileA, + MAX_PATH, + nullptr, + FALSE + ); + if ( result > 0 ) + { + const CHAR* pstrName = strrchr( strFileA, '\\' ); + if (!pstrName) + { + pstrName = strFileA; + } + else + { + pstrName++; + } + + if (texture != 0 && *texture != 0) + { + (*texture)->SetPrivateData( WKPDID_D3DDebugObjectName, + static_cast( strnlen_s(pstrName, MAX_PATH) ), + pstrName + ); + } + + if (textureView != 0 && *textureView != 0 ) + { + (*textureView)->SetPrivateData( WKPDID_D3DDebugObjectName, + static_cast( strnlen_s(pstrName, MAX_PATH) ), + pstrName + ); + } + } + } + } +#endif + + return hr; +} diff --git a/DXUT11/Core/WICTextureLoader.h b/DXUT11/Core/WICTextureLoader.h new file mode 100644 index 0000000..2b0340c --- /dev/null +++ b/DXUT11/Core/WICTextureLoader.h @@ -0,0 +1,123 @@ +//-------------------------------------------------------------------------------------- +// File: WICTextureLoader.h +// +// Function for loading a WIC image and creating a Direct3D 11 runtime texture for it +// (auto-generating mipmaps if possible) +// +// Note: Assumes application has already called CoInitializeEx +// +// Warning: CreateWICTexture* functions are not thread-safe if given a d3dContext instance for +// auto-gen mipmap support. +// +// Note these functions are useful for images created as simple 2D textures. For +// more complex resources, DDSTextureLoader is an excellent light-weight runtime loader. +// For a full-featured DDS file reader, writer, and texture processing pipeline see +// the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include +#include + + +namespace DirectX +{ + // Standard version + HRESULT CreateWICTextureFromMemory( _In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0 + ); + + HRESULT CreateWICTextureFromFile( _In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0 + ); + + // Standard version with optional auto-gen mipmap support + HRESULT CreateWICTextureFromMemory( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0 + ); + + HRESULT CreateWICTextureFromFile( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_z_ const wchar_t* szFileName, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0 + ); + + // Extended version + HRESULT CreateWICTextureFromMemoryEx( _In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView + ); + + HRESULT CreateWICTextureFromFileEx( _In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView + ); + + // Extended version with optional auto-gen mipmap support + HRESULT CreateWICTextureFromMemoryEx( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView + ); + + HRESULT CreateWICTextureFromFileEx( _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Out_opt_ ID3D11Resource** texture, + _Out_opt_ ID3D11ShaderResourceView** textureView + ); +} \ No newline at end of file diff --git a/DXUT11/Core/dxerr.cpp b/DXUT11/Core/dxerr.cpp new file mode 100644 index 0000000..abcb310 --- /dev/null +++ b/DXUT11/Core/dxerr.cpp @@ -0,0 +1,3659 @@ +//-------------------------------------------------------------------------------------- +// File: DXErr.cpp +// +// DirectX Error Library +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#include "dxut.h" + +// This version only supports UNICODE. + +#include "dxerr.h" + +#include + +#include +#include +#include +#include +#include +#include + +#define XAUDIO2_E_INVALID_CALL 0x88960001 +#define XAUDIO2_E_XMA_DECODER_ERROR 0x88960002 +#define XAUDIO2_E_XAPO_CREATION_FAILED 0x88960003 +#define XAUDIO2_E_DEVICE_INVALIDATED 0x88960004 + +#define XAPO_E_FORMAT_UNSUPPORTED MAKE_HRESULT(SEVERITY_ERROR, 0x897, 0x01) + +#define DXUTERR_NODIRECT3D MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0901) +#define DXUTERR_NOCOMPATIBLEDEVICES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0902) +#define DXUTERR_MEDIANOTFOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0903) +#define DXUTERR_NONZEROREFCOUNT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0904) +#define DXUTERR_CREATINGDEVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0905) +#define DXUTERR_RESETTINGDEVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0906) +#define DXUTERR_CREATINGDEVICEOBJECTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0907) +#define DXUTERR_RESETTINGDEVICEOBJECTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0908) +#define DXUTERR_INCORRECTVERSION MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0909) +#define DXUTERR_DEVICEREMOVED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x090A) + +//----------------------------------------------------------------------------- +#define BUFFER_SIZE 3000 + +#pragma warning( disable : 6001 6221 ) + +//-------------------------------------------------------------------------------------- +#define CHK_ERR(hrchk, strOut) \ + case hrchk: \ + return L##strOut; + +#define CHK_ERRA(hrchk) \ + case hrchk: \ + return L#hrchk; + +#define HRESULT_FROM_WIN32b(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000))) + +#define CHK_ERR_WIN32A(hrchk) \ + case HRESULT_FROM_WIN32b(hrchk): \ + case hrchk: \ + return L#hrchk; + +#define CHK_ERR_WIN32_ONLY(hrchk, strOut) \ + case HRESULT_FROM_WIN32b(hrchk): \ + return L##strOut; + +//----------------------------------------------------- +const WCHAR* WINAPI DXGetErrorStringW( _In_ HRESULT hr ) +{ + switch(hr) + { +// Commmented out codes are actually alises for other codes + +// ------------------------------------------------------------- +// Common Win32 error codes +// ------------------------------------------------------------- + CHK_ERRA(S_OK) + CHK_ERRA(S_FALSE) + + CHK_ERRA(E_UNEXPECTED) + CHK_ERRA(E_NOTIMPL) + CHK_ERRA(E_OUTOFMEMORY) + CHK_ERRA(E_INVALIDARG) + CHK_ERRA(E_NOINTERFACE) + CHK_ERRA(E_POINTER) + CHK_ERRA(E_HANDLE) + CHK_ERRA(E_ABORT) + CHK_ERRA(E_FAIL) + CHK_ERRA(E_ACCESSDENIED) + CHK_ERRA(E_PENDING) + CHK_ERRA(CO_E_INIT_TLS) + CHK_ERRA(CO_E_INIT_SHARED_ALLOCATOR) + CHK_ERRA(CO_E_INIT_MEMORY_ALLOCATOR) + CHK_ERRA(CO_E_INIT_CLASS_CACHE) + CHK_ERRA(CO_E_INIT_RPC_CHANNEL) + CHK_ERRA(CO_E_INIT_TLS_SET_CHANNEL_CONTROL) + CHK_ERRA(CO_E_INIT_TLS_CHANNEL_CONTROL) + CHK_ERRA(CO_E_INIT_UNACCEPTED_USER_ALLOCATOR) + CHK_ERRA(CO_E_INIT_SCM_MUTEX_EXISTS) + CHK_ERRA(CO_E_INIT_SCM_FILE_MAPPING_EXISTS) + CHK_ERRA(CO_E_INIT_SCM_MAP_VIEW_OF_FILE) + CHK_ERRA(CO_E_INIT_SCM_EXEC_FAILURE) + CHK_ERRA(CO_E_INIT_ONLY_SINGLE_THREADED) + CHK_ERRA(CO_E_CANT_REMOTE) + CHK_ERRA(CO_E_BAD_SERVER_NAME) + CHK_ERRA(CO_E_WRONG_SERVER_IDENTITY) + CHK_ERRA(CO_E_OLE1DDE_DISABLED) + CHK_ERRA(CO_E_RUNAS_SYNTAX) + CHK_ERRA(CO_E_CREATEPROCESS_FAILURE) + CHK_ERRA(CO_E_RUNAS_CREATEPROCESS_FAILURE) + CHK_ERRA(CO_E_RUNAS_LOGON_FAILURE) + CHK_ERRA(CO_E_LAUNCH_PERMSSION_DENIED) + CHK_ERRA(CO_E_START_SERVICE_FAILURE) + CHK_ERRA(CO_E_REMOTE_COMMUNICATION_FAILURE) + CHK_ERRA(CO_E_SERVER_START_TIMEOUT) + CHK_ERRA(CO_E_CLSREG_INCONSISTENT) + CHK_ERRA(CO_E_IIDREG_INCONSISTENT) + CHK_ERRA(CO_E_NOT_SUPPORTED) + CHK_ERRA(CO_E_RELOAD_DLL) + CHK_ERRA(CO_E_MSI_ERROR) + CHK_ERRA(OLE_E_FIRST) + CHK_ERRA(OLE_E_LAST) + CHK_ERRA(OLE_S_FIRST) + CHK_ERRA(OLE_S_LAST) +// CHK_ERRA(OLE_E_OLEVERB) + CHK_ERRA(OLE_E_ADVF) + CHK_ERRA(OLE_E_ENUM_NOMORE) + CHK_ERRA(OLE_E_ADVISENOTSUPPORTED) + CHK_ERRA(OLE_E_NOCONNECTION) + CHK_ERRA(OLE_E_NOTRUNNING) + CHK_ERRA(OLE_E_NOCACHE) + CHK_ERRA(OLE_E_BLANK) + CHK_ERRA(OLE_E_CLASSDIFF) + CHK_ERRA(OLE_E_CANT_GETMONIKER) + CHK_ERRA(OLE_E_CANT_BINDTOSOURCE) + CHK_ERRA(OLE_E_STATIC) + CHK_ERRA(OLE_E_PROMPTSAVECANCELLED) + CHK_ERRA(OLE_E_INVALIDRECT) + CHK_ERRA(OLE_E_WRONGCOMPOBJ) + CHK_ERRA(OLE_E_INVALIDHWND) + CHK_ERRA(OLE_E_NOT_INPLACEACTIVE) + CHK_ERRA(OLE_E_CANTCONVERT) + CHK_ERRA(OLE_E_NOSTORAGE) + CHK_ERRA(DV_E_FORMATETC) + CHK_ERRA(DV_E_DVTARGETDEVICE) + CHK_ERRA(DV_E_STGMEDIUM) + CHK_ERRA(DV_E_STATDATA) + CHK_ERRA(DV_E_LINDEX) + CHK_ERRA(DV_E_TYMED) + CHK_ERRA(DV_E_CLIPFORMAT) + CHK_ERRA(DV_E_DVASPECT) + CHK_ERRA(DV_E_DVTARGETDEVICE_SIZE) + CHK_ERRA(DV_E_NOIVIEWOBJECT) + CHK_ERRA(DRAGDROP_E_FIRST) + CHK_ERRA(DRAGDROP_E_LAST) + CHK_ERRA(DRAGDROP_S_FIRST) + CHK_ERRA(DRAGDROP_S_LAST) +// CHK_ERRA(DRAGDROP_E_NOTREGISTERED) + CHK_ERRA(DRAGDROP_E_ALREADYREGISTERED) + CHK_ERRA(DRAGDROP_E_INVALIDHWND) + CHK_ERRA(CLASSFACTORY_E_FIRST) + CHK_ERRA(CLASSFACTORY_E_LAST) + CHK_ERRA(CLASSFACTORY_S_FIRST) + CHK_ERRA(CLASSFACTORY_S_LAST) +// CHK_ERRA(CLASS_E_NOAGGREGATION) + CHK_ERRA(CLASS_E_CLASSNOTAVAILABLE) + CHK_ERRA(CLASS_E_NOTLICENSED) + CHK_ERRA(MARSHAL_E_FIRST) + CHK_ERRA(MARSHAL_E_LAST) + CHK_ERRA(MARSHAL_S_FIRST) + CHK_ERRA(MARSHAL_S_LAST) + CHK_ERRA(DATA_E_FIRST) + CHK_ERRA(DATA_E_LAST) + CHK_ERRA(DATA_S_FIRST) + CHK_ERRA(DATA_S_LAST) + CHK_ERRA(VIEW_E_FIRST) + CHK_ERRA(VIEW_E_LAST) + CHK_ERRA(VIEW_S_FIRST) + CHK_ERRA(VIEW_S_LAST) +// CHK_ERRA(VIEW_E_DRAW) + CHK_ERRA(REGDB_E_FIRST) + CHK_ERRA(REGDB_E_LAST) + CHK_ERRA(REGDB_S_FIRST) + CHK_ERRA(REGDB_S_LAST) +// CHK_ERRA(REGDB_E_READREGDB) + CHK_ERRA(REGDB_E_WRITEREGDB) + CHK_ERRA(REGDB_E_KEYMISSING) + CHK_ERRA(REGDB_E_INVALIDVALUE) + CHK_ERRA(REGDB_E_CLASSNOTREG) + CHK_ERRA(REGDB_E_IIDNOTREG) + CHK_ERRA(CAT_E_FIRST) + CHK_ERRA(CAT_E_LAST) +// CHK_ERRA(CAT_E_CATIDNOEXIST) +// CHK_ERRA(CAT_E_NODESCRIPTION) + CHK_ERRA(CS_E_FIRST) + CHK_ERRA(CS_E_LAST) +// CHK_ERRA(CS_E_PACKAGE_NOTFOUND) + CHK_ERRA(CS_E_NOT_DELETABLE) + CHK_ERRA(CS_E_CLASS_NOTFOUND) + CHK_ERRA(CS_E_INVALID_VERSION) + CHK_ERRA(CS_E_NO_CLASSSTORE) + CHK_ERRA(CS_E_OBJECT_NOTFOUND) + CHK_ERRA(CS_E_OBJECT_ALREADY_EXISTS) + CHK_ERRA(CS_E_INVALID_PATH) + CHK_ERRA(CS_E_NETWORK_ERROR) + CHK_ERRA(CS_E_ADMIN_LIMIT_EXCEEDED) + CHK_ERRA(CS_E_SCHEMA_MISMATCH) +// CHK_ERRA(CS_E_INTERNAL_ERROR) + CHK_ERRA(CACHE_E_FIRST) + CHK_ERRA(CACHE_E_LAST) + CHK_ERRA(CACHE_S_FIRST) + CHK_ERRA(CACHE_S_LAST) +// CHK_ERRA(CACHE_E_NOCACHE_UPDATED) + CHK_ERRA(OLEOBJ_E_FIRST) + CHK_ERRA(OLEOBJ_E_LAST) + CHK_ERRA(OLEOBJ_S_FIRST) + CHK_ERRA(OLEOBJ_S_LAST) +// CHK_ERRA(OLEOBJ_E_NOVERBS) + CHK_ERRA(OLEOBJ_E_INVALIDVERB) + CHK_ERRA(CLIENTSITE_E_FIRST) + CHK_ERRA(CLIENTSITE_E_LAST) + CHK_ERRA(CLIENTSITE_S_FIRST) + CHK_ERRA(CLIENTSITE_S_LAST) + CHK_ERRA(INPLACE_E_NOTUNDOABLE) + CHK_ERRA(INPLACE_E_NOTOOLSPACE) +// CHK_ERRA(INPLACE_E_FIRST) + CHK_ERRA(INPLACE_E_LAST) + CHK_ERRA(INPLACE_S_FIRST) + CHK_ERRA(INPLACE_S_LAST) + CHK_ERRA(ENUM_E_FIRST) + CHK_ERRA(ENUM_E_LAST) + CHK_ERRA(ENUM_S_FIRST) + CHK_ERRA(ENUM_S_LAST) + CHK_ERRA(CONVERT10_E_FIRST) + CHK_ERRA(CONVERT10_E_LAST) + CHK_ERRA(CONVERT10_S_FIRST) + CHK_ERRA(CONVERT10_S_LAST) +// CHK_ERRA(CONVERT10_E_OLESTREAM_GET) + CHK_ERRA(CONVERT10_E_OLESTREAM_PUT) + CHK_ERRA(CONVERT10_E_OLESTREAM_FMT) + CHK_ERRA(CONVERT10_E_OLESTREAM_BITMAP_TO_DIB) + CHK_ERRA(CONVERT10_E_STG_FMT) + CHK_ERRA(CONVERT10_E_STG_NO_STD_STREAM) + CHK_ERRA(CONVERT10_E_STG_DIB_TO_BITMAP) + CHK_ERRA(CLIPBRD_E_FIRST) + CHK_ERRA(CLIPBRD_E_LAST) + CHK_ERRA(CLIPBRD_S_FIRST) + CHK_ERRA(CLIPBRD_S_LAST) +// CHK_ERRA(CLIPBRD_E_CANT_OPEN) + CHK_ERRA(CLIPBRD_E_CANT_EMPTY) + CHK_ERRA(CLIPBRD_E_CANT_SET) + CHK_ERRA(CLIPBRD_E_BAD_DATA) + CHK_ERRA(CLIPBRD_E_CANT_CLOSE) + CHK_ERRA(MK_E_FIRST) + CHK_ERRA(MK_E_LAST) + CHK_ERRA(MK_S_FIRST) + CHK_ERRA(MK_S_LAST) +// CHK_ERRA(MK_E_CONNECTMANUALLY) + CHK_ERRA(MK_E_EXCEEDEDDEADLINE) + CHK_ERRA(MK_E_NEEDGENERIC) + CHK_ERRA(MK_E_UNAVAILABLE) + CHK_ERRA(MK_E_SYNTAX) + CHK_ERRA(MK_E_NOOBJECT) + CHK_ERRA(MK_E_INVALIDEXTENSION) + CHK_ERRA(MK_E_INTERMEDIATEINTERFACENOTSUPPORTED) + CHK_ERRA(MK_E_NOTBINDABLE) + CHK_ERRA(MK_E_NOTBOUND) + CHK_ERRA(MK_E_CANTOPENFILE) + CHK_ERRA(MK_E_MUSTBOTHERUSER) + CHK_ERRA(MK_E_NOINVERSE) + CHK_ERRA(MK_E_NOSTORAGE) + CHK_ERRA(MK_E_NOPREFIX) +// CHK_ERRA(MK_E_ENUMERATION_FAILED) + CHK_ERRA(CO_E_NOTINITIALIZED) + CHK_ERRA(CO_E_ALREADYINITIALIZED) + CHK_ERRA(CO_E_CANTDETERMINECLASS) + CHK_ERRA(CO_E_CLASSSTRING) + CHK_ERRA(CO_E_IIDSTRING) + CHK_ERRA(CO_E_APPNOTFOUND) + CHK_ERRA(CO_E_APPSINGLEUSE) + CHK_ERRA(CO_E_ERRORINAPP) + CHK_ERRA(CO_E_DLLNOTFOUND) + CHK_ERRA(CO_E_ERRORINDLL) + CHK_ERRA(CO_E_WRONGOSFORAPP) + CHK_ERRA(CO_E_OBJNOTREG) + CHK_ERRA(CO_E_OBJISREG) + CHK_ERRA(CO_E_OBJNOTCONNECTED) + CHK_ERRA(CO_E_APPDIDNTREG) + CHK_ERRA(CO_E_RELEASED) +// CHK_ERRA(OLE_S_USEREG) + CHK_ERRA(OLE_S_STATIC) + CHK_ERRA(OLE_S_MAC_CLIPFORMAT) +// CHK_ERRA(DRAGDROP_S_DROP) + CHK_ERRA(DRAGDROP_S_CANCEL) + CHK_ERRA(DRAGDROP_S_USEDEFAULTCURSORS) +// CHK_ERRA(DATA_S_SAMEFORMATETC) +// CHK_ERRA(VIEW_S_ALREADY_FROZEN) +// CHK_ERRA(CACHE_S_FORMATETC_NOTSUPPORTED) + CHK_ERRA(CACHE_S_SAMECACHE) + CHK_ERRA(CACHE_S_SOMECACHES_NOTUPDATED) +// CHK_ERRA(OLEOBJ_S_INVALIDVERB) + CHK_ERRA(OLEOBJ_S_CANNOT_DOVERB_NOW) + CHK_ERRA(OLEOBJ_S_INVALIDHWND) +// CHK_ERRA(INPLACE_S_TRUNCATED) +// CHK_ERRA(CONVERT10_S_NO_PRESENTATION) + CHK_ERRA(MK_S_REDUCED_TO_SELF) + CHK_ERRA(MK_S_ME) + CHK_ERRA(MK_S_HIM) + CHK_ERRA(MK_S_US) + CHK_ERRA(MK_S_MONIKERALREADYREGISTERED) + CHK_ERRA(CO_E_CLASS_CREATE_FAILED) + CHK_ERRA(CO_E_SCM_ERROR) + CHK_ERRA(CO_E_SCM_RPC_FAILURE) + CHK_ERRA(CO_E_BAD_PATH) + CHK_ERRA(CO_E_SERVER_EXEC_FAILURE) + CHK_ERRA(CO_E_OBJSRV_RPC_FAILURE) + CHK_ERRA(MK_E_NO_NORMALIZED) + CHK_ERRA(CO_E_SERVER_STOPPING) + CHK_ERRA(MEM_E_INVALID_ROOT) + CHK_ERRA(MEM_E_INVALID_LINK) + CHK_ERRA(MEM_E_INVALID_SIZE) + CHK_ERRA(CO_S_NOTALLINTERFACES) + CHK_ERRA(DISP_E_UNKNOWNINTERFACE) + CHK_ERRA(DISP_E_MEMBERNOTFOUND) + CHK_ERRA(DISP_E_PARAMNOTFOUND) + CHK_ERRA(DISP_E_TYPEMISMATCH) + CHK_ERRA(DISP_E_UNKNOWNNAME) + CHK_ERRA(DISP_E_NONAMEDARGS) + CHK_ERRA(DISP_E_BADVARTYPE) + CHK_ERRA(DISP_E_EXCEPTION) + CHK_ERRA(DISP_E_OVERFLOW) + CHK_ERRA(DISP_E_BADINDEX) + CHK_ERRA(DISP_E_UNKNOWNLCID) + CHK_ERRA(DISP_E_ARRAYISLOCKED) + CHK_ERRA(DISP_E_BADPARAMCOUNT) + CHK_ERRA(DISP_E_PARAMNOTOPTIONAL) + CHK_ERRA(DISP_E_BADCALLEE) + CHK_ERRA(DISP_E_NOTACOLLECTION) + CHK_ERRA(DISP_E_DIVBYZERO) + CHK_ERRA(DISP_E_BUFFERTOOSMALL) + CHK_ERRA(TYPE_E_BUFFERTOOSMALL) + CHK_ERRA(TYPE_E_FIELDNOTFOUND) + CHK_ERRA(TYPE_E_INVDATAREAD) + CHK_ERRA(TYPE_E_UNSUPFORMAT) + CHK_ERRA(TYPE_E_REGISTRYACCESS) + CHK_ERRA(TYPE_E_LIBNOTREGISTERED) + CHK_ERRA(TYPE_E_UNDEFINEDTYPE) + CHK_ERRA(TYPE_E_QUALIFIEDNAMEDISALLOWED) + CHK_ERRA(TYPE_E_INVALIDSTATE) + CHK_ERRA(TYPE_E_WRONGTYPEKIND) + CHK_ERRA(TYPE_E_ELEMENTNOTFOUND) + CHK_ERRA(TYPE_E_AMBIGUOUSNAME) + CHK_ERRA(TYPE_E_NAMECONFLICT) + CHK_ERRA(TYPE_E_UNKNOWNLCID) + CHK_ERRA(TYPE_E_DLLFUNCTIONNOTFOUND) + CHK_ERRA(TYPE_E_BADMODULEKIND) + CHK_ERRA(TYPE_E_SIZETOOBIG) + CHK_ERRA(TYPE_E_DUPLICATEID) + CHK_ERRA(TYPE_E_INVALIDID) + CHK_ERRA(TYPE_E_TYPEMISMATCH) + CHK_ERRA(TYPE_E_OUTOFBOUNDS) + CHK_ERRA(TYPE_E_IOERROR) + CHK_ERRA(TYPE_E_CANTCREATETMPFILE) + CHK_ERRA(TYPE_E_CANTLOADLIBRARY) + CHK_ERRA(TYPE_E_INCONSISTENTPROPFUNCS) + CHK_ERRA(TYPE_E_CIRCULARTYPE) + CHK_ERRA(STG_E_INVALIDFUNCTION) + CHK_ERRA(STG_E_FILENOTFOUND) + CHK_ERRA(STG_E_PATHNOTFOUND) + CHK_ERRA(STG_E_TOOMANYOPENFILES) + CHK_ERRA(STG_E_ACCESSDENIED) + CHK_ERRA(STG_E_INVALIDHANDLE) + CHK_ERRA(STG_E_INSUFFICIENTMEMORY) + CHK_ERRA(STG_E_INVALIDPOINTER) + CHK_ERRA(STG_E_NOMOREFILES) + CHK_ERRA(STG_E_DISKISWRITEPROTECTED) + CHK_ERRA(STG_E_SEEKERROR) + CHK_ERRA(STG_E_WRITEFAULT) + CHK_ERRA(STG_E_READFAULT) + CHK_ERRA(STG_E_SHAREVIOLATION) + CHK_ERRA(STG_E_LOCKVIOLATION) + CHK_ERRA(STG_E_FILEALREADYEXISTS) + CHK_ERRA(STG_E_INVALIDPARAMETER) + CHK_ERRA(STG_E_MEDIUMFULL) + CHK_ERRA(STG_E_PROPSETMISMATCHED) + CHK_ERRA(STG_E_ABNORMALAPIEXIT) + CHK_ERRA(STG_E_INVALIDHEADER) + CHK_ERRA(STG_E_INVALIDNAME) + CHK_ERRA(STG_E_UNKNOWN) + CHK_ERRA(STG_E_UNIMPLEMENTEDFUNCTION) + CHK_ERRA(STG_E_INVALIDFLAG) + CHK_ERRA(STG_E_INUSE) + CHK_ERRA(STG_E_NOTCURRENT) + CHK_ERRA(STG_E_REVERTED) + CHK_ERRA(STG_E_CANTSAVE) + CHK_ERRA(STG_E_OLDFORMAT) + CHK_ERRA(STG_E_OLDDLL) + CHK_ERRA(STG_E_SHAREREQUIRED) + CHK_ERRA(STG_E_NOTFILEBASEDSTORAGE) + CHK_ERRA(STG_E_EXTANTMARSHALLINGS) + CHK_ERRA(STG_E_DOCFILECORRUPT) + CHK_ERRA(STG_E_BADBASEADDRESS) + CHK_ERRA(STG_E_DOCFILETOOLARGE) + CHK_ERRA(STG_E_NOTSIMPLEFORMAT) + CHK_ERRA(STG_E_INCOMPLETE) + CHK_ERRA(STG_E_TERMINATED) + CHK_ERRA(STG_S_CONVERTED) + CHK_ERRA(STG_S_BLOCK) + CHK_ERRA(STG_S_RETRYNOW) + CHK_ERRA(STG_S_MONITORING) + CHK_ERRA(STG_S_MULTIPLEOPENS) + CHK_ERRA(STG_S_CONSOLIDATIONFAILED) + CHK_ERRA(STG_S_CANNOTCONSOLIDATE) + CHK_ERRA(RPC_E_CALL_REJECTED) + CHK_ERRA(RPC_E_CALL_CANCELED) + CHK_ERRA(RPC_E_CANTPOST_INSENDCALL) + CHK_ERRA(RPC_E_CANTCALLOUT_INASYNCCALL) + CHK_ERRA(RPC_E_CANTCALLOUT_INEXTERNALCALL) + CHK_ERRA(RPC_E_CONNECTION_TERMINATED) + CHK_ERRA(RPC_E_SERVER_DIED) + CHK_ERRA(RPC_E_CLIENT_DIED) + CHK_ERRA(RPC_E_INVALID_DATAPACKET) + CHK_ERRA(RPC_E_CANTTRANSMIT_CALL) + CHK_ERRA(RPC_E_CLIENT_CANTMARSHAL_DATA) + CHK_ERRA(RPC_E_CLIENT_CANTUNMARSHAL_DATA) + CHK_ERRA(RPC_E_SERVER_CANTMARSHAL_DATA) + CHK_ERRA(RPC_E_SERVER_CANTUNMARSHAL_DATA) + CHK_ERRA(RPC_E_INVALID_DATA) + CHK_ERRA(RPC_E_INVALID_PARAMETER) + CHK_ERRA(RPC_E_CANTCALLOUT_AGAIN) + CHK_ERRA(RPC_E_SERVER_DIED_DNE) + CHK_ERRA(RPC_E_SYS_CALL_FAILED) + CHK_ERRA(RPC_E_OUT_OF_RESOURCES) + CHK_ERRA(RPC_E_ATTEMPTED_MULTITHREAD) + CHK_ERRA(RPC_E_NOT_REGISTERED) + CHK_ERRA(RPC_E_FAULT) + CHK_ERRA(RPC_E_SERVERFAULT) + CHK_ERRA(RPC_E_CHANGED_MODE) + CHK_ERRA(RPC_E_INVALIDMETHOD) + CHK_ERRA(RPC_E_DISCONNECTED) + CHK_ERRA(RPC_E_RETRY) + CHK_ERRA(RPC_E_SERVERCALL_RETRYLATER) + CHK_ERRA(RPC_E_SERVERCALL_REJECTED) + CHK_ERRA(RPC_E_INVALID_CALLDATA) + CHK_ERRA(RPC_E_CANTCALLOUT_ININPUTSYNCCALL) + CHK_ERRA(RPC_E_WRONG_THREAD) + CHK_ERRA(RPC_E_THREAD_NOT_INIT) + CHK_ERRA(RPC_E_VERSION_MISMATCH) + CHK_ERRA(RPC_E_INVALID_HEADER) + CHK_ERRA(RPC_E_INVALID_EXTENSION) + CHK_ERRA(RPC_E_INVALID_IPID) + CHK_ERRA(RPC_E_INVALID_OBJECT) + CHK_ERRA(RPC_S_CALLPENDING) + CHK_ERRA(RPC_S_WAITONTIMER) + CHK_ERRA(RPC_E_CALL_COMPLETE) + CHK_ERRA(RPC_E_UNSECURE_CALL) + CHK_ERRA(RPC_E_TOO_LATE) + CHK_ERRA(RPC_E_NO_GOOD_SECURITY_PACKAGES) + CHK_ERRA(RPC_E_ACCESS_DENIED) + CHK_ERRA(RPC_E_REMOTE_DISABLED) + CHK_ERRA(RPC_E_INVALID_OBJREF) + CHK_ERRA(RPC_E_NO_CONTEXT) + CHK_ERRA(RPC_E_TIMEOUT) + CHK_ERRA(RPC_E_NO_SYNC) + CHK_ERRA(RPC_E_FULLSIC_REQUIRED) + CHK_ERRA(RPC_E_INVALID_STD_NAME) + CHK_ERRA(CO_E_FAILEDTOIMPERSONATE) + CHK_ERRA(CO_E_FAILEDTOGETSECCTX) + CHK_ERRA(CO_E_FAILEDTOOPENTHREADTOKEN) + CHK_ERRA(CO_E_FAILEDTOGETTOKENINFO) + CHK_ERRA(CO_E_TRUSTEEDOESNTMATCHCLIENT) + CHK_ERRA(CO_E_FAILEDTOQUERYCLIENTBLANKET) + CHK_ERRA(CO_E_FAILEDTOSETDACL) + CHK_ERRA(CO_E_ACCESSCHECKFAILED) + CHK_ERRA(CO_E_NETACCESSAPIFAILED) + CHK_ERRA(CO_E_WRONGTRUSTEENAMESYNTAX) + CHK_ERRA(CO_E_INVALIDSID) + CHK_ERRA(CO_E_CONVERSIONFAILED) + CHK_ERRA(CO_E_NOMATCHINGSIDFOUND) + CHK_ERRA(CO_E_LOOKUPACCSIDFAILED) + CHK_ERRA(CO_E_NOMATCHINGNAMEFOUND) + CHK_ERRA(CO_E_LOOKUPACCNAMEFAILED) + CHK_ERRA(CO_E_SETSERLHNDLFAILED) + CHK_ERRA(CO_E_FAILEDTOGETWINDIR) + CHK_ERRA(CO_E_PATHTOOLONG) + CHK_ERRA(CO_E_FAILEDTOGENUUID) + CHK_ERRA(CO_E_FAILEDTOCREATEFILE) + CHK_ERRA(CO_E_FAILEDTOCLOSEHANDLE) + CHK_ERRA(CO_E_EXCEEDSYSACLLIMIT) + CHK_ERRA(CO_E_ACESINWRONGORDER) + CHK_ERRA(CO_E_INCOMPATIBLESTREAMVERSION) + CHK_ERRA(CO_E_FAILEDTOOPENPROCESSTOKEN) + CHK_ERRA(CO_E_DECODEFAILED) + CHK_ERRA(CO_E_ACNOTINITIALIZED) + CHK_ERRA(RPC_E_UNEXPECTED) + CHK_ERRA(NTE_BAD_UID) + CHK_ERRA(NTE_BAD_HASH) + CHK_ERRA(NTE_BAD_KEY) + CHK_ERRA(NTE_BAD_LEN) + CHK_ERRA(NTE_BAD_DATA) + CHK_ERRA(NTE_BAD_SIGNATURE) + CHK_ERRA(NTE_BAD_VER) + CHK_ERRA(NTE_BAD_ALGID) + CHK_ERRA(NTE_BAD_FLAGS) + CHK_ERRA(NTE_BAD_TYPE) + CHK_ERRA(NTE_BAD_KEY_STATE) + CHK_ERRA(NTE_BAD_HASH_STATE) + CHK_ERRA(NTE_NO_KEY) + CHK_ERRA(NTE_NO_MEMORY) + CHK_ERRA(NTE_EXISTS) + CHK_ERRA(NTE_PERM) + CHK_ERRA(NTE_NOT_FOUND) + CHK_ERRA(NTE_DOUBLE_ENCRYPT) + CHK_ERRA(NTE_BAD_PROVIDER) + CHK_ERRA(NTE_BAD_PROV_TYPE) + CHK_ERRA(NTE_BAD_PUBLIC_KEY) + CHK_ERRA(NTE_BAD_KEYSET) + CHK_ERRA(NTE_PROV_TYPE_NOT_DEF) + CHK_ERRA(NTE_PROV_TYPE_ENTRY_BAD) + CHK_ERRA(NTE_KEYSET_NOT_DEF) + CHK_ERRA(NTE_KEYSET_ENTRY_BAD) + CHK_ERRA(NTE_PROV_TYPE_NO_MATCH) + CHK_ERRA(NTE_SIGNATURE_FILE_BAD) + CHK_ERRA(NTE_PROVIDER_DLL_FAIL) + CHK_ERRA(NTE_PROV_DLL_NOT_FOUND) + CHK_ERRA(NTE_BAD_KEYSET_PARAM) + CHK_ERRA(NTE_FAIL) + CHK_ERRA(NTE_SYS_ERR) + CHK_ERRA(NTE_SILENT_CONTEXT) + CHK_ERRA(NTE_TOKEN_KEYSET_STORAGE_FULL) + CHK_ERRA(CRYPT_E_MSG_ERROR) + CHK_ERRA(CRYPT_E_UNKNOWN_ALGO) + CHK_ERRA(CRYPT_E_OID_FORMAT) + CHK_ERRA(CRYPT_E_INVALID_MSG_TYPE) + CHK_ERRA(CRYPT_E_UNEXPECTED_ENCODING) + CHK_ERRA(CRYPT_E_AUTH_ATTR_MISSING) + CHK_ERRA(CRYPT_E_HASH_VALUE) + CHK_ERRA(CRYPT_E_INVALID_INDEX) + CHK_ERRA(CRYPT_E_ALREADY_DECRYPTED) + CHK_ERRA(CRYPT_E_NOT_DECRYPTED) + CHK_ERRA(CRYPT_E_RECIPIENT_NOT_FOUND) + CHK_ERRA(CRYPT_E_CONTROL_TYPE) + CHK_ERRA(CRYPT_E_ISSUER_SERIALNUMBER) + CHK_ERRA(CRYPT_E_SIGNER_NOT_FOUND) + CHK_ERRA(CRYPT_E_ATTRIBUTES_MISSING) + CHK_ERRA(CRYPT_E_STREAM_MSG_NOT_READY) + CHK_ERRA(CRYPT_E_STREAM_INSUFFICIENT_DATA) + CHK_ERRA(CRYPT_E_BAD_LEN) + CHK_ERRA(CRYPT_E_BAD_ENCODE) + CHK_ERRA(CRYPT_E_FILE_ERROR) + CHK_ERRA(CRYPT_E_NOT_FOUND) + CHK_ERRA(CRYPT_E_EXISTS) + CHK_ERRA(CRYPT_E_NO_PROVIDER) + CHK_ERRA(CRYPT_E_SELF_SIGNED) + CHK_ERRA(CRYPT_E_DELETED_PREV) + CHK_ERRA(CRYPT_E_NO_MATCH) + CHK_ERRA(CRYPT_E_UNEXPECTED_MSG_TYPE) + CHK_ERRA(CRYPT_E_NO_KEY_PROPERTY) + CHK_ERRA(CRYPT_E_NO_DECRYPT_CERT) + CHK_ERRA(CRYPT_E_BAD_MSG) + CHK_ERRA(CRYPT_E_NO_SIGNER) + CHK_ERRA(CRYPT_E_PENDING_CLOSE) + CHK_ERRA(CRYPT_E_REVOKED) + CHK_ERRA(CRYPT_E_NO_REVOCATION_DLL) + CHK_ERRA(CRYPT_E_NO_REVOCATION_CHECK) + CHK_ERRA(CRYPT_E_REVOCATION_OFFLINE) + CHK_ERRA(CRYPT_E_NOT_IN_REVOCATION_DATABASE) + CHK_ERRA(CRYPT_E_INVALID_NUMERIC_STRING) + CHK_ERRA(CRYPT_E_INVALID_PRINTABLE_STRING) + CHK_ERRA(CRYPT_E_INVALID_IA5_STRING) + CHK_ERRA(CRYPT_E_INVALID_X500_STRING) + CHK_ERRA(CRYPT_E_NOT_CHAR_STRING) + CHK_ERRA(CRYPT_E_FILERESIZED) + CHK_ERRA(CRYPT_E_SECURITY_SETTINGS) + CHK_ERRA(CRYPT_E_NO_VERIFY_USAGE_DLL) + CHK_ERRA(CRYPT_E_NO_VERIFY_USAGE_CHECK) + CHK_ERRA(CRYPT_E_VERIFY_USAGE_OFFLINE) + CHK_ERRA(CRYPT_E_NOT_IN_CTL) + CHK_ERRA(CRYPT_E_NO_TRUSTED_SIGNER) + CHK_ERRA(CRYPT_E_OSS_ERROR) + CHK_ERRA(OSS_MORE_BUF) + CHK_ERRA(OSS_NEGATIVE_UINTEGER) + CHK_ERRA(OSS_PDU_RANGE) + CHK_ERRA(OSS_MORE_INPUT) + CHK_ERRA(OSS_DATA_ERROR) + CHK_ERRA(OSS_BAD_ARG) + CHK_ERRA(OSS_BAD_VERSION) + CHK_ERRA(OSS_OUT_MEMORY) + CHK_ERRA(OSS_PDU_MISMATCH) + CHK_ERRA(OSS_LIMITED) + CHK_ERRA(OSS_BAD_PTR) + CHK_ERRA(OSS_BAD_TIME) + CHK_ERRA(OSS_INDEFINITE_NOT_SUPPORTED) + CHK_ERRA(OSS_MEM_ERROR) + CHK_ERRA(OSS_BAD_TABLE) + CHK_ERRA(OSS_TOO_LONG) + CHK_ERRA(OSS_CONSTRAINT_VIOLATED) + CHK_ERRA(OSS_FATAL_ERROR) + CHK_ERRA(OSS_ACCESS_SERIALIZATION_ERROR) + CHK_ERRA(OSS_NULL_TBL) + CHK_ERRA(OSS_NULL_FCN) + CHK_ERRA(OSS_BAD_ENCRULES) + CHK_ERRA(OSS_UNAVAIL_ENCRULES) + CHK_ERRA(OSS_CANT_OPEN_TRACE_WINDOW) + CHK_ERRA(OSS_UNIMPLEMENTED) + CHK_ERRA(OSS_OID_DLL_NOT_LINKED) + CHK_ERRA(OSS_CANT_OPEN_TRACE_FILE) + CHK_ERRA(OSS_TRACE_FILE_ALREADY_OPEN) + CHK_ERRA(OSS_TABLE_MISMATCH) + CHK_ERRA(OSS_TYPE_NOT_SUPPORTED) + CHK_ERRA(OSS_REAL_DLL_NOT_LINKED) + CHK_ERRA(OSS_REAL_CODE_NOT_LINKED) + CHK_ERRA(OSS_OUT_OF_RANGE) + CHK_ERRA(OSS_COPIER_DLL_NOT_LINKED) + CHK_ERRA(OSS_CONSTRAINT_DLL_NOT_LINKED) + CHK_ERRA(OSS_COMPARATOR_DLL_NOT_LINKED) + CHK_ERRA(OSS_COMPARATOR_CODE_NOT_LINKED) + CHK_ERRA(OSS_MEM_MGR_DLL_NOT_LINKED) + CHK_ERRA(OSS_PDV_DLL_NOT_LINKED) + CHK_ERRA(OSS_PDV_CODE_NOT_LINKED) + CHK_ERRA(OSS_API_DLL_NOT_LINKED) + CHK_ERRA(OSS_BERDER_DLL_NOT_LINKED) + CHK_ERRA(OSS_PER_DLL_NOT_LINKED) + CHK_ERRA(OSS_OPEN_TYPE_ERROR) + CHK_ERRA(OSS_MUTEX_NOT_CREATED) + CHK_ERRA(OSS_CANT_CLOSE_TRACE_FILE) + CHK_ERRA(CERTSRV_E_BAD_REQUESTSUBJECT) + CHK_ERRA(CERTSRV_E_NO_REQUEST) + CHK_ERRA(CERTSRV_E_BAD_REQUESTSTATUS) + CHK_ERRA(CERTSRV_E_PROPERTY_EMPTY) + CHK_ERRA(CERTSRV_E_INVALID_CA_CERTIFICATE) + CHK_ERRA(CERTSRV_E_UNSUPPORTED_CERT_TYPE) + CHK_ERRA(CERTSRV_E_NO_CERT_TYPE) + CHK_ERRA(TRUST_E_SYSTEM_ERROR) + CHK_ERRA(TRUST_E_NO_SIGNER_CERT) + CHK_ERRA(TRUST_E_COUNTER_SIGNER) + CHK_ERRA(TRUST_E_CERT_SIGNATURE) + CHK_ERRA(TRUST_E_TIME_STAMP) + CHK_ERRA(TRUST_E_BAD_DIGEST) + CHK_ERRA(TRUST_E_BASIC_CONSTRAINTS) + CHK_ERRA(TRUST_E_FINANCIAL_CRITERIA) +// CHK_ERRA(NTE_OP_OK) + CHK_ERRA(TRUST_E_PROVIDER_UNKNOWN) + CHK_ERRA(TRUST_E_ACTION_UNKNOWN) + CHK_ERRA(TRUST_E_SUBJECT_FORM_UNKNOWN) + CHK_ERRA(TRUST_E_SUBJECT_NOT_TRUSTED) + CHK_ERRA(DIGSIG_E_ENCODE) + CHK_ERRA(DIGSIG_E_DECODE) + CHK_ERRA(DIGSIG_E_EXTENSIBILITY) + CHK_ERRA(DIGSIG_E_CRYPTO) + CHK_ERRA(PERSIST_E_SIZEDEFINITE) + CHK_ERRA(PERSIST_E_SIZEINDEFINITE) + CHK_ERRA(PERSIST_E_NOTSELFSIZING) + CHK_ERRA(TRUST_E_NOSIGNATURE) + CHK_ERRA(CERT_E_EXPIRED) + CHK_ERRA(CERT_E_VALIDITYPERIODNESTING) + CHK_ERRA(CERT_E_ROLE) + CHK_ERRA(CERT_E_PATHLENCONST) + CHK_ERRA(CERT_E_CRITICAL) + CHK_ERRA(CERT_E_PURPOSE) + CHK_ERRA(CERT_E_ISSUERCHAINING) + CHK_ERRA(CERT_E_MALFORMED) + CHK_ERRA(CERT_E_UNTRUSTEDROOT) + CHK_ERRA(CERT_E_CHAINING) + CHK_ERRA(TRUST_E_FAIL) + CHK_ERRA(CERT_E_REVOKED) + CHK_ERRA(CERT_E_UNTRUSTEDTESTROOT) + CHK_ERRA(CERT_E_REVOCATION_FAILURE) + CHK_ERRA(CERT_E_CN_NO_MATCH) + CHK_ERRA(CERT_E_WRONG_USAGE) + CHK_ERRA(SPAPI_E_EXPECTED_SECTION_NAME) + CHK_ERRA(SPAPI_E_BAD_SECTION_NAME_LINE) + CHK_ERRA(SPAPI_E_SECTION_NAME_TOO_LONG) + CHK_ERRA(SPAPI_E_GENERAL_SYNTAX) + CHK_ERRA(SPAPI_E_WRONG_INF_STYLE) + CHK_ERRA(SPAPI_E_SECTION_NOT_FOUND) + CHK_ERRA(SPAPI_E_LINE_NOT_FOUND) + CHK_ERRA(SPAPI_E_NO_BACKUP) + CHK_ERRA(SPAPI_E_NO_ASSOCIATED_CLASS) + CHK_ERRA(SPAPI_E_CLASS_MISMATCH) + CHK_ERRA(SPAPI_E_DUPLICATE_FOUND) + CHK_ERRA(SPAPI_E_NO_DRIVER_SELECTED) + CHK_ERRA(SPAPI_E_KEY_DOES_NOT_EXIST) + CHK_ERRA(SPAPI_E_INVALID_DEVINST_NAME) + CHK_ERRA(SPAPI_E_INVALID_CLASS) + CHK_ERRA(SPAPI_E_DEVINST_ALREADY_EXISTS) + CHK_ERRA(SPAPI_E_DEVINFO_NOT_REGISTERED) + CHK_ERRA(SPAPI_E_INVALID_REG_PROPERTY) + CHK_ERRA(SPAPI_E_NO_INF) + CHK_ERRA(SPAPI_E_NO_SUCH_DEVINST) + CHK_ERRA(SPAPI_E_CANT_LOAD_CLASS_ICON) + CHK_ERRA(SPAPI_E_INVALID_CLASS_INSTALLER) + CHK_ERRA(SPAPI_E_DI_DO_DEFAULT) + CHK_ERRA(SPAPI_E_DI_NOFILECOPY) + CHK_ERRA(SPAPI_E_INVALID_HWPROFILE) + CHK_ERRA(SPAPI_E_NO_DEVICE_SELECTED) + CHK_ERRA(SPAPI_E_DEVINFO_LIST_LOCKED) + CHK_ERRA(SPAPI_E_DEVINFO_DATA_LOCKED) + CHK_ERRA(SPAPI_E_DI_BAD_PATH) + CHK_ERRA(SPAPI_E_NO_CLASSINSTALL_PARAMS) + CHK_ERRA(SPAPI_E_FILEQUEUE_LOCKED) + CHK_ERRA(SPAPI_E_BAD_SERVICE_INSTALLSECT) + CHK_ERRA(SPAPI_E_NO_CLASS_DRIVER_LIST) + CHK_ERRA(SPAPI_E_NO_ASSOCIATED_SERVICE) + CHK_ERRA(SPAPI_E_NO_DEFAULT_DEVICE_INTERFACE) + CHK_ERRA(SPAPI_E_DEVICE_INTERFACE_ACTIVE) + CHK_ERRA(SPAPI_E_DEVICE_INTERFACE_REMOVED) + CHK_ERRA(SPAPI_E_BAD_INTERFACE_INSTALLSECT) + CHK_ERRA(SPAPI_E_NO_SUCH_INTERFACE_CLASS) + CHK_ERRA(SPAPI_E_INVALID_REFERENCE_STRING) + CHK_ERRA(SPAPI_E_INVALID_MACHINENAME) + CHK_ERRA(SPAPI_E_REMOTE_COMM_FAILURE) + CHK_ERRA(SPAPI_E_MACHINE_UNAVAILABLE) + CHK_ERRA(SPAPI_E_NO_CONFIGMGR_SERVICES) + CHK_ERRA(SPAPI_E_INVALID_PROPPAGE_PROVIDER) + CHK_ERRA(SPAPI_E_NO_SUCH_DEVICE_INTERFACE) + CHK_ERRA(SPAPI_E_DI_POSTPROCESSING_REQUIRED) + CHK_ERRA(SPAPI_E_INVALID_COINSTALLER) + CHK_ERRA(SPAPI_E_NO_COMPAT_DRIVERS) + CHK_ERRA(SPAPI_E_NO_DEVICE_ICON) + CHK_ERRA(SPAPI_E_INVALID_INF_LOGCONFIG) + CHK_ERRA(SPAPI_E_DI_DONT_INSTALL) + CHK_ERRA(SPAPI_E_INVALID_FILTER_DRIVER) + CHK_ERRA(SPAPI_E_NON_WINDOWS_NT_DRIVER) + CHK_ERRA(SPAPI_E_NON_WINDOWS_DRIVER) + CHK_ERRA(SPAPI_E_NO_CATALOG_FOR_OEM_INF) + CHK_ERRA(SPAPI_E_DEVINSTALL_QUEUE_NONNATIVE) + CHK_ERRA(SPAPI_E_ERROR_NOT_INSTALLED) +// CHK_ERRA(SCARD_S_SUCCESS) + CHK_ERRA(SCARD_F_INTERNAL_ERROR) + CHK_ERRA(SCARD_E_CANCELLED) + CHK_ERRA(SCARD_E_INVALID_HANDLE) + CHK_ERRA(SCARD_E_INVALID_PARAMETER) + CHK_ERRA(SCARD_E_INVALID_TARGET) + CHK_ERRA(SCARD_E_NO_MEMORY) + CHK_ERRA(SCARD_F_WAITED_TOO_LONG) + CHK_ERRA(SCARD_E_INSUFFICIENT_BUFFER) + CHK_ERRA(SCARD_E_UNKNOWN_READER) + CHK_ERRA(SCARD_E_TIMEOUT) + CHK_ERRA(SCARD_E_SHARING_VIOLATION) + CHK_ERRA(SCARD_E_NO_SMARTCARD) + CHK_ERRA(SCARD_E_UNKNOWN_CARD) + CHK_ERRA(SCARD_E_CANT_DISPOSE) + CHK_ERRA(SCARD_E_PROTO_MISMATCH) + CHK_ERRA(SCARD_E_NOT_READY) + CHK_ERRA(SCARD_E_INVALID_VALUE) + CHK_ERRA(SCARD_E_SYSTEM_CANCELLED) + CHK_ERRA(SCARD_F_COMM_ERROR) + CHK_ERRA(SCARD_F_UNKNOWN_ERROR) + CHK_ERRA(SCARD_E_INVALID_ATR) + CHK_ERRA(SCARD_E_NOT_TRANSACTED) + CHK_ERRA(SCARD_E_READER_UNAVAILABLE) + CHK_ERRA(SCARD_P_SHUTDOWN) + CHK_ERRA(SCARD_E_PCI_TOO_SMALL) + CHK_ERRA(SCARD_E_READER_UNSUPPORTED) + CHK_ERRA(SCARD_E_DUPLICATE_READER) + CHK_ERRA(SCARD_E_CARD_UNSUPPORTED) + CHK_ERRA(SCARD_E_NO_SERVICE) + CHK_ERRA(SCARD_E_SERVICE_STOPPED) + CHK_ERRA(SCARD_E_UNEXPECTED) + CHK_ERRA(SCARD_E_ICC_INSTALLATION) + CHK_ERRA(SCARD_E_ICC_CREATEORDER) + CHK_ERRA(SCARD_E_UNSUPPORTED_FEATURE) + CHK_ERRA(SCARD_E_DIR_NOT_FOUND) + CHK_ERRA(SCARD_E_FILE_NOT_FOUND) + CHK_ERRA(SCARD_E_NO_DIR) + CHK_ERRA(SCARD_E_NO_FILE) + CHK_ERRA(SCARD_E_NO_ACCESS) + CHK_ERRA(SCARD_E_WRITE_TOO_MANY) + CHK_ERRA(SCARD_E_BAD_SEEK) + CHK_ERRA(SCARD_E_INVALID_CHV) + CHK_ERRA(SCARD_E_UNKNOWN_RES_MNG) + CHK_ERRA(SCARD_E_NO_SUCH_CERTIFICATE) + CHK_ERRA(SCARD_E_CERTIFICATE_UNAVAILABLE) + CHK_ERRA(SCARD_E_NO_READERS_AVAILABLE) + CHK_ERRA(SCARD_E_COMM_DATA_LOST) + CHK_ERRA(SCARD_W_UNSUPPORTED_CARD) + CHK_ERRA(SCARD_W_UNRESPONSIVE_CARD) + CHK_ERRA(SCARD_W_UNPOWERED_CARD) + CHK_ERRA(SCARD_W_RESET_CARD) + CHK_ERRA(SCARD_W_REMOVED_CARD) + CHK_ERRA(SCARD_W_SECURITY_VIOLATION) + CHK_ERRA(SCARD_W_WRONG_CHV) + CHK_ERRA(SCARD_W_CHV_BLOCKED) + CHK_ERRA(SCARD_W_EOF) + CHK_ERRA(SCARD_W_CANCELLED_BY_USER) + CHK_ERR_WIN32_ONLY(ERROR_INVALID_FUNCTION, "ERROR_INVALID_FUNCTION") + CHK_ERR_WIN32A(ERROR_FILE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_PATH_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_TOO_MANY_OPEN_FILES) + CHK_ERRA(ERROR_ACCESS_DENIED) + CHK_ERRA(ERROR_INVALID_HANDLE) + CHK_ERR_WIN32A(ERROR_ARENA_TRASHED) + CHK_ERR_WIN32A(ERROR_NOT_ENOUGH_MEMORY) + CHK_ERR_WIN32A(ERROR_INVALID_BLOCK) + CHK_ERR_WIN32A(ERROR_BAD_ENVIRONMENT) + CHK_ERR_WIN32A(ERROR_BAD_FORMAT) + CHK_ERR_WIN32A(ERROR_INVALID_ACCESS) + CHK_ERR_WIN32A(ERROR_INVALID_DATA) + CHK_ERRA(ERROR_OUTOFMEMORY) + CHK_ERR_WIN32A(ERROR_INVALID_DRIVE) + CHK_ERR_WIN32A(ERROR_CURRENT_DIRECTORY) + CHK_ERR_WIN32A(ERROR_NOT_SAME_DEVICE) + CHK_ERR_WIN32A(ERROR_NO_MORE_FILES) + CHK_ERR_WIN32A(ERROR_WRITE_PROTECT) + CHK_ERR_WIN32A(ERROR_BAD_UNIT) + CHK_ERR_WIN32A(ERROR_NOT_READY) + CHK_ERR_WIN32A(ERROR_BAD_COMMAND) + CHK_ERR_WIN32A(ERROR_CRC) + CHK_ERR_WIN32A(ERROR_BAD_LENGTH) + CHK_ERR_WIN32A(ERROR_SEEK) + CHK_ERR_WIN32A(ERROR_NOT_DOS_DISK) + CHK_ERR_WIN32A(ERROR_SECTOR_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_OUT_OF_PAPER) + CHK_ERR_WIN32A(ERROR_WRITE_FAULT) + CHK_ERR_WIN32A(ERROR_READ_FAULT) + CHK_ERR_WIN32A(ERROR_GEN_FAILURE) + CHK_ERR_WIN32A(ERROR_SHARING_VIOLATION) + CHK_ERR_WIN32A(ERROR_LOCK_VIOLATION) + CHK_ERR_WIN32A(ERROR_WRONG_DISK) + CHK_ERR_WIN32A(ERROR_SHARING_BUFFER_EXCEEDED) + CHK_ERR_WIN32A(ERROR_HANDLE_EOF) + CHK_ERR_WIN32A(ERROR_HANDLE_DISK_FULL) + CHK_ERR_WIN32A(ERROR_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_REM_NOT_LIST) + CHK_ERR_WIN32A(ERROR_DUP_NAME) + CHK_ERR_WIN32A(ERROR_BAD_NETPATH) + CHK_ERR_WIN32A(ERROR_NETWORK_BUSY) + CHK_ERR_WIN32A(ERROR_DEV_NOT_EXIST) + CHK_ERR_WIN32A(ERROR_TOO_MANY_CMDS) + CHK_ERR_WIN32A(ERROR_ADAP_HDW_ERR) + CHK_ERR_WIN32A(ERROR_BAD_NET_RESP) + CHK_ERR_WIN32A(ERROR_UNEXP_NET_ERR) + CHK_ERR_WIN32A(ERROR_BAD_REM_ADAP) + CHK_ERR_WIN32A(ERROR_PRINTQ_FULL) + CHK_ERR_WIN32A(ERROR_NO_SPOOL_SPACE) + CHK_ERR_WIN32A(ERROR_PRINT_CANCELLED) + CHK_ERR_WIN32A(ERROR_NETNAME_DELETED) + CHK_ERR_WIN32A(ERROR_NETWORK_ACCESS_DENIED) + CHK_ERR_WIN32A(ERROR_BAD_DEV_TYPE) + CHK_ERR_WIN32A(ERROR_BAD_NET_NAME) + CHK_ERR_WIN32A(ERROR_TOO_MANY_NAMES) + CHK_ERR_WIN32A(ERROR_TOO_MANY_SESS) + CHK_ERR_WIN32A(ERROR_SHARING_PAUSED) + CHK_ERR_WIN32A(ERROR_REQ_NOT_ACCEP) + CHK_ERR_WIN32A(ERROR_REDIR_PAUSED) + CHK_ERR_WIN32A(ERROR_FILE_EXISTS) + CHK_ERR_WIN32A(ERROR_CANNOT_MAKE) + CHK_ERR_WIN32A(ERROR_FAIL_I24) + CHK_ERR_WIN32A(ERROR_OUT_OF_STRUCTURES) + CHK_ERR_WIN32A(ERROR_ALREADY_ASSIGNED) + CHK_ERR_WIN32A(ERROR_INVALID_PASSWORD) + CHK_ERRA(ERROR_INVALID_PARAMETER) + CHK_ERR_WIN32A(ERROR_NET_WRITE_FAULT) + CHK_ERR_WIN32A(ERROR_NO_PROC_SLOTS) + CHK_ERR_WIN32A(ERROR_TOO_MANY_SEMAPHORES) + CHK_ERR_WIN32A(ERROR_EXCL_SEM_ALREADY_OWNED) + CHK_ERR_WIN32A(ERROR_SEM_IS_SET) + CHK_ERR_WIN32A(ERROR_TOO_MANY_SEM_REQUESTS) + CHK_ERR_WIN32A(ERROR_INVALID_AT_INTERRUPT_TIME) + CHK_ERR_WIN32A(ERROR_SEM_OWNER_DIED) + CHK_ERR_WIN32A(ERROR_SEM_USER_LIMIT) + CHK_ERR_WIN32A(ERROR_DISK_CHANGE) + CHK_ERR_WIN32A(ERROR_DRIVE_LOCKED) + CHK_ERR_WIN32A(ERROR_BROKEN_PIPE) + CHK_ERR_WIN32A(ERROR_OPEN_FAILED) + CHK_ERR_WIN32A(ERROR_BUFFER_OVERFLOW) + CHK_ERR_WIN32A(ERROR_DISK_FULL) + CHK_ERR_WIN32A(ERROR_NO_MORE_SEARCH_HANDLES) + CHK_ERR_WIN32A(ERROR_INVALID_TARGET_HANDLE) + CHK_ERR_WIN32A(ERROR_INVALID_CATEGORY) + CHK_ERR_WIN32A(ERROR_INVALID_VERIFY_SWITCH) + CHK_ERR_WIN32A(ERROR_BAD_DRIVER_LEVEL) + CHK_ERR_WIN32A(ERROR_CALL_NOT_IMPLEMENTED) + CHK_ERR_WIN32A(ERROR_SEM_TIMEOUT) + CHK_ERR_WIN32A(ERROR_INSUFFICIENT_BUFFER) + CHK_ERR_WIN32A(ERROR_INVALID_NAME) + CHK_ERR_WIN32A(ERROR_INVALID_LEVEL) + CHK_ERR_WIN32A(ERROR_NO_VOLUME_LABEL) + CHK_ERR_WIN32A(ERROR_MOD_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_PROC_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_WAIT_NO_CHILDREN) + CHK_ERR_WIN32A(ERROR_CHILD_NOT_COMPLETE) + CHK_ERR_WIN32A(ERROR_DIRECT_ACCESS_HANDLE) + CHK_ERR_WIN32A(ERROR_NEGATIVE_SEEK) + CHK_ERR_WIN32A(ERROR_SEEK_ON_DEVICE) + CHK_ERR_WIN32A(ERROR_IS_JOIN_TARGET) + CHK_ERR_WIN32A(ERROR_IS_JOINED) + CHK_ERR_WIN32A(ERROR_IS_SUBSTED) + CHK_ERR_WIN32A(ERROR_NOT_JOINED) + CHK_ERR_WIN32A(ERROR_NOT_SUBSTED) + CHK_ERR_WIN32A(ERROR_JOIN_TO_JOIN) + CHK_ERR_WIN32A(ERROR_SUBST_TO_SUBST) + CHK_ERR_WIN32A(ERROR_JOIN_TO_SUBST) + CHK_ERR_WIN32A(ERROR_SUBST_TO_JOIN) + CHK_ERR_WIN32A(ERROR_BUSY_DRIVE) + CHK_ERR_WIN32A(ERROR_SAME_DRIVE) + CHK_ERR_WIN32A(ERROR_DIR_NOT_ROOT) + CHK_ERR_WIN32A(ERROR_DIR_NOT_EMPTY) + CHK_ERR_WIN32A(ERROR_IS_SUBST_PATH) + CHK_ERR_WIN32A(ERROR_IS_JOIN_PATH) + CHK_ERR_WIN32A(ERROR_PATH_BUSY) + CHK_ERR_WIN32A(ERROR_IS_SUBST_TARGET) + CHK_ERR_WIN32A(ERROR_SYSTEM_TRACE) + CHK_ERR_WIN32A(ERROR_INVALID_EVENT_COUNT) + CHK_ERR_WIN32A(ERROR_TOO_MANY_MUXWAITERS) + CHK_ERR_WIN32A(ERROR_INVALID_LIST_FORMAT) + CHK_ERR_WIN32A(ERROR_LABEL_TOO_LONG) + CHK_ERR_WIN32A(ERROR_TOO_MANY_TCBS) + CHK_ERR_WIN32A(ERROR_SIGNAL_REFUSED) + CHK_ERR_WIN32A(ERROR_DISCARDED) + CHK_ERR_WIN32A(ERROR_NOT_LOCKED) + CHK_ERR_WIN32A(ERROR_BAD_THREADID_ADDR) + CHK_ERR_WIN32A(ERROR_BAD_ARGUMENTS) + CHK_ERR_WIN32A(ERROR_BAD_PATHNAME) + CHK_ERR_WIN32A(ERROR_SIGNAL_PENDING) + CHK_ERR_WIN32A(ERROR_MAX_THRDS_REACHED) + CHK_ERR_WIN32A(ERROR_LOCK_FAILED) + CHK_ERR_WIN32A(ERROR_BUSY) + CHK_ERR_WIN32A(ERROR_CANCEL_VIOLATION) + CHK_ERR_WIN32A(ERROR_ATOMIC_LOCKS_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_INVALID_SEGMENT_NUMBER) + CHK_ERR_WIN32A(ERROR_INVALID_ORDINAL) + CHK_ERR_WIN32A(ERROR_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_INVALID_FLAG_NUMBER) + CHK_ERR_WIN32A(ERROR_SEM_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_INVALID_STARTING_CODESEG) + CHK_ERR_WIN32A(ERROR_INVALID_STACKSEG) + CHK_ERR_WIN32A(ERROR_INVALID_MODULETYPE) + CHK_ERR_WIN32A(ERROR_INVALID_EXE_SIGNATURE) + CHK_ERR_WIN32A(ERROR_EXE_MARKED_INVALID) + CHK_ERR_WIN32A(ERROR_BAD_EXE_FORMAT) + CHK_ERR_WIN32A(ERROR_ITERATED_DATA_EXCEEDS_64k) + CHK_ERR_WIN32A(ERROR_INVALID_MINALLOCSIZE) + CHK_ERR_WIN32A(ERROR_DYNLINK_FROM_INVALID_RING) + CHK_ERR_WIN32A(ERROR_IOPL_NOT_ENABLED) + CHK_ERR_WIN32A(ERROR_INVALID_SEGDPL) + CHK_ERR_WIN32A(ERROR_AUTODATASEG_EXCEEDS_64k) + CHK_ERRA(ERROR_RING2SEG_MUST_BE_MOVABLE) + CHK_ERRA(ERROR_RELOC_CHAIN_XEEDS_SEGLIM) + CHK_ERR_WIN32A(ERROR_INFLOOP_IN_RELOC_CHAIN) + CHK_ERR_WIN32A(ERROR_ENVVAR_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_NO_SIGNAL_SENT) + CHK_ERR_WIN32A(ERROR_FILENAME_EXCED_RANGE) + CHK_ERR_WIN32A(ERROR_RING2_STACK_IN_USE) + CHK_ERR_WIN32A(ERROR_META_EXPANSION_TOO_LONG) + CHK_ERR_WIN32A(ERROR_INVALID_SIGNAL_NUMBER) + CHK_ERR_WIN32A(ERROR_THREAD_1_INACTIVE) + CHK_ERR_WIN32A(ERROR_LOCKED) + CHK_ERR_WIN32A(ERROR_TOO_MANY_MODULES) + CHK_ERR_WIN32A(ERROR_NESTING_NOT_ALLOWED) + CHK_ERR_WIN32A(ERROR_EXE_MACHINE_TYPE_MISMATCH) + CHK_ERR_WIN32A(ERROR_BAD_PIPE) + CHK_ERR_WIN32A(ERROR_PIPE_BUSY) + CHK_ERR_WIN32A(ERROR_NO_DATA) + CHK_ERR_WIN32A(ERROR_PIPE_NOT_CONNECTED) + CHK_ERR_WIN32A(ERROR_MORE_DATA) + CHK_ERR_WIN32A(ERROR_VC_DISCONNECTED) + CHK_ERR_WIN32A(ERROR_INVALID_EA_NAME) + CHK_ERR_WIN32A(ERROR_EA_LIST_INCONSISTENT) + CHK_ERR_WIN32A(WAIT_TIMEOUT) + CHK_ERR_WIN32A(ERROR_NO_MORE_ITEMS) + CHK_ERR_WIN32A(ERROR_CANNOT_COPY) + CHK_ERR_WIN32A(ERROR_DIRECTORY) + CHK_ERR_WIN32A(ERROR_EAS_DIDNT_FIT) + CHK_ERR_WIN32A(ERROR_EA_FILE_CORRUPT) + CHK_ERR_WIN32A(ERROR_EA_TABLE_FULL) + CHK_ERR_WIN32A(ERROR_INVALID_EA_HANDLE) + CHK_ERR_WIN32A(ERROR_EAS_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_NOT_OWNER) + CHK_ERR_WIN32A(ERROR_TOO_MANY_POSTS) + CHK_ERR_WIN32A(ERROR_PARTIAL_COPY) + CHK_ERR_WIN32A(ERROR_OPLOCK_NOT_GRANTED) + CHK_ERR_WIN32A(ERROR_INVALID_OPLOCK_PROTOCOL) + CHK_ERR_WIN32A(ERROR_MR_MID_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_INVALID_ADDRESS) + CHK_ERR_WIN32A(ERROR_ARITHMETIC_OVERFLOW) + CHK_ERR_WIN32A(ERROR_PIPE_CONNECTED) + CHK_ERR_WIN32A(ERROR_PIPE_LISTENING) + CHK_ERR_WIN32A(ERROR_EA_ACCESS_DENIED) + CHK_ERR_WIN32A(ERROR_OPERATION_ABORTED) + CHK_ERR_WIN32A(ERROR_IO_INCOMPLETE) + CHK_ERR_WIN32A(ERROR_IO_PENDING) + CHK_ERR_WIN32A(ERROR_NOACCESS) + CHK_ERR_WIN32A(ERROR_SWAPERROR) + CHK_ERR_WIN32A(ERROR_STACK_OVERFLOW) + CHK_ERR_WIN32A(ERROR_INVALID_MESSAGE) + CHK_ERR_WIN32A(ERROR_CAN_NOT_COMPLETE) + CHK_ERR_WIN32A(ERROR_INVALID_FLAGS) + CHK_ERR_WIN32A(ERROR_UNRECOGNIZED_VOLUME) + CHK_ERR_WIN32A(ERROR_FILE_INVALID) + CHK_ERR_WIN32A(ERROR_FULLSCREEN_MODE) + CHK_ERR_WIN32A(ERROR_NO_TOKEN) + CHK_ERR_WIN32A(ERROR_BADDB) + CHK_ERR_WIN32A(ERROR_BADKEY) + CHK_ERR_WIN32A(ERROR_CANTOPEN) + CHK_ERR_WIN32A(ERROR_CANTREAD) + CHK_ERR_WIN32A(ERROR_CANTWRITE) + CHK_ERR_WIN32A(ERROR_REGISTRY_RECOVERED) + CHK_ERR_WIN32A(ERROR_REGISTRY_CORRUPT) + CHK_ERR_WIN32A(ERROR_REGISTRY_IO_FAILED) + CHK_ERR_WIN32A(ERROR_NOT_REGISTRY_FILE) + CHK_ERR_WIN32A(ERROR_KEY_DELETED) + CHK_ERR_WIN32A(ERROR_NO_LOG_SPACE) + CHK_ERR_WIN32A(ERROR_KEY_HAS_CHILDREN) + CHK_ERR_WIN32A(ERROR_CHILD_MUST_BE_VOLATILE) + CHK_ERR_WIN32A(ERROR_NOTIFY_ENUM_DIR) + CHK_ERR_WIN32A(ERROR_DEPENDENT_SERVICES_RUNNING) + CHK_ERR_WIN32A(ERROR_INVALID_SERVICE_CONTROL) + CHK_ERR_WIN32A(ERROR_SERVICE_REQUEST_TIMEOUT) + CHK_ERR_WIN32A(ERROR_SERVICE_NO_THREAD) + CHK_ERR_WIN32A(ERROR_SERVICE_DATABASE_LOCKED) + CHK_ERR_WIN32A(ERROR_SERVICE_ALREADY_RUNNING) + CHK_ERR_WIN32A(ERROR_INVALID_SERVICE_ACCOUNT) + CHK_ERR_WIN32A(ERROR_SERVICE_DISABLED) + CHK_ERR_WIN32A(ERROR_CIRCULAR_DEPENDENCY) + CHK_ERR_WIN32A(ERROR_SERVICE_DOES_NOT_EXIST) + CHK_ERR_WIN32A(ERROR_SERVICE_CANNOT_ACCEPT_CTRL) + CHK_ERR_WIN32A(ERROR_SERVICE_NOT_ACTIVE) + CHK_ERR_WIN32A(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) + CHK_ERR_WIN32A(ERROR_EXCEPTION_IN_SERVICE) + CHK_ERR_WIN32A(ERROR_DATABASE_DOES_NOT_EXIST) + CHK_ERR_WIN32A(ERROR_SERVICE_SPECIFIC_ERROR) + CHK_ERR_WIN32A(ERROR_PROCESS_ABORTED) + CHK_ERR_WIN32A(ERROR_SERVICE_DEPENDENCY_FAIL) + CHK_ERR_WIN32A(ERROR_SERVICE_LOGON_FAILED) + CHK_ERR_WIN32A(ERROR_SERVICE_START_HANG) + CHK_ERR_WIN32A(ERROR_INVALID_SERVICE_LOCK) + CHK_ERR_WIN32A(ERROR_SERVICE_MARKED_FOR_DELETE) + CHK_ERR_WIN32A(ERROR_SERVICE_EXISTS) + CHK_ERR_WIN32A(ERROR_ALREADY_RUNNING_LKG) + CHK_ERR_WIN32A(ERROR_SERVICE_DEPENDENCY_DELETED) + CHK_ERR_WIN32A(ERROR_BOOT_ALREADY_ACCEPTED) + CHK_ERR_WIN32A(ERROR_SERVICE_NEVER_STARTED) + CHK_ERR_WIN32A(ERROR_DUPLICATE_SERVICE_NAME) + CHK_ERR_WIN32A(ERROR_DIFFERENT_SERVICE_ACCOUNT) + CHK_ERR_WIN32A(ERROR_CANNOT_DETECT_DRIVER_FAILURE) + CHK_ERR_WIN32A(ERROR_CANNOT_DETECT_PROCESS_ABORT) + CHK_ERR_WIN32A(ERROR_NO_RECOVERY_PROGRAM) + CHK_ERR_WIN32A(ERROR_SERVICE_NOT_IN_EXE) + CHK_ERR_WIN32A(ERROR_END_OF_MEDIA) + CHK_ERR_WIN32A(ERROR_FILEMARK_DETECTED) + CHK_ERR_WIN32A(ERROR_BEGINNING_OF_MEDIA) + CHK_ERR_WIN32A(ERROR_SETMARK_DETECTED) + CHK_ERR_WIN32A(ERROR_NO_DATA_DETECTED) + CHK_ERR_WIN32A(ERROR_PARTITION_FAILURE) + CHK_ERR_WIN32A(ERROR_INVALID_BLOCK_LENGTH) + CHK_ERR_WIN32A(ERROR_DEVICE_NOT_PARTITIONED) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_LOCK_MEDIA) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_UNLOAD_MEDIA) + CHK_ERR_WIN32A(ERROR_MEDIA_CHANGED) + CHK_ERR_WIN32A(ERROR_BUS_RESET) + CHK_ERR_WIN32A(ERROR_NO_MEDIA_IN_DRIVE) + CHK_ERR_WIN32A(ERROR_NO_UNICODE_TRANSLATION) + CHK_ERR_WIN32A(ERROR_DLL_INIT_FAILED) + CHK_ERR_WIN32A(ERROR_SHUTDOWN_IN_PROGRESS) + CHK_ERR_WIN32A(ERROR_NO_SHUTDOWN_IN_PROGRESS) + CHK_ERR_WIN32A(ERROR_IO_DEVICE) + CHK_ERR_WIN32A(ERROR_SERIAL_NO_DEVICE) + CHK_ERR_WIN32A(ERROR_IRQ_BUSY) + CHK_ERR_WIN32A(ERROR_MORE_WRITES) + CHK_ERR_WIN32A(ERROR_COUNTER_TIMEOUT) + CHK_ERR_WIN32A(ERROR_FLOPPY_ID_MARK_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_FLOPPY_WRONG_CYLINDER) + CHK_ERR_WIN32A(ERROR_FLOPPY_UNKNOWN_ERROR) + CHK_ERR_WIN32A(ERROR_FLOPPY_BAD_REGISTERS) + CHK_ERR_WIN32A(ERROR_DISK_RECALIBRATE_FAILED) + CHK_ERR_WIN32A(ERROR_DISK_OPERATION_FAILED) + CHK_ERR_WIN32A(ERROR_DISK_RESET_FAILED) + CHK_ERR_WIN32A(ERROR_EOM_OVERFLOW) + CHK_ERR_WIN32A(ERROR_NOT_ENOUGH_SERVER_MEMORY) + CHK_ERR_WIN32A(ERROR_POSSIBLE_DEADLOCK) + CHK_ERR_WIN32A(ERROR_MAPPED_ALIGNMENT) + CHK_ERR_WIN32A(ERROR_SET_POWER_STATE_VETOED) + CHK_ERR_WIN32A(ERROR_SET_POWER_STATE_FAILED) + CHK_ERR_WIN32A(ERROR_TOO_MANY_LINKS) + CHK_ERR_WIN32A(ERROR_OLD_WIN_VERSION) + CHK_ERR_WIN32A(ERROR_APP_WRONG_OS) + CHK_ERR_WIN32A(ERROR_SINGLE_INSTANCE_APP) + CHK_ERR_WIN32A(ERROR_RMODE_APP) + CHK_ERR_WIN32A(ERROR_INVALID_DLL) + CHK_ERR_WIN32A(ERROR_NO_ASSOCIATION) + CHK_ERR_WIN32A(ERROR_DDE_FAIL) + CHK_ERR_WIN32A(ERROR_DLL_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_NO_MORE_USER_HANDLES) + CHK_ERR_WIN32A(ERROR_MESSAGE_SYNC_ONLY) + CHK_ERR_WIN32A(ERROR_SOURCE_ELEMENT_EMPTY) + CHK_ERR_WIN32A(ERROR_DESTINATION_ELEMENT_FULL) + CHK_ERR_WIN32A(ERROR_ILLEGAL_ELEMENT_ADDRESS) + CHK_ERR_WIN32A(ERROR_MAGAZINE_NOT_PRESENT) + CHK_ERR_WIN32A(ERROR_DEVICE_REINITIALIZATION_NEEDED) + CHK_ERR_WIN32A(ERROR_DEVICE_REQUIRES_CLEANING) + CHK_ERR_WIN32A(ERROR_DEVICE_DOOR_OPEN) + CHK_ERR_WIN32A(ERROR_DEVICE_NOT_CONNECTED) + CHK_ERR_WIN32A(ERROR_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_NO_MATCH) + CHK_ERR_WIN32A(ERROR_SET_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_POINT_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_NO_TRACKING_SERVICE) + CHK_ERR_WIN32A(ERROR_NO_VOLUME_ID) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_REMOVE_REPLACED) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_MOVE_REPLACEMENT) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_MOVE_REPLACEMENT_2) + CHK_ERR_WIN32A(ERROR_JOURNAL_DELETE_IN_PROGRESS) + CHK_ERR_WIN32A(ERROR_JOURNAL_NOT_ACTIVE) + CHK_ERR_WIN32A(ERROR_POTENTIAL_FILE_FOUND) + CHK_ERR_WIN32A(ERROR_BAD_DEVICE) + CHK_ERR_WIN32A(ERROR_CONNECTION_UNAVAIL) + CHK_ERR_WIN32A(ERROR_DEVICE_ALREADY_REMEMBERED) + CHK_ERR_WIN32A(ERROR_NO_NET_OR_BAD_PATH) + CHK_ERR_WIN32A(ERROR_BAD_PROVIDER) + CHK_ERR_WIN32A(ERROR_CANNOT_OPEN_PROFILE) + CHK_ERR_WIN32A(ERROR_BAD_PROFILE) + CHK_ERR_WIN32A(ERROR_NOT_CONTAINER) + CHK_ERR_WIN32A(ERROR_EXTENDED_ERROR) + CHK_ERR_WIN32A(ERROR_INVALID_GROUPNAME) + CHK_ERR_WIN32A(ERROR_INVALID_COMPUTERNAME) + CHK_ERR_WIN32A(ERROR_INVALID_EVENTNAME) + CHK_ERR_WIN32A(ERROR_INVALID_DOMAINNAME) + CHK_ERR_WIN32A(ERROR_INVALID_SERVICENAME) + CHK_ERR_WIN32A(ERROR_INVALID_NETNAME) + CHK_ERR_WIN32A(ERROR_INVALID_SHARENAME) + CHK_ERR_WIN32A(ERROR_INVALID_PASSWORDNAME) + CHK_ERR_WIN32A(ERROR_INVALID_MESSAGENAME) + CHK_ERR_WIN32A(ERROR_INVALID_MESSAGEDEST) + CHK_ERR_WIN32A(ERROR_SESSION_CREDENTIAL_CONFLICT) + CHK_ERR_WIN32A(ERROR_REMOTE_SESSION_LIMIT_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DUP_DOMAINNAME) + CHK_ERR_WIN32A(ERROR_NO_NETWORK) + CHK_ERR_WIN32A(ERROR_CANCELLED) + CHK_ERR_WIN32A(ERROR_USER_MAPPED_FILE) + CHK_ERR_WIN32A(ERROR_CONNECTION_REFUSED) + CHK_ERR_WIN32A(ERROR_GRACEFUL_DISCONNECT) + CHK_ERR_WIN32A(ERROR_ADDRESS_ALREADY_ASSOCIATED) + CHK_ERR_WIN32A(ERROR_ADDRESS_NOT_ASSOCIATED) + CHK_ERR_WIN32A(ERROR_CONNECTION_INVALID) + CHK_ERR_WIN32A(ERROR_CONNECTION_ACTIVE) + CHK_ERR_WIN32A(ERROR_NETWORK_UNREACHABLE) + CHK_ERR_WIN32A(ERROR_HOST_UNREACHABLE) + CHK_ERR_WIN32A(ERROR_PROTOCOL_UNREACHABLE) + CHK_ERR_WIN32A(ERROR_PORT_UNREACHABLE) + CHK_ERR_WIN32A(ERROR_REQUEST_ABORTED) + CHK_ERR_WIN32A(ERROR_CONNECTION_ABORTED) + CHK_ERR_WIN32A(ERROR_RETRY) + CHK_ERR_WIN32A(ERROR_CONNECTION_COUNT_LIMIT) + CHK_ERR_WIN32A(ERROR_LOGIN_TIME_RESTRICTION) + CHK_ERR_WIN32A(ERROR_LOGIN_WKSTA_RESTRICTION) + CHK_ERR_WIN32A(ERROR_INCORRECT_ADDRESS) + CHK_ERR_WIN32A(ERROR_ALREADY_REGISTERED) + CHK_ERR_WIN32A(ERROR_SERVICE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_NOT_AUTHENTICATED) + CHK_ERR_WIN32A(ERROR_NOT_LOGGED_ON) + CHK_ERR_WIN32A(ERROR_CONTINUE) + CHK_ERR_WIN32A(ERROR_ALREADY_INITIALIZED) + CHK_ERR_WIN32A(ERROR_NO_MORE_DEVICES) + CHK_ERR_WIN32A(ERROR_NO_SUCH_SITE) + CHK_ERR_WIN32A(ERROR_DOMAIN_CONTROLLER_EXISTS) + CHK_ERR_WIN32A(ERROR_NOT_ALL_ASSIGNED) + CHK_ERR_WIN32A(ERROR_SOME_NOT_MAPPED) + CHK_ERR_WIN32A(ERROR_NO_QUOTAS_FOR_ACCOUNT) + CHK_ERR_WIN32A(ERROR_LOCAL_USER_SESSION_KEY) + CHK_ERR_WIN32A(ERROR_NULL_LM_PASSWORD) + CHK_ERR_WIN32A(ERROR_UNKNOWN_REVISION) + CHK_ERR_WIN32A(ERROR_REVISION_MISMATCH) + CHK_ERR_WIN32A(ERROR_INVALID_OWNER) + CHK_ERR_WIN32A(ERROR_INVALID_PRIMARY_GROUP) + CHK_ERR_WIN32A(ERROR_NO_IMPERSONATION_TOKEN) + CHK_ERR_WIN32A(ERROR_CANT_DISABLE_MANDATORY) + CHK_ERR_WIN32A(ERROR_NO_LOGON_SERVERS) + CHK_ERR_WIN32A(ERROR_NO_SUCH_LOGON_SESSION) + CHK_ERR_WIN32A(ERROR_NO_SUCH_PRIVILEGE) + CHK_ERR_WIN32A(ERROR_PRIVILEGE_NOT_HELD) + CHK_ERR_WIN32A(ERROR_INVALID_ACCOUNT_NAME) + CHK_ERR_WIN32A(ERROR_USER_EXISTS) + CHK_ERR_WIN32A(ERROR_NO_SUCH_USER) + CHK_ERR_WIN32A(ERROR_GROUP_EXISTS) + CHK_ERR_WIN32A(ERROR_NO_SUCH_GROUP) + CHK_ERR_WIN32A(ERROR_MEMBER_IN_GROUP) + CHK_ERR_WIN32A(ERROR_MEMBER_NOT_IN_GROUP) + CHK_ERR_WIN32A(ERROR_LAST_ADMIN) + CHK_ERR_WIN32A(ERROR_WRONG_PASSWORD) + CHK_ERR_WIN32A(ERROR_ILL_FORMED_PASSWORD) + CHK_ERR_WIN32A(ERROR_PASSWORD_RESTRICTION) + CHK_ERR_WIN32A(ERROR_LOGON_FAILURE) + CHK_ERR_WIN32A(ERROR_ACCOUNT_RESTRICTION) + CHK_ERR_WIN32A(ERROR_INVALID_LOGON_HOURS) + CHK_ERR_WIN32A(ERROR_INVALID_WORKSTATION) + CHK_ERR_WIN32A(ERROR_PASSWORD_EXPIRED) + CHK_ERR_WIN32A(ERROR_ACCOUNT_DISABLED) + CHK_ERR_WIN32A(ERROR_NONE_MAPPED) + CHK_ERR_WIN32A(ERROR_TOO_MANY_LUIDS_REQUESTED) + CHK_ERR_WIN32A(ERROR_LUIDS_EXHAUSTED) + CHK_ERR_WIN32A(ERROR_INVALID_SUB_AUTHORITY) + CHK_ERR_WIN32A(ERROR_INVALID_ACL) + CHK_ERR_WIN32A(ERROR_INVALID_SID) + CHK_ERR_WIN32A(ERROR_INVALID_SECURITY_DESCR) + CHK_ERR_WIN32A(ERROR_BAD_INHERITANCE_ACL) + CHK_ERR_WIN32A(ERROR_SERVER_DISABLED) + CHK_ERR_WIN32A(ERROR_SERVER_NOT_DISABLED) + CHK_ERR_WIN32A(ERROR_INVALID_ID_AUTHORITY) + CHK_ERR_WIN32A(ERROR_ALLOTTED_SPACE_EXCEEDED) + CHK_ERR_WIN32A(ERROR_INVALID_GROUP_ATTRIBUTES) + CHK_ERR_WIN32A(ERROR_BAD_IMPERSONATION_LEVEL) + CHK_ERR_WIN32A(ERROR_CANT_OPEN_ANONYMOUS) + CHK_ERR_WIN32A(ERROR_BAD_VALIDATION_CLASS) + CHK_ERR_WIN32A(ERROR_BAD_TOKEN_TYPE) + CHK_ERR_WIN32A(ERROR_NO_SECURITY_ON_OBJECT) + CHK_ERR_WIN32A(ERROR_CANT_ACCESS_DOMAIN_INFO) + CHK_ERR_WIN32A(ERROR_INVALID_SERVER_STATE) + CHK_ERR_WIN32A(ERROR_INVALID_DOMAIN_STATE) + CHK_ERR_WIN32A(ERROR_INVALID_DOMAIN_ROLE) + CHK_ERR_WIN32A(ERROR_NO_SUCH_DOMAIN) + CHK_ERR_WIN32A(ERROR_DOMAIN_EXISTS) + CHK_ERR_WIN32A(ERROR_DOMAIN_LIMIT_EXCEEDED) + CHK_ERR_WIN32A(ERROR_INTERNAL_DB_CORRUPTION) + CHK_ERR_WIN32A(ERROR_INTERNAL_ERROR) + CHK_ERR_WIN32A(ERROR_GENERIC_NOT_MAPPED) + CHK_ERR_WIN32A(ERROR_BAD_DESCRIPTOR_FORMAT) + CHK_ERR_WIN32A(ERROR_NOT_LOGON_PROCESS) + CHK_ERR_WIN32A(ERROR_LOGON_SESSION_EXISTS) + CHK_ERR_WIN32A(ERROR_NO_SUCH_PACKAGE) + CHK_ERR_WIN32A(ERROR_BAD_LOGON_SESSION_STATE) + CHK_ERR_WIN32A(ERROR_LOGON_SESSION_COLLISION) + CHK_ERR_WIN32A(ERROR_INVALID_LOGON_TYPE) + CHK_ERR_WIN32A(ERROR_CANNOT_IMPERSONATE) + CHK_ERR_WIN32A(ERROR_RXACT_INVALID_STATE) + CHK_ERR_WIN32A(ERROR_RXACT_COMMIT_FAILURE) + CHK_ERR_WIN32A(ERROR_SPECIAL_ACCOUNT) + CHK_ERR_WIN32A(ERROR_SPECIAL_GROUP) + CHK_ERR_WIN32A(ERROR_SPECIAL_USER) + CHK_ERR_WIN32A(ERROR_MEMBERS_PRIMARY_GROUP) + CHK_ERR_WIN32A(ERROR_TOKEN_ALREADY_IN_USE) + CHK_ERR_WIN32A(ERROR_NO_SUCH_ALIAS) + CHK_ERR_WIN32A(ERROR_MEMBER_NOT_IN_ALIAS) + CHK_ERR_WIN32A(ERROR_MEMBER_IN_ALIAS) + CHK_ERR_WIN32A(ERROR_ALIAS_EXISTS) + CHK_ERR_WIN32A(ERROR_LOGON_NOT_GRANTED) + CHK_ERR_WIN32A(ERROR_TOO_MANY_SECRETS) + CHK_ERR_WIN32A(ERROR_SECRET_TOO_LONG) + CHK_ERR_WIN32A(ERROR_INTERNAL_DB_ERROR) + CHK_ERR_WIN32A(ERROR_TOO_MANY_CONTEXT_IDS) + CHK_ERR_WIN32A(ERROR_LOGON_TYPE_NOT_GRANTED) + CHK_ERR_WIN32A(ERROR_NT_CROSS_ENCRYPTION_REQUIRED) + CHK_ERR_WIN32A(ERROR_NO_SUCH_MEMBER) + CHK_ERR_WIN32A(ERROR_INVALID_MEMBER) + CHK_ERR_WIN32A(ERROR_TOO_MANY_SIDS) + CHK_ERR_WIN32A(ERROR_LM_CROSS_ENCRYPTION_REQUIRED) + CHK_ERR_WIN32A(ERROR_NO_INHERITANCE) + CHK_ERR_WIN32A(ERROR_FILE_CORRUPT) + CHK_ERR_WIN32A(ERROR_DISK_CORRUPT) + CHK_ERR_WIN32A(ERROR_NO_USER_SESSION_KEY) + CHK_ERR_WIN32A(ERROR_LICENSE_QUOTA_EXCEEDED) + CHK_ERR_WIN32A(ERROR_WRONG_TARGET_NAME) + CHK_ERR_WIN32A(ERROR_MUTUAL_AUTH_FAILED) + CHK_ERR_WIN32A(ERROR_TIME_SKEW) + CHK_ERR_WIN32A(ERROR_INVALID_WINDOW_HANDLE) + CHK_ERR_WIN32A(ERROR_INVALID_MENU_HANDLE) + CHK_ERR_WIN32A(ERROR_INVALID_CURSOR_HANDLE) + CHK_ERR_WIN32A(ERROR_INVALID_ACCEL_HANDLE) + CHK_ERR_WIN32A(ERROR_INVALID_HOOK_HANDLE) + CHK_ERR_WIN32A(ERROR_INVALID_DWP_HANDLE) + CHK_ERR_WIN32A(ERROR_TLW_WITH_WSCHILD) + CHK_ERR_WIN32A(ERROR_CANNOT_FIND_WND_CLASS) + CHK_ERR_WIN32A(ERROR_WINDOW_OF_OTHER_THREAD) + CHK_ERR_WIN32A(ERROR_HOTKEY_ALREADY_REGISTERED) + CHK_ERR_WIN32A(ERROR_CLASS_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_CLASS_DOES_NOT_EXIST) + CHK_ERR_WIN32A(ERROR_CLASS_HAS_WINDOWS) + CHK_ERR_WIN32A(ERROR_INVALID_INDEX) + CHK_ERR_WIN32A(ERROR_INVALID_ICON_HANDLE) + CHK_ERR_WIN32A(ERROR_PRIVATE_DIALOG_INDEX) + CHK_ERR_WIN32A(ERROR_LISTBOX_ID_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_NO_WILDCARD_CHARACTERS) + CHK_ERR_WIN32A(ERROR_CLIPBOARD_NOT_OPEN) + CHK_ERR_WIN32A(ERROR_HOTKEY_NOT_REGISTERED) + CHK_ERR_WIN32A(ERROR_WINDOW_NOT_DIALOG) + CHK_ERR_WIN32A(ERROR_CONTROL_ID_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_INVALID_COMBOBOX_MESSAGE) + CHK_ERR_WIN32A(ERROR_WINDOW_NOT_COMBOBOX) + CHK_ERR_WIN32A(ERROR_INVALID_EDIT_HEIGHT) + CHK_ERR_WIN32A(ERROR_DC_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_INVALID_HOOK_FILTER) + CHK_ERR_WIN32A(ERROR_INVALID_FILTER_PROC) + CHK_ERR_WIN32A(ERROR_HOOK_NEEDS_HMOD) + CHK_ERR_WIN32A(ERROR_GLOBAL_ONLY_HOOK) + CHK_ERR_WIN32A(ERROR_JOURNAL_HOOK_SET) + CHK_ERR_WIN32A(ERROR_HOOK_NOT_INSTALLED) + CHK_ERR_WIN32A(ERROR_INVALID_LB_MESSAGE) + CHK_ERR_WIN32A(ERROR_SETCOUNT_ON_BAD_LB) + CHK_ERR_WIN32A(ERROR_LB_WITHOUT_TABSTOPS) + CHK_ERR_WIN32A(ERROR_DESTROY_OBJECT_OF_OTHER_THREAD) + CHK_ERR_WIN32A(ERROR_CHILD_WINDOW_MENU) + CHK_ERR_WIN32A(ERROR_NO_SYSTEM_MENU) + CHK_ERR_WIN32A(ERROR_INVALID_MSGBOX_STYLE) + CHK_ERR_WIN32A(ERROR_INVALID_SPI_VALUE) + CHK_ERR_WIN32A(ERROR_SCREEN_ALREADY_LOCKED) + CHK_ERR_WIN32A(ERROR_HWNDS_HAVE_DIFF_PARENT) + CHK_ERR_WIN32A(ERROR_NOT_CHILD_WINDOW) + CHK_ERR_WIN32A(ERROR_INVALID_GW_COMMAND) + CHK_ERR_WIN32A(ERROR_INVALID_THREAD_ID) + CHK_ERR_WIN32A(ERROR_NON_MDICHILD_WINDOW) + CHK_ERR_WIN32A(ERROR_POPUP_ALREADY_ACTIVE) + CHK_ERR_WIN32A(ERROR_NO_SCROLLBARS) + CHK_ERR_WIN32A(ERROR_INVALID_SCROLLBAR_RANGE) + CHK_ERR_WIN32A(ERROR_INVALID_SHOWWIN_COMMAND) + CHK_ERR_WIN32A(ERROR_NO_SYSTEM_RESOURCES) + CHK_ERR_WIN32A(ERROR_NONPAGED_SYSTEM_RESOURCES) + CHK_ERR_WIN32A(ERROR_PAGED_SYSTEM_RESOURCES) + CHK_ERR_WIN32A(ERROR_WORKING_SET_QUOTA) + CHK_ERR_WIN32A(ERROR_PAGEFILE_QUOTA) + CHK_ERR_WIN32A(ERROR_COMMITMENT_LIMIT) + CHK_ERR_WIN32A(ERROR_MENU_ITEM_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_INVALID_KEYBOARD_HANDLE) + CHK_ERR_WIN32A(ERROR_HOOK_TYPE_NOT_ALLOWED) + CHK_ERR_WIN32A(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION) + CHK_ERR_WIN32A(ERROR_TIMEOUT) + CHK_ERR_WIN32A(ERROR_INVALID_MONITOR_HANDLE) + CHK_ERR_WIN32A(ERROR_EVENTLOG_FILE_CORRUPT) + CHK_ERR_WIN32A(ERROR_EVENTLOG_CANT_START) + CHK_ERR_WIN32A(ERROR_LOG_FILE_FULL) + CHK_ERR_WIN32A(ERROR_EVENTLOG_FILE_CHANGED) + CHK_ERR_WIN32A(ERROR_INSTALL_USEREXIT) + CHK_ERR_WIN32A(ERROR_INSTALL_FAILURE) + CHK_ERR_WIN32A(ERROR_INSTALL_SUSPEND) + CHK_ERR_WIN32A(ERROR_UNKNOWN_PRODUCT) + CHK_ERR_WIN32A(ERROR_UNKNOWN_FEATURE) + CHK_ERR_WIN32A(ERROR_UNKNOWN_COMPONENT) + CHK_ERR_WIN32A(ERROR_UNKNOWN_PROPERTY) + CHK_ERR_WIN32A(ERROR_INVALID_HANDLE_STATE) + CHK_ERR_WIN32A(ERROR_BAD_CONFIGURATION) + CHK_ERR_WIN32A(ERROR_INDEX_ABSENT) + CHK_ERR_WIN32A(ERROR_INSTALL_SOURCE_ABSENT) + CHK_ERR_WIN32A(ERROR_PRODUCT_UNINSTALLED) + CHK_ERR_WIN32A(ERROR_BAD_QUERY_SYNTAX) + CHK_ERR_WIN32A(ERROR_INVALID_FIELD) + CHK_ERR_WIN32A(ERROR_DEVICE_REMOVED) + CHK_ERR_WIN32A(RPC_S_INVALID_STRING_BINDING) + CHK_ERR_WIN32A(RPC_S_WRONG_KIND_OF_BINDING) + CHK_ERR_WIN32A(RPC_S_INVALID_BINDING) + CHK_ERR_WIN32A(RPC_S_PROTSEQ_NOT_SUPPORTED) + CHK_ERR_WIN32A(RPC_S_INVALID_RPC_PROTSEQ) + CHK_ERR_WIN32A(RPC_S_INVALID_STRING_UUID) + CHK_ERR_WIN32A(RPC_S_INVALID_ENDPOINT_FORMAT) + CHK_ERR_WIN32A(RPC_S_INVALID_NET_ADDR) + CHK_ERR_WIN32A(RPC_S_NO_ENDPOINT_FOUND) + CHK_ERR_WIN32A(RPC_S_INVALID_TIMEOUT) + CHK_ERR_WIN32A(RPC_S_OBJECT_NOT_FOUND) + CHK_ERR_WIN32A(RPC_S_ALREADY_REGISTERED) + CHK_ERR_WIN32A(RPC_S_TYPE_ALREADY_REGISTERED) + CHK_ERR_WIN32A(RPC_S_ALREADY_LISTENING) + CHK_ERR_WIN32A(RPC_S_NO_PROTSEQS_REGISTERED) + CHK_ERR_WIN32A(RPC_S_NOT_LISTENING) + CHK_ERR_WIN32A(RPC_S_UNKNOWN_MGR_TYPE) + CHK_ERR_WIN32A(RPC_S_UNKNOWN_IF) + CHK_ERR_WIN32A(RPC_S_NO_BINDINGS) + CHK_ERR_WIN32A(RPC_S_NO_PROTSEQS) + CHK_ERR_WIN32A(RPC_S_CANT_CREATE_ENDPOINT) + CHK_ERR_WIN32A(RPC_S_OUT_OF_RESOURCES) + CHK_ERR_WIN32A(RPC_S_SERVER_UNAVAILABLE) + CHK_ERR_WIN32A(RPC_S_SERVER_TOO_BUSY) + CHK_ERR_WIN32A(RPC_S_INVALID_NETWORK_OPTIONS) + CHK_ERR_WIN32A(RPC_S_NO_CALL_ACTIVE) + CHK_ERR_WIN32A(RPC_S_CALL_FAILED) + CHK_ERR_WIN32A(RPC_S_CALL_FAILED_DNE) + CHK_ERR_WIN32A(RPC_S_PROTOCOL_ERROR) + CHK_ERR_WIN32A(RPC_S_UNSUPPORTED_TRANS_SYN) + CHK_ERR_WIN32A(RPC_S_UNSUPPORTED_TYPE) + CHK_ERR_WIN32A(RPC_S_INVALID_TAG) + CHK_ERR_WIN32A(RPC_S_INVALID_BOUND) + CHK_ERR_WIN32A(RPC_S_NO_ENTRY_NAME) + CHK_ERR_WIN32A(RPC_S_INVALID_NAME_SYNTAX) + CHK_ERR_WIN32A(RPC_S_UNSUPPORTED_NAME_SYNTAX) + CHK_ERR_WIN32A(RPC_S_UUID_NO_ADDRESS) + CHK_ERR_WIN32A(RPC_S_DUPLICATE_ENDPOINT) + CHK_ERR_WIN32A(RPC_S_UNKNOWN_AUTHN_TYPE) + CHK_ERR_WIN32A(RPC_S_MAX_CALLS_TOO_SMALL) + CHK_ERR_WIN32A(RPC_S_STRING_TOO_LONG) + CHK_ERR_WIN32A(RPC_S_PROTSEQ_NOT_FOUND) + CHK_ERR_WIN32A(RPC_S_PROCNUM_OUT_OF_RANGE) + CHK_ERR_WIN32A(RPC_S_BINDING_HAS_NO_AUTH) + CHK_ERR_WIN32A(RPC_S_UNKNOWN_AUTHN_SERVICE) + CHK_ERR_WIN32A(RPC_S_UNKNOWN_AUTHN_LEVEL) + CHK_ERR_WIN32A(RPC_S_INVALID_AUTH_IDENTITY) + CHK_ERR_WIN32A(RPC_S_UNKNOWN_AUTHZ_SERVICE) + CHK_ERR_WIN32A(EPT_S_INVALID_ENTRY) + CHK_ERR_WIN32A(EPT_S_CANT_PERFORM_OP) + CHK_ERR_WIN32A(EPT_S_NOT_REGISTERED) + CHK_ERR_WIN32A(RPC_S_NOTHING_TO_EXPORT) + CHK_ERR_WIN32A(RPC_S_INCOMPLETE_NAME) + CHK_ERR_WIN32A(RPC_S_INVALID_VERS_OPTION) + CHK_ERR_WIN32A(RPC_S_NO_MORE_MEMBERS) + CHK_ERR_WIN32A(RPC_S_NOT_ALL_OBJS_UNEXPORTED) + CHK_ERR_WIN32A(RPC_S_INTERFACE_NOT_FOUND) + CHK_ERR_WIN32A(RPC_S_ENTRY_ALREADY_EXISTS) + CHK_ERR_WIN32A(RPC_S_ENTRY_NOT_FOUND) + CHK_ERR_WIN32A(RPC_S_NAME_SERVICE_UNAVAILABLE) + CHK_ERR_WIN32A(RPC_S_INVALID_NAF_ID) + CHK_ERR_WIN32A(RPC_S_CANNOT_SUPPORT) + CHK_ERR_WIN32A(RPC_S_NO_CONTEXT_AVAILABLE) + CHK_ERR_WIN32A(RPC_S_INTERNAL_ERROR) + CHK_ERR_WIN32A(RPC_S_ZERO_DIVIDE) + CHK_ERR_WIN32A(RPC_S_ADDRESS_ERROR) + CHK_ERR_WIN32A(RPC_S_FP_DIV_ZERO) + CHK_ERR_WIN32A(RPC_S_FP_UNDERFLOW) + CHK_ERR_WIN32A(RPC_S_FP_OVERFLOW) + CHK_ERR_WIN32A(RPC_X_NO_MORE_ENTRIES) + CHK_ERR_WIN32A(RPC_X_SS_CHAR_TRANS_OPEN_FAIL) + CHK_ERR_WIN32A(RPC_X_SS_CHAR_TRANS_SHORT_FILE) + CHK_ERR_WIN32A(RPC_X_SS_IN_NULL_CONTEXT) + CHK_ERR_WIN32A(RPC_X_SS_CONTEXT_DAMAGED) + CHK_ERR_WIN32A(RPC_X_SS_HANDLES_MISMATCH) + CHK_ERR_WIN32A(RPC_X_SS_CANNOT_GET_CALL_HANDLE) + CHK_ERR_WIN32A(RPC_X_NULL_REF_POINTER) + CHK_ERR_WIN32A(RPC_X_ENUM_VALUE_OUT_OF_RANGE) + CHK_ERR_WIN32A(RPC_X_BYTE_COUNT_TOO_SMALL) + CHK_ERR_WIN32A(RPC_X_BAD_STUB_DATA) + CHK_ERR_WIN32A(ERROR_INVALID_USER_BUFFER) + CHK_ERR_WIN32A(ERROR_UNRECOGNIZED_MEDIA) + CHK_ERR_WIN32A(ERROR_NO_TRUST_LSA_SECRET) + CHK_ERR_WIN32A(ERROR_NO_TRUST_SAM_ACCOUNT) + CHK_ERR_WIN32A(ERROR_TRUSTED_DOMAIN_FAILURE) + CHK_ERR_WIN32A(ERROR_TRUSTED_RELATIONSHIP_FAILURE) + CHK_ERR_WIN32A(ERROR_TRUST_FAILURE) + CHK_ERR_WIN32A(RPC_S_CALL_IN_PROGRESS) + CHK_ERR_WIN32A(ERROR_NETLOGON_NOT_STARTED) + CHK_ERR_WIN32A(ERROR_ACCOUNT_EXPIRED) + CHK_ERR_WIN32A(ERROR_REDIRECTOR_HAS_OPEN_HANDLES) + CHK_ERR_WIN32A(ERROR_PRINTER_DRIVER_ALREADY_INSTALLED) + CHK_ERR_WIN32A(ERROR_UNKNOWN_PORT) + CHK_ERR_WIN32A(ERROR_UNKNOWN_PRINTER_DRIVER) + CHK_ERR_WIN32A(ERROR_UNKNOWN_PRINTPROCESSOR) + CHK_ERR_WIN32A(ERROR_INVALID_SEPARATOR_FILE) + CHK_ERR_WIN32A(ERROR_INVALID_PRIORITY) + CHK_ERR_WIN32A(ERROR_INVALID_PRINTER_NAME) + CHK_ERR_WIN32A(ERROR_PRINTER_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_INVALID_PRINTER_COMMAND) + CHK_ERR_WIN32A(ERROR_INVALID_DATATYPE) + CHK_ERR_WIN32A(ERROR_INVALID_ENVIRONMENT) + CHK_ERR_WIN32A(RPC_S_NO_MORE_BINDINGS) + CHK_ERR_WIN32A(ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT) + CHK_ERR_WIN32A(ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT) + CHK_ERR_WIN32A(ERROR_NOLOGON_SERVER_TRUST_ACCOUNT) + CHK_ERR_WIN32A(ERROR_DOMAIN_TRUST_INCONSISTENT) + CHK_ERR_WIN32A(ERROR_SERVER_HAS_OPEN_HANDLES) + CHK_ERR_WIN32A(ERROR_RESOURCE_DATA_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_RESOURCE_TYPE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_RESOURCE_NAME_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_RESOURCE_LANG_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_NOT_ENOUGH_QUOTA) + CHK_ERR_WIN32A(RPC_S_NO_INTERFACES) + CHK_ERR_WIN32A(RPC_S_CALL_CANCELLED) + CHK_ERR_WIN32A(RPC_S_BINDING_INCOMPLETE) + CHK_ERR_WIN32A(RPC_S_COMM_FAILURE) + CHK_ERR_WIN32A(RPC_S_UNSUPPORTED_AUTHN_LEVEL) + CHK_ERR_WIN32A(RPC_S_NO_PRINC_NAME) + CHK_ERR_WIN32A(RPC_S_NOT_RPC_ERROR) + CHK_ERR_WIN32A(RPC_S_UUID_LOCAL_ONLY) + CHK_ERR_WIN32A(RPC_S_SEC_PKG_ERROR) + CHK_ERR_WIN32A(RPC_S_NOT_CANCELLED) + CHK_ERR_WIN32A(RPC_X_INVALID_ES_ACTION) + CHK_ERR_WIN32A(RPC_X_WRONG_ES_VERSION) + CHK_ERR_WIN32A(RPC_X_WRONG_STUB_VERSION) + CHK_ERR_WIN32A(RPC_X_INVALID_PIPE_OBJECT) + CHK_ERR_WIN32A(RPC_X_WRONG_PIPE_ORDER) + CHK_ERR_WIN32A(RPC_X_WRONG_PIPE_VERSION) + CHK_ERR_WIN32A(RPC_S_GROUP_MEMBER_NOT_FOUND) + CHK_ERR_WIN32A(EPT_S_CANT_CREATE) + CHK_ERR_WIN32A(RPC_S_INVALID_OBJECT) + CHK_ERR_WIN32A(ERROR_INVALID_TIME) + CHK_ERR_WIN32A(ERROR_INVALID_FORM_NAME) + CHK_ERR_WIN32A(ERROR_INVALID_FORM_SIZE) + CHK_ERR_WIN32A(ERROR_ALREADY_WAITING) + CHK_ERR_WIN32A(ERROR_PRINTER_DELETED) + CHK_ERR_WIN32A(ERROR_INVALID_PRINTER_STATE) + CHK_ERR_WIN32A(ERROR_PASSWORD_MUST_CHANGE) + CHK_ERR_WIN32A(ERROR_DOMAIN_CONTROLLER_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_ACCOUNT_LOCKED_OUT) + CHK_ERR_WIN32A(OR_INVALID_OXID) + CHK_ERR_WIN32A(OR_INVALID_OID) + CHK_ERR_WIN32A(OR_INVALID_SET) + CHK_ERR_WIN32A(RPC_S_SEND_INCOMPLETE) + CHK_ERR_WIN32A(RPC_S_INVALID_ASYNC_HANDLE) + CHK_ERR_WIN32A(RPC_S_INVALID_ASYNC_CALL) + CHK_ERR_WIN32A(RPC_X_PIPE_CLOSED) + CHK_ERR_WIN32A(RPC_X_PIPE_DISCIPLINE_ERROR) + CHK_ERR_WIN32A(RPC_X_PIPE_EMPTY) + CHK_ERR_WIN32A(ERROR_NO_SITENAME) + CHK_ERR_WIN32A(ERROR_CANT_ACCESS_FILE) + CHK_ERR_WIN32A(ERROR_CANT_RESOLVE_FILENAME) + CHK_ERR_WIN32A(ERROR_INVALID_PIXEL_FORMAT) + CHK_ERR_WIN32A(ERROR_BAD_DRIVER) + CHK_ERR_WIN32A(ERROR_INVALID_WINDOW_STYLE) + CHK_ERR_WIN32A(ERROR_METAFILE_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_TRANSFORM_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_CLIPPING_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_INVALID_CMM) + CHK_ERR_WIN32A(ERROR_INVALID_PROFILE) + CHK_ERR_WIN32A(ERROR_TAG_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_TAG_NOT_PRESENT) + CHK_ERR_WIN32A(ERROR_DUPLICATE_TAG) + CHK_ERR_WIN32A(ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE) + CHK_ERR_WIN32A(ERROR_PROFILE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_INVALID_COLORSPACE) + CHK_ERR_WIN32A(ERROR_ICM_NOT_ENABLED) + CHK_ERR_WIN32A(ERROR_DELETING_ICM_XFORM) + CHK_ERR_WIN32A(ERROR_INVALID_TRANSFORM) + CHK_ERR_WIN32A(ERROR_COLORSPACE_MISMATCH) + CHK_ERR_WIN32A(ERROR_INVALID_COLORINDEX) + CHK_ERR_WIN32A(ERROR_CONNECTED_OTHER_PASSWORD) + CHK_ERR_WIN32A(ERROR_BAD_USERNAME) + CHK_ERR_WIN32A(ERROR_NOT_CONNECTED) + CHK_ERR_WIN32A(ERROR_OPEN_FILES) + CHK_ERR_WIN32A(ERROR_ACTIVE_CONNECTIONS) + CHK_ERR_WIN32A(ERROR_DEVICE_IN_USE) + CHK_ERR_WIN32A(ERROR_UNKNOWN_PRINT_MONITOR) + CHK_ERR_WIN32A(ERROR_PRINTER_DRIVER_IN_USE) + CHK_ERR_WIN32A(ERROR_SPOOL_FILE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_SPL_NO_STARTDOC) + CHK_ERR_WIN32A(ERROR_SPL_NO_ADDJOB) + CHK_ERR_WIN32A(ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED) + CHK_ERR_WIN32A(ERROR_PRINT_MONITOR_ALREADY_INSTALLED) + CHK_ERR_WIN32A(ERROR_INVALID_PRINT_MONITOR) + CHK_ERR_WIN32A(ERROR_PRINT_MONITOR_IN_USE) + CHK_ERR_WIN32A(ERROR_PRINTER_HAS_JOBS_QUEUED) + CHK_ERR_WIN32A(ERROR_SUCCESS_REBOOT_REQUIRED) + CHK_ERR_WIN32A(ERROR_SUCCESS_RESTART_REQUIRED) + CHK_ERR_WIN32A(ERROR_PRINTER_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_WINS_INTERNAL) + CHK_ERR_WIN32A(ERROR_CAN_NOT_DEL_LOCAL_WINS) + CHK_ERR_WIN32A(ERROR_STATIC_INIT) + CHK_ERR_WIN32A(ERROR_INC_BACKUP) + CHK_ERR_WIN32A(ERROR_FULL_BACKUP) + CHK_ERR_WIN32A(ERROR_REC_NON_EXISTENT) + CHK_ERR_WIN32A(ERROR_RPL_NOT_ALLOWED) + CHK_ERR_WIN32A(ERROR_DHCP_ADDRESS_CONFLICT) + CHK_ERR_WIN32A(ERROR_WMI_GUID_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_WMI_INSTANCE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_WMI_ITEMID_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_WMI_TRY_AGAIN) + CHK_ERR_WIN32A(ERROR_WMI_DP_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_WMI_UNRESOLVED_INSTANCE_REF) + CHK_ERR_WIN32A(ERROR_WMI_ALREADY_ENABLED) + CHK_ERR_WIN32A(ERROR_WMI_GUID_DISCONNECTED) + CHK_ERR_WIN32A(ERROR_WMI_SERVER_UNAVAILABLE) + CHK_ERR_WIN32A(ERROR_WMI_DP_FAILED) + CHK_ERR_WIN32A(ERROR_WMI_INVALID_MOF) + CHK_ERR_WIN32A(ERROR_WMI_INVALID_REGINFO) + CHK_ERR_WIN32A(ERROR_WMI_ALREADY_DISABLED) + CHK_ERR_WIN32A(ERROR_WMI_READ_ONLY) + CHK_ERR_WIN32A(ERROR_WMI_SET_FAILURE) + CHK_ERR_WIN32A(ERROR_INVALID_MEDIA) + CHK_ERR_WIN32A(ERROR_INVALID_LIBRARY) + CHK_ERR_WIN32A(ERROR_INVALID_MEDIA_POOL) + CHK_ERR_WIN32A(ERROR_DRIVE_MEDIA_MISMATCH) + CHK_ERR_WIN32A(ERROR_MEDIA_OFFLINE) + CHK_ERR_WIN32A(ERROR_LIBRARY_OFFLINE) + CHK_ERR_WIN32A(ERROR_EMPTY) + CHK_ERR_WIN32A(ERROR_NOT_EMPTY) + CHK_ERR_WIN32A(ERROR_MEDIA_UNAVAILABLE) + CHK_ERR_WIN32A(ERROR_RESOURCE_DISABLED) + CHK_ERR_WIN32A(ERROR_INVALID_CLEANER) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_CLEAN) + CHK_ERR_WIN32A(ERROR_OBJECT_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_DATABASE_FAILURE) + CHK_ERR_WIN32A(ERROR_DATABASE_FULL) + CHK_ERR_WIN32A(ERROR_MEDIA_INCOMPATIBLE) + CHK_ERR_WIN32A(ERROR_RESOURCE_NOT_PRESENT) + CHK_ERR_WIN32A(ERROR_INVALID_OPERATION) + CHK_ERR_WIN32A(ERROR_MEDIA_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_DEVICE_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_REQUEST_REFUSED) + CHK_ERR_WIN32A(ERROR_INVALID_DRIVE_OBJECT) + CHK_ERR_WIN32A(ERROR_LIBRARY_FULL) + CHK_ERR_WIN32A(ERROR_MEDIUM_NOT_ACCESSIBLE) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_LOAD_MEDIUM) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_INVENTORY_DRIVE) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_INVENTORY_SLOT) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_INVENTORY_TRANSPORT) + CHK_ERR_WIN32A(ERROR_TRANSPORT_FULL) + CHK_ERR_WIN32A(ERROR_CONTROLLING_IEPORT) + CHK_ERR_WIN32A(ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA) + CHK_ERR_WIN32A(ERROR_CLEANER_SLOT_SET) + CHK_ERR_WIN32A(ERROR_CLEANER_SLOT_NOT_SET) + CHK_ERR_WIN32A(ERROR_CLEANER_CARTRIDGE_SPENT) + CHK_ERR_WIN32A(ERROR_UNEXPECTED_OMID) + CHK_ERR_WIN32A(ERROR_CANT_DELETE_LAST_ITEM) + CHK_ERR_WIN32A(ERROR_MESSAGE_EXCEEDS_MAX_SIZE) + CHK_ERR_WIN32A(ERROR_FILE_OFFLINE) + CHK_ERR_WIN32A(ERROR_REMOTE_STORAGE_NOT_ACTIVE) + CHK_ERR_WIN32A(ERROR_REMOTE_STORAGE_MEDIA_ERROR) + CHK_ERR_WIN32A(ERROR_NOT_A_REPARSE_POINT) + CHK_ERR_WIN32A(ERROR_REPARSE_ATTRIBUTE_CONFLICT) + CHK_ERR_WIN32A(ERROR_INVALID_REPARSE_DATA) + CHK_ERR_WIN32A(ERROR_DEPENDENT_RESOURCE_EXISTS) + CHK_ERR_WIN32A(ERROR_DEPENDENCY_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_DEPENDENCY_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_RESOURCE_NOT_ONLINE) + CHK_ERR_WIN32A(ERROR_HOST_NODE_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_RESOURCE_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_RESOURCE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_SHUTDOWN_CLUSTER) + CHK_ERR_WIN32A(ERROR_CANT_EVICT_ACTIVE_NODE) + CHK_ERR_WIN32A(ERROR_OBJECT_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_OBJECT_IN_LIST) + CHK_ERR_WIN32A(ERROR_GROUP_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_GROUP_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_GROUP_NOT_ONLINE) + CHK_ERR_WIN32A(ERROR_HOST_NODE_NOT_RESOURCE_OWNER) + CHK_ERR_WIN32A(ERROR_HOST_NODE_NOT_GROUP_OWNER) + CHK_ERR_WIN32A(ERROR_RESMON_CREATE_FAILED) + CHK_ERR_WIN32A(ERROR_RESMON_ONLINE_FAILED) + CHK_ERR_WIN32A(ERROR_RESOURCE_ONLINE) + CHK_ERR_WIN32A(ERROR_QUORUM_RESOURCE) + CHK_ERR_WIN32A(ERROR_NOT_QUORUM_CAPABLE) + CHK_ERR_WIN32A(ERROR_CLUSTER_SHUTTING_DOWN) + CHK_ERR_WIN32A(ERROR_INVALID_STATE) + CHK_ERR_WIN32A(ERROR_RESOURCE_PROPERTIES_STORED) + CHK_ERR_WIN32A(ERROR_NOT_QUORUM_CLASS) + CHK_ERR_WIN32A(ERROR_CORE_RESOURCE) + CHK_ERR_WIN32A(ERROR_QUORUM_RESOURCE_ONLINE_FAILED) + CHK_ERR_WIN32A(ERROR_QUORUMLOG_OPEN_FAILED) + CHK_ERR_WIN32A(ERROR_CLUSTERLOG_CORRUPT) + CHK_ERR_WIN32A(ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE) + CHK_ERR_WIN32A(ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE) + CHK_ERR_WIN32A(ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE) + CHK_ERR_WIN32A(ERROR_ENCRYPTION_FAILED) + CHK_ERR_WIN32A(ERROR_DECRYPTION_FAILED) + CHK_ERR_WIN32A(ERROR_FILE_ENCRYPTED) + CHK_ERR_WIN32A(ERROR_NO_RECOVERY_POLICY) + CHK_ERR_WIN32A(ERROR_NO_EFS) + CHK_ERR_WIN32A(ERROR_WRONG_EFS) + CHK_ERR_WIN32A(ERROR_NO_USER_KEYS) + CHK_ERR_WIN32A(ERROR_FILE_NOT_ENCRYPTED) + CHK_ERR_WIN32A(ERROR_NOT_EXPORT_FORMAT) + CHK_ERR_WIN32A(ERROR_NO_BROWSER_SERVERS_FOUND) + CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_NAME_INVALID) + CHK_ERR_WIN32A(ERROR_CTX_INVALID_PD) + CHK_ERR_WIN32A(ERROR_CTX_PD_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CTX_WD_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY) + CHK_ERR_WIN32A(ERROR_CTX_SERVICE_NAME_COLLISION) + CHK_ERR_WIN32A(ERROR_CTX_CLOSE_PENDING) + CHK_ERR_WIN32A(ERROR_CTX_NO_OUTBUF) + CHK_ERR_WIN32A(ERROR_CTX_MODEM_INF_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CTX_INVALID_MODEMNAME) + CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_ERROR) + CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_TIMEOUT) + CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_NO_CARRIER) + CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE) + CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_BUSY) + CHK_ERR_WIN32A(ERROR_CTX_MODEM_RESPONSE_VOICE) + CHK_ERR_WIN32A(ERROR_CTX_TD_ERROR) + CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_BUSY) + CHK_ERR_WIN32A(ERROR_CTX_BAD_VIDEO_MODE) + CHK_ERR_WIN32A(ERROR_CTX_GRAPHICS_INVALID) + CHK_ERR_WIN32A(ERROR_CTX_LOGON_DISABLED) + CHK_ERR_WIN32A(ERROR_CTX_NOT_CONSOLE) + CHK_ERR_WIN32A(ERROR_CTX_CLIENT_QUERY_TIMEOUT) + CHK_ERR_WIN32A(ERROR_CTX_CONSOLE_DISCONNECT) + CHK_ERR_WIN32A(ERROR_CTX_CONSOLE_CONNECT) + CHK_ERR_WIN32A(ERROR_CTX_SHADOW_DENIED) + CHK_ERR_WIN32A(ERROR_CTX_WINSTATION_ACCESS_DENIED) + CHK_ERR_WIN32A(ERROR_CTX_INVALID_WD) + CHK_ERR_WIN32A(ERROR_CTX_SHADOW_INVALID) + CHK_ERR_WIN32A(ERROR_CTX_SHADOW_DISABLED) + CHK_ERR_WIN32A(FRS_ERR_INVALID_API_SEQUENCE) + CHK_ERR_WIN32A(FRS_ERR_STARTING_SERVICE) + CHK_ERR_WIN32A(FRS_ERR_STOPPING_SERVICE) + CHK_ERR_WIN32A(FRS_ERR_INTERNAL_API) + CHK_ERR_WIN32A(FRS_ERR_INTERNAL) + CHK_ERR_WIN32A(FRS_ERR_SERVICE_COMM) + CHK_ERR_WIN32A(FRS_ERR_INSUFFICIENT_PRIV) + CHK_ERR_WIN32A(FRS_ERR_AUTHENTICATION) + CHK_ERR_WIN32A(FRS_ERR_PARENT_INSUFFICIENT_PRIV) + CHK_ERR_WIN32A(FRS_ERR_PARENT_AUTHENTICATION) + CHK_ERR_WIN32A(FRS_ERR_CHILD_TO_PARENT_COMM) + CHK_ERR_WIN32A(FRS_ERR_PARENT_TO_CHILD_COMM) + CHK_ERR_WIN32A(FRS_ERR_SYSVOL_POPULATE) + CHK_ERR_WIN32A(FRS_ERR_SYSVOL_POPULATE_TIMEOUT) + CHK_ERR_WIN32A(FRS_ERR_SYSVOL_IS_BUSY) + CHK_ERR_WIN32A(FRS_ERR_SYSVOL_DEMOTE) + CHK_ERR_WIN32A(FRS_ERR_INVALID_SERVICE_PARAMETER) +// CHK_ERR_WIN32A(DS_S_SUCCESS) + CHK_ERR_WIN32A(ERROR_DS_NOT_INSTALLED) + CHK_ERR_WIN32A(ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY) + CHK_ERR_WIN32A(ERROR_DS_NO_ATTRIBUTE_OR_VALUE) + CHK_ERR_WIN32A(ERROR_DS_INVALID_ATTRIBUTE_SYNTAX) + CHK_ERR_WIN32A(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED) + CHK_ERR_WIN32A(ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS) + CHK_ERR_WIN32A(ERROR_DS_BUSY) + CHK_ERR_WIN32A(ERROR_DS_UNAVAILABLE) + CHK_ERR_WIN32A(ERROR_DS_NO_RIDS_ALLOCATED) + CHK_ERR_WIN32A(ERROR_DS_NO_MORE_RIDS) + CHK_ERR_WIN32A(ERROR_DS_INCORRECT_ROLE_OWNER) + CHK_ERR_WIN32A(ERROR_DS_RIDMGR_INIT_ERROR) + CHK_ERR_WIN32A(ERROR_DS_OBJ_CLASS_VIOLATION) + CHK_ERR_WIN32A(ERROR_DS_CANT_ON_NON_LEAF) + CHK_ERR_WIN32A(ERROR_DS_CANT_ON_RDN) + CHK_ERR_WIN32A(ERROR_DS_CANT_MOD_OBJ_CLASS) + CHK_ERR_WIN32A(ERROR_DS_CROSS_DOM_MOVE_ERROR) + CHK_ERR_WIN32A(ERROR_DS_GC_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_SHARED_POLICY) + CHK_ERR_WIN32A(ERROR_POLICY_OBJECT_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_POLICY_ONLY_IN_DS) + CHK_ERR_WIN32A(ERROR_PROMOTION_ACTIVE) + CHK_ERR_WIN32A(ERROR_NO_PROMOTION_ACTIVE) + CHK_ERR_WIN32A(ERROR_DS_OPERATIONS_ERROR) + CHK_ERR_WIN32A(ERROR_DS_PROTOCOL_ERROR) + CHK_ERR_WIN32A(ERROR_DS_TIMELIMIT_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DS_SIZELIMIT_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DS_ADMIN_LIMIT_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DS_COMPARE_FALSE) + CHK_ERR_WIN32A(ERROR_DS_COMPARE_TRUE) + CHK_ERR_WIN32A(ERROR_DS_AUTH_METHOD_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_DS_STRONG_AUTH_REQUIRED) + CHK_ERR_WIN32A(ERROR_DS_INAPPROPRIATE_AUTH) + CHK_ERR_WIN32A(ERROR_DS_AUTH_UNKNOWN) + CHK_ERR_WIN32A(ERROR_DS_REFERRAL) + CHK_ERR_WIN32A(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION) + CHK_ERR_WIN32A(ERROR_DS_CONFIDENTIALITY_REQUIRED) + CHK_ERR_WIN32A(ERROR_DS_INAPPROPRIATE_MATCHING) + CHK_ERR_WIN32A(ERROR_DS_CONSTRAINT_VIOLATION) + CHK_ERR_WIN32A(ERROR_DS_NO_SUCH_OBJECT) + CHK_ERR_WIN32A(ERROR_DS_ALIAS_PROBLEM) + CHK_ERR_WIN32A(ERROR_DS_INVALID_DN_SYNTAX) + CHK_ERR_WIN32A(ERROR_DS_IS_LEAF) + CHK_ERR_WIN32A(ERROR_DS_ALIAS_DEREF_PROBLEM) + CHK_ERR_WIN32A(ERROR_DS_UNWILLING_TO_PERFORM) + CHK_ERR_WIN32A(ERROR_DS_LOOP_DETECT) + CHK_ERR_WIN32A(ERROR_DS_NAMING_VIOLATION) + CHK_ERR_WIN32A(ERROR_DS_OBJECT_RESULTS_TOO_LARGE) + CHK_ERR_WIN32A(ERROR_DS_AFFECTS_MULTIPLE_DSAS) + CHK_ERR_WIN32A(ERROR_DS_SERVER_DOWN) + CHK_ERR_WIN32A(ERROR_DS_LOCAL_ERROR) + CHK_ERR_WIN32A(ERROR_DS_ENCODING_ERROR) + CHK_ERR_WIN32A(ERROR_DS_DECODING_ERROR) + CHK_ERR_WIN32A(ERROR_DS_FILTER_UNKNOWN) + CHK_ERR_WIN32A(ERROR_DS_PARAM_ERROR) + CHK_ERR_WIN32A(ERROR_DS_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_DS_NO_RESULTS_RETURNED) + CHK_ERR_WIN32A(ERROR_DS_CONTROL_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_DS_CLIENT_LOOP) + CHK_ERR_WIN32A(ERROR_DS_REFERRAL_LIMIT_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DS_ROOT_MUST_BE_NC) + CHK_ERR_WIN32A(ERROR_DS_ADD_REPLICA_INHIBITED) + CHK_ERR_WIN32A(ERROR_DS_ATT_NOT_DEF_IN_SCHEMA) + CHK_ERR_WIN32A(ERROR_DS_MAX_OBJ_SIZE_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DS_OBJ_STRING_NAME_EXISTS) + CHK_ERR_WIN32A(ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA) + CHK_ERR_WIN32A(ERROR_DS_RDN_DOESNT_MATCH_SCHEMA) + CHK_ERR_WIN32A(ERROR_DS_NO_REQUESTED_ATTS_FOUND) + CHK_ERR_WIN32A(ERROR_DS_USER_BUFFER_TO_SMALL) + CHK_ERR_WIN32A(ERROR_DS_ATT_IS_NOT_ON_OBJ) + CHK_ERR_WIN32A(ERROR_DS_ILLEGAL_MOD_OPERATION) + CHK_ERR_WIN32A(ERROR_DS_OBJ_TOO_LARGE) + CHK_ERR_WIN32A(ERROR_DS_BAD_INSTANCE_TYPE) + CHK_ERR_WIN32A(ERROR_DS_MASTERDSA_REQUIRED) + CHK_ERR_WIN32A(ERROR_DS_OBJECT_CLASS_REQUIRED) + CHK_ERR_WIN32A(ERROR_DS_MISSING_REQUIRED_ATT) + CHK_ERR_WIN32A(ERROR_DS_ATT_NOT_DEF_FOR_CLASS) + CHK_ERR_WIN32A(ERROR_DS_ATT_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_DS_CANT_ADD_ATT_VALUES) + CHK_ERR_WIN32A(ERROR_DS_SINGLE_VALUE_CONSTRAINT) + CHK_ERR_WIN32A(ERROR_DS_RANGE_CONSTRAINT) + CHK_ERR_WIN32A(ERROR_DS_ATT_VAL_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_DS_CANT_REM_MISSING_ATT) + CHK_ERR_WIN32A(ERROR_DS_CANT_REM_MISSING_ATT_VAL) + CHK_ERR_WIN32A(ERROR_DS_ROOT_CANT_BE_SUBREF) + CHK_ERR_WIN32A(ERROR_DS_NO_CHAINING) + CHK_ERR_WIN32A(ERROR_DS_NO_CHAINED_EVAL) + CHK_ERR_WIN32A(ERROR_DS_NO_PARENT_OBJECT) + CHK_ERR_WIN32A(ERROR_DS_PARENT_IS_AN_ALIAS) + CHK_ERR_WIN32A(ERROR_DS_CANT_MIX_MASTER_AND_REPS) + CHK_ERR_WIN32A(ERROR_DS_CHILDREN_EXIST) + CHK_ERR_WIN32A(ERROR_DS_OBJ_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_DS_ALIASED_OBJ_MISSING) + CHK_ERR_WIN32A(ERROR_DS_BAD_NAME_SYNTAX) + CHK_ERR_WIN32A(ERROR_DS_ALIAS_POINTS_TO_ALIAS) + CHK_ERR_WIN32A(ERROR_DS_CANT_DEREF_ALIAS) + CHK_ERR_WIN32A(ERROR_DS_OUT_OF_SCOPE) + CHK_ERR_WIN32A(ERROR_DS_CANT_DELETE_DSA_OBJ) + CHK_ERR_WIN32A(ERROR_DS_GENERIC_ERROR) + CHK_ERR_WIN32A(ERROR_DS_DSA_MUST_BE_INT_MASTER) + CHK_ERR_WIN32A(ERROR_DS_CLASS_NOT_DSA) + CHK_ERR_WIN32A(ERROR_DS_INSUFF_ACCESS_RIGHTS) + CHK_ERR_WIN32A(ERROR_DS_ILLEGAL_SUPERIOR) + CHK_ERR_WIN32A(ERROR_DS_ATTRIBUTE_OWNED_BY_SAM) + CHK_ERR_WIN32A(ERROR_DS_NAME_TOO_MANY_PARTS) + CHK_ERR_WIN32A(ERROR_DS_NAME_TOO_LONG) + CHK_ERR_WIN32A(ERROR_DS_NAME_VALUE_TOO_LONG) + CHK_ERR_WIN32A(ERROR_DS_NAME_UNPARSEABLE) + CHK_ERR_WIN32A(ERROR_DS_NAME_TYPE_UNKNOWN) + CHK_ERR_WIN32A(ERROR_DS_NOT_AN_OBJECT) + CHK_ERR_WIN32A(ERROR_DS_SEC_DESC_TOO_SHORT) + CHK_ERR_WIN32A(ERROR_DS_SEC_DESC_INVALID) + CHK_ERR_WIN32A(ERROR_DS_NO_DELETED_NAME) + CHK_ERR_WIN32A(ERROR_DS_SUBREF_MUST_HAVE_PARENT) + CHK_ERR_WIN32A(ERROR_DS_NCNAME_MUST_BE_NC) + CHK_ERR_WIN32A(ERROR_DS_CANT_ADD_SYSTEM_ONLY) + CHK_ERR_WIN32A(ERROR_DS_CLASS_MUST_BE_CONCRETE) + CHK_ERR_WIN32A(ERROR_DS_INVALID_DMD) + CHK_ERR_WIN32A(ERROR_DS_OBJ_GUID_EXISTS) + CHK_ERR_WIN32A(ERROR_DS_NOT_ON_BACKLINK) + CHK_ERR_WIN32A(ERROR_DS_NO_CROSSREF_FOR_NC) + CHK_ERR_WIN32A(ERROR_DS_SHUTTING_DOWN) + CHK_ERR_WIN32A(ERROR_DS_UNKNOWN_OPERATION) + CHK_ERR_WIN32A(ERROR_DS_INVALID_ROLE_OWNER) + CHK_ERR_WIN32A(ERROR_DS_COULDNT_CONTACT_FSMO) + CHK_ERR_WIN32A(ERROR_DS_CROSS_NC_DN_RENAME) + CHK_ERR_WIN32A(ERROR_DS_CANT_MOD_SYSTEM_ONLY) + CHK_ERR_WIN32A(ERROR_DS_REPLICATOR_ONLY) + CHK_ERR_WIN32A(ERROR_DS_OBJ_CLASS_NOT_DEFINED) + CHK_ERR_WIN32A(ERROR_DS_OBJ_CLASS_NOT_SUBCLASS) + CHK_ERR_WIN32A(ERROR_DS_NAME_REFERENCE_INVALID) + CHK_ERR_WIN32A(ERROR_DS_CROSS_REF_EXISTS) + CHK_ERR_WIN32A(ERROR_DS_CANT_DEL_MASTER_CROSSREF) + CHK_ERR_WIN32A(ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD) + CHK_ERR_WIN32A(ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX) + CHK_ERR_WIN32A(ERROR_DS_DUP_RDN) + CHK_ERR_WIN32A(ERROR_DS_DUP_OID) + CHK_ERR_WIN32A(ERROR_DS_DUP_MAPI_ID) + CHK_ERR_WIN32A(ERROR_DS_DUP_SCHEMA_ID_GUID) + CHK_ERR_WIN32A(ERROR_DS_DUP_LDAP_DISPLAY_NAME) + CHK_ERR_WIN32A(ERROR_DS_SEMANTIC_ATT_TEST) + CHK_ERR_WIN32A(ERROR_DS_SYNTAX_MISMATCH) + CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_MUST_HAVE) + CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_MAY_HAVE) + CHK_ERR_WIN32A(ERROR_DS_NONEXISTENT_MAY_HAVE) + CHK_ERR_WIN32A(ERROR_DS_NONEXISTENT_MUST_HAVE) + CHK_ERR_WIN32A(ERROR_DS_AUX_CLS_TEST_FAIL) + CHK_ERR_WIN32A(ERROR_DS_NONEXISTENT_POSS_SUP) + CHK_ERR_WIN32A(ERROR_DS_SUB_CLS_TEST_FAIL) + CHK_ERR_WIN32A(ERROR_DS_BAD_RDN_ATT_ID_SYNTAX) + CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_AUX_CLS) + CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_SUB_CLS) + CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_POSS_SUP) + CHK_ERR_WIN32A(ERROR_DS_RECALCSCHEMA_FAILED) + CHK_ERR_WIN32A(ERROR_DS_TREE_DELETE_NOT_FINISHED) + CHK_ERR_WIN32A(ERROR_DS_CANT_DELETE) + CHK_ERR_WIN32A(ERROR_DS_ATT_SCHEMA_REQ_ID) + CHK_ERR_WIN32A(ERROR_DS_BAD_ATT_SCHEMA_SYNTAX) + CHK_ERR_WIN32A(ERROR_DS_CANT_CACHE_ATT) + CHK_ERR_WIN32A(ERROR_DS_CANT_CACHE_CLASS) + CHK_ERR_WIN32A(ERROR_DS_CANT_REMOVE_ATT_CACHE) + CHK_ERR_WIN32A(ERROR_DS_CANT_REMOVE_CLASS_CACHE) + CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_DN) + CHK_ERR_WIN32A(ERROR_DS_MISSING_SUPREF) + CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_INSTANCE) + CHK_ERR_WIN32A(ERROR_DS_CODE_INCONSISTENCY) + CHK_ERR_WIN32A(ERROR_DS_DATABASE_ERROR) + CHK_ERR_WIN32A(ERROR_DS_GOVERNSID_MISSING) + CHK_ERR_WIN32A(ERROR_DS_MISSING_EXPECTED_ATT) + CHK_ERR_WIN32A(ERROR_DS_NCNAME_MISSING_CR_REF) + CHK_ERR_WIN32A(ERROR_DS_SECURITY_CHECKING_ERROR) + CHK_ERR_WIN32A(ERROR_DS_SCHEMA_NOT_LOADED) + CHK_ERR_WIN32A(ERROR_DS_SCHEMA_ALLOC_FAILED) + CHK_ERR_WIN32A(ERROR_DS_ATT_SCHEMA_REQ_SYNTAX) + CHK_ERR_WIN32A(ERROR_DS_GCVERIFY_ERROR) + CHK_ERR_WIN32A(ERROR_DS_DRA_SCHEMA_MISMATCH) + CHK_ERR_WIN32A(ERROR_DS_CANT_FIND_DSA_OBJ) + CHK_ERR_WIN32A(ERROR_DS_CANT_FIND_EXPECTED_NC) + CHK_ERR_WIN32A(ERROR_DS_CANT_FIND_NC_IN_CACHE) + CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_CHILD) + CHK_ERR_WIN32A(ERROR_DS_SECURITY_ILLEGAL_MODIFY) + CHK_ERR_WIN32A(ERROR_DS_CANT_REPLACE_HIDDEN_REC) + CHK_ERR_WIN32A(ERROR_DS_BAD_HIERARCHY_FILE) + CHK_ERR_WIN32A(ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED) + CHK_ERR_WIN32A(ERROR_DS_CONFIG_PARAM_MISSING) + CHK_ERR_WIN32A(ERROR_DS_COUNTING_AB_INDICES_FAILED) + CHK_ERR_WIN32A(ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED) + CHK_ERR_WIN32A(ERROR_DS_INTERNAL_FAILURE) + CHK_ERR_WIN32A(ERROR_DS_UNKNOWN_ERROR) + CHK_ERR_WIN32A(ERROR_DS_ROOT_REQUIRES_CLASS_TOP) + CHK_ERR_WIN32A(ERROR_DS_REFUSING_FSMO_ROLES) + CHK_ERR_WIN32A(ERROR_DS_MISSING_FSMO_SETTINGS) + CHK_ERR_WIN32A(ERROR_DS_UNABLE_TO_SURRENDER_ROLES) + CHK_ERR_WIN32A(ERROR_DS_DRA_GENERIC) + CHK_ERR_WIN32A(ERROR_DS_DRA_INVALID_PARAMETER) + CHK_ERR_WIN32A(ERROR_DS_DRA_BUSY) + CHK_ERR_WIN32A(ERROR_DS_DRA_BAD_DN) + CHK_ERR_WIN32A(ERROR_DS_DRA_BAD_NC) + CHK_ERR_WIN32A(ERROR_DS_DRA_DN_EXISTS) + CHK_ERR_WIN32A(ERROR_DS_DRA_INTERNAL_ERROR) + CHK_ERR_WIN32A(ERROR_DS_DRA_INCONSISTENT_DIT) + CHK_ERR_WIN32A(ERROR_DS_DRA_CONNECTION_FAILED) + CHK_ERR_WIN32A(ERROR_DS_DRA_BAD_INSTANCE_TYPE) + CHK_ERR_WIN32A(ERROR_DS_DRA_OUT_OF_MEM) + CHK_ERR_WIN32A(ERROR_DS_DRA_MAIL_PROBLEM) + CHK_ERR_WIN32A(ERROR_DS_DRA_REF_ALREADY_EXISTS) + CHK_ERR_WIN32A(ERROR_DS_DRA_REF_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_DS_DRA_OBJ_IS_REP_SOURCE) + CHK_ERR_WIN32A(ERROR_DS_DRA_DB_ERROR) + CHK_ERR_WIN32A(ERROR_DS_DRA_NO_REPLICA) + CHK_ERR_WIN32A(ERROR_DS_DRA_ACCESS_DENIED) + CHK_ERR_WIN32A(ERROR_DS_DRA_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_DS_DRA_RPC_CANCELLED) + CHK_ERR_WIN32A(ERROR_DS_DRA_SOURCE_DISABLED) + CHK_ERR_WIN32A(ERROR_DS_DRA_SINK_DISABLED) + CHK_ERR_WIN32A(ERROR_DS_DRA_NAME_COLLISION) + CHK_ERR_WIN32A(ERROR_DS_DRA_SOURCE_REINSTALLED) + CHK_ERR_WIN32A(ERROR_DS_DRA_MISSING_PARENT) + CHK_ERR_WIN32A(ERROR_DS_DRA_PREEMPTED) + CHK_ERR_WIN32A(ERROR_DS_DRA_ABANDON_SYNC) + CHK_ERR_WIN32A(ERROR_DS_DRA_SHUTDOWN) + CHK_ERR_WIN32A(ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET) + CHK_ERR_WIN32A(ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA) + CHK_ERR_WIN32A(ERROR_DS_DRA_EXTN_CONNECTION_FAILED) + CHK_ERR_WIN32A(ERROR_DS_INSTALL_SCHEMA_MISMATCH) + CHK_ERR_WIN32A(ERROR_DS_DUP_LINK_ID) + CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_RESOLVING) + CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_NOT_UNIQUE) + CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_NO_MAPPING) + CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_DOMAIN_ONLY) + CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING) + CHK_ERR_WIN32A(ERROR_DS_CONSTRUCTED_ATT_MOD) + CHK_ERR_WIN32A(ERROR_DS_WRONG_OM_OBJ_CLASS) + CHK_ERR_WIN32A(ERROR_DS_DRA_REPL_PENDING) + CHK_ERR_WIN32A(DNS_ERROR_RESPONSE_CODES_BASE) +// CHK_ERR_WIN32A(DNS_ERROR_MASK) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_FORMAT_ERROR) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_SERVER_FAILURE) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_NAME_ERROR) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_NOT_IMPLEMENTED) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_REFUSED) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_YXDOMAIN) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_YXRRSET) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_NXRRSET) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_NOTAUTH) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_NOTZONE) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_BADSIG) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_BADKEY) + CHK_ERR_WIN32A(DNS_ERROR_RCODE_BADTIME) + CHK_ERR_WIN32A(DNS_ERROR_PACKET_FMT_BASE) + CHK_ERR_WIN32A(DNS_INFO_NO_RECORDS) + CHK_ERR_WIN32A(DNS_ERROR_BAD_PACKET) + CHK_ERR_WIN32A(DNS_ERROR_NO_PACKET) + CHK_ERR_WIN32A(DNS_ERROR_RCODE) + CHK_ERR_WIN32A(DNS_ERROR_UNSECURE_PACKET) + CHK_ERR_WIN32A(DNS_ERROR_GENERAL_API_BASE) + CHK_ERR_WIN32A(DNS_ERROR_INVALID_TYPE) + CHK_ERR_WIN32A(DNS_ERROR_INVALID_IP_ADDRESS) + CHK_ERR_WIN32A(DNS_ERROR_INVALID_PROPERTY) + CHK_ERR_WIN32A(DNS_ERROR_TRY_AGAIN_LATER) + CHK_ERR_WIN32A(DNS_ERROR_NOT_UNIQUE) + CHK_ERR_WIN32A(DNS_ERROR_NON_RFC_NAME) + CHK_ERR_WIN32A(DNS_STATUS_FQDN) + CHK_ERR_WIN32A(DNS_STATUS_DOTTED_NAME) + CHK_ERR_WIN32A(DNS_STATUS_SINGLE_PART_NAME) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_BASE) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_DOES_NOT_EXIST) + CHK_ERR_WIN32A(DNS_ERROR_NO_ZONE_INFO) + CHK_ERR_WIN32A(DNS_ERROR_INVALID_ZONE_OPERATION) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_CONFIGURATION_ERROR) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_HAS_NO_SOA_RECORD) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_HAS_NO_NS_RECORDS) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_LOCKED) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_CREATION_FAILED) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_ALREADY_EXISTS) + CHK_ERR_WIN32A(DNS_ERROR_AUTOZONE_ALREADY_EXISTS) + CHK_ERR_WIN32A(DNS_ERROR_INVALID_ZONE_TYPE) + CHK_ERR_WIN32A(DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_NOT_SECONDARY) + CHK_ERR_WIN32A(DNS_ERROR_NEED_SECONDARY_ADDRESSES) + CHK_ERR_WIN32A(DNS_ERROR_WINS_INIT_FAILED) + CHK_ERR_WIN32A(DNS_ERROR_NEED_WINS_SERVERS) + CHK_ERR_WIN32A(DNS_ERROR_NBSTAT_INIT_FAILED) + CHK_ERR_WIN32A(DNS_ERROR_SOA_DELETE_INVALID) + CHK_ERR_WIN32A(DNS_ERROR_DATAFILE_BASE) + CHK_ERR_WIN32A(DNS_ERROR_PRIMARY_REQUIRES_DATAFILE) + CHK_ERR_WIN32A(DNS_ERROR_INVALID_DATAFILE_NAME) + CHK_ERR_WIN32A(DNS_ERROR_DATAFILE_OPEN_FAILURE) + CHK_ERR_WIN32A(DNS_ERROR_FILE_WRITEBACK_FAILED) + CHK_ERR_WIN32A(DNS_ERROR_DATAFILE_PARSING) + CHK_ERR_WIN32A(DNS_ERROR_DATABASE_BASE) + CHK_ERR_WIN32A(DNS_ERROR_RECORD_DOES_NOT_EXIST) + CHK_ERR_WIN32A(DNS_ERROR_RECORD_FORMAT) + CHK_ERR_WIN32A(DNS_ERROR_NODE_CREATION_FAILED) + CHK_ERR_WIN32A(DNS_ERROR_UNKNOWN_RECORD_TYPE) + CHK_ERR_WIN32A(DNS_ERROR_RECORD_TIMED_OUT) + CHK_ERR_WIN32A(DNS_ERROR_NAME_NOT_IN_ZONE) + CHK_ERR_WIN32A(DNS_ERROR_CNAME_LOOP) + CHK_ERR_WIN32A(DNS_ERROR_NODE_IS_CNAME) + CHK_ERR_WIN32A(DNS_ERROR_CNAME_COLLISION) + CHK_ERR_WIN32A(DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT) + CHK_ERR_WIN32A(DNS_ERROR_RECORD_ALREADY_EXISTS) + CHK_ERR_WIN32A(DNS_ERROR_SECONDARY_DATA) + CHK_ERR_WIN32A(DNS_ERROR_NO_CREATE_CACHE_DATA) + CHK_ERR_WIN32A(DNS_ERROR_NAME_DOES_NOT_EXIST) + CHK_ERR_WIN32A(DNS_WARNING_PTR_CREATE_FAILED) + CHK_ERR_WIN32A(DNS_WARNING_DOMAIN_UNDELETED) + CHK_ERR_WIN32A(DNS_ERROR_DS_UNAVAILABLE) + CHK_ERR_WIN32A(DNS_ERROR_DS_ZONE_ALREADY_EXISTS) + CHK_ERR_WIN32A(DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE) + CHK_ERR_WIN32A(DNS_ERROR_OPERATION_BASE) + CHK_ERR_WIN32A(DNS_INFO_AXFR_COMPLETE) + CHK_ERR_WIN32A(DNS_ERROR_AXFR) + CHK_ERR_WIN32A(DNS_INFO_ADDED_LOCAL_WINS) + CHK_ERR_WIN32A(DNS_ERROR_SECURE_BASE) + CHK_ERR_WIN32A(DNS_STATUS_CONTINUE_NEEDED) + CHK_ERR_WIN32A(DNS_ERROR_SETUP_BASE) + CHK_ERR_WIN32A(DNS_ERROR_NO_TCPIP) + CHK_ERR_WIN32A(DNS_ERROR_NO_DNS_SERVERS) + CHK_ERR_WIN32A(WSABASEERR) + CHK_ERR_WIN32A(WSAEINTR) + CHK_ERR_WIN32A(WSAEBADF) + CHK_ERR_WIN32A(WSAEACCES) + CHK_ERR_WIN32A(WSAEFAULT) + CHK_ERR_WIN32A(WSAEINVAL) + CHK_ERR_WIN32A(WSAEMFILE) + CHK_ERR_WIN32A(WSAEWOULDBLOCK) + CHK_ERR_WIN32A(WSAEINPROGRESS) + CHK_ERR_WIN32A(WSAEALREADY) + CHK_ERR_WIN32A(WSAENOTSOCK) + CHK_ERR_WIN32A(WSAEDESTADDRREQ) + CHK_ERR_WIN32A(WSAEMSGSIZE) + CHK_ERR_WIN32A(WSAEPROTOTYPE) + CHK_ERR_WIN32A(WSAENOPROTOOPT) + CHK_ERR_WIN32A(WSAEPROTONOSUPPORT) + CHK_ERR_WIN32A(WSAESOCKTNOSUPPORT) + CHK_ERR_WIN32A(WSAEOPNOTSUPP) + CHK_ERR_WIN32A(WSAEPFNOSUPPORT) + CHK_ERR_WIN32A(WSAEAFNOSUPPORT) + CHK_ERR_WIN32A(WSAEADDRINUSE) + CHK_ERR_WIN32A(WSAEADDRNOTAVAIL) + CHK_ERR_WIN32A(WSAENETDOWN) + CHK_ERR_WIN32A(WSAENETUNREACH) + CHK_ERR_WIN32A(WSAENETRESET) + CHK_ERR_WIN32A(WSAECONNABORTED) + CHK_ERR_WIN32A(WSAECONNRESET) + CHK_ERR_WIN32A(WSAENOBUFS) + CHK_ERR_WIN32A(WSAEISCONN) + CHK_ERR_WIN32A(WSAENOTCONN) + CHK_ERR_WIN32A(WSAESHUTDOWN) + CHK_ERR_WIN32A(WSAETOOMANYREFS) + CHK_ERR_WIN32A(WSAETIMEDOUT) + CHK_ERR_WIN32A(WSAECONNREFUSED) + CHK_ERR_WIN32A(WSAELOOP) + CHK_ERR_WIN32A(WSAENAMETOOLONG) + CHK_ERR_WIN32A(WSAEHOSTDOWN) + CHK_ERR_WIN32A(WSAEHOSTUNREACH) + CHK_ERR_WIN32A(WSAENOTEMPTY) + CHK_ERR_WIN32A(WSAEPROCLIM) + CHK_ERR_WIN32A(WSAEUSERS) + CHK_ERR_WIN32A(WSAEDQUOT) + CHK_ERR_WIN32A(WSAESTALE) + CHK_ERR_WIN32A(WSAEREMOTE) + CHK_ERR_WIN32A(WSASYSNOTREADY) + CHK_ERR_WIN32A(WSAVERNOTSUPPORTED) + CHK_ERR_WIN32A(WSANOTINITIALISED) + CHK_ERR_WIN32A(WSAEDISCON) + CHK_ERR_WIN32A(WSAENOMORE) + CHK_ERR_WIN32A(WSAECANCELLED) + CHK_ERR_WIN32A(WSAEINVALIDPROCTABLE) + CHK_ERR_WIN32A(WSAEINVALIDPROVIDER) + CHK_ERR_WIN32A(WSAEPROVIDERFAILEDINIT) + CHK_ERR_WIN32A(WSASYSCALLFAILURE) + CHK_ERR_WIN32A(WSASERVICE_NOT_FOUND) + CHK_ERR_WIN32A(WSATYPE_NOT_FOUND) + CHK_ERR_WIN32A(WSA_E_NO_MORE) + CHK_ERR_WIN32A(WSA_E_CANCELLED) + CHK_ERR_WIN32A(WSAEREFUSED) + CHK_ERR_WIN32A(WSAHOST_NOT_FOUND) + CHK_ERR_WIN32A(WSATRY_AGAIN) + CHK_ERR_WIN32A(WSANO_RECOVERY) + CHK_ERR_WIN32A(WSANO_DATA) + CHK_ERR_WIN32A(WSA_QOS_RECEIVERS) + CHK_ERR_WIN32A(WSA_QOS_SENDERS) + CHK_ERR_WIN32A(WSA_QOS_NO_SENDERS) + CHK_ERR_WIN32A(WSA_QOS_NO_RECEIVERS) + CHK_ERR_WIN32A(WSA_QOS_REQUEST_CONFIRMED) + CHK_ERR_WIN32A(WSA_QOS_ADMISSION_FAILURE) + CHK_ERR_WIN32A(WSA_QOS_POLICY_FAILURE) + CHK_ERR_WIN32A(WSA_QOS_BAD_STYLE) + CHK_ERR_WIN32A(WSA_QOS_BAD_OBJECT) + CHK_ERR_WIN32A(WSA_QOS_TRAFFIC_CTRL_ERROR) + CHK_ERR_WIN32A(WSA_QOS_GENERIC_ERROR) + + CHK_ERRA(CO_E_ATTEMPT_TO_CREATE_OUTSIDE_CLIENT_CONTEXT) + CHK_ERRA(CO_E_SERVER_PAUSED) + CHK_ERRA(CO_E_SERVER_NOT_PAUSED) + CHK_ERRA(CO_E_CLASS_DISABLED) + CHK_ERRA(CO_E_CLRNOTAVAILABLE) + CHK_ERRA(CO_E_ASYNC_WORK_REJECTED) + CHK_ERRA(CO_E_SERVER_INIT_TIMEOUT) + CHK_ERRA(CO_E_NO_SECCTX_IN_ACTIVATE) + CHK_ERRA(CO_E_TRACKER_CONFIG) + CHK_ERRA(CO_E_THREADPOOL_CONFIG) + CHK_ERRA(CO_E_SXS_CONFIG) + CHK_ERRA(CO_E_MALFORMED_SPN) + CHK_ERRA(REGDB_E_BADTHREADINGMODEL) +// CHK_ERRA(EVENT_E_FIRST) +// CHK_ERRA(EVENT_E_LAST) +// CHK_ERRA(EVENT_S_FIRST) +// CHK_ERRA(EVENT_S_LAST) +// CHK_ERRA(EVENT_S_SOME_SUBSCRIBERS_FAILED) +// CHK_ERRA(EVENT_E_ALL_SUBSCRIBERS_FAILED) + CHK_ERRA(EVENT_S_NOSUBSCRIBERS) +// CHK_ERRA(EVENT_E_QUERYSYNTAX) +// CHK_ERRA(EVENT_E_QUERYFIELD) +// CHK_ERRA(EVENT_E_INTERNALEXCEPTION) +// CHK_ERRA(EVENT_E_INTERNALERROR) +// CHK_ERRA(EVENT_E_INVALID_PER_USER_SID) +// CHK_ERRA(EVENT_E_USER_EXCEPTION) +// CHK_ERRA(EVENT_E_TOO_MANY_METHODS) +// CHK_ERRA(EVENT_E_MISSING_EVENTCLASS) +// CHK_ERRA(EVENT_E_NOT_ALL_REMOVED) +// CHK_ERRA(EVENT_E_COMPLUS_NOT_INSTALLED) +// CHK_ERRA(EVENT_E_CANT_MODIFY_OR_DELETE_UNCONFIGURED_OBJECT) +// CHK_ERRA(EVENT_E_CANT_MODIFY_OR_DELETE_CONFIGURED_OBJECT) +// CHK_ERRA(EVENT_E_INVALID_EVENT_CLASS_PARTITION) +// CHK_ERRA(EVENT_E_PER_USER_SID_NOT_LOGGED_ON) + CHK_ERRA(CONTEXT_E_FIRST) + CHK_ERRA(CONTEXT_E_LAST) + CHK_ERRA(CONTEXT_S_FIRST) + CHK_ERRA(CONTEXT_S_LAST) + CHK_ERRA(CONTEXT_E_ABORTED) + CHK_ERRA(CONTEXT_E_ABORTING) + CHK_ERRA(CONTEXT_E_NOCONTEXT) +// CHK_ERRA(CONTEXT_E_WOULD_DEADLOCK) + CHK_ERRA(CONTEXT_E_SYNCH_TIMEOUT) + CHK_ERRA(CONTEXT_E_OLDREF) + CHK_ERRA(CONTEXT_E_ROLENOTFOUND) + CHK_ERRA(CONTEXT_E_TMNOTAVAILABLE) + CHK_ERRA(CO_E_ACTIVATIONFAILED) + CHK_ERRA(CO_E_ACTIVATIONFAILED_EVENTLOGGED) + CHK_ERRA(CO_E_ACTIVATIONFAILED_CATALOGERROR) + CHK_ERRA(CO_E_ACTIVATIONFAILED_TIMEOUT) + CHK_ERRA(CO_E_INITIALIZATIONFAILED) + CHK_ERRA(CONTEXT_E_NOJIT) + CHK_ERRA(CONTEXT_E_NOTRANSACTION) + CHK_ERRA(CO_E_THREADINGMODEL_CHANGED) + CHK_ERRA(CO_E_NOIISINTRINSICS) + CHK_ERRA(CO_E_NOCOOKIES) + CHK_ERRA(CO_E_DBERROR) + CHK_ERRA(CO_E_NOTPOOLED) + CHK_ERRA(CO_E_NOTCONSTRUCTED) + CHK_ERRA(CO_E_NOSYNCHRONIZATION) +// CHK_ERRA(CO_E_ISOLEVELMISMATCH) + CHK_ERRA(SCHED_S_TASK_READY) + CHK_ERRA(SCHED_S_TASK_RUNNING) + CHK_ERRA(SCHED_S_TASK_DISABLED) + CHK_ERRA(SCHED_S_TASK_HAS_NOT_RUN) + CHK_ERRA(SCHED_S_TASK_NO_MORE_RUNS) + CHK_ERRA(SCHED_S_TASK_NOT_SCHEDULED) + CHK_ERRA(SCHED_S_TASK_TERMINATED) + CHK_ERRA(SCHED_S_TASK_NO_VALID_TRIGGERS) + CHK_ERRA(SCHED_S_EVENT_TRIGGER) + CHK_ERRA(SCHED_E_TRIGGER_NOT_FOUND) + CHK_ERRA(SCHED_E_TASK_NOT_READY) + CHK_ERRA(SCHED_E_TASK_NOT_RUNNING) + CHK_ERRA(SCHED_E_SERVICE_NOT_INSTALLED) + CHK_ERRA(SCHED_E_CANNOT_OPEN_TASK) + CHK_ERRA(SCHED_E_INVALID_TASK) + CHK_ERRA(SCHED_E_ACCOUNT_INFORMATION_NOT_SET) + CHK_ERRA(SCHED_E_ACCOUNT_NAME_NOT_FOUND) + CHK_ERRA(SCHED_E_ACCOUNT_DBASE_CORRUPT) + CHK_ERRA(SCHED_E_NO_SECURITY_SERVICES) + CHK_ERRA(SCHED_E_UNKNOWN_OBJECT_VERSION) + CHK_ERRA(SCHED_E_UNSUPPORTED_ACCOUNT_OPTION) + CHK_ERRA(SCHED_E_SERVICE_NOT_RUNNING) + CHK_ERRA(CO_S_MACHINENAMENOTFOUND) + CHK_ERRA(STG_E_STATUS_COPY_PROTECTION_FAILURE) + CHK_ERRA(STG_E_CSS_AUTHENTICATION_FAILURE) + CHK_ERRA(STG_E_CSS_KEY_NOT_PRESENT) + CHK_ERRA(STG_E_CSS_KEY_NOT_ESTABLISHED) + CHK_ERRA(STG_E_CSS_SCRAMBLED_SECTOR) + CHK_ERRA(STG_E_CSS_REGION_MISMATCH) + CHK_ERRA(STG_E_RESETS_EXHAUSTED) + CHK_ERRA(CO_E_CANCEL_DISABLED) + CHK_ERRA(ERROR_AUDITING_DISABLED) + CHK_ERRA(ERROR_ALL_SIDS_FILTERED) + CHK_ERRA(NTE_TEMPORARY_PROFILE) + CHK_ERRA(NTE_FIXEDPARAMETER) + CHK_ERRA(SEC_E_INSUFFICIENT_MEMORY) + CHK_ERRA(SEC_E_INVALID_HANDLE) + CHK_ERRA(SEC_E_UNSUPPORTED_FUNCTION) + CHK_ERRA(SEC_E_TARGET_UNKNOWN) + CHK_ERRA(SEC_E_INTERNAL_ERROR) + CHK_ERRA(SEC_E_SECPKG_NOT_FOUND) + CHK_ERRA(SEC_E_NOT_OWNER) + CHK_ERRA(SEC_E_CANNOT_INSTALL) + CHK_ERRA(SEC_E_INVALID_TOKEN) + CHK_ERRA(SEC_E_CANNOT_PACK) + CHK_ERRA(SEC_E_QOP_NOT_SUPPORTED) + CHK_ERRA(SEC_E_NO_IMPERSONATION) + CHK_ERRA(SEC_E_LOGON_DENIED) + CHK_ERRA(SEC_E_UNKNOWN_CREDENTIALS) + CHK_ERRA(SEC_E_NO_CREDENTIALS) + CHK_ERRA(SEC_E_MESSAGE_ALTERED) + CHK_ERRA(SEC_E_OUT_OF_SEQUENCE) + CHK_ERRA(SEC_E_NO_AUTHENTICATING_AUTHORITY) + CHK_ERRA(SEC_I_CONTINUE_NEEDED) + CHK_ERRA(SEC_I_COMPLETE_NEEDED) + CHK_ERRA(SEC_I_COMPLETE_AND_CONTINUE) + CHK_ERRA(SEC_I_LOCAL_LOGON) + CHK_ERRA(SEC_E_BAD_PKGID) + CHK_ERRA(SEC_E_CONTEXT_EXPIRED) + CHK_ERRA(SEC_I_CONTEXT_EXPIRED) + CHK_ERRA(SEC_E_INCOMPLETE_MESSAGE) + CHK_ERRA(SEC_E_INCOMPLETE_CREDENTIALS) + CHK_ERRA(SEC_E_BUFFER_TOO_SMALL) + CHK_ERRA(SEC_I_INCOMPLETE_CREDENTIALS) + CHK_ERRA(SEC_I_RENEGOTIATE) + CHK_ERRA(SEC_E_WRONG_PRINCIPAL) + CHK_ERRA(SEC_I_NO_LSA_CONTEXT) + CHK_ERRA(SEC_E_TIME_SKEW) + CHK_ERRA(SEC_E_UNTRUSTED_ROOT) + CHK_ERRA(SEC_E_ILLEGAL_MESSAGE) + CHK_ERRA(SEC_E_CERT_UNKNOWN) + CHK_ERRA(SEC_E_CERT_EXPIRED) + CHK_ERRA(SEC_E_ENCRYPT_FAILURE) + CHK_ERRA(SEC_E_DECRYPT_FAILURE) + CHK_ERRA(SEC_E_ALGORITHM_MISMATCH) + CHK_ERRA(SEC_E_SECURITY_QOS_FAILED) + CHK_ERRA(SEC_E_UNFINISHED_CONTEXT_DELETED) + CHK_ERRA(SEC_E_NO_TGT_REPLY) + CHK_ERRA(SEC_E_NO_IP_ADDRESSES) + CHK_ERRA(SEC_E_WRONG_CREDENTIAL_HANDLE) + CHK_ERRA(SEC_E_CRYPTO_SYSTEM_INVALID) + CHK_ERRA(SEC_E_MAX_REFERRALS_EXCEEDED) + CHK_ERRA(SEC_E_MUST_BE_KDC) + CHK_ERRA(SEC_E_STRONG_CRYPTO_NOT_SUPPORTED) + CHK_ERRA(SEC_E_TOO_MANY_PRINCIPALS) + CHK_ERRA(SEC_E_NO_PA_DATA) + CHK_ERRA(SEC_E_PKINIT_NAME_MISMATCH) + CHK_ERRA(SEC_E_SMARTCARD_LOGON_REQUIRED) + CHK_ERRA(SEC_E_SHUTDOWN_IN_PROGRESS) + CHK_ERRA(SEC_E_KDC_INVALID_REQUEST) + CHK_ERRA(SEC_E_KDC_UNABLE_TO_REFER) + CHK_ERRA(SEC_E_KDC_UNKNOWN_ETYPE) + CHK_ERRA(SEC_E_UNSUPPORTED_PREAUTH) + CHK_ERRA(SEC_E_DELEGATION_REQUIRED) + CHK_ERRA(SEC_E_BAD_BINDINGS) + CHK_ERRA(SEC_E_MULTIPLE_ACCOUNTS) + CHK_ERRA(SEC_E_NO_KERB_KEY) +// CHK_ERRA(SEC_E_CERT_WRONG_USAGE) +// CHK_ERRA(SEC_E_DOWNGRADE_DETECTED) + CHK_ERRA(SEC_E_SMARTCARD_CERT_REVOKED) + CHK_ERRA(SEC_E_ISSUING_CA_UNTRUSTED) + CHK_ERRA(SEC_E_REVOCATION_OFFLINE_C) + CHK_ERRA(SEC_E_PKINIT_CLIENT_FAILURE) + CHK_ERRA(SEC_E_SMARTCARD_CERT_EXPIRED) +// CHK_ERRA(SEC_E_NO_SPM) +// CHK_ERRA(SEC_E_NOT_SUPPORTED) + CHK_ERRA(CRYPT_I_NEW_PROTECTION_REQUIRED) + CHK_ERRA(CRYPT_E_MISSING_PUBKEY_PARA) + CHK_ERRA(CRYPT_E_ASN1_ERROR) + CHK_ERRA(CRYPT_E_ASN1_INTERNAL) + CHK_ERRA(CRYPT_E_ASN1_EOD) + CHK_ERRA(CRYPT_E_ASN1_CORRUPT) + CHK_ERRA(CRYPT_E_ASN1_LARGE) + CHK_ERRA(CRYPT_E_ASN1_CONSTRAINT) + CHK_ERRA(CRYPT_E_ASN1_MEMORY) + CHK_ERRA(CRYPT_E_ASN1_OVERFLOW) + CHK_ERRA(CRYPT_E_ASN1_BADPDU) + CHK_ERRA(CRYPT_E_ASN1_BADARGS) + CHK_ERRA(CRYPT_E_ASN1_BADREAL) + CHK_ERRA(CRYPT_E_ASN1_BADTAG) + CHK_ERRA(CRYPT_E_ASN1_CHOICE) + CHK_ERRA(CRYPT_E_ASN1_RULE) + CHK_ERRA(CRYPT_E_ASN1_UTF8) + CHK_ERRA(CRYPT_E_ASN1_PDU_TYPE) + CHK_ERRA(CRYPT_E_ASN1_NYI) + CHK_ERRA(CRYPT_E_ASN1_EXTENDED) + CHK_ERRA(CRYPT_E_ASN1_NOEOD) + CHK_ERRA(CERTSRV_E_SERVER_SUSPENDED) + CHK_ERRA(CERTSRV_E_ENCODING_LENGTH) + CHK_ERRA(CERTSRV_E_ROLECONFLICT) + CHK_ERRA(CERTSRV_E_RESTRICTEDOFFICER) + CHK_ERRA(CERTSRV_E_KEY_ARCHIVAL_NOT_CONFIGURED) + CHK_ERRA(CERTSRV_E_NO_VALID_KRA) + CHK_ERRA(CERTSRV_E_BAD_REQUEST_KEY_ARCHIVAL) + CHK_ERRA(CERTSRV_E_NO_CAADMIN_DEFINED) + CHK_ERRA(CERTSRV_E_BAD_RENEWAL_CERT_ATTRIBUTE) + CHK_ERRA(CERTSRV_E_NO_DB_SESSIONS) + CHK_ERRA(CERTSRV_E_ALIGNMENT_FAULT) + CHK_ERRA(CERTSRV_E_ENROLL_DENIED) + CHK_ERRA(CERTSRV_E_TEMPLATE_DENIED) +// CHK_ERRA(CERTSRV_E_DOWNLEVEL_DC_SSL_OR_UPGRADE) + CHK_ERRA(CERTSRV_E_TEMPLATE_CONFLICT) + CHK_ERRA(CERTSRV_E_SUBJECT_ALT_NAME_REQUIRED) + CHK_ERRA(CERTSRV_E_ARCHIVED_KEY_REQUIRED) + CHK_ERRA(CERTSRV_E_SMIME_REQUIRED) + CHK_ERRA(CERTSRV_E_BAD_RENEWAL_SUBJECT) + CHK_ERRA(CERTSRV_E_BAD_TEMPLATE_VERSION) + CHK_ERRA(CERTSRV_E_TEMPLATE_POLICY_REQUIRED) + CHK_ERRA(CERTSRV_E_SIGNATURE_POLICY_REQUIRED) + CHK_ERRA(CERTSRV_E_SIGNATURE_COUNT) + CHK_ERRA(CERTSRV_E_SIGNATURE_REJECTED) + CHK_ERRA(CERTSRV_E_ISSUANCE_POLICY_REQUIRED) + CHK_ERRA(CERTSRV_E_SUBJECT_UPN_REQUIRED) + CHK_ERRA(CERTSRV_E_SUBJECT_DIRECTORY_GUID_REQUIRED) + CHK_ERRA(CERTSRV_E_SUBJECT_DNS_REQUIRED) + CHK_ERRA(CERTSRV_E_ARCHIVED_KEY_UNEXPECTED) + CHK_ERRA(CERTSRV_E_KEY_LENGTH) +// CHK_ERRA(CERTSRV_E_SUBJECT_EMAIL_REQUIRED) +// CHK_ERRA(CERTSRV_E_UNKNOWN_CERT_TYPE) +// CHK_ERRA(CERTSRV_E_CERT_TYPE_OVERLAP) + CHK_ERRA(XENROLL_E_KEY_NOT_EXPORTABLE) + CHK_ERRA(XENROLL_E_CANNOT_ADD_ROOT_CERT) + CHK_ERRA(XENROLL_E_RESPONSE_KA_HASH_NOT_FOUND) + CHK_ERRA(XENROLL_E_RESPONSE_UNEXPECTED_KA_HASH) + CHK_ERRA(XENROLL_E_RESPONSE_KA_HASH_MISMATCH) + CHK_ERRA(XENROLL_E_KEYSPEC_SMIME_MISMATCH) + CHK_ERRA(MSSIPOTF_E_OUTOFMEMRANGE) + CHK_ERRA(MSSIPOTF_E_CANTGETOBJECT) + CHK_ERRA(MSSIPOTF_E_NOHEADTABLE) + CHK_ERRA(MSSIPOTF_E_BAD_MAGICNUMBER) + CHK_ERRA(MSSIPOTF_E_BAD_OFFSET_TABLE) + CHK_ERRA(MSSIPOTF_E_TABLE_TAGORDER) + CHK_ERRA(MSSIPOTF_E_TABLE_LONGWORD) + CHK_ERRA(MSSIPOTF_E_BAD_FIRST_TABLE_PLACEMENT) + CHK_ERRA(MSSIPOTF_E_TABLES_OVERLAP) + CHK_ERRA(MSSIPOTF_E_TABLE_PADBYTES) + CHK_ERRA(MSSIPOTF_E_FILETOOSMALL) + CHK_ERRA(MSSIPOTF_E_TABLE_CHECKSUM) + CHK_ERRA(MSSIPOTF_E_FILE_CHECKSUM) + CHK_ERRA(MSSIPOTF_E_FAILED_POLICY) + CHK_ERRA(MSSIPOTF_E_FAILED_HINTS_CHECK) + CHK_ERRA(MSSIPOTF_E_NOT_OPENTYPE) + CHK_ERRA(MSSIPOTF_E_FILE) + CHK_ERRA(MSSIPOTF_E_CRYPT) + CHK_ERRA(MSSIPOTF_E_BADVERSION) + CHK_ERRA(MSSIPOTF_E_DSIG_STRUCTURE) + CHK_ERRA(MSSIPOTF_E_PCONST_CHECK) + CHK_ERRA(MSSIPOTF_E_STRUCTURE) + CHK_ERRA(TRUST_E_EXPLICIT_DISTRUST) + CHK_ERRA(CERT_E_UNTRUSTEDCA) + CHK_ERRA(CERT_E_INVALID_POLICY) + CHK_ERRA(CERT_E_INVALID_NAME) + CHK_ERRA(SPAPI_E_NOT_DISABLEABLE) + CHK_ERRA(SPAPI_E_CANT_REMOVE_DEVINST) + CHK_ERRA(SPAPI_E_INVALID_TARGET) + CHK_ERRA(SPAPI_E_DRIVER_NONNATIVE) + CHK_ERRA(SPAPI_E_IN_WOW64) + CHK_ERRA(SPAPI_E_SET_SYSTEM_RESTORE_POINT) + CHK_ERRA(SPAPI_E_INCORRECTLY_COPIED_INF) + CHK_ERRA(SPAPI_E_SCE_DISABLED) + CHK_ERRA(SCARD_E_NO_KEY_CONTAINER) + CHK_ERRA(SCARD_W_CARD_NOT_AUTHENTICATED) + CHK_ERRA(COMADMIN_E_OBJECTERRORS) + CHK_ERRA(COMADMIN_E_OBJECTINVALID) + CHK_ERRA(COMADMIN_E_KEYMISSING) + CHK_ERRA(COMADMIN_E_ALREADYINSTALLED) + CHK_ERRA(COMADMIN_E_APP_FILE_WRITEFAIL) + CHK_ERRA(COMADMIN_E_APP_FILE_READFAIL) + CHK_ERRA(COMADMIN_E_APP_FILE_VERSION) + CHK_ERRA(COMADMIN_E_BADPATH) + CHK_ERRA(COMADMIN_E_APPLICATIONEXISTS) + CHK_ERRA(COMADMIN_E_ROLEEXISTS) + CHK_ERRA(COMADMIN_E_CANTCOPYFILE) + CHK_ERRA(COMADMIN_E_NOUSER) + CHK_ERRA(COMADMIN_E_INVALIDUSERIDS) + CHK_ERRA(COMADMIN_E_NOREGISTRYCLSID) + CHK_ERRA(COMADMIN_E_BADREGISTRYPROGID) + CHK_ERRA(COMADMIN_E_AUTHENTICATIONLEVEL) + CHK_ERRA(COMADMIN_E_USERPASSWDNOTVALID) + CHK_ERRA(COMADMIN_E_CLSIDORIIDMISMATCH) + CHK_ERRA(COMADMIN_E_REMOTEINTERFACE) + CHK_ERRA(COMADMIN_E_DLLREGISTERSERVER) + CHK_ERRA(COMADMIN_E_NOSERVERSHARE) + CHK_ERRA(COMADMIN_E_DLLLOADFAILED) + CHK_ERRA(COMADMIN_E_BADREGISTRYLIBID) + CHK_ERRA(COMADMIN_E_APPDIRNOTFOUND) + CHK_ERRA(COMADMIN_E_REGISTRARFAILED) + CHK_ERRA(COMADMIN_E_COMPFILE_DOESNOTEXIST) + CHK_ERRA(COMADMIN_E_COMPFILE_LOADDLLFAIL) + CHK_ERRA(COMADMIN_E_COMPFILE_GETCLASSOBJ) + CHK_ERRA(COMADMIN_E_COMPFILE_CLASSNOTAVAIL) + CHK_ERRA(COMADMIN_E_COMPFILE_BADTLB) + CHK_ERRA(COMADMIN_E_COMPFILE_NOTINSTALLABLE) + CHK_ERRA(COMADMIN_E_NOTCHANGEABLE) + CHK_ERRA(COMADMIN_E_NOTDELETEABLE) + CHK_ERRA(COMADMIN_E_SESSION) + CHK_ERRA(COMADMIN_E_COMP_MOVE_LOCKED) + CHK_ERRA(COMADMIN_E_COMP_MOVE_BAD_DEST) + CHK_ERRA(COMADMIN_E_REGISTERTLB) + CHK_ERRA(COMADMIN_E_SYSTEMAPP) + CHK_ERRA(COMADMIN_E_COMPFILE_NOREGISTRAR) + CHK_ERRA(COMADMIN_E_COREQCOMPINSTALLED) + CHK_ERRA(COMADMIN_E_SERVICENOTINSTALLED) + CHK_ERRA(COMADMIN_E_PROPERTYSAVEFAILED) + CHK_ERRA(COMADMIN_E_OBJECTEXISTS) + CHK_ERRA(COMADMIN_E_COMPONENTEXISTS) + CHK_ERRA(COMADMIN_E_REGFILE_CORRUPT) + CHK_ERRA(COMADMIN_E_PROPERTY_OVERFLOW) + CHK_ERRA(COMADMIN_E_NOTINREGISTRY) + CHK_ERRA(COMADMIN_E_OBJECTNOTPOOLABLE) + CHK_ERRA(COMADMIN_E_APPLID_MATCHES_CLSID) + CHK_ERRA(COMADMIN_E_ROLE_DOES_NOT_EXIST) + CHK_ERRA(COMADMIN_E_START_APP_NEEDS_COMPONENTS) + CHK_ERRA(COMADMIN_E_REQUIRES_DIFFERENT_PLATFORM) + CHK_ERRA(COMADMIN_E_CAN_NOT_EXPORT_APP_PROXY) + CHK_ERRA(COMADMIN_E_CAN_NOT_START_APP) + CHK_ERRA(COMADMIN_E_CAN_NOT_EXPORT_SYS_APP) + CHK_ERRA(COMADMIN_E_CANT_SUBSCRIBE_TO_COMPONENT) + CHK_ERRA(COMADMIN_E_EVENTCLASS_CANT_BE_SUBSCRIBER) + CHK_ERRA(COMADMIN_E_LIB_APP_PROXY_INCOMPATIBLE) + CHK_ERRA(COMADMIN_E_BASE_PARTITION_ONLY) + CHK_ERRA(COMADMIN_E_START_APP_DISABLED) + CHK_ERRA(COMADMIN_E_CAT_DUPLICATE_PARTITION_NAME) + CHK_ERRA(COMADMIN_E_CAT_INVALID_PARTITION_NAME) + CHK_ERRA(COMADMIN_E_CAT_PARTITION_IN_USE) + CHK_ERRA(COMADMIN_E_FILE_PARTITION_DUPLICATE_FILES) + CHK_ERRA(COMADMIN_E_CAT_IMPORTED_COMPONENTS_NOT_ALLOWED) + CHK_ERRA(COMADMIN_E_AMBIGUOUS_APPLICATION_NAME) + CHK_ERRA(COMADMIN_E_AMBIGUOUS_PARTITION_NAME) + CHK_ERRA(COMADMIN_E_REGDB_NOTINITIALIZED) + CHK_ERRA(COMADMIN_E_REGDB_NOTOPEN) + CHK_ERRA(COMADMIN_E_REGDB_SYSTEMERR) + CHK_ERRA(COMADMIN_E_REGDB_ALREADYRUNNING) + CHK_ERRA(COMADMIN_E_MIG_VERSIONNOTSUPPORTED) + CHK_ERRA(COMADMIN_E_MIG_SCHEMANOTFOUND) + CHK_ERRA(COMADMIN_E_CAT_BITNESSMISMATCH) + CHK_ERRA(COMADMIN_E_CAT_UNACCEPTABLEBITNESS) + CHK_ERRA(COMADMIN_E_CAT_WRONGAPPBITNESS) + CHK_ERRA(COMADMIN_E_CAT_PAUSE_RESUME_NOT_SUPPORTED) + CHK_ERRA(COMADMIN_E_CAT_SERVERFAULT) + CHK_ERRA(COMQC_E_APPLICATION_NOT_QUEUED) + CHK_ERRA(COMQC_E_NO_QUEUEABLE_INTERFACES) + CHK_ERRA(COMQC_E_QUEUING_SERVICE_NOT_AVAILABLE) + CHK_ERRA(COMQC_E_NO_IPERSISTSTREAM) + CHK_ERRA(COMQC_E_BAD_MESSAGE) + CHK_ERRA(COMQC_E_UNAUTHENTICATED) + CHK_ERRA(COMQC_E_UNTRUSTED_ENQUEUER) + CHK_ERRA(MSDTC_E_DUPLICATE_RESOURCE) + CHK_ERRA(COMADMIN_E_OBJECT_PARENT_MISSING) + CHK_ERRA(COMADMIN_E_OBJECT_DOES_NOT_EXIST) + CHK_ERRA(COMADMIN_E_APP_NOT_RUNNING) + CHK_ERRA(COMADMIN_E_INVALID_PARTITION) + CHK_ERRA(COMADMIN_E_SVCAPP_NOT_POOLABLE_OR_RECYCLABLE) + CHK_ERRA(COMADMIN_E_USER_IN_SET) + CHK_ERRA(COMADMIN_E_CANTRECYCLELIBRARYAPPS) + CHK_ERRA(COMADMIN_E_CANTRECYCLESERVICEAPPS) + CHK_ERRA(COMADMIN_E_PROCESSALREADYRECYCLED) + CHK_ERRA(COMADMIN_E_PAUSEDPROCESSMAYNOTBERECYCLED) + CHK_ERRA(COMADMIN_E_CANTMAKEINPROCSERVICE) + CHK_ERRA(COMADMIN_E_PROGIDINUSEBYCLSID) + CHK_ERRA(COMADMIN_E_DEFAULT_PARTITION_NOT_IN_SET) + CHK_ERRA(COMADMIN_E_RECYCLEDPROCESSMAYNOTBEPAUSED) + CHK_ERRA(COMADMIN_E_PARTITION_ACCESSDENIED) + CHK_ERRA(COMADMIN_E_PARTITION_MSI_ONLY) + CHK_ERRA(COMADMIN_E_LEGACYCOMPS_NOT_ALLOWED_IN_1_0_FORMAT) + CHK_ERRA(COMADMIN_E_LEGACYCOMPS_NOT_ALLOWED_IN_NONBASE_PARTITIONS) + CHK_ERRA(COMADMIN_E_COMP_MOVE_SOURCE) + CHK_ERRA(COMADMIN_E_COMP_MOVE_DEST) + CHK_ERRA(COMADMIN_E_COMP_MOVE_PRIVATE) + CHK_ERRA(COMADMIN_E_BASEPARTITION_REQUIRED_IN_SET) + CHK_ERRA(COMADMIN_E_CANNOT_ALIAS_EVENTCLASS) + CHK_ERRA(COMADMIN_E_PRIVATE_ACCESSDENIED) + CHK_ERRA(COMADMIN_E_SAFERINVALID) + CHK_ERRA(COMADMIN_E_REGISTRY_ACCESSDENIED) +// CHK_ERRA(COMADMIN_E_PARTITIONS_DISABLED) +// CHK_ERR_WIN32A(ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY) +// CHK_ERR_WIN32A(ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY) + CHK_ERR_WIN32A(ERROR_DISK_TOO_FRAGMENTED) + CHK_ERR_WIN32A(ERROR_DELETE_PENDING) +// CHK_ERR_WIN32A(ERROR_SCOPE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_NOT_SAFEBOOT_SERVICE) + CHK_ERR_WIN32A(ERROR_JOURNAL_ENTRY_DELETED) + CHK_ERR_WIN32A(ERROR_ONLY_IF_CONNECTED) + CHK_ERR_WIN32A(ERROR_OVERRIDE_NOCHANGES) + CHK_ERR_WIN32A(ERROR_BAD_USER_PROFILE) + CHK_ERR_WIN32A(ERROR_NOT_SUPPORTED_ON_SBS) + CHK_ERR_WIN32A(ERROR_SERVER_SHUTDOWN_IN_PROGRESS) + CHK_ERR_WIN32A(ERROR_HOST_DOWN) + CHK_ERR_WIN32A(ERROR_NON_ACCOUNT_SID) + CHK_ERR_WIN32A(ERROR_NON_DOMAIN_SID) + CHK_ERR_WIN32A(ERROR_APPHELP_BLOCK) + CHK_ERR_WIN32A(ERROR_ACCESS_DISABLED_BY_POLICY) + CHK_ERR_WIN32A(ERROR_REG_NAT_CONSUMPTION) + CHK_ERR_WIN32A(ERROR_CSCSHARE_OFFLINE) + CHK_ERR_WIN32A(ERROR_PKINIT_FAILURE) + CHK_ERR_WIN32A(ERROR_SMARTCARD_SUBSYSTEM_FAILURE) + CHK_ERR_WIN32A(ERROR_DOWNGRADE_DETECTED) + CHK_ERR_WIN32A(ERROR_MACHINE_LOCKED) + CHK_ERR_WIN32A(ERROR_CALLBACK_SUPPLIED_INVALID_DATA) + CHK_ERR_WIN32A(ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED) + CHK_ERR_WIN32A(ERROR_DRIVER_BLOCKED) + CHK_ERR_WIN32A(ERROR_INVALID_IMPORT_OF_NON_DLL) +// CHK_ERR_WIN32A(ERROR_ACCESS_DISABLED_WEBBLADE) +// CHK_ERR_WIN32A(ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER) +// CHK_ERR_WIN32A(ERROR_RECOVERY_FAILURE) +// CHK_ERR_WIN32A(ERROR_ALREADY_FIBER) +// CHK_ERR_WIN32A(ERROR_ALREADY_THREAD) +// CHK_ERR_WIN32A(ERROR_STACK_BUFFER_OVERRUN) +// CHK_ERR_WIN32A(ERROR_PARAMETER_QUOTA_EXCEEDED) +// CHK_ERR_WIN32A(ERROR_DEBUGGER_INACTIVE) +// CHK_ERR_WIN32A(ERROR_DELAY_LOAD_FAILED) + CHK_ERR_WIN32A(ERROR_CURRENT_DOMAIN_NOT_ALLOWED) + CHK_ERR_WIN32A(ERROR_INSTALL_SERVICE_FAILURE) + CHK_ERR_WIN32A(ERROR_INSTALL_PACKAGE_VERSION) + CHK_ERR_WIN32A(ERROR_INSTALL_ALREADY_RUNNING) + CHK_ERR_WIN32A(ERROR_INSTALL_PACKAGE_OPEN_FAILED) + CHK_ERR_WIN32A(ERROR_INSTALL_PACKAGE_INVALID) + CHK_ERR_WIN32A(ERROR_INSTALL_UI_FAILURE) + CHK_ERR_WIN32A(ERROR_INSTALL_LOG_FAILURE) + CHK_ERR_WIN32A(ERROR_INSTALL_LANGUAGE_UNSUPPORTED) + CHK_ERR_WIN32A(ERROR_INSTALL_TRANSFORM_FAILURE) + CHK_ERR_WIN32A(ERROR_INSTALL_PACKAGE_REJECTED) + CHK_ERR_WIN32A(ERROR_FUNCTION_NOT_CALLED) + CHK_ERR_WIN32A(ERROR_FUNCTION_FAILED) + CHK_ERR_WIN32A(ERROR_INVALID_TABLE) + CHK_ERR_WIN32A(ERROR_DATATYPE_MISMATCH) + CHK_ERR_WIN32A(ERROR_UNSUPPORTED_TYPE) + CHK_ERR_WIN32A(ERROR_CREATE_FAILED) + CHK_ERR_WIN32A(ERROR_INSTALL_TEMP_UNWRITABLE) + CHK_ERR_WIN32A(ERROR_INSTALL_PLATFORM_UNSUPPORTED) + CHK_ERR_WIN32A(ERROR_INSTALL_NOTUSED) + CHK_ERR_WIN32A(ERROR_PATCH_PACKAGE_OPEN_FAILED) + CHK_ERR_WIN32A(ERROR_PATCH_PACKAGE_INVALID) + CHK_ERR_WIN32A(ERROR_PATCH_PACKAGE_UNSUPPORTED) + CHK_ERR_WIN32A(ERROR_PRODUCT_VERSION) + CHK_ERR_WIN32A(ERROR_INVALID_COMMAND_LINE) + CHK_ERR_WIN32A(ERROR_INSTALL_REMOTE_DISALLOWED) + CHK_ERR_WIN32A(ERROR_SUCCESS_REBOOT_INITIATED) + CHK_ERR_WIN32A(ERROR_PATCH_TARGET_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_PATCH_PACKAGE_REJECTED) + CHK_ERR_WIN32A(ERROR_INSTALL_TRANSFORM_REJECTED) +// CHK_ERR_WIN32A(ERROR_INSTALL_REMOTE_PROHIBITED) + CHK_ERR_WIN32A(RPC_S_ENTRY_TYPE_MISMATCH) + CHK_ERR_WIN32A(RPC_S_NOT_ALL_OBJS_EXPORTED) + CHK_ERR_WIN32A(RPC_S_INTERFACE_NOT_EXPORTED) + CHK_ERR_WIN32A(RPC_S_PROFILE_NOT_ADDED) + CHK_ERR_WIN32A(RPC_S_PRF_ELT_NOT_ADDED) + CHK_ERR_WIN32A(RPC_S_PRF_ELT_NOT_REMOVED) + CHK_ERR_WIN32A(RPC_S_GRP_ELT_NOT_ADDED) + CHK_ERR_WIN32A(RPC_S_GRP_ELT_NOT_REMOVED) + CHK_ERR_WIN32A(ERROR_KM_DRIVER_BLOCKED) + CHK_ERR_WIN32A(ERROR_CONTEXT_EXPIRED) +// CHK_ERR_WIN32A(ERROR_PER_USER_TRUST_QUOTA_EXCEEDED) +// CHK_ERR_WIN32A(ERROR_ALL_USER_TRUST_QUOTA_EXCEEDED) +// CHK_ERR_WIN32A(ERROR_USER_DELETE_TRUST_QUOTA_EXCEEDED) + CHK_ERR_WIN32A(ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT) + CHK_ERR_WIN32A(ERROR_PRINTER_DRIVER_WARNED) + CHK_ERR_WIN32A(ERROR_PRINTER_DRIVER_BLOCKED) + CHK_ERR_WIN32A(ERROR_VOLUME_CONTAINS_SYS_FILES) + CHK_ERR_WIN32A(ERROR_INDIGENOUS_TYPE) + CHK_ERR_WIN32A(ERROR_NO_SUPPORTING_DRIVES) + CHK_ERR_WIN32A(ERROR_CLEANER_CARTRIDGE_INSTALLED) + CHK_ERR_WIN32A(ERROR_REPARSE_TAG_INVALID) + CHK_ERR_WIN32A(ERROR_REPARSE_TAG_MISMATCH) + CHK_ERR_WIN32A(ERROR_VOLUME_NOT_SIS_ENABLED) + CHK_ERR_WIN32A(ERROR_QUORUM_OWNER_ALIVE) + CHK_ERR_WIN32A(ERROR_NETWORK_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_NODE_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_ALL_NODES_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_RESOURCE_FAILED) + CHK_ERR_WIN32A(ERROR_CLUSTER_INVALID_NODE) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_EXISTS) + CHK_ERR_WIN32A(ERROR_CLUSTER_JOIN_IN_PROGRESS) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_EXISTS) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETINTERFACE_EXISTS) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETINTERFACE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CLUSTER_INVALID_REQUEST) + CHK_ERR_WIN32A(ERROR_CLUSTER_INVALID_NETWORK_PROVIDER) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_DOWN) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_UNREACHABLE) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_NOT_MEMBER) + CHK_ERR_WIN32A(ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS) + CHK_ERR_WIN32A(ERROR_CLUSTER_INVALID_NETWORK) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_UP) + CHK_ERR_WIN32A(ERROR_CLUSTER_IPADDR_IN_USE) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_NOT_PAUSED) + CHK_ERR_WIN32A(ERROR_CLUSTER_NO_SECURITY_CONTEXT) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_NOT_INTERNAL) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_ALREADY_UP) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_ALREADY_DOWN) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_ALREADY_ONLINE) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_ALREADY_MEMBER) + CHK_ERR_WIN32A(ERROR_CLUSTER_LAST_INTERNAL_NETWORK) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS) + CHK_ERR_WIN32A(ERROR_INVALID_OPERATION_ON_QUORUM) + CHK_ERR_WIN32A(ERROR_DEPENDENCY_NOT_ALLOWED) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_PAUSED) + CHK_ERR_WIN32A(ERROR_NODE_CANT_HOST_RESOURCE) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_NOT_READY) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_SHUTTING_DOWN) + CHK_ERR_WIN32A(ERROR_CLUSTER_JOIN_ABORTED) + CHK_ERR_WIN32A(ERROR_CLUSTER_INCOMPATIBLE_VERSIONS) + CHK_ERR_WIN32A(ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED) + CHK_ERR_WIN32A(ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED) + CHK_ERR_WIN32A(ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED) + CHK_ERR_WIN32A(ERROR_CLUSTER_RESNAME_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED) + CHK_ERR_WIN32A(ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST) + CHK_ERR_WIN32A(ERROR_CLUSTER_DATABASE_SEQMISMATCH) + CHK_ERR_WIN32A(ERROR_RESMON_INVALID_STATE) + CHK_ERR_WIN32A(ERROR_CLUSTER_GUM_NOT_LOCKER) + CHK_ERR_WIN32A(ERROR_QUORUM_DISK_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_DATABASE_BACKUP_CORRUPT) + CHK_ERR_WIN32A(ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT) + CHK_ERR_WIN32A(ERROR_RESOURCE_PROPERTY_UNCHANGEABLE) + CHK_ERR_WIN32A(ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE) + CHK_ERR_WIN32A(ERROR_CLUSTER_QUORUMLOG_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_CLUSTER_MEMBERSHIP_HALT) + CHK_ERR_WIN32A(ERROR_CLUSTER_INSTANCE_ID_MISMATCH) + CHK_ERR_WIN32A(ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP) + CHK_ERR_WIN32A(ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH) + CHK_ERR_WIN32A(ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP) + CHK_ERR_WIN32A(ERROR_CLUSTER_PARAMETER_MISMATCH) + CHK_ERR_WIN32A(ERROR_NODE_CANNOT_BE_CLUSTERED) + CHK_ERR_WIN32A(ERROR_CLUSTER_WRONG_OS_VERSION) + CHK_ERR_WIN32A(ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME) +// CHK_ERR_WIN32A(ERROR_CLUSCFG_ALREADY_COMMITTED) +// CHK_ERR_WIN32A(ERROR_CLUSCFG_ROLLBACK_FAILED) +// CHK_ERR_WIN32A(ERROR_CLUSCFG_SYSTEM_DISK_DRIVE_LETTER_CONFLICT) +// CHK_ERR_WIN32A(ERROR_CLUSTER_OLD_VERSION) +// CHK_ERR_WIN32A(ERROR_CLUSTER_MISMATCHED_COMPUTER_ACCT_NAME) + CHK_ERR_WIN32A(ERROR_FILE_READ_ONLY) + CHK_ERR_WIN32A(ERROR_DIR_EFS_DISALLOWED) + CHK_ERR_WIN32A(ERROR_EFS_SERVER_NOT_TRUSTED) + CHK_ERR_WIN32A(ERROR_BAD_RECOVERY_POLICY) + CHK_ERR_WIN32A(ERROR_EFS_ALG_BLOB_TOO_BIG) + CHK_ERR_WIN32A(ERROR_VOLUME_NOT_SUPPORT_EFS) + CHK_ERR_WIN32A(ERROR_EFS_DISABLED) + CHK_ERR_WIN32A(ERROR_EFS_VERSION_NOT_SUPPORT) + CHK_ERR_WIN32A(SCHED_E_SERVICE_NOT_LOCALSYSTEM) + CHK_ERR_WIN32A(ERROR_CTX_CLIENT_LICENSE_IN_USE) + CHK_ERR_WIN32A(ERROR_CTX_CLIENT_LICENSE_NOT_SET) + CHK_ERR_WIN32A(ERROR_CTX_LICENSE_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_CTX_LICENSE_CLIENT_INVALID) + CHK_ERR_WIN32A(ERROR_CTX_LICENSE_EXPIRED) + CHK_ERR_WIN32A(ERROR_CTX_SHADOW_NOT_RUNNING) + CHK_ERR_WIN32A(ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE) +// CHK_ERR_WIN32A(ERROR_ACTIVATION_COUNT_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DS_SORT_CONTROL_MISSING) + CHK_ERR_WIN32A(ERROR_DS_OFFSET_RANGE_ERROR) + CHK_ERR_WIN32A(ERROR_DS_OBJECT_BEING_REMOVED) + CHK_ERR_WIN32A(ERROR_DS_DS_REQUIRED) + CHK_ERR_WIN32A(ERROR_DS_INVALID_LDAP_DISPLAY_NAME) + CHK_ERR_WIN32A(ERROR_DS_NON_BASE_SEARCH) + CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_ATTS) + CHK_ERR_WIN32A(ERROR_DS_BACKLINK_WITHOUT_LINK) + CHK_ERR_WIN32A(ERROR_DS_EPOCH_MISMATCH) + CHK_ERR_WIN32A(ERROR_DS_SRC_NAME_MISMATCH) + CHK_ERR_WIN32A(ERROR_DS_SRC_AND_DST_NC_IDENTICAL) + CHK_ERR_WIN32A(ERROR_DS_DST_NC_MISMATCH) + CHK_ERR_WIN32A(ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC) + CHK_ERR_WIN32A(ERROR_DS_SRC_GUID_MISMATCH) + CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_DELETED_OBJECT) + CHK_ERR_WIN32A(ERROR_DS_PDC_OPERATION_IN_PROGRESS) + CHK_ERR_WIN32A(ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD) + CHK_ERR_WIN32A(ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION) + CHK_ERR_WIN32A(ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS) + CHK_ERR_WIN32A(ERROR_DS_NC_MUST_HAVE_NC_PARENT) + CHK_ERR_WIN32A(ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE) + CHK_ERR_WIN32A(ERROR_DS_DST_DOMAIN_NOT_NATIVE) + CHK_ERR_WIN32A(ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER) + CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_ACCOUNT_GROUP) + CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_RESOURCE_GROUP) + CHK_ERR_WIN32A(ERROR_DS_INVALID_SEARCH_FLAG) + CHK_ERR_WIN32A(ERROR_DS_NO_TREE_DELETE_ABOVE_NC) + CHK_ERR_WIN32A(ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE) + CHK_ERR_WIN32A(ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE) + CHK_ERR_WIN32A(ERROR_DS_SAM_INIT_FAILURE) + CHK_ERR_WIN32A(ERROR_DS_SENSITIVE_GROUP_VIOLATION) + CHK_ERR_WIN32A(ERROR_DS_CANT_MOD_PRIMARYGROUPID) + CHK_ERR_WIN32A(ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD) + CHK_ERR_WIN32A(ERROR_DS_NONSAFE_SCHEMA_CHANGE) + CHK_ERR_WIN32A(ERROR_DS_SCHEMA_UPDATE_DISALLOWED) + CHK_ERR_WIN32A(ERROR_DS_CANT_CREATE_UNDER_SCHEMA) + CHK_ERR_WIN32A(ERROR_DS_INSTALL_NO_SRC_SCH_VERSION) + CHK_ERR_WIN32A(ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE) + CHK_ERR_WIN32A(ERROR_DS_INVALID_GROUP_TYPE) + CHK_ERR_WIN32A(ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN) + CHK_ERR_WIN32A(ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN) + CHK_ERR_WIN32A(ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER) + CHK_ERR_WIN32A(ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER) + CHK_ERR_WIN32A(ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER) + CHK_ERR_WIN32A(ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER) + CHK_ERR_WIN32A(ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER) + CHK_ERR_WIN32A(ERROR_DS_HAVE_PRIMARY_MEMBERS) + CHK_ERR_WIN32A(ERROR_DS_STRING_SD_CONVERSION_FAILED) + CHK_ERR_WIN32A(ERROR_DS_NAMING_MASTER_GC) + CHK_ERR_WIN32A(ERROR_DS_DNS_LOOKUP_FAILURE) + CHK_ERR_WIN32A(ERROR_DS_COULDNT_UPDATE_SPNS) + CHK_ERR_WIN32A(ERROR_DS_CANT_RETRIEVE_SD) + CHK_ERR_WIN32A(ERROR_DS_KEY_NOT_UNIQUE) + CHK_ERR_WIN32A(ERROR_DS_WRONG_LINKED_ATT_SYNTAX) + CHK_ERR_WIN32A(ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD) + CHK_ERR_WIN32A(ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY) + CHK_ERR_WIN32A(ERROR_DS_CANT_START) + CHK_ERR_WIN32A(ERROR_DS_INIT_FAILURE) + CHK_ERR_WIN32A(ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION) + CHK_ERR_WIN32A(ERROR_DS_SOURCE_DOMAIN_IN_FOREST) + CHK_ERR_WIN32A(ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST) + CHK_ERR_WIN32A(ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED) + CHK_ERR_WIN32A(ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN) + CHK_ERR_WIN32A(ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER) + CHK_ERR_WIN32A(ERROR_DS_SRC_SID_EXISTS_IN_FOREST) + CHK_ERR_WIN32A(ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH) + CHK_ERR_WIN32A(ERROR_SAM_INIT_FAILURE) + CHK_ERR_WIN32A(ERROR_DS_DRA_SCHEMA_INFO_SHIP) + CHK_ERR_WIN32A(ERROR_DS_DRA_SCHEMA_CONFLICT) + CHK_ERR_WIN32A(ERROR_DS_DRA_EARLIER_SCHEMA_CONFLICT) + CHK_ERR_WIN32A(ERROR_DS_DRA_OBJ_NC_MISMATCH) + CHK_ERR_WIN32A(ERROR_DS_NC_STILL_HAS_DSAS) + CHK_ERR_WIN32A(ERROR_DS_GC_REQUIRED) + CHK_ERR_WIN32A(ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY) + CHK_ERR_WIN32A(ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS) + CHK_ERR_WIN32A(ERROR_DS_CANT_ADD_TO_GC) + CHK_ERR_WIN32A(ERROR_DS_NO_CHECKPOINT_WITH_PDC) + CHK_ERR_WIN32A(ERROR_DS_SOURCE_AUDITING_NOT_ENABLED) + CHK_ERR_WIN32A(ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC) + CHK_ERR_WIN32A(ERROR_DS_INVALID_NAME_FOR_SPN) + CHK_ERR_WIN32A(ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS) + CHK_ERR_WIN32A(ERROR_DS_UNICODEPWD_NOT_IN_QUOTES) + CHK_ERR_WIN32A(ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DS_MUST_BE_RUN_ON_DST_DC) + CHK_ERR_WIN32A(ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER) + CHK_ERR_WIN32A(ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ) + CHK_ERR_WIN32A(ERROR_DS_INIT_FAILURE_CONSOLE) + CHK_ERR_WIN32A(ERROR_DS_SAM_INIT_FAILURE_CONSOLE) + CHK_ERR_WIN32A(ERROR_DS_FOREST_VERSION_TOO_HIGH) + CHK_ERR_WIN32A(ERROR_DS_DOMAIN_VERSION_TOO_HIGH) + CHK_ERR_WIN32A(ERROR_DS_FOREST_VERSION_TOO_LOW) + CHK_ERR_WIN32A(ERROR_DS_DOMAIN_VERSION_TOO_LOW) + CHK_ERR_WIN32A(ERROR_DS_INCOMPATIBLE_VERSION) + CHK_ERR_WIN32A(ERROR_DS_LOW_DSA_VERSION) + CHK_ERR_WIN32A(ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN) + CHK_ERR_WIN32A(ERROR_DS_NOT_SUPPORTED_SORT_ORDER) + CHK_ERR_WIN32A(ERROR_DS_NAME_NOT_UNIQUE) + CHK_ERR_WIN32A(ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4) + CHK_ERR_WIN32A(ERROR_DS_OUT_OF_VERSION_STORE) + CHK_ERR_WIN32A(ERROR_DS_INCOMPATIBLE_CONTROLS_USED) + CHK_ERR_WIN32A(ERROR_DS_NO_REF_DOMAIN) + CHK_ERR_WIN32A(ERROR_DS_RESERVED_LINK_ID) + CHK_ERR_WIN32A(ERROR_DS_LINK_ID_NOT_AVAILABLE) + CHK_ERR_WIN32A(ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER) + CHK_ERR_WIN32A(ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE) + CHK_ERR_WIN32A(ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC) + CHK_ERR_WIN32A(ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG) + CHK_ERR_WIN32A(ERROR_DS_MODIFYDN_WRONG_GRANDPARENT) + CHK_ERR_WIN32A(ERROR_DS_NAME_ERROR_TRUST_REFERRAL) + CHK_ERR_WIN32A(ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER) + CHK_ERR_WIN32A(ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD) + CHK_ERR_WIN32A(ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE_V2) + CHK_ERR_WIN32A(ERROR_DS_THREAD_LIMIT_EXCEEDED) + CHK_ERR_WIN32A(ERROR_DS_NOT_CLOSEST) + CHK_ERR_WIN32A(ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF) + CHK_ERR_WIN32A(ERROR_DS_SINGLE_USER_MODE_FAILED) + CHK_ERR_WIN32A(ERROR_DS_NTDSCRIPT_SYNTAX_ERROR) + CHK_ERR_WIN32A(ERROR_DS_NTDSCRIPT_PROCESS_ERROR) + CHK_ERR_WIN32A(ERROR_DS_DIFFERENT_REPL_EPOCHS) + CHK_ERR_WIN32A(ERROR_DS_DRS_EXTENSIONS_CHANGED) + CHK_ERR_WIN32A(ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR) + CHK_ERR_WIN32A(ERROR_DS_NO_MSDS_INTID) + CHK_ERR_WIN32A(ERROR_DS_DUP_MSDS_INTID) + CHK_ERR_WIN32A(ERROR_DS_EXISTS_IN_RDNATTID) + CHK_ERR_WIN32A(ERROR_DS_AUTHORIZATION_FAILED) + CHK_ERR_WIN32A(ERROR_DS_INVALID_SCRIPT) + CHK_ERR_WIN32A(ERROR_DS_REMOTE_CROSSREF_OP_FAILED) +// CHK_ERR_WIN32A(ERROR_DS_CROSS_REF_BUSY) +// CHK_ERR_WIN32A(ERROR_DS_CANT_DERIVE_SPN_FOR_DELETED_DOMAIN) +// CHK_ERR_WIN32A(ERROR_DS_CANT_DEMOTE_WITH_WRITEABLE_NC) +// CHK_ERR_WIN32A(ERROR_DS_DUPLICATE_ID_FOUND) +// CHK_ERR_WIN32A(ERROR_DS_INSUFFICIENT_ATTR_TO_CREATE_OBJECT) +// CHK_ERR_WIN32A(ERROR_DS_GROUP_CONVERSION_ERROR) +// CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_APP_BASIC_GROUP) +// CHK_ERR_WIN32A(ERROR_DS_CANT_MOVE_APP_QUERY_GROUP) +// CHK_ERR_WIN32A(ERROR_DS_ROLE_NOT_VERIFIED) +// CHK_ERR_WIN32A(ERROR_DS_WKO_CONTAINER_CANNOT_BE_SPECIAL) +// CHK_ERR_WIN32A(ERROR_DS_DOMAIN_RENAME_IN_PROGRESS) +// CHK_ERR_WIN32A(ERROR_DS_EXISTING_AD_CHILD_NC) +// CHK_ERR_WIN32A(DNS_ERROR_INVALID_NAME_CHAR) +// CHK_ERR_WIN32A(DNS_ERROR_NUMERIC_NAME) +// CHK_ERR_WIN32A(DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER) +// CHK_ERR_WIN32A(DNS_ERROR_NOT_ALLOWED_UNDER_DELEGATION) +// CHK_ERR_WIN32A(DNS_ERROR_CANNOT_FIND_ROOT_HINTS) +// CHK_ERR_WIN32A(DNS_ERROR_INCONSISTENT_ROOT_HINTS) + CHK_ERR_WIN32A(DNS_ERROR_FORWARDER_ALREADY_EXISTS) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_REQUIRES_MASTER_IP) + CHK_ERR_WIN32A(DNS_ERROR_ZONE_IS_SHUTDOWN) + CHK_ERR_WIN32A(DNS_ERROR_DP_BASE) + CHK_ERR_WIN32A(DNS_ERROR_DP_DOES_NOT_EXIST) + CHK_ERR_WIN32A(DNS_ERROR_DP_ALREADY_EXISTS) + CHK_ERR_WIN32A(DNS_ERROR_DP_NOT_ENLISTED) + CHK_ERR_WIN32A(DNS_ERROR_DP_ALREADY_ENLISTED) +// CHK_ERR_WIN32A(DNS_ERROR_DP_NOT_AVAILABLE) + CHK_ERR_WIN32A(WSA_QOS_ESERVICETYPE) + CHK_ERR_WIN32A(WSA_QOS_EFLOWSPEC) + CHK_ERR_WIN32A(WSA_QOS_EPROVSPECBUF) + CHK_ERR_WIN32A(WSA_QOS_EFILTERSTYLE) + CHK_ERR_WIN32A(WSA_QOS_EFILTERTYPE) + CHK_ERR_WIN32A(WSA_QOS_EFILTERCOUNT) + CHK_ERR_WIN32A(WSA_QOS_EOBJLENGTH) + CHK_ERR_WIN32A(WSA_QOS_EFLOWCOUNT) + CHK_ERR_WIN32A(WSA_QOS_EUNKOWNPSOBJ) + CHK_ERR_WIN32A(WSA_QOS_EPOLICYOBJ) + CHK_ERR_WIN32A(WSA_QOS_EFLOWDESC) + CHK_ERR_WIN32A(WSA_QOS_EPSFLOWSPEC) + CHK_ERR_WIN32A(WSA_QOS_EPSFILTERSPEC) + CHK_ERR_WIN32A(WSA_QOS_ESDMODEOBJ) + CHK_ERR_WIN32A(WSA_QOS_ESHAPERATEOBJ) + CHK_ERR_WIN32A(WSA_QOS_RESERVED_PETYPE) + CHK_ERR_WIN32A(ERROR_SXS_SECTION_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_SXS_CANT_GEN_ACTCTX) + CHK_ERR_WIN32A(ERROR_SXS_INVALID_ACTCTXDATA_FORMAT) + CHK_ERR_WIN32A(ERROR_SXS_ASSEMBLY_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_SXS_MANIFEST_FORMAT_ERROR) + CHK_ERR_WIN32A(ERROR_SXS_MANIFEST_PARSE_ERROR) + CHK_ERR_WIN32A(ERROR_SXS_ACTIVATION_CONTEXT_DISABLED) + CHK_ERR_WIN32A(ERROR_SXS_KEY_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_SXS_VERSION_CONFLICT) + CHK_ERR_WIN32A(ERROR_SXS_WRONG_SECTION_TYPE) + CHK_ERR_WIN32A(ERROR_SXS_THREAD_QUERIES_DISABLED) + CHK_ERR_WIN32A(ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET) + CHK_ERR_WIN32A(ERROR_SXS_UNKNOWN_ENCODING_GROUP) + CHK_ERR_WIN32A(ERROR_SXS_UNKNOWN_ENCODING) + CHK_ERR_WIN32A(ERROR_SXS_INVALID_XML_NAMESPACE_URI) + CHK_ERR_WIN32A(ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED) + CHK_ERR_WIN32A(ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED) + CHK_ERR_WIN32A(ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE) + CHK_ERR_WIN32A(ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE) + CHK_ERR_WIN32A(ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE) + CHK_ERR_WIN32A(ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT) + CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_DLL_NAME) + CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME) + CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_CLSID) + CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_IID) + CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_TLBID) + CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_PROGID) + CHK_ERR_WIN32A(ERROR_SXS_DUPLICATE_ASSEMBLY_NAME) + CHK_ERR_WIN32A(ERROR_SXS_FILE_HASH_MISMATCH) + CHK_ERR_WIN32A(ERROR_SXS_POLICY_PARSE_ERROR) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGQUOTE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_COMMENTSYNTAX) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADSTARTNAMECHAR) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADNAMECHAR) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADCHARINSTRING) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_XMLDECLSYNTAX) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADCHARDATA) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGWHITESPACE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_EXPECTINGTAGEND) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGSEMICOLON) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNBALANCEDPAREN) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INTERNALERROR) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INCOMPLETE_ENCODING) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSING_PAREN) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_MULTIPLE_COLONS) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_DECIMAL) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_HEXIDECIMAL) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_UNICODE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNEXPECTEDENDTAG) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDTAG) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_DUPLICATEATTRIBUTE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_MULTIPLEROOTS) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALIDATROOTLEVEL) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADXMLDECL) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGROOT) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNEXPECTEDEOF) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADPEREFINSUBSET) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDSTARTTAG) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDENDTAG) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDSTRING) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDCOMMENT) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDDECL) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNCLOSEDCDATA) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_RESERVEDNAMESPACE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALIDENCODING) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALIDSWITCH) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_BADXMLCASE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_STANDALONE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_UNEXPECTED_STANDALONE) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_INVALID_VERSION) + CHK_ERR_WIN32A(ERROR_SXS_XML_E_MISSINGEQUALS) + CHK_ERR_WIN32A(ERROR_SXS_PROTECTION_RECOVERY_FAILED) + CHK_ERR_WIN32A(ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT) + CHK_ERR_WIN32A(ERROR_SXS_PROTECTION_CATALOG_NOT_VALID) + CHK_ERR_WIN32A(ERROR_SXS_UNTRANSLATABLE_HRESULT) + CHK_ERR_WIN32A(ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING) + CHK_ERR_WIN32A(ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE) + CHK_ERR_WIN32A(ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME) + CHK_ERR_WIN32A(ERROR_IPSEC_QM_POLICY_EXISTS) + CHK_ERR_WIN32A(ERROR_IPSEC_QM_POLICY_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_QM_POLICY_IN_USE) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_POLICY_EXISTS) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_POLICY_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_POLICY_IN_USE) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_FILTER_EXISTS) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_FILTER_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_TRANSPORT_FILTER_EXISTS) + CHK_ERR_WIN32A(ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_AUTH_EXISTS) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_AUTH_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_AUTH_IN_USE) + CHK_ERR_WIN32A(ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_TUNNEL_FILTER_EXISTS) + CHK_ERR_WIN32A(ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_FILTER_PENDING_DELETION) + CHK_ERR_WIN32A(ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION) + CHK_ERR_WIN32A(ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_POLICY_PENDING_DELETION) + CHK_ERR_WIN32A(ERROR_IPSEC_MM_AUTH_PENDING_DELETION) + CHK_ERR_WIN32A(ERROR_IPSEC_QM_POLICY_PENDING_DELETION) +// CHK_ERR_WIN32A(WARNING_IPSEC_MM_POLICY_PRUNED) +// CHK_ERR_WIN32A(WARNING_IPSEC_QM_POLICY_PRUNED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NEG_STATUS_BEGIN) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_AUTH_FAIL) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_ATTRIB_FAIL) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NEGOTIATION_PENDING) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_TIMED_OUT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_CERT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SA_DELETED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SA_REAPED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_MM_ACQUIRE_DROP) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_QM_ACQUIRE_DROP) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_QUEUE_DROP_MM) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_DROP_NO_RESPONSE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_MM_DELAY_DROP) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_QM_DELAY_DROP) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_ERROR) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_CRL_FAILED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_KEY_USAGE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_CERT_TYPE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_PRIVATE_KEY) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_DH_FAIL) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_HEADER) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_POLICY) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_SIGNATURE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_KERBEROS_ERROR) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_PUBLIC_KEY) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_SA) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_PROP) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_TRANS) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_KE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_ID) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_CERT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_HASH) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_SIG) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_NONCE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_DELETE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_PAYLOAD) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_LOAD_SOFT_SA) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_COOKIE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_PEER_CERT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_PEER_CRL_FAILED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_POLICY_CHANGE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NO_MM_POLICY) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NOTCBPRIV) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SECLOADFAIL) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_FAILSSPINIT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_FAILQUERYSSP) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SRVACQFAIL) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_SRVQUERYCRED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_GETSPIFAIL) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_FILTER) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_OUT_OF_MEMORY) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_POLICY) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_UNKNOWN_DOI) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_SITUATION) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_DH_FAILURE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_GROUP) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_ENCRYPT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_DECRYPT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_POLICY_MATCH) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_UNSUPPORTED_ID) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_HASH) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_HASH_ALG) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_HASH_SIZE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_AUTH_ALG) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_SIG) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_LOAD_FAILED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_RPC_DELETE) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_BENIGN_REINIT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_MM_LIMIT) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NEGOTIATION_DISABLED) + CHK_ERR_WIN32A(ERROR_IPSEC_IKE_NEG_STATUS_END) + +// ------------------------------------------------------------- +// ddraw.h error codes +// ------------------------------------------------------------- + CHK_ERRA(DDERR_ALREADYINITIALIZED) + CHK_ERRA(DDERR_CANNOTATTACHSURFACE) + CHK_ERRA(DDERR_CANNOTDETACHSURFACE) + CHK_ERRA(DDERR_CURRENTLYNOTAVAIL) + CHK_ERRA(DDERR_EXCEPTION) +// CHK_ERRA(DDERR_GENERIC) + CHK_ERRA(DDERR_HEIGHTALIGN) + CHK_ERRA(DDERR_INCOMPATIBLEPRIMARY) + CHK_ERRA(DDERR_INVALIDCAPS) + CHK_ERRA(DDERR_INVALIDCLIPLIST) + CHK_ERRA(DDERR_INVALIDMODE) + CHK_ERRA(DDERR_INVALIDOBJECT) +// CHK_ERRA(DDERR_INVALIDPARAMS) + CHK_ERRA(DDERR_INVALIDPIXELFORMAT) + CHK_ERRA(DDERR_INVALIDRECT) + CHK_ERRA(DDERR_LOCKEDSURFACES) + CHK_ERRA(DDERR_NO3D) + CHK_ERRA(DDERR_NOALPHAHW) + CHK_ERRA(DDERR_NOSTEREOHARDWARE) + CHK_ERRA(DDERR_NOSURFACELEFT) + CHK_ERRA(DDERR_NOCLIPLIST) + CHK_ERRA(DDERR_NOCOLORCONVHW) + CHK_ERRA(DDERR_NOCOOPERATIVELEVELSET) + CHK_ERRA(DDERR_NOCOLORKEY) + CHK_ERRA(DDERR_NOCOLORKEYHW) + CHK_ERRA(DDERR_NODIRECTDRAWSUPPORT) + CHK_ERRA(DDERR_NOEXCLUSIVEMODE) + CHK_ERRA(DDERR_NOFLIPHW) + CHK_ERRA(DDERR_NOGDI) + CHK_ERRA(DDERR_NOMIRRORHW) + CHK_ERRA(DDERR_NOTFOUND) + CHK_ERRA(DDERR_NOOVERLAYHW) + CHK_ERRA(DDERR_OVERLAPPINGRECTS) + CHK_ERRA(DDERR_NORASTEROPHW) + CHK_ERRA(DDERR_NOROTATIONHW) + CHK_ERRA(DDERR_NOSTRETCHHW) + CHK_ERRA(DDERR_NOT4BITCOLOR) + CHK_ERRA(DDERR_NOT4BITCOLORINDEX) + CHK_ERRA(DDERR_NOT8BITCOLOR) + CHK_ERRA(DDERR_NOTEXTUREHW) + CHK_ERRA(DDERR_NOVSYNCHW) + CHK_ERRA(DDERR_NOZBUFFERHW) + CHK_ERRA(DDERR_NOZOVERLAYHW) + CHK_ERRA(DDERR_OUTOFCAPS) +// CHK_ERRA(DDERR_OUTOFMEMORY) +// CHK_ERRA(DDERR_OUTOFVIDEOMEMORY) + CHK_ERRA(DDERR_OVERLAYCANTCLIP) + CHK_ERRA(DDERR_OVERLAYCOLORKEYONLYONEACTIVE) + CHK_ERRA(DDERR_PALETTEBUSY) + CHK_ERRA(DDERR_COLORKEYNOTSET) + CHK_ERRA(DDERR_SURFACEALREADYATTACHED) + CHK_ERRA(DDERR_SURFACEALREADYDEPENDENT) + CHK_ERRA(DDERR_SURFACEBUSY) + CHK_ERRA(DDERR_CANTLOCKSURFACE) + CHK_ERRA(DDERR_SURFACEISOBSCURED) + CHK_ERRA(DDERR_SURFACELOST) + CHK_ERRA(DDERR_SURFACENOTATTACHED) + CHK_ERRA(DDERR_TOOBIGHEIGHT) + CHK_ERRA(DDERR_TOOBIGSIZE) + CHK_ERRA(DDERR_TOOBIGWIDTH) +// CHK_ERRA(DDERR_UNSUPPORTED) + CHK_ERRA(DDERR_UNSUPPORTEDFORMAT) + CHK_ERRA(DDERR_UNSUPPORTEDMASK) + CHK_ERRA(DDERR_INVALIDSTREAM) + CHK_ERRA(DDERR_VERTICALBLANKINPROGRESS) + CHK_ERRA(DDERR_WASSTILLDRAWING) + CHK_ERRA(DDERR_DDSCAPSCOMPLEXREQUIRED) + CHK_ERRA(DDERR_XALIGN) + CHK_ERRA(DDERR_INVALIDDIRECTDRAWGUID) + CHK_ERRA(DDERR_DIRECTDRAWALREADYCREATED) + CHK_ERRA(DDERR_NODIRECTDRAWHW) + CHK_ERRA(DDERR_PRIMARYSURFACEALREADYEXISTS) + CHK_ERRA(DDERR_NOEMULATION) + CHK_ERRA(DDERR_REGIONTOOSMALL) + CHK_ERRA(DDERR_CLIPPERISUSINGHWND) + CHK_ERRA(DDERR_NOCLIPPERATTACHED) + CHK_ERRA(DDERR_NOHWND) + CHK_ERRA(DDERR_HWNDSUBCLASSED) + CHK_ERRA(DDERR_HWNDALREADYSET) + CHK_ERRA(DDERR_NOPALETTEATTACHED) + CHK_ERRA(DDERR_NOPALETTEHW) + CHK_ERRA(DDERR_BLTFASTCANTCLIP) + CHK_ERRA(DDERR_NOBLTHW) + CHK_ERRA(DDERR_NODDROPSHW) + CHK_ERRA(DDERR_OVERLAYNOTVISIBLE) + CHK_ERRA(DDERR_NOOVERLAYDEST) + CHK_ERRA(DDERR_INVALIDPOSITION) + CHK_ERRA(DDERR_NOTAOVERLAYSURFACE) + CHK_ERRA(DDERR_EXCLUSIVEMODEALREADYSET) + CHK_ERRA(DDERR_NOTFLIPPABLE) + CHK_ERRA(DDERR_CANTDUPLICATE) + CHK_ERRA(DDERR_NOTLOCKED) + CHK_ERRA(DDERR_CANTCREATEDC) + CHK_ERRA(DDERR_NODC) + CHK_ERRA(DDERR_WRONGMODE) + CHK_ERRA(DDERR_IMPLICITLYCREATED) + CHK_ERRA(DDERR_NOTPALETTIZED) + CHK_ERRA(DDERR_UNSUPPORTEDMODE) + CHK_ERRA(DDERR_NOMIPMAPHW) + CHK_ERRA(DDERR_INVALIDSURFACETYPE) + CHK_ERRA(DDERR_NOOPTIMIZEHW) + CHK_ERRA(DDERR_NOTLOADED) + CHK_ERRA(DDERR_NOFOCUSWINDOW) + CHK_ERRA(DDERR_NOTONMIPMAPSUBLEVEL) + CHK_ERRA(DDERR_DCALREADYCREATED) + CHK_ERRA(DDERR_NONONLOCALVIDMEM) + CHK_ERRA(DDERR_CANTPAGELOCK) + CHK_ERRA(DDERR_CANTPAGEUNLOCK) + CHK_ERRA(DDERR_NOTPAGELOCKED) + CHK_ERRA(DDERR_MOREDATA) + CHK_ERRA(DDERR_EXPIRED) + CHK_ERRA(DDERR_TESTFINISHED) + CHK_ERRA(DDERR_NEWMODE) + CHK_ERRA(DDERR_D3DNOTINITIALIZED) + CHK_ERRA(DDERR_VIDEONOTACTIVE) + CHK_ERRA(DDERR_NOMONITORINFORMATION) + CHK_ERRA(DDERR_NODRIVERSUPPORT) + CHK_ERRA(DDERR_DEVICEDOESNTOWNSURFACE) + +// ------------------------------------------------------------- +// d3d10.h error codes +// ------------------------------------------------------------- + CHK_ERRA(D3D10_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS) + CHK_ERRA(D3D10_ERROR_FILE_NOT_FOUND) + +// ------------------------------------------------------------- +// dxgi.h error codes +// ------------------------------------------------------------- + CHK_ERRA(DXGI_STATUS_OCCLUDED) + CHK_ERRA(DXGI_STATUS_CLIPPED) + CHK_ERRA(DXGI_STATUS_NO_REDIRECTION) + CHK_ERRA(DXGI_STATUS_NO_DESKTOP_ACCESS) + CHK_ERRA(DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE) + CHK_ERRA(DXGI_STATUS_MODE_CHANGED) + CHK_ERRA(DXGI_STATUS_MODE_CHANGE_IN_PROGRESS) + CHK_ERRA(DXGI_ERROR_INVALID_CALL) + CHK_ERRA(DXGI_ERROR_NOT_FOUND) + CHK_ERRA(DXGI_ERROR_MORE_DATA) + CHK_ERRA(DXGI_ERROR_UNSUPPORTED) + CHK_ERRA(DXGI_ERROR_DEVICE_REMOVED) + CHK_ERRA(DXGI_ERROR_DEVICE_HUNG) + CHK_ERRA(DXGI_ERROR_DEVICE_RESET) + CHK_ERRA(DXGI_ERROR_WAS_STILL_DRAWING) + CHK_ERRA(DXGI_ERROR_FRAME_STATISTICS_DISJOINT) + CHK_ERRA(DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE) + CHK_ERRA(DXGI_ERROR_DRIVER_INTERNAL_ERROR) + CHK_ERRA(DXGI_ERROR_NONEXCLUSIVE) + CHK_ERRA(DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) + CHK_ERRA(DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED) + CHK_ERRA(DXGI_ERROR_REMOTE_OUTOFMEMORY) + +// ------------------------------------------------------------- +// d3d11.h error codes +// ------------------------------------------------------------- + CHK_ERRA(D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS) + CHK_ERRA(D3D11_ERROR_FILE_NOT_FOUND) + CHK_ERRA(D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS) + CHK_ERRA(D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD) + +// ------------------------------------------------------------- +// Direct2D error codes +// ------------------------------------------------------------- + CHK_ERRA(D2DERR_UNSUPPORTED_PIXEL_FORMAT) +// CHK_ERRA(D2DERR_INSUFFICIENT_BUFFER) + CHK_ERRA(D2DERR_WRONG_STATE) + CHK_ERRA(D2DERR_NOT_INITIALIZED) + CHK_ERRA(D2DERR_UNSUPPORTED_OPERATION) + CHK_ERRA(D2DERR_SCANNER_FAILED) + CHK_ERRA(D2DERR_SCREEN_ACCESS_DENIED) + CHK_ERRA(D2DERR_DISPLAY_STATE_INVALID) + CHK_ERRA(D2DERR_ZERO_VECTOR) + CHK_ERRA(D2DERR_INTERNAL_ERROR) + CHK_ERRA(D2DERR_DISPLAY_FORMAT_NOT_SUPPORTED) + CHK_ERRA(D2DERR_INVALID_CALL) + CHK_ERRA(D2DERR_NO_HARDWARE_DEVICE) + CHK_ERRA(D2DERR_RECREATE_TARGET) + CHK_ERRA(D2DERR_TOO_MANY_SHADER_ELEMENTS) + CHK_ERRA(D2DERR_SHADER_COMPILE_FAILED) + CHK_ERRA(D2DERR_MAX_TEXTURE_SIZE_EXCEEDED) + CHK_ERRA(D2DERR_UNSUPPORTED_VERSION) + CHK_ERRA(D2DERR_BAD_NUMBER) + CHK_ERRA(D2DERR_WRONG_FACTORY) + CHK_ERRA(D2DERR_LAYER_ALREADY_IN_USE) + CHK_ERRA(D2DERR_POP_CALL_DID_NOT_MATCH_PUSH) +// CHK_ERRA(D2DERR_WRONG_RESOURCE_DOMAIN) + CHK_ERRA(D2DERR_PUSH_POP_UNBALANCED) + CHK_ERRA(D2DERR_RENDER_TARGET_HAS_LAYER_OR_CLIPRECT) + CHK_ERRA(D2DERR_INCOMPATIBLE_BRUSH_TYPES) + CHK_ERRA(D2DERR_WIN32_ERROR) + CHK_ERRA(D2DERR_TARGET_NOT_GDI_COMPATIBLE) + CHK_ERRA(D2DERR_TEXT_EFFECT_IS_WRONG_TYPE) + CHK_ERRA(D2DERR_TEXT_RENDERER_NOT_RELEASED) +// CHK_ERRA(D2DERR_EXCEEDS_MAX_BITMAP_SIZE) + +// ------------------------------------------------------------- +// DirectWrite error codes +// ------------------------------------------------------------- + CHK_ERRA(DWRITE_E_FILEFORMAT) + CHK_ERRA(DWRITE_E_UNEXPECTED) + CHK_ERRA(DWRITE_E_NOFONT) + CHK_ERRA(DWRITE_E_FILENOTFOUND) + CHK_ERRA(DWRITE_E_FILEACCESS) + CHK_ERRA(DWRITE_E_FONTCOLLECTIONOBSOLETE) + CHK_ERRA(DWRITE_E_ALREADYREGISTERED) + +// ------------------------------------------------------------- +// WIC error codes +// ------------------------------------------------------------- + CHK_ERRA(WINCODEC_ERR_WRONGSTATE) + CHK_ERRA(WINCODEC_ERR_VALUEOUTOFRANGE) + CHK_ERRA(WINCODEC_ERR_UNKNOWNIMAGEFORMAT) + CHK_ERRA(WINCODEC_ERR_UNSUPPORTEDVERSION) + CHK_ERRA(WINCODEC_ERR_NOTINITIALIZED) + CHK_ERRA(WINCODEC_ERR_ALREADYLOCKED) + CHK_ERRA(WINCODEC_ERR_PROPERTYNOTFOUND) + CHK_ERRA(WINCODEC_ERR_PROPERTYNOTSUPPORTED) + CHK_ERRA(WINCODEC_ERR_PROPERTYSIZE) + CHK_ERRA(WINCODEC_ERR_CODECPRESENT) + CHK_ERRA(WINCODEC_ERR_CODECNOTHUMBNAIL) + CHK_ERRA(WINCODEC_ERR_PALETTEUNAVAILABLE) + CHK_ERRA(WINCODEC_ERR_CODECTOOMANYSCANLINES) + CHK_ERRA(WINCODEC_ERR_INTERNALERROR) + CHK_ERRA(WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS) + CHK_ERRA(WINCODEC_ERR_COMPONENTNOTFOUND) + CHK_ERRA(WINCODEC_ERR_IMAGESIZEOUTOFRANGE) + CHK_ERRA(WINCODEC_ERR_TOOMUCHMETADATA) + CHK_ERRA(WINCODEC_ERR_BADIMAGE) + CHK_ERRA(WINCODEC_ERR_BADHEADER) + CHK_ERRA(WINCODEC_ERR_FRAMEMISSING) + CHK_ERRA(WINCODEC_ERR_BADMETADATAHEADER) + CHK_ERRA(WINCODEC_ERR_BADSTREAMDATA) + CHK_ERRA(WINCODEC_ERR_STREAMWRITE) + CHK_ERRA(WINCODEC_ERR_STREAMREAD) + CHK_ERRA(WINCODEC_ERR_STREAMNOTAVAILABLE) +// CHK_ERRA(WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT) + CHK_ERRA(WINCODEC_ERR_UNSUPPORTEDOPERATION) + CHK_ERRA(WINCODEC_ERR_INVALIDREGISTRATION) + CHK_ERRA(WINCODEC_ERR_COMPONENTINITIALIZEFAILURE) + CHK_ERRA(WINCODEC_ERR_INSUFFICIENTBUFFER) + CHK_ERRA(WINCODEC_ERR_DUPLICATEMETADATAPRESENT) + CHK_ERRA(WINCODEC_ERR_PROPERTYUNEXPECTEDTYPE) + CHK_ERRA(WINCODEC_ERR_UNEXPECTEDSIZE) + CHK_ERRA(WINCODEC_ERR_INVALIDQUERYREQUEST) + CHK_ERRA(WINCODEC_ERR_UNEXPECTEDMETADATATYPE) + CHK_ERRA(WINCODEC_ERR_REQUESTONLYVALIDATMETADATAROOT) + CHK_ERRA(WINCODEC_ERR_INVALIDQUERYCHARACTER) + CHK_ERRA(WINCODEC_ERR_WIN32ERROR) + CHK_ERRA(WINCODEC_ERR_INVALIDPROGRESSIVELEVEL) + +// ------------------------------------------------------------- +// DXUT error codes +// ------------------------------------------------------------- + CHK_ERRA(DXUTERR_NODIRECT3D) + CHK_ERRA(DXUTERR_NOCOMPATIBLEDEVICES) + CHK_ERRA(DXUTERR_MEDIANOTFOUND) + CHK_ERRA(DXUTERR_NONZEROREFCOUNT) + CHK_ERRA(DXUTERR_CREATINGDEVICE) + CHK_ERRA(DXUTERR_RESETTINGDEVICE) + CHK_ERRA(DXUTERR_CREATINGDEVICEOBJECTS) + CHK_ERRA(DXUTERR_RESETTINGDEVICEOBJECTS) + CHK_ERRA(DXUTERR_INCORRECTVERSION) + CHK_ERRA(DXUTERR_DEVICEREMOVED) + +// ------------------------------------------------------------- +// xaudio2.h error codes +// ------------------------------------------------------------- + CHK_ERRA(XAUDIO2_E_INVALID_CALL) + CHK_ERRA(XAUDIO2_E_XMA_DECODER_ERROR) + CHK_ERRA(XAUDIO2_E_XAPO_CREATION_FAILED) + CHK_ERRA(XAUDIO2_E_DEVICE_INVALIDATED) + +// ------------------------------------------------------------- +// xapo.h error codes +// ------------------------------------------------------------- + CHK_ERRA(XAPO_E_FORMAT_UNSUPPORTED) + + default: return L"Unknown error."; + } +} + +//-------------------------------------------------------------------------------------- +#undef CHK_ERR +#undef CHK_ERRA +#undef HRESULT_FROM_WIN32b +#undef CHK_ERR_WIN32A +#undef CHK_ERR_WIN32_ONLY + +#define CHK_ERRA(hrchk) \ + case hrchk: \ + wcscpy_s( desc, count, L#hrchk ); break; + +#define CHK_ERR(hrchk, strOut) \ + case hrchk: \ + wcscpy_s( desc, count, L##strOut ); break; + + +//-------------------------------------------------------------------------------------- +void WINAPI DXGetErrorDescriptionW( _In_ HRESULT hr, _Out_cap_(count) WCHAR* desc, _In_ size_t count ) +{ + if ( !count ) + return; + + *desc = 0; + + // First try to see if FormatMessage knows this hr + LPWSTR errorText = nullptr; + + DWORD result = FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER, nullptr, hr, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&errorText, 0, nullptr ); + + if (result > 0 && errorText) + { + wcscpy_s( desc, count, errorText ); + + if ( errorText ) + LocalFree( errorText ); + + return; + } + + switch (hr) + { +// Commmented out codes are actually alises for other codes + +// ------------------------------------------------------------- +// ddraw.h error codes +// ------------------------------------------------------------- + CHK_ERR(DDERR_ALREADYINITIALIZED, "This object is already initialized") + CHK_ERR(DDERR_CANNOTATTACHSURFACE, "This surface can not be attached to the requested surface.") + CHK_ERR(DDERR_CANNOTDETACHSURFACE, "This surface can not be detached from the requested surface.") + CHK_ERR(DDERR_CURRENTLYNOTAVAIL, "Support is currently not available.") + CHK_ERR(DDERR_EXCEPTION, "An exception was encountered while performing the requested operation") +// CHK_ERR(DDERR_GENERIC, "DDERR_GENERIC") + CHK_ERR(DDERR_HEIGHTALIGN, "Height of rectangle provided is not a multiple of reqd alignment") + CHK_ERR(DDERR_INCOMPATIBLEPRIMARY, "Unable to match primary surface creation request with existing primary surface.") + CHK_ERR(DDERR_INVALIDCAPS, "One or more of the caps bits passed to the callback are incorrect.") + CHK_ERR(DDERR_INVALIDCLIPLIST, "DirectDraw does not support provided Cliplist.") + CHK_ERR(DDERR_INVALIDMODE, "DirectDraw does not support the requested mode") + CHK_ERR(DDERR_INVALIDOBJECT, "DirectDraw received a pointer that was an invalid DIRECTDRAW object.") +// CHK_ERR(DDERR_INVALIDPARAMS, "DDERR_INVALIDPARAMS") + CHK_ERR(DDERR_INVALIDPIXELFORMAT, "pixel format was invalid as specified") + CHK_ERR(DDERR_INVALIDRECT, "Rectangle provided was invalid.") + CHK_ERR(DDERR_LOCKEDSURFACES, "Operation could not be carried out because one or more surfaces are locked") + CHK_ERR(DDERR_NO3D, "There is no 3D present.") + CHK_ERR(DDERR_NOALPHAHW, "Operation could not be carried out because there is no alpha accleration hardware present or available.") + CHK_ERR(DDERR_NOSTEREOHARDWARE, "Operation could not be carried out because there is no stereo hardware present or available.") + CHK_ERR(DDERR_NOSURFACELEFT, "Operation could not be carried out because there is no hardware present which supports stereo surfaces") + CHK_ERR(DDERR_NOCLIPLIST, "no clip list available") + CHK_ERR(DDERR_NOCOLORCONVHW, "Operation could not be carried out because there is no color conversion hardware present or available.") + CHK_ERR(DDERR_NOCOOPERATIVELEVELSET, "Create function called without DirectDraw object method SetCooperativeLevel being called.") + CHK_ERR(DDERR_NOCOLORKEY, "Surface doesn't currently have a color key") + CHK_ERR(DDERR_NOCOLORKEYHW, "Operation could not be carried out because there is no hardware support of the dest color key.") + CHK_ERR(DDERR_NODIRECTDRAWSUPPORT, "No DirectDraw support possible with current display driver") + CHK_ERR(DDERR_NOEXCLUSIVEMODE, "Operation requires the application to have exclusive mode but the application does not have exclusive mode.") + CHK_ERR(DDERR_NOFLIPHW, "Flipping visible surfaces is not supported.") + CHK_ERR(DDERR_NOGDI, "There is no GDI present.") + CHK_ERR(DDERR_NOMIRRORHW, "Operation could not be carried out because there is no hardware present or available.") + CHK_ERR(DDERR_NOTFOUND, "Requested item was not found") + CHK_ERR(DDERR_NOOVERLAYHW, "Operation could not be carried out because there is no overlay hardware present or available.") + CHK_ERR(DDERR_OVERLAPPINGRECTS, "Operation could not be carried out because the source and destination rectangles are on the same surface and overlap each other.") + CHK_ERR(DDERR_NORASTEROPHW, "Operation could not be carried out because there is no appropriate raster op hardware present or available.") + CHK_ERR(DDERR_NOROTATIONHW, "Operation could not be carried out because there is no rotation hardware present or available.") + CHK_ERR(DDERR_NOSTRETCHHW, "Operation could not be carried out because there is no hardware support for stretching") + CHK_ERR(DDERR_NOT4BITCOLOR, "DirectDrawSurface is not in 4 bit color palette and the requested operation requires 4 bit color palette.") + CHK_ERR(DDERR_NOT4BITCOLORINDEX, "DirectDrawSurface is not in 4 bit color index palette and the requested operation requires 4 bit color index palette.") + CHK_ERR(DDERR_NOT8BITCOLOR, "DirectDraw Surface is not in 8 bit color mode and the requested operation requires 8 bit color.") + CHK_ERR(DDERR_NOTEXTUREHW, "Operation could not be carried out because there is no texture mapping hardware present or available.") + CHK_ERR(DDERR_NOVSYNCHW, "Operation could not be carried out because there is no hardware support for vertical blank synchronized operations.") + CHK_ERR(DDERR_NOZBUFFERHW, "Operation could not be carried out because there is no hardware support for zbuffer blting.") + CHK_ERR(DDERR_NOZOVERLAYHW, "Overlay surfaces could not be z layered based on their BltOrder because the hardware does not support z layering of overlays.") + CHK_ERR(DDERR_OUTOFCAPS, "The hardware needed for the requested operation has already been allocated.") +// CHK_ERR(DDERR_OUTOFMEMORY, "DDERR_OUTOFMEMORY") +// CHK_ERR(DDERR_OUTOFVIDEOMEMORY, "DDERR_OUTOFVIDEOMEMORY") + CHK_ERR(DDERR_OVERLAYCANTCLIP, "hardware does not support clipped overlays") + CHK_ERR(DDERR_OVERLAYCOLORKEYONLYONEACTIVE, "Can only have ony color key active at one time for overlays") + CHK_ERR(DDERR_PALETTEBUSY, "Access to this palette is being refused because the palette is already locked by another thread.") + CHK_ERR(DDERR_COLORKEYNOTSET, "No src color key specified for this operation.") + CHK_ERR(DDERR_SURFACEALREADYATTACHED, "This surface is already attached to the surface it is being attached to.") + CHK_ERR(DDERR_SURFACEALREADYDEPENDENT, "This surface is already a dependency of the surface it is being made a dependency of.") + CHK_ERR(DDERR_SURFACEBUSY, "Access to this surface is being refused because the surface is already locked by another thread.") + CHK_ERR(DDERR_CANTLOCKSURFACE, "Access to this surface is being refused because no driver exists which can supply a pointer to the surface. This is most likely to happen when attempting to lock the primary surface when no DCI provider is present. Will also happen on attempts to lock an optimized surface.") + CHK_ERR(DDERR_SURFACEISOBSCURED, "Access to Surface refused because Surface is obscured.") + CHK_ERR(DDERR_SURFACELOST, "Access to this surface is being refused because the surface is gone. The DIRECTDRAWSURFACE object representing this surface should have Restore called on it.") + CHK_ERR(DDERR_SURFACENOTATTACHED, "The requested surface is not attached.") + CHK_ERR(DDERR_TOOBIGHEIGHT, "Height requested by DirectDraw is too large.") + CHK_ERR(DDERR_TOOBIGSIZE, "Size requested by DirectDraw is too large -- The individual height and width are OK.") + CHK_ERR(DDERR_TOOBIGWIDTH, "Width requested by DirectDraw is too large.") +// CHK_ERR(DDERR_UNSUPPORTED, "DDERR_UNSUPPORTED") + CHK_ERR(DDERR_UNSUPPORTEDFORMAT, "Pixel format requested is unsupported by DirectDraw") + CHK_ERR(DDERR_UNSUPPORTEDMASK, "Bitmask in the pixel format requested is unsupported by DirectDraw") + CHK_ERR(DDERR_INVALIDSTREAM, "The specified stream contains invalid data") + CHK_ERR(DDERR_VERTICALBLANKINPROGRESS, "vertical blank is in progress") + CHK_ERR(DDERR_WASSTILLDRAWING, "Was still drawing") + CHK_ERR(DDERR_DDSCAPSCOMPLEXREQUIRED, "The specified surface type requires specification of the COMPLEX flag") + CHK_ERR(DDERR_XALIGN, "Rectangle provided was not horizontally aligned on reqd. boundary") + CHK_ERR(DDERR_INVALIDDIRECTDRAWGUID, "The GUID passed to DirectDrawCreate is not a valid DirectDraw driver identifier.") + CHK_ERR(DDERR_DIRECTDRAWALREADYCREATED, "A DirectDraw object representing this driver has already been created for this process.") + CHK_ERR(DDERR_NODIRECTDRAWHW, "A hardware only DirectDraw object creation was attempted but the driver did not support any hardware.") + CHK_ERR(DDERR_PRIMARYSURFACEALREADYEXISTS, "this process already has created a primary surface") + CHK_ERR(DDERR_NOEMULATION, "software emulation not available.") + CHK_ERR(DDERR_REGIONTOOSMALL, "region passed to Clipper::GetClipList is too small.") + CHK_ERR(DDERR_CLIPPERISUSINGHWND, "an attempt was made to set a clip list for a clipper objec that is already monitoring an hwnd.") + CHK_ERR(DDERR_NOCLIPPERATTACHED, "No clipper object attached to surface object") + CHK_ERR(DDERR_NOHWND, "Clipper notification requires an HWND or no HWND has previously been set as the CooperativeLevel HWND.") + CHK_ERR(DDERR_HWNDSUBCLASSED, "HWND used by DirectDraw CooperativeLevel has been subclassed, this prevents DirectDraw from restoring state.") + CHK_ERR(DDERR_HWNDALREADYSET, "The CooperativeLevel HWND has already been set. It can not be reset while the process has surfaces or palettes created.") + CHK_ERR(DDERR_NOPALETTEATTACHED, "No palette object attached to this surface.") + CHK_ERR(DDERR_NOPALETTEHW, "No hardware support for 16 or 256 color palettes.") + CHK_ERR(DDERR_BLTFASTCANTCLIP, "If a clipper object is attached to the source surface passed into a BltFast call.") + CHK_ERR(DDERR_NOBLTHW, "No blter.") + CHK_ERR(DDERR_NODDROPSHW, "No DirectDraw ROP hardware.") + CHK_ERR(DDERR_OVERLAYNOTVISIBLE, "returned when GetOverlayPosition is called on a hidden overlay") + CHK_ERR(DDERR_NOOVERLAYDEST, "returned when GetOverlayPosition is called on a overlay that UpdateOverlay has never been called on to establish a destionation.") + CHK_ERR(DDERR_INVALIDPOSITION, "returned when the position of the overlay on the destionation is no longer legal for that destionation.") + CHK_ERR(DDERR_NOTAOVERLAYSURFACE, "returned when an overlay member is called for a non-overlay surface") + CHK_ERR(DDERR_EXCLUSIVEMODEALREADYSET, "An attempt was made to set the cooperative level when it was already set to exclusive.") + CHK_ERR(DDERR_NOTFLIPPABLE, "An attempt has been made to flip a surface that is not flippable.") + CHK_ERR(DDERR_CANTDUPLICATE, "Can't duplicate primary & 3D surfaces, or surfaces that are implicitly created.") + CHK_ERR(DDERR_NOTLOCKED, "Surface was not locked. An attempt to unlock a surface that was not locked at all, or by this process, has been attempted.") + CHK_ERR(DDERR_CANTCREATEDC, "Windows can not create any more DCs, or a DC was requested for a paltte-indexed surface when the surface had no palette AND the display mode was not palette-indexed (in this case DirectDraw cannot select a proper palette into the DC)") + CHK_ERR(DDERR_NODC, "No DC was ever created for this surface.") + CHK_ERR(DDERR_WRONGMODE, "This surface can not be restored because it was created in a different mode.") + CHK_ERR(DDERR_IMPLICITLYCREATED, "This surface can not be restored because it is an implicitly created surface.") + CHK_ERR(DDERR_NOTPALETTIZED, "The surface being used is not a palette-based surface") + CHK_ERR(DDERR_UNSUPPORTEDMODE, "The display is currently in an unsupported mode") + CHK_ERR(DDERR_NOMIPMAPHW, "Operation could not be carried out because there is no mip-map texture mapping hardware present or available.") + CHK_ERR(DDERR_INVALIDSURFACETYPE, "The requested action could not be performed because the surface was of the wrong type.") + CHK_ERR(DDERR_NOOPTIMIZEHW, "Device does not support optimized surfaces, therefore no video memory optimized surfaces") + CHK_ERR(DDERR_NOTLOADED, "Surface is an optimized surface, but has not yet been allocated any memory") + CHK_ERR(DDERR_NOFOCUSWINDOW, "Attempt was made to create or set a device window without first setting the focus window") + CHK_ERR(DDERR_NOTONMIPMAPSUBLEVEL, "Attempt was made to set a palette on a mipmap sublevel") + CHK_ERR(DDERR_DCALREADYCREATED, "A DC has already been returned for this surface. Only one DC can be retrieved per surface.") + CHK_ERR(DDERR_NONONLOCALVIDMEM, "An attempt was made to allocate non-local video memory from a device that does not support non-local video memory.") + CHK_ERR(DDERR_CANTPAGELOCK, "The attempt to page lock a surface failed.") + CHK_ERR(DDERR_CANTPAGEUNLOCK, "The attempt to page unlock a surface failed.") + CHK_ERR(DDERR_NOTPAGELOCKED, "An attempt was made to page unlock a surface with no outstanding page locks.") + CHK_ERR(DDERR_MOREDATA, "There is more data available than the specified buffer size could hold") + CHK_ERR(DDERR_EXPIRED, "The data has expired and is therefore no longer valid.") + CHK_ERR(DDERR_TESTFINISHED, "The mode test has finished executing.") + CHK_ERR(DDERR_NEWMODE, "The mode test has switched to a new mode.") + CHK_ERR(DDERR_D3DNOTINITIALIZED, "D3D has not yet been initialized.") + CHK_ERR(DDERR_VIDEONOTACTIVE, "The video port is not active") + CHK_ERR(DDERR_NOMONITORINFORMATION, "The monitor does not have EDID data.") + CHK_ERR(DDERR_NODRIVERSUPPORT, "The driver does not enumerate display mode refresh rates.") + CHK_ERR(DDERR_DEVICEDOESNTOWNSURFACE, "Surfaces created by one direct draw device cannot be used directly by another direct draw device.") + +// ------------------------------------------------------------- +// d3d10.h error codes +// ------------------------------------------------------------- + CHK_ERR(D3D10_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS, "There are too many unique state objects.") + CHK_ERR(D3D10_ERROR_FILE_NOT_FOUND, "File not found") + +// ------------------------------------------------------------- +// dxgi.h error codes +// ------------------------------------------------------------- + CHK_ERR(DXGI_STATUS_OCCLUDED, "The target window or output has been occluded. The application should suspend rendering operations if possible.") + CHK_ERR(DXGI_STATUS_CLIPPED, "Target window is clipped.") + CHK_ERR(DXGI_STATUS_NO_REDIRECTION, "") + CHK_ERR(DXGI_STATUS_NO_DESKTOP_ACCESS, "No access to desktop.") + CHK_ERR(DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE, "") + CHK_ERR(DXGI_STATUS_MODE_CHANGED, "Display mode has changed") + CHK_ERR(DXGI_STATUS_MODE_CHANGE_IN_PROGRESS, "Display mode is changing") + CHK_ERR(DXGI_ERROR_INVALID_CALL, "The application has made an erroneous API call that it had enough information to avoid. This error is intended to denote that the application should be altered to avoid the error. Use of the debug version of the DXGI.DLL will provide run-time debug output with further information.") + CHK_ERR(DXGI_ERROR_NOT_FOUND, "The item requested was not found. For GetPrivateData calls, this means that the specified GUID had not been previously associated with the object.") + CHK_ERR(DXGI_ERROR_MORE_DATA, "The specified size of the destination buffer is too small to hold the requested data.") + CHK_ERR(DXGI_ERROR_UNSUPPORTED, "Unsupported.") + CHK_ERR(DXGI_ERROR_DEVICE_REMOVED, "Hardware device removed.") + CHK_ERR(DXGI_ERROR_DEVICE_HUNG, "Device hung due to badly formed commands.") + CHK_ERR(DXGI_ERROR_DEVICE_RESET, "Device reset due to a badly formed commant.") + CHK_ERR(DXGI_ERROR_WAS_STILL_DRAWING, "Was still drawing.") + CHK_ERR(DXGI_ERROR_FRAME_STATISTICS_DISJOINT, "The requested functionality is not supported by the device or the driver.") + CHK_ERR(DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE, "The requested functionality is not supported by the device or the driver.") + CHK_ERR(DXGI_ERROR_DRIVER_INTERNAL_ERROR, "An internal driver error occurred.") + CHK_ERR(DXGI_ERROR_NONEXCLUSIVE, "The application attempted to perform an operation on an DXGI output that is only legal after the output has been claimed for exclusive owenership.") + CHK_ERR(DXGI_ERROR_NOT_CURRENTLY_AVAILABLE, "The requested functionality is not supported by the device or the driver.") + CHK_ERR(DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED, "Remote desktop client disconnected.") + CHK_ERR(DXGI_ERROR_REMOTE_OUTOFMEMORY, "Remote desktop client is out of memory.") + +// ------------------------------------------------------------- +// d3d11.h error codes +// ------------------------------------------------------------- + CHK_ERR(D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS, "There are too many unique state objects.") + CHK_ERR(D3D11_ERROR_FILE_NOT_FOUND, "File not found") + CHK_ERR(D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS, "Therea are too many unique view objects.") + CHK_ERR(D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD, "Deferred context requires Map-Discard usage pattern") + +// ------------------------------------------------------------- +// Direct2D error codes +// ------------------------------------------------------------- + CHK_ERR(D2DERR_UNSUPPORTED_PIXEL_FORMAT, "The pixel format is not supported.") +// CHK_ERR(D2DERR_INSUFFICIENT_BUFFER, "The supplied buffer was too small to accomodate the data.") + CHK_ERR(D2DERR_WRONG_STATE, "The object was not in the correct state to process the method.") + CHK_ERR(D2DERR_NOT_INITIALIZED, "The object has not yet been initialized.") + CHK_ERR(D2DERR_UNSUPPORTED_OPERATION, "The requested opertion is not supported.") + CHK_ERR(D2DERR_SCANNER_FAILED, "The geomery scanner failed to process the data.") + CHK_ERR(D2DERR_SCREEN_ACCESS_DENIED, "D2D could not access the screen.") + CHK_ERR(D2DERR_DISPLAY_STATE_INVALID, "A valid display state could not be determined.") + CHK_ERR(D2DERR_ZERO_VECTOR, "The supplied vector is zero.") + CHK_ERR(D2DERR_INTERNAL_ERROR, "An internal error (D2D bug) occurred. On checked builds, we would assert.") + CHK_ERR(D2DERR_DISPLAY_FORMAT_NOT_SUPPORTED, "The display format we need to render is not supported by the hardware device.") + CHK_ERR(D2DERR_INVALID_CALL, "A call to this method is invalid.") + CHK_ERR(D2DERR_NO_HARDWARE_DEVICE, "No HW rendering device is available for this operation.") + CHK_ERR(D2DERR_RECREATE_TARGET, "here has been a presentation error that may be recoverable. The caller needs to recreate, rerender the entire frame, and reattempt present.") + CHK_ERR(D2DERR_TOO_MANY_SHADER_ELEMENTS, "Shader construction failed because it was too complex.") + CHK_ERR(D2DERR_SHADER_COMPILE_FAILED, "Shader compilation failed.") + CHK_ERR(D2DERR_MAX_TEXTURE_SIZE_EXCEEDED, "Requested DX surface size exceeded maximum texture size.") + CHK_ERR(D2DERR_UNSUPPORTED_VERSION, "The requested D2D version is not supported.") + CHK_ERR(D2DERR_BAD_NUMBER, "Invalid number.") + CHK_ERR(D2DERR_WRONG_FACTORY, "Objects used together must be created from the same factory instance.") + CHK_ERR(D2DERR_LAYER_ALREADY_IN_USE, "A layer resource can only be in use once at any point in time.") + CHK_ERR(D2DERR_POP_CALL_DID_NOT_MATCH_PUSH, "The pop call did not match the corresponding push call") +// CHK_ERR(D2DERR_WRONG_RESOURCE_DOMAIN, "The resource was realized on the wrong render target") + CHK_ERR(D2DERR_PUSH_POP_UNBALANCED, "The push and pop calls were unbalanced") + CHK_ERR(D2DERR_RENDER_TARGET_HAS_LAYER_OR_CLIPRECT, "Attempt to copy from a render target while a layer or clip rect is applied") + CHK_ERR(D2DERR_INCOMPATIBLE_BRUSH_TYPES, "The brush types are incompatible for the call.") + CHK_ERR(D2DERR_WIN32_ERROR, "An unknown win32 failure occurred.") + CHK_ERR(D2DERR_TARGET_NOT_GDI_COMPATIBLE, "The render target is not compatible with GDI") + CHK_ERR(D2DERR_TEXT_EFFECT_IS_WRONG_TYPE, "A text client drawing effect object is of the wrong type") + CHK_ERR(D2DERR_TEXT_RENDERER_NOT_RELEASED, "The application is holding a reference to the IDWriteTextRenderer interface after the corresponding DrawText or DrawTextLayout call has returned. The IDWriteTextRenderer instance will be zombied.") +// CHK_ERR(D2DERR_EXCEEDS_MAX_BITMAP_SIZE, "The requested size is larger than the guaranteed supported texture size.") + +// ------------------------------------------------------------- +// DirectWrite error codes +// ------------------------------------------------------------- + CHK_ERR(DWRITE_E_FILEFORMAT, "Indicates an error in an input file such as a font file.") + CHK_ERR(DWRITE_E_UNEXPECTED, "Indicates an error originating in DirectWrite code, which is not expected to occur but is safe to recover from.") + CHK_ERR(DWRITE_E_NOFONT, "Indicates the specified font does not exist.") + CHK_ERR(DWRITE_E_FILENOTFOUND, "A font file could not be opened because the file, directory, network location, drive, or other storage location does not exist or is unavailable.") + CHK_ERR(DWRITE_E_FILEACCESS, "A font file exists but could not be opened due to access denied, sharing violation, or similar error.") + CHK_ERR(DWRITE_E_FONTCOLLECTIONOBSOLETE, "A font collection is obsolete due to changes in the system.") + CHK_ERR(DWRITE_E_ALREADYREGISTERED, "The given interface is already registered.") + +// ------------------------------------------------------------- +// WIC error codes +// ------------------------------------------------------------- + CHK_ERR(WINCODEC_ERR_WRONGSTATE, "WIC object in incorrect state.") + CHK_ERR(WINCODEC_ERR_VALUEOUTOFRANGE, "WIC Value out of range.") + CHK_ERR(WINCODEC_ERR_UNKNOWNIMAGEFORMAT, "Encountered unexpected value or setting in WIC image format.") + CHK_ERR(WINCODEC_ERR_UNSUPPORTEDVERSION, "Unsupported WINCODEC_SD_VERSION passed to WIC factory.") + CHK_ERR(WINCODEC_ERR_NOTINITIALIZED, "WIC component not initialized.") + CHK_ERR(WINCODEC_ERR_ALREADYLOCKED, "WIC bitmap object already locked.") + CHK_ERR(WINCODEC_ERR_PROPERTYNOTFOUND, "WIC property not found.") + CHK_ERR(WINCODEC_ERR_PROPERTYNOTSUPPORTED, "WIC property not supported.") + CHK_ERR(WINCODEC_ERR_PROPERTYSIZE, "Invalid property size") + CHK_ERRA(WINCODEC_ERR_CODECPRESENT) // not currently used by WIC + CHK_ERRA(WINCODEC_ERR_CODECNOTHUMBNAIL) // not currently used by WIC + CHK_ERR(WINCODEC_ERR_PALETTEUNAVAILABLE, "Required palette data not available.") + CHK_ERR(WINCODEC_ERR_CODECTOOMANYSCANLINES, "More scanlines requested than are available in WIC bitmap.") + CHK_ERR(WINCODEC_ERR_INTERNALERROR, "Unexpected internal error in WIC.") + CHK_ERR(WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS, "Source WIC rectangle does not match bitmap dimensions.") + CHK_ERR(WINCODEC_ERR_COMPONENTNOTFOUND, "WIC component not found.") + CHK_ERR(WINCODEC_ERR_IMAGESIZEOUTOFRANGE, "Image size beyond expected boundaries for WIC codec." ) + CHK_ERR(WINCODEC_ERR_TOOMUCHMETADATA, "Image metadata size beyond expected boundaries for WIC codec.") + CHK_ERR(WINCODEC_ERR_BADIMAGE, "WIC image is corrupted.") + CHK_ERR(WINCODEC_ERR_BADHEADER, "Invalid header found in WIC image.") + CHK_ERR(WINCODEC_ERR_FRAMEMISSING, "Expected bitmap frame data not found in WIC image." ) + CHK_ERR(WINCODEC_ERR_BADMETADATAHEADER, "Invalid metadata header found in WIC image.") + CHK_ERR(WINCODEC_ERR_BADSTREAMDATA, "Invalid stream data found in WIC image.") + CHK_ERR(WINCODEC_ERR_STREAMWRITE, "WIC operation on write stream failed.") + CHK_ERR(WINCODEC_ERR_STREAMREAD, "WIC operation on read stream failed.") + CHK_ERR(WINCODEC_ERR_STREAMNOTAVAILABLE, "Required stream is not available." ) +// CHK_ERRA(WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT) + CHK_ERR(WINCODEC_ERR_UNSUPPORTEDOPERATION, "This operation is not supported by WIC." ) + CHK_ERR(WINCODEC_ERR_INVALIDREGISTRATION, "Error occurred reading WIC codec registry keys.") + CHK_ERR(WINCODEC_ERR_COMPONENTINITIALIZEFAILURE, "Failed initializing WIC codec.") + CHK_ERR(WINCODEC_ERR_INSUFFICIENTBUFFER, "Not enough buffer space available for WIC operation.") + CHK_ERR(WINCODEC_ERR_DUPLICATEMETADATAPRESENT, "Duplicate metadata detected in WIC image.") + CHK_ERR(WINCODEC_ERR_PROPERTYUNEXPECTEDTYPE, "Unexpected property type in WIC image.") + CHK_ERR(WINCODEC_ERR_UNEXPECTEDSIZE, "Unexpected value size in WIC metadata.") + CHK_ERR(WINCODEC_ERR_INVALIDQUERYREQUEST, "Invalid metadata query.") + CHK_ERR(WINCODEC_ERR_UNEXPECTEDMETADATATYPE, "Unexpected metadata type encountered in WIC image.") + CHK_ERR(WINCODEC_ERR_REQUESTONLYVALIDATMETADATAROOT, "Operation only valid on meatadata root.") + CHK_ERR(WINCODEC_ERR_INVALIDQUERYCHARACTER, "Invalid character in WIC metadata query.") + CHK_ERR(WINCODEC_ERR_WIN32ERROR, "General Win32 error encountered during WIC operation.") + CHK_ERR(WINCODEC_ERR_INVALIDPROGRESSIVELEVEL, "Invalid level for progressive WIC image decode.") + +// ------------------------------------------------------------- +// DXUT error codes +// ------------------------------------------------------------- + CHK_ERR(DXUTERR_NODIRECT3D, "Could not initialize Direct3D.") + CHK_ERR(DXUTERR_NOCOMPATIBLEDEVICES, "No device could be found with the specified device settings.") + CHK_ERR(DXUTERR_MEDIANOTFOUND, "A media file could not be found.") + CHK_ERR(DXUTERR_NONZEROREFCOUNT, "The device interface has a non-zero reference count, meaning that some objects were not released.") + CHK_ERR(DXUTERR_CREATINGDEVICE, "An error occurred when attempting to create a device.") + CHK_ERR(DXUTERR_RESETTINGDEVICE, "An error occurred when attempting to reset a device.") + CHK_ERR(DXUTERR_CREATINGDEVICEOBJECTS, "An error occurred in the device create callback function.") + CHK_ERR(DXUTERR_RESETTINGDEVICEOBJECTS, "An error occurred in the device reset callback function.") + CHK_ERR(DXUTERR_INCORRECTVERSION, "Incorrect version of Direct3D or D3DX.") + CHK_ERR(DXUTERR_DEVICEREMOVED, "The device was removed.") + +// ------------------------------------------------------------- +// xaudio2.h error codes +// ------------------------------------------------------------- + CHK_ERR(XAUDIO2_E_INVALID_CALL, "Invalid XAudio2 API call or arguments") + CHK_ERR(XAUDIO2_E_XMA_DECODER_ERROR, "Hardware XMA decoder error") + CHK_ERR(XAUDIO2_E_XAPO_CREATION_FAILED, "Failed to create an audio effect") + CHK_ERR(XAUDIO2_E_DEVICE_INVALIDATED, "Device invalidated (unplugged, disabled, etc)") + +// ------------------------------------------------------------- +// xapo.h error codes +// ------------------------------------------------------------- + CHK_ERR(XAPO_E_FORMAT_UNSUPPORTED, "Requested audio format unsupported.") + + default: wcscpy_s( desc, count, L"Unknown error." ); break; + } +} + +//----------------------------------------------------------------------------- +HRESULT WINAPI DXTraceW( _In_z_ const WCHAR* strFile, _In_ DWORD dwLine, _In_ HRESULT hr, + _In_opt_ const WCHAR* strMsg, _In_ bool bPopMsgBox ) +{ + WCHAR strBufferFile[MAX_PATH]; + WCHAR strBufferLine[128]; + WCHAR strBufferError[256]; + WCHAR strBufferMsg[1024]; + WCHAR strBuffer[BUFFER_SIZE]; + + swprintf_s( strBufferLine, 128, L"%lu", dwLine ); + if( strFile ) + { + swprintf_s( strBuffer, BUFFER_SIZE, L"%ls(%ls): ", strFile, strBufferLine ); + OutputDebugStringW( strBuffer ); + } + + size_t nMsgLen = (strMsg) ? wcsnlen_s( strMsg, 1024 ) : 0; + if( nMsgLen > 0 ) + { + OutputDebugStringW( strMsg ); + OutputDebugStringW( L" " ); + } + + swprintf_s( strBufferError, 256, L"%ls (0x%0.8x)", DXGetErrorStringW(hr), hr ); + swprintf_s( strBuffer, BUFFER_SIZE, L"hr=%ls", strBufferError ); + OutputDebugStringW( strBuffer ); + + OutputDebugStringW( L"\n" ); + + if( bPopMsgBox ) + { + wcscpy_s( strBufferFile, MAX_PATH, L"" ); + if( strFile ) + wcscpy_s( strBufferFile, MAX_PATH, strFile ); + + wcscpy_s( strBufferMsg, 1024, L"" ); + if( nMsgLen > 0 ) + swprintf_s( strBufferMsg, 1024, L"Calling: %ls\n", strMsg ); + + swprintf_s( strBuffer, BUFFER_SIZE, L"File: %ls\nLine: %ls\nError Code: %ls\n%lsDo you want to debug the application?", + strBufferFile, strBufferLine, strBufferError, strBufferMsg ); + + int nResult = MessageBoxW( GetForegroundWindow(), strBuffer, L"Unexpected error encountered", MB_YESNO | MB_ICONERROR ); + if( nResult == IDYES ) + DebugBreak(); + } + + return hr; +} \ No newline at end of file diff --git a/DXUT11/Core/dxerr.h b/DXUT11/Core/dxerr.h new file mode 100644 index 0000000..39e348d --- /dev/null +++ b/DXUT11/Core/dxerr.h @@ -0,0 +1,76 @@ +//-------------------------------------------------------------------------------------- +// File: DXErr.h +// +// DirectX Error Library +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- + +// This version only supports UNICODE. + +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +//-------------------------------------------------------------------------------------- +// DXGetErrorString +//-------------------------------------------------------------------------------------- +const WCHAR* WINAPI DXGetErrorStringW( _In_ HRESULT hr ); + +#define DXGetErrorString DXGetErrorStringW + +//-------------------------------------------------------------------------------------- +// DXGetErrorDescription has to be modified to return a copy in a buffer rather than +// the original static string. +//-------------------------------------------------------------------------------------- +void WINAPI DXGetErrorDescriptionW( _In_ HRESULT hr, _Out_cap_(count) WCHAR* desc, _In_ size_t count ); + +#define DXGetErrorDescription DXGetErrorDescriptionW + +//-------------------------------------------------------------------------------------- +// DXTrace +// +// Desc: Outputs a formatted error message to the debug stream +// +// Args: WCHAR* strFile The current file, typically passed in using the +// __FILEW__ macro. +// DWORD dwLine The current line number, typically passed in using the +// __LINE__ macro. +// HRESULT hr An HRESULT that will be traced to the debug stream. +// CHAR* strMsg A string that will be traced to the debug stream (may be NULL) +// BOOL bPopMsgBox If TRUE, then a message box will popup also containing the passed info. +// +// Return: The hr that was passed in. +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXTraceW( _In_z_ const WCHAR* strFile, _In_ DWORD dwLine, _In_ HRESULT hr, _In_opt_ const WCHAR* strMsg, _In_ bool bPopMsgBox ); + +#define DXTrace DXTraceW + +//-------------------------------------------------------------------------------------- +// +// Helper macros +// +//-------------------------------------------------------------------------------------- +#if defined(DEBUG) || defined(_DEBUG) +#define DXTRACE_MSG(str) DXTrace( __FILEW__, (DWORD)__LINE__, 0, str, false ) +#define DXTRACE_ERR(str,hr) DXTrace( __FILEW__, (DWORD)__LINE__, hr, str, false ) +#define DXTRACE_ERR_MSGBOX(str,hr) DXTrace( __FILEW__, (DWORD)__LINE__, hr, str, true ) +#else +#define DXTRACE_MSG(str) (0L) +#define DXTRACE_ERR(str,hr) (hr) +#define DXTRACE_ERR_MSGBOX(str,hr) (hr) +#endif + +#ifdef __cplusplus +} +#endif //__cplusplus diff --git a/DXUT11/DXUT_2013.sln b/DXUT11/DXUT_2013.sln new file mode 100644 index 0000000..52b8405 --- /dev/null +++ b/DXUT11/DXUT_2013.sln @@ -0,0 +1,58 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_2013.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_2013.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/DXUT_2013_Win10.sln b/DXUT11/DXUT_2013_Win10.sln new file mode 100644 index 0000000..c917a9c --- /dev/null +++ b/DXUT11/DXUT_2013_Win10.sln @@ -0,0 +1,58 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_2013_Win10.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_2013_Win10.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/DXUT_2015.sln b/DXUT11/DXUT_2015.sln new file mode 100644 index 0000000..c58339a --- /dev/null +++ b/DXUT11/DXUT_2015.sln @@ -0,0 +1,58 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_2015.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_2015.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/DXUT_2015_Win10.sln b/DXUT11/DXUT_2015_Win10.sln new file mode 100644 index 0000000..eddd709 --- /dev/null +++ b/DXUT11/DXUT_2015_Win10.sln @@ -0,0 +1,58 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_2015_Win10.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_2015_Win10.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/DXUT_2017_Win10.sln b/DXUT11/DXUT_2017_Win10.sln new file mode 100644 index 0000000..5318e24 --- /dev/null +++ b/DXUT11/DXUT_2017_Win10.sln @@ -0,0 +1,58 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2017 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_2017_Win10.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_2017_Win10.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/DXUT_DirectXTK_2013.sln b/DXUT11/DXUT_DirectXTK_2013.sln new file mode 100644 index 0000000..b7634e4 --- /dev/null +++ b/DXUT11/DXUT_DirectXTK_2013.sln @@ -0,0 +1,84 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_DirectXTK_2013.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" + ProjectSection(ProjectDependencies) = postProject + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} = {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_DirectXTK_2013.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" + ProjectSection(ProjectDependencies) = postProject + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} = {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2013", "..\DirectXTK\DirectXTK_Desktop_2013.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Deploy.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Deploy.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.Deploy.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.Build.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.Deploy.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Deploy.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/DXUT_DirectXTK_2015.sln b/DXUT11/DXUT_DirectXTK_2015.sln new file mode 100644 index 0000000..3b9cadd --- /dev/null +++ b/DXUT11/DXUT_DirectXTK_2015.sln @@ -0,0 +1,84 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2015 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_DirectXTK_2015.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" + ProjectSection(ProjectDependencies) = postProject + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} = {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_DirectXTK_2015.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" + ProjectSection(ProjectDependencies) = postProject + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} = {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2015", "..\DirectXTK\DirectXTK_Desktop_2015.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Deploy.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Deploy.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.Deploy.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.Build.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.Deploy.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Deploy.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/DXUT_DirectXTK_2015_Win10.sln b/DXUT11/DXUT_DirectXTK_2015_Win10.sln new file mode 100644 index 0000000..050ce0a --- /dev/null +++ b/DXUT11/DXUT_DirectXTK_2015_Win10.sln @@ -0,0 +1,80 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_DirectXTK_2015_Win10.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" + ProjectSection(ProjectDependencies) = postProject + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} = {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_DirectXTK_2015_Win10.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" + ProjectSection(ProjectDependencies) = postProject + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} = {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2015_Win10", "..\directxtk\DirectXTK_Desktop_2015_Win10.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.Build.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/DXUT_DirectXTK_2017.sln b/DXUT11/DXUT_DirectXTK_2017.sln new file mode 100644 index 0000000..bd1c573 --- /dev/null +++ b/DXUT11/DXUT_DirectXTK_2017.sln @@ -0,0 +1,84 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2017 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUT", "Core\DXUT_DirectXTK_2017.vcxproj", "{85344B7F-5AA0-4E12-A065-D1333D11F6CA}" + ProjectSection(ProjectDependencies) = postProject + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} = {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DXUTOpt", "Optional\DXUTOpt_DirectXTK_2017.vcxproj", "{61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}" + ProjectSection(ProjectDependencies) = postProject + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} = {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2017", "..\DirectXTK\DirectXTK_Desktop_2017.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Profile|Win32 = Profile|Win32 + Profile|x64 = Profile|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.ActiveCfg = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Build.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|Win32.Deploy.0 = Debug|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.ActiveCfg = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Build.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Debug|x64.Deploy.0 = Debug|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.ActiveCfg = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Build.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|Win32.Deploy.0 = Profile|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.ActiveCfg = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Build.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Profile|x64.Deploy.0 = Profile|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.ActiveCfg = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Build.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|Win32.Deploy.0 = Release|Win32 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.ActiveCfg = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Build.0 = Release|x64 + {85344B7F-5AA0-4E12-A065-D1333D11F6CA}.Release|x64.Deploy.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Build.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|Win32.Deploy.0 = Debug|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.ActiveCfg = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Build.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Debug|x64.Deploy.0 = Debug|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.ActiveCfg = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Build.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|Win32.Deploy.0 = Profile|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.ActiveCfg = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Build.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Profile|x64.Deploy.0 = Profile|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.ActiveCfg = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Build.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|Win32.Deploy.0 = Release|Win32 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.ActiveCfg = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Build.0 = Release|x64 + {61B333C2-C4F7-4CC1-A9BF-83F6D95588EB}.Release|x64.Deploy.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Deploy.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Deploy.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|Win32.Deploy.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.Build.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Profile|x64.Deploy.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Deploy.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DXUT11/LICENSE b/DXUT11/LICENSE new file mode 100644 index 0000000..73617f0 --- /dev/null +++ b/DXUT11/LICENSE @@ -0,0 +1,21 @@ + The MIT License (MIT) + +Copyright (c) 2017 Microsoft Corp + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/DXUT11/Media/UI/Font.dds b/DXUT11/Media/UI/Font.dds new file mode 100644 index 0000000000000000000000000000000000000000..37514f5bf7fdb81efc52766d02bdaec0fecd3061 GIT binary patch literal 76128 zcmeI4L5^g{4MZE(!dowN0A0m^ZlLSvT)N(rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlM zm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlM zm>rlMm>rlMm>rlMm>rlMm>rlMm>rlMm>rlM_@q1V{;Yq_{Bu&~pA|DZFgx(sci^-C z^{VqeJmBh^;{hx0qq^pj6{vi6$D3)+?YukP^S(>XcL7(w`^2;JqJyisp>Z-Fnq%hG ztng{I%)o(yo%)BSMdgH#!!>>L#NA<*gckp+8D?i%F+?7}J zxM%M~%d(uqo8<(D4yx~j)4pA9N7p>wp{V+!d7eeRnuiC(OI_j5=Bs`W{8jYtSLJkl zRloD(Ie%J{6L{L&@!y$$N7j`LdQN_?d&vlNEvrxcS;la^Z~Yy=Q)j>MRNn_Zu<|^U zXZ~si9`I2wIiTmkgXmrd&%v|9uK#Y|?pmIMkcHZk#AO5e7{vEvL_ho#>t^8<#oM&-a{wwBoXH@Uwd+c<4)jV|1@fzPQ z2cP$Q{VHGeUVo3*)%&u%Zm;^Pdo@@6c^-kx#_TRJ9uljen=z%^XYEGsp*Y#=7D&OrsxoV)iZ2Gc7od>dtwsUcYDFF6UWMb21IC{?{Jxi%nElsu6s?c^Io6&!taL+MLcj`!z=DQ zJ3X>En!CGS>DgtzN`Lm-@5sL+gYS7~7MUG9oqOuR)+P)4TR_-|6A24jG{Ov=6=FDxSPmf982cp1#5F)f@1+ z?)9^Lk?V(9j$I#p_^BOtI{vQjs-M1RBELZ~o2RoTqh1~LXFk=ryAR&c zeNnq7YL4E6%e?Bzbg~@X>pHdjbRHg1y>J<-ZD{aUExRgnCZwHo%i|D_(R8@1<-J9F>I(u{6y z<%6$KXT{x*>zRih^=6#vde6Ko4lPh~xU0?`4Xk){MZAvc(K|lns{6`|238rtb2=Wp zp!dK#st--MxO0?;bId%-J(8!rtGPN4pK^M4-RsPI;#qkko1=65jt6vI>$^N;cJi)x z>3KC)zbE6J^P0Ci?{)Y%^i&*N6WqcIV)8+|9*b`Bpkwg_?;6&g&KLUa#rRF!S!XOeb44y`u+m;HW|Pl~+A_ z&oWfk`^t+3YMtzNxnz7>b&sF`u+I8UAF8JA^MzEw7w z<0=ac^j@!bK6J-j4u17zT$GZG!PF6pWzix)#JR^%!hYGS3L31M-R1Q zR}Y`}X7w&ld+>I%wfE|snOFOxZ*@EuFTB?kpZS#I4w7>PPcv42G{@>)_$vLQ`0l&h z=e56or-z^8y{o$Ffp=VGt=>Qm{a(X^r~1y{&Bb>IcHeY5tCPF(sKy=ix4=7AKIQ3w z^BO+G%-iLd!^2U(b6%^r%E05jUgPtemCwDJp?A;l8n5!)1JMIH%2j;j)!xdJ z@yh94^Q!yGztXbbw(_Ha*?Z6&JKoF#M;>*C9Z&RevW$xB^mIH`{xkUOJsB6XIrdEwsiyjXBUc-Ys9bX_vIqqm6e1$t7x})cz!+RY(2M?I>9j@bH z#%jKL^iF=D^4!s>GjxyF+JgqF#vRQOU9sZ{zaP!eJ3i&Ad)IrnuX@i%^ZZV5^&UK+ zd!45S@$YJUr|7x6{!{-d@6N2%oD=QjP44yD=RT^F=Q&>EQ(Spm^O_vzy~Y>FQO@t~ z@!I{}+^p{ruJf*w{JZkHIqvhCw`csFT$UBHIlSY9(;n_u^RhlNt2d#0uh;mpoJYOh z?=`cX_xe#E{f<7zYy8f89X<{{V8yR`s@_#rCr>@AEZ4l|ec%Zy2URk-Wh=~eEt z`0PCy7xOv#7U#Ui>%7<9{3>t9qw5^r0IElQ@RhHtb@;WMQ73X-?$?fP~(=-s@okK7&JnMW3w%|>%{uj|zAi`q}-f$MlXo|C!c z@rDZVfgNAvf!}4F`ohnl_bQ&`bi8;#e;0g(_$xhlJc^lrr)ODNj&fuw#~m$0Jc{a5 zKD&3k>WRA_*DH_q(W6{;f7GXMAxqI`s;0f_bC1^Qi@R!Bo^$H=ENb;|M+4y<(LvX> zKJipu_zHDi-2LqIuHSPWt(p61&Yk_dDMRLD8XO)F-Vq&iU28mn)lpC7b5B;2uNqv1 z9j|))PHx4Aj)qsc(5ge<%0n++>I(6#GSzdpuk$YEpLqS9WH_E=;`I!z@qntueRtfi zJu5BC&HTGO?IBaS?B4Zdy~F+guLpO1i|(IC*LT;uB8PKl=49Q!LtpKi&R)$9e6^kZ z%J1dBZ;oI2H+|)|^XG8)Z+KSj-S7NPc^~m-@)0v%{bzdhH(u>~_3!&^^X~p`-MqVf zpY6N;%dk#MOyT}2rT=VzF!-|X)9bh7bOv(W=9&+zkYW(Q^mW(Q^mW(Q^mW(Q^m zW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^m zW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q^mW(Q;k{s#Md B8!uDSP^>$CUSd(NEy_xOv|4#Ge0a3I*3zxSik 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ⅇ-=EcR-gA#H-s|5f?(5pYwb#e_ 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 literal 0 HcmV?d00001 diff --git a/DXUT11/Optional/DXUTLockFreePipe.h b/DXUT11/Optional/DXUTLockFreePipe.h new file mode 100644 index 0000000..e6bd360 --- /dev/null +++ b/DXUT11/Optional/DXUTLockFreePipe.h @@ -0,0 +1,226 @@ +//-------------------------------------------------------------------------------------- +// DXUTLockFreePipe.h +// +// See the "Lockless Programming Considerations for Xbox 360 and Microsoft Windows" +// article for more details. +// +// http://msdn.microsoft.com/en-us/library/ee418650.aspx +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +#include +#include + +#pragma pack(push) +#pragma pack(8) +#include +#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 + +// +// 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 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( _Out_writes_(cbDest) void* pvDest, _In_ 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 = std::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( _In_reads_(cbSrc) const void* pvSrc, _In_ 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 = std::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/DXUT11/Optional/DXUTOpt_2013.vcxproj b/DXUT11/Optional/DXUTOpt_2013.vcxproj new file mode 100644 index 0000000..32974b9 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2013.vcxproj @@ -0,0 +1,434 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_2013.vcxproj.filters b/DXUT11/Optional/DXUTOpt_2013.vcxproj.filters new file mode 100644 index 0000000..1bdbaf9 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2013.vcxproj.filters @@ -0,0 +1,32 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj b/DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj new file mode 100644 index 0000000..eed9d9a --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj @@ -0,0 +1,440 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj.filters b/DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj.filters new file mode 100644 index 0000000..1bdbaf9 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2013_Win10.vcxproj.filters @@ -0,0 +1,32 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTOpt_2015.vcxproj b/DXUT11/Optional/DXUTOpt_2015.vcxproj new file mode 100644 index 0000000..3c0cfd9 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2015.vcxproj @@ -0,0 +1,434 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_2015.vcxproj.filters b/DXUT11/Optional/DXUTOpt_2015.vcxproj.filters new file mode 100644 index 0000000..1bdbaf9 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2015.vcxproj.filters @@ -0,0 +1,32 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj b/DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj new file mode 100644 index 0000000..dc66e81 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj @@ -0,0 +1,435 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + 10.0.14393.0 + + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj.filters b/DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj.filters new file mode 100644 index 0000000..1bdbaf9 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2015_Win10.vcxproj.filters @@ -0,0 +1,32 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj b/DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj new file mode 100644 index 0000000..6b95209 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj @@ -0,0 +1,435 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + 10.0.14393.0 + + + + StaticLibrary + Unicode + v141 + + + StaticLibrary + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;_WIN32_WINNT=0x0600;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj.filters b/DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj.filters new file mode 100644 index 0000000..1bdbaf9 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_2017_Win10.vcxproj.filters @@ -0,0 +1,32 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTOpt_DirectXTK_2013.vcxproj b/DXUT11/Optional/DXUTOpt_DirectXTK_2013.vcxproj new file mode 100644 index 0000000..d246bcf --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_DirectXTK_2013.vcxproj @@ -0,0 +1,432 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + StaticLibrary + true + Unicode + v120 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2013\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_DirectXTK_2013.vcxproj.filters b/DXUT11/Optional/DXUTOpt_DirectXTK_2013.vcxproj.filters new file mode 100644 index 0000000..b959c9a --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_DirectXTK_2013.vcxproj.filters @@ -0,0 +1,30 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTOpt_DirectXTK_2015.vcxproj b/DXUT11/Optional/DXUTOpt_DirectXTK_2015.vcxproj new file mode 100644 index 0000000..dd8ade1 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_DirectXTK_2015.vcxproj @@ -0,0 +1,432 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_DirectXTK_2015.vcxproj.filters b/DXUT11/Optional/DXUTOpt_DirectXTK_2015.vcxproj.filters new file mode 100644 index 0000000..b959c9a --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_DirectXTK_2015.vcxproj.filters @@ -0,0 +1,30 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTOpt_DirectXTK_2015_Win10.vcxproj b/DXUT11/Optional/DXUTOpt_DirectXTK_2015_Win10.vcxproj new file mode 100644 index 0000000..5fdc8c9 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_DirectXTK_2015_Win10.vcxproj @@ -0,0 +1,433 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + 10.0.14393.0 + + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + StaticLibrary + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2015_Win10\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_3;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_DirectXTK_2015_Win10.vcxproj.filters b/DXUT11/Optional/DXUTOpt_DirectXTK_2015_Win10.vcxproj.filters new file mode 100644 index 0000000..b959c9a --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_DirectXTK_2015_Win10.vcxproj.filters @@ -0,0 +1,30 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTOpt_DirectXTK_2017.vcxproj b/DXUT11/Optional/DXUTOpt_DirectXTK_2017.vcxproj new file mode 100644 index 0000000..7f56516 --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_DirectXTK_2017.vcxproj @@ -0,0 +1,433 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + DXUTOpt + {61B333C2-C4F7-4cc1-A9BF-83F6D95588EB} + DXUTOpt + Win32Proj + 10.0.15063.0 + + + + StaticLibrary + Unicode + v141 + + + StaticLibrary + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + StaticLibrary + true + Unicode + v141 + + + + + + + + + + + + + + + + + + + + + + + + true + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUTOpt + + + true + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUTOpt + + + false + true + AllRules.ruleset + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + Bin\DirectXTK_2017\$(Platform)\$(Configuration)\ + DXUTOpt + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EditAndContinue + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + Disabled + MultiThreadedDebugDLL + false + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;_DEBUG;DEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + EnableFastChecks + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + Windows + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + StreamingSIMDExtensions2 + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX86 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + Level4 + MaxSpeed + MultiThreadedDLL + false + true + true + Fast + Sync + ..\..\DirectXTK\Inc;..\Core\;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + WIN32;NDEBUG;PROFILE;_WINDOWS;_LIB;USE_DIRECT3D11_2;USE_DIRECTXTK;_WIN32_WINNT=0x0600;%(PreprocessorDefinitions) + $(IntDir)$(TargetName).pdb + Use + DXUT.h + + + %(AdditionalOptions) + %(AdditionalDependencies) + true + Windows + true + true + true + true + true + MachineX64 + AsInvoker + %(DelayLoadDLLs) + + + false + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DXUT11/Optional/DXUTOpt_DirectXTK_2017.vcxproj.filters b/DXUT11/Optional/DXUTOpt_DirectXTK_2017.vcxproj.filters new file mode 100644 index 0000000..b959c9a --- /dev/null +++ b/DXUT11/Optional/DXUTOpt_DirectXTK_2017.vcxproj.filters @@ -0,0 +1,30 @@ + + + + +{8e114980-c1a3-4ada-ad7c-83caadf5daeb} +rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DXUT11/Optional/DXUTcamera.cpp b/DXUT11/Optional/DXUTcamera.cpp new file mode 100644 index 0000000..a8ad231 --- /dev/null +++ b/DXUT11/Optional/DXUTcamera.cpp @@ -0,0 +1,1228 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTcamera.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTcamera.h" +#include "DXUTres.h" + +using namespace DirectX; + +//====================================================================================== +// CD3DArcBall +//====================================================================================== + +//-------------------------------------------------------------------------------------- +CD3DArcBall::CD3DArcBall() +{ + Reset(); + + m_vDownPt = XMFLOAT3( 0, 0, 0 ); + m_vCurrentPt = XMFLOAT3( 0, 0, 0 ); + m_Offset.x = m_Offset.y = 0; + + RECT rc; + GetClientRect( GetForegroundWindow(), &rc ); + SetWindow( rc.right, rc.bottom ); +} + + +//-------------------------------------------------------------------------------------- +void CD3DArcBall::Reset() +{ + XMVECTOR qid = XMQuaternionIdentity(); + XMStoreFloat4( &m_qDown, qid ); + XMStoreFloat4( &m_qNow, qid ); + + XMMATRIX id = XMMatrixIdentity(); + XMStoreFloat4x4( &m_mRotation, id ); + XMStoreFloat4x4( &m_mTranslation, id ); + XMStoreFloat4x4( &m_mTranslationDelta, id ); + + m_bDrag = false; + m_fRadiusTranslation = 1.0f; + m_fRadius = 1.0f; +} + + +//-------------------------------------------------------------------------------------- +void CD3DArcBall::OnBegin( _In_ int nX, _In_ 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; + XMVECTOR v = ScreenToVector( float(nX), float(nY) ); + XMStoreFloat3( &m_vDownPt, v ); + } +} + + +//-------------------------------------------------------------------------------------- +void CD3DArcBall::OnMove( _In_ int nX, _In_ int nY ) +{ + if( m_bDrag ) + { + XMVECTOR curr = ScreenToVector( ( float )nX, ( float )nY ); + XMStoreFloat3( &m_vCurrentPt, curr ); + + XMVECTOR down = XMLoadFloat3( &m_vDownPt ); + XMVECTOR qdown = XMLoadFloat4( &m_qDown ); + + XMVECTOR result = XMQuaternionMultiply( qdown, QuatFromBallPoints( down, curr ) ); + XMStoreFloat4( &m_qNow, result ); + } +} + + +//-------------------------------------------------------------------------------------- +void CD3DArcBall::OnEnd() +{ + m_bDrag = false; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; + + XMMATRIX mTranslationDelta; + XMMATRIX mTranslation = XMLoadFloat4x4( &m_mTranslation ); + if( wParam & MK_RBUTTON ) + { + mTranslationDelta = XMMatrixTranslation( -2 * fDeltaX, 2 * fDeltaY, 0.0f ); + mTranslation = XMMatrixMultiply( mTranslation, mTranslationDelta ); + } + else // wParam & MK_MBUTTON + { + mTranslationDelta = XMMatrixTranslation( 0.0f, 0.0f, 5 * fDeltaY ); + mTranslation = XMMatrixMultiply( mTranslation, mTranslationDelta ); + } + + XMStoreFloat4x4( &m_mTranslationDelta, mTranslationDelta ); + XMStoreFloat4x4( &m_mTranslation, mTranslation ); + + // Store mouse coordinate + m_ptLastMouse.x = iMouseX; + m_ptLastMouse.y = iMouseY; + } + return TRUE; + } + + return FALSE; +} + + +//====================================================================================== +// CBaseCamera +//====================================================================================== + +//-------------------------------------------------------------------------------------- +// Constructor +//-------------------------------------------------------------------------------------- +CBaseCamera::CBaseCamera() : + m_cKeysDown(0), + m_nCurrentButtonMask(0), + m_nMouseWheelDelta(0), + m_fFramesToSmoothMouseData(2.0f), + m_fCameraYawAngle(0.0f), + m_fCameraPitchAngle(0.0f), + m_fDragTimer(0.0f), + m_fTotalDragTimeToZero(0.25), + m_fRotationScaler(0.01f), + m_fMoveScaler(5.0f), + m_bMouseLButtonDown(false), + m_bMouseMButtonDown(false), + m_bMouseRButtonDown(false), + m_bMovementDrag(false), + m_bInvertPitch(false), + m_bEnablePositionMovement(true), + m_bEnableYAxisMovement(true), + m_bClipToBoundary(false), + m_bResetCursorAfterMove(false) +{ + ZeroMemory( m_aKeys, sizeof( BYTE ) * CAM_MAX_KEYS ); + ZeroMemory( m_GamePad, sizeof( DXUT_GAMEPAD ) * DXUT_MAX_CONTROLLERS ); + + // Setup the view matrix + SetViewParams( g_XMZero, g_XMIdentityR2 ); + + // Setup the projection matrix + SetProjParams( XM_PI / 4, 1.0f, 1.0f, 1000.0f ); + + GetCursorPos( &m_ptLastMousePosition ); + + SetRect( &m_rcDrag, LONG_MIN, LONG_MIN, LONG_MAX, LONG_MAX ); + m_vVelocity = XMFLOAT3( 0, 0, 0 ); + m_vVelocityDrag = XMFLOAT3( 0, 0, 0 ); + m_vRotVelocity = XMFLOAT2( 0, 0 ); + + m_vMouseDelta = XMFLOAT2( 0, 0 ); + + m_vMinBoundary = XMFLOAT3( -1, -1, -1 ); + m_vMaxBoundary = XMFLOAT3( 1, 1, 1 ); +} + + +//-------------------------------------------------------------------------------------- +// Client can call this to change the position and direction of camera +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CBaseCamera::SetViewParams( FXMVECTOR vEyePt, FXMVECTOR vLookatPt ) +{ + XMStoreFloat3( &m_vEye, vEyePt ); + XMStoreFloat3( &m_vDefaultEye, vEyePt ); + + XMStoreFloat3( &m_vLookAt, vLookatPt ); + XMStoreFloat3( &m_vDefaultLookAt , vLookatPt ); + + // Calc the view matrix + XMMATRIX mView = XMMatrixLookAtLH( vEyePt, vLookatPt, g_XMIdentityR1 ); + XMStoreFloat4x4( &m_mView, mView ); + + XMMATRIX mInvView = XMMatrixInverse( nullptr, 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 + XMFLOAT3 zBasis; + XMStoreFloat3( &zBasis, mInvView.r[2] ); + + m_fCameraYawAngle = atan2f( zBasis.x, zBasis.z ); + float fLen = sqrtf( zBasis.z * zBasis.z + zBasis.x * zBasis.x ); + m_fCameraPitchAngle = -atan2f( zBasis.y, fLen ); +} + + +//-------------------------------------------------------------------------------------- +// Calculates the projection matrix based on input params +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; + + XMMATRIX mProj = XMMatrixPerspectiveFovLH( fFOV, fAspect, fNearPlane, fFarPlane ); + XMStoreFloat4x4( &m_mProj, mProj ); +} + + +//-------------------------------------------------------------------------------------- +// Call this from your message proc so this class can handle window messages +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 ) + { + _Analysis_assume_( mappedKey < CAM_MAX_KEYS ); + 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 +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CBaseCamera::GetInput( bool bGetKeyboardInput, bool bGetMouseInput, bool bGetGamepadInput ) +{ + m_vKeyboardDirection = XMFLOAT3( 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 = XMFLOAT3( 0, 0, 0 ); + m_vGamePadRightThumb = XMFLOAT3( 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].sThumbLY || + 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() +{ + // Get current position of mouse + POINT ptCurMousePos; + GetCursorPos( &ptCurMousePos ); + + // Calc how far it's moved since last frame + POINT ptCurMouseDelta; + 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.x = m_vMouseDelta.x * m_fRotationScaler; + m_vRotVelocity.y = m_vMouseDelta.y * m_fRotationScaler; +} + + +//-------------------------------------------------------------------------------------- +// Figure out the velocity based on keyboard input & drag if any +//-------------------------------------------------------------------------------------- +void CBaseCamera::UpdateVelocity( _In_ float fElapsedTime ) +{ + XMVECTOR vGamePadRightThumb = XMVectorSet( m_vGamePadRightThumb.x, -m_vGamePadRightThumb.z, 0, 0 ); + + XMVECTOR vMouseDelta = XMLoadFloat2( &m_vMouseDelta ); + XMVECTOR vRotVelocity = vMouseDelta * m_fRotationScaler + vGamePadRightThumb * 0.02f; + + XMStoreFloat2( &m_vRotVelocity, vRotVelocity ); + + XMVECTOR vKeyboardDirection = XMLoadFloat3( &m_vKeyboardDirection ); + XMVECTOR vGamePadLeftThumb = XMLoadFloat3( &m_vGamePadLeftThumb ); + XMVECTOR vAccel = vKeyboardDirection + vGamePadLeftThumb; + + // Normalize vector so if moving 2 dirs (left & forward), + // the camera doesn't move faster than if moving in 1 dir + vAccel = XMVector3Normalize( vAccel ); + + // Scale the acceleration vector + vAccel *= m_fMoveScaler; + + if( m_bMovementDrag ) + { + // Is there any acceleration this frame? + if( XMVectorGetX( XMVector3LengthSq( 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 + XMStoreFloat3( &m_vVelocity, vAccel ); + + m_fDragTimer = m_fTotalDragTimeToZero; + + XMStoreFloat3( &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 + XMVECTOR vVelocity = XMLoadFloat3( &m_vVelocity ); + XMVECTOR vVelocityDrag = XMLoadFloat3( &m_vVelocityDrag ); + + vVelocity -= vVelocityDrag * fElapsedTime; + + XMStoreFloat3( &m_vVelocity, vVelocity ); + + m_fDragTimer -= fElapsedTime; + } + else + { + // Zero velocity + m_vVelocity = XMFLOAT3( 0, 0, 0 ); + } + } + } + else + { + // No drag, so immediately change the velocity + XMStoreFloat3( &m_vVelocity, vAccel ); + } +} + + +//-------------------------------------------------------------------------------------- +// Maps a windows virtual key to an enum +//-------------------------------------------------------------------------------------- +D3DUtil_CameraKeys CBaseCamera::MapKey( _In_ 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() +{ + XMVECTOR vDefaultEye = XMLoadFloat3( &m_vDefaultEye ); + XMVECTOR vDefaultLookAt = XMLoadFloat3( &m_vDefaultLookAt ); + + SetViewParams( vDefaultEye, vDefaultLookAt ); +} + + +//====================================================================================== +// CFirstPersonCamera +//====================================================================================== + +CFirstPersonCamera::CFirstPersonCamera() : + m_nActiveButtonMask( 0x07 ), + m_bRotateWithoutButtonDown(false) +{ +} + + +//-------------------------------------------------------------------------------------- +// Update the view matrix based on user input & elapsed time +//-------------------------------------------------------------------------------------- +void CFirstPersonCamera::FrameMove( _In_ 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 ); + + //// 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 + XMVECTOR vVelocity = XMLoadFloat3( &m_vVelocity ); + XMVECTOR vPosDelta = 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 = std::max( -XM_PI / 2.0f, m_fCameraPitchAngle ); + m_fCameraPitchAngle = std::min( +XM_PI / 2.0f, m_fCameraPitchAngle ); + } + + // Make a rotation matrix based on the camera's yaw & pitch + XMMATRIX mCameraRot = XMMatrixRotationRollPitchYaw( m_fCameraPitchAngle, m_fCameraYawAngle, 0 ); + + // Transform vectors based on camera's rotation matrix + XMVECTOR vWorldUp = XMVector3TransformCoord( g_XMIdentityR1, mCameraRot ); + XMVECTOR vWorldAhead = XMVector3TransformCoord( g_XMIdentityR2, mCameraRot ); + + // Transform the position delta by the camera's rotation + if( !m_bEnableYAxisMovement ) + { + // If restricting Y movement, do not include pitch + // when transforming position delta vector. + mCameraRot = XMMatrixRotationRollPitchYaw( 0.0f, m_fCameraYawAngle, 0.0f ); + } + XMVECTOR vPosDeltaWorld = XMVector3TransformCoord( vPosDelta, mCameraRot ); + + // Move the eye position + XMVECTOR vEye = XMLoadFloat3( &m_vEye ); + vEye += vPosDeltaWorld; + if( m_bClipToBoundary ) + vEye = ConstrainToBoundary( vEye ); + XMStoreFloat3( &m_vEye, vEye ); + + // Update the lookAt position based on the eye position + XMVECTOR vLookAt = vEye + vWorldAhead; + XMStoreFloat3( &m_vLookAt, vLookAt ); + + // Update the view matrix + XMMATRIX mView = XMMatrixLookAtLH( vEye, vLookAt, vWorldUp ); + XMStoreFloat4x4( &m_mView, mView ); + + XMMATRIX mCameraWorld = XMMatrixInverse( nullptr, mView ); + XMStoreFloat4x4( &m_mCameraWorld, mCameraWorld ); +} + + +//-------------------------------------------------------------------------------------- +// Enable or disable each of the mouse buttons for rotation drag. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; +} + + + +//====================================================================================== +// CModelViewerCamera +//====================================================================================== + +CModelViewerCamera::CModelViewerCamera() : + m_nRotateModelButtonMask(MOUSE_LEFT_BUTTON), + m_nZoomButtonMask(MOUSE_WHEEL), + m_nRotateCameraButtonMask(MOUSE_RIGHT_BUTTON), + m_bAttachCameraToModel(false), + m_bLimitPitch(false), + m_bDragSinceLastUpdate(true), + m_fRadius(5.0f), + m_fDefaultRadius(5.0f), + m_fMinRadius(1.0f), + m_fMaxRadius(FLT_MAX) +{ + XMMATRIX id = XMMatrixIdentity(); + + XMStoreFloat4x4( &m_mWorld, id ); + XMStoreFloat4x4( &m_mModelRot, id ); + XMStoreFloat4x4( &m_mModelLastRot, id ); + XMStoreFloat4x4( &m_mCameraRotLast, id ); + m_vModelCenter = XMFLOAT3( 0, 0, 0 ); + + m_bEnablePositionMovement = false; +} + + +//-------------------------------------------------------------------------------------- +// Update the view matrix & the model's world matrix based +// on user input & elapsed time +//-------------------------------------------------------------------------------------- +void CModelViewerCamera::FrameMove( _In_ float fElapsedTime ) +{ + if( IsKeyDown( m_aKeys[CAM_RESET] ) ) + Reset(); + + // If no dragged has happend since last time FrameMove is called, + // and no camera key is held down, then no need to handle again. + if( !m_bDragSinceLastUpdate && 0 == m_cKeysDown ) + return; + + 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 ); + + // Get amount of velocity based on the keyboard input and drag (if any) + UpdateVelocity( fElapsedTime ); + + // Simple euler method to calculate position delta + XMVECTOR vPosDelta = XMLoadFloat3( &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 = std::min( m_fMaxRadius, m_fRadius ); + m_fRadius = std::max( m_fMinRadius, m_fRadius ); + m_nMouseWheelDelta = 0; + + // Get the inverse of the arcball's rotation matrix + XMMATRIX mCameraRot = XMMatrixInverse( nullptr, m_ViewArcBall.GetRotationMatrix() ); + + // Transform vectors based on camera's rotation matrix + XMVECTOR vWorldUp = XMVector3TransformCoord( g_XMIdentityR1, mCameraRot ); + XMVECTOR vWorldAhead = XMVector3TransformCoord( g_XMIdentityR2, mCameraRot ); + + // Transform the position delta by the camera's rotation + XMVECTOR vPosDeltaWorld = XMVector3TransformCoord( vPosDelta, mCameraRot ); + + // Move the lookAt position + XMVECTOR vLookAt = XMLoadFloat3( &m_vLookAt ); + vLookAt += vPosDeltaWorld; + if( m_bClipToBoundary ) + vLookAt = ConstrainToBoundary( vLookAt ); + XMStoreFloat3( &m_vLookAt, vLookAt ); + + // Update the eye point based on a radius away from the lookAt position + XMVECTOR vEye = vLookAt - vWorldAhead * m_fRadius; + XMStoreFloat3( &m_vEye, vEye ); + + // Update the view matrix + XMMATRIX mView = XMMatrixLookAtLH( vEye, vLookAt, vWorldUp ); + XMStoreFloat4x4( &m_mView, mView ); + + XMMATRIX mInvView = XMMatrixInverse( nullptr, mView ); + mInvView.r[3] = XMVectorSelect( mInvView.r[3], g_XMZero, g_XMSelect1110 ); + + XMMATRIX mModelLastRot = XMLoadFloat4x4( &m_mModelLastRot ); + XMMATRIX mModelLastRotInv = XMMatrixInverse( nullptr, 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. + XMMATRIX mModelRot0 = m_WorldArcBall.GetRotationMatrix(); + XMMATRIX mModelRot = XMLoadFloat4x4( &m_mModelRot ); + mModelRot *= mView * mModelLastRotInv * mModelRot0 * mInvView; + + if( m_ViewArcBall.IsBeingDragged() && m_bAttachCameraToModel && !IsKeyDown( m_aKeys[CAM_CONTROLDOWN] ) ) + { + // Attach camera to model by inverse of the model rotation + XMMATRIX mCameraRotLast = XMLoadFloat4x4( &m_mCameraRotLast ); + XMMATRIX mCameraLastRotInv = XMMatrixInverse( nullptr, mCameraRotLast ); + XMMATRIX mCameraRotDelta = mCameraLastRotInv * mCameraRot; // local to world matrix + mModelRot *= mCameraRotDelta; + } + + XMStoreFloat4x4( &m_mModelLastRot, mModelRot0 ); + XMStoreFloat4x4( &m_mCameraRotLast, mCameraRot ); + + // Since we're accumulating delta rotations, we need to orthonormalize + // the matrix to prevent eventual matrix skew + XMVECTOR xBasis = XMVector3Normalize( mModelRot.r[0] ); + XMVECTOR yBasis = XMVector3Cross( mModelRot.r[2], xBasis ); + yBasis = XMVector3Normalize( yBasis ); + XMVECTOR zBasis = XMVector3Cross( xBasis, yBasis ); + + mModelRot.r[0] = XMVectorSelect( mModelRot.r[0], xBasis, g_XMSelect1110 ); + mModelRot.r[1] = XMVectorSelect( mModelRot.r[1], yBasis, g_XMSelect1110 ); + mModelRot.r[2] = XMVectorSelect( mModelRot.r[2], zBasis, g_XMSelect1110 ); + + // Translate the rotation matrix to the same position as the lookAt position + mModelRot.r[3] = XMVectorSelect( mModelRot.r[3], vLookAt, g_XMSelect1110 ); + + XMStoreFloat4x4( &m_mModelRot, mModelRot ); + + // Translate world matrix so its at the center of the model + XMMATRIX mTrans = XMMatrixTranslation( -m_vModelCenter.x, -m_vModelCenter.y, -m_vModelCenter.z ); + XMMATRIX mWorld = mTrans * mModelRot; + XMStoreFloat4x4( &m_mWorld, mWorld ); +} + + +//-------------------------------------------------------------------------------------- +void CModelViewerCamera::SetDragRect( _In_ const 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(); + + XMMATRIX id = XMMatrixIdentity(); + XMStoreFloat4x4( &m_mWorld, id ); + XMStoreFloat4x4( &m_mModelRot, id ); + XMStoreFloat4x4( &m_mModelLastRot, id ); + XMStoreFloat4x4( &m_mCameraRotLast, id ); + + m_fRadius = m_fDefaultRadius; + m_WorldArcBall.Reset(); + m_ViewArcBall.Reset(); +} + + +//-------------------------------------------------------------------------------------- +// Override for setting the view parameters +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CModelViewerCamera::SetViewParams( FXMVECTOR vEyePt, FXMVECTOR vLookatPt ) +{ + CBaseCamera::SetViewParams( vEyePt, vLookatPt ); + + // Propogate changes to the member arcball + XMMATRIX mRotation = XMMatrixLookAtLH( vEyePt, vLookatPt, g_XMIdentityR1 ); + XMVECTOR quat = XMQuaternionRotationMatrix( mRotation ); + m_ViewArcBall.SetQuatNow( quat ); + + // Set the radius according to the distance + XMVECTOR vEyeToPoint = XMVectorSubtract( vLookatPt, vEyePt ); + float len = XMVectorGetX( XMVector3Length( vEyeToPoint ) ); + SetRadius( len ); + + // View information changed. FrameMove should be called. + m_bDragSinceLastUpdate = true; +} + + +//-------------------------------------------------------------------------------------- +// Call this from your message proc so this class can handle window messages +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; +} + + +//====================================================================================== +// CDXUTDirectionWidget +//====================================================================================== + +CDXUTDirectionWidget::CDXUTDirectionWidget() : + m_fRadius(1.0f), + m_nRotateMask(MOUSE_RIGHT_BUTTON) +{ + m_vDefaultDir = XMFLOAT3( 0, 1, 0 ); + m_vCurrentDir = m_vDefaultDir; + + XMMATRIX id = XMMatrixIdentity(); + + XMStoreFloat4x4( &m_mView, id ); + XMStoreFloat4x4( &m_mRot, id ); + XMStoreFloat4x4( &m_mRotSnapshot, id ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +LRESULT CDXUTDirectionWidget::HandleMessages( HWND hWnd, UINT uMsg, + WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(wParam); + + 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::UpdateLightDir() +{ + XMMATRIX mView = XMLoadFloat4x4( &m_mView ); + + XMMATRIX mInvView = XMMatrixInverse( nullptr, mView ); + mInvView.r[3] = XMVectorSelect( mInvView.r[3], g_XMZero, g_XMSelect1110 ); + + XMMATRIX mRotSnapshot = XMLoadFloat4x4( &m_mRotSnapshot ); + XMMATRIX mLastRotInv = XMMatrixInverse( nullptr, mRotSnapshot ); + + XMMATRIX mRot0 = m_ArcBall.GetRotationMatrix(); + XMStoreFloat4x4( &m_mRotSnapshot, mRot0 ); + + // 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. + XMMATRIX mRot = XMLoadFloat4x4( &m_mRot ); + mRot *= mView * mLastRotInv * mRot0 * mInvView; + + // Since we're accumulating delta rotations, we need to orthonormalize + // the matrix to prevent eventual matrix skew + XMVECTOR xBasis = XMVector3Normalize( mRot.r[0] ); + XMVECTOR yBasis = XMVector3Cross( mRot.r[2], xBasis ); + yBasis = XMVector3Normalize( yBasis ); + XMVECTOR zBasis = XMVector3Cross( xBasis, yBasis ); + mRot.r[0] = XMVectorSelect( mRot.r[0], xBasis, g_XMSelect1110 ); + mRot.r[1] = XMVectorSelect( mRot.r[1], yBasis, g_XMSelect1110 ); + mRot.r[2] = XMVectorSelect( mRot.r[2], zBasis, g_XMSelect1110 ); + XMStoreFloat4x4( &m_mRot, mRot ); + + // Transform the default direction vector by the light's rotation matrix + XMVECTOR vDefaultDir = XMLoadFloat3( &m_vDefaultDir ); + XMVECTOR vCurrentDir = XMVector3TransformNormal( vDefaultDir, mRot ); + XMStoreFloat3( &m_vCurrentDir, vCurrentDir ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDirectionWidget::OnRender( FXMVECTOR color, CXMMATRIX mView, CXMMATRIX mProj, FXMVECTOR vEyePt ) +{ + UNREFERENCED_PARAMETER(color); + UNREFERENCED_PARAMETER(mView); + UNREFERENCED_PARAMETER(mProj); + UNREFERENCED_PARAMETER(vEyePt); + // TODO - + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDirectionWidget::StaticOnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext ) +{ + UNREFERENCED_PARAMETER(pd3dDevice); + UNREFERENCED_PARAMETER(pd3dImmediateContext); + // TODO - + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDirectionWidget::StaticOnD3D11DestroyDevice() +{ + // TODO - +} diff --git a/DXUT11/Optional/DXUTcamera.h b/DXUT11/Optional/DXUTcamera.h new file mode 100644 index 0000000..047760d --- /dev/null +++ b/DXUT11/Optional/DXUTcamera.h @@ -0,0 +1,426 @@ +//-------------------------------------------------------------------------------------- +// File: Camera.h +// +// Helper functions for Direct3D programming. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +//-------------------------------------------------------------------------------------- +class CD3DArcBall +{ +public: + CD3DArcBall(); + + // Functions to change behavior + void Reset(); + void SetTranslationRadius( _In_ float fRadiusTranslation ) + { + m_fRadiusTranslation = fRadiusTranslation; + } + void SetWindow( _In_ INT nWidth, _In_ INT nHeight, _In_ float fRadius = 0.9f ) + { + m_nWidth = nWidth; + m_nHeight = nHeight; + m_fRadius = fRadius; + m_vCenter.x = float(m_nWidth) / 2.0f; + m_vCenter.y = float(m_nHeight) / 2.0f; + } + void SetOffset( _In_ INT nX, _In_ INT nY ) { m_Offset.x = nX; m_Offset.y = nY; } + + // Call these from client and use GetRotationMatrix() to read new rotation matrix + void OnBegin( _In_ int nX, _In_ int nY ); // start the rotation (pass current mouse position) + void OnMove( _In_ int nX, _In_ 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( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); + + // Functions to get/set state + DirectX::XMMATRIX GetRotationMatrix() const + { + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( &m_qNow ); + return DirectX::XMMatrixRotationQuaternion( q ); + } + DirectX::XMMATRIX GetTranslationMatrix() const { return DirectX::XMLoadFloat4x4( &m_mTranslation ); } + DirectX::XMMATRIX GetTranslationDeltaMatrix() const { return DirectX::XMLoadFloat4x4( &m_mTranslationDelta ); } + bool IsBeingDragged() const { return m_bDrag; } + DirectX::XMVECTOR GetQuatNow() const { return DirectX::XMLoadFloat4( &m_qNow ); } + void SetQuatNow( _In_ DirectX::FXMVECTOR& q ) { DirectX::XMStoreFloat4( &m_qNow, q ); } + + static DirectX::XMVECTOR QuatFromBallPoints( _In_ DirectX::FXMVECTOR vFrom, _In_ DirectX::FXMVECTOR vTo ) + { + using namespace DirectX; + + XMVECTOR dot = XMVector3Dot( vFrom, vTo ); + XMVECTOR vPart = XMVector3Cross( vFrom, vTo ); + return XMVectorSelect( dot, vPart, g_XMSelect1110 ); + } + +protected: + DirectX::XMFLOAT4X4 m_mRotation; // Matrix for arc ball's orientation + DirectX::XMFLOAT4X4 m_mTranslation; // Matrix for arc ball's position + DirectX::XMFLOAT4X4 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 + DirectX::XMFLOAT2 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 + + DirectX::XMFLOAT4 m_qDown; // Quaternion before button down + DirectX::XMFLOAT4 m_qNow; // Composite quaternion for current drag + bool m_bDrag; // Whether user is dragging arc ball + + POINT m_ptLastMouse; // position of last mouse point + DirectX::XMFLOAT3 m_vDownPt; // starting point of rotation arc + DirectX::XMFLOAT3 m_vCurrentPt; // current point of rotation arc + + DirectX::XMVECTOR ScreenToVector( _In_ float fScreenPtX, _In_ 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 DirectX::XMVectorSet( x, y, z, 0 ); + } +}; + + +//-------------------------------------------------------------------------------------- +// 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( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); + virtual void FrameMove( _In_ float fElapsedTime ) = 0; + + // Functions to change camera matrices + virtual void Reset(); + virtual void SetViewParams( _In_ DirectX::FXMVECTOR vEyePt, _In_ DirectX::FXMVECTOR vLookatPt ); + virtual void SetProjParams( _In_ float fFOV, _In_ float fAspect, _In_ float fNearPlane, _In_ float fFarPlane ); + + // Functions to change behavior + virtual void SetDragRect( _In_ const RECT& rc ) { m_rcDrag = rc; } + void SetInvertPitch( _In_ bool bInvertPitch ) { m_bInvertPitch = bInvertPitch; } + void SetDrag( _In_ bool bMovementDrag, _In_ float fTotalDragTimeToZero = 0.25f ) + { + m_bMovementDrag = bMovementDrag; + m_fTotalDragTimeToZero = fTotalDragTimeToZero; + } + void SetEnableYAxisMovement( _In_ bool bEnableYAxisMovement ) { m_bEnableYAxisMovement = bEnableYAxisMovement; } + void SetEnablePositionMovement( _In_ bool bEnablePositionMovement ) { m_bEnablePositionMovement = bEnablePositionMovement; } + void SetClipToBoundary( _In_ bool bClipToBoundary, _In_opt_ DirectX::XMFLOAT3* pvMinBoundary, _In_opt_ DirectX::XMFLOAT3* pvMaxBoundary ) + { + m_bClipToBoundary = bClipToBoundary; + if( pvMinBoundary ) m_vMinBoundary = *pvMinBoundary; + if( pvMaxBoundary ) m_vMaxBoundary = *pvMaxBoundary; + } + void SetScalers( _In_ float fRotationScaler = 0.01f, _In_ float fMoveScaler = 5.0f ) + { + m_fRotationScaler = fRotationScaler; + m_fMoveScaler = fMoveScaler; + } + void SetNumberOfFramesToSmoothMouseData( _In_ int nFrames ) { if( nFrames > 0 ) m_fFramesToSmoothMouseData = ( float )nFrames; } + void SetResetCursorAfterMove( _In_ bool bResetCursorAfterMove ) { m_bResetCursorAfterMove = bResetCursorAfterMove; } + + // Functions to get state + DirectX::XMMATRIX GetViewMatrix() const { return DirectX::XMLoadFloat4x4( &m_mView ); } + DirectX::XMMATRIX GetProjMatrix() const { return DirectX::XMLoadFloat4x4( &m_mProj ); } + DirectX::XMVECTOR GetEyePt() const { return DirectX::XMLoadFloat3( &m_vEye ); } + DirectX::XMVECTOR GetLookAtPt() const { return DirectX::XMLoadFloat3( &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 sMouseRButtonDown() const { return m_bMouseRButtonDown; } + +protected: + // Functions to map a WM_KEYDOWN key to a D3DUtil_CameraKeys enum + virtual D3DUtil_CameraKeys MapKey( _In_ UINT nKey ); + + bool IsKeyDown( _In_ BYTE key ) const { return( ( key & KEY_IS_DOWN_MASK ) == KEY_IS_DOWN_MASK ); } + bool WasKeyDown( _In_ BYTE key ) const { return( ( key & KEY_WAS_DOWN_MASK ) == KEY_WAS_DOWN_MASK ); } + + DirectX::XMVECTOR ConstrainToBoundary( _In_ DirectX::FXMVECTOR v ) + { + using namespace DirectX; + + XMVECTOR vMin = XMLoadFloat3( &m_vMinBoundary ); + XMVECTOR vMax = XMLoadFloat3( &m_vMaxBoundary ); + + // Constrain vector to a bounding box + return XMVectorClamp( v, vMin, vMax ); + } + + void UpdateMouseDelta(); + void UpdateVelocity( _In_ float fElapsedTime ); + void GetInput( _In_ bool bGetKeyboardInput, _In_ bool bGetMouseInput, _In_ bool bGetGamepadInput ); + + DirectX::XMFLOAT4X4 m_mView; // View matrix + DirectX::XMFLOAT4X4 m_mProj; // Projection matrix + + DXUT_GAMEPAD m_GamePad[DXUT_MAX_CONTROLLERS]; // XInput controller state + DirectX::XMFLOAT3 m_vGamePadLeftThumb; + DirectX::XMFLOAT3 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 + DirectX::XMFLOAT3 m_vKeyboardDirection; // Direction vector of keyboard input + POINT m_ptLastMousePosition; // Last absolute position of mouse cursor + int m_nCurrentButtonMask; // mask of which buttons are down + int m_nMouseWheelDelta; // Amount of middle wheel scroll (+/-) + DirectX::XMFLOAT2 m_vMouseDelta; // Mouse relative delta smoothed over a few frames + float m_fFramesToSmoothMouseData; // Number of frames to smooth mouse data over + DirectX::XMFLOAT3 m_vDefaultEye; // Default camera eye position + DirectX::XMFLOAT3 m_vDefaultLookAt; // Default LookAt position + DirectX::XMFLOAT3 m_vEye; // Camera eye position + DirectX::XMFLOAT3 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. + DirectX::XMFLOAT3 m_vVelocity; // Velocity of camera + DirectX::XMFLOAT3 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 + DirectX::XMFLOAT2 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_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 + bool m_bMovementDrag; // If true, then camera movement will slow to a stop otherwise movement is instant + 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 + bool m_bResetCursorAfterMove; // If true, the class will reset the cursor position so that the cursor always has space to move + + DirectX::XMFLOAT3 m_vMinBoundary; // Min point in clip boundary + DirectX::XMFLOAT3 m_vMaxBoundary; // Max point in clip boundary +}; + + +//-------------------------------------------------------------------------------------- +// 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( _In_ float fElapsedTime ) override; + + // Functions to change behavior + void SetRotateButtons( _In_ bool bLeft, _In_ bool bMiddle, _In_ bool bRight, _In_ bool bRotateWithoutButtonDown = false ); + + // Functions to get state + DirectX::XMMATRIX GetWorldMatrix() const { return DirectX::XMLoadFloat4x4( &m_mCameraWorld ); } + + DirectX::XMVECTOR GetWorldRight() const { return DirectX::XMLoadFloat3( reinterpret_cast( &m_mCameraWorld._11 ) ); } + DirectX::XMVECTOR GetWorldUp() const { return DirectX::XMLoadFloat3( reinterpret_cast( &m_mCameraWorld._21 ) ); } + DirectX::XMVECTOR GetWorldAhead() const { return DirectX::XMLoadFloat3( reinterpret_cast( &m_mCameraWorld._31 ) ); } + DirectX::XMVECTOR GetEyePt() const { return DirectX::XMLoadFloat3( reinterpret_cast( &m_mCameraWorld._41 ) ); } + +protected: + DirectX::XMFLOAT4X4 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( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual void FrameMove( _In_ float fElapsedTime ) override; + + // Functions to change behavior + virtual void SetDragRect( _In_ const RECT& rc ) override; + virtual void Reset() override; + virtual void SetViewParams( _In_ DirectX::FXMVECTOR pvEyePt, _In_ DirectX::FXMVECTOR pvLookatPt ) override; + void SetButtonMasks( _In_ int nRotateModelButtonMask = MOUSE_LEFT_BUTTON, _In_ int nZoomButtonMask = MOUSE_WHEEL, + _In_ int nRotateCameraButtonMask = MOUSE_RIGHT_BUTTON ) + { + m_nRotateModelButtonMask = nRotateModelButtonMask, m_nZoomButtonMask = nZoomButtonMask; + m_nRotateCameraButtonMask = nRotateCameraButtonMask; + } + void SetAttachCameraToModel( _In_ bool bEnable = false ) { m_bAttachCameraToModel = bEnable; } + void SetWindow( _In_ int nWidth, _In_ int nHeight, _In_ float fArcballRadius=0.9f ) + { + m_WorldArcBall.SetWindow( nWidth, nHeight, fArcballRadius ); + m_ViewArcBall.SetWindow( nWidth, nHeight, fArcballRadius ); + } + void SetRadius( _In_ float fDefaultRadius=5.0f, _In_ float fMinRadius=1.0f, _In_ float fMaxRadius=FLT_MAX ) + { + m_fDefaultRadius = m_fRadius = fDefaultRadius; m_fMinRadius = fMinRadius; m_fMaxRadius = fMaxRadius; + m_bDragSinceLastUpdate = true; + } + void SetModelCenter( _In_ const DirectX::XMFLOAT3& vModelCenter ) { m_vModelCenter = vModelCenter; } + void SetLimitPitch( _In_ bool bLimitPitch ) { m_bLimitPitch = bLimitPitch; } + void SetViewQuat( _In_ DirectX::FXMVECTOR q ) + { + m_ViewArcBall.SetQuatNow( q ); + m_bDragSinceLastUpdate = true; + } + void SetWorldQuat( _In_ DirectX::FXMVECTOR q ) + { + m_WorldArcBall.SetQuatNow( q ); + m_bDragSinceLastUpdate = true; + } + + // Functions to get state + DirectX::XMMATRIX GetWorldMatrix() const { return DirectX::XMLoadFloat4x4( &m_mWorld ); } + void SetWorldMatrix( _In_ DirectX::CXMMATRIX mWorld ) + { + XMStoreFloat4x4( &m_mWorld, mWorld ); + m_bDragSinceLastUpdate = true; + } + +protected: + CD3DArcBall m_WorldArcBall; + CD3DArcBall m_ViewArcBall; + DirectX::XMFLOAT3 m_vModelCenter; + DirectX::XMFLOAT4X4 m_mModelLastRot; // Last arcball rotation matrix for model + DirectX::XMFLOAT4X4 m_mModelRot; // Rotation matrix of model + DirectX::XMFLOAT4X4 m_mWorld; // World matrix of model + + int m_nRotateModelButtonMask; + int m_nZoomButtonMask; + int m_nRotateCameraButtonMask; + + bool m_bAttachCameraToModel; + bool m_bLimitPitch; + bool m_bDragSinceLastUpdate; // True if mouse drag has happened since last time FrameMove is called. + 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 + + DirectX::XMFLOAT4X4 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(); + + LRESULT HandleMessages( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); + + HRESULT OnRender( _In_ DirectX::FXMVECTOR color, _In_ DirectX::CXMMATRIX pmView, _In_ DirectX::CXMMATRIX pmProj, _In_ DirectX::FXMVECTOR vEyePt ); + + DirectX::XMVECTOR GetLightDirection() const { return DirectX::XMLoadFloat3( &m_vCurrentDir ); } + void SetLightDirection( _In_ DirectX::FXMVECTOR vDir ) + { + DirectX::XMStoreFloat3( &m_vCurrentDir, vDir ); + m_vDefaultDir = m_vCurrentDir; + } + void SetLightDirection( _In_ DirectX::XMFLOAT3 vDir ) + { + m_vDefaultDir = m_vCurrentDir = vDir; + } + void SetButtonMask( _In_ int nRotate = MOUSE_RIGHT_BUTTON ) { m_nRotateMask = nRotate; } + + float GetRadius() const { return m_fRadius; } + void SetRadius( _In_ float fRadius ) { m_fRadius = fRadius; } + + bool IsBeingDragged() { return m_ArcBall.IsBeingDragged(); } + + static HRESULT WINAPI StaticOnD3D11CreateDevice( _In_ ID3D11Device* pd3dDevice, _In_ ID3D11DeviceContext* pd3dImmediateContext ); + static void WINAPI StaticOnD3D11DestroyDevice(); + +protected: + HRESULT UpdateLightDir(); + + // TODO - need support for Direct3D 11 widget + + DirectX::XMFLOAT4X4 m_mRot; + DirectX::XMFLOAT4X4 m_mRotSnapshot; + float m_fRadius; + int m_nRotateMask; + CD3DArcBall m_ArcBall; + DirectX::XMFLOAT3 m_vDefaultDir; + DirectX::XMFLOAT3 m_vCurrentDir; + DirectX::XMFLOAT4X4 m_mView; +}; diff --git a/DXUT11/Optional/DXUTgui.cpp b/DXUT11/Optional/DXUTgui.cpp new file mode 100644 index 0000000..cd5d143 --- /dev/null +++ b/DXUT11/Optional/DXUTgui.cpp @@ -0,0 +1,6676 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTgui.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTgui.h" +#include "DXUTsettingsDlg.h" +#include "DXUTres.h" + +#include "SDKMisc.h" + +#include "DDSTextureLoader.h" + +using namespace DirectX; + +#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 + +inline XMFLOAT4 D3DCOLOR_TO_D3DCOLORVALUE( DWORD c ) +{ + return XMFLOAT4 ( ( ( c >> 16 ) & 0xFF ) / 255.0f, + ( ( c >> 8 ) & 0xFF ) / 255.0f, + ( c & 0xFF ) / 255.0f, + ( ( c >> 24 ) & 0xFF ) / 255.0f ); +} + +#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 nul 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 nul terminator. +#define DXUT_MAX_EDITBOXLENGTH 0xFFFF + + +double CDXUTDialog::s_fTimeRefresh = 0.0f; +CDXUTControl* CDXUTDialog::s_pControlFocus = nullptr; // The control which has focus +CDXUTControl* CDXUTDialog::s_pControlPressed = nullptr; // The control currently pressed + + +struct DXUT_SCREEN_VERTEX +{ + float x, y, z, h; + DWORD color; + float tu, tv; +}; + +struct DXUT_SCREEN_VERTEX_UNTEX +{ + float x, y, z, h; + DWORD color; +}; + +struct DXUT_SCREEN_VERTEX_10 +{ + float x, y, z; + XMFLOAT4 color; + float tu, tv; +}; + + +inline int RectWidth( RECT& rc ) +{ + return ( ( rc ).right - ( rc ).left ); +} +inline int RectHeight( RECT& rc ) +{ + return ( ( rc ).bottom - ( rc ).top ); +} + + +//====================================================================================== +// Font11 +//====================================================================================== + +ID3D11Buffer* g_pFontBuffer11 = nullptr; +UINT g_FontBufferBytes11 = 0; +std::vector g_FontVertices; +ID3D11ShaderResourceView* g_pFont11 = nullptr; +ID3D11InputLayout* g_pInputLayout11 = nullptr; + +//-------------------------------------------------------------------------------------- +HRESULT InitFont11( _In_ ID3D11Device* pd3d11Device, _In_ ID3D11InputLayout* pInputLayout ) +{ + HRESULT hr = S_OK; + WCHAR str[MAX_PATH]; + V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"UI\\Font.dds" ) ); + + V_RETURN( CreateDDSTextureFromFile( pd3d11Device, str, nullptr, &g_pFont11 ) ); + + g_pInputLayout11 = pInputLayout; + return hr; +} + + +//-------------------------------------------------------------------------------------- +void EndFont11() +{ + SAFE_RELEASE( g_pFontBuffer11 ); + g_FontBufferBytes11 = 0; + SAFE_RELEASE( g_pFont11 ); +} + + +//-------------------------------------------------------------------------------------- +void BeginText11() +{ + g_FontVertices.clear(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void DrawText11DXUT( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext, + LPCWSTR strText, const RECT& rcScreen, XMFLOAT4 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 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 = XMFLOAT3( fRectLeft, fRectTop, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexLeft, fTexTop ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.push_back( SpriteVertex ); + + SpriteVertex.vPos = XMFLOAT3( fRectRight, fRectTop, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexRight, fTexTop ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.push_back( SpriteVertex ); + + SpriteVertex.vPos = XMFLOAT3( fRectLeft, fRectBottom, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexLeft, fTexBottom ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.push_back( SpriteVertex ); + + // tri2 + SpriteVertex.vPos = XMFLOAT3( fRectRight, fRectTop, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexRight, fTexTop ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.push_back( SpriteVertex ); + + SpriteVertex.vPos = XMFLOAT3( fRectRight, fRectBottom, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexRight, fTexBottom ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.push_back( SpriteVertex ); + + SpriteVertex.vPos = XMFLOAT3( fRectLeft, fRectBottom, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexLeft, fTexBottom ); + SpriteVertex.vColor = vFontColor; + g_FontVertices.push_back( SpriteVertex ); + + fRectLeft += fGlyphSizeX; + + } + + // We have to end text after every line so that rendering order between sprites and fonts is preserved + EndText11( pd3dDevice, pd3d11DeviceContext ); +} + +_Use_decl_annotations_ +void EndText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext ) +{ + if ( g_FontVertices.empty() ) + return; + + // ensure our buffer size can hold our sprites + UINT FontDataBytes = static_cast( g_FontVertices.size() * 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; + + if (FAILED(pd3dDevice->CreateBuffer(&BufferDesc, nullptr, &g_pFontBuffer11))) + { + g_pFontBuffer11 = nullptr; + g_FontBufferBytes11 = 0; + return; + } + 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 ) ) + { + memcpy( MappedResource.pData, (void*)&g_FontVertices[0], FontDataBytes ); + pd3d11DeviceContext->Unmap(g_pFontBuffer11, 0); + } + + ID3D11ShaderResourceView* pOldTexture = nullptr; + 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( static_cast( g_FontVertices.size() ), 0 ); + + pd3d11DeviceContext->PSSetShaderResources( 0, 1, &pOldTexture ); + SAFE_RELEASE( pOldTexture ); + + g_FontVertices.clear(); +} + + +//====================================================================================== +// CDXUTDialog class +//====================================================================================== + +CDXUTDialog::CDXUTDialog() : + m_x( 0 ), + m_y( 0 ), + m_width( 0 ), + m_height( 0 ), + m_pManager( nullptr ), + m_bVisible( true ), + m_bCaption( false ), + m_bMinimized( false ), + m_bDrag( false ), + m_nCaptionHeight( 18 ), + m_colorTopLeft( 0 ), + m_colorTopRight( 0 ), + m_colorBottomLeft( 0 ), + m_colorBottomRight( 0 ), + m_pCallbackEvent( nullptr ), + m_pCallbackEventUserContext( nullptr ), + m_fTimeLastRefresh( 0 ), + m_pControlMouseOver( nullptr ), + m_nDefaultControlID( 0xffff ), + m_bNonUserEvents( false ), + m_bKeyboardInput( false ), + m_bMouseInput( true ) +{ + m_wszCaption[0] = L'\0'; + + m_pNextDialog = this; + m_pPrevDialog = this; +} + + +//-------------------------------------------------------------------------------------- +CDXUTDialog::~CDXUTDialog() +{ + RemoveAllControls(); + + m_Fonts.clear(); + m_Textures.clear(); + + for( auto it = m_DefaultElements.begin(); it != m_DefaultElements.end(); ++it ) + { + SAFE_DELETE( *it ); + } + + m_DefaultElements.clear(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog ) +{ + m_pManager = pManager; + if( bRegisterDialog ) + pManager->RegisterDialog( this ); + + SetTexture( 0, MAKEINTRESOURCE( 0xFFFF ), ( HMODULE )0xFFFF ); + InitDefaultElements(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, LPCWSTR pszControlTextureFilename ) +{ + m_pManager = pManager; + if( bRegisterDialog ) + pManager->RegisterDialog( this ); + SetTexture( 0, pszControlTextureFilename ); + InitDefaultElements(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTDialog::Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, + LPCWSTR szControlTextureResourceName, HMODULE hControlTextureResourceModule ) +{ + m_pManager = pManager; + if( bRegisterDialog ) + pManager->RegisterDialog( this ); + + SetTexture( 0, szControlTextureResourceName, hControlTextureResourceModule ); + InitDefaultElements(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 && L"To fix call CDXUTDialog::Init() first. See comments for details." ); + + m_pCallbackEvent = pCallback; + m_pCallbackEventUserContext = pUserContext; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::RemoveControl( _In_ int ID ) +{ + for( auto it = m_Controls.begin(); it != m_Controls.end(); ++it ) + { + if( (*it)->GetID() == ID ) + { + // Clean focus first + ClearFocus(); + + // Clear references to this control + if( s_pControlFocus == (*it) ) + s_pControlFocus = nullptr; + if( s_pControlPressed == (*it) ) + s_pControlPressed = nullptr; + if( m_pControlMouseOver == (*it) ) + m_pControlMouseOver = nullptr; + + SAFE_DELETE( (*it) ); + m_Controls.erase( it ); + + return; + } + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::RemoveAllControls() +{ + if( s_pControlFocus && s_pControlFocus->m_pDialog == this ) + s_pControlFocus = nullptr; + if( s_pControlPressed && s_pControlPressed->m_pDialog == this ) + s_pControlPressed = nullptr; + m_pControlMouseOver = nullptr; + + for( auto it = m_Controls.begin(); it != m_Controls.end(); ++it ) + { + SAFE_DELETE( *it ); + } + + m_Controls.clear(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::Refresh() +{ + if( s_pControlFocus ) + s_pControlFocus->OnFocusOut(); + + if( m_pControlMouseOver ) + m_pControlMouseOver->OnMouseLeave(); + + s_pControlFocus = nullptr; + s_pControlPressed = nullptr; + m_pControlMouseOver = nullptr; + + for( auto it = m_Controls.begin(); it != m_Controls.end(); ++it ) + { + (*it)->Refresh(); + } + + if( m_bKeyboardInput ) + FocusDefaultControl(); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::OnRender( _In_ 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; + + auto pd3dDevice = m_pManager->GetD3D11Device(); + auto 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 ) ) ) + { + memcpy( 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 ); + } + + auto 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 }; + DrawSprite( &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)" ); + DrawText( wszOutput, &m_CapElement, &rc, true ); + } + + // If the dialog is minimized, skip rendering + // its controls. + if( !m_bMinimized ) + { + for( auto it = m_Controls.cbegin(); it != m_Controls.cend(); ++it ) + { + // Focused control is drawn last + if( *it == s_pControlFocus ) + continue; + + (*it)->Render( fElapsedTime ); + } + + if( s_pControlFocus && 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 ) + 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 ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 && L"To fix call CDXUTDialog::Init() first. See comments for details." ); + _Analysis_assume_( m_pManager ); + + // Make sure the list is at least as large as the index being set + for( size_t i = m_Fonts.size(); i <= index; i++ ) + { + m_Fonts.push_back( -1 ); + } + + int iFont = m_pManager->AddFont( strFaceName, height, weight ); + m_Fonts[ index ] = iFont; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +DXUTFontNode* CDXUTDialog::GetFont( _In_ UINT index ) const +{ + if( !m_pManager ) + return nullptr; + return m_pManager->GetFontNode( m_Fonts[ index ] ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 && L"To fix this, call CDXUTDialog::Init() first. See comments for details." ); + _Analysis_assume_( m_pManager ); + + // Make sure the list is at least as large as the index being set + for( size_t i = m_Textures.size(); i <= index; i++ ) + { + m_Textures.push_back( -1 ); + } + + int iTexture = m_pManager->AddTexture( strFilename ); + + m_Textures[ index] = iTexture; + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 && L"To fix this, call CDXUTDialog::Init() first. See comments for details." ); + _Analysis_assume_( m_pManager ); + + // Make sure the list is at least as large as the index being set + for( size_t i = m_Textures.size(); i <= index; i++ ) + { + m_Textures.push_back( -1 ); + } + + int iTexture = m_pManager->AddTexture( strResourceName, hResourceModule ); + + m_Textures[ index ] = iTexture; + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +DXUTTextureNode* CDXUTDialog::GetTexture( _In_ UINT index ) const +{ + if( !m_pManager ) + return nullptr; + return m_pManager->GetTextureNode( m_Textures[ index ] ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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() ) + for( auto it = m_Controls.cbegin(); it != m_Controls.cend(); ++it ) + { + 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( auto it = m_Controls.begin(); it != m_Controls.end(); ++it ) + { + if( (*it)->GetHotkey() == wParam ) + { + (*it)->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 ) + { + return OnCycleFocus( true ); + } + break; + + case VK_LEFT: + case VK_UP: + if( s_pControlFocus ) + { + 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 + auto pControl = GetControlAtPoint( mousePoint ); + if( pControl && 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 = nullptr; + } + } + + // 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( _In_ const POINT& pt ) const +{ + // Search through all child controls for the first one which + // contains the mouse point + for( auto it = m_Controls.cbegin(); it != m_Controls.cend(); ++it ) + { + if( !*it ) + { + 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( (*it)->ContainsPoint( pt ) && (*it)->GetEnabled() && (*it)->GetVisible() ) + { + return *it; + } + } + + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTDialog::GetControlEnabled( _In_ int ID ) const +{ + auto pControl = GetControl( ID ); + if( !pControl ) + return false; + + return pControl->GetEnabled(); +} + + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::SetControlEnabled( _In_ int ID, _In_ bool bEnabled ) +{ + auto pControl = GetControl( ID ); + if( !pControl ) + return; + + pControl->SetEnabled( bEnabled ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::OnMouseUp( _In_ const POINT& pt ) +{ + UNREFERENCED_PARAMETER(pt); + s_pControlPressed = nullptr; + m_pControlMouseOver = nullptr; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::OnMouseMove( _In_ const POINT& pt ) +{ + // Figure out which control the mouse is over now + auto 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 ) + m_pControlMouseOver->OnMouseEnter(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement ) +{ + // If this Element type already exist in the list, simply update the stored Element + for( auto it = m_DefaultElements.begin(); it != m_DefaultElements.end(); ++it ) + { + if( (*it)->nControlType == nControlType && + (*it)->iElement == iElement ) + { + (*it)->Element = *pElement; + return S_OK; + } + } + + // Otherwise, add a new entry + DXUTElementHolder* pNewHolder; + pNewHolder = new (std::nothrow) DXUTElementHolder; + if( !pNewHolder ) + return E_OUTOFMEMORY; + + pNewHolder->nControlType = nControlType; + pNewHolder->iElement = iElement; + pNewHolder->Element = *pElement; + + m_DefaultElements.push_back( pNewHolder ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +CDXUTElement* CDXUTDialog::GetDefaultElement( UINT nControlType, UINT iElement ) const +{ + for( auto it = m_DefaultElements.cbegin(); it != m_DefaultElements.cend(); ++it ) + { + if( (*it)->nControlType == nControlType && + (*it)->iElement == iElement ) + { + return &(*it)->Element; + } + } + + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault, + CDXUTStatic** ppCreated ) +{ + HRESULT hr = S_OK; + + auto pStatic = new (std::nothrow) CDXUTStatic( this ); + + if( ppCreated ) + *ppCreated = pStatic; + + if( !pStatic ) + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; + + auto pButton = new (std::nothrow) CDXUTButton( this ); + + if( ppCreated ) + *ppCreated = pButton; + + if( !pButton ) + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; + + auto pCheckBox = new (std::nothrow) CDXUTCheckBox( this ); + + if( ppCreated ) + *ppCreated = pCheckBox; + + if( !pCheckBox ) + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; + + auto pRadioButton = new (std::nothrow) CDXUTRadioButton( this ); + + if( ppCreated ) + *ppCreated = pRadioButton; + + if( !pRadioButton ) + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::AddComboBox( int ID, int x, int y, int width, int height, UINT nHotkey, bool bIsDefault, + CDXUTComboBox** ppCreated ) +{ + HRESULT hr = S_OK; + + auto pComboBox = new (std::nothrow) CDXUTComboBox( this ); + + if( ppCreated ) + *ppCreated = pComboBox; + + if( !pComboBox ) + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; + + auto pSlider = new (std::nothrow) CDXUTSlider( this ); + + if( ppCreated ) + *ppCreated = pSlider; + + if( !pSlider ) + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault, + CDXUTEditBox** ppCreated ) +{ + HRESULT hr = S_OK; + + auto pEditBox = new (std::nothrow) CDXUTEditBox( this ); + + if( ppCreated ) + *ppCreated = pEditBox; + + if( !pEditBox ) + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::AddListBox( int ID, int x, int y, int width, int height, DWORD dwStyle, CDXUTListBox** ppCreated ) +{ + HRESULT hr = S_OK; + auto pListBox = new (std::nothrow) CDXUTListBox( this ); + + if( ppCreated ) + *ppCreated = pListBox; + + if( !pListBox ) + 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( _In_ CDXUTControl* pControl ) +{ + HRESULT hr; + + if( !pControl ) + return E_INVALIDARG; + + pControl->m_Index = static_cast( m_Controls.size() ); + + // Look for a default Element entries + for( auto it = m_DefaultElements.begin(); it != m_DefaultElements.end(); ++it ) + { + if( (*it)->nControlType == pControl->GetType() ) + pControl->SetElement( (*it)->iElement, &(*it)->Element ); + } + + V_RETURN( pControl->OnInit() ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialog::AddControl( _In_ CDXUTControl* pControl ) +{ + HRESULT hr = S_OK; + + hr = InitControl( pControl ); + if( FAILED( hr ) ) + return DXTRACE_ERR( L"CDXUTDialog::InitControl", hr ); + + // Add to the list + m_Controls.push_back( pControl ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetControl( _In_ int ID ) const +{ + // Try to find the control with the given ID + for( auto it = m_Controls.cbegin(); it != m_Controls.cend(); ++it ) + { + if( (*it)->GetID() == ID ) + { + return *it; + } + } + + // Not found + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetControl( _In_ int ID, _In_ UINT nControlType ) const +{ + // Try to find the control with the given ID + for( auto it = m_Controls.cbegin(); it != m_Controls.cend(); ++it ) + { + if( (*it)->GetID() == ID && (*it)->GetType() == nControlType ) + { + return *it; + } + } + + // Not found + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetNextControl( _In_ CDXUTControl* pControl ) +{ + int index = pControl->m_Index + 1; + + auto 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.size() ) + { + pDialog = pDialog->m_pNextDialog; + index = 0; + } + + return pDialog->m_Controls[ index ]; +} + + +//-------------------------------------------------------------------------------------- +CDXUTControl* CDXUTDialog::GetPrevControl( _In_ CDXUTControl* pControl ) +{ + int index = pControl->m_Index - 1; + + auto 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 ) + pDialog = pControl->m_pDialog; + + index = int( pDialog->m_Controls.size() ) - 1; + } + + return pDialog->m_Controls[ index ]; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::ClearRadioButtonGroup( _In_ UINT nButtonGroup ) +{ + // Find all radio buttons with the given group number + for( auto it = m_Controls.cbegin(); it != m_Controls.cend(); ++it ) + { + if( (*it)->GetType() == DXUT_CONTROL_RADIOBUTTON ) + { + auto pRadioButton = ( CDXUTRadioButton* )*it; + + if( pRadioButton->GetButtonGroup() == nButtonGroup ) + pRadioButton->SetChecked( false, false ); + } + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::ClearComboBox( _In_ int ID ) +{ + auto pComboBox = GetComboBox( ID ); + if( !pComboBox ) + return; + + pComboBox->RemoveAllItems(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::RequestFocus( _In_ CDXUTControl* pControl ) +{ + if( s_pControlFocus == pControl ) + return; + + if( !pControl->CanHaveFocus() ) + return; + + if( s_pControlFocus ) + s_pControlFocus->OnFocusOut(); + + pControl->OnFocusIn(); + s_pControlFocus = pControl; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::DrawRect( const RECT* pRect, DWORD color ) +{ + UNREFERENCED_PARAMETER(pRect); + UNREFERENCED_PARAMETER(color); + // TODO - + return E_FAIL; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::DrawSprite( CDXUTElement* pElement, const RECT* prcDest, float fDepth ) +{ + // No need to draw fully transparent layers + if( pElement->TextureColor.Current.w == 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 ); + + auto pTextureNode = GetTexture( pElement->iTexture ); + if( !pTextureNode ) + 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 = XMFLOAT3( fRectLeft, fRectTop, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexLeft, fTexTop ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.push_back( SpriteVertex ); + + SpriteVertex.vPos = XMFLOAT3( fRectRight, fRectTop, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexRight, fTexTop ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.push_back( SpriteVertex ); + + SpriteVertex.vPos = XMFLOAT3( fRectLeft, fRectBottom, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexLeft, fTexBottom ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.push_back( SpriteVertex ); + + // tri2 + SpriteVertex.vPos = XMFLOAT3( fRectRight, fRectTop, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexRight, fTexTop ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.push_back( SpriteVertex ); + + SpriteVertex.vPos = XMFLOAT3( fRectRight, fRectBottom, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexRight, fTexBottom ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.push_back( SpriteVertex ); + + SpriteVertex.vPos = XMFLOAT3( fRectLeft, fRectBottom, fDepth ); + SpriteVertex.vTex = XMFLOAT2( fTexLeft, fTexBottom ); + SpriteVertex.vColor = pElement->TextureColor.Current; + m_pManager->m_SpriteVertices.push_back( 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::CalcTextRect( LPCWSTR strText, CDXUTElement* pElement, const RECT* prcDest, int nCount ) +{ + auto pFontNode = GetFont( pElement->iFont ); + if( !pFontNode ) + return E_FAIL; + + UNREFERENCED_PARAMETER(strText); + UNREFERENCED_PARAMETER(prcDest); + UNREFERENCED_PARAMETER(nCount); + // TODO - + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialog::DrawText( LPCWSTR strText, CDXUTElement* pElement, const RECT* prcDest, bool bShadow, bool bCenter ) +{ + // No need to draw fully transparent layers + if( pElement->FontColor.Current.w == 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; + + auto pd3dDevice = m_pManager->GetD3D11Device(); + auto pd3d11DeviceContext = m_pManager->GetD3D11DeviceContext(); + + if( bShadow ) + { + RECT rcShadow = rcScreen; + OffsetRect( &rcShadow, 1, 1 ); + + XMFLOAT4 vShadowColor( 0,0,0, 1.0f ); + DrawText11DXUT( pd3dDevice, pd3d11DeviceContext, + strText, rcShadow, vShadowColor, + fBBWidth, fBBHeight, bCenter ); + + } + + XMFLOAT4 vFontColor( pElement->FontColor.Current.x, pElement->FontColor.Current.y, pElement->FontColor.Current.z, 1.0f ); + DrawText11DXUT( pd3dDevice, pd3d11DeviceContext, + strText, rcScreen, vFontColor, + fBBWidth, fBBHeight, bCenter ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTDialog::SetBackgroundColors( DWORD colorTopLeft, DWORD colorTopRight, DWORD colorBottomLeft, + DWORD colorBottomRight ) +{ + m_colorTopLeft = colorTopLeft; + m_colorTopRight = colorTopRight; + m_colorBottomLeft = colorBottomLeft; + m_colorBottomRight = colorBottomRight; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::SetNextDialog( _In_ CDXUTDialog* pNextDialog ) +{ + if( !pNextDialog ) + pNextDialog = this; + + m_pNextDialog = pNextDialog; + if( pNextDialog ) + m_pNextDialog->m_pPrevDialog = this; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::ClearFocus() +{ + if( s_pControlFocus ) + { + s_pControlFocus->OnFocusOut(); + s_pControlFocus = nullptr; + } + + ReleaseCapture(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialog::FocusDefaultControl() +{ + // Check for default control in this dialog + for( auto it = m_Controls.cbegin(); it != m_Controls.cend(); ++it ) + { + if( (*it)->m_bIsDefault ) + { + // Remove focus from the current control + ClearFocus(); + + // Give focus to the default control + s_pControlFocus = *it; + s_pControlFocus->OnFocusIn(); + return; + } + } +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTDialog::OnCycleFocus( _In_ bool bForward ) +{ + CDXUTControl* pControl = nullptr; + CDXUTDialog* pDialog = nullptr; // pDialog and pLastDialog are used to track wrapping of + CDXUTDialog* pLastDialog; // focus from first control to last or vice versa. + + if( !s_pControlFocus ) + { + // If s_pControlFocus is nullptr, 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( auto it = m_pManager->m_Dialogs.cbegin(); it != m_pManager->m_Dialogs.cend(); ++it ) + { + pDialog = pLastDialog = *it; + if( pDialog && !pDialog->m_Controls.empty() ) + { + pControl = pDialog->m_Controls[ 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( auto it = m_pManager->m_Dialogs.crbegin(); it != m_pManager->m_Dialogs.crend(); ++it ) + { + pDialog = pLastDialog = *it; + if( pDialog && !pDialog->m_Controls.empty() ) + { + pControl = pDialog->m_Controls[ pDialog->m_Controls.size() - 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. + assert( pControl != 0 ); + _Analysis_assume_( pControl != 0 ); + pLastDialog = s_pControlFocus->m_pDialog; + pControl = ( bForward ) ? GetNextControl( s_pControlFocus ) : GetPrevControl( s_pControlFocus ); + pDialog = pControl->m_pDialog; + } + + assert( pControl != 0 ); + _Analysis_assume_( pControl != 0 ); + + for( int i = 0; i < 0xffff; i++ ) + { + // If we just wrapped from last control to first or vice versa, + // set the focused control to nullptr. This state, where no control + // has focus, allows the camera to work. + int nLastDialogIndex = -1; + auto fit = std::find( m_pManager->m_Dialogs.cbegin(), m_pManager->m_Dialogs.cend(), pLastDialog ); + if ( fit != m_pManager->m_Dialogs.cend() ) + { + nLastDialogIndex = int( fit - m_pManager->m_Dialogs.begin() ); + } + + int nDialogIndex = -1; + fit = std::find( m_pManager->m_Dialogs.cbegin(), m_pManager->m_Dialogs.cend(), pDialog ); + if ( fit != m_pManager->m_Dialogs.cend() ) + { + nDialogIndex = int( fit - m_pManager->m_Dialogs.begin() ); + } + + if( ( !bForward && nLastDialogIndex < nDialogIndex ) || + ( bForward && nDialogIndex < nLastDialogIndex ) ) + { + if( s_pControlFocus ) + s_pControlFocus->OnFocusOut(); + s_pControlFocus = nullptr; + 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; + if( s_pControlFocus ) + 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; +} + + +//-------------------------------------------------------------------------------------- +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 ); +} + + +//====================================================================================== +// CDXUTDialogResourceManager +//====================================================================================== + +//-------------------------------------------------------------------------------------- +CDXUTDialogResourceManager::CDXUTDialogResourceManager() : + m_pVSRenderUI11(nullptr), + m_pPSRenderUI11(nullptr), + m_pPSRenderUIUntex11(nullptr), + m_pDepthStencilStateUI11(nullptr), + m_pRasterizerStateUI11(nullptr), + m_pBlendStateUI11(nullptr), + m_pSamplerStateUI11(nullptr), + m_pDepthStencilStateStored11(nullptr), + m_pRasterizerStateStored11(nullptr), + m_pBlendStateStored11(nullptr), + m_pSamplerStateStored11(nullptr), + m_pInputLayout11(nullptr), + m_pVBScreenQuad11(nullptr), + m_pSpriteBuffer11(nullptr), + m_SpriteBufferBytes11(0) +{ +} + + +//-------------------------------------------------------------------------------------- +CDXUTDialogResourceManager::~CDXUTDialogResourceManager() +{ + for( auto it = m_FontCache.begin(); it != m_FontCache.end(); ++it ) + { + SAFE_DELETE( *it ); + } + m_FontCache.clear(); + + for( auto it = m_TextureCache.begin(); it != m_TextureCache.end(); ++it ) + { + SAFE_DELETE( *it ); + } + m_TextureCache.clear(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTDialogResourceManager::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(uMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + return false; +} + + +_Use_decl_annotations_ +HRESULT CDXUTDialogResourceManager::OnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext ) +{ + m_pd3d11Device = pd3dDevice; + m_pd3d11DeviceContext = pd3d11DeviceContext; + + HRESULT hr = S_OK; + + // Compile Shaders + ID3DBlob* pVSBlob = nullptr; + ID3DBlob* pPSBlob = nullptr; + ID3DBlob* pPSUntexBlob = nullptr; + V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", nullptr, nullptr, "VS", "vs_4_0_level_9_1", + D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pVSBlob, nullptr ) ); + V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", nullptr, nullptr, "PS", "ps_4_0_level_9_1", + D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pPSBlob, nullptr ) ); + V_RETURN( D3DCompile( g_strUIEffectFile, g_uUIEffectFileSize, "none", nullptr, nullptr, "PSUntex", "ps_4_0_level_9_1", + D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY, 0, &pPSUntexBlob, nullptr ) ); + + // Create Shaders + V_RETURN( pd3dDevice->CreateVertexShader( pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), nullptr, &m_pVSRenderUI11 ) ); + DXUT_SetDebugName( m_pVSRenderUI11, "CDXUTDialogResourceManager" ); + + V_RETURN( pd3dDevice->CreatePixelShader( pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), nullptr, &m_pPSRenderUI11 ) ); + DXUT_SetDebugName( m_pPSRenderUI11, "CDXUTDialogResourceManager" ); + + V_RETURN( pd3dDevice->CreatePixelShader( pPSUntexBlob->GetBufferPointer(), pPSUntexBlob->GetBufferSize(), nullptr, &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 texture objects in the cache arrays. + for( size_t i = 0; i < m_TextureCache.size(); i++ ) + { + hr = CreateTexture11( static_cast( 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, nullptr, &m_pVBScreenQuad11 ) ); + DXUT_SetDebugName( m_pVBScreenQuad11, "CDXUTDialogResourceManager" ); + + // Init the D3D11 font + InitFont11( pd3dDevice, m_pInputLayout11 ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTDialogResourceManager::OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, + const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ) +{ + UNREFERENCED_PARAMETER(pd3dDevice); + + HRESULT hr = S_OK; + + m_nBackBufferWidth = pBackBufferSurfaceDesc->Width; + m_nBackBufferHeight = pBackBufferSurfaceDesc->Height; + + return hr; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::OnD3D11ReleasingSwapChain() +{ +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::OnD3D11DestroyDevice() +{ + // Release the resources but don't clear the cache, as these will need to be + // recreated if the device is recreated + + for( auto it = m_TextureCache.begin(); it != m_TextureCache.end(); ++it ) + { + SAFE_RELEASE( (*it)->pTexResView11 ); + SAFE_RELEASE( (*it)->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( _In_ 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( _In_ 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( _In_ ID3D11DeviceContext* pd3dImmediateContext ) +{ + // Shaders + pd3dImmediateContext->VSSetShader( m_pVSRenderUI11, nullptr, 0 ); + pd3dImmediateContext->HSSetShader( nullptr, nullptr, 0 ); + pd3dImmediateContext->DSSetShader( nullptr, nullptr, 0 ); + pd3dImmediateContext->GSSetShader( nullptr, nullptr, 0 ); + pd3dImmediateContext->PSSetShader( m_pPSRenderUI11, nullptr, 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( _In_ ID3D11DeviceContext* pd3dImmediateContext ) +{ + // Shaders + pd3dImmediateContext->VSSetShader( m_pVSRenderUI11, nullptr, 0 ); + pd3dImmediateContext->HSSetShader( nullptr, nullptr, 0 ); + pd3dImmediateContext->DSSetShader( nullptr, nullptr, 0 ); + pd3dImmediateContext->GSSetShader( nullptr, nullptr, 0 ); + pd3dImmediateContext->PSSetShader( m_pPSRenderUIUntex11, nullptr, 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.clear(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTDialogResourceManager::EndSprites11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext ) +{ + + // ensure our buffer size can hold our sprites + UINT SpriteDataBytes = static_cast( m_SpriteVertices.size() * 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; + + if ( FAILED(pd3dDevice->CreateBuffer(&BufferDesc, nullptr, &m_pSpriteBuffer11)) ) + { + m_pSpriteBuffer11 = nullptr; + m_SpriteBufferBytes11 = 0; + return; + } + 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 ) ) + { + memcpy( MappedResource.pData, (const void*)&m_SpriteVertices[0], 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( static_cast( m_SpriteVertices.size() ), 0 ); + + m_SpriteVertices.clear(); +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTDialogResourceManager::RegisterDialog( _In_ CDXUTDialog* pDialog ) +{ + // Check that the dialog isn't already registered. + for( auto it = m_Dialogs.cbegin(); it != m_Dialogs.cend(); ++it ) + { + if( *it == pDialog ) + return true; + } + + // Add to the list. + m_Dialogs.push_back( pDialog ); + + // Set up next and prev pointers. + if( m_Dialogs.size() > 1 ) + m_Dialogs[m_Dialogs.size() - 2]->SetNextDialog( pDialog ); + m_Dialogs[m_Dialogs.size() - 1]->SetNextDialog( m_Dialogs[0] ); + + return true; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::UnregisterDialog( _In_ CDXUTDialog* pDialog ) +{ + // Search for the dialog in the list. + for( size_t i = 0; i < m_Dialogs.size(); ++i ) + { + if( m_Dialogs[ i ] == pDialog ) + { + m_Dialogs.erase( m_Dialogs.begin() + i ); + if( !m_Dialogs.empty() ) + { + int l, r; + + if( 0 == i ) + l = int( m_Dialogs.size() - 1 ); + else + l = int(i) - 1; + + if( m_Dialogs.size() == i ) + r = 0; + else + r = int( i ); + + m_Dialogs[l]->SetNextDialog( m_Dialogs[r] ); + } + return; + } + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTDialogResourceManager::EnableKeyboardInputForAllDialogs() +{ + // Enable keyboard input for all registered dialogs + for( auto it = m_Dialogs.begin(); it != m_Dialogs.end(); ++it ) + (*it)->EnableKeyboardInput( true ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +int CDXUTDialogResourceManager::AddFont( LPCWSTR strFaceName, LONG height, LONG weight ) +{ + // See if this font already exists + for( size_t i = 0; i < m_FontCache.size(); ++i ) + { + auto pFontNode = m_FontCache[ i ]; + size_t nLen = 0; + nLen = wcsnlen( strFaceName, MAX_PATH); + if( 0 == _wcsnicmp( pFontNode->strFace, strFaceName, nLen ) && + pFontNode->nHeight == height && + pFontNode->nWeight == weight ) + { + return static_cast( i ); + } + } + + // Add a new font and try to create it + auto pNewFontNode = new (std::nothrow) DXUTFontNode; + if( !pNewFontNode ) + return -1; + + ZeroMemory( pNewFontNode, sizeof( DXUTFontNode ) ); + wcscpy_s( pNewFontNode->strFace, MAX_PATH, strFaceName ); + pNewFontNode->nHeight = height; + pNewFontNode->nWeight = weight; + m_FontCache.push_back( pNewFontNode ); + + int iFont = (int)m_FontCache.size() - 1; + + // If a device is available, try to create immediately + return iFont; +} + + +//-------------------------------------------------------------------------------------- +int CDXUTDialogResourceManager::AddTexture( _In_z_ LPCWSTR strFilename ) +{ + // See if this texture already exists + for( size_t i = 0; i < m_TextureCache.size(); ++i ) + { + auto pTextureNode = m_TextureCache[ i ]; + size_t nLen = 0; + nLen = wcsnlen( strFilename, MAX_PATH); + if( pTextureNode->bFileSource && // Sources must match + 0 == _wcsnicmp( pTextureNode->strFilename, strFilename, nLen ) ) + { + return static_cast( i ); + } + } + + // Add a new texture and try to create it + auto pNewTextureNode = new (std::nothrow) DXUTTextureNode; + if( !pNewTextureNode ) + return -1; + + ZeroMemory( pNewTextureNode, sizeof( DXUTTextureNode ) ); + pNewTextureNode->bFileSource = true; + wcscpy_s( pNewTextureNode->strFilename, MAX_PATH, strFilename ); + + m_TextureCache.push_back( pNewTextureNode ); + + int iTexture = int( m_TextureCache.size() ) - 1; + + // If a device is available, try to create immediately + + return iTexture; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +int CDXUTDialogResourceManager::AddTexture( LPCWSTR strResourceName, HMODULE hResourceModule ) +{ + // See if this texture already exists + for( size_t i = 0; i < m_TextureCache.size(); i++ ) + { + auto pTextureNode = m_TextureCache[ 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 static_cast( i ); + } + else + { + // String-based ID + size_t nLen = 0; + nLen = wcsnlen ( strResourceName, MAX_PATH ); + if( 0 == _wcsnicmp( pTextureNode->strFilename, strResourceName, nLen ) ) + return static_cast( i ); + } + } + } + + // Add a new texture and try to create it + auto pNewTextureNode = new (std::nothrow) DXUTTextureNode; + if( !pNewTextureNode ) + 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.push_back( pNewTextureNode ); + + int iTexture = int( m_TextureCache.size() ) - 1; + + // If a device is available, try to create immediately + + return iTexture; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTDialogResourceManager::CreateTexture11( _In_ UINT iTexture ) +{ + HRESULT hr = S_OK; + + auto pTextureNode = m_TextureCache[ iTexture ]; + + if( !pTextureNode->bFileSource ) + { + if( pTextureNode->nResourceID == 0xFFFF && pTextureNode->hResourceModule == ( HMODULE )0xFFFF ) + { + hr = DXUTCreateGUITextureFromInternalArray( m_pd3d11Device, &pTextureNode->pTexture11 ); + if( FAILED( hr ) ) + return DXTRACE_ERR( L"DXUTCreateGUITextureFromInternalArray", hr ); + DXUT_SetDebugName( pTextureNode->pTexture11, "DXUT GUI Texture" ); + } + } + + // 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 = desc.Format; + SRVDesc.Texture2D.MipLevels = 1; + SRVDesc.Texture2D.MostDetailedMip = 0; + hr = m_pd3d11Device->CreateShaderResourceView( pTextureNode->pTexture11, &SRVDesc, &pTextureNode->pTexResView11 ); + if ( FAILED(hr) ) + return hr; + + DXUT_SetDebugName( pTextureNode->pTexResView11, "DXUT GUI Texture" ); + + return hr; +} + + +//====================================================================================== +// CDXUTControl class +//====================================================================================== + +CDXUTControl::CDXUTControl( _In_opt_ CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_BUTTON; + m_pDialog = pDialog; + m_ID = 0; + m_nHotkey = 0; + m_Index = 0; + m_pUserData = nullptr; + + m_bEnabled = true; + m_bVisible = true; + m_bMouseOver = false; + m_bHasFocus = false; + m_bIsDefault = false; + + m_pDialog = nullptr; + + m_x = 0; + m_y = 0; + m_width = 0; + m_height = 0; + + ZeroMemory( &m_rcBoundingBox, sizeof( m_rcBoundingBox ) ); +} + + +//-------------------------------------------------------------------------------------- +CDXUTControl::~CDXUTControl() +{ + for( auto it = m_Elements.begin(); it != m_Elements.end(); ++it ) + { + auto pElement = *it; + delete pElement; + } + m_Elements.clear(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTControl::SetTextColor( _In_ DWORD Color ) +{ + auto pElement = m_Elements[ 0 ]; + + if( pElement ) + pElement->FontColor.States[DXUT_STATE_NORMAL] = Color; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTControl::SetElement( _In_ UINT iElement, _In_ CDXUTElement* pElement ) +{ + if( !pElement ) + return E_INVALIDARG; + + // Make certain the array is this large + for( size_t i = m_Elements.size(); i <= iElement; i++ ) + { + auto pNewElement = new (std::nothrow) CDXUTElement(); + if( !pNewElement ) + return E_OUTOFMEMORY; + + m_Elements.push_back( pNewElement ); + } + + // Update the data + auto pCurElement = m_Elements[ iElement ]; + *pCurElement = *pElement; + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTControl::Refresh() +{ + m_bMouseOver = false; + m_bHasFocus = false; + + for( auto it = m_Elements.begin(); it != m_Elements.end(); ++it ) + { + (*it)->Refresh(); + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTControl::UpdateRects() +{ + SetRect( &m_rcBoundingBox, m_x, m_y, m_x + m_width, m_y + m_height ); +} + + +//====================================================================================== +// CDXUTStatic class +//====================================================================================== + +//-------------------------------------------------------------------------------------- +CDXUTStatic::CDXUTStatic( _In_opt_ CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_STATIC; + m_pDialog = pDialog; + + ZeroMemory( &m_strText, sizeof( m_strText ) ); + + for( auto it = m_Elements.begin(); it != m_Elements.end(); ++it ) + { + auto pElement = *it; + SAFE_DELETE( pElement ); + } + + m_Elements.clear(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTStatic::Render( _In_ float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL; + + if( m_bEnabled == false ) + iState = DXUT_STATE_DISABLED; + + auto pElement = m_Elements[ 0 ]; + + pElement->FontColor.Blend( iState, fElapsedTime ); + + m_pDialog->DrawText( m_strText, pElement, &m_rcBoundingBox, false, false); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTStatic::GetTextCopy( LPWSTR strDest, UINT bufferCount ) const +{ + // Validate incoming parameters + if( !strDest || bufferCount == 0 ) + { + return E_INVALIDARG; + } + + // Copy the window text + wcscpy_s( strDest, bufferCount, m_strText ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTStatic::SetText( _In_z_ LPCWSTR strText ) +{ + if( !strText ) + { + m_strText[0] = 0; + return S_OK; + } + + wcscpy_s( m_strText, MAX_PATH, strText ); + return S_OK; +} + + +//====================================================================================== +// CDXUTButton class +//====================================================================================== + +CDXUTButton::CDXUTButton( _In_opt_ CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_BUTTON; + m_pDialog = pDialog; + + m_bPressed = false; + m_nHotkey = 0; +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTButton::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) + +{ + UNREFERENCED_PARAMETER(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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTButton::HandleMouse( UINT uMsg, const POINT& pt, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(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( _In_ 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 + auto pElement = m_Elements[ 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, true ); + + // Main button + pElement = m_Elements[ 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, true ); +} + + + +//====================================================================================== +// CDXUTCheckBox class +//====================================================================================== + +CDXUTCheckBox::CDXUTCheckBox( _In_opt_ CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_CHECKBOX; + m_pDialog = pDialog; + + m_bChecked = false; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTCheckBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTCheckBox::HandleMouse( UINT uMsg, const POINT& pt, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTCheckBox::SetCheckedInternal( bool bChecked, bool bFromInput ) +{ + m_bChecked = bChecked; + + m_pDialog->SendEvent( EVENT_CHECKBOX_CHANGED, bFromInput, this ); +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTCheckBox::ContainsPoint( _In_ const 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( _In_ 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; + + auto pElement = m_Elements[ 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, false ); + + if( !m_bChecked ) + iState = DXUT_STATE_HIDDEN; + + pElement = m_Elements[ 1 ]; + + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcButton, DXUT_FAR_BUTTON_DEPTH ); +} + + +//====================================================================================== +// CDXUTRadioButton class +//====================================================================================== + +CDXUTRadioButton::CDXUTRadioButton( _In_opt_ CDXUTDialog* pDialog ) +{ + m_Type = DXUT_CONTROL_RADIOBUTTON; + m_pDialog = pDialog; +} + + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTRadioButton::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTRadioButton::HandleMouse( UINT uMsg, const POINT& pt, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(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; +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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( _In_opt_ 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( _In_ DWORD Color ) +{ + auto pElement = m_Elements[ 0 ]; + + if( pElement ) + pElement->FontColor.States[DXUT_STATE_NORMAL] = Color; + + pElement = m_Elements[ 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, static_cast( 0.90f * RectHeight( m_rcText ) ) ); + m_rcDropdown.bottom += m_nDropHeight; + m_rcDropdown.right -= m_nSBWidth; + + m_rcDropdownText = m_rcDropdown; + m_rcDropdownText.left += static_cast(0.1f * RectWidth(m_rcDropdown)); + m_rcDropdownText.right -= static_cast(0.1f * RectWidth(m_rcDropdown)); + m_rcDropdownText.top += static_cast(0.1f * RectHeight(m_rcDropdown)); + m_rcDropdownText.bottom -= static_cast(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 ); + auto pFontNode = m_pDialog->GetManager()->GetFontNode( m_Elements[ 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTComboBox::HandleMouse( UINT uMsg, const 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( size_t i = 0; i < m_Items.size(); i++ ) + { + auto pItem = m_Items[ i ]; + if( pItem->bVisible && + PtInRect( &pItem->rcActive, pt ) ) + { + m_iFocused = static_cast( 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( size_t i = m_ScrollBar.GetTrackPos(); i < m_Items.size(); i++ ) + { + auto pItem = m_Items[ i ]; + if( pItem->bVisible && + PtInRect( &pItem->rcActive, pt ) ) + { + m_iFocused = m_iSelected = static_cast( 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 = 0; + if ( !SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &uLines, 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.size() ) + m_iSelected = 0; + + m_iFocused = m_iSelected; + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, true, this ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::Render( _In_ float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + DXUT_CONTROL_STATE iState = DXUT_STATE_NORMAL; + + if( !m_bOpened ) + iState = DXUT_STATE_HIDDEN; + + // Dropdown box + auto pElement = m_Elements[ 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 + auto pSelectionElement = m_Elements[ 3 ]; + pSelectionElement->TextureColor.Current = pElement->TextureColor.Current; + pSelectionElement->FontColor.SetCurrent( pSelectionElement->FontColor.States[ DXUT_STATE_NORMAL ] ); + + auto pFont = m_pDialog->GetFont( pElement->iFont ); + if( pFont ) + { + int curY = m_rcDropdownText.top; + int nRemainingHeight = RectHeight( m_rcDropdownText ); + + for( size_t i = m_ScrollBar.GetTrackPos(); i < m_Items.size(); i++ ) + { + auto pItem = m_Items[ 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; + + pItem->bVisible = true; + + if( m_bOpened ) + { + if( ( int )i == m_iFocused ) + { + RECT rc; + SetRect( &rc, m_rcDropdown.left, pItem->rcActive.top, 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[ 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[ 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.size() ) + { + auto pItem = m_Items[ m_iSelected ]; + if( pItem ) + { + m_pDialog->DrawText( pItem->strText, pElement, &m_rcText, false, true ); + + } + } +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTComboBox::AddItem( const WCHAR* strText, void* pData ) +{ + // Validate parameters + if( !strText ) + { + return E_INVALIDARG; + } + + // Create a new item and set the data + auto pItem = new (std::nothrow) DXUTComboBoxItem; + if( !pItem ) + { + return DXTRACE_ERR_MSGBOX( L"new", E_OUTOFMEMORY ); + } + + ZeroMemory( pItem, sizeof( DXUTComboBoxItem ) ); + wcscpy_s( pItem->strText, 256, strText ); + pItem->pData = pData; + + m_Items.push_back( pItem ); + + // Update the scroll bar with new range + m_ScrollBar.SetTrackRange( 0, (int)m_Items.size() ); + + // 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( _In_ UINT index ) +{ + auto it = m_Items.begin() + index; + auto pItem = *it; + SAFE_DELETE( pItem ); + m_Items.erase( it ); + m_ScrollBar.SetTrackRange( 0, (int)m_Items.size() ); + if( m_iSelected >= (int)m_Items.size() ) + m_iSelected = (int)m_Items.size() - 1; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTComboBox::RemoveAllItems() +{ + for( auto it = m_Items.begin(); it != m_Items.end(); ++it ) + { + auto pItem = *it; + SAFE_DELETE( pItem ); + } + + m_Items.clear(); + m_ScrollBar.SetTrackRange( 0, 1 ); + m_iFocused = m_iSelected = -1; +} + + +//-------------------------------------------------------------------------------------- +bool CDXUTComboBox::ContainsItem( _In_z_ const WCHAR* strText, _In_ UINT iStart ) +{ + return ( -1 != FindItem( strText, iStart ) ); +} + + +//-------------------------------------------------------------------------------------- +int CDXUTComboBox::FindItem( _In_z_ const WCHAR* strText, _In_ UINT iStart ) const +{ + if( !strText ) + return -1; + + for( size_t i = iStart; i < m_Items.size(); i++ ) + { + auto pItem = m_Items[ i ]; + + if( 0 == wcscmp( pItem->strText, strText ) ) + { + return static_cast( i ); + } + } + + return -1; +} + + +//-------------------------------------------------------------------------------------- +void* CDXUTComboBox::GetSelectedData() const +{ + if( m_iSelected < 0 ) + return nullptr; + + auto pItem = m_Items[ m_iSelected ]; + return pItem->pData; +} + + +//-------------------------------------------------------------------------------------- +DXUTComboBoxItem* CDXUTComboBox::GetSelectedItem() const +{ + if( m_iSelected < 0 ) + return nullptr; + + return m_Items[ m_iSelected ]; +} + + +//-------------------------------------------------------------------------------------- +void* CDXUTComboBox::GetItemData( _In_z_ const WCHAR* strText ) const +{ + int index = FindItem( strText ); + if( index == -1 ) + { + return nullptr; + } + + auto pItem = m_Items[ index ]; + if( !pItem ) + { + DXTRACE_ERR( L"CDXUTComboBox::GetItemData", E_FAIL ); + return nullptr; + } + + return pItem->pData; +} + + +//-------------------------------------------------------------------------------------- +void* CDXUTComboBox::GetItemData( _In_ int nIndex ) const +{ + if( nIndex < 0 || nIndex >= (int)m_Items.size() ) + return nullptr; + + return m_Items[ nIndex ]->pData; +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTComboBox::SetSelectedByIndex( _In_ 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( _In_z_ const WCHAR* strText ) +{ + if( !strText ) + 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( _In_ void* pData ) +{ + for( size_t i = 0; i < m_Items.size(); i++ ) + { + auto pItem = m_Items[ i ]; + + if( pItem->pData == pData ) + { + m_iFocused = m_iSelected = static_cast( i ); + m_pDialog->SendEvent( EVENT_COMBOBOX_SELECTION_CHANGED, false, this ); + return S_OK; + } + } + + return E_FAIL; +} + + +//====================================================================================== +// CDXUTSlider class +//====================================================================================== + +CDXUTSlider::CDXUTSlider( _In_opt_ 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( _In_ const 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( _In_ int x ) +{ + float fValuePerPixel = ( float )( m_nMax - m_nMin ) / RectWidth( m_rcBoundingBox ); + return ( int )( 0.5f + m_nMin + fValuePerPixel * ( x - m_rcBoundingBox.left ) ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTSlider::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTSlider::HandleMouse( UINT uMsg, const POINT& pt, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(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( _In_ int nMin, _In_ int nMax ) +{ + m_nMin = nMin; + m_nMax = nMax; + + SetValueInternal( m_nValue, false ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTSlider::SetValueInternal( _In_ int nValue, _In_ bool bFromInput ) +{ + // Clamp to range + nValue = std::max( m_nMin, nValue ); + nValue = std::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( _In_ 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; + + auto pElement = m_Elements[ 0 ]; + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcBoundingBox, DXUT_FAR_BUTTON_DEPTH ); + + pElement = m_Elements[ 1 ]; + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcButton, DXUT_NEAR_BUTTON_DEPTH ); +} + + +//====================================================================================== +// CDXUTScrollBar class +//====================================================================================== + +CDXUTScrollBar::CDXUTScrollBar( _In_opt_ 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 = std::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( _In_ int nDelta ) +{ + // Perform scroll + m_nPosition += nDelta; + + // Cap position + Cap(); + + // Update thumb position + UpdateThumbRect(); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTScrollBar::ShowItem( _In_ 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(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTScrollBar::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(uMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + return false; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTScrollBar::HandleMouse( UINT uMsg, const POINT& pt, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTScrollBar::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(wParam); + + 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( _In_ 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 + auto pElement = m_Elements[ 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[ 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[ 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[ 3 ]; + + // Blend current color + pElement->TextureColor.Blend( iState, fElapsedTime, fBlendRate ); + m_pDialog->DrawSprite( pElement, &m_rcThumb, DXUT_NEAR_BUTTON_DEPTH ); + +} + + +//-------------------------------------------------------------------------------------- +void CDXUTScrollBar::SetTrackRange( _In_ int nStart, _In_ 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( _In_opt_ 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 ); + auto pFontNode = m_pDialog->GetManager()->GetFontNode( m_Elements[ 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 ); + } +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTListBox::AddItem( const WCHAR* wszText, void* pData ) +{ + auto pNewItem = new (std::nothrow) 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; + + m_Items.push_back( pNewItem ); + m_ScrollBar.SetTrackRange( 0, (int)m_Items.size() ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTListBox::InsertItem( int nIndex, const WCHAR* wszText, void* pData ) +{ + auto pNewItem = new (std::nothrow) 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; + + m_Items[ nIndex ] = pNewItem; + m_ScrollBar.SetTrackRange( 0, (int)m_Items.size() ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTListBox::RemoveItem( _In_ int nIndex ) +{ + if( nIndex < 0 || nIndex >= ( int )m_Items.size() ) + return; + + auto it = m_Items.begin() + nIndex; + auto pItem = *it; + delete pItem; + m_Items.erase(it); + m_ScrollBar.SetTrackRange( 0, (int)m_Items.size() ); + if( m_nSelected >= ( int )m_Items.size() ) + m_nSelected = int( m_Items.size() ) - 1; + + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTListBox::RemoveAllItems() +{ + for( auto it = m_Items.begin(); it != m_Items.end(); ++it ) + { + auto pItem = *it; + delete pItem; + } + + m_Items.clear(); + m_ScrollBar.SetTrackRange( 0, 1 ); +} + + +//-------------------------------------------------------------------------------------- +DXUTListBoxItem* CDXUTListBox::GetItem( _In_ int nIndex ) const +{ + if( nIndex < 0 || nIndex >= ( int )m_Items.size() ) + return nullptr; + + 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( _In_ int nPreviousSelected ) const +{ + 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.size(); ++i ) + { + auto pItem = m_Items[ i ]; + + if( pItem->bSelected ) + return i; + } + + return -1; + } + else + { + // Single selection + return m_nSelected; + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTListBox::SelectItem( _In_ int nNewIndex ) +{ + // If no item exists, do nothing. + if( m_Items.size() == 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.size() ) + m_nSelected = int( m_Items.size() ) - 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 ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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.size() == 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 = int( m_Items.size() ) - 1; break; + } + + // Perform capping + if( m_nSelected < 0 ) + m_nSelected = 0; + if( m_nSelected >= ( int )m_Items.size() ) + m_nSelected = int( m_Items.size() ) - 1; + + if( nOldSelected != m_nSelected ) + { + if( m_dwStyle & MULTISELECTION ) + { + // Multiple selection + + // Clear all selection + for( int i = 0; i < ( int )m_Items.size(); ++i ) + { + auto pItem = m_Items[i]; + pItem->bSelected = false; + } + + if( GetKeyState( VK_SHIFT ) < 0 ) + { + // Select all items from m_nSelStart to + // m_nSelected + int nEnd = std::max( m_nSelStart, m_nSelected ); + + for( int n = std::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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTListBox::HandleMouse( UINT uMsg, const 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.empty() && 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.size() && + 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 + + auto pSelItem = m_Items[ 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 = std::min( m_nSelStart, m_nSelected ); + int nEnd = std::max( m_nSelStart, m_nSelected ); + + for( int i = 0; i < nBegin; ++i ) + { + auto pItem = m_Items[ i ]; + pItem->bSelected = false; + } + + for( int i = nEnd + 1; i < ( int )m_Items.size(); ++i ) + { + auto pItem = m_Items[ i ]; + pItem->bSelected = false; + } + + for( int i = nBegin; i <= nEnd; ++i ) + { + auto pItem = m_Items[ 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 = std::min( m_nSelStart, m_nSelected ); + int nEnd = std::max( m_nSelStart, m_nSelected ); + + // The two ends do not need to be set here. + + bool bLastSelected = m_Items[ m_nSelStart ]->bSelected; + for( int i = nBegin + 1; i < nEnd; ++i ) + { + auto pItem = m_Items[ 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.size(); ++i ) + { + auto pItem = m_Items[ 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 = std::max( m_nSelStart, m_nSelected ); + + for( int n = std::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.size() && + 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 = std::min( ( int )m_Items.size(), m_ScrollBar.GetTrackPos() + + m_ScrollBar.GetPageSize() ) - 1; + m_pDialog->SendEvent( EVENT_LISTBOX_SELECTION, true, this ); + } + } + break; + + case WM_MOUSEWHEEL: + { + UINT uLines = 0; + if ( !SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &uLines, 0 ) ) + uLines = 0; + int nScrollAmount = int( ( short )HIWORD( wParam ) ) / WHEEL_DELTA * uLines; + m_ScrollBar.Scroll( -nScrollAmount ); + return true; + } + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTListBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(wParam); + + 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( _In_ float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + auto pElement = m_Elements[ 0 ]; + pElement->TextureColor.Blend( DXUT_STATE_NORMAL, fElapsedTime ); + pElement->FontColor.Blend( DXUT_STATE_NORMAL, fElapsedTime ); + + auto pSelElement = m_Elements[ 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.empty() ) + { + // 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.size(); ++i ) + { + if( rc.bottom > m_rcText.bottom ) + break; + + auto pItem = m_Items[ 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 ); +} + + +//====================================================================================== +// CDXUTEditBox class +//====================================================================================== + +// Static member initialization +bool CDXUTEditBox::s_bHideCaret; // If true, we don't render the caret. + +// 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( _In_opt_ 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( _In_ 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 nul 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( _In_z_ LPCWSTR wszText, _In_ bool bSelected ) +{ + assert( wszText ); + + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTEditBox::GetTextCopy( LPWSTR strDest, UINT bufferCount ) const +{ + assert( strDest ); + + wcscpy_s( strDest, bufferCount, m_Buffer.GetBuffer() ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::DeleteSelectionText() +{ + int nFirst = std::min( m_nCaret, m_nSelStart ); + int nLast = std::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 ); +} + + +#pragma warning(push) +#pragma warning( disable : 4616 6386 ) +void CDXUTEditBox::CopyToClipboard() +{ + // Copy the selection text to the clipboard + if( m_nCaret != m_nSelStart && OpenClipboard( nullptr ) ) + { + EmptyClipboard(); + + HGLOBAL hBlock = GlobalAlloc( GMEM_MOVEABLE, sizeof( WCHAR ) * ( m_Buffer.GetTextSize() + 1 ) ); + if( hBlock ) + { + auto pwszText = reinterpret_cast( GlobalLock( hBlock ) ); + if( pwszText ) + { + int nFirst = std::min( m_nCaret, m_nSelStart ); + int nLast = std::max( m_nCaret, m_nSelStart ); + if( nLast - nFirst > 0 ) + { + memcpy( 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( nullptr ) ) + { + HANDLE handle = GetClipboardData( CF_UNICODETEXT ); + if( handle ) + { + // Convert the ANSI string to Unicode, then + // insert to our buffer. + auto pwszText = reinterpret_cast( GlobalLock( handle ) ); + if( pwszText ) + { + // Copy all characters up to null. + if( m_Buffer.InsertString( m_nCaret, pwszText ) ) + PlaceCaret( m_nCaret + (int)wcslen( pwszText ) ); + m_nSelStart = m_nCaret; + GlobalUnlock( handle ); + } + } + CloseClipboard(); + } +} +#pragma warning(pop) + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTEditBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTEditBox::HandleMouse( UINT uMsg, const POINT& pt, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(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( m_Buffer.XtoCP( pt.x - m_rcText.left + nX1st, &nCP, &nTrail ) ) + { + // Cap at the nul 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( m_Buffer.XtoCP( pt.x - m_rcText.left + nX1st, &nCP, &nTrail ) ) + { + // Cap at the nul character. + if( nTrail && nCP < m_Buffer.GetTextSize() ) + PlaceCaret( nCP + 1 ); + else + PlaceCaret( nCP ); + } + } + break; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTEditBox::OnFocusIn() +{ + CDXUTControl::OnFocusIn(); + + ResetCaretBlink(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTEditBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(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( _In_ float fElapsedTime ) +{ + if( m_bVisible == false ) + return; + + int nSelStartX = 0, nCaretX = 0; // Left and right X cordinates of the selection region + + auto 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[ 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 + // + m_Buffer.CPtoX( m_nCaret, FALSE, &nCaretX ); + if( m_nCaret != m_nSelStart ) + 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 ); + + m_pDialog->DrawRect( &rcSelection, m_SelBkColor ); + } + + // + // Render the text + // + // Element 0 for text + m_Elements[ 0 ]->FontColor.SetCurrent( m_TextColor ); + m_pDialog->DrawText( m_Buffer.GetBuffer() + m_nFirstVisible, m_Elements[ 0 ], &m_rcText ); + + // Render the selected text + if( m_nCaret != m_nSelStart ) + { + int nFirstToRender = std::max( m_nFirstVisible, std::min( m_nSelStart, m_nCaret ) ); + m_Elements[ 0 ]->FontColor.SetCurrent( m_SelTextColor ); + m_pDialog->DrawText( m_Buffer.GetBuffer() + nFirstToRender, + m_Elements[ 0 ], &rcSelection, false ); + } + + // + // 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' ) ) + +_Use_decl_annotations_ +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 = std::min( sizeof( wszToken ) / sizeof( wszToken[0] ) - 1, int( pEnd - pToken ) ); + wcscpy_s( wszToken, nTokenLen, pToken ); + *pNumbers = ( float )wcstod( wszToken, nullptr ); + ++nWritten; + ++pNumbers; + pToken = pEnd; + } +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTEditBox::SetTextFloatArray( const float* pNumbers, int nCount ) +{ + WCHAR wszBuffer[512] = + { + 0 + }; + WCHAR wszTmp[64]; + + if( !pNumbers ) + 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 CDXUTEditBox::ResetCaretBlink() +{ + m_bCaretOn = true; + m_dfLastBlink = DXUTGetGlobalTimer()->GetAbsoluteTime(); +} + + +//====================================================================================== +// CUniBuffer +//====================================================================================== + +//-------------------------------------------------------------------------------------- +bool CUniBuffer::SetBufferSize( _In_ 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; + + auto pTempBuffer = new (std::nothrow) WCHAR[nAllocateSize]; + if( !pTempBuffer ) + return false; + + ZeroMemory( pTempBuffer, sizeof( WCHAR ) * nAllocateSize ); + + if( m_pwszBuffer ) + { + memcpy( 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 ) + (void)ScriptStringFree( &m_Analysis ); + + SCRIPT_CONTROL ScriptControl; // For uniscribe + SCRIPT_STATE ScriptState; // For uniscribe + ZeroMemory( &ScriptControl, sizeof( ScriptControl ) ); + ZeroMemory( &ScriptState, sizeof( ScriptState ) ); + +#pragma warning(push) +#pragma warning(disable : 4616 6309 6387 ) + HRESULT hr = ScriptApplyDigitSubstitution( nullptr, &ScriptControl, &ScriptState ); + if ( FAILED(hr) ) + return hr; +#pragma warning(pop) + + if( !m_pFontNode ) + return E_FAIL; + + HDC hDC = nullptr; + hr = ScriptStringAnalyse( hDC, + m_pwszBuffer, + (int)wcslen( m_pwszBuffer ) + 1, // nul is also analyzed. + (int)wcslen( m_pwszBuffer ) * 3 / 2 + 16, + -1, + SSA_BREAK | SSA_GLYPHS | SSA_FALLBACK | SSA_LINK, + 0, + &ScriptControl, + &ScriptState, + nullptr, + nullptr, + nullptr, + &m_Analysis ); + if( SUCCEEDED( hr ) ) + m_bAnalyseRequired = false; // Analysis is up-to-date + return hr; +} + + +//-------------------------------------------------------------------------------------- +CUniBuffer::CUniBuffer( _In_ int nInitialSize ) +{ + m_nBufferSize = 0; + m_pwszBuffer = nullptr; + m_bAnalyseRequired = true; + m_Analysis = nullptr; + m_pFontNode = nullptr; + + if( nInitialSize > 0 ) + SetBufferSize( nInitialSize ); +} + + +//-------------------------------------------------------------------------------------- +CUniBuffer::~CUniBuffer() +{ + delete[] m_pwszBuffer; + if( m_Analysis ) + (void)ScriptStringFree( &m_Analysis ); +} + + +//-------------------------------------------------------------------------------------- +WCHAR& CUniBuffer::operator[]( _In_ 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( _In_ int nIndex, _In_ WCHAR wChar ) +{ + assert( nIndex >= 0 ); + + if( nIndex < 0 || nIndex > (int)wcslen( m_pwszBuffer ) ) + return false; // invalid index + + // Check for maximum length allowed + if( GetTextSize() + 1 >= DXUT_MAX_EDITBOXLENGTH ) + return false; + + if( (int)wcslen( 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 + wcslen( 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( _In_ int nIndex ) +{ + if( !wcslen( m_pwszBuffer ) || nIndex < 0 || nIndex >= (int)wcslen( m_pwszBuffer ) ) + return false; // Invalid index + + MoveMemory( m_pwszBuffer + nIndex, m_pwszBuffer + nIndex + 1, sizeof( WCHAR ) * + ( wcslen( 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. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CUniBuffer::InsertString( int nIndex, const WCHAR* pStr, int nCount ) +{ + assert( nIndex >= 0 ); + if( nIndex < 0 ) + return false; + + if( nIndex > (int)wcslen( m_pwszBuffer ) ) + return false; // invalid index + + if( -1 == nCount ) + nCount = (int)wcslen( pStr ); + + // Check for maximum length allowed + if( GetTextSize() + nCount >= DXUT_MAX_EDITBOXLENGTH ) + return false; + + if( (int)wcslen( m_pwszBuffer ) + nCount >= m_nBufferSize ) + { + if( !SetBufferSize( (int)wcslen( m_pwszBuffer ) + nCount + 1 ) ) + return false; // out of memory + } + + MoveMemory( m_pwszBuffer + nIndex + nCount, m_pwszBuffer + nIndex, sizeof( WCHAR ) * + ( wcslen( m_pwszBuffer ) - nIndex + 1 ) ); + memcpy( m_pwszBuffer + nIndex, pStr, nCount * sizeof( WCHAR ) ); + m_bAnalyseRequired = true; + + return true; +} + + +//-------------------------------------------------------------------------------------- +bool CUniBuffer::SetText( _In_z_ LPCWSTR wszText ) +{ + assert( wszText ); + + size_t nRequired = 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool 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 ); + + if ( FAILED(hr) ) + { + *pX = 0; + return false; + } + + return true; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool 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 (FAILED(hr)) + { + *pCP = 0; *pnTrail = FALSE; + return false; + } + } + + // 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 > (int)wcslen( m_pwszBuffer ) && *pnTrail == FALSE ) + { + *pCP = (int)wcslen( m_pwszBuffer ); *pnTrail = TRUE; + } + + if (FAILED(hr)) + { + *pCP = 0; *pnTrail = FALSE; + return false; + } + return true; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; +} + + +//====================================================================================== +// DXUTBlendColor +//====================================================================================== + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void DXUTBlendColor::Init( DWORD defaultColor, DWORD disabledColor, DWORD hiddenColor ) +{ + for( int i = 0; i < MAX_CONTROL_STATES; i++ ) + { + States[ i ] = defaultColor; + } + + States[ DXUT_STATE_DISABLED ] = disabledColor; + States[ DXUT_STATE_HIDDEN ] = hiddenColor; + SetCurrent( hiddenColor ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void DXUTBlendColor::Blend( UINT iState, float fElapsedTime, float fRate ) +{ + XMFLOAT4 destColor = D3DCOLOR_TO_D3DCOLORVALUE( States[ iState ] ); + XMVECTOR clr1 = XMLoadFloat4( &destColor ); + XMVECTOR clr = XMLoadFloat4( &Current ); + clr = XMVectorLerp( clr, clr1, 1.0f - powf( fRate, 30 * fElapsedTime ) ); + XMStoreFloat4( &Current, clr ); +} + + +//-------------------------------------------------------------------------------------- +void DXUTBlendColor::SetCurrent( DWORD color ) +{ + Current = D3DCOLOR_TO_D3DCOLORVALUE( color ); +} + + +//====================================================================================== +// CDXUTElement +//====================================================================================== + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTElement::SetTexture( UINT texture, RECT* prcTexture, DWORD defaultTextureColor ) +{ + iTexture = texture; + + if( prcTexture ) + rcTexture = *prcTexture; + else + SetRectEmpty( &rcTexture ); + + TextureColor.Init( defaultTextureColor ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTElement::SetFont( UINT font, DWORD defaultFontColor, DWORD textFormat ) +{ + iFont = font; + dwTextFormat = textFormat; + + FontColor.Init( defaultFontColor ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTElement::Refresh() +{ + TextureColor.SetCurrent( TextureColor.States[ DXUT_STATE_HIDDEN ] ); + FontColor.SetCurrent( FontColor.States[ DXUT_STATE_HIDDEN ] ); +} diff --git a/DXUT11/Optional/DXUTgui.h b/DXUT11/Optional/DXUTgui.h new file mode 100644 index 0000000..870d1e6 --- /dev/null +++ b/DXUT11/Optional/DXUTgui.h @@ -0,0 +1,1125 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTgui.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +#include +#include + +#ifdef DXUT_AUTOLIB +#pragma comment( lib, "usp10.lib" ) +#endif + +//-------------------------------------------------------------------------------------- +// 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 )( _In_ UINT nEvent, _In_ int nControlID, _In_ CDXUTControl* pControl, + _In_opt_ 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( _In_ DWORD defaultColor, _In_ DWORD disabledColor = D3DCOLOR_ARGB( 200, 128, 128, 128 ), _In_ DWORD hiddenColor = 0 ); + void Blend( _In_ UINT iState, _In_ float fElapsedTime, _In_ float fRate = 0.7f ); + + DWORD States[ MAX_CONTROL_STATES ]; // Modulate colors for all possible control states + DirectX::XMFLOAT4 Current; + + void SetCurrent( DWORD color ); +}; + + +//----------------------------------------------------------------------------- +// Contains all the display tweakables for a sub-control +//----------------------------------------------------------------------------- +class CDXUTElement +{ +public: + void SetTexture( _In_ UINT texture, _In_ RECT* prcTexture, _In_ DWORD defaultTextureColor = D3DCOLOR_ARGB( 255, 255, 255, 255 ) ); + void SetFont( _In_ UINT font, _In_ DWORD defaultFontColor = D3DCOLOR_ARGB( 255, 255, 255, 255 ), DWORD textFormat = 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( _In_ CDXUTDialogResourceManager* pManager, _In_ bool bRegisterDialog = true ); + void Init( _In_ CDXUTDialogResourceManager* pManager, _In_ bool bRegisterDialog, + _In_z_ LPCWSTR pszControlTextureFilename ); + void Init( _In_ CDXUTDialogResourceManager* pManager, _In_ bool bRegisterDialog, + _In_z_ LPCWSTR szControlTextureResourceName, _In_ HMODULE hControlTextureResourceModule ); + + // Windows message handler + bool MsgProc( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); + + // Control creation + HRESULT AddStatic( _In_ int ID, _In_z_ LPCWSTR strText, _In_ int x, _In_ int y, _In_ int width, _In_ int height, _In_ bool bIsDefault=false, + _Out_opt_ CDXUTStatic** ppCreated = nullptr ); + HRESULT AddButton( _In_ int ID, _In_z_ LPCWSTR strText, _In_ int x, _In_ int y, _In_ int width, _In_ int height, _In_ UINT nHotkey=0, + _In_ bool bIsDefault=false, _Out_opt_ CDXUTButton** ppCreated = nullptr ); + HRESULT AddCheckBox( _In_ int ID, _In_z_ LPCWSTR strText, _In_ int x, _In_ int y, _In_ int width, _In_ int height, _In_ bool bChecked=false, + _In_ UINT nHotkey=0, _In_ bool bIsDefault=false, _Out_opt_ CDXUTCheckBox** ppCreated = nullptr ); + HRESULT AddRadioButton( _In_ int ID, _In_ UINT nButtonGroup, _In_z_ LPCWSTR strText, _In_ int x, _In_ int y, _In_ int width, + _In_ int height, _In_ bool bChecked=false, _In_ UINT nHotkey=0, _In_ bool bIsDefault=false, + _Out_opt_ CDXUTRadioButton** ppCreated = nullptr ); + HRESULT AddComboBox( _In_ int ID, _In_ int x, _In_ int y, _In_ int width, _In_ int height, _In_ UINT nHotKey=0, _In_ bool bIsDefault=false, + _Out_opt_ CDXUTComboBox** ppCreated = nullptr ); + HRESULT AddSlider( _In_ int ID, _In_ int x, _In_ int y, _In_ int width, _In_ int height, _In_ int min=0, _In_ int max=100, _In_ int value=50, + _In_ bool bIsDefault=false, _Out_opt_ CDXUTSlider** ppCreated = nullptr ); + // AddIMEEditBox has been renamed into DXUTguiIME.cpp as CDXUTIMEEditBox::CreateIMEEditBox + HRESULT AddEditBox( _In_ int ID, _In_z_ LPCWSTR strText, _In_ int x, _In_ int y, _In_ int width, _In_ int height, _In_ bool bIsDefault=false, + _Out_opt_ CDXUTEditBox** ppCreated = nullptr ); + HRESULT AddListBox( _In_ int ID, _In_ int x, _In_ int y, _In_ int width, _In_ int height, _In_ DWORD dwStyle=0, + _Out_opt_ CDXUTListBox** ppCreated = nullptr ); + HRESULT AddControl( _In_ CDXUTControl* pControl ); + HRESULT InitControl( _In_ CDXUTControl* pControl ); + + // Control retrieval + CDXUTStatic* GetStatic( _In_ int ID ) const + { + return reinterpret_cast( GetControl( ID, DXUT_CONTROL_STATIC ) ); + } + CDXUTButton* GetButton( _In_ int ID ) const + { + return reinterpret_cast( GetControl(ID, DXUT_CONTROL_BUTTON) ); + } + CDXUTCheckBox* GetCheckBox( _In_ int ID ) const + { + return reinterpret_cast( GetControl(ID, DXUT_CONTROL_CHECKBOX) ); + } + CDXUTRadioButton* GetRadioButton( _In_ int ID ) const + { + return reinterpret_cast( GetControl(ID, DXUT_CONTROL_RADIOBUTTON) ); + } + CDXUTComboBox* GetComboBox( _In_ int ID ) const + { + return reinterpret_cast( GetControl(ID, DXUT_CONTROL_COMBOBOX) ); + } + CDXUTSlider* GetSlider( _In_ int ID ) const + { + return reinterpret_cast( GetControl(ID, DXUT_CONTROL_SLIDER) ); + } + CDXUTEditBox* GetEditBox( _In_ int ID ) const + { + return reinterpret_cast( GetControl(ID, DXUT_CONTROL_EDITBOX) ); + } + CDXUTListBox* GetListBox( _In_ int ID ) const + { + return reinterpret_cast( GetControl(ID, DXUT_CONTROL_LISTBOX) ); + } + + CDXUTControl* GetControl( _In_ int ID ) const; + CDXUTControl* GetControl( _In_ int ID, _In_ UINT nControlType ) const; + CDXUTControl* GetControlAtPoint( _In_ const POINT& pt ) const; + + bool GetControlEnabled( _In_ int ID ) const; + void SetControlEnabled( _In_ int ID, _In_ bool bEnabled ); + + void ClearRadioButtonGroup( _In_ UINT nGroup ); + void ClearComboBox( _In_ int ID ); + + // Access the default display Elements used when adding new controls + HRESULT SetDefaultElement( _In_ UINT nControlType, _In_ UINT iElement, _In_ CDXUTElement* pElement ); + CDXUTElement* GetDefaultElement( _In_ UINT nControlType, _In_ UINT iElement ) const; + + // Methods called by controls + void SendEvent( _In_ UINT nEvent, _In_ bool bTriggeredByUser, _In_ CDXUTControl* pControl ); + void RequestFocus( _In_ CDXUTControl* pControl ); + + // Render helpers + HRESULT DrawRect( _In_ const RECT* pRect, _In_ DWORD color ); + HRESULT DrawSprite( _In_ CDXUTElement* pElement, _In_ const RECT* prcDest, _In_ float fDepth ); + HRESULT DrawSprite11( _In_ CDXUTElement* pElement, _In_ const RECT* prcDest, _In_ float fDepth ); + HRESULT CalcTextRect( _In_z_ LPCWSTR strText, _In_ CDXUTElement* pElement, _In_ const RECT* prcDest, _In_ int nCount = -1 ); + HRESULT DrawText( _In_z_ LPCWSTR strText, _In_ CDXUTElement* pElement, _In_ const RECT* prcDest, _In_ bool bShadow = false, + _In_ bool bCenter = false ); + + // Attributes + bool GetVisible() const { return m_bVisible; } + void SetVisible( _In_ bool bVisible ) { m_bVisible = bVisible; } + bool GetMinimized() const { return m_bMinimized; } + void SetMinimized( _In_ bool bMinimized ) {m_bMinimized = bMinimized; } + void SetBackgroundColors( _In_ DWORD colorAllCorners ) { SetBackgroundColors( colorAllCorners, colorAllCorners, colorAllCorners, colorAllCorners ); } + void SetBackgroundColors( _In_ DWORD colorTopLeft, _In_ DWORD colorTopRight, _In_ DWORD colorBottomLeft, _In_ DWORD colorBottomRight ); + void EnableCaption( _In_ bool bEnable ) { m_bCaption = bEnable; } + int GetCaptionHeight() const { return m_nCaptionHeight; } + void SetCaptionHeight( _In_ int nHeight ) { m_nCaptionHeight = nHeight; } + void SetCaptionText( _In_ const WCHAR* pwszText ) { wcscpy_s( m_wszCaption, sizeof( m_wszCaption ) / sizeof( m_wszCaption[0] ), pwszText ); } + void GetLocation( _Out_ POINT& Pt ) const + { + Pt.x = m_x; + Pt.y = m_y; + } + void SetLocation( _In_ int x, _In_ int y ) + { + m_x = x; + m_y = y; + } + void SetSize( _In_ int width, _In_ int height ) + { + m_width = width; + m_height = height; + } + int GetWidth() const { return m_width; } + int GetHeight() const { return m_height; } + + static void WINAPI SetRefreshTime( _In_ float fTime ) { s_fTimeRefresh = fTime; } + + static CDXUTControl* WINAPI GetNextControl( _In_ CDXUTControl* pControl ); + static CDXUTControl* WINAPI GetPrevControl( _In_ CDXUTControl* pControl ); + + void RemoveControl( _In_ int ID ); + void RemoveAllControls(); + + // Sets the callback used to notify the app of control events + void SetCallback( _In_ PCALLBACKDXUTGUIEVENT pCallback, _In_opt_ void* pUserContext = nullptr ); + void EnableNonUserEvents( _In_ bool bEnable ) { m_bNonUserEvents = bEnable; } + void EnableKeyboardInput( _In_ bool bEnable ) { m_bKeyboardInput = bEnable; } + void EnableMouseInput( _In_ bool bEnable ) { m_bMouseInput = bEnable; } + bool IsKeyboardInputEnabled() const { return m_bKeyboardInput; } + + // Device state notification + void Refresh(); + HRESULT OnRender( _In_ float fElapsedTime ); + + // Shared resource access. Indexed fonts and textures are shared among + // all the controls. + HRESULT SetFont( _In_ UINT index, _In_z_ LPCWSTR strFaceName, _In_ LONG height, _In_ LONG weight ); + DXUTFontNode* GetFont( _In_ UINT index ) const; + + HRESULT SetTexture( _In_ UINT index, _In_z_ LPCWSTR strFilename ); + HRESULT SetTexture( _In_ UINT index, _In_z_ LPCWSTR strResourceName, _In_ HMODULE hResourceModule ); + DXUTTextureNode* GetTexture( _In_ UINT index ) const; + + CDXUTDialogResourceManager* GetManager() const { return m_pManager; } + + static void WINAPI ClearFocus(); + void FocusDefaultControl(); + + bool m_bNonUserEvents; + bool m_bKeyboardInput; + bool m_bMouseInput; + +private: + int m_nDefaultControlID; + + static double s_fTimeRefresh; + double m_fTimeLastRefresh; + + // Initialize default Elements + void InitDefaultElements(); + + // Windows message handlers + void OnMouseMove( _In_ const POINT& pt ); + void OnMouseUp( _In_ const POINT& pt ); + + void SetNextDialog( _In_ CDXUTDialog* pNextDialog ); + + // Control events + bool OnCycleFocus( _In_ 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; + + DWORD m_colorTopLeft; + DWORD m_colorTopRight; + DWORD m_colorBottomLeft; + DWORD m_colorBottomRight; + + CDXUTDialogResourceManager* m_pManager; + PCALLBACKDXUTGUIEVENT m_pCallbackEvent; + void* m_pCallbackEventUserContext; + + std::vector m_Textures; // Index into m_TextureCache; + std::vector m_Fonts; // Index into m_FontCache; + + std::vector m_Controls; + std::vector 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; + ID3D11Texture2D* pTexture11; + ID3D11ShaderResourceView* pTexResView11; +}; + +struct DXUTFontNode +{ + WCHAR strFace[MAX_PATH]; + LONG nHeight; + LONG nWeight; +}; + +struct DXUTSpriteVertex +{ + DirectX::XMFLOAT3 vPos; + DirectX::XMFLOAT4 vColor; + DirectX::XMFLOAT2 vTex; +}; + + +//----------------------------------------------------------------------------- +// Manages shared resources of dialogs +//----------------------------------------------------------------------------- +class CDXUTDialogResourceManager +{ +public: + CDXUTDialogResourceManager(); + ~CDXUTDialogResourceManager(); + + bool MsgProc( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); + + // D3D11 specific + HRESULT OnD3D11CreateDevice( _In_ ID3D11Device* pd3dDevice, _In_ ID3D11DeviceContext* pd3d11DeviceContext ); + HRESULT OnD3D11ResizedSwapChain( _In_ ID3D11Device* pd3dDevice, _In_ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ); + void OnD3D11ReleasingSwapChain(); + void OnD3D11DestroyDevice(); + void StoreD3D11State( _In_ ID3D11DeviceContext* pd3dImmediateContext ); + void RestoreD3D11State( _In_ ID3D11DeviceContext* pd3dImmediateContext ); + void ApplyRenderUI11( _In_ ID3D11DeviceContext* pd3dImmediateContext ); + void ApplyRenderUIUntex11( _In_ ID3D11DeviceContext* pd3dImmediateContext ); + void BeginSprites11( ); + void EndSprites11( _In_ ID3D11Device* pd3dDevice, _In_ ID3D11DeviceContext* pd3dImmediateContext ); + + ID3D11Device* GetD3D11Device() const { return m_pd3d11Device; } + ID3D11DeviceContext* GetD3D11DeviceContext() const { return m_pd3d11DeviceContext; } + + DXUTFontNode* GetFontNode( _In_ size_t iIndex ) const { return m_FontCache[ iIndex ]; } + DXUTTextureNode* GetTextureNode( _In_ size_t iIndex ) const { return m_TextureCache[ iIndex ]; } + + int AddFont( _In_z_ LPCWSTR strFaceName, _In_ LONG height, _In_ LONG weight ); + int AddTexture( _In_z_ LPCWSTR strFilename ); + int AddTexture( _In_z_ LPCWSTR strResourceName, _In_ HMODULE hResourceModule ); + + bool RegisterDialog( _In_ CDXUTDialog* pDialog ); + void UnregisterDialog( _In_ CDXUTDialog* pDialog ); + void EnableKeyboardInputForAllDialogs(); + + // Shared between all dialogs + + // 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; + std::vector m_SpriteVertices; + + UINT m_nBackBufferWidth; + UINT m_nBackBufferHeight; + + std::vector m_Dialogs; // Dialogs registered + +protected: + // D3D11 specific + ID3D11Device* m_pd3d11Device; + ID3D11DeviceContext* m_pd3d11DeviceContext; + HRESULT CreateTexture11( _In_ UINT index ); + + std::vector m_TextureCache; // Shared textures + std::vector m_FontCache; // Shared fonts +}; + + +//----------------------------------------------------------------------------- +// Base class for controls +//----------------------------------------------------------------------------- +class CDXUTControl +{ +public: + CDXUTControl( _In_opt_ CDXUTDialog* pDialog = nullptr ); + virtual ~CDXUTControl(); + + virtual HRESULT OnInit() { return S_OK; } + virtual void Refresh(); + virtual void Render( _In_ float fElapsedTime ) { UNREFERENCED_PARAMETER(fElapsedTime); } + + // Windows message handler + virtual bool MsgProc( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) + { + UNREFERENCED_PARAMETER(uMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + return false; + } + + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) + { + UNREFERENCED_PARAMETER(uMsg); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + return false; + } + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) + { + UNREFERENCED_PARAMETER(uMsg); + UNREFERENCED_PARAMETER(pt); + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(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( _In_ const POINT& pt ) { return PtInRect( &m_rcBoundingBox, pt ) != 0; } + + virtual void SetEnabled( _In_ bool bEnabled ) { m_bEnabled = bEnabled; } + virtual bool GetEnabled() const { return m_bEnabled; } + virtual void SetVisible( _In_ bool bVisible ) { m_bVisible = bVisible; } + virtual bool GetVisible() const { return m_bVisible; } + + UINT GetType() const { return m_Type; } + + int GetID() const { return m_ID; } + void SetID( _In_ int ID ) { m_ID = ID; } + + void SetLocation( _In_ int x, _In_ int y ) + { + m_x = x; + m_y = y; + UpdateRects(); + } + void SetSize( int width, int height ) + { + m_width = width; + m_height = height; + UpdateRects(); + } + + void SetHotkey( _In_ UINT nHotkey ) { m_nHotkey = nHotkey; } + UINT GetHotkey() const { return m_nHotkey; } + + void SetUserData( _In_opt_ void* pUserData ) { m_pUserData = pUserData; } + void* GetUserData() const { return m_pUserData; } + + virtual void SetTextColor( _In_ DWORD Color ); + CDXUTElement* GetElement( _In_ UINT iElement ) const { return m_Elements[ iElement ]; } + HRESULT SetElement( _In_ UINT iElement, _In_ 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 + + std::vector 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( _In_opt_ CDXUTDialog* pDialog = nullptr ); + + virtual void Render( _In_ float fElapsedTime ) override; + virtual bool ContainsPoint( _In_ const POINT& pt ) override + { + UNREFERENCED_PARAMETER( pt ); + return false; + } + + HRESULT GetTextCopy( _Out_writes_(bufferCount) LPWSTR strDest, _In_ UINT bufferCount ) const; + LPCWSTR GetText() const { return m_strText; } + HRESULT SetText( _In_z_ LPCWSTR strText ); + +protected: + WCHAR m_strText[MAX_PATH]; // Window text +}; + + +//----------------------------------------------------------------------------- +// Button control +//----------------------------------------------------------------------------- +class CDXUTButton : public CDXUTStatic +{ +public: + CDXUTButton( _In_opt_ CDXUTDialog* pDialog = nullptr ); + + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual void OnHotkey() override + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this ); + } + + virtual bool ContainsPoint( _In_ const POINT& pt ) override + { + return PtInRect( &m_rcBoundingBox, pt ) != 0; + } + virtual bool CanHaveFocus() override + { + return ( m_bVisible && m_bEnabled ); + } + + virtual void Render( _In_ float fElapsedTime ) override; + +protected: + bool m_bPressed; +}; + + +//----------------------------------------------------------------------------- +// CheckBox control +//----------------------------------------------------------------------------- +class CDXUTCheckBox : public CDXUTButton +{ +public: + CDXUTCheckBox( _In_opt_ CDXUTDialog* pDialog = nullptr ); + + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual void OnHotkey() override + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + SetCheckedInternal( !m_bChecked, true ); + } + + virtual bool ContainsPoint( _In_ const POINT& pt ) override; + virtual void UpdateRects() override; + + virtual void Render( _In_ float fElapsedTime ) override; + + bool GetChecked() const { return m_bChecked; } + void SetChecked( _In_ bool bChecked ) { SetCheckedInternal( bChecked, false ); } + +protected: + virtual void SetCheckedInternal( _In_ bool bChecked, _In_ bool bFromInput ); + + bool m_bChecked; + RECT m_rcButton; + RECT m_rcText; +}; + + +//----------------------------------------------------------------------------- +// RadioButton control +//----------------------------------------------------------------------------- +class CDXUTRadioButton : public CDXUTCheckBox +{ +public: + CDXUTRadioButton( _In_opt_ CDXUTDialog* pDialog = nullptr ); + + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual void OnHotkey() override + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + SetCheckedInternal( true, true, true ); + } + + void SetChecked( _In_ bool bChecked, _In_ bool bClearGroup=true ) { SetCheckedInternal( bChecked, bClearGroup, false ); } + void SetButtonGroup( _In_ UINT nButtonGroup ) { m_nButtonGroup = nButtonGroup; } + UINT GetButtonGroup() const { return m_nButtonGroup; } + +protected: + virtual void SetCheckedInternal( _In_ bool bChecked, _In_ bool bClearGroup, _In_ bool bFromInput ); + UINT m_nButtonGroup; +}; + + +//----------------------------------------------------------------------------- +// Scrollbar control +//----------------------------------------------------------------------------- +class CDXUTScrollBar : public CDXUTControl +{ +public: + CDXUTScrollBar( _In_opt_ CDXUTDialog* pDialog = nullptr ); + virtual ~CDXUTScrollBar(); + + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool MsgProc( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + + virtual void Render( _In_ float fElapsedTime ) override; + virtual void UpdateRects() override; + + void SetTrackRange( _In_ int nStart, _In_ int nEnd ); + int GetTrackPos() const { return m_nPosition; } + void SetTrackPos( _In_ int nPosition ) + { + m_nPosition = nPosition; + Cap(); + UpdateThumbRect(); + } + int GetPageSize() const { return m_nPageSize; } + void SetPageSize( _In_ int nPageSize ) + { + m_nPageSize = nPageSize; + Cap(); + UpdateThumbRect(); + } + + void Scroll( _In_ int nDelta ); // Scroll by nDelta items (plus or minus) + void ShowItem( _In_ 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( _In_opt_ CDXUTDialog* pDialog = nullptr ); + virtual ~CDXUTListBox(); + + virtual HRESULT OnInit() override + { + return m_pDialog->InitControl( &m_ScrollBar ); + } + virtual bool CanHaveFocus() override + { + return ( m_bVisible && m_bEnabled ); + } + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool MsgProc( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + + virtual void Render( _In_ float fElapsedTime ) override; + virtual void UpdateRects() override; + + DWORD GetStyle() const { return m_dwStyle; } + size_t GetSize() const { return m_Items.size(); } + void SetStyle( _In_ DWORD dwStyle ) { m_dwStyle = dwStyle; } + int GetScrollBarWidth() const{ return m_nSBWidth; } + void SetScrollBarWidth( _In_ int nWidth ) + { + m_nSBWidth = nWidth; + UpdateRects(); + } + void SetBorder( _In_ int nBorder, _In_ int nMargin ) + { + m_nBorder = nBorder; + m_nMargin = nMargin; + } + HRESULT AddItem( _In_z_ const WCHAR* wszText, _In_opt_ void* pData ); + HRESULT InsertItem( _In_ int nIndex, _In_z_ const WCHAR* wszText, _In_opt_ void* pData ); + void RemoveItem( _In_ int nIndex ); + void RemoveAllItems(); + + DXUTListBoxItem* GetItem( _In_ int nIndex ) const; + int GetSelectedIndex( _In_ int nPreviousSelected = -1 ) const; + DXUTListBoxItem* GetSelectedItem( _In_ int nPreviousSelected = -1 ) const + { + return GetItem( GetSelectedIndex( nPreviousSelected ) ); + } + void SelectItem( _In_ 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 + + std::vector m_Items; +}; + + +//----------------------------------------------------------------------------- +// ComboBox control +//----------------------------------------------------------------------------- +struct DXUTComboBoxItem +{ + WCHAR strText[256]; + void* pData; + + RECT rcActive; + bool bVisible; +}; + +class CDXUTComboBox : public CDXUTButton +{ +public: + CDXUTComboBox( _In_opt_ CDXUTDialog* pDialog = nullptr ); + virtual ~CDXUTComboBox(); + + virtual void SetTextColor( _In_ DWORD Color ) override; + virtual HRESULT OnInit() override + { + return m_pDialog->InitControl( &m_ScrollBar ); + } + + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual void OnHotkey() override; + + virtual bool CanHaveFocus() override + { + return ( m_bVisible && m_bEnabled ); + } + virtual void OnFocusOut() override; + virtual void Render( _In_ float fElapsedTime ) override; + + virtual void UpdateRects() override; + + HRESULT AddItem( _In_z_ const WCHAR* strText, _In_opt_ void* pData ); + void RemoveAllItems(); + void RemoveItem( _In_ UINT index ); + bool ContainsItem( _In_z_ const WCHAR* strText, _In_ UINT iStart=0 ); + int FindItem( _In_z_ const WCHAR* strText, _In_ UINT iStart=0 ) const; + void* GetItemData( _In_z_ const WCHAR* strText ) const; + void* GetItemData( _In_ int nIndex ) const; + void SetDropHeight( _In_ UINT nHeight ) + { + m_nDropHeight = nHeight; + UpdateRects(); + } + int GetScrollBarWidth() const { return m_nSBWidth; } + void SetScrollBarWidth( _In_ int nWidth ) + { + m_nSBWidth = nWidth; + UpdateRects(); + } + + int GetSelectedIndex() const { return m_iSelected; } + void* GetSelectedData() const; + DXUTComboBoxItem* GetSelectedItem() const; + + UINT GetNumItems() { return static_cast( m_Items.size() ); } + DXUTComboBoxItem* GetItem( _In_ UINT index ) { return m_Items[ index ]; } + + HRESULT SetSelectedByIndex( _In_ UINT index ); + HRESULT SetSelectedByText( _In_z_ const WCHAR* strText ); + HRESULT SetSelectedByData( _In_ 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; + + std::vector m_Items; +}; + + +//----------------------------------------------------------------------------- +// Slider control +//----------------------------------------------------------------------------- +class CDXUTSlider : public CDXUTControl +{ +public: + CDXUTSlider( _In_opt_ CDXUTDialog* pDialog = nullptr ); + + virtual bool ContainsPoint( _In_ const POINT& pt ) override; + virtual bool CanHaveFocus() override + { + return ( m_bVisible && m_bEnabled ); + } + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + + virtual void UpdateRects() override; + + virtual void Render( _In_ float fElapsedTime ) override; + + void SetValue( int nValue ) { SetValueInternal( nValue, false ); } + int GetValue() const { return m_nValue; } + + void GetRange( _Out_ int& nMin, _Out_ int& nMax ) const + { + nMin = m_nMin; + nMax = m_nMax; + } + void SetRange( _In_ int nMin, _In_ int nMax ); + +protected: + void SetValueInternal( _In_ int nValue, _In_ bool bFromInput ); + int ValueFromPos( _In_ 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( _In_ int nInitialSize = 1 ); + ~CUniBuffer(); + + size_t GetBufferSize() const { return m_nBufferSize; } + bool SetBufferSize( _In_ int nSize ); + int GetTextSize() const { return (int)wcslen( m_pwszBuffer ); } + const WCHAR* GetBuffer() const + { + return m_pwszBuffer; + } + const WCHAR& operator[]( _In_ int n ) const + { + return m_pwszBuffer[n]; + } + WCHAR& operator[]( _In_ int n ); + DXUTFontNode* GetFontNode() const { return m_pFontNode; } + void SetFontNode( _In_opt_ DXUTFontNode* pFontNode ) { m_pFontNode = pFontNode; } + void Clear(); + + bool InsertChar( _In_ int nIndex, _In_ WCHAR wChar ); + // Inserts the char at specified index. If nIndex == -1, insert to the end. + + bool RemoveChar( _In_ int nIndex ); + // Removes the char at specified index. If nIndex == -1, remove the last char. + + bool InsertString( _In_ int nIndex, _In_z_ const WCHAR* pStr, _In_ 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( _In_z_ LPCWSTR wszText ); + + // Uniscribe + bool CPtoX( _In_ int nCP, _In_ bool bTrail, _Out_ int* pX ); + bool XtoCP( _In_ int nX, _Out_ int* pCP, _Out_ int* pnTrail ); + void GetPriorItemPos( _In_ int nCP, _Out_ int* pPrior ); + void GetNextItemPos( _In_ int nCP, _Out_ 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 +}; + + +//----------------------------------------------------------------------------- +// EditBox control +//----------------------------------------------------------------------------- +class CDXUTEditBox : public CDXUTControl +{ +public: + CDXUTEditBox( _In_opt_ CDXUTDialog* pDialog = nullptr ); + virtual ~CDXUTEditBox(); + + virtual bool HandleKeyboard( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool MsgProc( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual void UpdateRects() override; + virtual bool CanHaveFocus() override + { + return ( m_bVisible && m_bEnabled ); + } + virtual void Render( _In_ float fElapsedTime ) override; + virtual void OnFocusIn() override; + + void SetText( _In_z_ LPCWSTR wszText, _In_ bool bSelected = false ); + LPCWSTR GetText() const { return m_Buffer.GetBuffer(); } + size_t GetTextLength() const { return m_Buffer.GetTextSize(); } // Returns text length in chars excluding nul. + HRESULT GetTextCopy( _Out_writes_(bufferCount) LPWSTR strDest, _In_ UINT bufferCount ) const; + void ClearText(); + + virtual void SetTextColor( _In_ DWORD Color ) override { m_TextColor = Color; } // Text color + void SetSelectedTextColor( _In_ DWORD Color ) { m_SelTextColor = Color; } // Selected text color + void SetSelectedBackColor( _In_ DWORD Color ) { m_SelBkColor = Color; } // Selected background color + void SetCaretColor( _In_ DWORD Color ) { m_CaretColor = Color; } // Caret color + void SetBorderWidth( _In_ int nBorder ) + { + m_nBorder = nBorder; + UpdateRects(); + } // Border of the window + void SetSpacing( _In_ int nSpacing ) + { + m_nSpacing = nSpacing; + UpdateRects(); + } + void ParseFloatArray( _In_reads_(nCount) float* pNumbers, _In_ int nCount ); + void SetTextFloatArray( _In_reads_(nCount) const float* pNumbers, _In_ int nCount ); + +protected: + void PlaceCaret( _In_ 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 + DWORD m_TextColor; // Text color + DWORD m_SelTextColor; // Selected text color + DWORD m_SelBkColor; // Selected background color + DWORD 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. +}; + + +//----------------------------------------------------------------------------- +void BeginText11(); +void DrawText11DXUT( _In_ ID3D11Device* pd3dDevice, _In_ ID3D11DeviceContext* pd3d11DeviceContext, + _In_z_ LPCWSTR strText, _In_ const RECT& rcScreen, _In_ DirectX::XMFLOAT4 vFontColor, + _In_ float fBBWidth, _In_ float fBBHeight, _In_ bool bCenter ); +void EndText11( _In_ ID3D11Device* pd3dDevice, _In_ ID3D11DeviceContext* pd3d11DeviceContext ); diff --git a/DXUT11/Optional/DXUTguiIME.cpp b/DXUT11/Optional/DXUTguiIME.cpp new file mode 100644 index 0000000..c9e7734 --- /dev/null +++ b/DXUT11/Optional/DXUTguiIME.cpp @@ -0,0 +1,1002 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTguiIME.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTgui.h" +#include "DXUTsettingsDlg.h" +#include "DXUTres.h" +#include "DXUTgui.h" +#include "DXUTguiIME.h" + +#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 + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTIMEEditBox::CreateIMEEditBox( CDXUTDialog* pDialog, int ID, LPCWSTR strText, int x, int y, int width, + int height, bool bIsDefault, CDXUTIMEEditBox** ppCreated ) +{ + auto pEditBox = new (std::nothrow) CDXUTIMEEditBox( pDialog ); + + if( ppCreated ) + *ppCreated = pEditBox; + + if( !pEditBox ) + 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( _In_ 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( _In_opt_ 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( _In_ 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( _In_ 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, nullptr, 0, 0, PM_NOREMOVE ) ) + { + if( !GetMessageW( &msg, nullptr, 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(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTIMEEditBox::StaticMsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + UNREFERENCED_PARAMETER(hWnd); + UNREFERENCED_PARAMETER(wParam); + + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool CDXUTIMEEditBox::HandleMouse( UINT uMsg, const POINT& pt, WPARAM wParam, LPARAM lParam ) +{ + if( !m_bEnabled || !m_bVisible ) + return false; + + switch( uMsg ) + { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + { + auto pFont = m_pDialog->GetFont( m_Elements[ 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 += (int)wcslen( 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 ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTIMEEditBox::RenderCandidateReadingWindow( bool bReading ) +{ + RECT rc; + UINT nNumEntries = bReading ? 4 : MAX_CANDLIST; + int nX, nXFirst, nXComp; + m_Buffer.CPtoX( m_nCaret, FALSE, &nX ); + m_Buffer.CPtoX( m_nFirstVisible, FALSE, &nXFirst ); + + DWORD TextColor, TextBkColor, SelTextColor, SelBkColor; + 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[ 1 ], &rc ); + nWidthRequired = std::max( nWidthRequired, rc.right - rc.left ); + nSingleLineHeight = std::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[ 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"%ls ", ImeUi_GetCandidate( i ) ); + // If this is the selected entry, mark its char position. + if( ImeUi_GetCandidateSelection() == i ) + { + s_CandList.nFirstSelected = (int)wcslen( wszCand ); + s_CandList.nHoriSelectedLen = (int)wcslen( wszEntry ) - 1; // Minus space + } + wcscat_s( wszCand, 256, wszEntry ); + } + wszCand[wcslen( wszCand ) - 1] = L'\0'; // Remove the last space + s_CandList.HoriCand.SetText( wszCand ); + + m_pDialog->CalcTextRect( s_CandList.HoriCand.GetBuffer(), m_Elements[ 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[ 1 ]->FontColor.SetCurrent( SelTextColor ); + } + else + m_Elements[ 1 ]->FontColor.SetCurrent( TextColor ); + + m_pDialog->DrawText( ImeUi_GetCandidate( i ), m_Elements[ 1 ], &rc ); + + rc.top += nSingleLineHeight; + } + } + else + { + // Horizontal candidate window + m_Elements[ 1 ]->FontColor.SetCurrent( TextColor ); + if( bReading ) + m_pDialog->DrawText( s_wszReadingString, m_Elements[ 1 ], &rc ); + else + m_pDialog->DrawText( s_CandList.HoriCand.GetBuffer(), m_Elements[ 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[ 1 ]->FontColor.SetCurrent( SelTextColor ); + m_pDialog->DrawText( s_CandList.HoriCand.GetBuffer() + s_CandList.nFirstSelected, + m_Elements[ 1 ], &rc, false ); + } + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::RenderComposition() +{ + + 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 ); + auto pElement = m_Elements[ 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; + + + DWORD TextColor = m_CompColor; + // Render the window and string. + // If the string is too long, we must wrap the line. + pElement->FontColor.SetCurrent( 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 = std::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[ 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.SetCurrent( TextColor ); + m_pDialog->DrawText( pwszComp, pElement, &rc, false ); + + // 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 ) + { + DWORD 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.SetCurrent( m_CompTargetColor ); + bkColor = m_CompTargetBkColor; + } + else if( *pAttr == ATTR_TARGET_NOTCONVERTED ) + { + pElement->FontColor.SetCurrent( 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( _In_ float fElapsedTime ) +{ + auto pElement = m_Elements[ 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.SetCurrent( m_IndicatorImeColor ); + RECT rcCalc = + { + 0, 0, 0, 0 + }; + // If IME system is off, draw English indicator. + const WCHAR* pwszIndicator = ImeUi_IsEnabled() ? ImeUi_GetIndicatior() : L"En"; + + m_pDialog->CalcTextRect( pwszIndicator, pElement, &rcCalc ); + m_pDialog->DrawText( pwszIndicator, pElement, &rc ); +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::Render( _In_ 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[ 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 ); + + auto 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(); + + // 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( true ); + else if( ImeUi_IsShowCandListWindow() ) + // Candidate list window + RenderCandidateReadingWindow( false ); + } +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::SetImeEnableFlag( _In_ bool bFlag ) +{ + s_bImeFlag = bFlag; +} + + +//-------------------------------------------------------------------------------------- +void CDXUTIMEEditBox::Initialize( _In_ HWND hWnd ) +{ + ImeUiCallback_DrawRect = nullptr; + ImeUiCallback_Malloc = malloc; + ImeUiCallback_Free = free; + ImeUiCallback_DrawFans = nullptr; + + ImeUi_Initialize( hWnd ); + + s_CompString.SetBufferSize( MAX_COMPSTRING_SIZE ); + ImeUi_EnableIme( true ); +} + + diff --git a/DXUT11/Optional/DXUTguiIME.h b/DXUT11/Optional/DXUTguiIME.h new file mode 100644 index 0000000..9ceb59f --- /dev/null +++ b/DXUT11/Optional/DXUTguiIME.h @@ -0,0 +1,141 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTguiIME.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +#include +#include +#include "ImeUi.h" + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +class CDXUTIMEEditBox; + + +//----------------------------------------------------------------------------- +// IME-enabled EditBox control +//----------------------------------------------------------------------------- +#define MAX_COMPSTRING_SIZE 256 + + +class CDXUTIMEEditBox : public CDXUTEditBox +{ +public: + + static HRESULT CreateIMEEditBox( _In_ CDXUTDialog* pDialog, _In_ int ID, _In_z_ LPCWSTR strText, _In_ int x, _In_ int y, _In_ int width, + _In_ int height, _In_ bool bIsDefault=false, _Outptr_opt_ CDXUTIMEEditBox** ppCreated=nullptr ); + + CDXUTIMEEditBox( _In_opt_ CDXUTDialog* pDialog = nullptr ); + virtual ~CDXUTIMEEditBox(); + + static void InitDefaultElements( _In_ CDXUTDialog* pDialog ); + + static void WINAPI Initialize( _In_ HWND hWnd ); + static void WINAPI Uninitialize(); + + static HRESULT WINAPI StaticOnCreateDevice(); + static bool WINAPI StaticMsgProc( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); + + static void WINAPI SetImeEnableFlag( _In_ bool bFlag ); + + virtual void Render( _In_ float fElapsedTime ) override; + virtual bool MsgProc( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual bool HandleMouse( _In_ UINT uMsg, _In_ const POINT& pt, _In_ WPARAM wParam, _In_ LPARAM lParam ) override; + virtual void UpdateRects() override; + virtual void OnFocusIn() override; + virtual void OnFocusOut() override; + + void PumpMessage(); + + virtual void RenderCandidateReadingWindow( _In_ bool bReading ); + virtual void RenderComposition(); + virtual void RenderIndicator( _In_ float fElapsedTime ); + +protected: + static void WINAPI EnableImeSystem( _In_ bool bEnable ); + + static WORD WINAPI GetLanguage() + { + return ImeUi_GetLanguage(); + } + static WORD WINAPI GetPrimaryLanguage() + { + return ImeUi_GetPrimaryLanguage(); + } + static void WINAPI SendKey( _In_ BYTE nVirtKey ); + static DWORD WINAPI GetImeId( _In_ 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 + DWORD m_ReadingColor; // Reading string color + DWORD m_ReadingWinColor; // Reading window color + DWORD m_ReadingSelColor; // Selected character in reading string + DWORD m_ReadingSelBkColor; // Background color for selected char in reading str + DWORD m_CandidateColor; // Candidate string color + DWORD m_CandidateWinColor; // Candidate window color + DWORD m_CandidateSelColor; // Selected candidate string color + DWORD m_CandidateSelBkColor; // Selected candidate background color + DWORD m_CompColor; // Composition string color + DWORD m_CompWinColor; // Composition string window color + DWORD m_CompCaretColor; // Composition string caret color + DWORD m_CompTargetColor; // Composition string target converted color + DWORD m_CompTargetBkColor; // Composition string target converted background + DWORD m_CompTargetNonColor; // Composition string target non-converted color + DWORD m_CompTargetNonBkColor;// Composition string target non-converted background + DWORD m_IndicatorImeColor; // Indicator text color for IME + DWORD m_IndicatorEngColor; // Indicator text color for English + DWORD 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 +}; diff --git a/DXUT11/Optional/DXUTres.cpp b/DXUT11/Optional/DXUTres.cpp new file mode 100644 index 0000000..faba395 --- /dev/null +++ b/DXUT11/Optional/DXUTres.cpp @@ -0,0 +1,8315 @@ +//---------------------------------------------------------------------------- +// File: DXUTRes.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//----------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTres.h" + +#include "DDSTextureLoader.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; + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT WINAPI DXUTCreateGUITextureFromInternalArray(ID3D11Device* pd3dDevice, ID3D11Texture2D** ppTexture) +{ + if ( !ppTexture ) + return E_INVALIDARG; + + ID3D11Resource *pRes = nullptr; + HRESULT hr = DirectX::CreateDDSTextureFromMemory( pd3dDevice, + reinterpret_cast(g_DXUTGUITextureSrcData), g_DXUTGUITextureSrcDataSizeInBytes, + &pRes, nullptr ); + if ( FAILED(hr) ) + return hr; + + DXUT_SetDebugName( pRes, "DXUT" ); + + hr = pRes->QueryInterface( __uuidof( ID3D11Texture2D ), (LPVOID*)ppTexture ); + SAFE_RELEASE( pRes ); + + return hr; +} diff --git a/DXUT11/Optional/DXUTres.h b/DXUT11/Optional/DXUTres.h new file mode 100644 index 0000000..ffd1de2 --- /dev/null +++ b/DXUT11/Optional/DXUTres.h @@ -0,0 +1,17 @@ +//---------------------------------------------------------------------------- +// File: dxutres.h +// +// Functions to create DXUT media from arrays in memory +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//----------------------------------------------------------------------------- +#pragma once + +HRESULT WINAPI DXUTCreateGUITextureFromInternalArray( _In_ ID3D11Device* pd3dDevice, _Outptr_ ID3D11Texture2D** ppTexture ); diff --git a/DXUT11/Optional/DXUTsettingsdlg.cpp b/DXUT11/Optional/DXUTsettingsdlg.cpp new file mode 100644 index 0000000..7fe0f12 --- /dev/null +++ b/DXUT11/Optional/DXUTsettingsdlg.cpp @@ -0,0 +1,1587 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTSettingsDlg.cpp +// +// Dialog for selection of device settings +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "DXUTgui.h" +#include "DXUTsettingsDlg.h" + +//-------------------------------------------------------------------------------------- +// Internal functions forward declarations +//-------------------------------------------------------------------------------------- +const WCHAR* DXUTPresentIntervalToString( _In_ UINT pi ); +const WCHAR* DXUTDeviceTypeToString( _In_ D3D_DRIVER_TYPE devType ); +const WCHAR* DXUTVertexProcessingTypeToString( _In_ 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_bActive( false ), + m_pActiveDialog( nullptr ) +{ + 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; + m_Levels[6] = D3D_FEATURE_LEVEL_11_1; +#ifdef USE_DIRECT3D11_3 + m_Levels[7] = D3D_FEATURE_LEVEL_12_0; + m_Levels[8] = D3D_FEATURE_LEVEL_12_1; +#endif +} + + +//-------------------------------------------------------------------------------------- +CD3DSettingsDlg::~CD3DSettingsDlg() +{ + // Release the memory used to hold the D3D11 refresh data in the combo box + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + if( pComboBox ) + for( UINT i = 0; i < pComboBox->GetNumItems(); ++i ) + { + auto pRate = reinterpret_cast( pComboBox->GetItemData( i ) ); + delete pRate; + } +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::Init( _In_ 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(); +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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(); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 + auto pElement = m_Dialog.GetDefaultElement( DXUT_CONTROL_STATIC, 0 ); + if( pElement ) + { + pElement->dwTextFormat = DT_VCENTER | DT_RIGHT; + + // Title + CDXUTStatic* pStatic = nullptr; + 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_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, 400, 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, 400, 23 ); + + // DXUTSETTINGSDLG_DEVICE_TYPE + m_Dialog.AddStatic( DXUTSETTINGSDLG_STATIC, L"Render Device", 10, 110, 180, 23 ); + m_Dialog.AddComboBox( DXUTSETTINGSDLG_DEVICE_TYPE, 200, 110, 400, 23 ); + + // DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN + 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_RES_SHOW_ALL + m_Dialog.AddCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL, L"Show All Aspect Ratios", 420, 200, 200, 23, false ); + + // 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, 400, 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, 400, 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, 400, 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, 400, 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, 400, 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, 400, 23); + + auto pPresentIntervalComboBox = m_Dialog.GetComboBox(DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL); + if (pPresentIntervalComboBox) + { + pPresentIntervalComboBox->AddItem(L"On", ULongToPtr(1)); + pPresentIntervalComboBox->AddItem(L"Off", ULongToPtr(0)); + } + + // 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 = nullptr; + if ( SUCCEEDED(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 + if ( SUCCEEDED(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 ); +} + + +//-------------------------------------------------------------------------------------- +// Changes the UI defaults to the current device settings +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::Refresh() +{ + g_DeviceSettings = DXUTGetDeviceSettings(); + + auto pD3DEnum = DXUTGetD3D11Enumeration(); + + // Fill the UI with the current settings + AddD3D11DeviceType( g_DeviceSettings.d3d11.DriverType ); + + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, true ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_FULLSCREEN, (g_DeviceSettings.d3d11.DriverType != D3D_DRIVER_TYPE_WARP) ); + + SetWindowed( FALSE != g_DeviceSettings.d3d11.sd.Windowed ); + auto 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 ); + + auto pBestDeviceSettingsCombo = pD3DEnum->GetDeviceSettingsCombo( + g_DeviceSettings.d3d11.AdapterOrdinal, g_DeviceSettings.d3d11.sd.BufferDesc.Format, + ( g_DeviceSettings.d3d11.sd.Windowed != 0 ) ); + + if( !pBestDeviceSettingsCombo ) + return DXUT_ERR_MSGBOX( L"GetDeviceSettingsCombo", E_INVALIDARG ); + + CDXUTComboBox *pFeatureLevelBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL ); + pFeatureLevelBox->RemoveAllItems(); + + D3D_FEATURE_LEVEL clampFL; + if ( g_DeviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_WARP ) + clampFL = DXUTGetD3D11Enumeration()->GetWARPFeaturevel(); + else if ( g_DeviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) + clampFL = DXUTGetD3D11Enumeration()->GetREFFeaturevel(); + else + clampFL = pBestDeviceSettingsCombo->pDeviceInfo->MaxLevel; + + for (int fli = 0; fli < TOTAL_FEATURE_LEVELS; fli++) + { + if (m_Levels[fli] >= g_DeviceSettings.MinimumFeatureLevel + && m_Levels[fli] <= clampFL) + { + AddD3D11FeatureLevel( m_Levels[fli] ); + } + } + pFeatureLevelBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.DeviceFeatureLevel ) ); + + // Get the adapters list from CD3D11Enumeration object + auto pAdapterInfoList = pD3DEnum->GetAdapterInfoList(); + + if( pAdapterInfoList->empty() ) + return DXUT_ERR_MSGBOX( L"CD3DSettingsDlg::OnCreatedDevice", DXUTERR_NOCOMPATIBLEDEVICES ); + + auto pAdapterCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + pAdapterCombo->RemoveAllItems(); + + // Add adapters + for( auto it = pAdapterInfoList->cbegin(); it != pAdapterInfoList->cend(); ++it ) + { + AddAdapter( (*it)->szUniqueDescription, (*it)->AdapterOrdinal ); + } + + pAdapterCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.AdapterOrdinal ) ); + + // DXUTSETTINGSDLG_D3D11_RESOLUTION + HRESULT hr = UpdateD3D11Resolutions(); + if ( FAILED(hr) ) + return hr; + + // DXUTSETTINGSDLG_D3D11_REFRESH_RATE + hr = UpdateD3D11RefreshRates(); + if ( FAILED(hr) ) + return hr; + + // Windowed mode + bool bWindowed = IsWindowed(); + + // Backbuffer Format/Driver Type + auto pAdapterInfo = GetCurrentD3D11AdapterInfo(); + if (pAdapterInfo) + { + auto pBackBufferFormatComboBox = m_Dialog.GetComboBox(DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT); + pBackBufferFormatComboBox->RemoveAllItems(); + + for (size_t idc = 0; idc < pAdapterInfo->deviceSettingsComboList.size(); idc++) + { + auto pDeviceCombo = pAdapterInfo->deviceSettingsComboList[idc]; + if ((pDeviceCombo->Windowed == TRUE) == bWindowed) + { + AddD3D11BackBufferFormat(pDeviceCombo->BackBufferFormat); + } + } + + pBackBufferFormatComboBox->SetSelectedByData( ULongToPtr(g_DeviceSettings.d3d11.sd.BufferDesc.Format) ); + + auto pDeviceTypeComboBox = m_Dialog.GetComboBox(DXUTSETTINGSDLG_DEVICE_TYPE); + pDeviceTypeComboBox->RemoveAllItems(); + + for (size_t iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.size(); iDeviceInfo++) + { + auto pDeviceInfo = pAdapterInfo->deviceInfoList[iDeviceInfo]; + AddD3D11DeviceType(pDeviceInfo->DeviceType); + } + + pDeviceTypeComboBox->SetSelectedByData( ULongToPtr(g_DeviceSettings.d3d11.DriverType) ); + } + + // MSAA settings + auto pDeviceSettingsCombo = GetCurrentD3D11DeviceSettingsCombo(); + if ( pDeviceSettingsCombo ) + { + auto pMultisampleCountCombo = m_Dialog.GetComboBox(DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT); + pMultisampleCountCombo->RemoveAllItems(); + + for (auto it = pDeviceSettingsCombo->multiSampleCountList.cbegin(); it != pDeviceSettingsCombo->multiSampleCountList.cend(); ++it) + AddD3D11MultisampleCount(*it); + + pMultisampleCountCombo->SetSelectedByData( ULongToPtr(g_DeviceSettings.d3d11.sd.SampleDesc.Count) ); + + UINT MaxQuality = 0; + for (size_t iCount = 0; iCount < pDeviceSettingsCombo->multiSampleCountList.size(); iCount++) + { + UINT Count = pDeviceSettingsCombo->multiSampleCountList[iCount]; + if ( Count == g_DeviceSettings.d3d11.sd.SampleDesc.Count ) + { + MaxQuality = pDeviceSettingsCombo->multiSampleQualityList[iCount]; + break; + } + } + + auto 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)); + } + + // Misc settings + auto pDebugCheckBox = m_Dialog.GetCheckBox(DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE); + if ( pDebugCheckBox ) + { + pDebugCheckBox->SetChecked(0 != (g_DeviceSettings.d3d11.CreateFlags & D3D11_CREATE_DEVICE_DEBUG)); + } + + auto pPresentIntervalComboBox = m_Dialog.GetComboBox(DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL); + if ( pPresentIntervalComboBox ) + { + pPresentIntervalComboBox->SetSelectedByData(ULongToPtr(g_DeviceSettings.d3d11.SyncInterval) ); + } + + CDXUTDialog::SetRefreshTime( ( float )DXUTGetTime() ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::SetSelectedD3D11RefreshRate( _In_ DXGI_RATIONAL RefreshRate ) +{ + auto pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + + for( UINT i = 0; i < pRefreshRateComboBox->GetNumItems(); ++i ) + { + auto pRate = reinterpret_cast( pRefreshRateComboBox->GetItemData( i ) ); + + if( pRate && pRate->Numerator == RefreshRate.Numerator && pRate->Denominator == RefreshRate.Denominator ) + { + pRefreshRateComboBox->SetSelectedByIndex( i ); + return; + } + } +} + +//-------------------------------------------------------------------------------------- +void CD3DSettingsDlg::OnRender( _In_ float fElapsedTime ) +{ + // Render the scene + m_pActiveDialog->OnRender( fElapsedTime ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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; +} + +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnD3D11CreateDevice( _In_ ID3D11Device* pd3dDevice ) +{ + if( !pd3dDevice ) + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CD3DSettingsDlg::OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ) +{ + UNREFERENCED_PARAMETER(pd3dDevice); + + 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() +{ + + +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void WINAPI CD3DSettingsDlg::StaticOnEvent( UINT nEvent, int nControlID, + CDXUTControl* pControl, void* pUserData ) +{ + auto pD3DSettings = reinterpret_cast( 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. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void WINAPI CD3DSettingsDlg::StaticOnModeChangeTimer( UINT nIDEvent, void* pUserContext ) +{ + UNREFERENCED_PARAMETER(nIDEvent); + + auto pD3DSettings = reinterpret_cast( pUserContext ); + assert( pD3DSettings ); + _Analysis_assume_( pD3DSettings ); + assert( pD3DSettings->m_pActiveDialog == &pD3DSettings->m_RevertModeDialog ); + assert( pD3DSettings->m_nIDEvent == nIDEvent ); + + if( 0 == --pD3DSettings->m_nRevertModeTimeout ) + { + auto pControl = pD3DSettings->m_RevertModeDialog.GetControl( DXUTSETTINGSDLG_MODE_CHANGE_REVERT ); + assert( pControl ); + _Analysis_assume_( pControl ); + pD3DSettings->m_RevertModeDialog.SendEvent( EVENT_BUTTON_CLICKED, false, pControl ); + } + pD3DSettings->UpdateModeChangeTimeoutText( pD3DSettings->m_nRevertModeTimeout ); +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CD3DSettingsDlg::OnEvent( UINT nEvent, int nControlID, CDXUTControl* pControl ) +{ + UNREFERENCED_PARAMETER(nEvent); + UNREFERENCED_PARAMETER(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_RESOLUTION_SHOW_ALL: + OnBackBufferFormatChanged(); break; + case DXUTSETTINGSDLG_D3D11_RESOLUTION: + OnD3D11ResolutionChanged(); 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; + auto currentSettings = DXUTGetDeviceSettings(); + g_DeviceSettings.MinimumFeatureLevel = currentSettings.MinimumFeatureLevel; + 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; + 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; + } + } +} + + +//------------------------------------------------------------------------------------- +CD3D11EnumAdapterInfo* CD3DSettingsDlg::GetCurrentD3D11AdapterInfo() const +{ + auto pD3DEnum = DXUTGetD3D11Enumeration(); + return pD3DEnum->GetAdapterInfo( g_DeviceSettings.d3d11.AdapterOrdinal ); +} + + +//------------------------------------------------------------------------------------- +CD3D11EnumDeviceInfo* CD3DSettingsDlg::GetCurrentD3D11DeviceInfo() const +{ + auto pD3DEnum = DXUTGetD3D11Enumeration(); + return pD3DEnum->GetDeviceInfo( g_DeviceSettings.d3d11.AdapterOrdinal, + g_DeviceSettings.d3d11.DriverType ); +} + + +//------------------------------------------------------------------------------------- +CD3D11EnumOutputInfo* CD3DSettingsDlg::GetCurrentD3D11OutputInfo() const +{ + auto pD3DEnum = DXUTGetD3D11Enumeration(); + return pD3DEnum->GetOutputInfo( g_DeviceSettings.d3d11.AdapterOrdinal, + g_DeviceSettings.d3d11.Output ); +} + +//------------------------------------------------------------------------------------- +CD3D11EnumDeviceSettingsCombo* CD3DSettingsDlg::GetCurrentD3D11DeviceSettingsCombo() const +{ + auto pD3DEnum = DXUTGetD3D11Enumeration(); + return pD3DEnum->GetDeviceSettingsCombo( g_DeviceSettings.d3d11.AdapterOrdinal, + g_DeviceSettings.d3d11.sd.BufferDesc.Format, + ( g_DeviceSettings.d3d11.sd.Windowed == TRUE ) ); +} + +HRESULT CD3DSettingsDlg::OnD3D11ResolutionChanged () +{ + if ( g_DeviceSettings.d3d11.sd.Windowed ) + return S_OK; + + DWORD dwWidth, dwHeight; + GetSelectedD3D11Resolution( &dwWidth, &dwHeight ); + g_DeviceSettings.d3d11.sd.BufferDesc.Width = dwWidth; + g_DeviceSettings.d3d11.sd.BufferDesc.Height = dwHeight; + + // DXUTSETTINGSDLG_D3D11_REFRESH_RATE + HRESULT hr = UpdateD3D11RefreshRates(); + if ( FAILED(hr) ) + return hr; + + return S_OK; +} + +HRESULT CD3DSettingsDlg::OnFeatureLevelChanged () +{ + HRESULT hr = E_FAIL; + + if (g_DeviceSettings.d3d11.DeviceFeatureLevel == GetSelectedFeatureLevel()) return S_OK; + + // Obtain a set of valid D3D11 device settings. + UINT CreateFlags = g_DeviceSettings.d3d11.CreateFlags; + DXGI_FORMAT BackBufferFormat = g_DeviceSettings.d3d11.sd.BufferDesc.Format; + UINT Count = g_DeviceSettings.d3d11.sd.SampleDesc.Count; + UINT Quality = g_DeviceSettings.d3d11.sd.SampleDesc.Quality; + DXGI_RATIONAL RefreshRate = g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate; + ZeroMemory(&g_DeviceSettings, sizeof(g_DeviceSettings)); + + DXUTApplyDefaultDeviceSettings(&g_DeviceSettings); + g_DeviceSettings.d3d11.CreateFlags = CreateFlags; + hr = DXUTSnapDeviceSettingsToEnumDevice(&g_DeviceSettings, true, GetSelectedFeatureLevel()); + g_DeviceSettings.d3d11.sd.BufferDesc.Format = BackBufferFormat; + g_DeviceSettings.d3d11.sd.SampleDesc.Count = Count; + g_DeviceSettings.d3d11.sd.SampleDesc.Quality = Quality; + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate = RefreshRate; + + auto pD3DEnum = DXUTGetD3D11Enumeration(); + auto pAdapterInfoList = pD3DEnum->GetAdapterInfoList(); + + // DXUTSETTINGSDLG_ADAPTER + auto pAdapterComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + pAdapterComboBox->RemoveAllItems(); + + for( auto it = pAdapterInfoList->cbegin(); it != pAdapterInfoList->cend(); ++it ) + { + AddAdapter( (*it)->szUniqueDescription, (*it)->AdapterOrdinal ); + } + + pAdapterComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.AdapterOrdinal ) ); + + // DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT + auto pBackBufferFormatComboBox = m_Dialog.GetComboBox(DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT); + pBackBufferFormatComboBox->RemoveAllItems(); + + auto pAdapterInfo = GetCurrentD3D11AdapterInfo(); + if (!pAdapterInfo) + return E_FAIL; + + bool bWindowed = IsWindowed(); + + for (size_t idc = 0; idc < pAdapterInfo->deviceSettingsComboList.size(); idc++) + { + auto pDeviceCombo = pAdapterInfo->deviceSettingsComboList[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; + + auto 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::OnAdapterChanged() +{ + // Store the adapter index + g_DeviceSettings.d3d11.AdapterOrdinal = GetSelectedAdapter(); + + // DXUTSETTINGSDLG_DEVICE_TYPE + auto pDeviceTypeComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + pDeviceTypeComboBox->RemoveAllItems(); + + auto pAdapterInfo = GetCurrentD3D11AdapterInfo(); + if( !pAdapterInfo ) + return E_FAIL; + + for( size_t iDeviceInfo = 0; iDeviceInfo < pAdapterInfo->deviceInfoList.size(); iDeviceInfo++ ) + { + auto pDeviceInfo = pAdapterInfo->deviceInfoList[ iDeviceInfo ]; + AddD3D11DeviceType( pDeviceInfo->DeviceType ); + } + + pDeviceTypeComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.DriverType ) ); + + HRESULT hr = OnDeviceTypeChanged(); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnDeviceTypeChanged() +{ + HRESULT hr = S_OK; + + g_DeviceSettings.d3d11.DriverType = GetSelectedD3D11DeviceType(); + + // DXUTSETTINGSDLG_WINDOWED, DXUTSETTINGSDLG_FULLSCREEN + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_WINDOWED, true ); + if (g_DeviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_WARP ) + { + m_Dialog.SetControlEnabled(DXUTSETTINGSDLG_FULLSCREEN, false ); + g_DeviceSettings.d3d11.sd.Windowed = TRUE; + } + else + { + m_Dialog.SetControlEnabled(DXUTSETTINGSDLG_FULLSCREEN, true ); + } + + SetWindowed( g_DeviceSettings.d3d11.sd.Windowed != 0 ); + + auto pBestDeviceSettingsCombo = DXUTGetD3D11Enumeration()->GetDeviceSettingsCombo( + g_DeviceSettings.d3d11.AdapterOrdinal, g_DeviceSettings.d3d11.sd.BufferDesc.Format, + ( g_DeviceSettings.d3d11.sd.Windowed != 0 ) ); + + if( !pBestDeviceSettingsCombo ) + return DXUT_ERR_MSGBOX( L"GetDeviceSettingsCombo", E_INVALIDARG ); + + D3D_FEATURE_LEVEL clampFL; + if ( g_DeviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_WARP ) + clampFL = DXUTGetD3D11Enumeration()->GetWARPFeaturevel(); + else if ( g_DeviceSettings.d3d11.DriverType == D3D_DRIVER_TYPE_REFERENCE ) + clampFL = DXUTGetD3D11Enumeration()->GetREFFeaturevel(); + else + clampFL = pBestDeviceSettingsCombo->pDeviceInfo->MaxLevel; + + if ( g_DeviceSettings.d3d11.DeviceFeatureLevel > clampFL + || clampFL > pBestDeviceSettingsCombo->pDeviceInfo->MaxLevel ) + { + g_DeviceSettings.d3d11.DeviceFeatureLevel = std::min( g_DeviceSettings.d3d11.DeviceFeatureLevel, + clampFL ); + + CDXUTComboBox *pFeatureLevelBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL ); + pFeatureLevelBox->RemoveAllItems(); + for (int fli = 0; fli < TOTAL_FEATURE_LEVELS; fli++) + { + if (m_Levels[fli] >= g_DeviceSettings.MinimumFeatureLevel + && m_Levels[fli] <= clampFL) + { + AddD3D11FeatureLevel( m_Levels[fli] ); + } + } + pFeatureLevelBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.DeviceFeatureLevel ) ); + + hr = OnFeatureLevelChanged(); + if( FAILED( hr ) ) + return hr; + } + + hr = OnWindowedFullScreenChanged(); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnWindowedFullScreenChanged() +{ + HRESULT hr = S_OK; + bool bWindowed = IsWindowed(); + + 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_RESOLUTION_SHOW_ALL, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_RESOLUTION, !bWindowed ); + m_Dialog.SetControlEnabled( DXUTSETTINGSDLG_D3D11_REFRESH_RATE, !bWindowed ); + + g_DeviceSettings.d3d11.sd.Windowed = bWindowed; + + // Get available adapter output + auto pD3DEnum = DXUTGetD3D11Enumeration(); + + auto pOutputComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT ); + pOutputComboBox->RemoveAllItems(); + + auto pAdapterInfo = pD3DEnum->GetAdapterInfo( g_DeviceSettings.d3d11.AdapterOrdinal ); + for( size_t ioutput = 0; ioutput < pAdapterInfo->outputInfoList.size(); ++ioutput ) + { + auto pOutputInfo = pAdapterInfo->outputInfoList[ ioutput ]; + AddD3D11AdapterOutput( pOutputInfo->Desc.DeviceName, pOutputInfo->Output ); + } + + pOutputComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.Output ) ); + + hr = OnAdapterOutputChanged(); + if( FAILED( hr ) ) + return hr; + + hr = UpdateD3D11Resolutions(); + if (FAILED(hr)) + return hr; + + hr = UpdateD3D11RefreshRates(); + if ( FAILED(hr) ) + return hr; + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnAdapterOutputChanged() +{ + HRESULT hr; + + 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.Numerator = + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate.Denominator = 0; + } + + auto pAdapterInfo = GetCurrentD3D11AdapterInfo(); + if( !pAdapterInfo ) + return E_FAIL; + + // DXUTSETTINGSDLG_D3D11_RESOLUTION + hr = UpdateD3D11Resolutions(); + if( FAILED( hr ) ) + return hr; + + // DXUTSETTINGSDLG_D3D11_REFRESH_RATE + hr = UpdateD3D11RefreshRates(); + if ( FAILED(hr) ) + return hr; + + // DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT + auto pBackBufferFormatComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT ); + pBackBufferFormatComboBox->RemoveAllItems(); + + for( size_t idc = 0; idc < pAdapterInfo->deviceSettingsComboList.size(); idc++ ) + { + auto pDeviceCombo = pAdapterInfo->deviceSettingsComboList[ 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; + + hr = OnRefreshRateChanged(); + if( FAILED( hr ) ) + return hr; + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnRefreshRateChanged() +{ + // Set refresh rate + g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate = GetSelectedD3D11RefreshRate(); + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnBackBufferFormatChanged() +{ + HRESULT hr = S_OK; + + g_DeviceSettings.d3d11.sd.BufferDesc.Format = GetSelectedD3D11BackBufferFormat(); + + DXGI_FORMAT backBufferFormat = g_DeviceSettings.d3d11.sd.BufferDesc.Format; + + auto pAdapterInfo = GetCurrentD3D11AdapterInfo(); + if( !pAdapterInfo ) + return E_FAIL; + + for( size_t idc = 0; idc < pAdapterInfo->deviceSettingsComboList.size(); idc++ ) + { + auto pDeviceCombo = pAdapterInfo->deviceSettingsComboList[ idc ]; + + if( pDeviceCombo->Windowed == ( g_DeviceSettings.d3d11.sd.Windowed == TRUE ) && + pDeviceCombo->BackBufferFormat == backBufferFormat && + pDeviceCombo->DeviceType == g_DeviceSettings.d3d11.DriverType ) + { + auto pMultisampleCountCombo = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT ); + pMultisampleCountCombo->RemoveAllItems(); + + for( auto it = pDeviceCombo->multiSampleCountList.cbegin(); it != pDeviceCombo->multiSampleCountList.cend(); ++it ) + AddD3D11MultisampleCount( *it ); + pMultisampleCountCombo->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.sd.SampleDesc.Count ) ); + + hr = OnMultisampleTypeChanged(); + if( FAILED( hr ) ) + return hr; + + auto pPresentIntervalComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL ); + pPresentIntervalComboBox->SetSelectedByData( ULongToPtr( g_DeviceSettings.d3d11.SyncInterval ) ); + + hr = OnPresentIntervalChanged(); + if( FAILED( hr ) ) + return hr; + + hr = UpdateD3D11Resolutions(); + if( FAILED( hr ) ) + return hr; + + hr = UpdateD3D11RefreshRates(); + if ( FAILED(hr) ) + return hr; + + break; + } + } + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnMultisampleTypeChanged() +{ + HRESULT hr = S_OK; + + UINT multisampleCount = GetSelectedD3D11MultisampleCount(); + g_DeviceSettings.d3d11.sd.SampleDesc.Count = multisampleCount; + + auto pDeviceSettingsCombo = GetCurrentD3D11DeviceSettingsCombo(); + if( !pDeviceSettingsCombo ) + return E_FAIL; + + UINT MaxQuality = 0; + for( size_t iCount = 0; iCount < pDeviceSettingsCombo->multiSampleCountList.size(); iCount++ ) + { + UINT Count = pDeviceSettingsCombo->multiSampleCountList[ iCount ]; + if( Count == multisampleCount ) + { + MaxQuality = pDeviceSettingsCombo->multiSampleQualityList[ iCount ]; + break; + } + } + + // DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY + auto 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; + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnMultisampleQualityChanged() +{ + g_DeviceSettings.d3d11.sd.SampleDesc.Quality = GetSelectedD3D11MultisampleQuality(); + + return S_OK; +} + + +//------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::OnPresentIntervalChanged() +{ + g_DeviceSettings.d3d11.SyncInterval = GetSelectedD3D11PresentInterval(); + + 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; +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddAdapter( _In_z_ const WCHAR* strDescription, _In_ UINT iAdapter ) +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + + if( !pComboBox->ContainsItem( strDescription ) ) + pComboBox->AddItem( strDescription, ULongToPtr( iAdapter ) ); +} + + +//------------------------------------------------------------------------------------- +UINT CD3DSettingsDlg::GetSelectedAdapter() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_ADAPTER ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::SetWindowed( _In_ bool bWindowed ) +{ + auto pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_WINDOWED ); + pRadioButton->SetChecked( bWindowed ); + + pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_FULLSCREEN ); + pRadioButton->SetChecked( !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_RESOLUTION_SHOW_ALL, !bWindowed); + m_Dialog.SetControlEnabled(DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT, !bWindowed); + m_Dialog.SetControlEnabled(DXUTSETTINGSDLG_D3D11_RESOLUTION, !bWindowed); + m_Dialog.SetControlEnabled(DXUTSETTINGSDLG_D3D11_REFRESH_RATE, !bWindowed); +} + + +//------------------------------------------------------------------------------------- +bool CD3DSettingsDlg::IsWindowed() const +{ + auto pRadioButton = m_Dialog.GetRadioButton( DXUTSETTINGSDLG_WINDOWED ); + return pRadioButton->GetChecked(); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11AdapterOutput( _In_z_ const WCHAR* strName, _In_ UINT Output ) +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT ); + + if( !pComboBox->ContainsItem( strName ) ) + pComboBox->AddItem( strName, ULongToPtr( Output ) ); +} + + +//------------------------------------------------------------------------------------- +UINT CD3DSettingsDlg::GetSelectedD3D11AdapterOutput() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_ADAPTER_OUTPUT ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CD3DSettingsDlg::AddD3D11Resolution( DWORD dwWidth, DWORD dwHeight ) +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION ); + + DWORD dwResolutionData; + WCHAR strResolution[50]; + dwResolutionData = MAKELONG( dwWidth, dwHeight ); + swprintf_s( strResolution, 50, L"%u by %u", dwWidth, dwHeight ); + + if( !pComboBox->ContainsItem( strResolution ) ) + pComboBox->AddItem( strResolution, ULongToPtr( dwResolutionData ) ); +} + + +//------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CD3DSettingsDlg::GetSelectedD3D11Resolution( DWORD* pdwWidth, DWORD* pdwHeight ) const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION ); + + DWORD dwResolution = PtrToUlong( pComboBox->GetSelectedData() ); + + *pdwWidth = LOWORD( dwResolution ); + *pdwHeight = HIWORD( dwResolution ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11FeatureLevel( _In_ D3D_FEATURE_LEVEL fl) +{ + auto 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; + case D3D_FEATURE_LEVEL_11_1: + { + if( !pComboBox->ContainsItem( L"D3D_FEATURE_LEVEL_11_1" ) ) + pComboBox->AddItem( L"D3D_FEATURE_LEVEL_11_1", ULongToPtr( D3D_FEATURE_LEVEL_11_1 ) ); + } + break; +#ifdef USE_DIRECT3D11_3 + case D3D_FEATURE_LEVEL_12_0: + { + if (!pComboBox->ContainsItem(L"D3D_FEATURE_LEVEL_12_0")) + pComboBox->AddItem(L"D3D_FEATURE_LEVEL_12_0", ULongToPtr(D3D_FEATURE_LEVEL_12_0)); + } + break; + case D3D_FEATURE_LEVEL_12_1: + { + if (!pComboBox->ContainsItem(L"D3D_FEATURE_LEVEL_12_1")) + pComboBox->AddItem(L"D3D_FEATURE_LEVEL_12_1", ULongToPtr(D3D_FEATURE_LEVEL_12_1)); + } + break; +#endif + } + +} + +D3D_FEATURE_LEVEL CD3DSettingsDlg::GetSelectedFeatureLevel() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_FEATURE_LEVEL ); + + return (D3D_FEATURE_LEVEL)PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11RefreshRate( _In_ DXGI_RATIONAL RefreshRate ) +{ + auto 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"%u Hz", RefreshRate.Numerator / RefreshRate.Denominator ); + + if( !pComboBox->ContainsItem( strRefreshRate ) ) + { + auto pNewRate = new (std::nothrow) DXGI_RATIONAL; + if( pNewRate ) + { + *pNewRate = RefreshRate; + pComboBox->AddItem( strRefreshRate, pNewRate ); + } + } +} + + +//------------------------------------------------------------------------------------- +DXGI_RATIONAL CD3DSettingsDlg::GetSelectedD3D11RefreshRate() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + return *reinterpret_cast( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11BackBufferFormat( _In_ DXGI_FORMAT format ) +{ + if ( g_DeviceSettings.d3d11.DeviceFeatureLevel < D3D_FEATURE_LEVEL_10_0 ) + { + if ( (format == DXGI_FORMAT_R16G16B16A16_FLOAT) || (format == DXGI_FORMAT_R10G10B10A2_UNORM) ) + return; + } + + auto 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() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_BACK_BUFFER_FORMAT ); + + return ( DXGI_FORMAT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11MultisampleCount( _In_ UINT Count ) +{ + auto 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() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_COUNT ); + + return ( UINT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11MultisampleQuality( _In_ UINT Quality ) +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY ); + + WCHAR strQuality[50]; + swprintf_s( strQuality, 50, L"%u", Quality ); + + if( !pComboBox->ContainsItem( strQuality ) ) + pComboBox->AddItem( strQuality, ULongToPtr( Quality ) ); +} + + +//------------------------------------------------------------------------------------- +UINT CD3DSettingsDlg::GetSelectedD3D11MultisampleQuality() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_MULTISAMPLE_QUALITY ); + + return ( UINT )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +//------------------------------------------------------------------------------------- +DWORD CD3DSettingsDlg::GetSelectedD3D11PresentInterval() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_PRESENT_INTERVAL ); + + return PtrToUlong( pComboBox->GetSelectedData() ); +} + +//------------------------------------------------------------------------------------- +bool CD3DSettingsDlg::GetSelectedDebugDeviceValue() const +{ + auto pCheckBox = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_D3D11_DEBUG_DEVICE ); + + 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 + auto pResolutionComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_RESOLUTION ); + pResolutionComboBox->RemoveAllItems(); + + auto pOutputInfo = GetCurrentD3D11OutputInfo(); + if( !pOutputInfo ) + return E_FAIL; + + bool bWindowed = IsWindowed(); + if ( !bWindowed ) + { + auto pShowAllCB = m_Dialog.GetCheckBox( DXUTSETTINGSDLG_RESOLUTION_SHOW_ALL ); + bool bShowAll = pShowAllCB->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; + + if ( !bShowAll && !DXUTIsWindowed() ) + { + float fAspect = (float) dwWidth / (float) dwHeight; + if ( fabsf(fDesktopAspectRatio - fAspect) >= 0.05f ) + { + // Our current fullscren resolution should be listed in the combo box despite the aspect ratio + pShowAllCB->SetChecked(true); + bShowAll = true; + } + } + + for (size_t idm = 0; idm < pOutputInfo->displayModeList.size(); idm++) + { + auto DisplayMode = pOutputInfo->displayModeList[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); + } + } + } + } + else + { + pResolutionComboBox->RemoveAllItems(); + AddD3D11Resolution( dwWidth, dwHeight ); + } + + pResolutionComboBox->SetSelectedByData(ULongToPtr(MAKELONG(dwWidth, dwHeight))); + OnD3D11ResolutionChanged(); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// Updates the refresh list for D3D11 +//-------------------------------------------------------------------------------------- +HRESULT CD3DSettingsDlg::UpdateD3D11RefreshRates() +{ + const DWORD dwWidth = g_DeviceSettings.d3d11.sd.BufferDesc.Width; + const DWORD dwHeight = g_DeviceSettings.d3d11.sd.BufferDesc.Height; + DXGI_FORMAT backBuffer = g_DeviceSettings.d3d11.sd.BufferDesc.Format; + const DXGI_RATIONAL RefreshRate = g_DeviceSettings.d3d11.sd.BufferDesc.RefreshRate; + + auto pRefreshRateComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_D3D11_REFRESH_RATE ); + for( UINT i = 0; i < pRefreshRateComboBox->GetNumItems(); ++i ) + { + auto pRefreshRate = reinterpret_cast( pRefreshRateComboBox->GetItemData( i ) ); + delete pRefreshRate; + } + pRefreshRateComboBox->RemoveAllItems(); + + bool bWindowed = IsWindowed(); + if( bWindowed ) + { + DXGI_RATIONAL def; + def.Denominator = def.Numerator = 0; + AddD3D11RefreshRate(def); + } + else + { + auto pD3DEnum = DXUTGetD3D11Enumeration(); + if ( !pD3DEnum ) + return E_POINTER; + + auto pOutputInfo = pD3DEnum->GetOutputInfo( g_DeviceSettings.d3d11.AdapterOrdinal, g_DeviceSettings.d3d11.Output ); + if ( !pOutputInfo ) + return E_POINTER; + + for( auto it = pOutputInfo->displayModeList.cbegin(); it != pOutputInfo->displayModeList.cend(); ++it ) + { + if ( it->Width == dwWidth && it->Height == dwHeight && it->Format == backBuffer ) + AddD3D11RefreshRate( it->RefreshRate ); + } + + SetSelectedD3D11RefreshRate( RefreshRate ); + } + + return S_OK; +} + + +// +//------------------------------------------------------------------------------------- +void CD3DSettingsDlg::AddD3D11DeviceType( _In_ D3D_DRIVER_TYPE devType ) +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + + if( !pComboBox->ContainsItem( DXUTDeviceTypeToString( devType ) ) ) + pComboBox->AddItem( DXUTDeviceTypeToString( devType ), ULongToPtr( devType ) ); +} + + +//------------------------------------------------------------------------------------- +D3D_DRIVER_TYPE CD3DSettingsDlg::GetSelectedD3D11DeviceType() const +{ + auto pComboBox = m_Dialog.GetComboBox( DXUTSETTINGSDLG_DEVICE_TYPE ); + + return ( D3D_DRIVER_TYPE )PtrToUlong( pComboBox->GetSelectedData() ); +} + + +void CD3DSettingsDlg::UpdateModeChangeTimeoutText( _In_ 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 ); + + auto pStatic = m_RevertModeDialog.GetStatic( DXUTSETTINGSDLG_STATIC_MODE_CHANGE_TIMEOUT ); + pStatic->SetText( buf ); +} + +//-------------------------------------------------------------------------------------- +// Returns the string for the given D3D_DRIVER_TYPE. +//-------------------------------------------------------------------------------------- +const WCHAR* DXUTDeviceTypeToString( _In_ 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"; + } +} + + diff --git a/DXUT11/Optional/DXUTsettingsdlg.h b/DXUT11/Optional/DXUTsettingsdlg.h new file mode 100644 index 0000000..92d2752 --- /dev/null +++ b/DXUT11/Optional/DXUTsettingsdlg.h @@ -0,0 +1,173 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTSettingsDlg.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +//-------------------------------------------------------------------------------------- +// 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_RESOLUTION_SHOW_ALL 26 +#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 + +#ifdef USE_DIRECT3D11_3 +#define TOTAL_FEATURE_LEVELS 9 +#else +#define TOTAL_FEATURE_LEVELS 7 +#endif + +//-------------------------------------------------------------------------------------- +// Dialog for selection of device settings +// Use DXUTGetD3DSettingsDialog() to access global instance +// To control the contents of the dialog, use the CD3D11Enumeration class. +//-------------------------------------------------------------------------------------- +class CD3DSettingsDlg +{ +public: + CD3DSettingsDlg(); + ~CD3DSettingsDlg(); + + void Init( _In_ CDXUTDialogResourceManager* pManager ); + void Init( _In_ CDXUTDialogResourceManager* pManager, _In_z_ LPCWSTR szControlTextureFileName ); + void Init( _In_ CDXUTDialogResourceManager* pManager, _In_z_ LPCWSTR pszControlTextureResourcename, + _In_ HMODULE hModule ); + + HRESULT Refresh(); + void OnRender( _In_ float fElapsedTime ); + + HRESULT OnD3D11CreateDevice( _In_ ID3D11Device* pd3dDevice ); + HRESULT OnD3D11ResizedSwapChain( _In_ ID3D11Device* pd3dDevice, + _In_ const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ); + void OnD3D11DestroyDevice(); + + CDXUTDialog* GetDialogControl() { return &m_Dialog; } + bool IsActive() const { return m_bActive; } + void SetActive( _In_ bool bActive ) + { + m_bActive = bActive; + if( bActive ) Refresh(); + } + + LRESULT MsgProc( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); + +protected: + friend CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog(); + + void CreateControls(); + void SetSelectedD3D11RefreshRate( _In_ DXGI_RATIONAL RefreshRate ); + HRESULT UpdateD3D11Resolutions(); + HRESULT UpdateD3D11RefreshRates(); + + void OnEvent( _In_ UINT nEvent, _In_ int nControlID, _In_ CDXUTControl* pControl ); + + static void WINAPI StaticOnEvent( _In_ UINT nEvent, _In_ int nControlID, _In_ CDXUTControl* pControl, _In_opt_ void* pUserData ); + static void WINAPI StaticOnModeChangeTimer( _In_ UINT nIDEvent, _In_opt_ void* pUserContext ); + + CD3D11EnumAdapterInfo* GetCurrentD3D11AdapterInfo() const; + CD3D11EnumDeviceInfo* GetCurrentD3D11DeviceInfo() const; + CD3D11EnumOutputInfo* GetCurrentD3D11OutputInfo() const; + CD3D11EnumDeviceSettingsCombo* GetCurrentD3D11DeviceSettingsCombo() const; + + void AddAdapter( _In_z_ const WCHAR* strDescription, _In_ UINT iAdapter ); + UINT GetSelectedAdapter() const; + + void SetWindowed( _In_ bool bWindowed ); + bool IsWindowed() const; + + // D3D11 + void AddD3D11DeviceType( _In_ D3D_DRIVER_TYPE devType ); + D3D_DRIVER_TYPE GetSelectedD3D11DeviceType() const; + + void AddD3D11AdapterOutput( _In_z_ const WCHAR* strName, _In_ UINT nOutput ); + UINT GetSelectedD3D11AdapterOutput() const; + + void AddD3D11Resolution( _In_ DWORD dwWidth, _In_ DWORD dwHeight ); + void GetSelectedD3D11Resolution( _Out_ DWORD* pdwWidth, _Out_ DWORD* pdwHeight ) const; + + void AddD3D11FeatureLevel( _In_ D3D_FEATURE_LEVEL fl ); + D3D_FEATURE_LEVEL GetSelectedFeatureLevel() const; + + void AddD3D11RefreshRate( _In_ DXGI_RATIONAL RefreshRate ); + DXGI_RATIONAL GetSelectedD3D11RefreshRate() const; + + void AddD3D11BackBufferFormat( _In_ DXGI_FORMAT format ); + DXGI_FORMAT GetSelectedD3D11BackBufferFormat() const; + + void AddD3D11MultisampleCount( _In_ UINT count ); + UINT GetSelectedD3D11MultisampleCount() const; + + void AddD3D11MultisampleQuality( _In_ UINT Quality ); + UINT GetSelectedD3D11MultisampleQuality() const; + + DWORD GetSelectedD3D11PresentInterval() const; + bool GetSelectedDebugDeviceValue() const; + + HRESULT OnD3D11ResolutionChanged (); + HRESULT OnFeatureLevelChanged(); + HRESULT OnAdapterChanged(); + HRESULT OnDeviceTypeChanged(); + HRESULT OnWindowedFullScreenChanged(); + HRESULT OnAdapterOutputChanged(); + HRESULT OnRefreshRateChanged(); + HRESULT OnBackBufferFormatChanged(); + HRESULT OnMultisampleTypeChanged(); + HRESULT OnMultisampleQualityChanged(); + HRESULT OnPresentIntervalChanged(); + HRESULT OnDebugDeviceChanged(); + + void UpdateModeChangeTimeoutText( _In_ int nSecRemaining ); + + 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_LEVELS]; + +}; + + +CD3DSettingsDlg* WINAPI DXUTGetD3DSettingsDialog(); diff --git a/DXUT11/Optional/ImeUi.cpp b/DXUT11/Optional/ImeUi.cpp new file mode 100644 index 0000000..3e37c1d --- /dev/null +++ b/DXUT11/Optional/ImeUi.cpp @@ -0,0 +1,3252 @@ +//-------------------------------------------------------------------------------------- +// File: ImeUi.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "dxut.h" +#include "ImeUi.h" +#include +#include +#include + +// Ignore typecast warnings +#pragma warning( disable : 4312 ) +#pragma warning( disable : 4244 ) +#pragma warning( disable : 4311 ) + +#pragma prefast( disable : 28159, "GetTickCount() is fine for a blinking cursor" ) + +#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; + nullptr, // 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( nullptr ), + m_bComInit( false ) + { + } + ~CDisableCicero() + { + Uninitialize(); + } + void Initialize() + { + if( m_bComInit ) + { + return; + } + HRESULT hr; + hr = CoInitializeEx( nullptr, COINIT_APARTMENTTHREADED ); + if( SUCCEEDED( hr ) ) + { + m_bComInit = true; + hr = CoCreateInstance( CLSID_TF_ThreadMgr, + nullptr, + CLSCTX_INPROC_SERVER, + __uuidof( ITfThreadMgr ), + ( void** )&m_ptim ); + } + } + void Uninitialize() + { + if( m_ptim ) + { + m_ptim->Release(); + m_ptim = nullptr; + } + if( m_bComInit ) + CoUninitialize(); + m_bComInit = false; + } + + void DisableCiceroOnThisWnd( HWND hwnd ) + { + if( !m_ptim ) + return; + ITfDocumentMgr* pdimPrev; // the dim that is associated previously. + // Associate nullptr 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, nullptr, &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 = nullptr; + +#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 LPCTSTR g_aszIndicator[] = +{ + TEXT( "A" ), + L"\x7B80", + L"\x7E41", + L"\xac00", + L"\x3042", +}; +static LPCTSTR g_pszIndicatior = g_aszIndicator[0]; + +static void GetReadingString( _In_ HWND hWnd ); +static DWORD GetImeId( _In_ UINT uIndex = 0 ); +static void CheckToggleState(); +static void DrawImeIndicator(); +static void DrawCandidateList(); +static void DrawCompositionString( _In_ bool bDrawCompAttr ); +static void GetReadingWindowOrientation( _In_ DWORD dwId ); +static void OnInputLangChangeWorker(); +static void OnInputLangChange(); +static void SetImeApi(); +static void CheckInputLocale(); +static void SetSupportLevel( _In_ DWORD dwImeLevel ); +void ImeUi_SetSupportLevel( _In_ 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(); + virtual ~CUIElementSink(); + + // IUnknown + STDMETHODIMP QueryInterface( _In_ REFIID riid, _COM_Outptr_ void** ppvObj ); + STDMETHODIMP_( ULONG ) + AddRef(); + STDMETHODIMP_( ULONG ) + Release(); + + // 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, _In_ REFCLSID clsid, _In_ REFGUID catid, + _In_ REFGUID guidProfile, HKL hkl, DWORD dwFlags ); + + // ITfCompartmentEventSink + // Notification for open mode (toggle state) change + STDMETHODIMP OnChange( _In_ 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 = nullptr, + ITfCompartment* ppTfConvMode = nullptr ); + + 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 = nullptr; +int CTsfUiLessMode::m_nCandidateRefCount = 0; + +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; +} + +#define GetCharCount(psz) (int)wcslen(psz) +#define GetCharCountFromBytes(psz,iBytes) (iBytes) + +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 = (int)wcslen( g_szCompositionString ); + if( ImeUiCallback_OnChar ) + { + LPCWSTR pwz; + pwz = g_szCompositionString; + for( i = 0; i < iLen; i++ ) + { + ImeUiCallback_OnChar( pwz[i] ); + } + return; + } + for( i = 0; i < iLen; i++ ) + { + SendKeyMsg( g_hwndCurr, WM_CHAR, + (WPARAM)g_szCompositionString[i] + ); + } +} + +static DWORD GetCandidateList( HIMC himc, DWORD dwIndex, LPCANDIDATELIST* ppCandList ) +{ + DWORD dwBufLen = _ImmGetCandidateList( himc, dwIndex, nullptr, 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() +{ + 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( _In_ bool bDrawCompAttr, _In_ 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 + ( DWORD(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( _In_ 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 = (int)wcslen( 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; + 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]; + } + 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 += wcslen( 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() +{ + assert( g_CaretInfo.pFont != nullptr ); + _Analysis_assume_( g_CaretInfo.pFont != nullptr ); + 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 = nullptr; + // 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 ) + { + wcscpy_s( szTemp, COUNTOF(szTemp), g_szReadingString ); + LPTSTR psz = szTemp + g_iReadingError; + psz++; + *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 +// +#pragma warning(push) +#pragma warning( disable : 4616 6305 ) +_Use_decl_annotations_ +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; + himc = ImmGetContext( hWnd ); + if( !himc ) + { + 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 ) ); + wcscpy_s( 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 ) ); + + wcscpy_s( 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 = (int)wcslen( 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 + { + g_szCandidate[i][0] = g_szCompositionString[i]; + g_szCandidate[i][1] = 0; + } + } + 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 = (int)wcslen( 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, nullptr, 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; + himc = _ImmGetContext( hWnd ); + if( !himc ) + 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 = (int)wcslen( + ( LPTSTR )( (UINT_PTR)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 = std::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 )( (UINT_PTR)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; +} +#pragma warning(pop) + +_Use_decl_annotations_ +void ImeUi_SetCaretPosition( UINT x, UINT y ) +{ + if( !g_bInitialized ) + return; + g_CaretInfo.caretX = x; + g_CaretInfo.caretY = y; +} + +_Use_decl_annotations_ +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( _In_ DWORD dwState ) +{ + if( !g_bInitialized ) + return; + HIMC himc; + if( dwState == IMEUI_STATE_ON ) + { + ImeUi_EnableIme( true ); + } + himc = _ImmGetContext( g_hwndCurr ); + if( himc ) + { + 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( _In_ 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 : nullptr ); + } + g_bImeEnabled = bEnable; + if( bEnable ) + { + CheckToggleState(); + } + CTsfUiLessMode::EnableUiUpdates( bEnable ); +} + +bool ImeUi_IsEnabled() +{ + return g_bImeEnabled; +} + +bool ImeUi_Initialize(_In_ HWND hwnd, _In_ bool bDisable ) +{ + if( g_bInitialized ) + { + return true; + } + g_hwndMain = hwnd; + g_disableCicero.Initialize(); + + g_hImmDll = LoadLibraryEx( L"imm32.dll", nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + g_bDisableImeCompletely = false; + + if( g_hImmDll ) + { + _ImmLockIMC = reinterpret_cast( reinterpret_cast( GetProcAddress( g_hImmDll, "ImmLockIMC" ) ) ); + _ImmUnlockIMC = reinterpret_cast( reinterpret_cast( GetProcAddress( g_hImmDll, "ImmUnlockIMC" ) ) ); + _ImmLockIMCC = reinterpret_cast( reinterpret_cast( GetProcAddress( g_hImmDll, "ImmLockIMCC" ) ) ); + _ImmUnlockIMCC = reinterpret_cast( reinterpret_cast( GetProcAddress( g_hImmDll, "ImmUnlockIMCC" ) ) ); + BOOL ( WINAPI* _ImmDisableTextFrameService )( DWORD ) = reinterpret_cast( reinterpret_cast( GetProcAddress( g_hImmDll, + "ImmDisableTextFrameService" ) ) ); + if( _ImmDisableTextFrameService ) + { + _ImmDisableTextFrameService( ( DWORD )-1 ); + } + } + else + { + g_bDisableImeCompletely = true; + return false; + } + _ImmGetCompositionString = ImmGetCompositionStringW; + _ImmGetCandidateList = ImmGetCandidateListW; + _GetCandidateList = GetCandidateList; + _SendCompString = SendCompString; + _SendMessage = SendMessageW; + + // 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(); + + 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 = nullptr; + g_himcOrg = nullptr; + if( g_hImmDll ) + { + FreeLibrary( g_hImmDll ); + g_hImmDll = nullptr; + } + 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( _In_ 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 = ( static_cast(reinterpret_cast(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, 0, 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( _In_ 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 = nullptr; + + if( _GetReadingString ) + { + BOOL bVertical; + UINT uMaxUiLen; + dwlen = _GetReadingString( himc, 0, nullptr, ( 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 = std::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; + } + g_szCandidate[i][0] = wstr[i]; + g_szCandidate[i][1] = 0; + } + 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; + } + MultiByteToWideChar( g_uCodePage, 0, p + i, 1 + ( _IsLeadByte( p[i] ) ? 1 : 0 ), + g_szCandidate[j], 1 ); + if ( _IsLeadByte( p[i] ) ) + { + i++; + } + } + 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 = (int)wcslen( 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( _In_ 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( _In_ bool bSend ) +{ + HIMC himc; + static bool bProcessing = false; // to avoid infinite recursion + if( !g_bInitialized || bProcessing ) + return; + + himc = _ImmGetContext( g_hwndCurr ); + if ( !himc ) + return; + bProcessing = true; + + if( g_dwIMELevel == 2 && bSend ) + { + // Send composition string to app. + LONG lRet = (int)wcslen( g_szCompositionString ); + assert( lRet >= 2 ); + // In case of CHT IME, don't send the trailing double byte space, if it exists. + if ( GETLANG() == LANG_CHT && (lRet >= 1) + && g_szCompositionString[lRet - 1] == 0x3000 ) + { + lRet--; + } + _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, const_cast(L""), sizeof(wchar_t), const_cast(""), sizeof(wchar_t) ); + } + // 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( _In_ 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( _In_ DWORD dwImeLevel ) +{ + if( !g_bInitialized ) + return; + g_dwIMELevelSaved = dwImeLevel; + SetSupportLevel( dwImeLevel ); +} + +void ImeUi_SetAppearance( _In_opt_ const IMEUI_APPEARANCE* pia ) +{ + if( !g_bInitialized || !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( _Out_opt_ IMEUI_APPEARANCE* pia ) +{ + if ( pia ) + { + if ( g_bInitialized ) + { + *pia = gSkinIME; + } + else + { + memset( pia, 0, sizeof(IMEUI_APPEARANCE) ); + } + } +} + +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 & static_cast( reinterpret_cast( 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 = _ImmGetContext( g_hwndCurr ); + if( himc ) + { + 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( _In_ bool bInsert ) +{ + if( !g_bInitialized ) + return; + g_bInsertMode = bInsert; +} + +bool ImeUi_GetCaretStatus() +{ + return !g_bInitialized || !g_szCompositionString[0]; +} + +void ImeUi_SetScreenDimension( _In_ UINT width, _In_ 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, nullptr, 0, 0, PM_NOREMOVE ) ) + { + if( !GetMessageA( &msg, nullptr, 0, 0 ) ) + { + PostQuitMessage( msg.wParam ); + return; + } + // if (0 == TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { + TranslateMessage( &msg ); + DispatchMessageA( &msg ); + // } + } +} + +static void GetReadingWindowOrientation( _In_ 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 ); + strcpy_s( 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", nullptr, &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( _In_ 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 && strlen( 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( nullptr ); + if( SUCCEEDED( hr ) ) + { + ITfLangBarMgr* plbm = nullptr; + hr = CoCreateInstance( CLSID_TF_LangBarMgr, nullptr, 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 = nullptr; + _ShowReadingWindow = nullptr; + if( g_bUILessMode ) + return; + + char szImeFile[MAX_PATH + 1]; + HKL kl = g_hklCurrent; + if( _ImmGetIMEFileNameA( kl, szImeFile, sizeof( szImeFile ) - 1 ) <= 0 ) + return; + HMODULE hIme = LoadLibraryExA( szImeFile, nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if( !hIme ) + return; + _GetReadingString = reinterpret_cast( reinterpret_cast( GetProcAddress( hIme, "GetReadingString" ) ) ); + _ShowReadingWindow = reinterpret_cast( reinterpret_cast( GetProcAddress( hIme, "ShowReadingWindow" ) ) ); + if( _ShowReadingWindow ) + { + HIMC himc = _ImmGetContext( g_hwndCurr ); + if( himc ) + { + _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]; + (void)GetLocaleInfoA( MAKELCID( GETLANG(), SORT_DEFAULT ), LOCALE_IDEFAULTANSICODEPAGE, szCodePage, + COUNTOF( szCodePage ) ); + g_uCodePage = _strtoul( szCodePage, nullptr, 0 ); + for( int i = 0; i < 256; i++ ) + { + LeadByteTable[i] = ( BYTE )IsDBCSLeadByteEx( g_uCodePage, ( BYTE )i ); + } +} + +void ImeUi_SetWindow( _In_ HWND hwnd ) +{ + g_hwndCurr = hwnd; + g_disableCicero.DisableCiceroOnThisWnd( hwnd ); +} + +UINT ImeUi_GetInputCodePage() +{ + return g_uCodePage; +} + +DWORD ImeUi_GetFlags() +{ + return g_dwImeUiFlags; +} + +void ImeUi_SetFlags( _In_ DWORD dwFlags, _In_ 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, + nullptr, + 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 (std::nothrow) 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( _In_ REFIID riid, _COM_Outptr_ void** ppvObj ) +{ + if( !ppvObj ) + return E_INVALIDARG; + + *ppvObj = nullptr; + + if( IsEqualIID( riid, IID_IUnknown ) ) + { + *ppvObj = static_cast( static_cast( 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 ) +{ + auto pElement = GetUIElement( dwUIElementId ); + if( !pElement ) + return E_INVALIDARG; + + ITfReadingInformationUIElement* preading = nullptr; + ITfCandidateListUIElement* pcandidate = nullptr; + *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 ) +{ + auto pElement = GetUIElement( dwUIElementId ); + if( !pElement ) + return E_INVALIDARG; + + ITfReadingInformationUIElement* preading = nullptr; + ITfCandidateListUIElement* pcandidate = nullptr; + 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 ) +{ + auto pElement = GetUIElement( dwUIElementId ); + if( !pElement ) + return E_INVALIDARG; + + ITfReadingInformationUIElement* preading = nullptr; + if( !g_bCandList && SUCCEEDED( pElement->QueryInterface( __uuidof( ITfReadingInformationUIElement ), + ( void** )&preading ) ) ) + { + g_dwCount = 0; + preading->Release(); + } + + ITfCandidateListUIElement* pcandidate = nullptr; + 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 = nullptr; + ITfCompartment* pTfConvMode = nullptr; + if( GetCompartments( &pcm, &pTfOpenMode, &pTfConvMode ) ) + { + VARIANT valOpenMode; + if ( SUCCEEDED(pTfOpenMode->GetValue(&valOpenMode)) ) + { + VARIANT valConvMode; + if (SUCCEEDED(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(&valConvMode); + } + VariantClear(&valOpenMode); + } + + if( bResetCompartmentEventSink ) + { + SetupCompartmentSinks( FALSE, pTfOpenMode, pTfConvMode ); // Reset compartment sinks + } + pTfOpenMode->Release(); + pTfConvMode->Release(); + pcm->Release(); + } +} + +STDAPI CTsfUiLessMode::CUIElementSink::OnActivated( DWORD dwProfileType, LANGID langid, _In_ REFCLSID clsid, _In_ REFGUID catid, + _In_ REFGUID guidProfile, HKL hkl, DWORD dwFlags ) +{ + UNREFERENCED_PARAMETER(clsid); + UNREFERENCED_PARAMETER(hkl); + + static GUID s_TF_PROFILE_DAYI = + { + 0x037B2C25, 0x480C, 0x4D7F, 0xB0, 0x27, 0xD6, 0xCA, 0x6B, 0x69, 0x78, 0x8A + }; + g_iCandListIndexBase = IsEqualGUID( s_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( _In_ REFGUID rguid ) +{ + UNREFERENCED_PARAMETER(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. + + BSTR bstr; + if( SUCCEEDED( preading->GetString( &bstr ) ) ) + { + if( bstr ) + { + wcscpy_s( g_szReadingString, COUNTOF(g_szReadingString), bstr ); + 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; + memcpy( 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 = nullptr; + 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( nullptr, 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 ) ? + std::min( uCount, IndexList[uCurrentPage + 1] ) - dwPageStart: + uCount - dwPageStart; + } + } + + g_uCandPageSize = std::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 ) + { + ComposeCandidateLine( j, bstr ); + SysFreeString( bstr ); + } + } + } + + if( GETPRIMLANG() == LANG_KOREAN ) + { + g_dwSelection = ( DWORD )-1; + } + + if( IndexList ) + { + ImeUiCallback_Free( IndexList ); + } +} + +ITfUIElement* CTsfUiLessMode::GetUIElement( DWORD dwUIElementId ) +{ + ITfUIElementMgr* puiem; + ITfUIElement* pElement = nullptr; + + 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, nullptr, 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 || + ( bEnable && m_dwUIElementSinkCookie != TF_INVALID_COOKIE ) || + ( !bEnable && m_dwUIElementSinkCookie == TF_INVALID_COOKIE ) ) + { + return; + } + ITfSource* srcTm = nullptr; + 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 = nullptr; + ITfCompartment* pTfOpenMode = nullptr; + ITfCompartment* pTfConvMode = nullptr; + + 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 = nullptr; + 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 = nullptr; + 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 = nullptr; + 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( _In_ UINT uIndex ) +{ + return GetImeId( uIndex ); +}; + +WORD ImeUi_GetLanguage() +{ + return GETLANG(); +}; + +PCTSTR 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( _In_ 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/DXUT11/Optional/ImeUi.h b/DXUT11/Optional/ImeUi.h new file mode 100644 index 0000000..e25a0e1 --- /dev/null +++ b/DXUT11/Optional/ImeUi.h @@ -0,0 +1,126 @@ +//-------------------------------------------------------------------------------------- +// File: ImeUi.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +#include + +class CImeUiFont_Base +{ +public: + virtual void SetHeight( _In_ UINT uHeight ) + { + UNREFERENCED_PARAMETER(uHeight); + }; // for backward compatibility + virtual void SetColor( _In_ DWORD color ) = 0; + virtual void SetPosition( _In_ int x, _In_ int y ) = 0; + virtual void GetTextExtent( _In_z_ LPCTSTR szText, _Out_ DWORD* puWidth, _Out_ DWORD* puHeight ) = 0; + virtual void DrawText( _In_z_ 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( _In_ HWND hwnd, _In_ bool bDisable = false ); +void ImeUi_Uninitialize(); +void ImeUi_SetAppearance( _In_opt_ const IMEUI_APPEARANCE* pia ); +void ImeUi_GetAppearance( _Out_opt_ IMEUI_APPEARANCE* pia ); +bool ImeUi_IgnoreHotKey( _In_ const MSG* pmsg ); +LPARAM ImeUi_ProcessMessage( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _Inout_ LPARAM& lParam, _Out_ bool* trapped ); +void ImeUi_SetScreenDimension( _In_ UINT width, _In_ UINT height ); +void ImeUi_RenderUI( _In_ bool bDrawCompAttr = true, _In_ bool bDrawOtherUi = true ); +void ImeUi_SetCaretPosition( _In_ UINT x, _In_ UINT y ); +void ImeUi_SetCompStringAppearance( _In_ CImeUiFont_Base* pFont, _In_ DWORD color, _In_ const RECT* prc ); +bool ImeUi_GetCaretStatus(); +void ImeUi_SetInsertMode( _In_ bool bInsert ); +void ImeUi_SetState( _In_ DWORD dwState ); +DWORD ImeUi_GetState(); +void ImeUi_EnableIme( _In_ bool bEnable ); +bool ImeUi_IsEnabled(); +void ImeUi_FinalizeString( _In_ bool bSend = false ); +void ImeUi_ToggleLanguageBar( _In_ BOOL bRestore ); +bool ImeUi_IsSendingKeyMessage(); +void ImeUi_SetWindow( _In_ HWND hwnd ); +UINT ImeUi_GetInputCodePage(); +DWORD ImeUi_GetFlags(); +void ImeUi_SetFlags( _In_ DWORD dwFlags, _In_ bool bSet ); + +WORD ImeUi_GetPrimaryLanguage(); +DWORD ImeUi_GetImeId( _In_ UINT uIndex ); +WORD ImeUi_GetLanguage(); +LPCTSTR ImeUi_GetIndicatior(); +bool ImeUi_IsShowReadingWindow(); +bool ImeUi_IsShowCandListWindow(); +bool ImeUi_IsVerticalCand(); +bool ImeUi_IsHorizontalReading(); +TCHAR* ImeUi_GetCandidate( _In_ UINT idx ); +TCHAR* ImeUi_GetCompositionString(); +DWORD ImeUi_GetCandidateSelection(); +DWORD ImeUi_GetCandidateCount(); +BYTE* ImeUi_GetCompStringAttr(); +DWORD ImeUi_GetImeCursorChars(); + +extern void ( CALLBACK*ImeUiCallback_DrawRect )( _In_ int x1, _In_ int y1, _In_ int x2, _In_ int y2, _In_ DWORD color ); +extern void* ( __cdecl*ImeUiCallback_Malloc )( _In_ size_t bytes ); +extern void ( __cdecl*ImeUiCallback_Free )( _In_ void* ptr ); +extern void ( CALLBACK*ImeUiCallback_DrawFans )( _In_ const IMEUI_VERTEX* paVertex, _In_ UINT uNum ); +extern void ( CALLBACK*ImeUiCallback_OnChar )( _In_ WCHAR wc ); diff --git a/DXUT11/Optional/SDKmesh.cpp b/DXUT11/Optional/SDKmesh.cpp new file mode 100644 index 0000000..79a04dd --- /dev/null +++ b/DXUT11/Optional/SDKmesh.cpp @@ -0,0 +1,1311 @@ +//-------------------------------------------------------------------------------------- +// 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. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "DXUT.h" +#include "SDKMesh.h" +#include "SDKMisc.h" + +using namespace DirectX; + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 = nullptr; + pMaterials[m].pNormalTexture11 = nullptr; + pMaterials[m].pSpecularTexture11 = nullptr; + pMaterials[m].pDiffuseRV11 = nullptr; + pMaterials[m].pNormalRV11 = nullptr; + pMaterials[m].pSpecularRV11 = nullptr; + + // 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 = nullptr; + pMaterials[m].pNormalTexture11 = nullptr; + pMaterials[m].pSpecularTexture11 = nullptr; + pMaterials[m].pDiffuseRV11 = nullptr; + pMaterials[m].pNormalRV11 = nullptr; + pMaterials[m].pSpecularRV11 = nullptr; + + // 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; + } + } + } +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 ); + if (SUCCEEDED(hr)) + { + DXUT_SetDebugName(pHeader->pVB11, "CDXUTSDKMesh"); + } + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 ); + if (SUCCEEDED(hr)) + { + DXUT_SetDebugName(pHeader->pIB11, "CDXUTSDKMesh"); + } + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTSDKMesh::CreateFromFile( ID3D11Device* pDev11, + LPCWSTR szFileName, + SDKMESH_CALLBACKS11* pLoaderCallbacks11 ) +{ + 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, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, + nullptr ); + 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, nullptr, FALSE ); + + // Get the file size + LARGE_INTEGER FileSize; + GetFileSizeEx( m_hFile, &FileSize ); + UINT cBytes = FileSize.LowPart; + + // Allocate memory + m_pStaticMeshData = new (std::nothrow) 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, nullptr ) ) + hr = E_FAIL; + + CloseHandle( m_hFile ); + + if( SUCCEEDED( hr ) ) + { + hr = CreateFromMemory( pDev11, + m_pStaticMeshData, + cBytes, + false, + pLoaderCallbacks11 ); + if( FAILED( hr ) ) + delete []m_pStaticMeshData; + } + + return hr; +} + +_Use_decl_annotations_ +HRESULT CDXUTSDKMesh::CreateFromMemory( ID3D11Device* pDev11, + BYTE* pData, + size_t DataBytes, + bool bCopyStatic, + SDKMESH_CALLBACKS11* pLoaderCallbacks11 ) +{ + XMFLOAT3 lower; + XMFLOAT3 upper; + + m_pDev11 = pDev11; + + if ( DataBytes < sizeof(SDKMESH_HEADER) ) + return E_FAIL; + + // Set outstanding resources to zero + m_NumOutstandingResources = 0; + + if( bCopyStatic ) + { + auto pHeader = reinterpret_cast( pData ); + + SIZE_T StaticSize = ( SIZE_T )( pHeader->HeaderSize + pHeader->NonBufferDataSize ); + if ( DataBytes < StaticSize ) + return E_FAIL; + + m_pHeapData = new (std::nothrow) BYTE[ StaticSize ]; + if( !m_pHeapData ) + return E_OUTOFMEMORY; + + m_pStaticMeshData = m_pHeapData; + + memcpy( m_pStaticMeshData, pData, StaticSize ); + } + else + { + m_pHeapData = pData; + m_pStaticMeshData = pData; + } + + // Pointer fixup + m_pMeshHeader = reinterpret_cast( 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 ) + { + return E_NOINTERFACE; + } + + // 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 (std::nothrow) BYTE*[m_pMeshHeader->NumVertexBuffers]; + if ( !m_ppVertices ) + { + return E_OUTOFMEMORY; + } + for( UINT i = 0; i < m_pMeshHeader->NumVertexBuffers; i++ ) + { + BYTE* pVertices = nullptr; + pVertices = ( BYTE* )( pBufferData + ( m_pVertexBufferArray[i].DataOffset - BufferDataStart ) ); + + if( pDev11 ) + CreateVertexBuffer( pDev11, &m_pVertexBufferArray[i], pVertices, pLoaderCallbacks11 ); + + m_ppVertices[i] = pVertices; + } + + // Create IBs + m_ppIndices = new (std::nothrow) BYTE*[m_pMeshHeader->NumIndexBuffers]; + if ( !m_ppIndices ) + { + return E_OUTOFMEMORY; + } + + for( UINT i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ ) + { + BYTE* pIndices = nullptr; + pIndices = ( BYTE* )( pBufferData + ( m_pIndexBufferArray[i].DataOffset - BufferDataStart ) ); + + if( pDev11 ) + CreateIndexBuffer( pDev11, &m_pIndexBufferArray[i], pIndices, pLoaderCallbacks11 ); + + m_ppIndices[i] = pIndices; + } + + // Load Materials + if( pDev11 ) + LoadMaterials( pDev11, m_pMaterialArray, m_pMeshHeader->NumMaterials, pLoaderCallbacks11 ); + + // Create a place to store our bind pose frame matrices + m_pBindPoseFrameMatrices = new (std::nothrow) XMFLOAT4X4[ m_pMeshHeader->NumFrames ]; + if( !m_pBindPoseFrameMatrices ) + { + return E_OUTOFMEMORY; + } + + // Create a place to store our transformed frame matrices + m_pTransformedFrameMatrices = new (std::nothrow) XMFLOAT4X4[ m_pMeshHeader->NumFrames ]; + if( !m_pTransformedFrameMatrices ) + { + return E_OUTOFMEMORY; + } + + m_pWorldPoseFrameMatrices = new (std::nothrow) XMFLOAT4X4[ m_pMeshHeader->NumFrames ]; + if( !m_pWorldPoseFrameMatrices ) + { + return E_OUTOFMEMORY; + } + + SDKMESH_SUBSET* pSubset = nullptr; + 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 = nullptr; + //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++; + XMFLOAT3 *pt = (XMFLOAT3*)&(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 ); + } + + XMFLOAT3 half( ( upper.x - lower.x ) * 0.5f, + ( upper.y - lower.y ) * 0.5f, + ( upper.z - lower.z ) * 0.5f ); + + currentMesh->BoundingBoxCenter.x = lower.x + half.x; + currentMesh->BoundingBoxCenter.y = lower.y + half.y; + currentMesh->BoundingBoxCenter.z = lower.z + half.z; + + currentMesh->BoundingBoxExtents = half; + + } + // Update + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +// transform bind pose frame using a recursive traversal +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTSDKMesh::TransformBindPoseFrame( UINT iFrame, CXMMATRIX parentWorld ) +{ + if( !m_pBindPoseFrameMatrices ) + return; + + // Transform ourselves + XMMATRIX m = XMLoadFloat4x4( &m_pFrameArray[iFrame].Matrix ); + XMMATRIX mLocalWorld = XMMatrixMultiply( m, parentWorld ); + XMStoreFloat4x4( &m_pBindPoseFrameMatrices[iFrame], mLocalWorld ); + + // Transform our siblings + if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME ) + { + TransformBindPoseFrame( m_pFrameArray[iFrame].SiblingFrame, parentWorld ); + } + + // Transform our children + if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME ) + { + TransformBindPoseFrame( m_pFrameArray[iFrame].ChildFrame, mLocalWorld ); + } +} + + +//-------------------------------------------------------------------------------------- +// transform frame using a recursive traversal +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTSDKMesh::TransformFrame( UINT iFrame, CXMMATRIX parentWorld, double fTime ) +{ + // Get the tick data + XMMATRIX mLocalTransform; + + UINT iTick = GetAnimationKeyFromTime( fTime ); + + if( INVALID_ANIMATION_DATA != m_pFrameArray[iFrame].AnimationDataIndex ) + { + auto pFrameData = &m_pAnimationFrameData[ m_pFrameArray[iFrame].AnimationDataIndex ]; + auto pData = &pFrameData->pAnimationData[ iTick ]; + + // turn it into a matrix (Ignore scaling for now) + XMFLOAT3 parentPos = pData->Translation; + XMMATRIX mTranslate = XMMatrixTranslation( parentPos.x, parentPos.y, parentPos.z ); + + XMVECTOR quat = XMVectorSet( pData->Orientation.x, pData->Orientation.y, pData->Orientation.z, pData->Orientation.w ); + if ( XMVector4Equal( quat, g_XMZero ) ) + quat = XMQuaternionIdentity(); + quat = XMQuaternionNormalize( quat ); + XMMATRIX mQuat = XMMatrixRotationQuaternion( quat ); + mLocalTransform = ( mQuat * mTranslate ); + } + else + { + mLocalTransform = XMLoadFloat4x4( &m_pFrameArray[iFrame].Matrix ); + } + + // Transform ourselves + XMMATRIX mLocalWorld = XMMatrixMultiply( mLocalTransform, parentWorld ); + XMStoreFloat4x4( &m_pTransformedFrameMatrices[iFrame], mLocalWorld ); + XMStoreFloat4x4( &m_pWorldPoseFrameMatrices[iFrame], mLocalWorld ); + + // Transform our siblings + if( m_pFrameArray[iFrame].SiblingFrame != INVALID_FRAME ) + { + TransformFrame( m_pFrameArray[iFrame].SiblingFrame, parentWorld, fTime ); + } + + // Transform our children + if( m_pFrameArray[iFrame].ChildFrame != INVALID_FRAME ) + { + TransformFrame( m_pFrameArray[iFrame].ChildFrame, mLocalWorld, fTime ); + } +} + + +//-------------------------------------------------------------------------------------- +// transform frame assuming that it is an absolute transformation +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTSDKMesh::TransformFrameAbsolute( UINT iFrame, double fTime ) +{ + UINT iTick = GetAnimationKeyFromTime( fTime ); + + if( INVALID_ANIMATION_DATA != m_pFrameArray[iFrame].AnimationDataIndex ) + { + auto pFrameData = &m_pAnimationFrameData[ m_pFrameArray[iFrame].AnimationDataIndex ]; + auto pData = &pFrameData->pAnimationData[ iTick ]; + auto pDataOrig = &pFrameData->pAnimationData[ 0 ]; + + XMMATRIX mTrans1 = XMMatrixTranslation( -pDataOrig->Translation.x, -pDataOrig->Translation.y, -pDataOrig->Translation.z ); + XMMATRIX mTrans2 = XMMatrixTranslation( pData->Translation.x, pData->Translation.y, pData->Translation.z ); + + XMVECTOR quat1 = XMVectorSet( pDataOrig->Orientation.x, pDataOrig->Orientation.y, pDataOrig->Orientation.z, pDataOrig->Orientation.w ); + quat1 = XMQuaternionInverse( quat1 ); + XMMATRIX mRot1 = XMMatrixRotationQuaternion( quat1 ); + XMMATRIX mInvTo = mTrans1 * mRot1; + + XMVECTOR quat2 = XMVectorSet( pData->Orientation.x, pData->Orientation.y, pData->Orientation.z, pData->Orientation.w ); + XMMATRIX mRot2 = XMMatrixRotationQuaternion( quat2 ); + XMMATRIX mFrom = mRot2 * mTrans2; + + XMMATRIX mOutput = mInvTo * mFrom; + XMStoreFloat4x4( &m_pTransformedFrameMatrices[iFrame], mOutput ); + } +} + +#define MAX_D3D11_VERTEX_STREAMS D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTSDKMesh::RenderMesh( UINT iMesh, + bool bAdjacent, + ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ) +{ + if( 0 < GetOutstandingBufferResources() ) + return; + + auto 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; + + auto 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 = nullptr; + SDKMESH_MATERIAL* pMat = nullptr; + 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 ); + } +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 ); +} + +//-------------------------------------------------------------------------------------- +CDXUTSDKMesh::CDXUTSDKMesh() : m_NumOutstandingResources( 0 ), + m_bLoading( false ), + m_hFile( 0 ), + m_hFileMappingObject( 0 ), + m_pMeshHeader( nullptr ), + m_pStaticMeshData( nullptr ), + m_pHeapData( nullptr ), + m_pAdjacencyIndexBufferArray( nullptr ), + m_pAnimationData( nullptr ), + m_pAnimationHeader( nullptr ), + m_ppVertices( nullptr ), + m_ppIndices( nullptr ), + m_pBindPoseFrameMatrices( nullptr ), + m_pTransformedFrameMatrices( nullptr ), + m_pWorldPoseFrameMatrices( nullptr ), + m_pDev11( nullptr ) +{ +} + + +//-------------------------------------------------------------------------------------- +CDXUTSDKMesh::~CDXUTSDKMesh() +{ + Destroy(); +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTSDKMesh::Create( ID3D11Device* pDev11, LPCWSTR szFileName, SDKMESH_CALLBACKS11* pLoaderCallbacks ) +{ + return CreateFromFile( pDev11, szFileName, pLoaderCallbacks ); +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTSDKMesh::Create( ID3D11Device* pDev11, BYTE* pData, size_t DataBytes, bool bCopyStatic, SDKMESH_CALLBACKS11* pLoaderCallbacks ) +{ + return CreateFromMemory( pDev11, pData, DataBytes, bCopyStatic, pLoaderCallbacks ); +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTSDKMesh::LoadAnimation( _In_z_ const 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, nullptr, OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, nullptr ); + if( INVALID_HANDLE_VALUE == hFile ) + return DXUTERR_MEDIANOTFOUND; + + ///////////////////////// + // Header + SDKANIMATION_FILE_HEADER fileheader; + if( !ReadFile( hFile, &fileheader, sizeof( SDKANIMATION_FILE_HEADER ), &dwBytesRead, nullptr ) ) + { + CloseHandle(hFile); + return HRESULT_FROM_WIN32(GetLastError()); + } + + //allocate + m_pAnimationData = new (std::nothrow) BYTE[ ( size_t )( sizeof( SDKANIMATION_FILE_HEADER ) + fileheader.AnimationDataSize ) ]; + if( !m_pAnimationData ) + { + CloseHandle(hFile); + return E_OUTOFMEMORY; + } + + // read it all in + liMove.QuadPart = 0; + if( !SetFilePointerEx( hFile, liMove, nullptr, FILE_BEGIN ) ) + { + CloseHandle(hFile); + return HRESULT_FROM_WIN32(GetLastError()); + } + + if( !ReadFile( hFile, m_pAnimationData, ( DWORD )( sizeof( SDKANIMATION_FILE_HEADER ) + + fileheader.AnimationDataSize ), &dwBytesRead, nullptr ) ) + { + CloseHandle(hFile); + return HRESULT_FROM_WIN32(GetLastError()); + } + + // 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 ); + auto pFrame = FindFrame( m_pAnimationFrameData[i].FrameName ); + if( pFrame ) + { + pFrame->AnimationDataIndex = i; + } + } + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::Destroy() +{ + if( !CheckLoadDone() ) + return; + + if( m_pStaticMeshData ) + { + if( m_pMaterialArray ) + { + for( UINT64 m = 0; m < m_pMeshHeader->NumMaterials; m++ ) + { + if( m_pDev11 ) + { + 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++ ) + { + SAFE_RELEASE( m_pVertexBufferArray[i].pVB11 ); + } + + for( UINT64 i = 0; i < m_pMeshHeader->NumIndexBuffers; i++ ) + { + SAFE_RELEASE( m_pIndexBufferArray[i].pIB11 ); + } + } + + 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 = nullptr; + 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 = nullptr; + m_pVertexBufferArray = nullptr; + m_pIndexBufferArray = nullptr; + m_pMeshArray = nullptr; + m_pSubsetArray = nullptr; + m_pFrameArray = nullptr; + m_pMaterialArray = nullptr; + + m_pAnimationHeader = nullptr; + m_pAnimationFrameData = nullptr; + +} + + +//-------------------------------------------------------------------------------------- +// transform the mesh frames according to the animation for time fTime +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTSDKMesh::TransformMesh( CXMMATRIX world, double fTime ) +{ + if( !m_pAnimationHeader || FTT_RELATIVE == m_pAnimationHeader->FrameTransformType ) + { + TransformFrame( 0, world, fTime ); + + // For each frame, move the transform to the bind pose, then + // move it to the final position + for( UINT i = 0; i < m_pMeshHeader->NumFrames; i++ ) + { + XMMATRIX m = XMLoadFloat4x4( &m_pBindPoseFrameMatrices[i] ); + XMMATRIX mInvBindPose = XMMatrixInverse( nullptr, m ); + m = XMLoadFloat4x4( &m_pTransformedFrameMatrices[i] ); + XMMATRIX mFinal = mInvBindPose * m; + XMStoreFloat4x4( &m_pTransformedFrameMatrices[i], mFinal ); + } + } + else if( FTT_ABSOLUTE == m_pAnimationHeader->FrameTransformType ) + { + for( UINT i = 0; i < m_pAnimationHeader->NumFrames; i++ ) + TransformFrameAbsolute( i, fTime ); + } +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTSDKMesh::Render( ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ) +{ + RenderFrame( 0, false, pd3dDeviceContext, iDiffuseSlot, iNormalSlot, iSpecularSlot ); +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +void CDXUTSDKMesh::RenderAdjacent( ID3D11DeviceContext* pd3dDeviceContext, + UINT iDiffuseSlot, + UINT iNormalSlot, + UINT iSpecularSlot ) +{ + RenderFrame( 0, true, pd3dDeviceContext, iDiffuseSlot, iNormalSlot, iSpecularSlot ); +} + + +//-------------------------------------------------------------------------------------- +D3D11_PRIMITIVE_TOPOLOGY CDXUTSDKMesh::GetPrimitiveType11( _In_ 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( _In_ UINT iMesh ) const +{ + 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( _In_ UINT iMesh, _In_ UINT iVB ) const +{ + return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].pVB11; +} + +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetIB11( _In_ UINT iMesh ) const +{ + return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].pIB11; +} +SDKMESH_INDEX_TYPE CDXUTSDKMesh::GetIndexType( _In_ UINT iMesh ) const +{ + return ( SDKMESH_INDEX_TYPE ) m_pIndexBufferArray[m_pMeshArray[ iMesh ].IndexBuffer].IndexType; +} +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetAdjIB11( _In_ UINT iMesh ) const +{ + return m_pAdjacencyIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].pIB11; +} + +//-------------------------------------------------------------------------------------- +const char* CDXUTSDKMesh::GetMeshPathA() const +{ + return m_strPath; +} + +//-------------------------------------------------------------------------------------- +const WCHAR* CDXUTSDKMesh::GetMeshPathW() const +{ + return m_strPathW; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumMeshes() const +{ + if( !m_pMeshHeader ) + return 0; + return m_pMeshHeader->NumMeshes; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumMaterials() const +{ + if( !m_pMeshHeader ) + return 0; + return m_pMeshHeader->NumMaterials; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumVBs() const +{ + if( !m_pMeshHeader ) + return 0; + return m_pMeshHeader->NumVertexBuffers; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumIBs() const +{ + if( !m_pMeshHeader ) + return 0; + return m_pMeshHeader->NumIndexBuffers; +} + +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetVB11At( _In_ UINT iVB ) const +{ + return m_pVertexBufferArray[ iVB ].pVB11; +} + +//-------------------------------------------------------------------------------------- +ID3D11Buffer* CDXUTSDKMesh::GetIB11At( _In_ UINT iIB ) const +{ + return m_pIndexBufferArray[ iIB ].pIB11; +} + +//-------------------------------------------------------------------------------------- +BYTE* CDXUTSDKMesh::GetRawVerticesAt( _In_ UINT iVB ) const +{ + return m_ppVertices[iVB]; +} + +//-------------------------------------------------------------------------------------- +BYTE* CDXUTSDKMesh::GetRawIndicesAt( _In_ UINT iIB ) const +{ + return m_ppIndices[iIB]; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_MATERIAL* CDXUTSDKMesh::GetMaterial( _In_ UINT iMaterial ) const +{ + return &m_pMaterialArray[ iMaterial ]; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_MESH* CDXUTSDKMesh::GetMesh( _In_ UINT iMesh ) const +{ + return &m_pMeshArray[ iMesh ]; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumSubsets( _In_ UINT iMesh ) const +{ + return m_pMeshArray[ iMesh ].NumSubsets; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_SUBSET* CDXUTSDKMesh::GetSubset( _In_ UINT iMesh, _In_ UINT iSubset ) const +{ + return &m_pSubsetArray[ m_pMeshArray[ iMesh ].pSubsets[iSubset] ]; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetVertexStride( _In_ UINT iMesh, _In_ UINT iVB ) const +{ + return ( UINT )m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].StrideBytes; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumFrames() const +{ + return m_pMeshHeader->NumFrames; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_FRAME* CDXUTSDKMesh::GetFrame( _In_ UINT iFrame ) const +{ + assert( iFrame < m_pMeshHeader->NumFrames ); + return &m_pFrameArray[ iFrame ]; +} + +//-------------------------------------------------------------------------------------- +SDKMESH_FRAME* CDXUTSDKMesh::FindFrame( _In_z_ const char* pszName ) const +{ + for( UINT i = 0; i < m_pMeshHeader->NumFrames; i++ ) + { + if( _stricmp( m_pFrameArray[i].Name, pszName ) == 0 ) + { + return &m_pFrameArray[i]; + } + } + return nullptr; +} + +//-------------------------------------------------------------------------------------- +UINT64 CDXUTSDKMesh::GetNumVertices( _In_ UINT iMesh, _In_ UINT iVB ) const +{ + return m_pVertexBufferArray[ m_pMeshArray[ iMesh ].VertexBuffers[iVB] ].NumVertices; +} + +//-------------------------------------------------------------------------------------- +UINT64 CDXUTSDKMesh::GetNumIndices( _In_ UINT iMesh ) const +{ + return m_pIndexBufferArray[ m_pMeshArray[ iMesh ].IndexBuffer ].NumIndices; +} + +//-------------------------------------------------------------------------------------- +XMVECTOR CDXUTSDKMesh::GetMeshBBoxCenter( _In_ UINT iMesh ) const +{ + return XMLoadFloat3( &m_pMeshArray[iMesh].BoundingBoxCenter ); +} + +//-------------------------------------------------------------------------------------- +XMVECTOR CDXUTSDKMesh::GetMeshBBoxExtents( _In_ UINT iMesh ) const +{ + return XMLoadFloat3( &m_pMeshArray[iMesh].BoundingBoxExtents ); +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetOutstandingResources() const +{ + 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 ++; + } + } + } + + return outstandingResources; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetOutstandingBufferResources() const +{ + UINT outstandingResources = 0; + if( !m_pMeshHeader ) + return 1; + + return outstandingResources; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTSDKMesh::CheckLoadDone() +{ + if( 0 == GetOutstandingResources() ) + { + m_bLoading = false; + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTSDKMesh::IsLoaded() const +{ + if( m_pStaticMeshData && !m_bLoading ) + { + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------- +bool CDXUTSDKMesh::IsLoading() const +{ + return m_bLoading; +} + +//-------------------------------------------------------------------------------------- +void CDXUTSDKMesh::SetLoading( _In_ bool bLoading ) +{ + m_bLoading = bLoading; +} + +//-------------------------------------------------------------------------------------- +BOOL CDXUTSDKMesh::HadLoadingError() const +{ + return FALSE; +} + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetNumInfluences( _In_ UINT iMesh ) const +{ + return m_pMeshArray[iMesh].NumFrameInfluences; +} + +//-------------------------------------------------------------------------------------- +XMMATRIX CDXUTSDKMesh::GetMeshInfluenceMatrix( _In_ UINT iMesh, _In_ UINT iInfluence ) const +{ + UINT iFrame = m_pMeshArray[iMesh].pFrameInfluences[ iInfluence ]; + return XMLoadFloat4x4( &m_pTransformedFrameMatrices[iFrame] ); +} + +XMMATRIX CDXUTSDKMesh::GetWorldMatrix( _In_ UINT iFrameIndex ) const +{ + return XMLoadFloat4x4( &m_pWorldPoseFrameMatrices[iFrameIndex] ); +} + +XMMATRIX CDXUTSDKMesh::GetInfluenceMatrix( _In_ UINT iFrameIndex ) const +{ + return XMLoadFloat4x4( &m_pTransformedFrameMatrices[iFrameIndex] ); +} + + +//-------------------------------------------------------------------------------------- +UINT CDXUTSDKMesh::GetAnimationKeyFromTime( _In_ double fTime ) const +{ + if( !m_pAnimationHeader ) + { + return 0; + } + + UINT iTick = ( UINT )( m_pAnimationHeader->AnimationFPS * fTime ); + + iTick = iTick % ( m_pAnimationHeader->NumAnimationKeys - 1 ); + iTick ++; + + return iTick; +} + +_Use_decl_annotations_ +bool CDXUTSDKMesh::GetAnimationProperties( UINT* pNumKeys, float* pFrameTime ) const +{ + if( !m_pAnimationHeader ) + { + *pNumKeys = 0; + *pFrameTime = 0; + return false; + } + + *pNumKeys = m_pAnimationHeader->NumAnimationKeys; + *pFrameTime = 1.0f / (float)m_pAnimationHeader->AnimationFPS; + + return true; +} diff --git a/DXUT11/Optional/SDKmesh.h b/DXUT11/Optional/SDKmesh.h new file mode 100644 index 0000000..499d707 --- /dev/null +++ b/DXUT11/Optional/SDKmesh.h @@ -0,0 +1,460 @@ +//-------------------------------------------------------------------------------------- +// 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. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +#undef D3DCOLOR_ARGB +#include + +//-------------------------------------------------------------------------------------- +// 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 BOOL IsErrorResource( TYPE data ) +{ + if( ( TYPE )ERROR_RESOURCE_VALUE == data ) + return TRUE; + return FALSE; +} +//-------------------------------------------------------------------------------------- +// Enumerated Types. +//-------------------------------------------------------------------------------------- +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. +//-------------------------------------------------------------------------------------- +#pragma pack(push,8) + +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) + ID3D11Buffer* pVB11; + }; +}; + +struct SDKMESH_INDEX_BUFFER_HEADER +{ + UINT64 NumIndices; + UINT64 SizeBytes; + UINT IndexType; + union + { + UINT64 DataOffset; //(This also forces the union to 64bits) + 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 + + DirectX::XMFLOAT3 BoundingBoxCenter; + DirectX::XMFLOAT3 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; + DirectX::XMFLOAT4X4 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]; + + DirectX::XMFLOAT4 Diffuse; + DirectX::XMFLOAT4 Ambient; + DirectX::XMFLOAT4 Specular; + DirectX::XMFLOAT4 Emissive; + float Power; + + union + { + UINT64 Force64_1; //Force the union to 64bits + ID3D11Texture2D* pDiffuseTexture11; + }; + union + { + UINT64 Force64_2; //Force the union to 64bits + ID3D11Texture2D* pNormalTexture11; + }; + union + { + UINT64 Force64_3; //Force the union to 64bits + 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 +{ + DirectX::XMFLOAT3 Translation; + DirectX::XMFLOAT4 Orientation; + DirectX::XMFLOAT3 Scaling; +}; + +struct SDKANIMATION_FRAME_DATA +{ + char FrameName[MAX_FRAME_NAME]; + union + { + UINT64 DataOffset; + SDKANIMATION_DATA* pAnimationData; + }; +}; + +#pragma pack(pop) + +static_assert( sizeof(D3DVERTEXELEMENT9) == 8, "Direct3D9 Decl structure size incorrect" ); +static_assert( sizeof(SDKMESH_HEADER)== 104, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKMESH_VERTEX_BUFFER_HEADER) == 288, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKMESH_INDEX_BUFFER_HEADER) == 32, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKMESH_MESH) == 224, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKMESH_SUBSET) == 144, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKMESH_FRAME) == 184, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKMESH_MATERIAL) == 1256, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKANIMATION_FILE_HEADER) == 40, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKANIMATION_DATA) == 40, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(SDKANIMATION_FRAME_DATA) == 112, "SDK Mesh structure size incorrect" ); + +#ifndef _CONVERTER_APP_ + +//-------------------------------------------------------------------------------------- +// AsyncLoading callbacks +//-------------------------------------------------------------------------------------- +typedef void ( CALLBACK*LPCREATETEXTUREFROMFILE11 )( _In_ ID3D11Device* pDev, _In_z_ char* szFileName, + _Outptr_ ID3D11ShaderResourceView** ppRV, _In_opt_ void* pContext ); +typedef void ( CALLBACK*LPCREATEVERTEXBUFFER11 )( _In_ ID3D11Device* pDev, _Outptr_ ID3D11Buffer** ppBuffer, + _In_ D3D11_BUFFER_DESC BufferDesc, _In_ void* pData, _In_opt_ void* pContext ); +typedef void ( CALLBACK*LPCREATEINDEXBUFFER11 )( _In_ ID3D11Device* pDev, _Outptr_ ID3D11Buffer** ppBuffer, + _In_ D3D11_BUFFER_DESC BufferDesc, _In_ void* pData, _In_opt_ 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; + std::vector m_MappedPointers; + 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 + SDKANIMATION_FILE_HEADER* m_pAnimationHeader; + SDKANIMATION_FRAME_DATA* m_pAnimationFrameData; + DirectX::XMFLOAT4X4* m_pBindPoseFrameMatrices; + DirectX::XMFLOAT4X4* m_pTransformedFrameMatrices; + DirectX::XMFLOAT4X4* m_pWorldPoseFrameMatrices; + +protected: + void LoadMaterials( _In_ ID3D11Device* pd3dDevice, _In_reads_(NumMaterials) SDKMESH_MATERIAL* pMaterials, + _In_ UINT NumMaterials, _In_opt_ SDKMESH_CALLBACKS11* pLoaderCallbacks = nullptr ); + + HRESULT CreateVertexBuffer( _In_ ID3D11Device* pd3dDevice, + _In_ SDKMESH_VERTEX_BUFFER_HEADER* pHeader, _In_reads_(pHeader->SizeBytes) void* pVertices, + _In_opt_ SDKMESH_CALLBACKS11* pLoaderCallbacks = nullptr ); + + HRESULT CreateIndexBuffer( _In_ ID3D11Device* pd3dDevice, + _In_ SDKMESH_INDEX_BUFFER_HEADER* pHeader, _In_reads_(pHeader->SizeBytes) void* pIndices, + _In_opt_ SDKMESH_CALLBACKS11* pLoaderCallbacks = nullptr ); + + virtual HRESULT CreateFromFile( _In_opt_ ID3D11Device* pDev11, + _In_z_ LPCWSTR szFileName, + _In_opt_ SDKMESH_CALLBACKS11* pLoaderCallbacks11 = nullptr ); + + virtual HRESULT CreateFromMemory( _In_opt_ ID3D11Device* pDev11, + _In_reads_(DataBytes) BYTE* pData, + _In_ size_t DataBytes, + _In_ bool bCopyStatic, + _In_opt_ SDKMESH_CALLBACKS11* pLoaderCallbacks11 = nullptr ); + + //frame manipulation + void TransformBindPoseFrame( _In_ UINT iFrame, _In_ DirectX::CXMMATRIX parentWorld ); + void TransformFrame( _In_ UINT iFrame, _In_ DirectX::CXMMATRIX parentWorld, _In_ double fTime ); + void TransformFrameAbsolute( _In_ UINT iFrame, _In_ double fTime ); + + //Direct3D 11 rendering helpers + void RenderMesh( _In_ UINT iMesh, + _In_ bool bAdjacent, + _In_ ID3D11DeviceContext* pd3dDeviceContext, + _In_ UINT iDiffuseSlot, + _In_ UINT iNormalSlot, + _In_ UINT iSpecularSlot ); + void RenderFrame( _In_ UINT iFrame, + _In_ bool bAdjacent, + _In_ ID3D11DeviceContext* pd3dDeviceContext, + _In_ UINT iDiffuseSlot, + _In_ UINT iNormalSlot, + _In_ UINT iSpecularSlot ); + +public: + CDXUTSDKMesh(); + virtual ~CDXUTSDKMesh(); + + virtual HRESULT Create( _In_ ID3D11Device* pDev11, _In_z_ LPCWSTR szFileName, _In_opt_ SDKMESH_CALLBACKS11* pLoaderCallbacks = nullptr ); + virtual HRESULT Create( _In_ ID3D11Device* pDev11, BYTE* pData, size_t DataBytes, _In_ bool bCopyStatic=false, + _In_opt_ SDKMESH_CALLBACKS11* pLoaderCallbacks = nullptr ); + virtual HRESULT LoadAnimation( _In_z_ const WCHAR* szFileName ); + virtual void Destroy(); + + //Frame manipulation + void TransformBindPose( _In_ DirectX::CXMMATRIX world ) { TransformBindPoseFrame( 0, world ); }; + void TransformMesh( _In_ DirectX::CXMMATRIX world, _In_ double fTime ); + + //Direct3D 11 Rendering + virtual void Render( _In_ ID3D11DeviceContext* pd3dDeviceContext, + _In_ UINT iDiffuseSlot = INVALID_SAMPLER_SLOT, + _In_ UINT iNormalSlot = INVALID_SAMPLER_SLOT, + _In_ UINT iSpecularSlot = INVALID_SAMPLER_SLOT ); + virtual void RenderAdjacent( _In_ ID3D11DeviceContext* pd3dDeviceContext, + _In_ UINT iDiffuseSlot = INVALID_SAMPLER_SLOT, + _In_ UINT iNormalSlot = INVALID_SAMPLER_SLOT, + _In_ UINT iSpecularSlot = INVALID_SAMPLER_SLOT ); + + //Helpers (D3D11 specific) + static D3D11_PRIMITIVE_TOPOLOGY GetPrimitiveType11( _In_ SDKMESH_PRIMITIVE_TYPE PrimType ); + DXGI_FORMAT GetIBFormat11( _In_ UINT iMesh ) const; + ID3D11Buffer* GetVB11( _In_ UINT iMesh, _In_ UINT iVB ) const; + ID3D11Buffer* GetIB11( _In_ UINT iMesh ) const; + SDKMESH_INDEX_TYPE GetIndexType( _In_ UINT iMesh ) const; + + ID3D11Buffer* GetAdjIB11( _In_ UINT iMesh ) const; + + //Helpers (general) + const char* GetMeshPathA() const; + const WCHAR* GetMeshPathW() const; + UINT GetNumMeshes() const; + UINT GetNumMaterials() const; + UINT GetNumVBs() const; + UINT GetNumIBs() const; + + ID3D11Buffer* GetVB11At( _In_ UINT iVB ) const; + ID3D11Buffer* GetIB11At( _In_ UINT iIB ) const; + + BYTE* GetRawVerticesAt( _In_ UINT iVB ) const; + BYTE* GetRawIndicesAt( _In_ UINT iIB ) const; + + SDKMESH_MATERIAL* GetMaterial( _In_ UINT iMaterial ) const; + SDKMESH_MESH* GetMesh( _In_ UINT iMesh ) const; + UINT GetNumSubsets( _In_ UINT iMesh ) const; + SDKMESH_SUBSET* GetSubset( _In_ UINT iMesh, _In_ UINT iSubset ) const; + UINT GetVertexStride( _In_ UINT iMesh, _In_ UINT iVB ) const; + UINT GetNumFrames() const; + SDKMESH_FRAME* GetFrame( _In_ UINT iFrame ) const; + SDKMESH_FRAME* FindFrame( _In_z_ const char* pszName ) const; + UINT64 GetNumVertices( _In_ UINT iMesh, _In_ UINT iVB ) const; + UINT64 GetNumIndices( _In_ UINT iMesh ) const; + DirectX::XMVECTOR GetMeshBBoxCenter( _In_ UINT iMesh ) const; + DirectX::XMVECTOR GetMeshBBoxExtents( _In_ UINT iMesh ) const; + UINT GetOutstandingResources() const; + UINT GetOutstandingBufferResources() const; + bool CheckLoadDone(); + bool IsLoaded() const; + bool IsLoading() const; + void SetLoading( _In_ bool bLoading ); + BOOL HadLoadingError() const; + + //Animation + UINT GetNumInfluences( _In_ UINT iMesh ) const; + DirectX::XMMATRIX GetMeshInfluenceMatrix( _In_ UINT iMesh, _In_ UINT iInfluence ) const; + UINT GetAnimationKeyFromTime( _In_ double fTime ) const; + DirectX::XMMATRIX GetWorldMatrix( _In_ UINT iFrameIndex ) const; + DirectX::XMMATRIX GetInfluenceMatrix( _In_ UINT iFrameIndex ) const; + bool GetAnimationProperties( _Out_ UINT* pNumKeys, _Out_ float* pFrameTime ) const; +}; + +#endif + diff --git a/DXUT11/Optional/SDKmisc.cpp b/DXUT11/Optional/SDKmisc.cpp new file mode 100644 index 0000000..992d9d0 --- /dev/null +++ b/DXUT11/Optional/SDKmisc.cpp @@ -0,0 +1,1032 @@ +//-------------------------------------------------------------------------------------- +// File: SDKmisc.cpp +// +// Various helper functionality that is shared between SDK samples +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#include "dxut.h" +#include "SDKmisc.h" +#include "DXUTres.h" + +#include "DXUTGui.h" + +#include "DDSTextureLoader.h" +#include "WICTextureLoader.h" +#include "ScreenGrab.h" + +using namespace DirectX; + +//-------------------------------------------------------------------------------------- +// Global/Static Members +//-------------------------------------------------------------------------------------- +CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache() +{ + // Using an accessor function gives control of the construction order + static CDXUTResourceCache* s_cache = nullptr; + if ( !s_cache ) + { +#if defined(DEBUG) || defined(_DEBUG) + int flag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); + _CrtSetDbgFlag( flag & ~_CRTDBG_ALLOC_MEM_DF ); +#endif + s_cache = new CDXUTResourceCache; +#if defined(DEBUG) || defined(_DEBUG) + _CrtSetDbgFlag( flag ); +#endif + } + return *s_cache; +} + + +//-------------------------------------------------------------------------------------- +// Internal functions forward declarations +//-------------------------------------------------------------------------------------- +bool DXUTFindMediaSearchTypicalDirs( _Out_writes_(cchSearch) WCHAR* strSearchPath, + _In_ int cchSearch, + _In_ LPCWSTR strLeaf, + _In_ const WCHAR* strExePath, + _In_ const WCHAR* strExeName ); +bool DXUTFindMediaSearchParentDirs( _Out_writes_(cchSearch) WCHAR* strSearchPath, + _In_ int cchSearch, + _In_ const WCHAR* strStartAt, + _In_ const WCHAR* strLeafName ); + +INT_PTR CALLBACK DisplaySwitchToREFWarningProc( _In_ HWND hDlg, _In_ UINT message, _In_ WPARAM wParam, _In_ LPARAM lParam ); + + +//-------------------------------------------------------------------------------------- +// Shared code for samples to ask user if they want to use a REF device or quit +//-------------------------------------------------------------------------------------- +void WINAPI DXUTDisplaySwitchingToREFWarning() +{ + if( DXUTGetShowMsgBoxOnError() ) + { + DWORD dwSkipWarning = 0, dwRead = 0, dwWritten = 0; + HANDLE hFile = nullptr; + + // Read previous user settings + WCHAR strPath[MAX_PATH]; + if ( SUCCEEDED(SHGetFolderPath(DXUTGetHWND(), CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, strPath)) ) + { + wcscat_s( strPath, MAX_PATH, L"\\DXUT\\SkipRefWarning.dat" ); + if( ( hFile = CreateFile( strPath, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, + nullptr ) ) != INVALID_HANDLE_VALUE ) + { + (void)ReadFile( hFile, &dwSkipWarning, sizeof( DWORD ), &dwRead, nullptr ); + 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; + 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; + if ( SUCCEEDED(SHGetFolderPath(DXUTGetHWND(), CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, strPath)) ) + { + wcscat_s( strPath, MAX_PATH, L"\\DXUT" ); + CreateDirectory( strPath, nullptr ); + wcscat_s( strPath, MAX_PATH, L"\\SkipRefWarning.dat" ); + if( ( hFile = CreateFile( strPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, 0, + nullptr ) ) != INVALID_HANDLE_VALUE ) + { + WriteFile( hFile, &dwSkipWarning, sizeof( DWORD ), &dwWritten, nullptr ); + CloseHandle( hFile ); + } + } + } + + // User choose not to continue + if( ( nResult & 0x0F ) == IDNO ) + DXUTShutdown( 1 ); + } + } +} + + +//-------------------------------------------------------------------------------------- +// MsgProc for DXUTDisplaySwitchingToREFWarning() dialog box +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 %Iu reference device. This device implements the entire Direct3D %Iu 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( _In_z_ 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. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT WINAPI DXUTFindDXSDKMediaFileCch( WCHAR* strDestPath, int cchDest, + LPCWSTR strFilename ) +{ + bool bFound; + WCHAR strSearchFor[MAX_PATH]; + + if( !strFilename || strFilename[0] == 0 || !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 = nullptr; + GetModuleFileName( nullptr, 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\\%ls", 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\\%ls", 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 +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool DXUTFindMediaSearchTypicalDirs( WCHAR* strSearchPath, int cchSearch, LPCWSTR strLeaf, + const WCHAR* strExePath, const 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"..\\%ls", strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in ..\..\ + swprintf_s( strSearchPath, cchSearch, L"..\\..\\%ls", strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in ..\..\ + swprintf_s( strSearchPath, cchSearch, L"..\\..\\%ls", strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in the %EXE_DIR%\ + swprintf_s( strSearchPath, cchSearch, L"%ls\\%ls", strExePath, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in the %EXE_DIR%\..\ + swprintf_s( strSearchPath, cchSearch, L"%ls\\..\\%ls", strExePath, strLeaf ); + if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) + return true; + + // Search in the %EXE_DIR%\..\..\ + swprintf_s( strSearchPath, cchSearch, L"%ls\\..\\..\\%ls", 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"%ls\\..\\%ls\\%ls", 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"%ls\\..\\..\\%ls\\%ls", 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"%ls%ls", 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. +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +bool DXUTFindMediaSearchParentDirs( WCHAR* strSearchPath, int cchSearch, const WCHAR* strStartAt, + const WCHAR* strLeafName ) +{ + WCHAR strFullPath[MAX_PATH] = + { + 0 + }; + WCHAR strFullFileName[MAX_PATH] = + { + 0 + }; + WCHAR strSearch[MAX_PATH] = + { + 0 + }; + WCHAR* strFilePart = nullptr; + + if ( !GetFullPathName( strStartAt, MAX_PATH, strFullPath, &strFilePart ) ) + return false; + +#pragma warning( disable : 6102 ) + while( strFilePart && *strFilePart != '\0' ) + { + swprintf_s( strFullFileName, MAX_PATH, L"%ls\\%ls", strFullPath, strLeafName ); + if( GetFileAttributes( strFullFileName ) != 0xFFFFFFFF ) + { + wcscpy_s( strSearchPath, cchSearch, strFullFileName ); + return true; + } + + swprintf_s( strSearch, MAX_PATH, L"%ls\\..", strFullPath ); + if ( !GetFullPathName( strSearch, MAX_PATH, strFullPath, &strFilePart ) ) + return false; + } + + return false; +} + + +//-------------------------------------------------------------------------------------- +// Compiles HLSL shaders +//-------------------------------------------------------------------------------------- +#if D3D_COMPILER_VERSION < 46 + +namespace +{ + +struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } }; + +typedef public std::unique_ptr ScopedHandle; + +inline HANDLE safe_handle( HANDLE h ) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; } + +class CIncludeHandler : public ID3DInclude + // Not as robust as D3D_COMPILE_STANDARD_FILE_INCLUDE, but it works in most cases +{ +private: + static const unsigned int MAX_INCLUDES = 9; + + struct sInclude + { + HANDLE hFile; + HANDLE hFileMap; + LARGE_INTEGER FileSize; + void *pMapData; + }; + + struct sInclude m_includeFiles[MAX_INCLUDES]; + size_t m_nIncludes; + bool m_reset; + WCHAR m_workingPath[MAX_PATH]; + +public: + CIncludeHandler() : m_nIncludes(0), m_reset(false) + { + if ( !GetCurrentDirectoryW( MAX_PATH, m_workingPath ) ) + *m_workingPath = 0; + + for ( size_t i = 0; i < MAX_INCLUDES; ++i ) + { + m_includeFiles[i].hFile = INVALID_HANDLE_VALUE; + m_includeFiles[i].hFileMap = INVALID_HANDLE_VALUE; + m_includeFiles[i].pMapData = nullptr; + } + } + virtual ~CIncludeHandler() + { + for ( size_t i = 0; i < m_nIncludes; ++i ) + { + UnmapViewOfFile( m_includeFiles[i].pMapData ); + + if ( m_includeFiles[i].hFileMap != INVALID_HANDLE_VALUE) + CloseHandle( m_includeFiles[i].hFileMap ); + + if ( m_includeFiles[i].hFile != INVALID_HANDLE_VALUE) + CloseHandle( m_includeFiles[i].hFile ); + } + + m_nIncludes = 0; + + if ( m_reset && *m_workingPath ) + { + SetCurrentDirectoryW( m_workingPath ); + } + } + + STDMETHOD(Open( D3D_INCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes ) ) + { + UNREFERENCED_PARAMETER(IncludeType); + UNREFERENCED_PARAMETER(pParentData); + + size_t incIndex = m_nIncludes+1; + + // Make sure we have enough room for this include file + if ( incIndex >= MAX_INCLUDES ) + return E_FAIL; + + // try to open the file + m_includeFiles[incIndex].hFile = CreateFileA( pFileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr ); + if( INVALID_HANDLE_VALUE == m_includeFiles[incIndex].hFile ) + { + return E_FAIL; + } + + // Get the file size + GetFileSizeEx( m_includeFiles[incIndex].hFile, &m_includeFiles[incIndex].FileSize ); + + // Use Memory Mapped File I/O for the header data + m_includeFiles[incIndex].hFileMap = CreateFileMappingA( m_includeFiles[incIndex].hFile, nullptr, PAGE_READONLY, m_includeFiles[incIndex].FileSize.HighPart, m_includeFiles[incIndex].FileSize.LowPart, pFileName); + if( !m_includeFiles[incIndex].hFileMap ) + { + if (m_includeFiles[incIndex].hFile != INVALID_HANDLE_VALUE) + CloseHandle( m_includeFiles[incIndex].hFile ); + return E_FAIL; + } + + // Create Map view + *ppData = MapViewOfFile( m_includeFiles[incIndex].hFileMap, FILE_MAP_READ, 0, 0, 0 ); + *pBytes = m_includeFiles[incIndex].FileSize.LowPart; + + // Success - Increment the include file count + m_nIncludes = incIndex; + + return S_OK; + } + + STDMETHOD(Close( LPCVOID pData )) + { + UNREFERENCED_PARAMETER(pData); + // Defer Closure until the container destructor + return S_OK; + } + + void SetCWD( LPCWSTR pFileName ) + { + WCHAR filePath[MAX_PATH]; + wcscpy_s( filePath, MAX_PATH, pFileName ); + + WCHAR *strLastSlash = wcsrchr( filePath, L'\\' ); + if( strLastSlash ) + { + // Chop the exe name from the exe path + *strLastSlash = 0; + m_reset = true; + SetCurrentDirectoryW( filePath ); + } + } +}; + +}; // namespace + +#endif + +_Use_decl_annotations_ +HRESULT WINAPI DXUTCompileFromFile( LPCWSTR pFileName, + const D3D_SHADER_MACRO* pDefines, + LPCSTR pEntrypoint, LPCSTR pTarget, + UINT Flags1, UINT Flags2, + ID3DBlob** ppCode ) +{ + HRESULT hr; + WCHAR str[MAX_PATH]; + V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, pFileName ) ); + +#if defined( DEBUG ) || defined( _DEBUG ) + // Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders. + // Setting this flag improves the shader debugging experience, but still allows + // the shaders to be optimized and to run exactly the way they will run in + // the release configuration of this program. + Flags1 |= D3DCOMPILE_DEBUG; +#endif + + ID3DBlob* pErrorBlob = nullptr; + +#if D3D_COMPILER_VERSION >= 46 + + hr = D3DCompileFromFile( str, pDefines, D3D_COMPILE_STANDARD_FILE_INCLUDE, + pEntrypoint, pTarget, Flags1, Flags2, + ppCode, &pErrorBlob ); + +#else + + ScopedHandle hFile( safe_handle( CreateFileW( str, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr ) ) ); + + if ( !hFile ) + return HRESULT_FROM_WIN32( GetLastError() ); + + LARGE_INTEGER FileSize = { 0 }; + +#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) + FILE_STANDARD_INFO fileInfo; + if ( !GetFileInformationByHandleEx( hFile.get(), FileStandardInfo, &fileInfo, sizeof(fileInfo) ) ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + FileSize = fileInfo.EndOfFile; +#else + GetFileSizeEx( hFile.get(), &FileSize ); +#endif + + if (!FileSize.LowPart || FileSize.HighPart > 0) + return E_FAIL; + + std::unique_ptr fxData; + fxData.reset( new (std::nothrow) char[ FileSize.LowPart ] ); + if ( !fxData ) + return E_OUTOFMEMORY; + + DWORD BytesRead = 0; + if ( !ReadFile( hFile.get(), fxData.get(), FileSize.LowPart, &BytesRead, nullptr ) ) + return HRESULT_FROM_WIN32( GetLastError() ); + + if (BytesRead < FileSize.LowPart) + return E_FAIL; + + char pSrcName[MAX_PATH]; + int result = WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, str, -1, pSrcName, MAX_PATH, nullptr, FALSE ); + if ( !result ) + return E_FAIL; + + const CHAR* pstrName = strrchr( pSrcName, '\\' ); + if (!pstrName) + { + pstrName = pSrcName; + } + else + { + pstrName++; + } + + std::unique_ptr includes( new (std::nothrow) CIncludeHandler ); + if ( !includes ) + return E_OUTOFMEMORY; + + includes->SetCWD( str ); + + hr = D3DCompile( fxData.get(), BytesRead, pstrName, pDefines, includes.get(), + pEntrypoint, pTarget, Flags1, Flags2, + ppCode, &pErrorBlob ); + +#endif + +#pragma warning( suppress : 6102 ) + if ( pErrorBlob ) + { + OutputDebugStringA( reinterpret_cast( pErrorBlob->GetBufferPointer() ) ); + pErrorBlob->Release(); + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Texture utilities +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +HRESULT WINAPI DXUTCreateShaderResourceViewFromFile( ID3D11Device* d3dDevice, const wchar_t* szFileName, ID3D11ShaderResourceView** textureView ) +{ + if ( !d3dDevice || !szFileName || !textureView ) + return E_INVALIDARG; + + WCHAR str[MAX_PATH]; + HRESULT hr = DXUTFindDXSDKMediaFileCch( str, MAX_PATH, szFileName ); + if ( FAILED(hr) ) + return hr; + + WCHAR ext[_MAX_EXT]; + _wsplitpath_s( str, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT ); + + if ( _wcsicmp( ext, L".dds" ) == 0 ) + { + hr = DirectX::CreateDDSTextureFromFile( d3dDevice, str, nullptr, textureView ); + } + else + { + hr = DirectX::CreateWICTextureFromFile( d3dDevice, nullptr, str, nullptr, textureView ); + } + + return hr; +} + +_Use_decl_annotations_ +HRESULT WINAPI DXUTCreateTextureFromFile( ID3D11Device* d3dDevice, const wchar_t* szFileName, ID3D11Resource** texture ) +{ + if ( !d3dDevice || !szFileName || !texture ) + return E_INVALIDARG; + + WCHAR str[MAX_PATH]; + HRESULT hr = DXUTFindDXSDKMediaFileCch( str, MAX_PATH, szFileName ); + if ( FAILED(hr) ) + return hr; + + WCHAR ext[_MAX_EXT]; + _wsplitpath_s( str, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT ); + + if ( _wcsicmp( ext, L".dds" ) == 0 ) + { + hr = DirectX::CreateDDSTextureFromFile( d3dDevice, str, texture, nullptr ); + } + else + { + hr = DirectX::CreateWICTextureFromFile( d3dDevice, nullptr, str, texture, nullptr ); + } + + return hr; +} + +_Use_decl_annotations_ +HRESULT WINAPI DXUTSaveTextureToFile( ID3D11DeviceContext* pContext, ID3D11Resource* pSource, bool usedds, const wchar_t* szFileName ) +{ + if ( !pContext || !pSource || !szFileName ) + return E_INVALIDARG; + + HRESULT hr; + + if ( usedds ) + { + hr = DirectX::SaveDDSTextureToFile( pContext, pSource, szFileName ); + } + else + { + hr = DirectX::SaveWICTextureToFile( pContext, pSource, GUID_ContainerFormatBmp, szFileName ); + } + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// Desc: Returns a view matrix for rendering to a face of a cubemap. +//-------------------------------------------------------------------------------------- +XMMATRIX WINAPI DXUTGetCubeMapViewMatrix( _In_ DWORD dwFace ) +{ + static const XMVECTORF32 s_vLookDir[] = + { + { 1.0f, 0.0f, 0.0f, 0.0f }, + { -1.0f, 0.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f, 0.0f }, + { 0.0f, -1.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f, 0.0f }, + { 0.0f, 0.0f, -1.0f, 0.0f }, + }; + + static const XMVECTORF32 s_vUpDir[] = + { + { 0.0f, 1.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, -1.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f, 0.0f }, + }; + + static_assert( _countof(s_vLookDir) == _countof(s_vUpDir), "arrays mismatch" ); + + if ( dwFace >= _countof(s_vLookDir) + || dwFace >= _countof(s_vUpDir) ) + return XMMatrixIdentity(); + + // Set the view transform for this cubemap surface + return XMMatrixLookAtLH( g_XMZero, s_vLookDir[ dwFace ], s_vUpDir[ dwFace ] ); +} + + +//====================================================================================== +// CDXUTResourceCache +//====================================================================================== + +CDXUTResourceCache::~CDXUTResourceCache() +{ + OnDestroyDevice(); +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTResourceCache::CreateTextureFromFile( ID3D11Device* pDevice, ID3D11DeviceContext *pContext, LPCWSTR pSrcFile, + ID3D11ShaderResourceView** ppOutputRV, bool bSRGB ) +{ + if ( !ppOutputRV ) + return E_INVALIDARG; + + *ppOutputRV = nullptr; + + for( auto it = m_TextureCache.cbegin(); it != m_TextureCache.cend(); ++it ) + { + if( !wcscmp( it->wszSource, pSrcFile ) + && it->bSRGB == bSRGB + && it->pSRV11 ) + { + it->pSRV11->AddRef(); + *ppOutputRV = it->pSRV11; + return S_OK; + } + } + + WCHAR ext[_MAX_EXT]; + _wsplitpath_s( pSrcFile, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT ); + + HRESULT hr; + if ( _wcsicmp( ext, L".dds" ) == 0 ) + { + hr = DirectX::CreateDDSTextureFromFileEx( pDevice, pSrcFile, 0, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, bSRGB, + nullptr, ppOutputRV, nullptr ); + } + else + { + hr = DirectX::CreateWICTextureFromFileEx( pDevice, pContext, pSrcFile, 0, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, bSRGB, + nullptr, ppOutputRV ); + } + + if ( FAILED(hr) ) + return hr; + + DXUTCache_Texture entry; + wcscpy_s( entry.wszSource, MAX_PATH, pSrcFile ); + entry.bSRGB = bSRGB; + entry.pSRV11 = *ppOutputRV; + entry.pSRV11->AddRef(); + m_TextureCache.push_back( entry ); + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +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 ); +} + + +//-------------------------------------------------------------------------------------- +// Device event callbacks +//-------------------------------------------------------------------------------------- + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTResourceCache::OnDestroyDevice() +{ + // Release all resources + for( size_t j = 0; j < m_TextureCache.size(); ++j ) + { + SAFE_RELEASE( m_TextureCache[ j ].pSRV11 ); + } + m_TextureCache.clear(); + m_TextureCache.shrink_to_fit(); + + return S_OK; +} + + +//====================================================================================== +// CDXUTTextHelper +//====================================================================================== + +_Use_decl_annotations_ +CDXUTTextHelper::CDXUTTextHelper( ID3D11Device* pd3d11Device, ID3D11DeviceContext* pd3d11DeviceContext, CDXUTDialogResourceManager* pManager, int nLineHeight ) +{ + Init( nLineHeight ); + m_pd3d11Device = pd3d11Device; + m_pd3d11DeviceContext = pd3d11DeviceContext; + m_pManager = pManager; +} + +CDXUTTextHelper::~CDXUTTextHelper() +{ + +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTextHelper::Init( _In_ int nLineHeight ) +{ + m_clr = XMFLOAT4( 1, 1, 1, 1 ); + m_pt.x = 0; + m_pt.y = 0; + m_nLineHeight = nLineHeight; + m_pd3d11Device = nullptr; + m_pd3d11DeviceContext = nullptr; + m_pManager = nullptr; + + // Create a blend state if a sprite is passed in +} + + +//-------------------------------------------------------------------------------------- +HRESULT CDXUTTextHelper::DrawFormattedTextLine( _In_z_ 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( _In_z_ const WCHAR* strMsg ) +{ + if( !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 ); + 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; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTTextHelper::DrawFormattedTextLine( const RECT& rc, 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, strBuffer ); +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT CDXUTTextHelper::DrawTextLine( const RECT& rc, const WCHAR* strMsg ) +{ + if( !m_pd3d11DeviceContext ) + return DXUT_ERR_MSGBOX( L"DrawTextLine", E_INVALIDARG ); + + HRESULT hr = S_OK; + 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_pd3d11DeviceContext ) + { + m_pManager->StoreD3D11State( m_pd3d11DeviceContext ); + m_pManager->ApplyRenderUI11( m_pd3d11DeviceContext ); + } + + +} + + +//-------------------------------------------------------------------------------------- +void CDXUTTextHelper::End() +{ + if( m_pd3d11DeviceContext ) + { + m_pManager->RestoreD3D11State( m_pd3d11DeviceContext ); + } +} diff --git a/DXUT11/Optional/SDKmisc.h b/DXUT11/Optional/SDKmisc.h new file mode 100644 index 0000000..14ee349 --- /dev/null +++ b/DXUT11/Optional/SDKmisc.h @@ -0,0 +1,134 @@ +//-------------------------------------------------------------------------------------- +// File: SDKMisc.h +// +// Various helper functionality that is shared between SDK samples +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=320437 +//-------------------------------------------------------------------------------------- +#pragma once + +//----------------------------------------------------------------------------- +// Resource cache for textures, fonts, meshs, and effects. +// Use DXUTGetGlobalResourceCache() to access the global cache +//----------------------------------------------------------------------------- + +struct DXUTCache_Texture +{ + WCHAR wszSource[MAX_PATH]; + bool bSRGB; + ID3D11ShaderResourceView* pSRV11; + + DXUTCache_Texture() : + pSRV11(nullptr) + { + } +}; + + +class CDXUTResourceCache +{ +public: + ~CDXUTResourceCache(); + + HRESULT CreateTextureFromFile( _In_ ID3D11Device* pDevice, _In_ ID3D11DeviceContext *pContext, _In_z_ LPCWSTR pSrcFile, + _Outptr_ ID3D11ShaderResourceView** ppOutputRV, _In_ bool bSRGB=false ); + HRESULT CreateTextureFromFile( _In_ ID3D11Device* pDevice, _In_ ID3D11DeviceContext *pContext, _In_z_ LPCSTR pSrcFile, + _Outptr_ ID3D11ShaderResourceView** ppOutputRV, _In_ bool bSRGB=false ); +public: + HRESULT OnDestroyDevice(); + +protected: + friend CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache(); + friend HRESULT WINAPI DXUTInitialize3DEnvironment(); + friend HRESULT WINAPI DXUTReset3DEnvironment(); + friend void WINAPI DXUTCleanup3DEnvironment( bool bReleaseSettings ); + + CDXUTResourceCache() { } + + std::vector m_TextureCache; +}; + +CDXUTResourceCache& WINAPI DXUTGetGlobalResourceCache(); + + +//-------------------------------------------------------------------------------------- +// Manages the insertion point when drawing text +//-------------------------------------------------------------------------------------- +class CDXUTDialogResourceManager; +class CDXUTTextHelper +{ +public: + CDXUTTextHelper( _In_ ID3D11Device* pd3d11Device, _In_ ID3D11DeviceContext* pd3dDeviceContext, _In_ CDXUTDialogResourceManager* pManager, _In_ int nLineHeight ); + ~CDXUTTextHelper(); + + void Init( _In_ int nLineHeight = 15 ); + + void SetInsertionPos( _In_ int x, _In_ int y ) + { + m_pt.x = x; + m_pt.y = y; + } + void SetForegroundColor( _In_ DirectX::XMFLOAT4 clr ) { m_clr = clr; } + void SetForegroundColor( _In_ DirectX::FXMVECTOR clr ) { XMStoreFloat4( &m_clr, clr ); } + + void Begin(); + HRESULT DrawFormattedTextLine( _In_z_ const WCHAR* strMsg, ... ); + HRESULT DrawTextLine( _In_z_ const WCHAR* strMsg ); + HRESULT DrawFormattedTextLine( _In_ const RECT& rc, _In_z_ const WCHAR* strMsg, ... ); + HRESULT DrawTextLine( _In_ const RECT& rc, _In_z_ const WCHAR* strMsg ); + void End(); + +protected: + DirectX::XMFLOAT4 m_clr; + POINT m_pt; + int m_nLineHeight; + + // D3D11 font + ID3D11Device* m_pd3d11Device; + ID3D11DeviceContext* m_pd3d11DeviceContext; + CDXUTDialogResourceManager* m_pManager; +}; + + +//-------------------------------------------------------------------------------------- +// Shared code for samples to ask user if they want to use a REF device or quit +//-------------------------------------------------------------------------------------- +void WINAPI DXUTDisplaySwitchingToREFWarning(); + +//-------------------------------------------------------------------------------------- +// Tries to finds a media file by searching in common locations +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTFindDXSDKMediaFileCch( _Out_writes_(cchDest) WCHAR* strDestPath, + _In_ int cchDest, + _In_z_ LPCWSTR strFilename ); +HRESULT WINAPI DXUTSetMediaSearchPath( _In_z_ LPCWSTR strPath ); +LPCWSTR WINAPI DXUTGetMediaSearchPath(); + + +//-------------------------------------------------------------------------------------- +// Compiles HLSL shaders +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCompileFromFile( _In_z_ LPCWSTR pFileName, + _In_reads_opt_(_Inexpressible_(pDefines->Name != NULL)) const D3D_SHADER_MACRO* pDefines, + _In_z_ LPCSTR pEntrypoint, _In_z_ LPCSTR pTarget, + _In_ UINT Flags1, _In_ UINT Flags2, + _Outptr_ ID3DBlob** ppCode ); + +//-------------------------------------------------------------------------------------- +// Texture utilities +//-------------------------------------------------------------------------------------- +HRESULT WINAPI DXUTCreateShaderResourceViewFromFile( _In_ ID3D11Device* d3dDevice, _In_z_ const wchar_t* szFileName, _Outptr_ ID3D11ShaderResourceView** textureView ); +HRESULT WINAPI DXUTCreateTextureFromFile( _In_ ID3D11Device* d3dDevice, _In_z_ const wchar_t* szFileName, _Outptr_ ID3D11Resource** texture ); +HRESULT WINAPI DXUTSaveTextureToFile( _In_ ID3D11DeviceContext* pContext, _In_ ID3D11Resource* pSource, _In_ bool usedds, _In_z_ const wchar_t* szFileName ); + +//-------------------------------------------------------------------------------------- +// Returns a view matrix for rendering to a face of a cubemap. +//-------------------------------------------------------------------------------------- +DirectX::XMMATRIX WINAPI DXUTGetCubeMapViewMatrix( _In_ DWORD dwFace ); diff --git a/DXUT11/Optional/directx.ico b/DXUT11/Optional/directx.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc43c1b2085df668dffff26d80adcb0ef73f23a9 GIT binary patch literal 25214 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. + +All content and source code for this package are subject to the terms of the MIT License. +. + +For the latest version of DXUT11, more detailed documentation, etc., please visit the project site. + +http://go.microsoft.com/fwlink/?LinkId=320437 + +This project has adopted the Microsoft Open Source Code of Conduct. For more information see the +Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments. + +https://opensource.microsoft.com/codeofconduct/ + + +------- +SAMPLES +------- + +Direct3D Tutorial08 - 10 +BasicHLSL11, EmptyProject11, SimpleSample11 +DXUT+DirectXTK Simple Sample + +These are hosted on GitHub + + +---------- +DISCLAIMER +---------- + +DXUT is being provided as a porting aid for older code that makes use of the legacy DirectX SDK, the deprecated D3DX9/D3DX11 +library, and the DXUT11 framework. It is a cleaned up version of the original DXUT11 that will build with the Windows 8.1 SDK +and does not make use of any legacy DirectX SDK or DirectSetup deployed components. + +The DXUT framework is for use in Win32 desktop applications. It not usable for Universal Windows Platform apps, Windows Store apps, +Xbox One apps, or Windows phone. + +This version of DXUT only supports Direct3D 11, and therefore is not compatible with Windows XP or early versions of Windows Vista. + + +--------------- +RELEASE HISTORY +--------------- + +March 10, 2017 (11.15) + Add VS 2017 projects + Minor code cleanup + +September 15, 2016 (11.14) + Updated WICTextureLoader and ScreenGrab + +August 2, 2016 (11.13) + Updated for VS 2015 Update 3 and Windows 10 SDK (14393) + +April 26, 2016 (11.12) + Updated DDSTextureLoader, WICTextureLoader, and ScreenGrab + Retired VS 2012 projects and obsolete adapter code + Minor code and project file cleanup + +November 30, 2015 (11.11) + Updated DDSTextureLoader, ScreenGrab, DXERR + Updated for VS 2015 Update 1 and Windows 10 SDK (10586) + +July 29, 2015 (11.10) + Updated for VS 2015 and Windows 10 SDK RTM + Retired VS 2010 projects + +June 16, 2015 (11.09) + Optional support for Direct3D 11.3 (define USE_DIRECT3D11_3 in VS 2015 projects) + +April 14, 2015 (11.08) + Fix for auto-gen of volume textures + More updates for VS 2015 + +November 24, 2014 (11.07) + Minor fix for Present usage + Minor fix for CBaseCamera::GetInput + Minor fix for WIC usage of IWICFormatConverter + Updates for Visual Studio 2015 Technical Preview + +July 28, 2014 (11.06) + Optional support for Direct3D 11.2 (define USE_DIRECT3D11_2 in VS 2013 projects) + Fixes for various UI and F2 device settings dialog issues + Fixes for device and format enumeration + Changed default resolution to 800x600 + Code review fixes + +January 24, 2014 (11.05) + Added use of DXGI debugging when available + Resolved CRT heap leak report + Fixed compile bug in DXUTLockFreePipe + Fixed bug reported in DXUT's sprite implementation + Code cleanup (removed DXGI_1_2_FORMATS control define; ScopedObject typedef removed) + +October 21, 2013 (11.04) + Updated for Visual Studio 2013 and Windows 8.1 SDK RTM + Minor fixes for systems which only have a "Microsoft Basic Renderer" device + +September 2013 (11.03) + Removed dependencies on the D3DX9 and D3DX11 libraries, so DXUT no longer requires the legacy DirectX SDK to build. + It does require the d3dcompiler.h header from the Windows 8.x SDK. + Includes standalone DDSTextureLoader, WICTexureLoader, ScreenGrab, and DxErr modules. + Removed support for Direct3D 9 and Windows XP + Deleted the DXUTDevice9.h/.cpp, SDKSound.h/.cpp, and SDKWaveFile.h/.cpp files + Deleted legacy support for MCE relaunch + General C++ code cleanups (nullptr, auto keyword, C++ style casting, Safer CRT, etc.) which are + compatible with Visual C++ 2010 and 2012 + SAL2 annotation and /analyze cleanup + Added DXUTCompileFromFile, DXUTCreateShaderResourceViewFromFile, DXUTCreateTextureFromFile, DXUTSaveTextureToFile helpers + Added '-forcewarp' command-line switch + Added support for DXGI 1.1 and 1.2 formats + Added Direct3D 11.1 Device/Context state + Support Feature Level 11.1 when available + +June 2010 (11.02) + The DirectX SDK (June 2010) included an update to DXUT11. This is the last version to support Visual Studio 2008, + Windows XP, or Direct3D 9. The source code is located in Samples\C++\DXUT11. + +February 2010 (11.01) + An update was shipped with the DirectX SDK (February 2010). This is the last version to support Visual Studio 2005. + The source code is located in Samples\C++\DXUT11. + +August 2009 (11.00) + The initial release of DXUT11 was in DirectX SDK (August 2009). The source code is located in Samples\C++\DXUT11. + This was a port of the original DXUT which supported Direct3D 10 / Direct3D 9 applications on Windows XP and Windows Vista. diff --git a/DXUT11/Windows10SDKVS13_x64.props b/DXUT11/Windows10SDKVS13_x64.props new file mode 100644 index 0000000..f9d4675 --- /dev/null +++ b/DXUT11/Windows10SDKVS13_x64.props @@ -0,0 +1,12 @@ + + + + + + $(ProgramFiles)\Windows Kits\10\bin\x86;$(ExecutablePath) + $(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\um;$(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\shared;$(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\winrt;$(IncludePath) + $(ProgramFiles)\Windows Kits\10\lib\10.0.14393.0\um\x64;$(LibraryPath) + $(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\um;$(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\shared;$(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\winrt;$(ExcludePath) + + + \ No newline at end of file diff --git a/DXUT11/Windows10SDKVS13_x86.props b/DXUT11/Windows10SDKVS13_x86.props new file mode 100644 index 0000000..9e2f073 --- /dev/null +++ b/DXUT11/Windows10SDKVS13_x86.props @@ -0,0 +1,12 @@ + + + + + + $(ProgramFiles)\Windows Kits\10\bin\x86;$(ExecutablePath) + $(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\um;$(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\shared;$(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\winrt;$(IncludePath) + $(ProgramFiles)\Windows Kits\10\lib\10.0.14393.0\um\x86;$(LibraryPath) + $(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\um;$(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\shared;$(ProgramFiles)\Windows Kits\10\Include\10.0.14393.0\winrt;$(ExcludePath) + + + \ No newline at end of file diff --git a/DirectXTK/.gitattributes b/DirectXTK/.gitattributes new file mode 100644 index 0000000..ba6590f --- /dev/null +++ b/DirectXTK/.gitattributes @@ -0,0 +1,20 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Explicitly declare code/VS files as CRLF +*.cs eol=crlf +*.cpp eol=crlf +*.cmd eol=crlf +*.h eol=crlf +*.hlsl eol=crlf +*.hlsli eol=crlf +*.fx eol=crlf +*.fxh eol=crlf +*.inc eol=crlf +*.inl eol=crlf +*.vcxproj eol=crlf +*.filters eol=crlf +*.sln eol=crlf + +# Explicitly declare resource files as binary +*.pdb binary diff --git a/DirectXTK/.gitignore b/DirectXTK/.gitignore new file mode 100644 index 0000000..71be359 --- /dev/null +++ b/DirectXTK/.gitignore @@ -0,0 +1,26 @@ +*.psess +*.vsp +*.log +*.err +*.wrn +*.suo +*.sdf +*.user +*.i +*.vspscc +*.opensdf +*.opendb +*.ipch +*.cache +*.tlog +*.lastbuildstate +*.ilk +*.VC.db +.vs +Bin +/Src/Shaders/Compiled/XboxOne*.inc +/Src/Shaders/Compiled/XboxOne*.pdb +/ipch +/MakeSpriteFont/obj +/Tests +/wiki \ No newline at end of file diff --git a/DirectXTK/Audio/AudioEngine.cpp b/DirectXTK/Audio/AudioEngine.cpp new file mode 100644 index 0000000..6bd2327 --- /dev/null +++ b/DirectXTK/Audio/AudioEngine.cpp @@ -0,0 +1,1739 @@ +//-------------------------------------------------------------------------------------- +// File: AudioEngine.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Audio.h" +#include "SoundCommon.h" + +#include +#include + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + +//#define VERBOSE_TRACE + +namespace +{ + struct EngineCallback : public IXAudio2EngineCallback + { + EngineCallback() + { + mCriticalError.reset( CreateEventEx( nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE ) ); + if ( !mCriticalError ) + { + throw std::exception( "CreateEvent" ); + } + }; + + virtual ~EngineCallback() + { + } + + STDMETHOD_(void, OnProcessingPassStart) () override {} + STDMETHOD_(void, OnProcessingPassEnd)() override {} + + STDMETHOD_(void, OnCriticalError) (THIS_ HRESULT error) + { +#ifndef _DEBUG + UNREFERENCED_PARAMETER(error); +#endif + DebugTrace( "ERROR: AudioEngine encountered critical error (%08X)\n", error ); + SetEvent( mCriticalError.get() ); + } + + ScopedHandle mCriticalError; + }; + + struct VoiceCallback : public IXAudio2VoiceCallback + { + VoiceCallback() + { + mBufferEnd.reset( CreateEventEx( nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE ) ); + if ( !mBufferEnd ) + { + throw std::exception( "CreateEvent" ); + } + } + + virtual ~VoiceCallback() + { + } + + STDMETHOD_(void, OnVoiceProcessingPassStart) (UINT32) override {} + STDMETHOD_(void, OnVoiceProcessingPassEnd)() override {} + STDMETHOD_(void, OnStreamEnd)() override {} + STDMETHOD_(void, OnBufferStart)( void* ) override {} + + STDMETHOD_(void, OnBufferEnd)( void* context ) override + { + if ( context ) + { + auto inotify = reinterpret_cast( context ); + inotify->OnBufferEnd(); + SetEvent( mBufferEnd.get() ); + } + } + + STDMETHOD_(void, OnLoopEnd)( void* ) override {} + STDMETHOD_(void, OnVoiceError)( void*, HRESULT ) override {} + + ScopedHandle mBufferEnd; + }; + + static const XAUDIO2FX_REVERB_I3DL2_PARAMETERS gReverbPresets[] = + { + XAUDIO2FX_I3DL2_PRESET_DEFAULT, // Reverb_Off + XAUDIO2FX_I3DL2_PRESET_DEFAULT, // Reverb_Default + XAUDIO2FX_I3DL2_PRESET_GENERIC, // Reverb_Generic + XAUDIO2FX_I3DL2_PRESET_FOREST, // Reverb_Forest + XAUDIO2FX_I3DL2_PRESET_PADDEDCELL, // Reverb_PaddedCell + XAUDIO2FX_I3DL2_PRESET_ROOM, // Reverb_Room + XAUDIO2FX_I3DL2_PRESET_BATHROOM, // Reverb_Bathroom + XAUDIO2FX_I3DL2_PRESET_LIVINGROOM, // Reverb_LivingRoom + XAUDIO2FX_I3DL2_PRESET_STONEROOM, // Reverb_StoneRoom + XAUDIO2FX_I3DL2_PRESET_AUDITORIUM, // Reverb_Auditorium + XAUDIO2FX_I3DL2_PRESET_CONCERTHALL, // Reverb_ConcertHall + XAUDIO2FX_I3DL2_PRESET_CAVE, // Reverb_Cave + XAUDIO2FX_I3DL2_PRESET_ARENA, // Reverb_Arena + XAUDIO2FX_I3DL2_PRESET_HANGAR, // Reverb_Hangar + XAUDIO2FX_I3DL2_PRESET_CARPETEDHALLWAY, // Reverb_CarpetedHallway + XAUDIO2FX_I3DL2_PRESET_HALLWAY, // Reverb_Hallway + XAUDIO2FX_I3DL2_PRESET_STONECORRIDOR, // Reverb_StoneCorridor + XAUDIO2FX_I3DL2_PRESET_ALLEY, // Reverb_Alley + XAUDIO2FX_I3DL2_PRESET_CITY, // Reverb_City + XAUDIO2FX_I3DL2_PRESET_MOUNTAINS, // Reverb_Mountains + XAUDIO2FX_I3DL2_PRESET_QUARRY, // Reverb_Quarry + XAUDIO2FX_I3DL2_PRESET_PLAIN, // Reverb_Plain + XAUDIO2FX_I3DL2_PRESET_PARKINGLOT, // Reverb_ParkingLot + XAUDIO2FX_I3DL2_PRESET_SEWERPIPE, // Reverb_SewerPipe + XAUDIO2FX_I3DL2_PRESET_UNDERWATER, // Reverb_Underwater + XAUDIO2FX_I3DL2_PRESET_SMALLROOM, // Reverb_SmallRoom + XAUDIO2FX_I3DL2_PRESET_MEDIUMROOM, // Reverb_MediumRoom + XAUDIO2FX_I3DL2_PRESET_LARGEROOM, // Reverb_LargeRoom + XAUDIO2FX_I3DL2_PRESET_MEDIUMHALL, // Reverb_MediumHall + XAUDIO2FX_I3DL2_PRESET_LARGEHALL, // Reverb_LargeHall + XAUDIO2FX_I3DL2_PRESET_PLATE, // Reverb_Plate + }; + + inline unsigned int makeVoiceKey( _In_ const WAVEFORMATEX* wfx ) + { + assert( IsValid(wfx) ); + + if ( wfx->nChannels > 0x7F ) + return 0; + + union KeyGen + { + struct + { + unsigned int tag : 9; + unsigned int channels : 7; + unsigned int bitsPerSample : 8; + } pcm; + + struct + { + unsigned int tag : 9; + unsigned int channels : 7; + unsigned int samplesPerBlock : 16; + } adpcm; + +#if defined(_XBOX_ONE) && defined(_TITLE) + struct + { + unsigned int tag : 9; + unsigned int channels : 7; + unsigned int encoderVersion : 8; + } xma; +#endif + + unsigned int key; + } result; + + static_assert( sizeof(KeyGen) == sizeof(unsigned int), "KeyGen is invalid" ); + + result.key = 0; + + if ( wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE ) + { + // We reuse EXTENSIBLE only if it is equivalent to the standard form + auto wfex = reinterpret_cast( wfx ); + if ( wfex->Samples.wValidBitsPerSample != 0 && wfex->Samples.wValidBitsPerSample != wfx->wBitsPerSample ) + return 0; + + if ( wfex->dwChannelMask != 0 && wfex->dwChannelMask != GetDefaultChannelMask( wfx->nChannels ) ) + return 0; + } + + uint32_t tag = GetFormatTag( wfx ); + switch( tag ) + { + case WAVE_FORMAT_PCM: + static_assert( WAVE_FORMAT_PCM < 0x1ff, "KeyGen tag is too small" ); + result.pcm.tag = WAVE_FORMAT_PCM; + result.pcm.channels = wfx->nChannels; + result.pcm.bitsPerSample = wfx->wBitsPerSample; + break; + + case WAVE_FORMAT_IEEE_FLOAT: + static_assert( WAVE_FORMAT_IEEE_FLOAT < 0x1ff, "KeyGen tag is too small" ); + + if ( wfx->wBitsPerSample != 32 ) + return 0; + + result.pcm.tag = WAVE_FORMAT_IEEE_FLOAT; + result.pcm.channels = wfx->nChannels; + result.pcm.bitsPerSample = 32; + break; + + case WAVE_FORMAT_ADPCM: + static_assert( WAVE_FORMAT_ADPCM < 0x1ff, "KeyGen tag is too small" ); + result.adpcm.tag = WAVE_FORMAT_ADPCM; + result.adpcm.channels = wfx->nChannels; + + { + auto wfadpcm = reinterpret_cast( wfx ); + result.adpcm.samplesPerBlock = wfadpcm->wSamplesPerBlock; + } + break; + +#if defined(_XBOX_ONE) && defined(_TITLE) + case WAVE_FORMAT_XMA2: + static_assert( WAVE_FORMAT_XMA2 < 0x1ff, "KeyGen tag is too small" ); + result.xma.tag = WAVE_FORMAT_XMA2; + result.xma.channels = wfx->nChannels; + + { + auto xmaFmt = reinterpret_cast( wfx ); + + if ( ( xmaFmt->LoopBegin > 0 ) + || ( xmaFmt->PlayBegin > 0 ) ) + return 0; + + result.xma.encoderVersion = xmaFmt->EncoderVersion; + } + break; +#endif + + default: + return 0; + } + + return result.key; + } +} + +static_assert( _countof(gReverbPresets) == Reverb_MAX, "AUDIO_ENGINE_REVERB enum mismatch" ); + + +//====================================================================================== +// AudioEngine +//====================================================================================== + +#define SAFE_DESTROY_VOICE(voice) if ( voice ) { voice->DestroyVoice(); voice = nullptr; } + +// Internal object implementation class. +class AudioEngine::Impl +{ +public: + Impl() : + mMasterVoice( nullptr ), + mReverbVoice( nullptr ), + masterChannelMask( 0 ), + masterChannels( 0 ), + masterRate( 0 ), + defaultRate( 44100 ), + maxVoiceOneshots( SIZE_MAX ), + maxVoiceInstances( SIZE_MAX ), + mMasterVolume( 1.f ), + mX3DAudio{}, + mCriticalError( false ), + mReverbEnabled( false ), + mEngineFlags( AudioEngine_Default ), + mCategory( AudioCategory_GameEffects ), + mVoiceInstances( 0 ) +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + ,mDLL(nullptr) +#endif + { + }; + +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + ~Impl() + { + if (mDLL) + { + FreeLibrary(mDLL); + mDLL = nullptr; + } + } +#endif + + HRESULT Initialize( AUDIO_ENGINE_FLAGS flags, _In_opt_ const WAVEFORMATEX* wfx, _In_opt_z_ const wchar_t* deviceId, AUDIO_STREAM_CATEGORY category ); + + HRESULT Reset( _In_opt_ const WAVEFORMATEX* wfx, _In_opt_z_ const wchar_t* deviceId ); + + void SetSilentMode(); + + void Shutdown(); + + bool Update(); + + void SetReverb( _In_opt_ const XAUDIO2FX_REVERB_PARAMETERS* native ); + + void SetMasteringLimit( int release, int loudness ); + + AudioStatistics GetStatistics() const; + + void TrimVoicePool(); + + void AllocateVoice( _In_ const WAVEFORMATEX* wfx, SOUND_EFFECT_INSTANCE_FLAGS flags, bool oneshot, _Outptr_result_maybenull_ IXAudio2SourceVoice** voice ); + void DestroyVoice( _In_ IXAudio2SourceVoice* voice ); + + void RegisterNotify( _In_ IVoiceNotify* notify, bool usesUpdate ); + void UnregisterNotify( _In_ IVoiceNotify* notify, bool oneshots, bool usesUpdate ); + + ComPtr xaudio2; + IXAudio2MasteringVoice* mMasterVoice; + IXAudio2SubmixVoice* mReverbVoice; + + uint32_t masterChannelMask; + uint32_t masterChannels; + uint32_t masterRate; + + int defaultRate; + size_t maxVoiceOneshots; + size_t maxVoiceInstances; + float mMasterVolume; + + X3DAUDIO_HANDLE mX3DAudio; + + bool mCriticalError; + bool mReverbEnabled; + + AUDIO_ENGINE_FLAGS mEngineFlags; + +private: + typedef std::set notifylist_t; + typedef std::list> oneshotlist_t; + typedef std::unordered_multimap voicepool_t; + + AUDIO_STREAM_CATEGORY mCategory; + ComPtr mReverbEffect; + ComPtr mVolumeLimiter; + oneshotlist_t mOneShots; + voicepool_t mVoicePool; + notifylist_t mNotifyObjects; + notifylist_t mNotifyUpdates; + size_t mVoiceInstances; + VoiceCallback mVoiceCallback; + EngineCallback mEngineCallback; + +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + HMODULE mDLL; +#endif +}; + + +_Use_decl_annotations_ +HRESULT AudioEngine::Impl::Initialize( AUDIO_ENGINE_FLAGS flags, const WAVEFORMATEX* wfx, const wchar_t* deviceId, AUDIO_STREAM_CATEGORY category ) +{ + mEngineFlags = flags; + mCategory = category; + + return Reset( wfx, deviceId ); +} + + +_Use_decl_annotations_ +HRESULT AudioEngine::Impl::Reset( const WAVEFORMATEX* wfx, const wchar_t* deviceId ) +{ + if ( wfx ) + { + if ( wfx->wFormatTag != WAVE_FORMAT_PCM ) + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + + if ( !wfx->nChannels || wfx->nChannels > XAUDIO2_MAX_AUDIO_CHANNELS ) + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + + if ( wfx->nSamplesPerSec < XAUDIO2_MIN_SAMPLE_RATE || wfx->nSamplesPerSec > XAUDIO2_MAX_SAMPLE_RATE ) + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + + // We don't use other data members of WAVEFORMATEX here to describe the device format, so no need to fully validate + } + + assert( !xaudio2 ); + assert( !mMasterVoice ); + assert( !mReverbVoice ); + + masterChannelMask = masterChannels = masterRate = 0; + + memset( &mX3DAudio, 0, X3DAUDIO_HANDLE_BYTESIZE ); + + mCriticalError = false; + mReverbEnabled = false; + + // + // Create XAudio2 engine + // + UINT32 eflags = 0; +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + if ( mEngineFlags & AudioEngine_Debug ) + { + if ( !mDLL ) + { + mDLL = LoadLibraryEx( L"XAudioD2_7.DLL", nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if ( !mDLL ) + { + DebugTrace( "ERROR: XAudio 2.7 debug version not installed on system (install the DirectX SDK Developer Runtime)\n" ); + return HRESULT_FROM_WIN32( ERROR_NOT_FOUND ); + } + } + + eflags |= XAUDIO2_DEBUG_ENGINE; + } + else if ( !mDLL ) + { + mDLL = LoadLibraryEx( L"XAudio2_7.DLL", nullptr, 0x00000800 /* LOAD_LIBRARY_SEARCH_SYSTEM32 */ ); + if ( !mDLL ) + { + DebugTrace( "ERROR: XAudio 2.7 not installed on system (install the DirectX End-user Runtimes (June 2010))\n" ); + return HRESULT_FROM_WIN32( ERROR_NOT_FOUND ); + } + } +#endif + + HRESULT hr = XAudio2Create( xaudio2.ReleaseAndGetAddressOf(), eflags ); + if( FAILED( hr ) ) + { +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + DebugTrace( "ERROR: XAudio 2.7 not found (have you called CoInitialize?)\n" ); +#endif + return hr; + } + + if ( mEngineFlags & AudioEngine_Debug ) + { + XAUDIO2_DEBUG_CONFIGURATION debug = {}; + debug.TraceMask = XAUDIO2_LOG_ERRORS | XAUDIO2_LOG_WARNINGS; + debug.BreakMask = XAUDIO2_LOG_ERRORS; + xaudio2->SetDebugConfiguration( &debug, nullptr ); +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) || defined(_XBOX_ONE) + DebugTrace("INFO: XAudio 2.9 debugging enabled\n"); +#elif (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + // To see the trace output, you need to view ETW logs for this application: + // Go to Control Panel, Administrative Tools, Event Viewer. + // View->Show Analytic and Debug Logs. + // Applications and Services Logs / Microsoft / Windows / XAudio2. + // Right click on Microsoft Windows XAudio2 debug logging, Properties, then Enable Logging, and hit OK + DebugTrace( "INFO: XAudio 2.8 debugging enabled\n" ); +#else + // To see the trace output, see the debug output channel window + DebugTrace( "INFO: XAudio 2.7 debugging enabled\n" ); +#endif + } + + if ( mEngineFlags & AudioEngine_DisableVoiceReuse ) + { + DebugTrace( "INFO: Voice reuse is disabled\n" ); + } + + hr = xaudio2->RegisterForCallbacks( &mEngineCallback ); + if ( FAILED(hr) ) + { + xaudio2.Reset(); + return hr; + } + + // + // Create mastering voice for device + // + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + + hr = xaudio2->CreateMasteringVoice( &mMasterVoice, + (wfx) ? wfx->nChannels : XAUDIO2_DEFAULT_CHANNELS, + (wfx) ? wfx->nSamplesPerSec : XAUDIO2_DEFAULT_SAMPLERATE, + 0, deviceId, nullptr, mCategory ); + if ( FAILED(hr) ) + { + xaudio2.Reset(); + return hr; + } + + DWORD dwChannelMask; + hr = mMasterVoice->GetChannelMask( &dwChannelMask ); + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mMasterVoice ); + xaudio2.Reset(); + return hr; + } + + XAUDIO2_VOICE_DETAILS details; + mMasterVoice->GetVoiceDetails( &details ); + + masterChannelMask = dwChannelMask; + masterChannels = details.InputChannels; + masterRate = details.InputSampleRate; + +#else + + UINT32 count = 0; + hr = xaudio2->GetDeviceCount( &count ); + if ( FAILED(hr) ) + { + xaudio2.Reset(); + return hr; + } + + if ( !count ) + { + xaudio2.Reset(); + return HRESULT_FROM_WIN32( ERROR_NOT_FOUND ); + } + + UINT32 devIndex = 0; + if ( deviceId ) + { + // Translate device ID back into device index + devIndex = UINT32(-1); + for( UINT32 j = 0; j < count; ++j ) + { + XAUDIO2_DEVICE_DETAILS details; + hr = xaudio2->GetDeviceDetails( j, &details ); + if ( SUCCEEDED(hr) ) + { + if ( wcsncmp( deviceId, details.DeviceID, 256 ) == 0 ) + { + devIndex = j; + masterChannelMask = details.OutputFormat.dwChannelMask; + break; + } + } + } + + if ( devIndex == UINT32(-1) ) + { + xaudio2.Reset(); + return HRESULT_FROM_WIN32( ERROR_NOT_FOUND ); + } + } + else + { + // No search needed + XAUDIO2_DEVICE_DETAILS details; + hr = xaudio2->GetDeviceDetails( 0, &details ); + if ( FAILED(hr) ) + { + xaudio2.Reset(); + return hr; + } + + masterChannelMask = details.OutputFormat.dwChannelMask; + } + + hr = xaudio2->CreateMasteringVoice( &mMasterVoice, + (wfx) ? wfx->nChannels : XAUDIO2_DEFAULT_CHANNELS, + (wfx) ? wfx->nSamplesPerSec : XAUDIO2_DEFAULT_SAMPLERATE, + 0, devIndex, nullptr ); + if ( FAILED(hr) ) + { + xaudio2.Reset(); + return hr; + } + + XAUDIO2_VOICE_DETAILS details; + mMasterVoice->GetVoiceDetails( &details ); + + masterChannels = details.InputChannels; + masterRate = details.InputSampleRate; + +#endif + + DebugTrace( "INFO: mastering voice has %u channels, %u sample rate, %08X channel mask\n", masterChannels, masterRate, masterChannelMask ); + + if ( mMasterVolume != 1.f ) + { + hr = mMasterVoice->SetVolume( mMasterVolume ); + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mMasterVoice ); + xaudio2.Reset(); + return hr; + } + } + + // + // Setup mastering volume limiter (optional) + // + if ( mEngineFlags & AudioEngine_UseMasteringLimiter ) + { + FXMASTERINGLIMITER_PARAMETERS params = {}; + params.Release = FXMASTERINGLIMITER_DEFAULT_RELEASE; + params.Loudness = FXMASTERINGLIMITER_DEFAULT_LOUDNESS; + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + hr = CreateFX( __uuidof(FXMasteringLimiter), mVolumeLimiter.ReleaseAndGetAddressOf(), ¶ms, sizeof(params) ); +#else + hr = CreateFX( __uuidof(FXMasteringLimiter), mVolumeLimiter.ReleaseAndGetAddressOf() ); +#endif + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mMasterVoice ); + xaudio2.Reset(); + return hr; + } + + XAUDIO2_EFFECT_DESCRIPTOR desc = {}; + desc.InitialState = TRUE; + desc.OutputChannels = masterChannels; + desc.pEffect = mVolumeLimiter.Get(); + + XAUDIO2_EFFECT_CHAIN chain = { 1, &desc }; + hr = mMasterVoice->SetEffectChain( &chain ); + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mMasterVoice ); + mVolumeLimiter.Reset(); + xaudio2.Reset(); + return hr; + } + +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + hr = mMasterVoice->SetEffectParameters( 0, ¶ms, sizeof(params) ); + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mMasterVoice ); + mVolumeLimiter.Reset(); + xaudio2.Reset(); + return hr; + } +#endif + + DebugTrace( "INFO: Mastering volume limiter enabled\n" ); + } + + // + // Setup environmental reverb for 3D audio (optional) + // + if ( mEngineFlags & AudioEngine_EnvironmentalReverb ) + { + UINT32 rflags = 0; +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + if ( mEngineFlags & AudioEngine_Debug ) + { + rflags |= XAUDIO2FX_DEBUG; + } +#endif + hr = XAudio2CreateReverb( mReverbEffect.ReleaseAndGetAddressOf(), rflags ); + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mMasterVoice ); + mVolumeLimiter.Reset(); + xaudio2.Reset(); + return hr; + } + + XAUDIO2_EFFECT_DESCRIPTOR effects[] = { { mReverbEffect.Get(), TRUE, 1 } }; + XAUDIO2_EFFECT_CHAIN effectChain = { 1, effects }; + + mReverbEnabled = true; + + hr = xaudio2->CreateSubmixVoice( &mReverbVoice, 1, masterRate, + (mEngineFlags & AudioEngine_ReverbUseFilters ) ? XAUDIO2_VOICE_USEFILTER : 0, 0, + nullptr, &effectChain ); + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mMasterVoice ); + mReverbEffect.Reset(); + mVolumeLimiter.Reset(); + xaudio2.Reset(); + return hr; + } + + XAUDIO2FX_REVERB_PARAMETERS native; + ReverbConvertI3DL2ToNative( &gReverbPresets[ Reverb_Default ], &native ); + hr = mReverbVoice->SetEffectParameters( 0, &native, sizeof( XAUDIO2FX_REVERB_PARAMETERS ) ); + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mReverbVoice ); + SAFE_DESTROY_VOICE( mMasterVoice ); + mReverbEffect.Reset(); + mVolumeLimiter.Reset(); + xaudio2.Reset(); + return hr; + } + + DebugTrace( "INFO: I3DL2 reverb effect enabled for 3D positional audio\n" ); + } + + // + // Setup 3D audio + // + const float SPEEDOFSOUND = X3DAUDIO_SPEED_OF_SOUND; + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + hr = X3DAudioInitialize( masterChannelMask, SPEEDOFSOUND, mX3DAudio ); + if ( FAILED(hr) ) + { + SAFE_DESTROY_VOICE( mReverbVoice ); + SAFE_DESTROY_VOICE( mMasterVoice ); + mReverbEffect.Reset(); + mVolumeLimiter.Reset(); + xaudio2.Reset(); + return hr; + } +#else + X3DAudioInitialize( masterChannelMask, SPEEDOFSOUND, mX3DAudio ); +#endif + + // + // Inform any notify objects we are ready to go again + // + for( auto it = mNotifyObjects.begin(); it != mNotifyObjects.end(); ++it ) + { + assert( *it != 0 ); + (*it)->OnReset(); + } + + return S_OK; +} + + +void AudioEngine::Impl::SetSilentMode() +{ + for( auto it = mNotifyObjects.begin(); it != mNotifyObjects.end(); ++it ) + { + assert( *it != 0 ); + (*it)->OnCriticalError(); + } + + for( auto it = mOneShots.begin(); it != mOneShots.end(); ++it ) + { + assert( it->second != 0 ); + it->second->DestroyVoice(); + } + mOneShots.clear(); + + for( auto it = mVoicePool.begin(); it != mVoicePool.end(); ++it ) + { + assert( it->second != 0 ); + it->second->DestroyVoice(); + } + mVoicePool.clear(); + + mVoiceInstances = 0; + + SAFE_DESTROY_VOICE( mReverbVoice ); + SAFE_DESTROY_VOICE( mMasterVoice ); + + mReverbEffect.Reset(); + mVolumeLimiter.Reset(); + xaudio2.Reset(); +} + + +void AudioEngine::Impl::Shutdown() +{ + for( auto it = mNotifyObjects.begin(); it != mNotifyObjects.end(); ++it ) + { + assert( *it != 0 ); + (*it)->OnDestroyEngine(); + } + + if ( xaudio2 ) + { + xaudio2->UnregisterForCallbacks( &mEngineCallback ); + + xaudio2->StopEngine(); + + for( auto it = mOneShots.begin(); it != mOneShots.end(); ++it ) + { + assert( it->second != 0 ); + it->second->DestroyVoice(); + } + mOneShots.clear(); + + for( auto it = mVoicePool.begin(); it != mVoicePool.end(); ++it ) + { + assert( it->second != 0 ); + it->second->DestroyVoice(); + } + mVoicePool.clear(); + + mVoiceInstances = 0; + + SAFE_DESTROY_VOICE( mReverbVoice ); + SAFE_DESTROY_VOICE( mMasterVoice ); + + mReverbEffect.Reset(); + mVolumeLimiter.Reset(); + xaudio2.Reset(); + + masterChannelMask = masterChannels = masterRate = 0; + + mCriticalError = false; + mReverbEnabled = false; + + memset( &mX3DAudio, 0, X3DAUDIO_HANDLE_BYTESIZE ); + } +} + + +bool AudioEngine::Impl::Update() +{ + if ( !xaudio2 ) + return false; + + HANDLE events[2] = { mEngineCallback.mCriticalError.get(), mVoiceCallback.mBufferEnd.get() }; + DWORD result = WaitForMultipleObjectsEx( 2, events, FALSE, 0, FALSE ); + switch( result ) + { + case WAIT_TIMEOUT: + break; + + case WAIT_OBJECT_0: // OnCritialError + mCriticalError = true; + + SetSilentMode(); + return false; + + case WAIT_OBJECT_0 + 1: // OnBufferEnd + // Scan for completed one-shot voices + for( auto it = mOneShots.begin(); it != mOneShots.end(); ) + { + assert( it->second != 0 ); + + XAUDIO2_VOICE_STATE xstate; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + it->second->GetState( &xstate, XAUDIO2_VOICE_NOSAMPLESPLAYED ); +#else + it->second->GetState( &xstate ); +#endif + + if ( !xstate.BuffersQueued ) + { + (void)it->second->Stop( 0 ); + if ( it->first ) + { + // Put voice back into voice pool for reuse since it has a non-zero voiceKey +#ifdef VERBOSE_TRACE + DebugTrace( "INFO: One-shot voice being saved for reuse (%08X)\n", it->first ); +#endif + voicepool_t::value_type v( it->first, it->second ); + mVoicePool.emplace( v ); + } + else + { + // Voice is to be destroyed rather than reused +#ifdef VERBOSE_TRACE + DebugTrace( "INFO: Destroying one-shot voice\n" ); +#endif + it->second->DestroyVoice(); + } + it = mOneShots.erase( it ); + } + else + ++it; + } + break; + + case WAIT_FAILED: + throw std::exception( "WaitForMultipleObjects" ); + } + + // + // Inform any notify objects of updates + // + for( auto it = mNotifyUpdates.begin(); it != mNotifyUpdates.end(); ++it ) + { + assert( *it != 0 ); + (*it)->OnUpdate(); + } + + return true; +} + + +_Use_decl_annotations_ +void AudioEngine::Impl::SetReverb( const XAUDIO2FX_REVERB_PARAMETERS* native ) +{ + if ( !mReverbVoice ) + return; + + if ( native ) + { + if ( !mReverbEnabled ) + { + mReverbEnabled = true; + (void)mReverbVoice->EnableEffect( 0 ); + } + + (void)mReverbVoice->SetEffectParameters( 0, native, sizeof( XAUDIO2FX_REVERB_PARAMETERS ) ); + } + else if ( mReverbEnabled ) + { + mReverbEnabled = false; + (void)mReverbVoice->DisableEffect( 0 ); + } +} + + +void AudioEngine::Impl::SetMasteringLimit( int release, int loudness ) +{ + if ( !mVolumeLimiter || !mMasterVoice ) + return; + + if ( ( release < FXMASTERINGLIMITER_MIN_RELEASE ) || ( release > FXMASTERINGLIMITER_MAX_RELEASE ) ) + throw std::out_of_range( "AudioEngine::SetMasteringLimit" ); + + if ( ( loudness < FXMASTERINGLIMITER_MIN_LOUDNESS ) || ( loudness > FXMASTERINGLIMITER_MAX_LOUDNESS ) ) + throw std::out_of_range( "AudioEngine::SetMasteringLimit" ); + + FXMASTERINGLIMITER_PARAMETERS params = {}; + params.Release = static_cast( release ); + params.Loudness = static_cast( loudness ); + + HRESULT hr = mMasterVoice->SetEffectParameters( 0, ¶ms, sizeof(params) ); + ThrowIfFailed( hr ); +} + + +AudioStatistics AudioEngine::Impl::GetStatistics() const +{ + AudioStatistics stats = {}; + + stats.allocatedVoices = stats.allocatedVoicesOneShot = mOneShots.size() + mVoicePool.size(); + stats.allocatedVoicesIdle = mVoicePool.size(); + + for( auto it = mNotifyObjects.begin(); it != mNotifyObjects.end(); ++it ) + { + assert( *it != 0 ); + (*it)->GatherStatistics( stats ); + } + + assert( stats.allocatedVoices == ( mOneShots.size() + mVoicePool.size() + mVoiceInstances ) ); + + return stats; +} + + +void AudioEngine::Impl::TrimVoicePool() +{ + for( auto it = mNotifyObjects.begin(); it != mNotifyObjects.end(); ++it ) + { + assert( *it != 0 ); + (*it)->OnTrim(); + } + + for( auto it = mVoicePool.begin(); it != mVoicePool.end(); ++it ) + { + assert( it->second != 0 ); + it->second->DestroyVoice(); + } + mVoicePool.clear(); +} + + +_Use_decl_annotations_ +void AudioEngine::Impl::AllocateVoice( const WAVEFORMATEX* wfx, SOUND_EFFECT_INSTANCE_FLAGS flags, bool oneshot, IXAudio2SourceVoice** voice ) +{ + if ( !wfx ) + throw std::exception( "Wave format is required\n" ); + + // No need to call IsValid on wfx because CreateSourceVoice will do that + + if ( !voice ) + throw std::exception("Voice pointer must be non-null"); + + *voice = nullptr; + + if ( !xaudio2 || mCriticalError ) + return; + +#ifndef NDEBUG + float maxFrequencyRatio = XAudio2SemitonesToFrequencyRatio(12); + assert( maxFrequencyRatio <= XAUDIO2_DEFAULT_FREQ_RATIO ); +#endif + + unsigned int voiceKey = 0; + if ( oneshot ) + { + if ( flags & ( SoundEffectInstance_Use3D | SoundEffectInstance_ReverbUseFilters | SoundEffectInstance_NoSetPitch ) ) + { + DebugTrace( ( flags & SoundEffectInstance_NoSetPitch ) + ? "ERROR: One-shot voices must support pitch-shifting for voice reuse\n" + : "ERROR: One-use voices cannot use 3D positional audio\n" ); + throw std::exception( "Invalid flags for one-shot voice" ); + } + +#ifdef VERBOSE_TRACE + if ( wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE ) + { + DebugTrace( "INFO: Requesting one-shot: Format Tag EXTENSIBLE %u, %u channels, %u-bit, %u blkalign, %u Hz\n", GetFormatTag( wfx ), + wfx->nChannels, wfx->wBitsPerSample, wfx->nBlockAlign, wfx->nSamplesPerSec ); + } + else + { + DebugTrace( "INFO: Requesting one-shot: Format Tag %u, %u channels, %u-bit, %u blkalign, %u Hz\n", wfx->wFormatTag, + wfx->nChannels, wfx->wBitsPerSample, wfx->nBlockAlign, wfx->nSamplesPerSec ); + } +#endif + + if ( !( mEngineFlags & AudioEngine_DisableVoiceReuse ) ) + { + voiceKey = makeVoiceKey( wfx ); + if ( voiceKey != 0 ) + { + auto it = mVoicePool.find( voiceKey ); + if ( it != mVoicePool.end() ) + { + // Found a matching (stopped) voice to reuse + assert( it->second != 0 ); + *voice = it->second; + mVoicePool.erase( it ); + + // Reset any volume/pitch-shifting + HRESULT hr = (*voice)->SetVolume(1.f); + ThrowIfFailed( hr ); + + hr = (*voice)->SetFrequencyRatio(1.f); + ThrowIfFailed( hr ); + + if (wfx->nChannels == 1 || wfx->nChannels == 2) + { + // Reset any panning + float matrix[16] = {}; + ComputePan( 0.f, wfx->nChannels, matrix ); + + hr = (*voice)->SetOutputMatrix(nullptr, wfx->nChannels, masterChannels, matrix); + ThrowIfFailed( hr ); + } + } + else if ( ( mVoicePool.size() + mOneShots.size() + 1 ) >= maxVoiceOneshots ) + { + DebugTrace( "WARNING: Too many one-shot voices in use (%Iu + %Iu >= %Iu); one-shot not played\n", + mVoicePool.size(), mOneShots.size() + 1, maxVoiceOneshots ); + return; + } + else + { + // makeVoiceKey already constrained the supported wfx formats to those supported for reuse + + char buff[64] = {}; + auto wfmt = reinterpret_cast( buff ); + + uint32_t tag = GetFormatTag( wfx ); + switch( tag ) + { + case WAVE_FORMAT_PCM: + CreateIntegerPCM( wfmt, defaultRate, wfx->nChannels, wfx->wBitsPerSample ); + break; + + case WAVE_FORMAT_IEEE_FLOAT: + CreateFloatPCM( wfmt, defaultRate, wfx->nChannels ); + break; + + case WAVE_FORMAT_ADPCM: + { + auto wfadpcm = reinterpret_cast( wfx ); + CreateADPCM( wfmt, 64, defaultRate, wfx->nChannels, wfadpcm->wSamplesPerBlock ); + } + break; + +#if defined(_XBOX_ONE) && defined(_TITLE) + case WAVE_FORMAT_XMA2: + CreateXMA2( wfmt, 64, defaultRate, wfx->nChannels, 65536, 2, 0 ); + break; +#endif + } + +#ifdef VERBOSE_TRACE + DebugTrace( "INFO: Allocate reuse voice: Format Tag %u, %u channels, %u-bit, %u blkalign, %u Hz\n", wfmt->wFormatTag, + wfmt->nChannels, wfmt->wBitsPerSample, wfmt->nBlockAlign, wfmt->nSamplesPerSec ); +#endif + + assert( voiceKey == makeVoiceKey( wfmt ) ); + + HRESULT hr = xaudio2->CreateSourceVoice( voice, wfmt, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &mVoiceCallback, nullptr, nullptr ); + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: CreateSourceVoice (reuse) failed with error %08X\n", hr ); + throw std::exception( "CreateSourceVoice" ); + } + } + + assert( *voice != 0 ); + HRESULT hr = (*voice)->SetSourceSampleRate( wfx->nSamplesPerSec ); + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: SetSourceSampleRate failed with error %08X\n", hr ); + throw std::exception( "SetSourceSampleRate" ); + } + } + } + } + + if ( !*voice ) + { + if ( oneshot ) + { + if ( ( mVoicePool.size() + mOneShots.size() + 1 ) >= maxVoiceOneshots ) + { + DebugTrace( "WARNING: Too many one-shot voices in use (%Iu + %Iu >= %Iu); one-shot not played; see TrimVoicePool\n", + mVoicePool.size(), mOneShots.size() + 1, maxVoiceOneshots ); + return; + } + } + else if ( ( mVoiceInstances + 1 ) >= maxVoiceInstances ) + { + DebugTrace( "ERROR: Too many instance voices (%Iu >= %Iu); see TrimVoicePool\n", mVoiceInstances + 1, maxVoiceInstances ); + throw std::exception( "Too many instance voices" ); + } + + UINT32 vflags = ( flags & SoundEffectInstance_NoSetPitch ) ? XAUDIO2_VOICE_NOPITCH : 0; + + HRESULT hr; + if ( flags & SoundEffectInstance_Use3D ) + { + XAUDIO2_SEND_DESCRIPTOR sendDescriptors[2]; + sendDescriptors[0].Flags = sendDescriptors[1].Flags = (flags & SoundEffectInstance_ReverbUseFilters) ? XAUDIO2_SEND_USEFILTER : 0; + sendDescriptors[0].pOutputVoice = mMasterVoice; + sendDescriptors[1].pOutputVoice = mReverbVoice; + const XAUDIO2_VOICE_SENDS sendList = { mReverbVoice ? 2U : 1U, sendDescriptors }; + +#ifdef VERBOSE_TRACE + DebugTrace( "INFO: Allocate voice 3D: Format Tag %u, %u channels, %u-bit, %u blkalign, %u Hz\n", wfx->wFormatTag, + wfx->nChannels, wfx->wBitsPerSample, wfx->nBlockAlign, wfx->nSamplesPerSec ); +#endif + + hr = xaudio2->CreateSourceVoice( voice, wfx, vflags, XAUDIO2_DEFAULT_FREQ_RATIO, &mVoiceCallback, &sendList, nullptr ); + } + else + { +#ifdef VERBOSE_TRACE + DebugTrace( "INFO: Allocate voice: Format Tag %u, %u channels, %u-bit, %u blkalign, %u Hz\n", wfx->wFormatTag, + wfx->nChannels, wfx->wBitsPerSample, wfx->nBlockAlign, wfx->nSamplesPerSec ); +#endif + + hr = xaudio2->CreateSourceVoice( voice, wfx, vflags, XAUDIO2_DEFAULT_FREQ_RATIO, &mVoiceCallback, nullptr, nullptr ); + } + + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: CreateSourceVoice failed with error %08X\n", hr ); + throw std::exception( "CreateSourceVoice" ); + } + else if ( !oneshot ) + { + ++mVoiceInstances; + } + } + + if ( oneshot ) + { + assert( *voice != 0 ); + mOneShots.emplace_back( std::make_pair( voiceKey, *voice ) ); + } +} + + +void AudioEngine::Impl::DestroyVoice( _In_ IXAudio2SourceVoice* voice ) +{ + if ( !voice ) + return; + +#ifndef NDEBUG + for( auto it = mOneShots.cbegin(); it != mOneShots.cend(); ++it ) + { + if ( it->second == voice ) + { + DebugTrace( "ERROR: DestroyVoice should not be called for a one-shot voice\n" ); + throw std::exception( "DestroyVoice" ); + } + } + + for( auto it = mVoicePool.cbegin(); it != mVoicePool.cend(); ++it ) + { + if ( it->second == voice ) + { + DebugTrace( "ERROR: DestroyVoice should not be called for a one-shot voice; see TrimVoicePool\n" ); + throw std::exception( "DestroyVoice" ); + } + } +#endif + + assert( mVoiceInstances > 0 ); + --mVoiceInstances; + voice->DestroyVoice(); +} + + +void AudioEngine::Impl::RegisterNotify( _In_ IVoiceNotify* notify, bool usesUpdate ) +{ + assert( notify != 0 ); + mNotifyObjects.insert( notify ); + + if ( usesUpdate ) + { + mNotifyUpdates.insert( notify ); + } +} + + +void AudioEngine::Impl::UnregisterNotify( _In_ IVoiceNotify* notify, bool usesOneShots, bool usesUpdate ) +{ + assert( notify != 0 ); + mNotifyObjects.erase( notify ); + + // Check for any pending one-shots for this notification object + if ( usesOneShots ) + { + bool setevent = false; + + for( auto it = mOneShots.begin(); it != mOneShots.end(); ++it ) + { + assert( it->second != 0 ); + + XAUDIO2_VOICE_STATE state; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + it->second->GetState(&state, XAUDIO2_VOICE_NOSAMPLESPLAYED ); +#else + it->second->GetState(&state); +#endif + + if ( state.pCurrentBufferContext == notify ) + { + (void)it->second->Stop( 0 ); + (void)it->second->FlushSourceBuffers(); + setevent = true; + } + } + + if (setevent) + { + // Trigger scan on next call to Update... + SetEvent( mVoiceCallback.mBufferEnd.get() ); + } + } + + if ( usesUpdate ) + { + mNotifyUpdates.erase( notify ); + } +} + + +//-------------------------------------------------------------------------------------- +// AudioEngine +//-------------------------------------------------------------------------------------- + +// Public constructor. +_Use_decl_annotations_ +AudioEngine::AudioEngine( AUDIO_ENGINE_FLAGS flags, const WAVEFORMATEX* wfx, const wchar_t* deviceId, AUDIO_STREAM_CATEGORY category ) + : pImpl(new Impl() ) +{ + HRESULT hr = pImpl->Initialize( flags, wfx, deviceId, category ); + if ( FAILED(hr) ) + { + if ( hr == HRESULT_FROM_WIN32( ERROR_NOT_FOUND ) ) + { + if ( flags & AudioEngine_ThrowOnNoAudioHW ) + { + DebugTrace( "ERROR: AudioEngine found no default audio device\n" ); + throw std::exception( "AudioEngineNoAudioHW" ); + } + else + { + DebugTrace( "WARNING: AudioEngine found no default audio device; running in 'silent mode'\n" ); + } + } + else + { + DebugTrace( "ERROR: AudioEngine failed (%08X) to initialize using device [%ls]\n", hr, ( deviceId ) ? deviceId : L"default" ); + throw std::exception( "AudioEngine" ); + } + } +} + + +// Move constructor. +AudioEngine::AudioEngine(AudioEngine&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +AudioEngine& AudioEngine::operator= (AudioEngine&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +AudioEngine::~AudioEngine() +{ + if ( pImpl ) + { + pImpl->Shutdown(); + } +} + + +// Public methods. +bool AudioEngine::Update() +{ + return pImpl->Update(); +} + + +_Use_decl_annotations_ +bool AudioEngine::Reset( const WAVEFORMATEX* wfx, const wchar_t* deviceId ) +{ + if ( pImpl->xaudio2 ) + { + DebugTrace( "WARNING: Called Reset for active audio graph; going silent in preparation for migration\n" ); + pImpl->SetSilentMode(); + } + + HRESULT hr = pImpl->Reset( wfx, deviceId ); + if ( FAILED(hr) ) + { + if ( hr == HRESULT_FROM_WIN32( ERROR_NOT_FOUND ) ) + { + if ( pImpl->mEngineFlags & AudioEngine_ThrowOnNoAudioHW ) + { + DebugTrace( "ERROR: AudioEngine found no default audio device on Reset\n" ); + throw std::exception( "AudioEngineNoAudioHW" ); + } + else + { + DebugTrace( "WARNING: AudioEngine found no default audio device on Reset; running in 'silent mode'\n" ); + return false; + } + } + else + { + DebugTrace( "ERROR: AudioEngine failed (%08X) to Reset using device [%ls]\n", hr, ( deviceId ) ? deviceId : L"default" ); + throw std::exception( "AudioEngine::Reset" ); + } + } + + DebugTrace( "INFO: AudioEngine Reset using device [%ls]\n", ( deviceId ) ? deviceId : L"default" ); + + return true; +} + + +void AudioEngine::Suspend() +{ + if ( !pImpl->xaudio2 ) + return; + + pImpl->xaudio2->StopEngine(); +} + + +void AudioEngine::Resume() +{ + if ( !pImpl->xaudio2 ) + return; + + HRESULT hr = pImpl->xaudio2->StartEngine(); + ThrowIfFailed( hr ); +} + + +float AudioEngine::GetMasterVolume() const +{ + return pImpl->mMasterVolume; +} + + +void AudioEngine::SetMasterVolume( float volume ) +{ + assert( volume >= -XAUDIO2_MAX_VOLUME_LEVEL && volume <= XAUDIO2_MAX_VOLUME_LEVEL ); + + pImpl->mMasterVolume = volume; + + if ( pImpl->mMasterVoice ) + { + HRESULT hr = pImpl->mMasterVoice->SetVolume( volume ); + ThrowIfFailed( hr ); + } +} + + +void AudioEngine::SetReverb( AUDIO_ENGINE_REVERB reverb ) +{ + if ( reverb < 0 || reverb >= Reverb_MAX ) + throw std::out_of_range( "AudioEngine::SetReverb" ); + + if ( reverb == Reverb_Off ) + { + pImpl->SetReverb( nullptr ); + } + else + { + XAUDIO2FX_REVERB_PARAMETERS native; + ReverbConvertI3DL2ToNative( &gReverbPresets[ reverb ], &native ); + pImpl->SetReverb( &native ); + } +} + + +_Use_decl_annotations_ +void AudioEngine::SetReverb( const XAUDIO2FX_REVERB_PARAMETERS* native ) +{ + pImpl->SetReverb( native ); +} + + +void AudioEngine::SetMasteringLimit( int release, int loudness ) +{ + pImpl->SetMasteringLimit( release, loudness ); +} + + +// Public accessors. +AudioStatistics AudioEngine::GetStatistics() const +{ + return pImpl->GetStatistics(); +} + + +WAVEFORMATEXTENSIBLE AudioEngine::GetOutputFormat() const +{ + WAVEFORMATEXTENSIBLE wfx = {}; + + if ( !pImpl->xaudio2 ) + return wfx; + + wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + wfx.Format.wBitsPerSample = wfx.Samples.wValidBitsPerSample = 16; // This is a guess + wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + + wfx.Format.nChannels = static_cast( pImpl->masterChannels ); + wfx.Format.nSamplesPerSec = pImpl->masterRate; + wfx.dwChannelMask = pImpl->masterChannelMask; + + wfx.Format.nBlockAlign = WORD( wfx.Format.nChannels * wfx.Format.wBitsPerSample / 8 ); + wfx.Format.nAvgBytesPerSec = wfx.Format.nSamplesPerSec * wfx.Format.nBlockAlign; + + static const GUID s_pcm = { WAVE_FORMAT_PCM, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 }; + memcpy( &wfx.SubFormat, &s_pcm, sizeof(GUID) ); + + return wfx; +} + + +uint32_t AudioEngine::GetChannelMask() const +{ + return pImpl->masterChannelMask; +} + + +int AudioEngine::GetOutputChannels() const +{ + return pImpl->masterChannels; +} + + +bool AudioEngine::IsAudioDevicePresent() const +{ + return ( pImpl->xaudio2.Get() != 0 ) && !pImpl->mCriticalError; +} + + +bool AudioEngine::IsCriticalError() const +{ + return pImpl->mCriticalError; +} + + +// Voice management. +void AudioEngine::SetDefaultSampleRate( int sampleRate ) +{ + if ( ( sampleRate < XAUDIO2_MIN_SAMPLE_RATE ) || ( sampleRate > XAUDIO2_MAX_SAMPLE_RATE ) ) + throw std::exception( "Default sample rate is out of range" ); + + pImpl->defaultRate = sampleRate; +} + + +void AudioEngine::SetMaxVoicePool( size_t maxOneShots, size_t maxInstances ) +{ + if ( maxOneShots > 0 ) + pImpl->maxVoiceOneshots = maxOneShots; + + if ( maxInstances > 0 ) + pImpl->maxVoiceInstances = maxInstances; +} + + +void AudioEngine::TrimVoicePool() +{ + pImpl->TrimVoicePool(); +} + + +_Use_decl_annotations_ +void AudioEngine::AllocateVoice( const WAVEFORMATEX* wfx, SOUND_EFFECT_INSTANCE_FLAGS flags, bool oneshot, IXAudio2SourceVoice** voice ) +{ + pImpl->AllocateVoice( wfx, flags, oneshot, voice ); +} + + +void AudioEngine::DestroyVoice( _In_ IXAudio2SourceVoice* voice ) +{ + pImpl->DestroyVoice( voice ); +} + + +void AudioEngine::RegisterNotify( _In_ IVoiceNotify* notify, bool usesUpdate ) +{ + pImpl->RegisterNotify( notify, usesUpdate ); +} + + +void AudioEngine::UnregisterNotify( _In_ IVoiceNotify* notify, bool oneshots, bool usesUpdate ) +{ + pImpl->UnregisterNotify( notify, oneshots, usesUpdate ); +} + + +IXAudio2* AudioEngine::GetInterface() const +{ + return pImpl->xaudio2.Get(); +} + + +IXAudio2MasteringVoice* AudioEngine::GetMasterVoice() const +{ + return pImpl->mMasterVoice; +} + + +IXAudio2SubmixVoice* AudioEngine::GetReverbVoice() const +{ + return pImpl->mReverbVoice; +} + + +X3DAUDIO_HANDLE& AudioEngine::Get3DHandle() const +{ + return pImpl->mX3DAudio; +} + + +// Static methods. +#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#include +#elif defined(_XBOX_ONE) +#include +#include +#elif (_WIN32_WINNT >= _WIN32_WINNT_WIN8) +#pragma comment(lib,"runtimeobject.lib") +#pragma warning(push) +#pragma warning(disable: 4471) +#include +#pragma warning(pop) +#include +#endif + +std::vector AudioEngine::GetRendererDetails() +{ + std::vector list; + +#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP + + LPCWSTR id = GetDefaultAudioRenderId( Default ); + if ( !id ) + return list; + + RendererDetail device; + device.deviceId = id; + device.description = L"Default"; + + CoTaskMemFree( (LPVOID)id ); + +#elif defined(_XBOX_ONE) + + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::Foundation; + using namespace ABI::Windows::Media::Devices; + + ComPtr mdStatics; + HRESULT hr = GetActivationFactory( HStringReference(RuntimeClass_Windows_Media_Devices_MediaDevice).Get(), &mdStatics ); + ThrowIfFailed( hr ); + + HString id; + hr = mdStatics->GetDefaultAudioRenderId( AudioDeviceRole_Default, id.GetAddressOf() ); + ThrowIfFailed( hr ); + + RendererDetail device; + device.deviceId = id.GetRawBuffer( nullptr ); + device.description = L"Default"; + list.emplace_back( device ); + +#elif (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + +#if defined(__cplusplus_winrt) + + // Enumerating with WinRT using C++/CX (Windows Store apps) + using Windows::Devices::Enumeration::DeviceClass; + using Windows::Devices::Enumeration::DeviceInformation; + using Windows::Devices::Enumeration::DeviceInformationCollection; + + auto operation = DeviceInformation::FindAllAsync(DeviceClass::AudioRender); + while (operation->Status == Windows::Foundation::AsyncStatus::Started) { Sleep(100); } + if (operation->Status != Windows::Foundation::AsyncStatus::Completed) + { + throw std::exception("FindAllAsync"); + } + + DeviceInformationCollection^ devices = operation->GetResults(); + + for (unsigned i = 0; i < devices->Size; ++i) + { + using Windows::Devices::Enumeration::DeviceInformation; + + DeviceInformation^ d = devices->GetAt(i); + + RendererDetail device; + device.deviceId = d->Id->Data(); + device.description = d->Name->Data(); + list.emplace_back(device); + } +#else + + // Enumerating with WinRT using WRL (Win32 desktop app for Windows 8.x) + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::Foundation; + using namespace ABI::Windows::Foundation::Collections; + using namespace ABI::Windows::Devices::Enumeration; + +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) + RoInitializeWrapper initialize(RO_INIT_MULTITHREADED); + ThrowIfFailed(initialize); +#endif + + ComPtr diFactory; + HRESULT hr = GetActivationFactory( HStringReference(RuntimeClass_Windows_Devices_Enumeration_DeviceInformation).Get(), &diFactory ); + ThrowIfFailed( hr ); + + ComPtr> operation; + hr = diFactory->FindAllAsyncDeviceClass( DeviceClass_AudioRender, operation.GetAddressOf() ); + ThrowIfFailed( hr ); + + ComPtr asyncinfo; + hr = operation.As(&asyncinfo); + ThrowIfFailed( hr ); + + AsyncStatus status; + hr = asyncinfo->get_Status(&status); + ThrowIfFailed( hr ); + + while (status == ABI::Windows::Foundation::AsyncStatus::Started) + { + Sleep(100); + hr = asyncinfo->get_Status(&status); + ThrowIfFailed( hr ); + } + + if (status != ABI::Windows::Foundation::AsyncStatus::Completed) + { + throw std::exception("FindAllAsyncDeviceClass"); + } + + ComPtr> devices; + hr = operation->GetResults( devices.GetAddressOf() ); + ThrowIfFailed(hr); + + unsigned int count = 0; + hr = devices->get_Size( &count ); + ThrowIfFailed( hr ); + + if ( !count ) + return list; + + for( unsigned int j = 0; j < count; ++j ) + { + ComPtr deviceInfo; + hr = devices->GetAt( j, deviceInfo.GetAddressOf() ); + if ( SUCCEEDED(hr) ) + { + RendererDetail device; + + HString id; + if (SUCCEEDED(deviceInfo->get_Id(id.GetAddressOf()))) + { + device.deviceId = id.GetRawBuffer(nullptr); + } + + HString name; + if (SUCCEEDED(deviceInfo->get_Name(name.GetAddressOf()))) + { + device.description = name.GetRawBuffer(nullptr); + } + + list.emplace_back( device ); + } + } + +#endif + +#else // _WIN32_WINNT < _WIN32_WINNT_WIN8 + + // Enumerating with XAudio 2.7 + ComPtr pXAudio2; + + HRESULT hr = XAudio2Create( pXAudio2.GetAddressOf() ); + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: XAudio 2.7 not found (have you called CoInitialize?)\n"); + throw std::exception( "XAudio2Create" ); + } + + UINT32 count = 0; + hr = pXAudio2->GetDeviceCount( &count ); + ThrowIfFailed(hr); + + if ( !count ) + return list; + + list.reserve( count ); + + for( UINT32 j = 0; j < count; ++j ) + { + XAUDIO2_DEVICE_DETAILS details; + hr = pXAudio2->GetDeviceDetails( j, &details ); + if ( SUCCEEDED(hr) ) + { + RendererDetail device; + device.deviceId = details.DeviceID; + device.description = details.DisplayName; + list.emplace_back( device ); + } + } + +#endif + + return list; +} \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_DXSDK.vcxproj b/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_DXSDK.vcxproj new file mode 100644 index 0000000..d508952 --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_DXSDK.vcxproj @@ -0,0 +1,197 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + {4F150A30-CECB-49D1-8283-6A3F57438CF5} + Win32Proj + DirectXTKAudioDX + + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2013_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x86 + + + Bin\Desktop_2013_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x64; + + + Bin\Desktop_2013_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x86 + + + Bin\Desktop_2013_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2013_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x64; + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_DXSDK.vcxproj.filters b/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_DXSDK.vcxproj.filters new file mode 100644 index 0000000..42331ac --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_DXSDK.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Inc + + + Inc + + + Inc + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_Win8.vcxproj b/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_Win8.vcxproj new file mode 100644 index 0000000..3a5d051 --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_Win8.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + {4F150A30-CECB-49D1-8283-6A3F57438CF5} + Win32Proj + DirectXTKAudio + + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0602;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0602;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0602;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0602;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_Win8.vcxproj.filters b/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_Win8.vcxproj.filters new file mode 100644 index 0000000..42331ac --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2013_Win8.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Inc + + + Inc + + + Inc + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_DXSDK.vcxproj b/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_DXSDK.vcxproj new file mode 100644 index 0000000..012d1fa --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_DXSDK.vcxproj @@ -0,0 +1,197 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + {4F150A30-CECB-49D1-8283-6A3F57438CF5} + Win32Proj + DirectXTKAudioDX + + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + false + v140 + Unicode + + + StaticLibrary + false + v140 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2015_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x86 + + + Bin\Desktop_2015_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x64; + + + Bin\Desktop_2015_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x86 + + + Bin\Desktop_2015_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x64; + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_DXSDK.vcxproj.filters b/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_DXSDK.vcxproj.filters new file mode 100644 index 0000000..42331ac --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_DXSDK.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Inc + + + Inc + + + Inc + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_Win8.vcxproj b/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_Win8.vcxproj new file mode 100644 index 0000000..89575ad --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_Win8.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + {4F150A30-CECB-49D1-8283-6A3F57438CF5} + Win32Proj + DirectXTKAudio + + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + false + v140 + Unicode + + + StaticLibrary + false + v140 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0602;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0602;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0602;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0602;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_Win8.vcxproj.filters b/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_Win8.vcxproj.filters new file mode 100644 index 0000000..42331ac --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2015_Win8.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Inc + + + Inc + + + Inc + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_DXSDK.vcxproj b/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_DXSDK.vcxproj new file mode 100644 index 0000000..d8e7a02 --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_DXSDK.vcxproj @@ -0,0 +1,202 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + {4F150A30-CECB-49D1-8283-6A3F57438CF5} + Win32Proj + DirectXTKAudioDX + 10.0.15063.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + Unicode + + + StaticLibrary + false + v141 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2017_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x86 + + + Bin\Desktop_2017_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x64; + + + Bin\Desktop_2017_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x86 + + + Bin\Desktop_2017_DXSDK\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_DXSDK\$(Platform)\$(Configuration)\ + DirectXTKAudioDX + $(ExecutablePath);$(DXSDK_DIR)Utilities\bin\x64;$(DXSDK_DIR)Utilities\bin\x86 + $(IncludePath);$(DXSDK_DIR)Include + $(LibraryPath);$(DXSDK_DIR)Lib\x64; + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_DXSDK.vcxproj.filters b/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_DXSDK.vcxproj.filters new file mode 100644 index 0000000..42331ac --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_DXSDK.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Inc + + + Inc + + + Inc + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_Win8.vcxproj b/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_Win8.vcxproj new file mode 100644 index 0000000..b0ab8fe --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_Win8.vcxproj @@ -0,0 +1,194 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + {4F150A30-CECB-49D1-8283-6A3F57438CF5} + Win32Proj + DirectXTKAudio + 10.0.15063.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + Unicode + + + StaticLibrary + false + v141 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + DirectXTKAudioWin8 + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0602;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + 4996 + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0602;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + 4996 + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0602;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + pch.h + 4996 + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0602;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + ..\Inc;..\Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + pch.h + 4996 + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_Win8.vcxproj.filters b/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_Win8.vcxproj.filters new file mode 100644 index 0000000..42331ac --- /dev/null +++ b/DirectXTK/Audio/DirectXTKAudio_Desktop_2017_Win8.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Inc + + + Inc + + + Inc + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + \ No newline at end of file diff --git a/DirectXTK/Audio/DynamicSoundEffectInstance.cpp b/DirectXTK/Audio/DynamicSoundEffectInstance.cpp new file mode 100644 index 0000000..9661f74 --- /dev/null +++ b/DirectXTK/Audio/DynamicSoundEffectInstance.cpp @@ -0,0 +1,374 @@ +//-------------------------------------------------------------------------------------- +// File: DynamicSoundEffectInstance.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "SoundCommon.h" + +using namespace DirectX; + + +//====================================================================================== +// DynamicSoundEffectInstance +//====================================================================================== + +// Internal object implementation class. +class DynamicSoundEffectInstance::Impl : public IVoiceNotify +{ +public: + Impl( _In_ AudioEngine* engine, + _In_ DynamicSoundEffectInstance* object, std::function& bufferNeeded, + int sampleRate, int channels, int sampleBits, SOUND_EFFECT_INSTANCE_FLAGS flags ) : + mBase(), + mBufferNeeded( nullptr ), + mObject( object ) + { + if ( ( sampleRate < XAUDIO2_MIN_SAMPLE_RATE ) + || ( sampleRate > XAUDIO2_MAX_SAMPLE_RATE ) ) + { + DebugTrace( "DynamicSoundEffectInstance sampleRate must be in range %u...%u\n", XAUDIO2_MIN_SAMPLE_RATE, XAUDIO2_MAX_SAMPLE_RATE ); + throw std::invalid_argument( "DynamicSoundEffectInstance" ); + } + + if ( !channels || ( channels > 8 ) ) + { + DebugTrace( "DynamicSoundEffectInstance channels must be in range 1...8\n" ); + throw std::invalid_argument( "DynamicSoundEffectInstance" ); + } + + switch ( sampleBits ) + { + case 8: + case 16: + break; + + default: + DebugTrace( "DynamicSoundEffectInstance sampleBits must be 8-bit or 16-bit\n" ); + throw std::invalid_argument( "DynamicSoundEffectInstance" ); + } + + mBufferEvent.reset( CreateEventEx( nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE ) ); + if ( !mBufferEvent ) + { + throw std::exception( "CreateEvent" ); + } + + CreateIntegerPCM( &mWaveFormat, sampleRate, channels, sampleBits ); + + assert( engine != 0 ); + engine->RegisterNotify( this, true ); + + mBase.Initialize( engine, &mWaveFormat, flags ); + + mBufferNeeded = bufferNeeded; + } + + virtual ~Impl() + { + mBase.DestroyVoice(); + + if ( mBase.engine ) + { + mBase.engine->UnregisterNotify( this, false, true ); + mBase.engine = nullptr; + } + } + + void Play(); + + void Resume(); + + void SubmitBuffer( _In_reads_bytes_(audioBytes) const uint8_t* pAudioData, uint32_t offset, size_t audioBytes ); + + const WAVEFORMATEX* GetFormat() const { return &mWaveFormat; } ; + + // IVoiceNotify + virtual void __cdecl OnBufferEnd() override + { + SetEvent( mBufferEvent.get() ); + } + + virtual void __cdecl OnCriticalError() override + { + mBase.OnCriticalError(); + } + + virtual void __cdecl OnReset() override + { + mBase.OnReset(); + } + + virtual void __cdecl OnUpdate() override; + + virtual void __cdecl OnDestroyEngine() override + { + mBase.OnDestroy(); + } + + virtual void __cdecl OnTrim() override + { + mBase.OnTrim(); + } + + virtual void __cdecl GatherStatistics( AudioStatistics& stats ) const override + { + mBase.GatherStatistics(stats); + } + + SoundEffectInstanceBase mBase; + +private: + ScopedHandle mBufferEvent; + std::function mBufferNeeded; + DynamicSoundEffectInstance* mObject; + WAVEFORMATEX mWaveFormat; +}; + + +void DynamicSoundEffectInstance::Impl::Play() +{ + if ( !mBase.voice ) + { + mBase.AllocateVoice( &mWaveFormat ); + } + + (void)mBase.Play(); + + if ( mBase.voice && ( mBase.state == PLAYING ) && ( mBase.GetPendingBufferCount() <= 2 ) ) + { + SetEvent( mBufferEvent.get() ); + } +} + + +void DynamicSoundEffectInstance::Impl::Resume() +{ + if ( mBase.voice && ( mBase.state == PAUSED ) ) + { + mBase.Resume(); + + if ( ( mBase.state == PLAYING ) && ( mBase.GetPendingBufferCount() <= 2 ) ) + { + SetEvent( mBufferEvent.get() ); + } + } +} + + +_Use_decl_annotations_ +void DynamicSoundEffectInstance::Impl::SubmitBuffer( const uint8_t* pAudioData, uint32_t offset, size_t audioBytes ) +{ + if ( !pAudioData || !audioBytes ) + throw std::exception( "Invalid audio data buffer" ); + + if ( audioBytes > UINT32_MAX ) + throw std::out_of_range( "SubmitBuffer" ); + + XAUDIO2_BUFFER buffer = {}; + buffer.AudioBytes = static_cast( audioBytes ); + buffer.pAudioData = pAudioData; + + if( offset ) + { + assert( mWaveFormat.wFormatTag == WAVE_FORMAT_PCM ); + buffer.PlayBegin = offset / mWaveFormat.nBlockAlign; + buffer.PlayLength = static_cast( ( audioBytes - offset ) / mWaveFormat.nBlockAlign ); + } + + buffer.pContext = this; + + HRESULT hr = mBase.voice->SubmitSourceBuffer( &buffer, nullptr ); + if ( FAILED(hr) ) + { +#ifdef _DEBUG + DebugTrace( "ERROR: DynamicSoundEffectInstance failed (%08X) when submitting buffer:\n", hr ); + + DebugTrace( "\tFormat Tag %u, %u channels, %u-bit, %u Hz, %Iu bytes [%u offset)\n", mWaveFormat.wFormatTag, + mWaveFormat.nChannels, mWaveFormat.wBitsPerSample, mWaveFormat.nSamplesPerSec, audioBytes, offset ); +#endif + throw std::exception( "SubmitSourceBuffer" ); + } +} + + +void DynamicSoundEffectInstance::Impl::OnUpdate() +{ + DWORD result = WaitForSingleObjectEx( mBufferEvent.get(), 0, FALSE ); + switch( result ) + { + case WAIT_TIMEOUT: + break; + + case WAIT_OBJECT_0: + if( mBufferNeeded ) + { + // This callback happens on the same thread that called AudioEngine::Update() + mBufferNeeded( mObject ); + } + break; + + case WAIT_FAILED: + throw std::exception( "WaitForSingleObjectEx" ); + } +} + + + +//-------------------------------------------------------------------------------------- +// DynamicSoundEffectInstance +//-------------------------------------------------------------------------------------- + +#pragma warning( disable : 4355 ) + +// Public constructors +_Use_decl_annotations_ +DynamicSoundEffectInstance::DynamicSoundEffectInstance( AudioEngine* engine, + std::function bufferNeeded, + int sampleRate, int channels, int sampleBits, SOUND_EFFECT_INSTANCE_FLAGS flags ) : + pImpl( new Impl( engine, this, bufferNeeded, sampleRate, channels, sampleBits, flags ) ) +{ +} + + +// Move constructor. +DynamicSoundEffectInstance::DynamicSoundEffectInstance(DynamicSoundEffectInstance&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +DynamicSoundEffectInstance& DynamicSoundEffectInstance::operator= (DynamicSoundEffectInstance&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +DynamicSoundEffectInstance::~DynamicSoundEffectInstance() +{ +} + + +// Public methods. +void DynamicSoundEffectInstance::Play() +{ + pImpl->Play(); +} + + +void DynamicSoundEffectInstance::Stop( bool immediate ) +{ + bool looped = false; + pImpl->mBase.Stop( immediate, looped ); +} + + +void DynamicSoundEffectInstance::Pause() +{ + pImpl->mBase.Pause(); +} + + +void DynamicSoundEffectInstance::Resume() +{ + pImpl->Resume(); +} + + +void DynamicSoundEffectInstance::SetVolume( float volume ) +{ + pImpl->mBase.SetVolume( volume ); +} + + +void DynamicSoundEffectInstance::SetPitch( float pitch ) +{ + pImpl->mBase.SetPitch( pitch ); +} + + +void DynamicSoundEffectInstance::SetPan( float pan ) +{ + pImpl->mBase.SetPan( pan ); +} + + +void DynamicSoundEffectInstance::Apply3D( const AudioListener& listener, const AudioEmitter& emitter, bool rhcoords ) +{ + pImpl->mBase.Apply3D( listener, emitter, rhcoords ); +} + + +_Use_decl_annotations_ +void DynamicSoundEffectInstance::SubmitBuffer( const uint8_t* pAudioData, size_t audioBytes ) +{ + pImpl->SubmitBuffer( pAudioData, 0, audioBytes ); +} + + +_Use_decl_annotations_ +void DynamicSoundEffectInstance::SubmitBuffer( const uint8_t* pAudioData, uint32_t offset, size_t audioBytes ) +{ + pImpl->SubmitBuffer( pAudioData, offset, audioBytes ); +} + + +// Public accessors. +SoundState DynamicSoundEffectInstance::GetState() +{ + return pImpl->mBase.GetState( false ); +} + + +size_t DynamicSoundEffectInstance::GetSampleDuration( size_t bytes ) const +{ + auto wfx = pImpl->GetFormat(); + if ( !wfx || !wfx->wBitsPerSample || !wfx->nChannels ) + return 0; + + return static_cast( ( uint64_t( bytes ) * 8 ) + / uint64_t( wfx->wBitsPerSample * wfx->nChannels ) ); +} + + +size_t DynamicSoundEffectInstance::GetSampleDurationMS( size_t bytes ) const +{ + auto wfx = pImpl->GetFormat(); + if ( !wfx || !wfx->nAvgBytesPerSec ) + return 0; + + return static_cast( ( uint64_t(bytes) * 1000 ) / wfx->nAvgBytesPerSec ); +} + + +size_t DynamicSoundEffectInstance::GetSampleSizeInBytes( uint64_t duration ) const +{ + auto wfx = pImpl->GetFormat(); + if ( !wfx || !wfx->nSamplesPerSec ) + return 0; + + return static_cast( ( ( duration * wfx->nSamplesPerSec ) / 1000 ) * wfx->nBlockAlign ); +} + + +int DynamicSoundEffectInstance::GetPendingBufferCount() const +{ + return pImpl->mBase.GetPendingBufferCount(); +} + + +const WAVEFORMATEX* DynamicSoundEffectInstance::GetFormat() const +{ + return pImpl->GetFormat(); +} \ No newline at end of file diff --git a/DirectXTK/Audio/SoundCommon.cpp b/DirectXTK/Audio/SoundCommon.cpp new file mode 100644 index 0000000..1ed0f1a --- /dev/null +++ b/DirectXTK/Audio/SoundCommon.cpp @@ -0,0 +1,789 @@ +//-------------------------------------------------------------------------------------- +// File: SoundCommon.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "SoundCommon.h" + +using namespace DirectX; + + +namespace +{ + template WORD ChannelsSpecifiedInMask(T x) + { + WORD bitCount = 0; + while (x) {++bitCount; x &= (x-1);} + return bitCount; + } +} + + +//====================================================================================== +// Wave format utilities +//====================================================================================== + +bool DirectX::IsValid( _In_ const WAVEFORMATEX* wfx ) +{ + if ( !wfx ) + return false; + + if ( !wfx->nChannels ) + { + DebugTrace( "ERROR: Wave format must have at least 1 channel\n" ); + return false; + } + + if ( wfx->nChannels > XAUDIO2_MAX_AUDIO_CHANNELS ) + { + DebugTrace( "ERROR: Wave format must have less than %u channels (%u)\n", XAUDIO2_MAX_AUDIO_CHANNELS, wfx->nChannels ); + return false; + } + + if ( !wfx->nSamplesPerSec ) + { + DebugTrace( "ERROR: Wave format cannot have a sample rate of 0\n" ); + return false; + } + + if ( ( wfx->nSamplesPerSec < XAUDIO2_MIN_SAMPLE_RATE ) + || ( wfx->nSamplesPerSec > XAUDIO2_MAX_SAMPLE_RATE ) ) + { + DebugTrace( "ERROR: Wave format channel count must be in range %u..%u (%u)\n", XAUDIO2_MIN_SAMPLE_RATE, XAUDIO2_MAX_SAMPLE_RATE, wfx->nSamplesPerSec ); + return false; + } + + switch ( wfx->wFormatTag ) + { + case WAVE_FORMAT_PCM: + + switch( wfx->wBitsPerSample ) + { + case 8: + case 16: + case 24: + case 32: + break; + + default: + DebugTrace( "ERROR: Wave format integer PCM must have 8, 16, 24, or 32 bits per sample (%u)\n", wfx->wBitsPerSample ); + return false; + } + + if ( wfx->nBlockAlign != ( wfx->nChannels * wfx->wBitsPerSample / 8 ) ) + { + DebugTrace( "ERROR: Wave format integer PCM - nBlockAlign (%u) != nChannels (%u) * wBitsPerSample (%u) / 8\n", + wfx->nBlockAlign, wfx->nChannels, wfx->wBitsPerSample ); + return false; + } + + if ( wfx->nAvgBytesPerSec != ( wfx->nSamplesPerSec * wfx->nBlockAlign ) ) + { + DebugTrace( "ERROR: Wave format integer PCM - nAvgBytesPerSec (%lu) != nSamplesPerSec (%lu) * nBlockAlign (%u)\n", + wfx->nAvgBytesPerSec, wfx->nSamplesPerSec, wfx->nBlockAlign ); + return false; + } + + return true; + + case WAVE_FORMAT_IEEE_FLOAT: + + if ( wfx->wBitsPerSample != 32 ) + { + DebugTrace( "ERROR: Wave format float PCM must have 32-bits per sample (%u)\n", wfx->wBitsPerSample ); + return false; + } + + if ( wfx->nBlockAlign != ( wfx->nChannels * wfx->wBitsPerSample / 8 ) ) + { + DebugTrace( "ERROR: Wave format float PCM - nBlockAlign (%u) != nChannels (%u) * wBitsPerSample (%u) / 8\n", + wfx->nBlockAlign, wfx->nChannels, wfx->wBitsPerSample ); + return false; + } + + if ( wfx->nAvgBytesPerSec != ( wfx->nSamplesPerSec * wfx->nBlockAlign ) ) + { + DebugTrace( "ERROR: Wave format float PCM - nAvgBytesPerSec (%lu) != nSamplesPerSec (%lu) * nBlockAlign (%u)\n", + wfx->nAvgBytesPerSec, wfx->nSamplesPerSec, wfx->nBlockAlign ); + return false; + } + + return true; + + case WAVE_FORMAT_ADPCM: + + if ( ( wfx->nChannels != 1 ) && ( wfx->nChannels != 2 ) ) + { + DebugTrace( "ERROR: Wave format ADPCM must have 1 or 2 channels (%u)\n", wfx->nChannels ); + return false; + } + + if ( wfx->wBitsPerSample != 4 /*MSADPCM_BITS_PER_SAMPLE*/ ) + { + DebugTrace( "ERROR: Wave format ADPCM must have 4 bits per sample (%u)\n", wfx->wBitsPerSample ); + return false; + } + + if ( wfx->cbSize != 32 /*MSADPCM_FORMAT_EXTRA_BYTES*/ ) + { + DebugTrace( "ERROR: Wave format ADPCM must have cbSize = 32 (%u)\n", wfx->cbSize ); + return false; + } + else + { + auto wfadpcm = reinterpret_cast( wfx ); + + if ( wfadpcm->wNumCoef != 7 /*MSADPCM_NUM_COEFFICIENTS*/ ) + { + DebugTrace( "ERROR: Wave format ADPCM must have 7 coefficients (%u)\n", wfadpcm->wNumCoef ); + return false; + } + + bool valid = true; + for ( int j = 0; j < 7 /*MSADPCM_NUM_COEFFICIENTS*/; ++j ) + { + // Microsoft ADPCM standard encoding coefficients + static const short g_pAdpcmCoefficients1[] = {256, 512, 0, 192, 240, 460, 392}; + static const short g_pAdpcmCoefficients2[] = { 0, -256, 0, 64, 0, -208, -232}; + + if ( wfadpcm->aCoef[j].iCoef1 != g_pAdpcmCoefficients1[j] + || wfadpcm->aCoef[j].iCoef2 != g_pAdpcmCoefficients2[j] ) + { + valid = false; + } + } + + if ( !valid ) + { + DebugTrace( "ERROR: Wave formt ADPCM found non-standard coefficients\n" ); + return false; + } + + if ( ( wfadpcm->wSamplesPerBlock < 4 /*MSADPCM_MIN_SAMPLES_PER_BLOCK*/ ) + || ( wfadpcm->wSamplesPerBlock > 64000 /*MSADPCM_MAX_SAMPLES_PER_BLOCK*/ ) ) + { + DebugTrace( "ERROR: Wave format ADPCM wSamplesPerBlock must be 4..64000 (%u)\n", wfadpcm->wSamplesPerBlock ); + return false; + } + + if ( wfadpcm->wfx.nChannels == 1 && ( wfadpcm->wSamplesPerBlock % 2 ) ) + { + DebugTrace( "ERROR: Wave format ADPCM mono files must have even wSamplesPerBlock\n" ); + return false; + } + + int nHeaderBytes = 7 /*MSADPCM_HEADER_LENGTH*/ * wfx->nChannels; + int nBitsPerFrame = 4 /*MSADPCM_BITS_PER_SAMPLE*/ * wfx->nChannels; + int nPcmFramesPerBlock = (wfx->nBlockAlign - nHeaderBytes) * 8 / nBitsPerFrame + 2; + + if ( wfadpcm->wSamplesPerBlock != nPcmFramesPerBlock ) + { + DebugTrace( "ERROR: Wave format ADPCM %u-channel with nBlockAlign = %u must have wSamplesPerBlock = %u (%u)\n", + wfx->nChannels, wfx->nBlockAlign, nPcmFramesPerBlock, wfadpcm->wSamplesPerBlock ); + return false; + } + } + return true; + + case WAVE_FORMAT_WMAUDIO2: + case WAVE_FORMAT_WMAUDIO3: + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + + if ( wfx->wBitsPerSample != 16 ) + { + DebugTrace( "ERROR: Wave format xWMA only supports 16-bit data\n" ); + return false; + } + + if ( !wfx->nBlockAlign ) + { + DebugTrace( "ERROR: Wave format xWMA must have a non-zero nBlockAlign\n" ); + return false; + } + + if ( !wfx->nAvgBytesPerSec ) + { + DebugTrace( "ERROR: Wave format xWMA must have a non-zero nAvgBytesPerSec\n" ); + return false; + } + + return true; + +#else + DebugTrace( "ERROR: Wave format xWMA not supported by this version of DirectXTK for Audio\n" ); + return false; +#endif + + case 0x166 /* WAVE_FORMAT_XMA2 */: + +#if defined(_XBOX_ONE) && defined(_TITLE) + + if ( wfx->nBlockAlign != wfx->nChannels * XMA_OUTPUT_SAMPLE_BYTES) + { + DebugTrace( "ERROR: Wave format XMA2 - nBlockAlign (%u) != nChannels(%u) * %u\n", wfx->nBlockAlign, wfx->nChannels, XMA_OUTPUT_SAMPLE_BYTES ); + return false; + } + + if ( wfx->wBitsPerSample != XMA_OUTPUT_SAMPLE_BITS ) + { + DebugTrace( "ERROR: Wave format XMA2 wBitsPerSample (%u) should be %u\n", wfx->wBitsPerSample, XMA_OUTPUT_SAMPLE_BITS ); + return false; + } + + if ( wfx->cbSize != ( sizeof(XMA2WAVEFORMATEX) - sizeof(WAVEFORMATEX) ) ) + { + DebugTrace( "ERROR: Wave format XMA2 - cbSize must be %Iu (%u)\n", ( sizeof(XMA2WAVEFORMATEX) - sizeof(WAVEFORMATEX) ), wfx->cbSize ); + return false; + } + else + { + auto xmaFmt = reinterpret_cast( wfx ); + + if ( xmaFmt->EncoderVersion < 3 ) + { + DebugTrace( "ERROR: Wave format XMA2 encoder version (%u) - 3 or higher is required\n", xmaFmt->EncoderVersion ); + return false; + } + + if ( !xmaFmt->BlockCount ) + { + DebugTrace( "ERROR: Wave format XMA2 BlockCount must be non-zero\n" ); + return false; + } + + if ( !xmaFmt->BytesPerBlock || ( xmaFmt->BytesPerBlock > XMA_READBUFFER_MAX_BYTES ) ) + { + DebugTrace( "ERROR: Wave format XMA2 BytesPerBlock (%u) is invalid\n", xmaFmt->BytesPerBlock ); + return false; + } + + if ( xmaFmt->ChannelMask ) + { + auto channelBits = ChannelsSpecifiedInMask( xmaFmt->ChannelMask ); + if ( channelBits != wfx->nChannels ) + { + DebugTrace( "ERROR: Wave format XMA2 - nChannels=%u but ChannelMask (%08X) has %u bits set\n", + xmaFmt->ChannelMask, wfx->nChannels, channelBits ); + return false; + } + } + + if ( xmaFmt->NumStreams != ( ( wfx->nChannels + 1) / 2 ) ) + { + DebugTrace( "ERROR: Wave format XMA2 - NumStreams (%u) != ( nChannels(%u) + 1 ) / 2\n", xmaFmt->NumStreams, wfx->nChannels ); + return false; + } + + if ( ( xmaFmt->PlayBegin + xmaFmt->PlayLength ) > xmaFmt->SamplesEncoded ) + { + DebugTrace( "ERROR: Wave format XMA2 play region too large (%u + %u > %u)\n", xmaFmt->PlayBegin, xmaFmt->PlayLength, xmaFmt->SamplesEncoded ); + return false; + } + + if ( ( xmaFmt->LoopBegin + xmaFmt->LoopLength ) > xmaFmt->SamplesEncoded ) + { + DebugTrace( "ERROR: Wave format XMA2 loop region too large (%u + %u > %u)\n", xmaFmt->LoopBegin, xmaFmt->LoopLength, xmaFmt->SamplesEncoded ); + return false; + } + } + return true; + +#else + DebugTrace( "ERROR: Wave format XMA2 not supported by this version of DirectXTK for Audio\n" ); + return false; +#endif + + case WAVE_FORMAT_EXTENSIBLE: + if ( wfx->cbSize < ( sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX) ) ) + { + DebugTrace( "ERROR: Wave format WAVE_FORMAT_EXTENSIBLE - cbSize must be %Iu (%u)\n", ( sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX) ), wfx->cbSize ); + return false; + } + else + { + static const GUID s_wfexBase = {0x00000000, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}; + + auto wfex = reinterpret_cast( wfx ); + + if ( memcmp( reinterpret_cast(&wfex->SubFormat) + sizeof(DWORD), + reinterpret_cast(&s_wfexBase) + sizeof(DWORD), sizeof(GUID) - sizeof(DWORD) ) != 0 ) + { + DebugTrace( "ERROR: Wave format WAVEFORMATEXTENSIBLE encountered with unknown GUID ({%8.8lX-%4.4X-%4.4X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X})\n", + wfex->SubFormat.Data1, wfex->SubFormat.Data2, wfex->SubFormat.Data3, + wfex->SubFormat.Data4[0], wfex->SubFormat.Data4[1], wfex->SubFormat.Data4[2], wfex->SubFormat.Data4[3], + wfex->SubFormat.Data4[4], wfex->SubFormat.Data4[5], wfex->SubFormat.Data4[6], wfex->SubFormat.Data4[7] ); + return false; + } + + switch( wfex->SubFormat.Data1 ) + { + case WAVE_FORMAT_PCM: + + switch( wfx->wBitsPerSample ) + { + case 8: + case 16: + case 24: + case 32: + break; + + default: + DebugTrace( "ERROR: Wave format integer PCM must have 8, 16, 24, or 32 bits per sample (%u)\n", wfx->wBitsPerSample ); + return false; + } + + switch( wfex->Samples.wValidBitsPerSample ) + { + case 0: + case 8: + case 16: + case 20: + case 24: + case 32: + break; + + default: + DebugTrace( "ERROR: Wave format integer PCM must have 8, 16, 20, 24, or 32 valid bits per sample (%u)\n", wfex->Samples.wValidBitsPerSample ); + return false; + } + + if ( wfex->Samples.wValidBitsPerSample + && ( wfex->Samples.wValidBitsPerSample > wfx->wBitsPerSample ) ) + { + DebugTrace( "ERROR: Wave format ingter PCM wValidBitsPerSample (%u) is greater than wBitsPerSample (%u)\n", wfex->Samples.wValidBitsPerSample, wfx->wBitsPerSample ); + return false; + } + + if ( wfx->nBlockAlign != ( wfx->nChannels * wfx->wBitsPerSample / 8 ) ) + { + DebugTrace( "ERROR: Wave format integer PCM - nBlockAlign (%u) != nChannels (%u) * wBitsPerSample (%u) / 8\n", + wfx->nBlockAlign, wfx->nChannels, wfx->wBitsPerSample ); + return false; + } + + if ( wfx->nAvgBytesPerSec != ( wfx->nSamplesPerSec * wfx->nBlockAlign ) ) + { + DebugTrace( "ERROR: Wave format integer PCM - nAvgBytesPerSec (%lu) != nSamplesPerSec (%lu) * nBlockAlign (%u)\n", + wfx->nAvgBytesPerSec, wfx->nSamplesPerSec, wfx->nBlockAlign ); + return false; + } + + break; + + case WAVE_FORMAT_IEEE_FLOAT: + + if ( wfx->wBitsPerSample != 32 ) + { + DebugTrace( "ERROR: Wave format float PCM must have 32-bits per sample (%u)\n", wfx->wBitsPerSample ); + return false; + } + + switch( wfex->Samples.wValidBitsPerSample ) + { + case 0: + case 32: + break; + + default: + DebugTrace( "ERROR: Wave format float PCM must have 32 valid bits per sample (%u)\n", wfex->Samples.wValidBitsPerSample ); + return false; + } + + if ( wfx->nBlockAlign != ( wfx->nChannels * wfx->wBitsPerSample / 8 ) ) + { + DebugTrace( "ERROR: Wave format float PCM - nBlockAlign (%u) != nChannels (%u) * wBitsPerSample (%u) / 8\n", + wfx->nBlockAlign, wfx->nChannels, wfx->wBitsPerSample ); + return false; + } + + if ( wfx->nAvgBytesPerSec != ( wfx->nSamplesPerSec * wfx->nBlockAlign ) ) + { + DebugTrace( "ERROR: Wave format float PCM - nAvgBytesPerSec (%lu) != nSamplesPerSec (%lu) * nBlockAlign (%u)\n", + wfx->nAvgBytesPerSec, wfx->nSamplesPerSec, wfx->nBlockAlign ); + return false; + } + + break; + + case WAVE_FORMAT_ADPCM: + DebugTrace( "ERROR: Wave format ADPCM is not supported as a WAVEFORMATEXTENSIBLE\n" ); + return false; + + case WAVE_FORMAT_WMAUDIO2: + case WAVE_FORMAT_WMAUDIO3: + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + + if ( wfx->wBitsPerSample != 16 ) + { + DebugTrace( "ERROR: Wave format xWMA only supports 16-bit data\n" ); + return false; + } + + if ( !wfx->nBlockAlign ) + { + DebugTrace( "ERROR: Wave format xWMA must have a non-zero nBlockAlign\n" ); + return false; + } + + if ( !wfx->nAvgBytesPerSec ) + { + DebugTrace( "ERROR: Wave format xWMA must have a non-zero nAvgBytesPerSec\n" ); + return false; + } + + break; + +#else + DebugTrace( "ERROR: Wave format xWMA not supported by this version of DirectXTK for Audio\n" ); + return false; +#endif + + case 0x166 /* WAVE_FORMAT_XMA2 */: + DebugTrace( "ERROR: Wave format XMA2 is not supported as a WAVEFORMATEXTENSIBLE\n" ); + return false; + + default: + DebugTrace( "ERROR: Unknown WAVEFORMATEXTENSIBLE format tag (%u)\n", wfex->SubFormat.Data1 ); + return false; + } + + if ( wfex->dwChannelMask ) + { + auto channelBits = ChannelsSpecifiedInMask( wfex->dwChannelMask ); + if ( channelBits != wfx->nChannels ) + { + DebugTrace( "ERROR: WAVEFORMATEXTENSIBLE: nChannels=%u but ChannelMask has %u bits set\n", + wfx->nChannels, channelBits ); + return false; + } + } + + return true; + } + + default: + DebugTrace( "ERROR: Unknown WAVEFORMATEX format tag (%u)\n", wfx->wFormatTag ); + return false; + } +} + + +uint32_t DirectX::GetDefaultChannelMask( int channels ) +{ + switch( channels ) + { + case 1: return SPEAKER_MONO; + case 2: return SPEAKER_STEREO; + case 3: return SPEAKER_2POINT1; + case 4: return SPEAKER_QUAD; + case 5: return SPEAKER_4POINT1; + case 6: return SPEAKER_5POINT1; + case 7: return SPEAKER_5POINT1 | SPEAKER_BACK_CENTER; + case 8: return SPEAKER_7POINT1; + default: return 0; + } +} + + +_Use_decl_annotations_ +void DirectX::CreateIntegerPCM( WAVEFORMATEX* wfx, int sampleRate, int channels, int sampleBits ) +{ + int blockAlign = channels * sampleBits / 8; + + wfx->wFormatTag = WAVE_FORMAT_PCM; + wfx->nChannels = static_cast( channels ); + wfx->nSamplesPerSec = static_cast( sampleRate ); + wfx->nAvgBytesPerSec = static_cast( blockAlign * sampleRate ); + wfx->nBlockAlign = static_cast( blockAlign ); + wfx->wBitsPerSample = static_cast( sampleBits ); + wfx->cbSize = 0; + + assert( IsValid( wfx ) ); +} + + +_Use_decl_annotations_ +void DirectX::CreateFloatPCM( WAVEFORMATEX* wfx, int sampleRate, int channels ) +{ + int blockAlign = channels * 4; + + wfx->wFormatTag = WAVE_FORMAT_IEEE_FLOAT; + wfx->nChannels = static_cast( channels ); + wfx->nSamplesPerSec = static_cast( sampleRate ); + wfx->nAvgBytesPerSec = static_cast( blockAlign * sampleRate ); + wfx->nBlockAlign = static_cast( blockAlign ); + wfx->wBitsPerSample = 32; + wfx->cbSize = 0; + + assert( IsValid( wfx ) ); +} + + +_Use_decl_annotations_ +void DirectX::CreateADPCM( WAVEFORMATEX* wfx, size_t wfxSize, int sampleRate, int channels, int samplesPerBlock ) +{ + if ( wfxSize < ( sizeof(WAVEFORMATEX) + 32 /*MSADPCM_FORMAT_EXTRA_BYTES*/ ) ) + { + DebugTrace( "CreateADPCM needs at least %Iu bytes for the result\n", ( sizeof(WAVEFORMATEX) + 32 /*MSADPCM_FORMAT_EXTRA_BYTES*/ ) ); + throw std::invalid_argument( "ADPCMWAVEFORMAT" ); + } + + if ( !samplesPerBlock ) + { + DebugTrace( "CreateADPCM needs a non-zero samples per block count\n" ); + throw std::invalid_argument( "ADPCMWAVEFORMAT" ); + } + + int blockAlign = (7 /*MSADPCM_HEADER_LENGTH*/) * channels + + (samplesPerBlock - 2) * (4 /* MSADPCM_BITS_PER_SAMPLE */) * channels / 8; + + wfx->wFormatTag = WAVE_FORMAT_ADPCM; + wfx->nChannels = static_cast( channels ); + wfx->nSamplesPerSec = static_cast( sampleRate ); + wfx->nAvgBytesPerSec = static_cast( blockAlign * sampleRate / samplesPerBlock ); + wfx->nBlockAlign = static_cast( blockAlign ); + wfx->wBitsPerSample = 4 /* MSADPCM_BITS_PER_SAMPLE */; + wfx->cbSize = 32 /*MSADPCM_FORMAT_EXTRA_BYTES*/; + + auto adpcm = reinterpret_cast( wfx ); + adpcm->wSamplesPerBlock = static_cast( samplesPerBlock ); + adpcm->wNumCoef = 7 /* MSADPCM_NUM_COEFFICIENTS */; + + static ADPCMCOEFSET aCoef[7] = { { 256, 0}, {512, -256}, {0,0}, {192,64}, {240,0}, {460, -208}, {392,-232} }; + memcpy( &adpcm->aCoef, aCoef, sizeof(aCoef) ); + + assert( IsValid( wfx ) ); +} + + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) +_Use_decl_annotations_ +void DirectX::CreateXWMA( WAVEFORMATEX* wfx, int sampleRate, int channels, int blockAlign, int avgBytes, bool wma3 ) +{ + wfx->wFormatTag = (wma3) ? WAVE_FORMAT_WMAUDIO3 : WAVE_FORMAT_WMAUDIO2; + wfx->nChannels = static_cast( channels ); + wfx->nSamplesPerSec = static_cast( sampleRate ); + wfx->nAvgBytesPerSec = static_cast( avgBytes ); + wfx->nBlockAlign = static_cast( blockAlign ); + wfx->wBitsPerSample = 16; + wfx->cbSize = 0; + + assert( IsValid( wfx ) ); +} +#endif + + +#if defined(_XBOX_ONE) && defined(_TITLE) +_Use_decl_annotations_ +void DirectX::CreateXMA2( WAVEFORMATEX* wfx, size_t wfxSize, int sampleRate, int channels, int bytesPerBlock, int blockCount, int samplesEncoded ) +{ + if ( wfxSize < sizeof(XMA2WAVEFORMATEX) ) + { + DebugTrace( "XMA2 needs at least %Iu bytes for the result\n", sizeof(XMA2WAVEFORMATEX) ); + throw std::invalid_argument( "XMA2WAVEFORMATEX" ); + } + + if ( !bytesPerBlock || ( bytesPerBlock > XMA_READBUFFER_MAX_BYTES ) ) + { + DebugTrace( "XMA2 needs a valid bytes per block\n" ); + throw std::invalid_argument( "XMA2WAVEFORMATEX" ); + } + + int blockAlign = (channels * ( 16 /*XMA_OUTPUT_SAMPLE_BITS*/ ) / 8); + + wfx->wFormatTag = WAVE_FORMAT_XMA2; + wfx->nChannels = static_cast( channels ); + wfx->nSamplesPerSec = static_cast( sampleRate ); + wfx->nAvgBytesPerSec = static_cast( blockAlign * sampleRate ); + wfx->nBlockAlign = static_cast( blockAlign ); + wfx->wBitsPerSample = 16 /* XMA_OUTPUT_SAMPLE_BITS */; + wfx->cbSize = sizeof(XMA2WAVEFORMATEX) - sizeof(WAVEFORMATEX); + + auto xmaFmt = reinterpret_cast(wfx); + + xmaFmt->NumStreams = static_cast( (channels + 1) / 2 ); + + xmaFmt->ChannelMask = GetDefaultChannelMask( channels ); + + xmaFmt->SamplesEncoded = static_cast( samplesEncoded ); + xmaFmt->BytesPerBlock = bytesPerBlock; + xmaFmt->PlayBegin = xmaFmt->PlayLength = + xmaFmt->LoopBegin = xmaFmt->LoopLength = xmaFmt->LoopCount = 0; + xmaFmt->EncoderVersion = 4 /* XMAENCODER_VERSION_XMA2 */; + xmaFmt->BlockCount = static_cast( blockCount ); + + assert( IsValid( wfx ) ); +} +#endif // _XBOX_ONE && _TITLE + + +_Use_decl_annotations_ +bool DirectX::ComputePan( float pan, int channels, float* matrix ) +{ + memset( matrix, 0, sizeof(float) * 16 ); + + if (channels == 1) + { + // Mono panning + float left = ( pan >= 0 ) ? ( 1.f - pan ) : 1.f; + left = std::min( 1.f, left ); + left = std::max( -1.f, left ); + + float right = ( pan <= 0 ) ? ( - pan - 1.f ) : 1.f; + right = std::min( 1.f, right ); + right = std::max( -1.f, right ); + + matrix[0] = left; + matrix[1] = right; + } + else if (channels == 2) + { + // Stereo panning + if ( -1.f <= pan && pan <= 0.f ) + { + matrix[0] = .5f * pan + 1.f; // .5 when pan is -1, 1 when pan is 0 + matrix[1] = .5f * -pan; // .5 when pan is -1, 0 when pan is 0 + matrix[2] = 0.f; // 0 when pan is -1, 0 when pan is 0 + matrix[3] = pan + 1.f; // 0 when pan is -1, 1 when pan is 0 + } + else + { + matrix[0] = -pan + 1.f; // 1 when pan is 0, 0 when pan is 1 + matrix[1] = 0.f; // 0 when pan is 0, 0 when pan is 1 + matrix[2] = .5f * pan; // 0 when pan is 0, .5f when pan is 1 + matrix[3] = .5f * -pan + 1.f; // 1 when pan is 0. .5f when pan is 1 + } + } + else + { + if ( pan != 0.f ) + { + DebugTrace( "WARNING: Only supports panning on mono or stereo source data, ignored\n" ); + } + return false; + } + + return true; +} + + +//====================================================================================== +// SoundEffectInstanceBase +//====================================================================================== + +void SoundEffectInstanceBase::SetPan( float pan ) +{ + assert( pan >= -1.f && pan <= 1.f ); + + mPan = pan; + + if ( !voice ) + return; + + float matrix[16]; + if ( ComputePan( pan, mDSPSettings.SrcChannelCount, matrix ) ) + { + HRESULT hr = voice->SetOutputMatrix( nullptr, mDSPSettings.SrcChannelCount, mDSPSettings.DstChannelCount, matrix ); + ThrowIfFailed( hr ); + } +} + + +void SoundEffectInstanceBase::Apply3D( const AudioListener& listener, const AudioEmitter& emitter, bool rhcoords ) +{ + if ( !voice ) + return; + + if ( !( mFlags & SoundEffectInstance_Use3D ) ) + { + DebugTrace( "ERROR: Apply3D called for an instance created without SoundEffectInstance_Use3D set\n" ); + throw std::exception( "Apply3D" ); + } + + DWORD dwCalcFlags = X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_DOPPLER | X3DAUDIO_CALCULATE_LPF_DIRECT; + + if ( mFlags & SoundEffectInstance_UseRedirectLFE ) + { + // On devices with an LFE channel, allow the mono source data to be routed to the LFE destination channel. + dwCalcFlags |= X3DAUDIO_CALCULATE_REDIRECT_TO_LFE; + } + + auto reverb = mReverbVoice; + if ( reverb ) + { + dwCalcFlags |= X3DAUDIO_CALCULATE_LPF_REVERB | X3DAUDIO_CALCULATE_REVERB; + } + + float matrix[XAUDIO2_MAX_AUDIO_CHANNELS * 8] = {}; + assert( mDSPSettings.SrcChannelCount <= XAUDIO2_MAX_AUDIO_CHANNELS ); + assert( mDSPSettings.DstChannelCount <= 8 ); + mDSPSettings.pMatrixCoefficients = matrix; + + assert( engine != 0 ); + if (rhcoords) + { + X3DAUDIO_EMITTER lhEmitter; + memcpy(&lhEmitter, &emitter, sizeof(X3DAUDIO_EMITTER)); + lhEmitter.OrientFront.z = -emitter.OrientFront.z; + lhEmitter.OrientTop.z = -emitter.OrientTop.z; + lhEmitter.Position.z = -emitter.Position.z; + lhEmitter.Velocity.z = -emitter.Velocity.z; + + X3DAUDIO_LISTENER lhListener; + memcpy(&lhListener, &listener, sizeof(X3DAUDIO_LISTENER)); + lhListener.OrientFront.z = -listener.OrientFront.z; + lhListener.OrientTop.z = -listener.OrientTop.z; + lhListener.Position.z = -listener.Position.z; + lhListener.Velocity.z = -listener.Velocity.z; + + X3DAudioCalculate( engine->Get3DHandle(), &lhListener, &lhEmitter, dwCalcFlags, &mDSPSettings ); + } + else + { + X3DAudioCalculate( engine->Get3DHandle(), &listener, &emitter, dwCalcFlags, &mDSPSettings ); + } + + mDSPSettings.pMatrixCoefficients = nullptr; + + (void)voice->SetFrequencyRatio( mFreqRatio * mDSPSettings.DopplerFactor ); + + auto direct = mDirectVoice; + assert( direct != 0 ); + (void)voice->SetOutputMatrix( direct, mDSPSettings.SrcChannelCount, mDSPSettings.DstChannelCount, matrix ); + + if ( reverb ) + { + for ( size_t j = 0; j < mDSPSettings.SrcChannelCount; ++j ) + { + matrix[j] = mDSPSettings.ReverbLevel; + } + (void)voice->SetOutputMatrix( reverb, mDSPSettings.SrcChannelCount, 1, matrix ); + } + + if ( mFlags & SoundEffectInstance_ReverbUseFilters ) + { + XAUDIO2_FILTER_PARAMETERS filterDirect = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * mDSPSettings.LPFDirectCoefficient), 1.0f }; + // see XAudio2CutoffFrequencyToRadians() in XAudio2.h for more information on the formula used here + (void)voice->SetOutputFilterParameters( direct, &filterDirect ); + + if ( reverb ) + { + XAUDIO2_FILTER_PARAMETERS filterReverb = { LowPassFilter, 2.0f * sinf(X3DAUDIO_PI/6.0f * mDSPSettings.LPFReverbCoefficient), 1.0f }; + // see XAudio2CutoffFrequencyToRadians() in XAudio2.h for more information on the formula used here + (void)voice->SetOutputFilterParameters( reverb, &filterReverb ); + } + } +} + + diff --git a/DirectXTK/Audio/SoundCommon.h b/DirectXTK/Audio/SoundCommon.h new file mode 100644 index 0000000..b41e440 --- /dev/null +++ b/DirectXTK/Audio/SoundCommon.h @@ -0,0 +1,370 @@ +//-------------------------------------------------------------------------------------- +// File: SoundCommon.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include "Audio.h" +#include "PlatformHelpers.h" + + +namespace DirectX +{ + // Helper for getting a format tag from a WAVEFORMATEX + inline uint32_t GetFormatTag( const WAVEFORMATEX* wfx ) + { + if ( wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE ) + { + if ( wfx->cbSize < ( sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX) ) ) + return 0; + + static const GUID s_wfexBase = {0x00000000, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}; + + auto wfex = reinterpret_cast( wfx ); + + if ( memcmp( reinterpret_cast(&wfex->SubFormat) + sizeof(DWORD), + reinterpret_cast(&s_wfexBase) + sizeof(DWORD), sizeof(GUID) - sizeof(DWORD) ) != 0 ) + { + return 0; + } + + return wfex->SubFormat.Data1; + } + else + { + return wfx->wFormatTag; + } + } + + + // Helper for validating wave format structure + bool IsValid( _In_ const WAVEFORMATEX* wfx ); + + + // Helper for getting a default channel mask from channels + uint32_t GetDefaultChannelMask( int channels ); + + + // Helpers for creating various wave format structures + void CreateIntegerPCM( _Out_ WAVEFORMATEX* wfx, int sampleRate, int channels, int sampleBits ); + void CreateFloatPCM( _Out_ WAVEFORMATEX* wfx, int sampleRate, int channels ); + void CreateADPCM( _Out_writes_bytes_(wfxSize) WAVEFORMATEX* wfx, size_t wfxSize, int sampleRate, int channels, int samplesPerBlock ); +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + void CreateXWMA( _Out_ WAVEFORMATEX* wfx, int sampleRate, int channels, int blockAlign, int avgBytes, bool wma3 ); +#endif +#if defined(_XBOX_ONE) && defined(_TITLE) + void CreateXMA2( _Out_writes_bytes_(wfxSize) WAVEFORMATEX* wfx, size_t wfxSize, int sampleRate, int channels, int bytesPerBlock, int blockCount, int samplesEncoded ); +#endif + + // Helper for computing pan volume matrix + bool ComputePan( float pan, int channels, _Out_writes_(16) float* matrix ); + + // Helper class for implementing SoundEffectInstance + class SoundEffectInstanceBase + { + public: + SoundEffectInstanceBase() : + voice( nullptr ), + state( STOPPED ), + engine( nullptr ), + mVolume( 1.f ), + mPitch( 0.f ), + mFreqRatio( 1.f ), + mPan( 0.f ), + mFlags( SoundEffectInstance_Default ), + mDirectVoice( nullptr ), + mReverbVoice( nullptr ), + mDSPSettings{} + { + } + + ~SoundEffectInstanceBase() + { + assert( !voice ); + } + + void Initialize( _In_ AudioEngine* eng, _In_ const WAVEFORMATEX* wfx, SOUND_EFFECT_INSTANCE_FLAGS flags ) + { + assert( eng != 0 ); + engine = eng; + mDirectVoice = eng->GetMasterVoice(); + mReverbVoice = eng->GetReverbVoice(); + + if ( eng->GetChannelMask() & SPEAKER_LOW_FREQUENCY ) + mFlags = flags | SoundEffectInstance_UseRedirectLFE; + else + mFlags = static_cast( static_cast(flags) & ~SoundEffectInstance_UseRedirectLFE ); + + memset( &mDSPSettings, 0, sizeof(X3DAUDIO_DSP_SETTINGS) ); + assert( wfx != 0 ); + mDSPSettings.SrcChannelCount = wfx->nChannels; + mDSPSettings.DstChannelCount = eng->GetOutputChannels(); + } + + void AllocateVoice( _In_ const WAVEFORMATEX* wfx ) + { + if ( voice ) + return; + + assert( engine != 0 ); + engine->AllocateVoice( wfx, mFlags, false, &voice ); + } + + void DestroyVoice() + { + if ( voice ) + { + assert( engine != 0 ); + engine->DestroyVoice( voice ); + voice = nullptr; + } + } + + bool Play() // Returns true if STOPPED -> PLAYING + { + if ( voice ) + { + if ( state == PAUSED ) + { + HRESULT hr = voice->Start( 0 ); + ThrowIfFailed( hr ); + state = PLAYING; + } + else if ( state != PLAYING ) + { + if ( mVolume != 1.f ) + { + HRESULT hr = voice->SetVolume( mVolume ); + ThrowIfFailed( hr ); + } + + if ( mPitch != 0.f ) + { + mFreqRatio = XAudio2SemitonesToFrequencyRatio( mPitch * 12.f ); + + HRESULT hr = voice->SetFrequencyRatio( mFreqRatio ); + ThrowIfFailed( hr ); + } + + if ( mPan != 0.f ) + { + SetPan( mPan ); + } + + HRESULT hr = voice->Start( 0 ); + ThrowIfFailed( hr ); + state = PLAYING; + return true; + } + } + return false; + } + + void Stop( bool immediate, bool& looped ) + { + if ( !voice ) + { + state = STOPPED; + return; + } + + if ( immediate ) + { + state = STOPPED; + (void)voice->Stop( 0 ); + (void)voice->FlushSourceBuffers(); + } + else if ( looped ) + { + looped = false; + (void)voice->ExitLoop(); + } + else + { + (void)voice->Stop( XAUDIO2_PLAY_TAILS ); + } + } + + void Pause() + { + if ( voice && state == PLAYING ) + { + state = PAUSED; + + (void)voice->Stop( 0 ); + } + } + + void Resume() + { + if ( voice && state == PAUSED ) + { + HRESULT hr = voice->Start( 0 ); + ThrowIfFailed( hr ); + state = PLAYING; + } + } + + void SetVolume( float volume ) + { + assert( volume >= -XAUDIO2_MAX_VOLUME_LEVEL && volume <= XAUDIO2_MAX_VOLUME_LEVEL ); + + mVolume = volume; + + if ( voice ) + { + HRESULT hr = voice->SetVolume( volume ); + ThrowIfFailed( hr ); + } + } + + void SetPitch( float pitch ) + { + assert( pitch >= -1.f && pitch <= 1.f ); + + if ( ( mFlags & SoundEffectInstance_NoSetPitch ) && pitch != 0.f ) + { + DebugTrace( "ERROR: Sound effect instance was created with the NoSetPitch flag\n" ); + throw std::exception( "SetPitch" ); + } + + mPitch = pitch; + + if ( voice ) + { + mFreqRatio = XAudio2SemitonesToFrequencyRatio( mPitch * 12.f ); + + HRESULT hr = voice->SetFrequencyRatio( mFreqRatio ); + ThrowIfFailed( hr ); + } + } + + void SetPan( float pan ); + + void Apply3D( const AudioListener& listener, const AudioEmitter& emitter, bool rhcoords ); + + SoundState GetState( bool autostop ) + { + if ( autostop && voice && ( state == PLAYING ) ) + { + XAUDIO2_VOICE_STATE xstate; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + voice->GetState( &xstate, XAUDIO2_VOICE_NOSAMPLESPLAYED ); +#else + voice->GetState( &xstate ); +#endif + + if ( !xstate.BuffersQueued ) + { + // Automatic stop if the buffer has finished playing + (void)voice->Stop(); + state = STOPPED; + } + } + + return state; + } + + int GetPendingBufferCount() const + { + if ( !voice ) + return 0; + + XAUDIO2_VOICE_STATE xstate; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + voice->GetState( &xstate, XAUDIO2_VOICE_NOSAMPLESPLAYED ); +#else + voice->GetState( &xstate ); +#endif + return static_cast( xstate.BuffersQueued ); + } + + void OnCriticalError() + { + if ( voice ) + { + voice->DestroyVoice(); + voice = nullptr; + } + state = STOPPED; + mDirectVoice = nullptr; + mReverbVoice = nullptr; + } + + void OnReset() + { + assert( engine != 0 ); + mDirectVoice = engine->GetMasterVoice(); + mReverbVoice = engine->GetReverbVoice(); + + if ( engine->GetChannelMask() & SPEAKER_LOW_FREQUENCY ) + mFlags = mFlags | SoundEffectInstance_UseRedirectLFE; + else + mFlags = static_cast( static_cast(mFlags) & ~SoundEffectInstance_UseRedirectLFE ); + + mDSPSettings.DstChannelCount = engine->GetOutputChannels(); + } + + void OnDestroy() + { + if ( voice ) + { + (void)voice->Stop( 0 ); + (void)voice->FlushSourceBuffers(); + voice->DestroyVoice(); + voice = nullptr; + } + state = STOPPED; + engine = nullptr; + mDirectVoice = nullptr; + mReverbVoice = nullptr; + } + + void OnTrim() + { + if ( voice && ( state == STOPPED ) ) + { + engine->DestroyVoice( voice ); + voice = nullptr; + } + } + + void GatherStatistics( AudioStatistics& stats ) const + { + ++stats.allocatedInstances; + if ( voice ) + { + ++stats.allocatedVoices; + + if ( mFlags & SoundEffectInstance_Use3D ) + ++stats.allocatedVoices3d; + + if ( state == PLAYING ) + ++stats.playingInstances; + } + } + + IXAudio2SourceVoice* voice; + SoundState state; + AudioEngine* engine; + + private: + float mVolume; + float mPitch; + float mFreqRatio; + float mPan; + SOUND_EFFECT_INSTANCE_FLAGS mFlags; + IXAudio2Voice* mDirectVoice; + IXAudio2Voice* mReverbVoice; + X3DAUDIO_DSP_SETTINGS mDSPSettings; + }; +} \ No newline at end of file diff --git a/DirectXTK/Audio/SoundEffect.cpp b/DirectXTK/Audio/SoundEffect.cpp new file mode 100644 index 0000000..2394b24 --- /dev/null +++ b/DirectXTK/Audio/SoundEffect.cpp @@ -0,0 +1,611 @@ +//-------------------------------------------------------------------------------------- +// File: SoundEffect.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "WAVFileReader.h" +#include "SoundCommon.h" + +#include + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#endif + +using namespace DirectX; + + +//====================================================================================== +// SoundEffect +//====================================================================================== + +// Internal object implementation class. +class SoundEffect::Impl : public IVoiceNotify +{ +public: + explicit Impl( _In_ AudioEngine* engine ) : + mWaveFormat( nullptr ), + mStartAudio( nullptr ), + mAudioBytes( 0 ), + mLoopStart( 0 ), + mLoopLength( 0 ), + mEngine( engine ), + mOneShots( 0 ) +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + , mSeekCount( 0 ) + , mSeekTable( nullptr ) +#endif +#if defined(_XBOX_ONE) && defined(_TITLE) + , mXMAMemory( nullptr ) +#endif + { + assert( mEngine != 0 ); + mEngine->RegisterNotify( this, false ); + } + + virtual ~Impl() + { + if ( !mInstances.empty() ) + { + DebugTrace( "WARNING: Destroying SoundEffect with %Iu outstanding SoundEffectInstances\n", mInstances.size() ); + + for( auto it = mInstances.begin(); it != mInstances.end(); ++it ) + { + assert( *it != 0 ); + (*it)->OnDestroyParent(); + } + + mInstances.clear(); + } + + if ( mOneShots > 0 ) + { + DebugTrace( "WARNING: Destroying SoundEffect with %u outstanding one shot effects\n", mOneShots ); + } + + if ( mEngine ) + { + mEngine->UnregisterNotify( this, true, false ); + mEngine = nullptr; + } + +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( mXMAMemory ) + { + ApuFree( mXMAMemory ); + mXMAMemory = nullptr; + } +#endif + } + + HRESULT Initialize( _In_ AudioEngine* engine, _Inout_ std::unique_ptr& wavData, + _In_ const WAVEFORMATEX* wfx, _In_reads_bytes_(audioBytes) const uint8_t* startAudio, size_t audioBytes, +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + _In_reads_opt_(seekCount) const uint32_t* seekTable, size_t seekCount, +#endif + uint32_t loopStart, uint32_t loopLength ); + + void Play( float volume, float pitch, float pan ); + + // IVoiceNotify + virtual void __cdecl OnBufferEnd() override + { + InterlockedDecrement( &mOneShots ); + } + + virtual void __cdecl OnCriticalError() override + { + mOneShots = 0; + } + + virtual void __cdecl OnReset() override + { + // No action required + } + + virtual void __cdecl OnUpdate() override + { + // We do not register for update notification + assert(false); + } + + virtual void __cdecl OnDestroyEngine() override + { + mEngine = nullptr; + mOneShots = 0; + } + + virtual void __cdecl OnTrim() override + { + // No action required + } + + virtual void __cdecl GatherStatistics( AudioStatistics& stats ) const override + { + stats.playingOneShots += mOneShots; + stats.audioBytes += mAudioBytes; + +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( mXMAMemory ) + stats.xmaAudioBytes += mAudioBytes; +#endif + } + + const WAVEFORMATEX* mWaveFormat; + const uint8_t* mStartAudio; + uint32_t mAudioBytes; + uint32_t mLoopStart; + uint32_t mLoopLength; + AudioEngine* mEngine; + std::list mInstances; + uint32_t mOneShots; + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + uint32_t mSeekCount; + const uint32_t* mSeekTable; +#endif + +private: + std::unique_ptr mWavData; + +#if defined(_XBOX_ONE) && defined(_TITLE) + void* mXMAMemory; +#endif +}; + + +_Use_decl_annotations_ +HRESULT SoundEffect::Impl::Initialize( AudioEngine* engine, std::unique_ptr& wavData, + const WAVEFORMATEX* wfx, const uint8_t* startAudio, size_t audioBytes, +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + const uint32_t* seekTable, size_t seekCount, +#endif + uint32_t loopStart, uint32_t loopLength ) +{ + if ( !engine || !IsValid( wfx ) || !startAudio || !audioBytes || !wavData ) + return E_INVALIDARG; + + if ( audioBytes > UINT32_MAX ) + return E_INVALIDARG; + + switch( GetFormatTag( wfx ) ) + { + case WAVE_FORMAT_PCM: + case WAVE_FORMAT_IEEE_FLOAT: + case WAVE_FORMAT_ADPCM: + // Take ownership of the buffer + mWavData.reset( wavData.release() ); + + // WARNING: We assume the wfx and startAudio parameters are pointers into the wavData memory buffer + mWaveFormat = wfx; + mStartAudio = startAudio; + break; + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + + case WAVE_FORMAT_WMAUDIO2: + case WAVE_FORMAT_WMAUDIO3: + if ( !seekCount || !seekTable ) + { + DebugTrace( "ERROR: SoundEffect format xWMA requires seek table\n" ); + return E_FAIL; + } + + if ( seekCount > UINT32_MAX ) + return E_INVALIDARG; + + // Take ownership of the buffer + mWavData.reset( wavData.release() ); + + // WARNING: We assume the wfx, startAudio, and mSeekTable parameters are pointers into the wavData memory buffer + mWaveFormat = wfx; + mStartAudio = startAudio; + mSeekCount = static_cast( seekCount ); + mSeekTable = seekTable; + break; + +#endif // _XBOX_ONE || _WIN32_WINNT < _WIN32_WINNT_WIN8 || _WIN32_WINNT >= _WIN32_WINNT_WIN10 + +#if defined(_XBOX_ONE) && defined(_TITLE) + + case WAVE_FORMAT_XMA2: + if ( !seekCount || !seekTable ) + { + DebugTrace( "ERROR: SoundEffect format XMA2 requires seek table\n" ); + return E_FAIL; + } + + if ( seekCount > UINT32_MAX ) + return E_INVALIDARG; + + { + HRESULT hr = ApuAlloc( &mXMAMemory, nullptr, + static_cast( audioBytes ), SHAPE_XMA_INPUT_BUFFER_ALIGNMENT ); + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: ApuAlloc failed. Did you allocate a large enough heap with ApuCreateHeap for all your XMA wave data?\n" ); + return hr; + } + } + + memcpy( mXMAMemory, startAudio, audioBytes ); + mStartAudio = reinterpret_cast( mXMAMemory ); + + mWavData.reset( new uint8_t[ sizeof(XMA2WAVEFORMATEX) + ( seekCount * sizeof(uint32_t) ) ] ); + + memcpy( mWavData.get(), wfx, sizeof(XMA2WAVEFORMATEX) ); + mWaveFormat = reinterpret_cast( mWavData.get() ); + + // XMA seek table is Big-Endian + { + auto dest = reinterpret_cast( mWavData.get() + sizeof(XMA2WAVEFORMATEX) ); + for( size_t k = 0; k < seekCount; ++k ) + { + dest[ k ] = _byteswap_ulong( seekTable[ k ]) ; + } + } + + mSeekCount = static_cast( seekCount ); + mSeekTable = reinterpret_cast( mWavData.get() + sizeof(XMA2WAVEFORMATEX) ); + + wavData.reset(); + break; + +#endif // _XBOX_ONE && _TITLE + + default: + { + DebugTrace( "ERROR: SoundEffect encountered an unsupported format tag (%u)\n", wfx->wFormatTag ); + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + } + + mAudioBytes = static_cast( audioBytes ); + mLoopStart = loopStart; + mLoopLength = loopLength; + + return S_OK; +} + + +void SoundEffect::Impl::Play( float volume, float pitch, float pan ) +{ + assert( volume >= -XAUDIO2_MAX_VOLUME_LEVEL && volume <= XAUDIO2_MAX_VOLUME_LEVEL ); + assert( pitch >= -1.f && pitch <= 1.f ); + assert( pan >= -1.f && pan <= 1.f ); + + IXAudio2SourceVoice* voice = nullptr; + mEngine->AllocateVoice( mWaveFormat, SoundEffectInstance_Default, true, &voice ); + + if ( !voice ) + return; + + if ( volume != 1.f ) + { + HRESULT hr = voice->SetVolume( volume ); + ThrowIfFailed( hr ); + } + + if ( pitch != 0.f ) + { + float fr = XAudio2SemitonesToFrequencyRatio( pitch * 12.f ); + + HRESULT hr = voice->SetFrequencyRatio( fr ); + ThrowIfFailed( hr ); + } + + if ( pan != 0.f ) + { + float matrix[16]; + if (ComputePan(pan, mWaveFormat->nChannels, matrix)) + { + HRESULT hr = voice->SetOutputMatrix(nullptr, mWaveFormat->nChannels, mEngine->GetOutputChannels(), matrix); + ThrowIfFailed( hr ); + } + } + + HRESULT hr = voice->Start( 0 ); + ThrowIfFailed( hr ); + + XAUDIO2_BUFFER buffer = {}; + buffer.AudioBytes = mAudioBytes; + buffer.pAudioData = mStartAudio; + buffer.Flags = XAUDIO2_END_OF_STREAM; + buffer.pContext = this; + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + + uint32_t tag = GetFormatTag( mWaveFormat ); + if ( tag == WAVE_FORMAT_WMAUDIO2 || tag == WAVE_FORMAT_WMAUDIO3 ) + { + XAUDIO2_BUFFER_WMA wmaBuffer = {}; + wmaBuffer.PacketCount = mSeekCount; + wmaBuffer.pDecodedPacketCumulativeBytes = mSeekTable; + + hr = voice->SubmitSourceBuffer( &buffer, &wmaBuffer ); + } + else +#endif + { + hr = voice->SubmitSourceBuffer( &buffer, nullptr ); + } + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: SoundEffect failed (%08X) when submitting buffer:\n", hr ); + DebugTrace( "\tFormat Tag %u, %u channels, %u-bit, %u Hz, %u bytes\n", mWaveFormat->wFormatTag, + mWaveFormat->nChannels, mWaveFormat->wBitsPerSample, mWaveFormat->nSamplesPerSec, mAudioBytes ); + throw std::exception( "SubmitSourceBuffer" ); + } + + InterlockedIncrement( &mOneShots ); +} + + +//-------------------------------------------------------------------------------------- +// SoundEffect +//-------------------------------------------------------------------------------------- + +// Public constructors. +_Use_decl_annotations_ +SoundEffect::SoundEffect( AudioEngine* engine, const wchar_t* waveFileName ) + : pImpl(new Impl(engine) ) +{ + WAVData wavInfo; + std::unique_ptr wavData; + HRESULT hr = LoadWAVAudioFromFileEx( waveFileName, wavData, wavInfo ); + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: SoundEffect failed (%08X) to load from .wav file \"%ls\"\n", hr, waveFileName ); + throw std::exception( "SoundEffect" ); + } + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + hr = pImpl->Initialize( engine, wavData, wavInfo.wfx, wavInfo.startAudio, wavInfo.audioBytes, + wavInfo.seek, wavInfo.seekCount, + wavInfo.loopStart, wavInfo.loopLength ); +#else + hr = pImpl->Initialize( engine, wavData, wavInfo.wfx, wavInfo.startAudio, wavInfo.audioBytes, + wavInfo.loopStart, wavInfo.loopLength ); +#endif + + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: SoundEffect failed (%08X) to intialize from .wav file \"%ls\"\n", hr, waveFileName ); + throw std::exception( "SoundEffect" ); + } +} + + +_Use_decl_annotations_ +SoundEffect::SoundEffect( AudioEngine* engine, std::unique_ptr& wavData, + const WAVEFORMATEX* wfx, const uint8_t* startAudio, size_t audioBytes ) + : pImpl(new Impl(engine) ) +{ +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + HRESULT hr = pImpl->Initialize( engine, wavData, wfx, startAudio, audioBytes, nullptr, 0, 0, 0 ); +#else + HRESULT hr = pImpl->Initialize( engine, wavData, wfx, startAudio, audioBytes, 0, 0 ); +#endif + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: SoundEffect failed (%08X) to intialize\n", hr ); + throw std::exception( "SoundEffect" ); + } +} + + +_Use_decl_annotations_ +SoundEffect::SoundEffect( AudioEngine* engine, std::unique_ptr& wavData, + const WAVEFORMATEX* wfx, const uint8_t* startAudio, size_t audioBytes, + uint32_t loopStart, uint32_t loopLength ) + : pImpl(new Impl(engine) ) +{ +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + HRESULT hr = pImpl->Initialize( engine, wavData, wfx, startAudio, audioBytes, nullptr, 0, loopStart, loopLength ); +#else + HRESULT hr = pImpl->Initialize( engine, wavData, wfx, startAudio, audioBytes, loopStart, loopLength ); +#endif + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: SoundEffect failed (%08X) to intialize\n", hr ); + throw std::exception( "SoundEffect" ); + } +} + + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + +_Use_decl_annotations_ +SoundEffect::SoundEffect( AudioEngine* engine, std::unique_ptr& wavData, + const WAVEFORMATEX* wfx, const uint8_t* startAudio, size_t audioBytes, + const uint32_t* seekTable, size_t seekCount ) +{ + HRESULT hr = pImpl->Initialize( engine, wavData, wfx, startAudio, audioBytes, seekTable, seekCount, 0, 0 ); + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: SoundEffect failed (%08X) to intialize\n", hr ); + throw std::exception( "SoundEffect" ); + } +} + +#endif + + +// Move constructor. +SoundEffect::SoundEffect(SoundEffect&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +SoundEffect& SoundEffect::operator= (SoundEffect&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +SoundEffect::~SoundEffect() +{ +} + + +// Public methods. +void SoundEffect::Play() +{ + pImpl->Play( 1.f, 0.f, 0.f ); +} + + +void SoundEffect::Play( float volume, float pitch, float pan ) +{ + pImpl->Play( volume, pitch, pan ); +} + + +std::unique_ptr SoundEffect::CreateInstance( SOUND_EFFECT_INSTANCE_FLAGS flags ) +{ + auto effect = new SoundEffectInstance( pImpl->mEngine, this, flags ); + assert( effect != 0 ); + pImpl->mInstances.emplace_back( effect ); + return std::unique_ptr( effect ); +} + + +void SoundEffect::UnregisterInstance( _In_ SoundEffectInstance* instance ) +{ + auto it = std::find( pImpl->mInstances.begin(), pImpl->mInstances.end(), instance ); + if ( it == pImpl->mInstances.end() ) + return; + + pImpl->mInstances.erase( it ); +} + + +// Public accessors. +bool SoundEffect::IsInUse() const +{ + return ( pImpl->mOneShots > 0 ) || !pImpl->mInstances.empty(); +} + + +size_t SoundEffect::GetSampleSizeInBytes() const +{ + return pImpl->mAudioBytes; +} + + +size_t SoundEffect::GetSampleDuration() const +{ + if ( !pImpl->mWaveFormat || !pImpl->mWaveFormat->nChannels ) + return 0; + + switch( GetFormatTag( pImpl->mWaveFormat ) ) + { + case WAVE_FORMAT_ADPCM: + { + auto adpcmFmt = reinterpret_cast( pImpl->mWaveFormat ); + + uint64_t duration = uint64_t( pImpl->mAudioBytes / adpcmFmt->wfx.nBlockAlign ) * adpcmFmt->wSamplesPerBlock; + int partial = pImpl->mAudioBytes % adpcmFmt->wfx.nBlockAlign; + if ( partial ) + { + if ( partial >= ( 7 * adpcmFmt->wfx.nChannels ) ) + duration += ( partial * 2 / adpcmFmt->wfx.nChannels - 12 ); + } + return static_cast( duration ); + } + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + + case WAVE_FORMAT_WMAUDIO2: + case WAVE_FORMAT_WMAUDIO3: + if ( pImpl->mSeekTable && pImpl->mSeekCount > 0 ) + { + return pImpl->mSeekTable[ pImpl->mSeekCount - 1 ] / uint32_t( 2 * pImpl->mWaveFormat->nChannels ); + } + break; + +#endif + +#if defined(_XBOX_ONE) && defined(_TITLE) + + case WAVE_FORMAT_XMA2: + return reinterpret_cast( pImpl->mWaveFormat )->SamplesEncoded; + +#endif + + default: + if ( pImpl->mWaveFormat->wBitsPerSample > 0 ) + { + return static_cast( ( uint64_t( pImpl->mAudioBytes ) * 8 ) + / uint64_t( pImpl->mWaveFormat->wBitsPerSample * pImpl->mWaveFormat->nChannels ) ); + } + } + + return 0; +} + + +size_t SoundEffect::GetSampleDurationMS() const +{ + if ( !pImpl->mWaveFormat || !pImpl->mWaveFormat->nSamplesPerSec ) + return 0; + + uint64_t samples = GetSampleDuration(); + return static_cast( ( samples * 1000 ) / pImpl->mWaveFormat->nSamplesPerSec ); +} + + +const WAVEFORMATEX* SoundEffect::GetFormat() const +{ + return pImpl->mWaveFormat; +} + + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + +bool SoundEffect::FillSubmitBuffer( _Out_ XAUDIO2_BUFFER& buffer, _Out_ XAUDIO2_BUFFER_WMA& wmaBuffer ) const +{ + memset( &buffer, 0, sizeof(buffer) ); + memset( &wmaBuffer, 0, sizeof(wmaBuffer) ); + + buffer.AudioBytes = pImpl->mAudioBytes; + buffer.pAudioData = pImpl->mStartAudio; + buffer.LoopBegin = pImpl->mLoopStart; + buffer.LoopLength = pImpl->mLoopLength; + + uint32_t tag = GetFormatTag( pImpl->mWaveFormat ); + if ( tag == WAVE_FORMAT_WMAUDIO2 || tag == WAVE_FORMAT_WMAUDIO3 ) + { + wmaBuffer.PacketCount = pImpl->mSeekCount; + wmaBuffer.pDecodedPacketCumulativeBytes = pImpl->mSeekTable; + return true; + } + + return false; +} + +#else + +void SoundEffect::FillSubmitBuffer( _Out_ XAUDIO2_BUFFER& buffer ) const +{ + memset( &buffer, 0, sizeof(buffer) ); + buffer.AudioBytes = pImpl->mAudioBytes; + buffer.pAudioData = pImpl->mStartAudio; + buffer.LoopBegin = pImpl->mLoopStart; + buffer.LoopLength = pImpl->mLoopLength; +} + +#endif diff --git a/DirectXTK/Audio/SoundEffectInstance.cpp b/DirectXTK/Audio/SoundEffectInstance.cpp new file mode 100644 index 0000000..0be5345 --- /dev/null +++ b/DirectXTK/Audio/SoundEffectInstance.cpp @@ -0,0 +1,334 @@ +//-------------------------------------------------------------------------------------- +// File: SoundEffectInstance.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "SoundCommon.h" + +using namespace DirectX; + + +//====================================================================================== +// SoundEffectInstance +//====================================================================================== + +// Internal object implementation class. +class SoundEffectInstance::Impl : public IVoiceNotify +{ +public: + Impl( _In_ AudioEngine* engine, _In_ SoundEffect* effect, SOUND_EFFECT_INSTANCE_FLAGS flags ) : + mBase(), + mEffect( effect ), + mWaveBank( nullptr ), + mIndex( 0 ), + mLooped( false ) + { + assert( engine != 0 ); + engine->RegisterNotify( this, false ); + + assert( mEffect != 0 ); + mBase.Initialize( engine, effect->GetFormat(), flags ); + } + + Impl( _In_ AudioEngine* engine, _In_ WaveBank* waveBank, uint32_t index, SOUND_EFFECT_INSTANCE_FLAGS flags ) : + mBase(), + mEffect( nullptr ), + mWaveBank( waveBank ), + mIndex( index ), + mLooped( false ) + { + assert( engine != 0 ); + engine->RegisterNotify( this, false ); + + char buff[64]; + auto wfx = reinterpret_cast( buff ); + assert( mWaveBank != 0 ); + mBase.Initialize( engine, mWaveBank->GetFormat( index, wfx, 64 ), flags ); + } + + virtual ~Impl() + { + mBase.DestroyVoice(); + + if ( mBase.engine ) + { + mBase.engine->UnregisterNotify( this, false, false ); + mBase.engine = nullptr; + } + } + + void Play( bool loop ); + + // IVoiceNotify + virtual void __cdecl OnBufferEnd() override + { + // We don't register for this notification for SoundEffectInstances, so this should not be invoked + assert( false ); + } + + virtual void __cdecl OnCriticalError() override + { + mBase.OnCriticalError(); + } + + virtual void __cdecl OnReset() override + { + mBase.OnReset(); + } + + virtual void __cdecl OnUpdate() override + { + // We do not register for update notification + assert(false); + } + + virtual void __cdecl OnDestroyEngine() override + { + mBase.OnDestroy(); + } + + virtual void __cdecl OnTrim() override + { + mBase.OnTrim(); + } + + virtual void __cdecl GatherStatistics( AudioStatistics& stats ) const override + { + mBase.GatherStatistics(stats); + } + + SoundEffectInstanceBase mBase; + SoundEffect* mEffect; + WaveBank* mWaveBank; + uint32_t mIndex; + bool mLooped; +}; + + +void SoundEffectInstance::Impl::Play( bool loop ) +{ + if ( !mBase.voice ) + { + if ( mWaveBank ) + { + char buff[64]; + auto wfx = reinterpret_cast( buff ); + mBase.AllocateVoice( mWaveBank->GetFormat( mIndex, wfx, 64) ); + } + else + { + assert( mEffect != 0 ); + mBase.AllocateVoice( mEffect->GetFormat() ); + } + } + + if ( !mBase.Play() ) + return; + + // Submit audio data for STOPPED -> PLAYING state transition + XAUDIO2_BUFFER buffer; + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + + bool iswma = false; + XAUDIO2_BUFFER_WMA wmaBuffer; + if ( mWaveBank ) + { + iswma = mWaveBank->FillSubmitBuffer( mIndex, buffer, wmaBuffer ); + } + else + { + assert( mEffect != 0 ); + iswma = mEffect->FillSubmitBuffer( buffer, wmaBuffer ); + } + +#else + + if ( mWaveBank ) + { + mWaveBank->FillSubmitBuffer( mIndex, buffer ); + } + else + { + assert( mEffect != 0 ); + mEffect->FillSubmitBuffer( buffer ); + } + +#endif + + buffer.Flags = XAUDIO2_END_OF_STREAM; + if ( loop ) + { + mLooped = true; + buffer.LoopCount = XAUDIO2_LOOP_INFINITE; + } + else + { + mLooped = false; + buffer.LoopCount = buffer.LoopBegin = buffer.LoopLength = 0; + } + buffer.pContext = nullptr; + + HRESULT hr; +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + if ( iswma ) + { + hr = mBase.voice->SubmitSourceBuffer( &buffer, &wmaBuffer ); + } + else +#endif + { + hr = mBase.voice->SubmitSourceBuffer( &buffer, nullptr ); + } + + if ( FAILED(hr) ) + { +#ifdef _DEBUG + DebugTrace( "ERROR: SoundEffectInstance failed (%08X) when submitting buffer:\n", hr ); + + char buff[64]; + auto wfx = ( mWaveBank ) ? mWaveBank->GetFormat( mIndex, reinterpret_cast( buff ), 64 ) + : mEffect->GetFormat(); + + size_t length = ( mWaveBank ) ? mWaveBank->GetSampleSizeInBytes( mIndex ) : mEffect->GetSampleSizeInBytes(); + + DebugTrace( "\tFormat Tag %u, %u channels, %u-bit, %u Hz, %Iu bytes\n", wfx->wFormatTag, + wfx->nChannels, wfx->wBitsPerSample, wfx->nSamplesPerSec, length ); +#endif + mBase.Stop( true, mLooped ); + throw std::exception( "SubmitSourceBuffer" ); + } +} + + +//-------------------------------------------------------------------------------------- +// SoundEffectInstance +//-------------------------------------------------------------------------------------- + +// Private constructors +_Use_decl_annotations_ +SoundEffectInstance::SoundEffectInstance( AudioEngine* engine, SoundEffect* effect, SOUND_EFFECT_INSTANCE_FLAGS flags ) : + pImpl( new Impl( engine, effect, flags ) ) +{ +} + +_Use_decl_annotations_ +SoundEffectInstance::SoundEffectInstance( AudioEngine* engine, WaveBank* waveBank, int index, SOUND_EFFECT_INSTANCE_FLAGS flags ) : + pImpl( new Impl( engine, waveBank, index, flags ) ) +{ +} + + +// Move constructor. +SoundEffectInstance::SoundEffectInstance(SoundEffectInstance&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +SoundEffectInstance& SoundEffectInstance::operator= (SoundEffectInstance&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +SoundEffectInstance::~SoundEffectInstance() +{ + if( pImpl ) + { + if ( pImpl->mWaveBank ) + { + pImpl->mWaveBank->UnregisterInstance( this ); + pImpl->mWaveBank = nullptr; + } + + if ( pImpl->mEffect ) + { + pImpl->mEffect->UnregisterInstance( this ); + pImpl->mEffect = nullptr; + } + } +} + + +// Public methods. +void SoundEffectInstance::Play( bool loop ) +{ + pImpl->Play( loop ); +} + + +void SoundEffectInstance::Stop( bool immediate ) +{ + pImpl->mBase.Stop( immediate, pImpl->mLooped ); +} + + +void SoundEffectInstance::Pause() +{ + pImpl->mBase.Pause(); +} + + +void SoundEffectInstance::Resume() +{ + pImpl->mBase.Resume(); +} + + +void SoundEffectInstance::SetVolume( float volume ) +{ + pImpl->mBase.SetVolume( volume ); +} + + +void SoundEffectInstance::SetPitch( float pitch ) +{ + pImpl->mBase.SetPitch( pitch ); +} + + +void SoundEffectInstance::SetPan( float pan ) +{ + pImpl->mBase.SetPan( pan ); +} + + +void SoundEffectInstance::Apply3D( const AudioListener& listener, const AudioEmitter& emitter, bool rhcoords ) +{ + pImpl->mBase.Apply3D( listener, emitter, rhcoords ); +} + + +// Public accessors. +bool SoundEffectInstance::IsLooped() const +{ + return pImpl->mLooped; +} + + +SoundState SoundEffectInstance::GetState() +{ + return pImpl->mBase.GetState( true ); +} + + +// Notifications. +void SoundEffectInstance::OnDestroyParent() +{ + pImpl->mBase.OnDestroy(); + pImpl->mWaveBank = nullptr; + pImpl->mEffect = nullptr; +} \ No newline at end of file diff --git a/DirectXTK/Audio/WAVFileReader.cpp b/DirectXTK/Audio/WAVFileReader.cpp new file mode 100644 index 0000000..b53b456 --- /dev/null +++ b/DirectXTK/Audio/WAVFileReader.cpp @@ -0,0 +1,681 @@ +//-------------------------------------------------------------------------------------- +// File: WAVFileReader.cpp +// +// Functions for loading WAV audio files +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//------------------------------------------------------------------------------------- + +#include "pch.h" +#include "PlatformHelpers.h" +#include "WAVFileReader.h" + +using namespace DirectX; + + +namespace +{ + +//-------------------------------------------------------------------------------------- +// .WAV files +//-------------------------------------------------------------------------------------- +const uint32_t FOURCC_RIFF_TAG = 'FFIR'; +const uint32_t FOURCC_FORMAT_TAG = ' tmf'; +const uint32_t FOURCC_DATA_TAG = 'atad'; +const uint32_t FOURCC_WAVE_FILE_TAG = 'EVAW'; +const uint32_t FOURCC_XWMA_FILE_TAG = 'AMWX'; +const uint32_t FOURCC_DLS_SAMPLE = 'pmsw'; +const uint32_t FOURCC_MIDI_SAMPLE = 'lpms'; +const uint32_t FOURCC_XWMA_DPDS = 'sdpd'; +const uint32_t FOURCC_XMA_SEEK = 'kees'; + +#pragma pack(push,1) +struct RIFFChunk +{ + uint32_t tag; + uint32_t size; +}; + +struct RIFFChunkHeader +{ + uint32_t tag; + uint32_t size; + uint32_t riff; +}; + +struct DLSLoop +{ + static const uint32_t LOOP_TYPE_FORWARD = 0x00000000; + static const uint32_t LOOP_TYPE_RELEASE = 0x00000001; + + uint32_t size; + uint32_t loopType; + uint32_t loopStart; + uint32_t loopLength; +}; + +struct RIFFDLSSample +{ + static const uint32_t OPTIONS_NOTRUNCATION = 0x00000001; + static const uint32_t OPTIONS_NOCOMPRESSION = 0x00000002; + + uint32_t size; + uint16_t unityNote; + int16_t fineTune; + int32_t gain; + uint32_t options; + uint32_t loopCount; +}; + +struct MIDILoop +{ + static const uint32_t LOOP_TYPE_FORWARD = 0x00000000; + static const uint32_t LOOP_TYPE_ALTERNATING = 0x00000001; + static const uint32_t LOOP_TYPE_BACKWARD = 0x00000002; + + uint32_t cuePointId; + uint32_t type; + uint32_t start; + uint32_t end; + uint32_t fraction; + uint32_t playCount; +}; + +struct RIFFMIDISample +{ + uint32_t manufacturerId; + uint32_t productId; + uint32_t samplePeriod; + uint32_t unityNode; + uint32_t pitchFraction; + uint32_t SMPTEFormat; + uint32_t SMPTEOffset; + uint32_t loopCount; + uint32_t samplerData; +}; +#pragma pack(pop) + +static_assert( sizeof(RIFFChunk) == 8, "structure size mismatch"); +static_assert( sizeof(RIFFChunkHeader) == 12, "structure size mismatch"); +static_assert( sizeof(DLSLoop) == 16, "structure size mismatch"); +static_assert( sizeof(RIFFDLSSample) == 20, "structure size mismatch"); +static_assert( sizeof(MIDILoop) == 24, "structure size mismatch"); +static_assert( sizeof(RIFFMIDISample) == 36, "structure size mismatch"); + +}; + + +//-------------------------------------------------------------------------------------- +static const RIFFChunk* FindChunk( _In_reads_bytes_(sizeBytes) const uint8_t* data, _In_ size_t sizeBytes, _In_ uint32_t tag ) +{ + if ( !data ) + return nullptr; + + const uint8_t* ptr = data; + const uint8_t* end = data + sizeBytes; + + while ( end > ( ptr + sizeof(RIFFChunk) ) ) + { + auto header = reinterpret_cast( ptr ); + if ( header->tag == tag ) + return header; + + ptrdiff_t offset = header->size + sizeof(RIFFChunk); + ptr += offset; + } + + return nullptr; +} + + +//-------------------------------------------------------------------------------------- +static HRESULT WaveFindFormatAndData( _In_reads_bytes_(wavDataSize) const uint8_t* wavData, _In_ size_t wavDataSize, + _Outptr_ const WAVEFORMATEX** pwfx, _Outptr_ const uint8_t** pdata, _Out_ uint32_t* dataSize, + _Out_ bool& dpds, _Out_ bool& seek ) +{ + if ( !wavData || !pwfx ) + return E_POINTER; + + dpds = seek = false; + + if (wavDataSize < (sizeof(RIFFChunk)*2 + sizeof(uint32_t) + sizeof(WAVEFORMAT) ) ) + { + return E_FAIL; + } + + const uint8_t* wavEnd = wavData + wavDataSize; + + // Locate RIFF 'WAVE' + auto riffChunk = FindChunk( wavData, wavDataSize, FOURCC_RIFF_TAG ); + if ( !riffChunk || riffChunk->size < 4 ) + { + return E_FAIL; + } + + auto riffHeader = reinterpret_cast( riffChunk ); + if ( riffHeader->riff != FOURCC_WAVE_FILE_TAG && riffHeader->riff != FOURCC_XWMA_FILE_TAG ) + { + return E_FAIL; + } + + // Locate 'fmt ' + auto ptr = reinterpret_cast( riffHeader ) + sizeof(RIFFChunkHeader); + if ( ( ptr + sizeof(RIFFChunk) ) > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + auto fmtChunk = FindChunk( ptr, riffHeader->size, FOURCC_FORMAT_TAG ); + if ( !fmtChunk || fmtChunk->size < sizeof(PCMWAVEFORMAT) ) + { + return E_FAIL; + } + + ptr = reinterpret_cast( fmtChunk ) + sizeof( RIFFChunk ); + if ( ptr + fmtChunk->size > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + auto wf = reinterpret_cast( ptr ); + + // Validate WAVEFORMAT (focused on chunk size and format tag, not other data that XAUDIO2 will validate) + switch( wf->wFormatTag ) + { + case WAVE_FORMAT_PCM: + case WAVE_FORMAT_IEEE_FLOAT: + // Can be a PCMWAVEFORMAT (8 bytes) or WAVEFORMATEX (10 bytes) + // We validiated chunk as at least sizeof(PCMWAVEFORMAT) above + break; + + default: + { + if ( fmtChunk->size < sizeof(WAVEFORMATEX) ) + { + return E_FAIL; + } + + auto wfx = reinterpret_cast( ptr ); + + if ( fmtChunk->size < ( sizeof(WAVEFORMATEX) + wfx->cbSize ) ) + { + return E_FAIL; + } + + switch( wfx->wFormatTag ) + { + case WAVE_FORMAT_WMAUDIO2: + case WAVE_FORMAT_WMAUDIO3: + dpds = true; + break; + + case 0x166 /*WAVE_FORMAT_XMA2*/: // XMA2 is supported by Xbox One + if ( ( fmtChunk->size < 52 /*sizeof(XMA2WAVEFORMATEX)*/ ) || ( wfx->cbSize < 34 /*( sizeof(XMA2WAVEFORMATEX) - sizeof(WAVEFORMATEX) )*/ ) ) + { + return E_FAIL; + } + seek = true; + break; + + case WAVE_FORMAT_ADPCM: + if ( ( fmtChunk->size < ( sizeof(WAVEFORMATEX) + 32 ) ) || ( wfx->cbSize < 32 /*MSADPCM_FORMAT_EXTRA_BYTES*/ ) ) + { + return E_FAIL; + } + break; + + case WAVE_FORMAT_EXTENSIBLE: + if ( ( fmtChunk->size < sizeof(WAVEFORMATEXTENSIBLE) ) || ( wfx->cbSize < ( sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX) ) ) ) + { + return E_FAIL; + } + else + { + static const GUID s_wfexBase = {0x00000000, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}; + + auto wfex = reinterpret_cast( ptr ); + + if ( memcmp( reinterpret_cast(&wfex->SubFormat) + sizeof(DWORD), + reinterpret_cast(&s_wfexBase) + sizeof(DWORD), sizeof(GUID) - sizeof(DWORD) ) != 0 ) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + switch( wfex->SubFormat.Data1 ) + { + case WAVE_FORMAT_PCM: + case WAVE_FORMAT_IEEE_FLOAT: + break; + + // MS-ADPCM and XMA2 are not supported as WAVEFORMATEXTENSIBLE + + case WAVE_FORMAT_WMAUDIO2: + case WAVE_FORMAT_WMAUDIO3: + dpds = true; + break; + + default: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + } + break; + + default: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + } + } + + // Locate 'data' + ptr = reinterpret_cast( riffHeader ) + sizeof(RIFFChunkHeader); + if ( ( ptr + sizeof(RIFFChunk) ) > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + auto dataChunk = FindChunk( ptr, riffChunk->size, FOURCC_DATA_TAG ); + if ( !dataChunk || !dataChunk->size ) + { + return HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); + } + + ptr = reinterpret_cast( dataChunk ) + sizeof( RIFFChunk ); + if ( ptr + dataChunk->size > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + *pwfx = reinterpret_cast( wf ); + *pdata = ptr; + *dataSize = dataChunk->size; + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +static HRESULT WaveFindLoopInfo( _In_reads_bytes_(wavDataSize) const uint8_t* wavData, _In_ size_t wavDataSize, + _Out_ uint32_t* pLoopStart, _Out_ uint32_t* pLoopLength ) +{ + if ( !wavData || !pLoopStart || !pLoopLength ) + return E_POINTER; + + if (wavDataSize < ( sizeof(RIFFChunk) + sizeof(uint32_t) ) ) + { + return E_FAIL; + } + + *pLoopStart = 0; + *pLoopLength = 0; + + const uint8_t* wavEnd = wavData + wavDataSize; + + // Locate RIFF 'WAVE' + auto riffChunk = FindChunk( wavData, wavDataSize, FOURCC_RIFF_TAG ); + if ( !riffChunk || riffChunk->size < 4 ) + { + return E_FAIL; + } + + auto riffHeader = reinterpret_cast( riffChunk ); + if ( riffHeader->riff == FOURCC_XWMA_FILE_TAG ) + { + // xWMA files do not contain loop information + return S_OK; + } + + if ( riffHeader->riff != FOURCC_WAVE_FILE_TAG ) + { + return E_FAIL; + } + + // Locate 'wsmp' (DLS Chunk) + auto ptr = reinterpret_cast( riffHeader ) + sizeof(RIFFChunkHeader); + if ( ( ptr + sizeof(RIFFChunk) ) > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + auto dlsChunk = FindChunk( ptr, riffChunk->size, FOURCC_DLS_SAMPLE ); + if ( dlsChunk ) + { + ptr = reinterpret_cast( dlsChunk ) + sizeof( RIFFChunk ); + if ( ptr + dlsChunk->size > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + if ( dlsChunk->size >= sizeof(RIFFDLSSample) ) + { + auto dlsSample = reinterpret_cast( ptr ); + + if ( dlsChunk->size >= ( dlsSample->size + dlsSample->loopCount * sizeof(DLSLoop) ) ) + { + auto loops = reinterpret_cast( ptr + dlsSample->size ); + for( uint32_t j = 0; j < dlsSample->loopCount; ++j ) + { + if ( ( loops[j].loopType == DLSLoop::LOOP_TYPE_FORWARD || loops[j].loopType == DLSLoop::LOOP_TYPE_RELEASE ) ) + { + // Return 'forward' loop + *pLoopStart = loops[j].loopStart; + *pLoopLength = loops[j].loopLength; + return S_OK; + } + } + } + } + } + + // Locate 'smpl' (Sample Chunk) + auto midiChunk = FindChunk( ptr, riffChunk->size, FOURCC_MIDI_SAMPLE ); + if ( midiChunk ) + { + ptr = reinterpret_cast( midiChunk ) + sizeof( RIFFChunk ); + if ( ptr + midiChunk->size > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + if ( midiChunk->size >= sizeof(RIFFMIDISample) ) + { + auto midiSample = reinterpret_cast( ptr ); + + if ( midiChunk->size >= ( sizeof(RIFFMIDISample) + midiSample->loopCount * sizeof(MIDILoop) ) ) + { + auto loops = reinterpret_cast( ptr + sizeof(RIFFMIDISample) ); + for( uint32_t j = 0; j < midiSample->loopCount; ++j ) + { + if ( loops[j].type == MIDILoop::LOOP_TYPE_FORWARD ) + { + // Return 'forward' loop + *pLoopStart = loops[j].start; + *pLoopLength = loops[j].end + loops[j].start + 1; + return S_OK; + } + } + } + } + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +static HRESULT WaveFindTable( _In_reads_bytes_(wavDataSize) const uint8_t* wavData, _In_ size_t wavDataSize, _In_ uint32_t tag, + _Outptr_result_maybenull_ const uint32_t** pData, _Out_ uint32_t* dataCount ) +{ + if ( !wavData || !pData || !dataCount ) + return E_POINTER; + + if (wavDataSize < ( sizeof(RIFFChunk) + sizeof(uint32_t) ) ) + { + return E_FAIL; + } + + *pData = nullptr; + *dataCount = 0; + + const uint8_t* wavEnd = wavData + wavDataSize; + + // Locate RIFF 'WAVE' + auto riffChunk = FindChunk( wavData, wavDataSize, FOURCC_RIFF_TAG ); + if ( !riffChunk || riffChunk->size < 4 ) + { + return E_FAIL; + } + + auto riffHeader = reinterpret_cast( riffChunk ); + if ( riffHeader->riff != FOURCC_WAVE_FILE_TAG && riffHeader->riff != FOURCC_XWMA_FILE_TAG ) + { + return E_FAIL; + } + + // Locate tag + auto ptr = reinterpret_cast( riffHeader ) + sizeof(RIFFChunkHeader); + if ( ( ptr + sizeof(RIFFChunk) ) > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + auto tableChunk = FindChunk( ptr, riffChunk->size, tag ); + if ( tableChunk ) + { + ptr = reinterpret_cast( tableChunk ) + sizeof( RIFFChunk ); + if ( ptr + tableChunk->size > wavEnd ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + if ( ( tableChunk->size % sizeof(uint32_t) ) != 0 ) + { + return E_FAIL; + } + + *pData = reinterpret_cast( ptr ); + *dataCount = tableChunk->size / 4; + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +static HRESULT LoadAudioFromFile( _In_z_ const wchar_t* szFileName, _Inout_ std::unique_ptr& wavData, _Out_ DWORD* bytesRead ) +{ + if ( !szFileName ) + return E_INVALIDARG; + + // open the file +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + ScopedHandle hFile( safe_handle( CreateFile2( szFileName, + GENERIC_READ, + FILE_SHARE_READ, + OPEN_EXISTING, + nullptr ) ) ); +#else + ScopedHandle hFile( safe_handle( CreateFileW( szFileName, + GENERIC_READ, + FILE_SHARE_READ, + nullptr, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + nullptr ) ) ); +#endif + + if ( !hFile ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + // Get the file size + FILE_STANDARD_INFO fileInfo; + if ( !GetFileInformationByHandleEx( hFile.get(), FileStandardInfo, &fileInfo, sizeof(fileInfo) ) ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + // File is too big for 32-bit allocation, so reject read + if (fileInfo.EndOfFile.HighPart > 0) + { + return E_FAIL; + } + + // Need at least enough data to have a valid minimal WAV file + if (fileInfo.EndOfFile.LowPart < ( sizeof(RIFFChunk)*2 + sizeof(DWORD) + sizeof(WAVEFORMAT) ) ) + { + return E_FAIL; + } + + // create enough space for the file data + wavData.reset( new (std::nothrow) uint8_t[ fileInfo.EndOfFile.LowPart ] ); + if (!wavData) + { + return E_OUTOFMEMORY; + } + + // read the data in + if (!ReadFile( hFile.get(), + wavData.get(), + fileInfo.EndOfFile.LowPart, + bytesRead, + nullptr + )) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + return (*bytesRead < fileInfo.EndOfFile.LowPart) ? E_FAIL : S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::LoadWAVAudioInMemory( const uint8_t* wavData, + size_t wavDataSize, + const WAVEFORMATEX** wfx, + const uint8_t** startAudio, + uint32_t* audioBytes ) +{ + if ( !wavData || !wfx || !startAudio || !audioBytes ) + return E_INVALIDARG; + + *wfx = nullptr; + *startAudio = nullptr; + *audioBytes = 0; + + // Need at least enough data to have a valid minimal WAV file + if (wavDataSize < (sizeof(RIFFChunk)*2 + sizeof(DWORD) + sizeof(WAVEFORMAT) ) ) + { + return E_FAIL; + } + + bool dpds, seek; + HRESULT hr = WaveFindFormatAndData( wavData, wavDataSize, wfx, startAudio, audioBytes, dpds, seek ); + if ( FAILED(hr) ) + return hr; + + return (dpds || seek) ? E_FAIL : S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::LoadWAVAudioFromFile( const wchar_t* szFileName, + std::unique_ptr& wavData, + const WAVEFORMATEX** wfx, + const uint8_t** startAudio, + uint32_t* audioBytes ) +{ + if ( !szFileName || !wfx || !startAudio || !audioBytes ) + return E_INVALIDARG; + + *wfx = nullptr; + *startAudio = nullptr; + *audioBytes = 0; + + DWORD bytesRead = 0; + HRESULT hr = LoadAudioFromFile( szFileName, wavData, &bytesRead ); + if ( FAILED(hr) ) + { + return hr; + } + + bool dpds, seek; + hr = WaveFindFormatAndData( wavData.get(), bytesRead, wfx, startAudio, audioBytes, dpds, seek ); + if ( FAILED(hr) ) + return hr; + + return (dpds || seek) ? E_FAIL : S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::LoadWAVAudioInMemoryEx( const uint8_t* wavData, size_t wavDataSize, DirectX::WAVData& result ) +{ + if ( !wavData ) + return E_INVALIDARG; + + memset( &result, 0, sizeof(result) ); + + // Need at least enough data to have a valid minimal WAV file + if (wavDataSize < (sizeof(RIFFChunk)*2 + sizeof(DWORD) + sizeof(WAVEFORMAT) ) ) + { + return E_FAIL; + } + + bool dpds, seek; + HRESULT hr = WaveFindFormatAndData( wavData, wavDataSize, &result.wfx, &result.startAudio, &result.audioBytes, dpds, seek ); + if ( FAILED(hr) ) + return hr; + + hr = WaveFindLoopInfo( wavData, wavDataSize, &result.loopStart, &result.loopLength ); + if ( FAILED(hr) ) + return hr; + + if ( dpds ) + { + hr = WaveFindTable( wavData, wavDataSize, FOURCC_XWMA_DPDS, &result.seek, &result.seekCount ); + if ( FAILED(hr) ) + return hr; + } + else if ( seek ) + { + hr = WaveFindTable( wavData, wavDataSize, FOURCC_XMA_SEEK, &result.seek, &result.seekCount ); + if ( FAILED(hr) ) + return hr; + } + + return S_OK; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::LoadWAVAudioFromFileEx( const wchar_t* szFileName, std::unique_ptr& wavData, DirectX::WAVData& result ) +{ + if ( !szFileName ) + return E_INVALIDARG; + + memset( &result, 0, sizeof(result) ); + + DWORD bytesRead = 0; + HRESULT hr = LoadAudioFromFile( szFileName, wavData, &bytesRead ); + if ( FAILED(hr) ) + { + return hr; + } + + bool dpds, seek; + hr = WaveFindFormatAndData( wavData.get(), bytesRead, &result.wfx, &result.startAudio, &result.audioBytes, dpds, seek ); + if ( FAILED(hr) ) + return hr; + + hr = WaveFindLoopInfo( wavData.get(), bytesRead, &result.loopStart, &result.loopLength ); + if ( FAILED(hr) ) + return hr; + + if ( dpds ) + { + hr = WaveFindTable( wavData.get(), bytesRead, FOURCC_XWMA_DPDS, &result.seek, &result.seekCount ); + if ( FAILED(hr) ) + return hr; + } + else if ( seek ) + { + hr = WaveFindTable( wavData.get(), bytesRead, FOURCC_XMA_SEEK, &result.seek, &result.seekCount ); + if ( FAILED(hr) ) + return hr; + } + + return S_OK; +} + diff --git a/DirectXTK/Audio/WAVFileReader.h b/DirectXTK/Audio/WAVFileReader.h new file mode 100644 index 0000000..ac49b5d --- /dev/null +++ b/DirectXTK/Audio/WAVFileReader.h @@ -0,0 +1,55 @@ +//-------------------------------------------------------------------------------------- +// File: WAVFileReader.h +// +// Functions for loading WAV audio files +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include +#include + + +namespace DirectX +{ + HRESULT LoadWAVAudioInMemory( _In_reads_bytes_(wavDataSize) const uint8_t* wavData, + _In_ size_t wavDataSize, + _Outptr_ const WAVEFORMATEX** wfx, + _Outptr_ const uint8_t** startAudio, + _Out_ uint32_t* audioBytes ); + + HRESULT LoadWAVAudioFromFile( _In_z_ const wchar_t* szFileName, + _Inout_ std::unique_ptr& wavData, + _Outptr_ const WAVEFORMATEX** wfx, + _Outptr_ const uint8_t** startAudio, + _Out_ uint32_t* audioBytes ); + + struct WAVData + { + const WAVEFORMATEX* wfx; + const uint8_t* startAudio; + uint32_t audioBytes; + uint32_t loopStart; + uint32_t loopLength; + const uint32_t* seek; // Note: XMA Seek data is Big-Endian + uint32_t seekCount; + }; + + HRESULT LoadWAVAudioInMemoryEx( _In_reads_bytes_(wavDataSize) const uint8_t* wavData, + _In_ size_t wavDataSize, _Out_ WAVData& result ); + + HRESULT LoadWAVAudioFromFileEx( _In_z_ const wchar_t* szFileName, + _Inout_ std::unique_ptr& wavData, + _Out_ WAVData& result ); +} \ No newline at end of file diff --git a/DirectXTK/Audio/WaveBank.cpp b/DirectXTK/Audio/WaveBank.cpp new file mode 100644 index 0000000..6b73ba5 --- /dev/null +++ b/DirectXTK/Audio/WaveBank.cpp @@ -0,0 +1,511 @@ +//-------------------------------------------------------------------------------------- +// File: WaveBank.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Audio.h" +#include "WaveBankReader.h" +#include "SoundCommon.h" +#include "PlatformHelpers.h" + +#include + +using namespace DirectX; + + +//====================================================================================== +// WaveBank +//====================================================================================== + +// Internal object implementation class. +class WaveBank::Impl : public IVoiceNotify +{ +public: + explicit Impl( _In_ AudioEngine* engine ) : + mEngine( engine ), + mOneShots( 0 ), + mPrepared( false ), + mStreaming( false ) + { + assert( mEngine != 0 ); + mEngine->RegisterNotify( this, false ); + } + + virtual ~Impl() + { + if ( !mInstances.empty() ) + { + DebugTrace( "WARNING: Destroying WaveBank \"%hs\" with %Iu outstanding SoundEffectInstances\n", mReader.BankName(), mInstances.size() ); + + for( auto it = mInstances.begin(); it != mInstances.end(); ++it ) + { + assert( *it != 0 ); + (*it)->OnDestroyParent(); + } + + mInstances.clear(); + } + + if ( mOneShots > 0 ) + { + DebugTrace( "WARNING: Destroying WaveBank \"%hs\" with %u outstanding one shot effects\n", mReader.BankName(), mOneShots ); + } + + if ( mEngine ) + { + mEngine->UnregisterNotify( this, true, false ); + mEngine = nullptr; + } + } + + HRESULT Initialize( _In_ AudioEngine* engine, _In_z_ const wchar_t* wbFileName ); + + void Play( int index, float volume, float pitch, float pan ); + + // IVoiceNotify + virtual void __cdecl OnBufferEnd() override + { + InterlockedDecrement( &mOneShots ); + } + + virtual void __cdecl OnCriticalError() override + { + mOneShots = 0; + } + + virtual void __cdecl OnReset() override + { + // No action required + } + + virtual void __cdecl OnUpdate() override + { + // We do not register for update notification + assert(false); + } + + virtual void __cdecl OnDestroyEngine() override + { + mEngine = nullptr; + mOneShots = 0; + } + + virtual void __cdecl OnTrim() override + { + // No action required + } + + virtual void __cdecl GatherStatistics( AudioStatistics& stats ) const override + { + stats.playingOneShots += mOneShots; + + if ( !mStreaming ) + { + stats.audioBytes += mReader.BankAudioSize(); + +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( mReader.HasXMA() ) + stats.xmaAudioBytes += mReader.BankAudioSize(); +#endif + } + } + + AudioEngine* mEngine; + std::list mInstances; + WaveBankReader mReader; + uint32_t mOneShots; + bool mPrepared; + bool mStreaming; +}; + + +_Use_decl_annotations_ +HRESULT WaveBank::Impl::Initialize( AudioEngine* engine, const wchar_t* wbFileName ) +{ + if ( !engine || !wbFileName ) + return E_INVALIDARG; + + HRESULT hr = mReader.Open( wbFileName ); + if ( FAILED(hr) ) + return hr; + + mStreaming = mReader.IsStreamingBank(); + + return S_OK; +} + + +void WaveBank::Impl::Play( int index, float volume, float pitch, float pan ) +{ + assert( volume >= -XAUDIO2_MAX_VOLUME_LEVEL && volume <= XAUDIO2_MAX_VOLUME_LEVEL ); + assert( pitch >= -1.f && pitch <= 1.f ); + assert( pan >= -1.f && pan <= 1.f ); + + if ( mStreaming ) + { + DebugTrace( "ERROR: One-shots can only be created from an in-memory wave bank\n"); + throw std::exception( "WaveBank::Play" ); + } + + if ( index < 0 || uint32_t(index) >= mReader.Count() ) + { + DebugTrace( "WARNING: Index %d not found in wave bank with only %u entries, one-shot not triggered\n", index, mReader.Count() ); + return; + } + + if ( !mPrepared ) + { + mReader.WaitOnPrepare(); + mPrepared = true; + } + + char wfxbuff[64]; + auto wfx = reinterpret_cast( wfxbuff ); + HRESULT hr = mReader.GetFormat( index, wfx, 64 ); + ThrowIfFailed( hr ); + + IXAudio2SourceVoice* voice = nullptr; + mEngine->AllocateVoice( wfx, SoundEffectInstance_Default, true, &voice ); + + if ( !voice ) + return; + + if ( volume != 1.f ) + { + hr = voice->SetVolume( volume ); + ThrowIfFailed( hr ); + } + + if ( pitch != 0.f ) + { + float fr = XAudio2SemitonesToFrequencyRatio( pitch * 12.f ); + + hr = voice->SetFrequencyRatio( fr ); + ThrowIfFailed( hr ); + } + + if ( pan != 0.f ) + { + float matrix[16]; + if ( ComputePan( pan, wfx->nChannels, matrix ) ) + { + hr = voice->SetOutputMatrix( nullptr, wfx->nChannels, mEngine->GetOutputChannels(), matrix ); + ThrowIfFailed( hr ); + } + } + + hr = voice->Start( 0 ); + ThrowIfFailed( hr ); + + XAUDIO2_BUFFER buffer = {}; + hr = mReader.GetWaveData( index, &buffer.pAudioData, buffer.AudioBytes ); + ThrowIfFailed( hr ); + + WaveBankReader::Metadata metadata; + hr = mReader.GetMetadata( index, metadata ); + ThrowIfFailed( hr ); + + buffer.Flags = XAUDIO2_END_OF_STREAM; + buffer.pContext = this; + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + + XAUDIO2_BUFFER_WMA wmaBuffer = {}; + + uint32_t tag; + hr = mReader.GetSeekTable( index, &wmaBuffer.pDecodedPacketCumulativeBytes, wmaBuffer.PacketCount, tag ); + ThrowIfFailed( hr ); + + if ( tag == WAVE_FORMAT_WMAUDIO2 || tag == WAVE_FORMAT_WMAUDIO3 ) + { + hr = voice->SubmitSourceBuffer( &buffer, &wmaBuffer ); + } + else +#endif + { + hr = voice->SubmitSourceBuffer( &buffer, nullptr ); + } + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: WaveBank failed (%08X) when submitting buffer:\n", hr ); + DebugTrace( "\tFormat Tag %u, %u channels, %u-bit, %u Hz, %u bytes\n", wfx->wFormatTag, + wfx->nChannels, wfx->wBitsPerSample, wfx->nSamplesPerSec, metadata.lengthBytes ); + throw std::exception( "SubmitSourceBuffer" ); + } + + InterlockedIncrement( &mOneShots ); +} + + +//-------------------------------------------------------------------------------------- +// WaveBank +//-------------------------------------------------------------------------------------- + +// Public constructors. +_Use_decl_annotations_ +WaveBank::WaveBank( AudioEngine* engine, const wchar_t* wbFileName ) + : pImpl(new Impl(engine) ) +{ + HRESULT hr = pImpl->Initialize( engine, wbFileName ); + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: WaveBank failed (%08X) to intialize from .xwb file \"%ls\"\n", hr, wbFileName ); + throw std::exception( "WaveBank" ); + } + + DebugTrace( "INFO: WaveBank \"%hs\" with %u entries loaded from .xwb file \"%ls\"\n", + pImpl->mReader.BankName(), pImpl->mReader.Count(), wbFileName ); +} + + +// Move constructor. +WaveBank::WaveBank(WaveBank&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +WaveBank& WaveBank::operator= (WaveBank&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +WaveBank::~WaveBank() +{ +} + + +// Public methods. +void WaveBank::Play( int index ) +{ + pImpl->Play( index, 1.f, 0.f, 0.f ); +} + + +void WaveBank::Play( int index, float volume, float pitch, float pan ) +{ + pImpl->Play( index, volume, pitch, pan ); +} + + +void WaveBank::Play( _In_z_ const char* name ) +{ + int index = static_cast( pImpl->mReader.Find( name ) ); + if ( index == -1 ) + { + DebugTrace( "WARNING: Name '%hs' not found in wave bank, one-shot not triggered\n", name ); + return; + } + + pImpl->Play( index, 1.f, 0.f, 0.f ); +} + + +void WaveBank::Play( _In_z_ const char* name, float volume, float pitch, float pan ) +{ + int index = static_cast( pImpl->mReader.Find( name ) ); + if ( index == -1 ) + { + DebugTrace( "WARNING: Name '%hs' not found in wave bank, one-shot not triggered\n", name ); + return; + } + + pImpl->Play( index, volume, pitch, pan ); +} + + +std::unique_ptr WaveBank::CreateInstance( int index, SOUND_EFFECT_INSTANCE_FLAGS flags ) +{ + auto& wb = pImpl->mReader; + + if ( pImpl->mStreaming ) + { + DebugTrace( "ERROR: SoundEffectInstances can only be created from an in-memory wave bank\n"); + throw std::exception( "WaveBank::CreateInstance" ); + } + + if ( index < 0 || uint32_t(index) >= wb.Count() ) + { + // We don't throw an exception here as titles often simply ignore missing assets rather than fail + return std::unique_ptr(); + } + + if ( !pImpl->mPrepared ) + { + wb.WaitOnPrepare(); + pImpl->mPrepared = true; + } + + auto effect = new SoundEffectInstance( pImpl->mEngine, this, index, flags ); + assert( effect != 0 ); + pImpl->mInstances.emplace_back( effect ); + return std::unique_ptr( effect ); +} + + +std::unique_ptr WaveBank::CreateInstance( _In_z_ const char* name, SOUND_EFFECT_INSTANCE_FLAGS flags ) +{ + int index = static_cast( pImpl->mReader.Find( name ) ); + if ( index == -1 ) + { + // We don't throw an exception here as titles often simply ignore missing assets rather than fail + return std::unique_ptr(); + } + + return CreateInstance( index, flags ); +} + + +void WaveBank::UnregisterInstance( _In_ SoundEffectInstance* instance ) +{ + auto it = std::find( pImpl->mInstances.begin(), pImpl->mInstances.end(), instance ); + if ( it == pImpl->mInstances.end() ) + return; + + pImpl->mInstances.erase( it ); +} + + +// Public accessors. +bool WaveBank::IsPrepared() const +{ + if ( pImpl->mPrepared ) + return true; + + if ( !pImpl->mReader.IsPrepared() ) + return false; + + pImpl->mPrepared = true; + return true; +} + + +bool WaveBank::IsInUse() const +{ + return ( pImpl->mOneShots > 0 ) || !pImpl->mInstances.empty(); +} + + +bool WaveBank::IsStreamingBank() const +{ + return pImpl->mReader.IsStreamingBank(); +} + + +size_t WaveBank::GetSampleSizeInBytes( int index ) const +{ + if ( index < 0 || uint32_t(index) >= pImpl->mReader.Count() ) + return 0; + + WaveBankReader::Metadata metadata; + HRESULT hr = pImpl->mReader.GetMetadata( index, metadata ); + ThrowIfFailed( hr ); + return metadata.lengthBytes; +} + + +size_t WaveBank::GetSampleDuration( int index ) const +{ + if ( index < 0 || uint32_t(index) >= pImpl->mReader.Count() ) + return 0; + + WaveBankReader::Metadata metadata; + HRESULT hr = pImpl->mReader.GetMetadata( index, metadata ); + ThrowIfFailed( hr ); + return metadata.duration; +} + + +size_t WaveBank::GetSampleDurationMS( int index ) const +{ + if ( index < 0 || uint32_t(index) >= pImpl->mReader.Count() ) + return 0; + + char buff[64]; + auto wfx = reinterpret_cast( buff ); + HRESULT hr = pImpl->mReader.GetFormat( index, wfx, 64 ); + ThrowIfFailed( hr ); + + WaveBankReader::Metadata metadata; + hr = pImpl->mReader.GetMetadata( index, metadata ); + ThrowIfFailed( hr ); + return static_cast( ( uint64_t(metadata.duration) * 1000 ) / wfx->nSamplesPerSec ); +} + + +_Use_decl_annotations_ +const WAVEFORMATEX* WaveBank::GetFormat( int index, WAVEFORMATEX* wfx, size_t maxsize ) const +{ + if ( index < 0 || uint32_t(index) >= pImpl->mReader.Count() ) + return nullptr; + + HRESULT hr = pImpl->mReader.GetFormat( index, wfx, maxsize ); + ThrowIfFailed( hr ); + return wfx; +} + + +_Use_decl_annotations_ +int WaveBank::Find( const char* name ) const +{ + return static_cast( pImpl->mReader.Find( name ) ); +} + + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + +_Use_decl_annotations_ +bool WaveBank::FillSubmitBuffer( int index, XAUDIO2_BUFFER& buffer, XAUDIO2_BUFFER_WMA& wmaBuffer ) const +{ + memset( &buffer, 0, sizeof(buffer) ); + memset( &wmaBuffer, 0, sizeof(wmaBuffer) ); + + HRESULT hr = pImpl->mReader.GetWaveData( index, &buffer.pAudioData, buffer.AudioBytes ); + ThrowIfFailed( hr ); + + WaveBankReader::Metadata metadata; + hr = pImpl->mReader.GetMetadata( index, metadata ); + ThrowIfFailed( hr ); + + buffer.LoopBegin = metadata.loopStart; + buffer.LoopLength = metadata.loopLength; + + uint32_t tag; + hr = pImpl->mReader.GetSeekTable( index, &wmaBuffer.pDecodedPacketCumulativeBytes, wmaBuffer.PacketCount, tag ); + ThrowIfFailed( hr ); + + return ( tag == WAVE_FORMAT_WMAUDIO2 || tag == WAVE_FORMAT_WMAUDIO3 ); +} + +#else + +_Use_decl_annotations_ +void WaveBank::FillSubmitBuffer( int index, XAUDIO2_BUFFER& buffer ) const +{ + memset( &buffer, 0, sizeof(buffer) ); + + HRESULT hr = pImpl->mReader.GetWaveData( index, &buffer.pAudioData, buffer.AudioBytes ); + ThrowIfFailed( hr ); + + WaveBankReader::Metadata metadata; + hr = pImpl->mReader.GetMetadata( index, metadata ); + ThrowIfFailed( hr ); + + buffer.LoopBegin = metadata.loopStart; + buffer.LoopLength = metadata.loopLength; +} + +#endif diff --git a/DirectXTK/Audio/WaveBankReader.cpp b/DirectXTK/Audio/WaveBankReader.cpp new file mode 100644 index 0000000..a8f3d9d --- /dev/null +++ b/DirectXTK/Audio/WaveBankReader.cpp @@ -0,0 +1,1376 @@ +//-------------------------------------------------------------------------------------- +// File: WaveBankReader.cpp +// +// Functions for loading audio data from Wave Banks +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//------------------------------------------------------------------------------------- + +#include "pch.h" +#include "WaveBankReader.h" +#include "Audio.h" +#include "PlatformHelpers.h" + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#endif + + +namespace +{ + +//-------------------------------------------------------------------------------------- +#pragma pack(push, 1) + +static const size_t DVD_SECTOR_SIZE = 2048; +static const size_t DVD_BLOCK_SIZE = DVD_SECTOR_SIZE * 16; + +static const size_t ALIGNMENT_MIN = 4; +static const size_t ALIGNMENT_DVD = DVD_SECTOR_SIZE; + +static const size_t MAX_DATA_SEGMENT_SIZE = 0xFFFFFFFF; +static const size_t MAX_COMPACT_DATA_SEGMENT_SIZE = 0x001FFFFF; + +struct REGION +{ + uint32_t dwOffset; // Region offset, in bytes. + uint32_t dwLength; // Region length, in bytes. + + void BigEndian() + { + dwOffset = _byteswap_ulong( dwOffset ); + dwLength = _byteswap_ulong( dwLength ); + } +}; + +struct SAMPLEREGION +{ + uint32_t dwStartSample; // Start sample for the region. + uint32_t dwTotalSamples; // Region length in samples. + + void BigEndian() + { + dwStartSample = _byteswap_ulong( dwStartSample ); + dwTotalSamples = _byteswap_ulong( dwTotalSamples ); + } +}; + +struct HEADER +{ + static const uint32_t SIGNATURE = 'DNBW'; + static const uint32_t BE_SIGNATURE = 'WBND'; + static const uint32_t VERSION = 44; + + enum SEGIDX + { + SEGIDX_BANKDATA = 0, // Bank data + SEGIDX_ENTRYMETADATA, // Entry meta-data + SEGIDX_SEEKTABLES, // Storage for seek tables for the encoded waves. + SEGIDX_ENTRYNAMES, // Entry friendly names + SEGIDX_ENTRYWAVEDATA, // Entry wave data + SEGIDX_COUNT + }; + + uint32_t dwSignature; // File signature + uint32_t dwVersion; // Version of the tool that created the file + uint32_t dwHeaderVersion; // Version of the file format + REGION Segments[SEGIDX_COUNT]; // Segment lookup table + + void BigEndian() + { + // Leave dwSignature alone as indicator of BE vs. LE + + dwVersion = _byteswap_ulong( dwVersion ); + dwHeaderVersion =_byteswap_ulong( dwHeaderVersion ); + for( size_t j = 0; j < SEGIDX_COUNT; ++j ) + { + Segments[j].BigEndian(); + } + } +}; + +#pragma warning( disable : 4201 4203 ) + +union MINIWAVEFORMAT +{ + static const uint32_t TAG_PCM = 0x0; + static const uint32_t TAG_XMA = 0x1; + static const uint32_t TAG_ADPCM = 0x2; + static const uint32_t TAG_WMA = 0x3; + + static const uint32_t BITDEPTH_8 = 0x0; // PCM only + static const uint32_t BITDEPTH_16 = 0x1; // PCM only + + static const size_t ADPCM_BLOCKALIGN_CONVERSION_OFFSET = 22; + + struct + { + uint32_t wFormatTag : 2; // Format tag + uint32_t nChannels : 3; // Channel count (1 - 6) + uint32_t nSamplesPerSec : 18; // Sampling rate + uint32_t wBlockAlign : 8; // Block alignment. For WMA, lower 6 bits block alignment index, upper 2 bits bytes-per-second index. + uint32_t wBitsPerSample : 1; // Bits per sample (8 vs. 16, PCM only); WMAudio2/WMAudio3 (for WMA) + }; + + uint32_t dwValue; + + void BigEndian() + { + dwValue = _byteswap_ulong( dwValue ); + } + + WORD BitsPerSample() const + { + if (wFormatTag == TAG_XMA) + return 16; // XMA_OUTPUT_SAMPLE_BITS == 16 + if (wFormatTag == TAG_WMA) + return 16; + if (wFormatTag == TAG_ADPCM) + return 4; // MSADPCM_BITS_PER_SAMPLE == 4 + + // wFormatTag must be TAG_PCM (2 bits can only represent 4 different values) + return (wBitsPerSample == BITDEPTH_16) ? 16 : 8; + } + + DWORD BlockAlign() const + { + switch (wFormatTag) + { + case TAG_PCM: + return wBlockAlign; + + case TAG_XMA: + return (nChannels * 16 / 8); // XMA_OUTPUT_SAMPLE_BITS = 16 + + case TAG_ADPCM: + return (wBlockAlign + ADPCM_BLOCKALIGN_CONVERSION_OFFSET) * nChannels; + + case TAG_WMA: + { + static const uint32_t aWMABlockAlign[] = + { + 929, + 1487, + 1280, + 2230, + 8917, + 8192, + 4459, + 5945, + 2304, + 1536, + 1485, + 1008, + 2731, + 4096, + 6827, + 5462, + 1280 + }; + + uint32_t dwBlockAlignIndex = wBlockAlign & 0x1F; + if ( dwBlockAlignIndex < _countof(aWMABlockAlign) ) + return aWMABlockAlign[dwBlockAlignIndex]; + } + break; + } + + return 0; + } + + DWORD AvgBytesPerSec() const + { + switch (wFormatTag) + { + case TAG_PCM: + return nSamplesPerSec * wBlockAlign; + + case TAG_XMA: + return nSamplesPerSec * BlockAlign(); + + case TAG_ADPCM: + { + uint32_t blockAlign = BlockAlign(); + uint32_t samplesPerAdpcmBlock = AdpcmSamplesPerBlock(); + return blockAlign * nSamplesPerSec / samplesPerAdpcmBlock; + } + break; + + case TAG_WMA: + { + static const uint32_t aWMAAvgBytesPerSec[] = + { + 12000, + 24000, + 4000, + 6000, + 8000, + 20000, + 2500 + }; + // bitrate = entry * 8 + + uint32_t dwBytesPerSecIndex = wBlockAlign >> 5; + if ( dwBytesPerSecIndex < _countof(aWMAAvgBytesPerSec) ) + return aWMAAvgBytesPerSec[dwBytesPerSecIndex]; + } + break; + } + + return 0; + } + + DWORD AdpcmSamplesPerBlock() const + { + uint32_t nBlockAlign = (wBlockAlign + ADPCM_BLOCKALIGN_CONVERSION_OFFSET) * nChannels; + return nBlockAlign * 2 / (uint32_t)nChannels - 12; + } + + void AdpcmFillCoefficientTable(ADPCMWAVEFORMAT *fmt) const + { + // These are fixed since we are always using MS ADPCM + fmt->wNumCoef = 7 /* MSADPCM_NUM_COEFFICIENTS */; + + static ADPCMCOEFSET aCoef[7] = { { 256, 0}, {512, -256}, {0,0}, {192,64}, {240,0}, {460, -208}, {392,-232} }; + memcpy( &fmt->aCoef, aCoef, sizeof(aCoef) ); + } +}; + +struct BANKDATA +{ + static const size_t BANKNAME_LENGTH = 64; + + static const uint32_t TYPE_BUFFER = 0x00000000; + static const uint32_t TYPE_STREAMING = 0x00000001; + static const uint32_t TYPE_MASK = 0x00000001; + + static const uint32_t FLAGS_ENTRYNAMES = 0x00010000; + static const uint32_t FLAGS_COMPACT = 0x00020000; + static const uint32_t FLAGS_SYNC_DISABLED = 0x00040000; + static const uint32_t FLAGS_SEEKTABLES = 0x00080000; + static const uint32_t FLAGS_MASK = 0x000F0000; + + uint32_t dwFlags; // Bank flags + uint32_t dwEntryCount; // Number of entries in the bank + char szBankName[BANKNAME_LENGTH]; // Bank friendly name + uint32_t dwEntryMetaDataElementSize; // Size of each entry meta-data element, in bytes + uint32_t dwEntryNameElementSize; // Size of each entry name element, in bytes + uint32_t dwAlignment; // Entry alignment, in bytes + MINIWAVEFORMAT CompactFormat; // Format data for compact bank + FILETIME BuildTime; // Build timestamp + + void BigEndian() + { + dwFlags = _byteswap_ulong( dwFlags ); + dwEntryCount = _byteswap_ulong( dwEntryCount ); + dwEntryMetaDataElementSize = _byteswap_ulong( dwEntryMetaDataElementSize ); + dwEntryNameElementSize = _byteswap_ulong( dwEntryNameElementSize ); + dwAlignment = _byteswap_ulong( dwAlignment ); + CompactFormat.BigEndian(); + BuildTime.dwLowDateTime = _byteswap_ulong( BuildTime.dwLowDateTime ); + BuildTime.dwHighDateTime = _byteswap_ulong( BuildTime.dwHighDateTime ); + } +}; + +struct ENTRY +{ + static const uint32_t FLAGS_READAHEAD = 0x00000001; // Enable stream read-ahead + static const uint32_t FLAGS_LOOPCACHE = 0x00000002; // One or more looping sounds use this wave + static const uint32_t FLAGS_REMOVELOOPTAIL = 0x00000004;// Remove data after the end of the loop region + static const uint32_t FLAGS_IGNORELOOP = 0x00000008; // Used internally when the loop region can't be used + static const uint32_t FLAGS_MASK = 0x00000008; + + union + { + struct + { + // Entry flags + uint32_t dwFlags : 4; + + // Duration of the wave, in units of one sample. + // For instance, a ten second long wave sampled + // at 48KHz would have a duration of 480,000. + // This value is not affected by the number of + // channels, the number of bits per sample, or the + // compression format of the wave. + uint32_t Duration : 28; + }; + uint32_t dwFlagsAndDuration; + }; + + MINIWAVEFORMAT Format; // Entry format. + REGION PlayRegion; // Region within the wave data segment that contains this entry. + SAMPLEREGION LoopRegion; // Region within the wave data (in samples) that should loop. + + void BigEndian() + { + dwFlagsAndDuration = _byteswap_ulong( dwFlagsAndDuration ); + Format.BigEndian(); + PlayRegion.BigEndian(); + LoopRegion.BigEndian(); + } +}; + +struct ENTRYCOMPACT +{ + uint32_t dwOffset : 21; // Data offset, in multiplies of the bank alignment + uint32_t dwLengthDeviation : 11; // Data length deviation, in bytes + + void BigEndian() + { + *reinterpret_cast( this ) = _byteswap_ulong( *reinterpret_cast( this ) ); + } + + void ComputeLocations( DWORD& offset, DWORD& length, uint32_t index, const HEADER& header, const BANKDATA& data, const ENTRYCOMPACT* entries ) const + { + offset = dwOffset * data.dwAlignment; + + if ( index < ( data.dwEntryCount - 1 ) ) + { + length = ( entries[index + 1].dwOffset * data.dwAlignment ) - offset - dwLengthDeviation; + } + else + { + length = header.Segments[HEADER::SEGIDX_ENTRYWAVEDATA].dwLength - offset - dwLengthDeviation; + } + } + + static uint32_t GetDuration( DWORD length, const BANKDATA& data, const uint32_t* seekTable ) + { + switch( data.CompactFormat.wFormatTag ) + { + case MINIWAVEFORMAT::TAG_ADPCM: + { + uint32_t duration = ( length / data.CompactFormat.BlockAlign() ) * data.CompactFormat.AdpcmSamplesPerBlock(); + uint32_t partial = length % data.CompactFormat.BlockAlign(); + if ( partial ) + { + if ( partial >= ( 7 * data.CompactFormat.nChannels ) ) + duration += ( partial * 2 / data.CompactFormat.nChannels - 12 ); + } + return duration; + } + + case MINIWAVEFORMAT::TAG_WMA: + if ( seekTable ) + { + uint32_t seekCount = *seekTable; + if ( seekCount > 0 ) + { + return seekTable[ seekCount ] / uint32_t( 2 * data.CompactFormat.nChannels ); + } + } + return 0; + + case MINIWAVEFORMAT::TAG_XMA: + if ( seekTable ) + { + uint32_t seekCount = *seekTable; + if ( seekCount > 0 ) + { + return seekTable[ seekCount ]; + } + } + return 0; + + default: + return uint32_t( ( uint64_t( length ) * 8 ) + / uint64_t( data.CompactFormat.BitsPerSample() * data.CompactFormat.nChannels ) ); + } + } +}; + +#pragma pack(pop) + +inline const uint32_t* FindSeekTable( uint32_t index, const uint8_t* seekTable, const HEADER& header, const BANKDATA& data ) +{ + if ( !seekTable || index >= data.dwEntryCount ) + return nullptr; + + uint32_t seekSize = header.Segments[HEADER::SEGIDX_SEEKTABLES].dwLength; + + if ( ( index * sizeof(uint32_t) ) > seekSize ) + return nullptr; + + auto table = reinterpret_cast( seekTable ); + uint32_t offset = table[ index ]; + if ( offset == uint32_t(-1) ) + return nullptr; + + offset += sizeof(uint32_t) * data.dwEntryCount; + + if ( offset > seekSize ) + return nullptr; + + return reinterpret_cast( seekTable + offset ); +} + +}; + +static_assert( sizeof(REGION)==8, "Mismatch with xact3wb.h" ); +static_assert( sizeof(SAMPLEREGION)==8, "Mismatch with xact3wb.h" ); +static_assert( sizeof(HEADER)==52, "Mismatch with xact3wb.h" ); +static_assert( sizeof(ENTRY)==24, "Mismatch with xact3wb.h" ); +static_assert( sizeof(MINIWAVEFORMAT)==4, "Mismatch with xact3wb.h" ); +static_assert( sizeof(ENTRY)==24, "Mismatch with xact3wb.h" ); +static_assert( sizeof(ENTRYCOMPACT)==4, "Mismatch with xact3wb.h" ); +static_assert( sizeof(BANKDATA)==96, "Mismatch with xact3wb.h" ); + +using namespace DirectX; + +//-------------------------------------------------------------------------------------- +class WaveBankReader::Impl +{ +public: + Impl() : + m_async( INVALID_HANDLE_VALUE ), + m_prepared(false) +#if defined(_XBOX_ONE) && defined(_TITLE) + , m_xmaMemory(nullptr) +#endif + { + memset( &m_header, 0, sizeof(HEADER) ); + memset( &m_data, 0, sizeof(BANKDATA) ); + memset( &m_request, 0, sizeof(OVERLAPPED) ); + } + + ~Impl() { Close(); } + + HRESULT Open( _In_z_ const wchar_t* szFileName ); + void Close(); + + HRESULT GetFormat( _In_ uint32_t index, _Out_writes_bytes_(maxsize) WAVEFORMATEX* pFormat, _In_ size_t maxsize ) const; + + HRESULT GetWaveData( _In_ uint32_t index, _Outptr_ const uint8_t** pData, _Out_ uint32_t& dataSize ) const; + + HRESULT GetSeekTable( _In_ uint32_t index, _Out_ const uint32_t** pData, _Out_ uint32_t& dataCount, _Out_ uint32_t& tag ) const; + + HRESULT GetMetadata( _In_ uint32_t index, _Out_ Metadata& metadata ) const; + + bool UpdatePrepared(); + + void Clear() + { + memset( &m_header, 0, sizeof(HEADER) ); + memset( &m_data, 0, sizeof(BANKDATA ) ); + + m_names.clear(); + m_entries.reset(); + m_seekData.reset(); + m_waveData.reset(); + +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( m_xmaMemory ) + { + ApuFree( m_xmaMemory ); + m_xmaMemory = nullptr; + } +#endif + } + + HANDLE m_async; + ScopedHandle m_event; + OVERLAPPED m_request; + bool m_prepared; + + HEADER m_header; + BANKDATA m_data; + std::map m_names; + +private: + std::unique_ptr m_entries; + std::unique_ptr m_seekData; + std::unique_ptr m_waveData; + +#if defined(_XBOX_ONE) && defined(_TITLE) +public: + void* m_xmaMemory; +#endif +}; + + +_Use_decl_annotations_ +HRESULT WaveBankReader::Impl::Open( const wchar_t* szFileName ) +{ + Close(); + Clear(); + + m_prepared = false; + + m_event.reset( CreateEventEx( nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_MODIFY_STATE | SYNCHRONIZE ) ); + if ( !m_event ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + CREATEFILE2_EXTENDED_PARAMETERS params = { sizeof(CREATEFILE2_EXTENDED_PARAMETERS), 0 }; + params.dwFileAttributes = FILE_ATTRIBUTE_NORMAL; + params.dwFileFlags = FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN; + ScopedHandle hFile( safe_handle( CreateFile2( szFileName, + GENERIC_READ, + FILE_SHARE_READ, + OPEN_EXISTING, + ¶ms ) ) ); +#else + ScopedHandle hFile( safe_handle( CreateFileW( szFileName, + GENERIC_READ, + FILE_SHARE_READ, + nullptr, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN, + nullptr ) ) ); +#endif + + if ( !hFile ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + // Read and verify header + OVERLAPPED request = {}; + request.hEvent = m_event.get(); + + bool wait = false; + if( !ReadFile( hFile.get(), &m_header, sizeof( m_header ), nullptr, &request ) ) + { + DWORD error = GetLastError(); + if ( error != ERROR_IO_PENDING ) + return HRESULT_FROM_WIN32( error ); + wait = true; + } + + DWORD bytes; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + BOOL result = GetOverlappedResultEx( hFile.get(), &request, &bytes, INFINITE, FALSE ); +#else + if ( wait ) + (void)WaitForSingleObject( m_event.get(), INFINITE ); + + BOOL result = GetOverlappedResult( hFile.get(), &request, &bytes, FALSE ); +#endif + + if ( !result || ( bytes != sizeof( m_header ) ) ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + if ( m_header.dwSignature != HEADER::SIGNATURE && m_header.dwSignature != HEADER::BE_SIGNATURE ) + { + return E_FAIL; + } + + bool be = ( m_header.dwSignature == HEADER::BE_SIGNATURE ); + if ( be ) + { + DebugTrace( "INFO: \"%ls\" is a big-endian (Xbox 360) wave bank\n", szFileName ); + m_header.BigEndian(); + } + + if ( m_header.dwHeaderVersion != HEADER::VERSION ) + { + return E_FAIL; + } + + // Load bank data + memset( &request, 0, sizeof(request) ); + request.Offset = m_header.Segments[HEADER::SEGIDX_BANKDATA].dwOffset; + request.hEvent = m_event.get(); + + wait = false; + if( !ReadFile( hFile.get(), &m_data, sizeof( m_data ), nullptr, &request ) ) + { + DWORD error = GetLastError(); + if ( error != ERROR_IO_PENDING ) + return HRESULT_FROM_WIN32( error ); + wait = true; + } + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + result = GetOverlappedResultEx( hFile.get(), &request, &bytes, INFINITE, FALSE ); +#else + if ( wait ) + (void)WaitForSingleObject( m_event.get(), INFINITE ); + + result = GetOverlappedResult( hFile.get(), &request, &bytes, FALSE ); +#endif + + if ( !result || ( bytes != sizeof( m_data ) ) ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + if ( be ) + m_data.BigEndian(); + + if ( !m_data.dwEntryCount ) + { + return HRESULT_FROM_WIN32( ERROR_NO_DATA ); + } + + if ( m_data.dwFlags & BANKDATA::TYPE_STREAMING ) + { + if ( m_data.dwAlignment < ALIGNMENT_DVD ) + return E_FAIL; + if ( m_data.dwAlignment % DVD_SECTOR_SIZE ) + return E_FAIL; + } + else if ( m_data.dwAlignment < ALIGNMENT_MIN ) + { + return E_FAIL; + } + + if ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) + { + if ( m_data.dwEntryMetaDataElementSize != sizeof(ENTRYCOMPACT) ) + { + return E_FAIL; + } + + if ( m_header.Segments[HEADER::SEGIDX_ENTRYWAVEDATA].dwLength > ( MAX_COMPACT_DATA_SEGMENT_SIZE * m_data.dwAlignment ) ) + { + // Data segment is too large to be valid compact wavebank + return E_FAIL; + } + } + else + { + if ( m_data.dwEntryMetaDataElementSize != sizeof(ENTRY) ) + { + return E_FAIL; + } + } + + DWORD metadataBytes = m_header.Segments[HEADER::SEGIDX_ENTRYMETADATA].dwLength; + if ( metadataBytes != ( m_data.dwEntryCount * m_data.dwEntryMetaDataElementSize ) ) + { + return E_FAIL; + } + + // Load names + DWORD namesBytes = m_header.Segments[HEADER::SEGIDX_ENTRYNAMES].dwLength; + if ( namesBytes > 0 ) + { + if ( namesBytes >= ( m_data.dwEntryNameElementSize * m_data.dwEntryCount ) ) + { + std::unique_ptr temp( new (std::nothrow) char[ namesBytes ] ); + if ( !temp ) + return E_OUTOFMEMORY; + + memset( &request, 0, sizeof(request) ); + request.Offset = m_header.Segments[HEADER::SEGIDX_ENTRYNAMES].dwOffset; + request.hEvent = m_event.get(); + + wait = false; + if ( !ReadFile( hFile.get(), temp.get(), namesBytes, nullptr, &request ) ) + { + DWORD error = GetLastError(); + if ( error != ERROR_IO_PENDING ) + return HRESULT_FROM_WIN32( error ); + wait = true; + } + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + result = GetOverlappedResultEx( hFile.get(), &request, &bytes, INFINITE, FALSE ); +#else + if ( wait ) + (void)WaitForSingleObject( m_event.get(), INFINITE ); + + result = GetOverlappedResult( hFile.get(), &request, &bytes, FALSE ); +#endif + + if ( !result || ( namesBytes != bytes ) ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + for( uint32_t j = 0; j < m_data.dwEntryCount; ++j ) + { + DWORD n = m_data.dwEntryNameElementSize * j; + + char name[ 64 ] = {}; + strncpy_s( name, &temp[ n ], 64 ); + + m_names[ name ] = j; + } + } + } + + // Load entries + if ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) + { + m_entries.reset( reinterpret_cast( new (std::nothrow) ENTRYCOMPACT[ m_data.dwEntryCount ] ) ); + } + else + { + m_entries.reset( reinterpret_cast( new (std::nothrow) ENTRY[ m_data.dwEntryCount ] ) ); + } + if ( !m_entries ) + return E_OUTOFMEMORY; + + memset( &request, 0, sizeof(request) ); + request.Offset = m_header.Segments[HEADER::SEGIDX_ENTRYMETADATA].dwOffset; + request.hEvent = m_event.get(); + + wait = false; + if ( !ReadFile( hFile.get(), m_entries.get(), metadataBytes, nullptr, &request ) ) + { + DWORD error = GetLastError(); + if ( error != ERROR_IO_PENDING ) + return HRESULT_FROM_WIN32( error ); + wait = true; + } + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + result = GetOverlappedResultEx( hFile.get(), &request, &bytes, INFINITE, FALSE ); +#else + if ( wait ) + (void)WaitForSingleObject( m_event.get(), INFINITE ); + + result = GetOverlappedResult( hFile.get(), &request, &bytes, FALSE ); +#endif + + if ( !result || ( metadataBytes != bytes ) ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + if ( be ) + { + if ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) + { + auto ptr = reinterpret_cast( m_entries.get() ); + for( size_t j = 0; j < m_data.dwEntryCount; ++j, ++ptr ) + ptr->BigEndian(); + } + else + { + auto ptr = reinterpret_cast( m_entries.get() ); + for( size_t j = 0; j < m_data.dwEntryCount; ++j, ++ptr ) + ptr->BigEndian(); + } + } + + // Load seek tables (XMA2 / xWMA) + DWORD seekLen = m_header.Segments[HEADER::SEGIDX_SEEKTABLES].dwLength; + if ( seekLen > 0 ) + { + m_seekData.reset( new (std::nothrow) uint8_t[ seekLen ] ); + if ( !m_seekData ) + return E_OUTOFMEMORY; + + memset( &request, 0, sizeof(OVERLAPPED) ); + request.Offset = m_header.Segments[HEADER::SEGIDX_SEEKTABLES].dwOffset; + request.hEvent = m_event.get(); + + wait = false; + if ( !ReadFile( hFile.get(), m_seekData.get(), seekLen, nullptr, &request ) ) + { + DWORD error = GetLastError(); + if ( error != ERROR_IO_PENDING ) + return HRESULT_FROM_WIN32( error ); + wait = true; + } + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + result = GetOverlappedResultEx( hFile.get(), &request, &bytes, INFINITE, FALSE ); +#else + if ( wait ) + (void)WaitForSingleObject( m_event.get(), INFINITE ); + + result = GetOverlappedResult( hFile.get(), &request, &bytes, FALSE ); +#endif + + if ( !result || ( seekLen != bytes ) ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + if ( be ) + { + auto ptr = reinterpret_cast( m_seekData.get() ); + for( size_t j = 0; j < seekLen; j += 4, ++ptr ) + { + *ptr = _byteswap_ulong( *ptr ); + } + } + } + + DWORD waveLen = m_header.Segments[HEADER::SEGIDX_ENTRYWAVEDATA].dwLength; + if ( !waveLen ) + { + return HRESULT_FROM_WIN32( ERROR_NO_DATA ); + } + + if ( m_data.dwFlags & BANKDATA::TYPE_STREAMING ) + { + // If streaming, reopen without buffering + hFile.reset(); + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + CREATEFILE2_EXTENDED_PARAMETERS params2 = { sizeof(CREATEFILE2_EXTENDED_PARAMETERS), 0 }; + params2.dwFileAttributes = FILE_ATTRIBUTE_NORMAL; + params2.dwFileFlags = FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING; + m_async = CreateFile2( szFileName, + GENERIC_READ, + FILE_SHARE_READ, + OPEN_EXISTING, + ¶ms2 ); +#else + m_async = CreateFileW( szFileName, + GENERIC_READ, + FILE_SHARE_READ, + nullptr, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, + nullptr ); +#endif + + if ( m_async == INVALID_HANDLE_VALUE ) + { + return HRESULT_FROM_WIN32( GetLastError() ); + } + + m_prepared = true; + } + else + { + // If in-memory, kick off read of wave data + void *dest; + +#if defined(_XBOX_ONE) && defined(_TITLE) + bool xma = false; + if ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) + { + if ( m_data.CompactFormat.wFormatTag == MINIWAVEFORMAT::TAG_XMA ) + xma = true; + } + else + { + for( uint32_t j = 0; j < m_data.dwEntryCount; ++j ) + { + auto& entry = reinterpret_cast( m_entries.get() )[ j ]; + if ( entry.Format.wFormatTag == MINIWAVEFORMAT::TAG_XMA ) + { + xma = true; + break; + } + } + } + + if ( xma ) + { + HRESULT hr = ApuAlloc( &m_xmaMemory, nullptr, waveLen, SHAPE_XMA_INPUT_BUFFER_ALIGNMENT ); + if ( FAILED(hr) ) + { + DebugTrace( "ERROR: ApuAlloc failed. Did you allocate a large enough heap with ApuCreateHeap for all your XMA wave data?\n" ); + return hr; + } + + dest = m_xmaMemory; + } + else +#endif // _XBOX_ONE && _TITLE + { + m_waveData.reset( new (std::nothrow) uint8_t[ waveLen ] ); + if ( !m_waveData ) + return E_OUTOFMEMORY; + + dest = m_waveData.get(); + } + + memset( &m_request, 0, sizeof(OVERLAPPED) ); + m_request.Offset = m_header.Segments[HEADER::SEGIDX_ENTRYWAVEDATA].dwOffset; + m_request.hEvent = m_event.get(); + + if ( !ReadFile( hFile.get(), dest, waveLen, nullptr, &m_request ) ) + { + DWORD error = GetLastError(); + if ( error != ERROR_IO_PENDING ) + return HRESULT_FROM_WIN32( error ); + } + else + { + m_prepared = true; + memset( &m_request, 0, sizeof(OVERLAPPED) ); + } + + m_async = hFile.release(); + } + + return S_OK; +} + + +void WaveBankReader::Impl::Close() +{ + if ( m_async != INVALID_HANDLE_VALUE ) + { + if ( m_request.hEvent != 0 ) + { + DWORD bytes; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + (void)GetOverlappedResultEx( m_async, &m_request, &bytes, INFINITE, FALSE ); +#else + (void)WaitForSingleObject( m_request.hEvent, INFINITE ); + + (void)GetOverlappedResult( m_async, &m_request, &bytes, FALSE ); +#endif + } + + CloseHandle( m_async ); + m_async = INVALID_HANDLE_VALUE; + } + m_event.reset(); + +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( m_xmaMemory ) + { + ApuFree( m_xmaMemory ); + m_xmaMemory = nullptr; + } +#endif +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::Impl::GetFormat( uint32_t index, WAVEFORMATEX* pFormat, size_t maxsize ) const +{ + if ( !pFormat || !maxsize ) + return E_INVALIDARG; + + if ( index >= m_data.dwEntryCount || !m_entries ) + { + return E_FAIL; + } + + auto& miniFmt = ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) ? m_data.CompactFormat : ( reinterpret_cast( m_entries.get() )[ index ].Format ); + + switch( miniFmt.wFormatTag ) + { + case MINIWAVEFORMAT::TAG_PCM: + if ( maxsize < sizeof(PCMWAVEFORMAT) ) + return HRESULT_FROM_WIN32( ERROR_MORE_DATA ); + + pFormat->wFormatTag = WAVE_FORMAT_PCM; + + if ( maxsize >= sizeof(WAVEFORMATEX) ) + { + pFormat->cbSize = 0; + } + break; + + case MINIWAVEFORMAT::TAG_ADPCM: + if ( maxsize < ( sizeof(WAVEFORMATEX) + 32 /*MSADPCM_FORMAT_EXTRA_BYTES*/ ) ) + return HRESULT_FROM_WIN32( ERROR_MORE_DATA ); + + pFormat->wFormatTag = WAVE_FORMAT_ADPCM; + pFormat->cbSize = 32 /*MSADPCM_FORMAT_EXTRA_BYTES*/; + { + auto adpcmFmt = reinterpret_cast(pFormat); + adpcmFmt->wSamplesPerBlock = (WORD) miniFmt.AdpcmSamplesPerBlock(); + miniFmt.AdpcmFillCoefficientTable( adpcmFmt ); + } + break; + + case MINIWAVEFORMAT::TAG_WMA: + if ( maxsize < sizeof(WAVEFORMATEX) ) + return HRESULT_FROM_WIN32( ERROR_MORE_DATA ); + + pFormat->wFormatTag = (miniFmt.wBitsPerSample & 0x1) ? WAVE_FORMAT_WMAUDIO3 : WAVE_FORMAT_WMAUDIO2; + pFormat->cbSize = 0; + break; + + case MINIWAVEFORMAT::TAG_XMA: // XMA2 is supported by Xbox One +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( maxsize < sizeof(XMA2WAVEFORMATEX) ) + return HRESULT_FROM_WIN32( ERROR_MORE_DATA ); + + pFormat->wFormatTag = WAVE_FORMAT_XMA2; + pFormat->cbSize = sizeof(XMA2WAVEFORMATEX) - sizeof(WAVEFORMATEX); + { + auto xmaFmt = reinterpret_cast(pFormat); + + xmaFmt->NumStreams = static_cast( (miniFmt.nChannels + 1) / 2 ); + xmaFmt->BytesPerBlock = 65536 /* XACT_FIXED_XMA_BLOCK_SIZE */; + xmaFmt->EncoderVersion = 4 /* XMAENCODER_VERSION_XMA2 */; + + auto seekTable = FindSeekTable( index, m_seekData.get(), m_header, m_data ); + if ( seekTable ) + { + xmaFmt->BlockCount = static_cast( *seekTable ); + } + else + { + xmaFmt->BlockCount = 0; + } + + switch( miniFmt.nChannels ) + { + case 1: xmaFmt->ChannelMask = SPEAKER_MONO; break; + case 2: xmaFmt->ChannelMask = SPEAKER_STEREO; break; + case 3: xmaFmt->ChannelMask = SPEAKER_2POINT1; break; + case 4: xmaFmt->ChannelMask = SPEAKER_QUAD; break; + case 5: xmaFmt->ChannelMask = SPEAKER_4POINT1; break; + case 6: xmaFmt->ChannelMask = SPEAKER_5POINT1; break; + case 7: xmaFmt->ChannelMask = SPEAKER_5POINT1 | SPEAKER_BACK_CENTER; break; + case 8: xmaFmt->ChannelMask = SPEAKER_7POINT1; break; + default: xmaFmt->ChannelMask = DWORD(-1); break; + } + + if ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) + { + auto& entry = reinterpret_cast( m_entries.get() )[ index ]; + + DWORD dwOffset, dwLength; + entry.ComputeLocations( dwOffset, dwLength, index, m_header, m_data, reinterpret_cast( m_entries.get() ) ); + + xmaFmt->SamplesEncoded = entry.GetDuration( dwLength, m_data, seekTable ); + + xmaFmt->PlayBegin = xmaFmt->PlayLength = + xmaFmt->LoopBegin = xmaFmt->LoopLength = xmaFmt->LoopCount = 0; + } + else + { + auto& entry = reinterpret_cast( m_entries.get() )[ index ]; + + xmaFmt->SamplesEncoded = entry.Duration; + xmaFmt->PlayBegin = 0; + xmaFmt->PlayLength = entry.PlayRegion.dwLength; + + if ( entry.LoopRegion.dwTotalSamples > 0 ) + { + xmaFmt->LoopBegin = entry.LoopRegion.dwStartSample; + xmaFmt->LoopLength = entry.LoopRegion.dwTotalSamples; + xmaFmt->LoopCount = 0xff /* XACTLOOPCOUNT_INFINITE */; + } + else + { + xmaFmt->LoopBegin = xmaFmt->LoopLength = xmaFmt->LoopCount = 0; + } + } + } + break; +#else + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); +#endif + + default: + return E_FAIL; + } + + pFormat->nChannels = miniFmt.nChannels; + pFormat->wBitsPerSample = miniFmt.BitsPerSample(); + pFormat->nBlockAlign = (WORD) miniFmt.BlockAlign(); + pFormat->nSamplesPerSec = miniFmt.nSamplesPerSec; + pFormat->nAvgBytesPerSec = miniFmt.AvgBytesPerSec(); + + return S_OK; +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::Impl::GetWaveData( uint32_t index, const uint8_t** pData, uint32_t& dataSize ) const +{ + if ( !pData ) + return E_INVALIDARG; + + if ( index >= m_data.dwEntryCount || !m_entries ) + { + return E_FAIL; + } + +#if defined(_XBOX_ONE) && defined(_TITLE) + const uint8_t* waveData = ( m_xmaMemory ) ? reinterpret_cast( m_xmaMemory ) : m_waveData.get(); +#else + const uint8_t* waveData = m_waveData.get(); +#endif + + if ( !waveData ) + return E_FAIL; + + if ( m_data.dwFlags & BANKDATA::TYPE_STREAMING ) + { + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + if ( !m_prepared ) + { + return HRESULT_FROM_WIN32( ERROR_IO_INCOMPLETE ); + } + + if ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) + { + auto& entry = reinterpret_cast( m_entries.get() )[ index ]; + + DWORD dwOffset, dwLength; + entry.ComputeLocations( dwOffset, dwLength, index, m_header, m_data, reinterpret_cast( m_entries.get() ) ); + + if ( ( dwOffset + dwLength ) > m_header.Segments[HEADER::SEGIDX_ENTRYWAVEDATA].dwLength ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + *pData = &waveData[ dwOffset ]; + dataSize = dwLength; + } + else + { + auto& entry = reinterpret_cast( m_entries.get() )[ index ]; + + if ( ( entry.PlayRegion.dwOffset + entry.PlayRegion.dwLength ) > m_header.Segments[HEADER::SEGIDX_ENTRYWAVEDATA].dwLength ) + { + return HRESULT_FROM_WIN32( ERROR_HANDLE_EOF ); + } + + *pData = &waveData[ entry.PlayRegion.dwOffset ]; + dataSize = entry.PlayRegion.dwLength; + } + + return S_OK; +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::Impl::GetSeekTable( uint32_t index, const uint32_t** pData, uint32_t& dataCount, uint32_t& tag ) const +{ + if ( !pData ) + return E_INVALIDARG; + + *pData = nullptr; + dataCount = 0; + tag = 0; + + if ( index >= m_data.dwEntryCount || !m_entries ) + { + return E_FAIL; + } + + if ( !m_seekData ) + return S_OK; + + auto& miniFmt = ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) ? m_data.CompactFormat : ( reinterpret_cast( m_entries.get() )[ index ].Format ); + + switch( miniFmt.wFormatTag ) + { + case MINIWAVEFORMAT::TAG_WMA: + tag = (miniFmt.wBitsPerSample & 0x1) ? WAVE_FORMAT_WMAUDIO3 : WAVE_FORMAT_WMAUDIO2; + break; + + case MINIWAVEFORMAT::TAG_XMA: + tag = 0x166 /* WAVE_FORMAT_XMA2 */; + break; + + default: + return S_OK; + } + + auto seekTable = FindSeekTable( index, m_seekData.get(), m_header, m_data ); + if ( !seekTable ) + return S_OK; + + dataCount = *seekTable; + *pData = seekTable + 1; + + return S_OK; +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::Impl::GetMetadata( uint32_t index, Metadata& metadata ) const +{ + if ( index >= m_data.dwEntryCount || !m_entries ) + { + return E_FAIL; + } + + if ( m_data.dwFlags & BANKDATA::FLAGS_COMPACT ) + { + auto& entry = reinterpret_cast( m_entries.get() )[ index ]; + + DWORD dwOffset, dwLength; + entry.ComputeLocations( dwOffset, dwLength, index, m_header, m_data, reinterpret_cast( m_entries.get() ) ); + + auto seekTable = FindSeekTable( index, m_seekData.get(), m_header, m_data ); + metadata.duration = entry.GetDuration( dwLength, m_data, seekTable ); + metadata.loopStart = metadata.loopLength = 0; + metadata.offsetBytes = dwOffset; + metadata.lengthBytes = dwLength; + } + else + { + auto& entry = reinterpret_cast( m_entries.get() )[ index ]; + + metadata.duration = entry.Duration; + metadata.loopStart = entry.LoopRegion.dwStartSample; + metadata.loopLength = entry.LoopRegion.dwTotalSamples; + metadata.offsetBytes = entry.PlayRegion.dwOffset; + metadata.lengthBytes = entry.PlayRegion.dwLength; + } + + return S_OK; +} + + +bool WaveBankReader::Impl::UpdatePrepared() +{ + if ( m_prepared ) + return true; + + if ( m_async == INVALID_HANDLE_VALUE ) + return false; + + if ( m_request.hEvent != 0 ) + { + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + DWORD bytes; + BOOL result = GetOverlappedResultEx( m_async, &m_request, &bytes, 0, FALSE ); +#else + bool result = HasOverlappedIoCompleted( &m_request ); +#endif + if ( result ) + { + m_prepared = true; + + memset( &m_request, 0, sizeof(OVERLAPPED) ); + } + } + + return m_prepared; +} + + + +//-------------------------------------------------------------------------------------- +WaveBankReader::WaveBankReader() : + pImpl( new Impl ) +{ +} + + +WaveBankReader::~WaveBankReader() +{ +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::Open( const wchar_t* szFileName ) +{ + return pImpl->Open( szFileName ); +} + + +_Use_decl_annotations_ +uint32_t WaveBankReader::Find( const char* name ) const +{ + auto it = pImpl->m_names.find( name ); + if ( it != pImpl->m_names.cend() ) + { + return it->second; + } + + return uint32_t(-1); +} + + +bool WaveBankReader::IsPrepared() +{ + if ( pImpl->m_prepared ) + return true; + + return pImpl->UpdatePrepared(); +} + + +void WaveBankReader::WaitOnPrepare() +{ + if ( pImpl->m_prepared ) + return; + + if ( pImpl->m_request.hEvent != 0 ) + { + WaitForSingleObjectEx( pImpl->m_request.hEvent, INFINITE, FALSE ); + + pImpl->UpdatePrepared(); + } +} + + +bool WaveBankReader::HasNames() const +{ + return !pImpl->m_names.empty(); +} + + +bool WaveBankReader::IsStreamingBank() const +{ + return (pImpl->m_data.dwFlags & BANKDATA::TYPE_STREAMING) != 0; +} + + +#if defined(_XBOX_ONE) && defined(_TITLE) +bool WaveBankReader::HasXMA() const +{ + return (pImpl->m_xmaMemory != 0); +} +#endif + + +const char* WaveBankReader::BankName() const +{ + return pImpl->m_data.szBankName; +} + + +uint32_t WaveBankReader::Count() const +{ + return pImpl->m_data.dwEntryCount; +} + + +uint32_t WaveBankReader::BankAudioSize() const +{ + return pImpl->m_header.Segments[HEADER::SEGIDX_ENTRYWAVEDATA].dwLength; +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::GetFormat( uint32_t index, WAVEFORMATEX* pFormat, size_t maxsize ) const +{ + return pImpl->GetFormat( index, pFormat, maxsize ); +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::GetWaveData( uint32_t index, const uint8_t** pData, uint32_t& dataSize ) const +{ + return pImpl->GetWaveData( index, pData, dataSize ); +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::GetSeekTable( uint32_t index, const uint32_t** pData, uint32_t& dataCount, uint32_t& tag ) const +{ + return pImpl->GetSeekTable( index, pData, dataCount, tag ); +} + + +_Use_decl_annotations_ +HRESULT WaveBankReader::GetMetadata( uint32_t index, Metadata& metadata ) const +{ + return pImpl->GetMetadata( index, metadata ); +} + + +HANDLE WaveBankReader::GetAsyncHandle() const +{ + return ( pImpl->m_data.dwFlags & BANKDATA::TYPE_STREAMING ) ? pImpl->m_async : INVALID_HANDLE_VALUE; +} diff --git a/DirectXTK/Audio/WaveBankReader.h b/DirectXTK/Audio/WaveBankReader.h new file mode 100644 index 0000000..3c6f814 --- /dev/null +++ b/DirectXTK/Audio/WaveBankReader.h @@ -0,0 +1,85 @@ +//-------------------------------------------------------------------------------------- +// File: WaveBankReader.h +// +// Functions for loading audio data from Wave Banks +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include +#include + + +namespace DirectX +{ + class WaveBankReader + { + public: + WaveBankReader(); + +#if !defined(_MSC_VER) || _MSC_VER >= 1900 + WaveBankReader(WaveBankReader&&) = default; + WaveBankReader& operator= (WaveBankReader&&) = default; +#endif + + WaveBankReader(WaveBankReader const&) = delete; + WaveBankReader& operator= (WaveBankReader const&) = delete; + + ~WaveBankReader(); + + HRESULT Open( _In_z_ const wchar_t* szFileName ); + + uint32_t Find( _In_z_ const char* name ) const; + + bool IsPrepared(); + void WaitOnPrepare(); + + bool HasNames() const; + bool IsStreamingBank() const; + +#if defined(_XBOX_ONE) && defined(_TITLE) + bool HasXMA() const; +#endif + + const char* BankName() const; + + uint32_t Count() const; + + uint32_t BankAudioSize() const; + + HRESULT GetFormat( _In_ uint32_t index, _Out_writes_bytes_(maxsize) WAVEFORMATEX* pFormat, _In_ size_t maxsize ) const; + + HRESULT GetWaveData( _In_ uint32_t index, _Outptr_ const uint8_t** pData, _Out_ uint32_t& dataSize ) const; + + HRESULT GetSeekTable( _In_ uint32_t index, _Out_ const uint32_t** pData, _Out_ uint32_t& dataCount, _Out_ uint32_t& tag ) const; + + HANDLE GetAsyncHandle() const; + + struct Metadata + { + uint32_t duration; + uint32_t loopStart; + uint32_t loopLength; + uint32_t offsetBytes; + uint32_t lengthBytes; + }; + HRESULT GetMetadata( _In_ uint32_t index, _Out_ Metadata& metadata ) const; + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; +} diff --git a/DirectXTK/DirectXTK_Desktop_2013.sln b/DirectXTK/DirectXTK_Desktop_2013.sln new file mode 100644 index 0000000..97471c1 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2013.sln @@ -0,0 +1,76 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2013", "DirectXTK_Desktop_2013.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakeSpriteFont", "MakeSpriteFont\MakeSpriteFont.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTKAudio_Desktop_2013_Win8", "Audio\DirectXTKAudio_Desktop_2013_Win8.vcxproj", "{4F150A30-CECB-49D1-8283-6A3F57438CF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XWBTool_Desktop_2013", "XWBTool\XWBTool_Desktop_2013.vcxproj", "{C7AB4186-54B2-4244-A533-77494763EA1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.Build.0 = Release|Any CPU + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.ActiveCfg = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.Build.0 = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.ActiveCfg = Release|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.Build.0 = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.ActiveCfg = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.Build.0 = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.ActiveCfg = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Desktop_2013.vcxproj b/DirectXTK/DirectXTK_Desktop_2013.vcxproj new file mode 100644 index 0000000..c919d8b --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2013.vcxproj @@ -0,0 +1,592 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + Document + + + + + Document + + + Document + + + + $(VCTargetsPath11) + + + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + Win32Proj + DirectXTK + + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + Bin\Desktop_2013\$(Platform)\$(Configuration)\ + DirectXTK + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2013.vcxproj.filters b/DirectXTK/DirectXTK_Desktop_2013.vcxproj.filters new file mode 100644 index 0000000..34cfceb --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2013.vcxproj.filters @@ -0,0 +1,1170 @@ + + + + + {771f5f80-d173-49c3-8afb-790e8f7cb0ce} + + + {c52e19b6-8703-49a1-9b36-101a05b4745d} + + + {28d5fa16-99e2-471c-8cd8-2020e81f0024} + + + {8ee8c4ce-1ba7-4553-9f78-1adcde5a35a4} + + + {99b161e2-3dd9-494f-8739-9a41a819b1e6} + + + {f3dfb6b5-d1a2-43a9-a2e1-5f7d9a91d028} + + + {d222ca1e-bed2-47ce-ad94-a17343d24cb6} + + + {515ccaf4-6fc2-4e50-a4bf-fa191fa0be6d} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2013_DXSDK.sln b/DirectXTK/DirectXTK_Desktop_2013_DXSDK.sln new file mode 100644 index 0000000..128dd9a --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2013_DXSDK.sln @@ -0,0 +1,76 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2013", "DirectXTK_Desktop_2013.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakeSpriteFont", "MakeSpriteFont\MakeSpriteFont.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTKAudio_Desktop_2013_DXSDK", "Audio\DirectXTKAudio_Desktop_2013_DXSDK.vcxproj", "{4F150A30-CECB-49D1-8283-6A3F57438CF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xwbtool_Desktop_2013", "XWBTool\xwbtool_Desktop_2013.vcxproj", "{C7AB4186-54B2-4244-A533-77494763EA1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.Build.0 = Release|Any CPU + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.ActiveCfg = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.Build.0 = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.ActiveCfg = Release|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.Build.0 = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.ActiveCfg = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.Build.0 = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.ActiveCfg = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Desktop_2015.sln b/DirectXTK/DirectXTK_Desktop_2015.sln new file mode 100644 index 0000000..7f829b2 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2015.sln @@ -0,0 +1,76 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2015 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2015", "DirectXTK_Desktop_2015.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakeSpriteFont", "MakeSpriteFont\MakeSpriteFont.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTKAudio_Desktop_2015_Win8", "Audio\DirectXTKAudio_Desktop_2015_Win8.vcxproj", "{4F150A30-CECB-49D1-8283-6A3F57438CF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XWBTool_Desktop_2015", "XWBTool\XWBTool_Desktop_2015.vcxproj", "{C7AB4186-54B2-4244-A533-77494763EA1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.Build.0 = Release|Any CPU + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.ActiveCfg = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.Build.0 = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.ActiveCfg = Release|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.Build.0 = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.ActiveCfg = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.Build.0 = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.ActiveCfg = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Desktop_2015.vcxproj b/DirectXTK/DirectXTK_Desktop_2015.vcxproj new file mode 100644 index 0000000..720fe55 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2015.vcxproj @@ -0,0 +1,590 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + Document + + + + + Document + + + Document + + + + + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + Win32Proj + DirectXTK + + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + false + v140 + Unicode + + + StaticLibrary + false + v140 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + Bin\Desktop_2015\$(Platform)\$(Configuration)\ + DirectXTK + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2015.vcxproj.filters b/DirectXTK/DirectXTK_Desktop_2015.vcxproj.filters new file mode 100644 index 0000000..66e0489 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2015.vcxproj.filters @@ -0,0 +1,1170 @@ + + + + + {771f5f80-d173-49c3-8afb-790e8f7cb0ce} + + + {c52e19b6-8703-49a1-9b36-101a05b4745d} + + + {e07ba3bc-b69f-4ded-9ffa-3b47427e9fef} + + + {28e934ed-a6d7-4c30-b064-c72c50c99626} + + + {28d5fa16-99e2-471c-8cd8-2020e81f0024} + + + {b5e37d19-9ef0-4951-9865-ee6efed41e82} + + + {34676173-31f5-4435-b90d-a0ad4f7d163c} + + + {76af8346-1ee8-4ef9-90aa-6b4d86cf5164} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + Src + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2015_DXSDK.sln b/DirectXTK/DirectXTK_Desktop_2015_DXSDK.sln new file mode 100644 index 0000000..ae1af8f --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2015_DXSDK.sln @@ -0,0 +1,76 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2015 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2015", "DirectXTK_Desktop_2015.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakeSpriteFont", "MakeSpriteFont\MakeSpriteFont.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTKAudio_Desktop_2015_DXSDK", "Audio\DirectXTKAudio_Desktop_2015_DXSDK.vcxproj", "{4F150A30-CECB-49D1-8283-6A3F57438CF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xwbtool_Desktop_2015", "XWBTool\xwbtool_Desktop_2015.vcxproj", "{C7AB4186-54B2-4244-A533-77494763EA1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.Build.0 = Release|Any CPU + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.ActiveCfg = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.Build.0 = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.ActiveCfg = Release|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.Build.0 = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.ActiveCfg = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.Build.0 = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.ActiveCfg = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Desktop_2015_Win10.sln b/DirectXTK/DirectXTK_Desktop_2015_Win10.sln new file mode 100644 index 0000000..9eab4c2 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2015_Win10.sln @@ -0,0 +1,74 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2015 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2015_Win10", "DirectXTK_Desktop_2015_Win10.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakeSpriteFont", "MakeSpriteFont\MakeSpriteFont.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XWBTool_Desktop_2015", "XWBTool\XWBTool_Desktop_2015.vcxproj", "{C7AB4186-54B2-4244-A533-77494763EA1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.Build.0 = Release|Any CPU + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.ActiveCfg = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.Build.0 = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.ActiveCfg = Release|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.Build.0 = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.ActiveCfg = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.Build.0 = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.ActiveCfg = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Desktop_2015_Win10.vcxproj b/DirectXTK/DirectXTK_Desktop_2015_Win10.vcxproj new file mode 100644 index 0000000..cc4b51a --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2015_Win10.vcxproj @@ -0,0 +1,603 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + Document + + + + + Document + + + Document + + + + + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + Win32Proj + DirectXTK + 10.0.14393.0 + + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + true + v140 + Unicode + + + StaticLibrary + false + v140 + Unicode + + + StaticLibrary + false + v140 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2015_Win10\$(Platform)\$(Configuration)\ + DirectXTK + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0A00;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0A00;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0A00;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0A00;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2015_Win10.vcxproj.filters b/DirectXTK/DirectXTK_Desktop_2015_Win10.vcxproj.filters new file mode 100644 index 0000000..bdcf276 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2015_Win10.vcxproj.filters @@ -0,0 +1,1209 @@ + + + + + {771f5f80-d173-49c3-8afb-790e8f7cb0ce} + + + {c52e19b6-8703-49a1-9b36-101a05b4745d} + + + {e07ba3bc-b69f-4ded-9ffa-3b47427e9fef} + + + {28e934ed-a6d7-4c30-b064-c72c50c99626} + + + {28d5fa16-99e2-471c-8cd8-2020e81f0024} + + + {2c7e186a-b9b6-4511-85f2-1bb46bd0f152} + + + {34676173-31f5-4435-b90d-a0ad4f7d163c} + + + {76af8346-1ee8-4ef9-90aa-6b4d86cf5164} + + + {5d47b946-09b9-4477-934f-ca45fba9845d} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Src + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Audio + + + Audio + + + Audio + + + Audio + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2017.sln b/DirectXTK/DirectXTK_Desktop_2017.sln new file mode 100644 index 0000000..5b81c31 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2017.sln @@ -0,0 +1,76 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2017 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2017", "DirectXTK_Desktop_2017.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakeSpriteFont", "MakeSpriteFont\MakeSpriteFont.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTKAudio_Desktop_2017_Win8", "Audio\DirectXTKAudio_Desktop_2017_Win8.vcxproj", "{4F150A30-CECB-49D1-8283-6A3F57438CF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XWBTool_Desktop_2017", "XWBTool\XWBTool_Desktop_2017.vcxproj", "{C7AB4186-54B2-4244-A533-77494763EA1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.Build.0 = Release|Any CPU + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.ActiveCfg = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.Build.0 = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.ActiveCfg = Release|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.Build.0 = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.ActiveCfg = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.Build.0 = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.ActiveCfg = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Desktop_2017.vcxproj b/DirectXTK/DirectXTK_Desktop_2017.vcxproj new file mode 100644 index 0000000..c6ee5b9 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2017.vcxproj @@ -0,0 +1,601 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + Document + + + + + Document + + + + + Document + + + + + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + Win32Proj + DirectXTK + 10.0.15063.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + Unicode + + + StaticLibrary + false + v141 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + Bin\Desktop_2017\$(Platform)\$(Configuration)\ + DirectXTK + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + 4996 + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + 4996 + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + 4996 + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0600;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + 4996 + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2017.vcxproj.filters b/DirectXTK/DirectXTK_Desktop_2017.vcxproj.filters new file mode 100644 index 0000000..2812a43 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2017.vcxproj.filters @@ -0,0 +1,1170 @@ + + + + + {771f5f80-d173-49c3-8afb-790e8f7cb0ce} + + + {c52e19b6-8703-49a1-9b36-101a05b4745d} + + + {e07ba3bc-b69f-4ded-9ffa-3b47427e9fef} + + + {28e934ed-a6d7-4c30-b064-c72c50c99626} + + + {28d5fa16-99e2-471c-8cd8-2020e81f0024} + + + {b5e37d19-9ef0-4951-9865-ee6efed41e82} + + + {34676173-31f5-4435-b90d-a0ad4f7d163c} + + + {76af8346-1ee8-4ef9-90aa-6b4d86cf5164} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + Src + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2017_DXSDK.sln b/DirectXTK/DirectXTK_Desktop_2017_DXSDK.sln new file mode 100644 index 0000000..ad66f31 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2017_DXSDK.sln @@ -0,0 +1,76 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2017 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2017", "DirectXTK_Desktop_2017.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakeSpriteFont", "MakeSpriteFont\MakeSpriteFont.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTKAudio_Desktop_2017_DXSDK", "Audio\DirectXTKAudio_Desktop_2017_DXSDK.vcxproj", "{4F150A30-CECB-49D1-8283-6A3F57438CF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xwbtool_Desktop_2017", "XWBTool\xwbtool_Desktop_2017.vcxproj", "{C7AB4186-54B2-4244-A533-77494763EA1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.Build.0 = Release|Any CPU + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.ActiveCfg = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.Build.0 = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.ActiveCfg = Release|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.Build.0 = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.ActiveCfg = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.Build.0 = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.ActiveCfg = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Desktop_2017_Win10.sln b/DirectXTK/DirectXTK_Desktop_2017_Win10.sln new file mode 100644 index 0000000..f2cc7f0 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2017_Win10.sln @@ -0,0 +1,74 @@ +fx +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2017 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Desktop_2017_Win10", "DirectXTK_Desktop_2017_Win10.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MakeSpriteFont", "MakeSpriteFont\MakeSpriteFont.csproj", "{7329B02D-C504-482A-A156-181D48CE493C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XWBTool_Desktop_2017", "XWBTool\XWBTool_Desktop_2017.vcxproj", "{C7AB4186-54B2-4244-A533-77494763EA1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|Win32.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Debug|x64.Build.0 = Debug|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|Win32.Build.0 = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.ActiveCfg = Release|Any CPU + {7329B02D-C504-482A-A156-181D48CE493C}.Release|x64.Build.0 = Release|Any CPU + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|Win32.Build.0 = Debug|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.ActiveCfg = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Debug|x64.Build.0 = Debug|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.ActiveCfg = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|Win32.Build.0 = Release|Win32 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.ActiveCfg = Release|x64 + {4F150A30-CECB-49D1-8283-6A3F57438CF5}.Release|x64.Build.0 = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.ActiveCfg = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|Win32.Build.0 = Debug|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.ActiveCfg = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Debug|x64.Build.0 = Debug|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.ActiveCfg = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|Win32.Build.0 = Release|Win32 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.ActiveCfg = Release|x64 + {C7AB4186-54B2-4244-A533-77494763EA1D}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Desktop_2017_Win10.vcxproj b/DirectXTK/DirectXTK_Desktop_2017_Win10.vcxproj new file mode 100644 index 0000000..3f9daa0 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2017_Win10.vcxproj @@ -0,0 +1,607 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + Document + + + + + Document + + + Document + + + + + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + Win32Proj + DirectXTK + 10.0.15063.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + Unicode + + + StaticLibrary + false + v141 + Unicode + + + + + + + + + + + + + + + + + + + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + Bin\Desktop_2017_Win10\$(Platform)\$(Configuration)\ + DirectXTK + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0A00;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + + + + + Use + EnableAllWarnings + Disabled + _WIN32_WINNT=0x0A00;_WIN7_PLATFORM_UPDATE;WIN32;_DEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0A00;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + true + true + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _WIN32_WINNT=0x0A00;_WIN7_PLATFORM_UPDATE;WIN32;NDEBUG;_LIB;_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Desktop_2017_Win10.vcxproj.filters b/DirectXTK/DirectXTK_Desktop_2017_Win10.vcxproj.filters new file mode 100644 index 0000000..f20b193 --- /dev/null +++ b/DirectXTK/DirectXTK_Desktop_2017_Win10.vcxproj.filters @@ -0,0 +1,1209 @@ + + + + + {771f5f80-d173-49c3-8afb-790e8f7cb0ce} + + + {c52e19b6-8703-49a1-9b36-101a05b4745d} + + + {e07ba3bc-b69f-4ded-9ffa-3b47427e9fef} + + + {28e934ed-a6d7-4c30-b064-c72c50c99626} + + + {28d5fa16-99e2-471c-8cd8-2020e81f0024} + + + {2c7e186a-b9b6-4511-85f2-1bb46bd0f152} + + + {34676173-31f5-4435-b90d-a0ad4f7d163c} + + + {76af8346-1ee8-4ef9-90aa-6b4d86cf5164} + + + {5d47b946-09b9-4477-934f-ca45fba9845d} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Src + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Audio + + + Audio + + + Audio + + + Audio + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Windows10.sln b/DirectXTK/DirectXTK_Windows10.sln new file mode 100644 index 0000000..9fce624 --- /dev/null +++ b/DirectXTK/DirectXTK_Windows10.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2017 +VisualStudioVersion = 14.0.22605.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Windows10", "DirectXTK_Windows10.vcxproj", "{F4776924-619C-42C7-88B2-82C947CCC9E7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Debug|ARM.ActiveCfg = Debug|ARM + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Debug|ARM.Build.0 = Debug|ARM + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Debug|x64.ActiveCfg = Debug|x64 + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Debug|x64.Build.0 = Debug|x64 + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Debug|x86.ActiveCfg = Debug|Win32 + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Debug|x86.Build.0 = Debug|Win32 + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Release|ARM.ActiveCfg = Release|ARM + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Release|ARM.Build.0 = Release|ARM + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Release|x64.ActiveCfg = Release|x64 + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Release|x64.Build.0 = Release|x64 + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Release|x86.ActiveCfg = Release|Win32 + {F4776924-619C-42C7-88B2-82C947CCC9E7}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Windows10.vcxproj b/DirectXTK/DirectXTK_Windows10.vcxproj new file mode 100644 index 0000000..1e1343a --- /dev/null +++ b/DirectXTK/DirectXTK_Windows10.vcxproj @@ -0,0 +1,690 @@ + + + + + Debug + ARM + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + + + + Document + + + + + Document + + + + + Document + + + + {f4776924-619c-42c7-88b2-82c947ccc9e7} + StaticLibrary + DirectXTK + DirectXTK + en-US + 14.0 + true + Windows Store + 10.0.15063.0 + 10.0.14393.0 + 10.0 + + + + StaticLibrary + true + v141 + + + StaticLibrary + true + v141 + + + StaticLibrary + true + v141 + + + StaticLibrary + false + v141 + + + StaticLibrary + false + v141 + + + StaticLibrary + false + v141 + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bin\Windows10\$(Platform)\$(Configuration)\ + Bin\Windows10\$(Platform)\$(Configuration)\ + DirectXTK + false + + + Bin\Windows10\$(Platform)\$(Configuration)\ + Bin\Windows10\$(Platform)\$(Configuration)\ + DirectXTK + false + + + Bin\Windows10\$(Platform)\$(Configuration)\ + Bin\Windows10\$(Platform)\$(Configuration)\ + DirectXTK + false + + + Bin\Windows10\$(Platform)\$(Configuration)\ + Bin\Windows10\$(Platform)\$(Configuration)\ + DirectXTK + false + + + Bin\Windows10\$(Platform)\$(Configuration)\ + Bin\Windows10\$(Platform)\$(Configuration)\ + DirectXTK + false + + + Bin\Windows10\$(Platform)\$(Configuration)\ + Bin\Windows10\$(Platform)\$(Configuration)\ + DirectXTK + false + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + EnableAllWarnings + _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Console + false + false + + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + StreamingSIMDExtensions2 + $(IntDir)$(TargetName).pdb + EnableAllWarnings + _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Console + false + false + + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + EnableAllWarnings + _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Console + false + false + + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + EnableAllWarnings + _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Console + false + false + + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + EnableAllWarnings + _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Console + false + false + + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + EnableAllWarnings + _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS;%(PreprocessorDefinitions) + /permissive- /Zc:twoPhase- %(AdditionalOptions) + + + Console + false + false + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Windows10.vcxproj.filters b/DirectXTK/DirectXTK_Windows10.vcxproj.filters new file mode 100644 index 0000000..fa51ba0 --- /dev/null +++ b/DirectXTK/DirectXTK_Windows10.vcxproj.filters @@ -0,0 +1,1211 @@ + + + + + {a77af43b-f2ab-4dcc-b84e-70909b198d8a} + + + {4a81ebd8-dd1a-46fb-ad14-8b57d8e92774} + + + {a872f54e-e97f-4e14-a946-da034ce61f99} + + + {e536bb5b-5908-4d5a-b629-6a73cf2fc9ca} + + + {fe608244-a8ad-4cca-b766-e82f3d32405b} + + + {68d47991-3b63-4a17-a705-680374a426f2} + + + {b5728d91-918a-4481-8e6f-8e793da9ee2c} + + + {020af8ad-d3a0-41bc-bc05-b1d0a5d2a85f} + + + {9e8e474c-90e2-4f97-8278-8aaa7bef7439} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Src + + + Audio + + + Audio + + + Audio + + + Audio + + + Inc + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Inc\Shared + + + Src\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + Src + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Windows81.sln b/DirectXTK/DirectXTK_Windows81.sln new file mode 100644 index 0000000..e56677e --- /dev/null +++ b/DirectXTK/DirectXTK_Windows81.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_Windows81", "DirectXTK_Windows81.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|ARM.ActiveCfg = Debug|ARM + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|ARM.Build.0 = Debug|ARM + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.ActiveCfg = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|x64.Build.0 = Debug|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|ARM.ActiveCfg = Release|ARM + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|ARM.Build.0 = Release|ARM + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.ActiveCfg = Release|x64 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_Windows81.vcxproj b/DirectXTK/DirectXTK_Windows81.vcxproj new file mode 100644 index 0000000..faee903 --- /dev/null +++ b/DirectXTK/DirectXTK_Windows81.vcxproj @@ -0,0 +1,705 @@ + + + + + Debug + ARM + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + Document + + + + + Document + + + Document + + + + $(VCTargetsPath11) + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + Win32Proj + DirectXTK + en-US + 12.0 + true + Windows Store + 8.1 + + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + StaticLibrary + false + v120 + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + Bin\Windows81\$(Platform)\$(Configuration)\ + Bin\Windows81\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Windows81\$(Platform)\$(Configuration)\ + Bin\Windows81\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Windows81\$(Platform)\$(Configuration)\ + Bin\Windows81\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Windows81\$(Platform)\$(Configuration)\ + Bin\Windows81\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Windows81\$(Platform)\$(Configuration)\ + Bin\Windows81\$(Platform)\$(Configuration)\ + DirectXTK + + + Bin\Windows81\$(Platform)\$(Configuration)\ + Bin\Windows81\$(Platform)\$(Configuration)\ + DirectXTK + + + + Use + EnableAllWarnings + Disabled + _UNICODE;UNICODE;_DEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + 4628 + + + Windows + true + + + /IGNORE:4264 %(AdditionalOptions) + + + + + Use + EnableAllWarnings + Disabled + _UNICODE;UNICODE;_DEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + 4628 + + + Windows + true + + + /IGNORE:4264 %(AdditionalOptions) + + + + + Use + EnableAllWarnings + Disabled + _UNICODE;UNICODE;_DEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + 4628 + + + Windows + true + + + /IGNORE:4264 %(AdditionalOptions) + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _UNICODE;UNICODE;NDEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + 4628 + + + Windows + true + true + true + + + /IGNORE:4264 %(AdditionalOptions) + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _UNICODE;UNICODE;NDEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + 4628 + + + Windows + true + true + true + + + /IGNORE:4264 %(AdditionalOptions) + + + + + EnableAllWarnings + Use + MaxSpeed + true + true + _UNICODE;UNICODE;NDEBUG;_LIB;%(PreprocessorDefinitions) + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + StreamingSIMDExtensions2 + Fast + $(IntDir)$(TargetName).pdb + 4628 + + + Windows + true + true + true + + + /IGNORE:4264 %(AdditionalOptions) + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_Windows81.vcxproj.filters b/DirectXTK/DirectXTK_Windows81.vcxproj.filters new file mode 100644 index 0000000..7520712 --- /dev/null +++ b/DirectXTK/DirectXTK_Windows81.vcxproj.filters @@ -0,0 +1,1209 @@ + + + + + {771f5f80-d173-49c3-8afb-790e8f7cb0ce} + + + {c52e19b6-8703-49a1-9b36-101a05b4745d} + + + {28d5fa16-99e2-471c-8cd8-2020e81f0024} + + + {0d2eca49-5eea-4fb0-a4ac-736981f4ca12} + + + {4453d311-0343-46d2-b289-0f4d03db6798} + + + {84501f91-1a5f-4c06-af33-e184e1ee76cf} + + + {dcc9ae4c-59ab-4f2c-9832-f6ad4adeab4e} + + + {fea2afa9-b46f-4dbe-befa-7c4e4ca01518} + + + {dcf4938f-25ec-4f06-ac81-d54b234dae99} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Inc + + + Audio + + + Audio + + + Audio + + + Audio + + + Inc + + + Inc + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Src + + + Src + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_WindowsPhone81.sln b/DirectXTK/DirectXTK_WindowsPhone81.sln new file mode 100644 index 0000000..32c9656 --- /dev/null +++ b/DirectXTK/DirectXTK_WindowsPhone81.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30303.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_WindowsPhone81", "DirectXTK_WindowsPhone81.vcxproj", "{E0B52AE7-E160-4D32-BF3F-910B785E5A8E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|ARM.ActiveCfg = Debug|ARM + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|ARM.Build.0 = Debug|ARM + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Debug|Win32.Build.0 = Debug|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|ARM.ActiveCfg = Release|ARM + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|ARM.Build.0 = Release|ARM + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.ActiveCfg = Release|Win32 + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_WindowsPhone81.vcxproj b/DirectXTK/DirectXTK_WindowsPhone81.vcxproj new file mode 100644 index 0000000..314988c --- /dev/null +++ b/DirectXTK/DirectXTK_WindowsPhone81.vcxproj @@ -0,0 +1,498 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + Document + + + + {E0B52AE7-E160-4D32-BF3F-910B785E5A8E} + Win32Proj + DirectXTK + DirectXTK + en-US + 12.0 + true + Windows Phone + 8.1 + + + + StaticLibrary + true + v120_wp81 + + + StaticLibrary + false + v120_wp81 + + + StaticLibrary + true + v120_wp81 + + + StaticLibrary + false + v120_wp81 + + + + + + + + false + DirectXTK + Bin\WindowsPhone81\$(Platform)\$(Configuration)\ + Bin\WindowsPhone81\$(Platform)\$(Configuration)\ + + + + _LIB;_DEBUG;%(PreprocessorDefinitions) + Disabled + + + + + _LIB;NDEBUG;%(PreprocessorDefinitions) + MaxSpeed + true + true + + + + + _LIB;_DEBUG;%(PreprocessorDefinitions) + Disabled + + + + + _LIB;NDEBUG;%(PreprocessorDefinitions) + MaxSpeed + true + true + + + + + Use + pch.h + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + EnableAllWarnings + false + $(IntDir)$(TargetName).pdb + $(IntDir)$(TargetName).pdb + $(IntDir)$(TargetName).pdb + $(IntDir)$(TargetName).pdb + StreamingSIMDExtensions2 + StreamingSIMDExtensions2 + Fast + Fast + Fast + Fast + + + Console + false + false + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_WindowsPhone81.vcxproj.filters b/DirectXTK/DirectXTK_WindowsPhone81.vcxproj.filters new file mode 100644 index 0000000..c22a5fb --- /dev/null +++ b/DirectXTK/DirectXTK_WindowsPhone81.vcxproj.filters @@ -0,0 +1,1062 @@ + + + + + {771f5f80-d173-49c3-8afb-790e8f7cb0ce} + + + {c52e19b6-8703-49a1-9b36-101a05b4745d} + + + {28d5fa16-99e2-471c-8cd8-2020e81f0024} + + + {f5b4f86e-429f-4007-aba8-8985c7ac7144} + + + {7bf7180c-d098-4c64-b395-e10ebe4896ea} + + + {0e2f4356-162b-480f-b388-0a4ed8dcaf26} + + + {24a428fe-7b3e-4019-8a67-c06373039297} + + + {cc7eb4da-4f82-498c-b8b6-284271b43417} + + + {e1279b7d-7e5a-421e-9357-3ffdcc95abdd} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Inc + + + Audio + + + Audio + + + Audio + + + Audio + + + Inc + + + Inc + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Src + + + Src + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.sln b/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.sln new file mode 100644 index 0000000..2e397ea --- /dev/null +++ b/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30626.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_XAMLSilverlight_WindowsPhone81", "DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj", "{E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}.Debug|ARM.ActiveCfg = Debug|ARM + {E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}.Debug|ARM.Build.0 = Debug|ARM + {E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}.Debug|Win32.Build.0 = Debug|Win32 + {E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}.Release|ARM.ActiveCfg = Release|ARM + {E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}.Release|ARM.Build.0 = Release|ARM + {E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}.Release|Win32.ActiveCfg = Release|Win32 + {E6360FF2-827F-44C1-87C6-3E1F98F5DA2E}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj b/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj new file mode 100644 index 0000000..d4a9f0c --- /dev/null +++ b/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj @@ -0,0 +1,541 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + ARM + + + Release + ARM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + + + + Document + + + + {e6360ff2-827f-44c1-87c6-3e1f98f5da2e} + Win32Proj + DirectXTK + DirectXTK + en-US + 12.0 + true + Windows Phone Silverlight + 8.1 + + + + StaticLibrary + true + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + true + v120 + + + StaticLibrary + false + v120 + + + + + + + + + + + + + + + + + + DirectXTK + Bin\XAMLSilverLightWindowsPhone81\$(Platform)\$(Configuration)\ + Bin\XAMLSilverLightWindowsPhone81\$(Platform)\$(Configuration)\ + $(VC_IncludePath);$(WindowsPhoneSilverlightSDK_IncludePath);$(WindowsSDK_IncludePath) + + + DirectXTK + Bin\XAMLSilverLightWindowsPhone81\$(Platform)\$(Configuration)\ + Bin\XAMLSilverLightWindowsPhone81\$(Platform)\$(Configuration)\ + $(VC_IncludePath);$(WindowsPhoneSilverlightSDK_IncludePath);$(WindowsSDK_IncludePath) + + + DirectXTK + Bin\XAMLSilverLightWindowsPhone81\$(Platform)\$(Configuration)\ + Bin\XAMLSilverLightWindowsPhone81\$(Platform)\$(Configuration)\ + $(VC_IncludePath);$(WindowsPhoneSilverlightSDK_IncludePath);$(WindowsSDK_IncludePath) + + + DirectXTK + Bin\XAMLSilverLightWindowsPhone81\$(Platform)\$(Configuration)\ + Bin\XAMLSilverLightWindowsPhone81\$(Platform)\$(Configuration)\ + $(VC_IncludePath);$(WindowsPhoneSilverlightSDK_IncludePath);$(WindowsSDK_IncludePath) + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Console + false + false + + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Console + false + false + + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Console + false + false + + + + + Use + false + true + $(ProjectDir)Inc;$(ProjectDir)Src;$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories) + Fast + $(IntDir)$(TargetName).pdb + + + Console + false + false + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj.filters b/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj.filters new file mode 100644 index 0000000..5ec9924 --- /dev/null +++ b/DirectXTK/DirectXTK_XAMLSilverlight_WindowsPhone81.vcxproj.filters @@ -0,0 +1,1064 @@ + + + + + {a21625c9-ec83-4ae1-9b5e-d707c651574f} + + + {114d852e-9fdb-4749-82bd-40dac1f369d9} + + + {ad0f732a-be00-4d93-a088-4c97d245208f} + + + {dd90d999-5eb6-42a1-9ffa-4ea46360065b} + + + {a15dd089-9dee-493f-856a-5291e46723fb} + + + {9a53cbbc-d160-45d9-8079-7e38df7954a1} + + + {cf0cc7a3-8cc3-4b8f-ac69-2403c3e1402b} + + + {5b3ac972-60a8-4016-b7f8-e97a0edd7d4a} + + + {a282e040-ca5c-4ef4-a94d-73bf8d4db518} + + + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Src + + + Inc + + + Inc + + + Inc + + + Inc + + + Audio + + + Audio + + + Audio + + + Inc + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Inc\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + + + Src + + + Audio + + + Src + + + Src + + + Src + + + Src + + + Src + + + Audio + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_XboxOneXDK_2015.sln b/DirectXTK/DirectXTK_XboxOneXDK_2015.sln new file mode 100644 index 0000000..e958714 --- /dev/null +++ b/DirectXTK/DirectXTK_XboxOneXDK_2015.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_XboxOneXDK_2015", "DirectXTK_XboxOneXDK_2015.vcxproj", "{4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Durango = Debug|Durango + Profile|Durango = Profile|Durango + Release|Durango = Release|Durango + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Debug|Durango.ActiveCfg = Debug|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Debug|Durango.Build.0 = Debug|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Profile|Durango.ActiveCfg = Profile|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Profile|Durango.Build.0 = Profile|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Release|Durango.ActiveCfg = Release|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Release|Durango.Build.0 = Release|Durango + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj b/DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj new file mode 100644 index 0000000..2092ed1 --- /dev/null +++ b/DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj @@ -0,0 +1,621 @@ + + + + + Release + Durango + + + Profile + Durango + + + Debug + Durango + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + + + + Document + + + + + Document + + + Document + + + + DirectXTK + {4fdfdccd-ee2e-415c-b458-1e8fdb0d85f2} + en-US + Win32Proj + title + + v140 + 14.0 + Native + + + + StaticLibrary + v140 + false + Unicode + false + false + + + StaticLibrary + v140 + false + Unicode + false + false + + + StaticLibrary + v140 + true + Unicode + false + false + + + + + + + + + + + + + + + + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + Bin\XboxOneXDK_2015\$(Platform)\$(Configuration)\ + Bin\XboxOneXDK_2015\$(Platform)\$(Configuration)\ + DirectXTK + + + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + Bin\XboxOneXDK_2015\$(Platform)\$(Configuration)\ + Bin\XboxOneXDK_2015\$(Platform)\$(Configuration)\ + DirectXTK + + + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + Bin\XboxOneXDK_2015\$(Platform)\$(Configuration)\ + Bin\XboxOneXDK_2015\$(Platform)\$(Configuration)\ + DirectXTK + + + + d3d11_x.lib;combase.lib;kernelx.lib;toolhelpx.lib;uuid.lib; + + + true + Windows + true + true + false + + + Use + pch.h + $(Console_SdkPackagesRoot);$(Console_SdkWindowsMetadataPath);%(AdditionalUsingDirectories) + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;%(PreprocessorDefinitions) + EnableAllWarnings + true + true + false + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + $(IntDir)$(TargetName).pdb + + + + + pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;toolhelpx.lib;uuid.lib; + + + true + Windows + true + true + false + + + Use + pch.h + $(Console_SdkPackagesRoot);$(Console_SdkWindowsMetadataPath);%(AdditionalUsingDirectories) + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;PROFILE;%(PreprocessorDefinitions) + EnableAllWarnings + true + true + false + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + $(IntDir)$(TargetName).pdb + + + + + d3d11_x.lib;combase.lib;kernelx.lib;toolhelpx.lib;uuid.lib; + Windows + true + false + + + pch.h + Use + false + $(Console_SdkPackagesRoot);$(Console_SdkWindowsMetadataPath);%(AdditionalUsingDirectories) + EnableAllWarnings + Disabled + _DEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;%(PreprocessorDefinitions) + false + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + $(IntDir)$(TargetName).pdb + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj.filters b/DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj.filters new file mode 100644 index 0000000..3546392 --- /dev/null +++ b/DirectXTK/DirectXTK_XboxOneXDK_2015.vcxproj.filters @@ -0,0 +1,1255 @@ + + + + + {37d8d298-8ff7-4b16-9de2-1e8e5b943795} + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {1d7c612f-bf24-4368-a247-46d28920c4a7} + + + {5bfd0d52-ee7d-4cf1-aab2-235c7a1f9d6e} + + + {9fa25651-7bb5-42a1-b589-06be42c55e5b} + + + {bb66477f-d2e3-4eed-9c13-e86060685825} + + + {a6ee428c-85f6-4fea-979a-8c22779cd9e7} + + + {78fbbc63-3923-4adc-a469-79721986c80d} + + + + + Audio + + + Audio + + + Audio + + + Audio + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Src + + + Inc + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + Src + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shared + + + Inc\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_XboxOneXDK_2017.sln b/DirectXTK/DirectXTK_XboxOneXDK_2017.sln new file mode 100644 index 0000000..a98d2ed --- /dev/null +++ b/DirectXTK/DirectXTK_XboxOneXDK_2017.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2017 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DirectXTK_XboxOneXDK_2017", "DirectXTK_XboxOneXDK_2017.vcxproj", "{4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Durango = Debug|Durango + Profile|Durango = Profile|Durango + Release|Durango = Release|Durango + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Debug|Durango.ActiveCfg = Debug|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Debug|Durango.Build.0 = Debug|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Profile|Durango.ActiveCfg = Profile|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Profile|Durango.Build.0 = Profile|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Release|Durango.ActiveCfg = Release|Durango + {4FDFDCCD-EE2E-415C-B458-1E8FDB0D85F2}.Release|Durango.Build.0 = Release|Durango + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj b/DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj new file mode 100644 index 0000000..404fff2 --- /dev/null +++ b/DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj @@ -0,0 +1,621 @@ + + + + + Release + Durango + + + Profile + Durango + + + Debug + Durango + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + Document + + + + + + + + Document + + + + + Document + + + Document + + + + DirectXTK + {4fdfdccd-ee2e-415c-b458-1e8fdb0d85f2} + en-US + Win32Proj + title + + v141 + 14.0 + Native + + + + StaticLibrary + v141 + false + Unicode + false + false + + + StaticLibrary + v141 + false + Unicode + false + false + + + StaticLibrary + v141 + true + Unicode + false + false + + + + + + + + + + + + + + + + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + Bin\XboxOneXDK_2017\$(Platform)\$(Configuration)\ + Bin\XboxOneXDK_2017\$(Platform)\$(Configuration)\ + DirectXTK + + + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + Bin\XboxOneXDK_2017\$(Platform)\$(Configuration)\ + Bin\XboxOneXDK_2017\$(Platform)\$(Configuration)\ + DirectXTK + + + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkLibPath) + $(Console_SdkLibPath);$(Console_SdkWindowsMetadataPath) + $(Console_SdkIncludeRoot) + $(Console_SdkRoot)bin;$(VCInstallDir)bin\x86_amd64;$(VCInstallDir)bin;$(WindowsSDK_ExecutablePath_x86);$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;$(ProgramFiles)\HTML Help Workshop;$(MSBuildToolsPath32);$(FxCopDir);$(PATH); + Bin\XboxOneXDK_2017\$(Platform)\$(Configuration)\ + Bin\XboxOneXDK_2017\$(Platform)\$(Configuration)\ + DirectXTK + + + + d3d11_x.lib;combase.lib;kernelx.lib;toolhelpx.lib;uuid.lib; + + + true + Windows + true + true + false + + + Use + pch.h + $(Console_SdkPackagesRoot);$(Console_SdkWindowsMetadataPath);%(AdditionalUsingDirectories) + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;%(PreprocessorDefinitions) + EnableAllWarnings + true + true + false + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + $(IntDir)$(TargetName).pdb + + + + + pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;toolhelpx.lib;uuid.lib; + + + true + Windows + true + true + false + + + Use + pch.h + $(Console_SdkPackagesRoot);$(Console_SdkWindowsMetadataPath);%(AdditionalUsingDirectories) + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;PROFILE;%(PreprocessorDefinitions) + EnableAllWarnings + true + true + false + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + $(IntDir)$(TargetName).pdb + + + + + d3d11_x.lib;combase.lib;kernelx.lib;toolhelpx.lib;uuid.lib; + Windows + true + false + + + pch.h + Use + false + $(Console_SdkPackagesRoot);$(Console_SdkWindowsMetadataPath);%(AdditionalUsingDirectories) + EnableAllWarnings + Disabled + _DEBUG;__WRL_NO_DEFAULT_LIB__;_LIB;%(PreprocessorDefinitions) + false + $(ProjectDir)Inc;$(ProjectDir)Src;%(AdditionalIncludeDirectories) + $(IntDir)$(TargetName).pdb + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj.filters b/DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj.filters new file mode 100644 index 0000000..3546392 --- /dev/null +++ b/DirectXTK/DirectXTK_XboxOneXDK_2017.vcxproj.filters @@ -0,0 +1,1255 @@ + + + + + {37d8d298-8ff7-4b16-9de2-1e8e5b943795} + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {1d7c612f-bf24-4368-a247-46d28920c4a7} + + + {5bfd0d52-ee7d-4cf1-aab2-235c7a1f9d6e} + + + {9fa25651-7bb5-42a1-b589-06be42c55e5b} + + + {bb66477f-d2e3-4eed-9c13-e86060685825} + + + {a6ee428c-85f6-4fea-979a-8c22779cd9e7} + + + {78fbbc63-3923-4adc-a469-79721986c80d} + + + + + Audio + + + Audio + + + Audio + + + Audio + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Inc + + + Src + + + Src + + + Src + + + Inc + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Inc\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Inc + + + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Audio + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src\Shared + + + Src + + + Src + + + Src + + + Src + + + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shared + + + Inc\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders\Shared + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Shared + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Compiled + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + Src\Shaders\Symbols + + + + + + \ No newline at end of file diff --git a/DirectXTK/Inc/Audio.h b/DirectXTK/Inc/Audio.h new file mode 100644 index 0000000..588f7c4 --- /dev/null +++ b/DirectXTK/Inc/Audio.h @@ -0,0 +1,682 @@ +//-------------------------------------------------------------------------------------- +// File: Audio.h +// +// DirectXTK for Audio header +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#pragma comment(lib,"acphal.lib") +#endif + +#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#pragma comment(lib,"PhoneAudioSes.lib") +#endif + +#ifndef XAUDIO2_HELPER_FUNCTIONS +#define XAUDIO2_HELPER_FUNCTIONS +#endif + +#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/) +#if defined(_MSC_VER) && (_MSC_VER < 1700) +#error DirectX Tool Kit for Audio does not support VS 2010 without the DirectX SDK +#endif +#include +#include +#include +#include +#pragma comment(lib,"xaudio2.lib") +#else +// Using XAudio 2.7 requires the DirectX SDK +#include +#include +#include +#include +#pragma warning(push) +#pragma warning( disable : 4005 ) +#include +#pragma warning(pop) +#pragma comment(lib,"x3daudio.lib") +#pragma comment(lib,"xapofx.lib") +#endif + +#include + +#include +#include +#include +#include +#include + +namespace DirectX +{ + class SoundEffectInstance; + + //---------------------------------------------------------------------------------- + struct AudioStatistics + { + size_t playingOneShots; // Number of one-shot sounds currently playing + size_t playingInstances; // Number of sound effect instances currently playing + size_t allocatedInstances; // Number of SoundEffectInstance allocated + size_t allocatedVoices; // Number of XAudio2 voices allocated (standard, 3D, one-shots, and idle one-shots) + size_t allocatedVoices3d; // Number of XAudio2 voices allocated for 3D + size_t allocatedVoicesOneShot; // Number of XAudio2 voices allocated for one-shot sounds + size_t allocatedVoicesIdle; // Number of XAudio2 voices allocated for one-shot sounds but not currently in use + size_t audioBytes; // Total wave data (in bytes) in SoundEffects and in-memory WaveBanks +#if defined(_XBOX_ONE) && defined(_TITLE) + size_t xmaAudioBytes; // Total wave data (in bytes) in SoundEffects and in-memory WaveBanks allocated with ApuAlloc +#endif + }; + + + //---------------------------------------------------------------------------------- + class IVoiceNotify + { + public: + virtual void __cdecl OnBufferEnd() = 0; + // Notfication that a voice buffer has finished + // Note this is called from XAudio2's worker thread, so it should perform very minimal and thread-safe operations + + virtual void __cdecl OnCriticalError() = 0; + // Notification that the audio engine encountered a critical error + + virtual void __cdecl OnReset() = 0; + // Notification of an audio engine reset + + virtual void __cdecl OnUpdate() = 0; + // Notification of an audio engine per-frame update (opt-in) + + virtual void __cdecl OnDestroyEngine() = 0; + // Notification that the audio engine is being destroyed + + virtual void __cdecl OnTrim() = 0; + // Notification of a request to trim the voice pool + + virtual void __cdecl GatherStatistics( AudioStatistics& stats ) const = 0; + // Contribute to statistics request + }; + + //---------------------------------------------------------------------------------- + enum AUDIO_ENGINE_FLAGS + { + AudioEngine_Default = 0x0, + + AudioEngine_EnvironmentalReverb = 0x1, + AudioEngine_ReverbUseFilters = 0x2, + AudioEngine_UseMasteringLimiter = 0x4, + + AudioEngine_Debug = 0x10000, + AudioEngine_ThrowOnNoAudioHW = 0x20000, + AudioEngine_DisableVoiceReuse = 0x40000, + }; + + inline AUDIO_ENGINE_FLAGS operator|(AUDIO_ENGINE_FLAGS a, AUDIO_ENGINE_FLAGS b) { return static_cast( static_cast(a) | static_cast(b) ); } + + enum SOUND_EFFECT_INSTANCE_FLAGS + { + SoundEffectInstance_Default = 0x0, + + SoundEffectInstance_Use3D = 0x1, + SoundEffectInstance_ReverbUseFilters = 0x2, + SoundEffectInstance_NoSetPitch = 0x4, + + SoundEffectInstance_UseRedirectLFE = 0x10000, + }; + + inline SOUND_EFFECT_INSTANCE_FLAGS operator|(SOUND_EFFECT_INSTANCE_FLAGS a, SOUND_EFFECT_INSTANCE_FLAGS b) { return static_cast( static_cast(a) | static_cast(b) ); } + + enum AUDIO_ENGINE_REVERB + { + Reverb_Off, + Reverb_Default, + Reverb_Generic, + Reverb_Forest, + Reverb_PaddedCell, + Reverb_Room, + Reverb_Bathroom, + Reverb_LivingRoom, + Reverb_StoneRoom, + Reverb_Auditorium, + Reverb_ConcertHall, + Reverb_Cave, + Reverb_Arena, + Reverb_Hangar, + Reverb_CarpetedHallway, + Reverb_Hallway, + Reverb_StoneCorridor, + Reverb_Alley, + Reverb_City, + Reverb_Mountains, + Reverb_Quarry, + Reverb_Plain, + Reverb_ParkingLot, + Reverb_SewerPipe, + Reverb_Underwater, + Reverb_SmallRoom, + Reverb_MediumRoom, + Reverb_LargeRoom, + Reverb_MediumHall, + Reverb_LargeHall, + Reverb_Plate, + Reverb_MAX + }; + + enum SoundState + { + STOPPED = 0, + PLAYING, + PAUSED + }; + + + //---------------------------------------------------------------------------------- + class AudioEngine + { + public: + explicit AudioEngine( AUDIO_ENGINE_FLAGS flags = AudioEngine_Default, _In_opt_ const WAVEFORMATEX* wfx = nullptr, _In_opt_z_ const wchar_t* deviceId = nullptr, + AUDIO_STREAM_CATEGORY category = AudioCategory_GameEffects ); + + AudioEngine(AudioEngine&& moveFrom); + AudioEngine& operator= (AudioEngine&& moveFrom); + + AudioEngine(AudioEngine const&) = delete; + AudioEngine& operator= (AudioEngine const&) = delete; + + virtual ~AudioEngine(); + + bool __cdecl Update(); + // Performs per-frame processing for the audio engine, returns false if in 'silent mode' + + bool __cdecl Reset( _In_opt_ const WAVEFORMATEX* wfx = nullptr, _In_opt_z_ const wchar_t* deviceId = nullptr ); + // Reset audio engine from critical error/silent mode using a new device; can also 'migrate' the graph + // Returns true if succesfully reset, false if in 'silent mode' due to no default device + // Note: One shots are lost, all SoundEffectInstances are in the STOPPED state after successful reset + + void __cdecl Suspend(); + void __cdecl Resume(); + // Suspend/resumes audio processing (i.e. global pause/resume) + + float __cdecl GetMasterVolume() const; + void __cdecl SetMasterVolume( float volume ); + // Master volume property for all sounds + + void __cdecl SetReverb( AUDIO_ENGINE_REVERB reverb ); + void __cdecl SetReverb( _In_opt_ const XAUDIO2FX_REVERB_PARAMETERS* native ); + // Sets environmental reverb for 3D positional audio (if active) + + void __cdecl SetMasteringLimit( int release, int loudness ); + // Sets the mastering volume limiter properties (if active) + + AudioStatistics __cdecl GetStatistics() const; + // Gathers audio engine statistics + + WAVEFORMATEXTENSIBLE __cdecl GetOutputFormat() const; + // Returns the format consumed by the mastering voice (which is the same as the device output if defaults are used) + + uint32_t __cdecl GetChannelMask() const; + // Returns the output channel mask + + int __cdecl GetOutputChannels() const; + // Returns the number of output channels + + bool __cdecl IsAudioDevicePresent() const; + // Returns true if the audio graph is operating normally, false if in 'silent mode' + + bool __cdecl IsCriticalError() const; + // Returns true if the audio graph is halted due to a critical error (which also places the engine into 'silent mode') + + // Voice pool management. + void __cdecl SetDefaultSampleRate( int sampleRate ); + // Sample rate for voices in the reuse pool (defaults to 44100) + + void __cdecl SetMaxVoicePool( size_t maxOneShots, size_t maxInstances ); + // Maximum number of voices to allocate for one-shots and instances + // Note: one-shots over this limit are ignored; too many instance voices throws an exception + + void __cdecl TrimVoicePool(); + // Releases any currently unused voices + + // Internal-use functions + void __cdecl AllocateVoice( _In_ const WAVEFORMATEX* wfx, SOUND_EFFECT_INSTANCE_FLAGS flags, bool oneshot, _Outptr_result_maybenull_ IXAudio2SourceVoice** voice ); + + void __cdecl DestroyVoice( _In_ IXAudio2SourceVoice* voice ); + // Should only be called for instance voices, not one-shots + + void __cdecl RegisterNotify( _In_ IVoiceNotify* notify, bool usesUpdate ); + void __cdecl UnregisterNotify( _In_ IVoiceNotify* notify, bool usesOneShots, bool usesUpdate ); + + // XAudio2 interface access + IXAudio2* __cdecl GetInterface() const; + IXAudio2MasteringVoice* __cdecl GetMasterVoice() const; + IXAudio2SubmixVoice* __cdecl GetReverbVoice() const; + X3DAUDIO_HANDLE& __cdecl Get3DHandle() const; + + // Static functions + struct RendererDetail + { + std::wstring deviceId; + std::wstring description; + }; + + static std::vector __cdecl GetRendererDetails(); + // Returns a list of valid audio endpoint devices + + private: + // Private implementation. + class Impl; + std::unique_ptr pImpl; + }; + + + //---------------------------------------------------------------------------------- + class WaveBank + { + public: + WaveBank( _In_ AudioEngine* engine, _In_z_ const wchar_t* wbFileName ); + + WaveBank(WaveBank&& moveFrom); + WaveBank& operator= (WaveBank&& moveFrom); + + WaveBank(WaveBank const&) = delete; + WaveBank& operator= (WaveBank const&) = delete; + + virtual ~WaveBank(); + + void __cdecl Play( int index ); + void __cdecl Play( int index, float volume, float pitch, float pan ); + + void __cdecl Play( _In_z_ const char* name ); + void __cdecl Play( _In_z_ const char* name, float volume, float pitch, float pan ); + + std::unique_ptr __cdecl CreateInstance( int index, SOUND_EFFECT_INSTANCE_FLAGS flags = SoundEffectInstance_Default ); + std::unique_ptr __cdecl CreateInstance( _In_z_ const char* name, SOUND_EFFECT_INSTANCE_FLAGS flags = SoundEffectInstance_Default ); + + bool __cdecl IsPrepared() const; + bool __cdecl IsInUse() const; + bool __cdecl IsStreamingBank() const; + + size_t __cdecl GetSampleSizeInBytes( int index ) const; + // Returns size of wave audio data + + size_t __cdecl GetSampleDuration( int index ) const; + // Returns the duration in samples + + size_t __cdecl GetSampleDurationMS( int index ) const; + // Returns the duration in milliseconds + + const WAVEFORMATEX* __cdecl GetFormat( int index, _Out_writes_bytes_(maxsize) WAVEFORMATEX* wfx, size_t maxsize ) const; + + int __cdecl Find( _In_z_ const char* name ) const; + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/ ) + bool __cdecl FillSubmitBuffer( int index, _Out_ XAUDIO2_BUFFER& buffer, _Out_ XAUDIO2_BUFFER_WMA& wmaBuffer ) const; +#else + void __cdecl FillSubmitBuffer( int index, _Out_ XAUDIO2_BUFFER& buffer ) const; +#endif + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + // Private interface + void __cdecl UnregisterInstance( _In_ SoundEffectInstance* instance ); + + friend class SoundEffectInstance; + }; + + + //---------------------------------------------------------------------------------- + class SoundEffect + { + public: + SoundEffect( _In_ AudioEngine* engine, _In_z_ const wchar_t* waveFileName ); + + SoundEffect( _In_ AudioEngine* engine, _Inout_ std::unique_ptr& wavData, + _In_ const WAVEFORMATEX* wfx, _In_reads_bytes_(audioBytes) const uint8_t* startAudio, size_t audioBytes ); + + SoundEffect( _In_ AudioEngine* engine, _Inout_ std::unique_ptr& wavData, + _In_ const WAVEFORMATEX* wfx, _In_reads_bytes_(audioBytes) const uint8_t* startAudio, size_t audioBytes, + uint32_t loopStart, uint32_t loopLength ); + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/) + + SoundEffect( _In_ AudioEngine* engine, _Inout_ std::unique_ptr& wavData, + _In_ const WAVEFORMATEX* wfx, _In_reads_bytes_(audioBytes) const uint8_t* startAudio, size_t audioBytes, + _In_reads_(seekCount) const uint32_t* seekTable, size_t seekCount ); + +#endif + + SoundEffect(SoundEffect&& moveFrom); + SoundEffect& operator= (SoundEffect&& moveFrom); + + SoundEffect(SoundEffect const&) = delete; + SoundEffect& operator= (SoundEffect const&) = delete; + + virtual ~SoundEffect(); + + void __cdecl Play(); + void __cdecl Play(float volume, float pitch, float pan); + + std::unique_ptr __cdecl CreateInstance( SOUND_EFFECT_INSTANCE_FLAGS flags = SoundEffectInstance_Default ); + + bool __cdecl IsInUse() const; + + size_t __cdecl GetSampleSizeInBytes() const; + // Returns size of wave audio data + + size_t __cdecl GetSampleDuration() const; + // Returns the duration in samples + + size_t __cdecl GetSampleDurationMS() const; + // Returns the duration in milliseconds + + const WAVEFORMATEX* __cdecl GetFormat() const; + +#if defined(_XBOX_ONE) || (_WIN32_WINNT < _WIN32_WINNT_WIN8) || (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/) + bool __cdecl FillSubmitBuffer( _Out_ XAUDIO2_BUFFER& buffer, _Out_ XAUDIO2_BUFFER_WMA& wmaBuffer ) const; +#else + void __cdecl FillSubmitBuffer( _Out_ XAUDIO2_BUFFER& buffer ) const; +#endif + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + // Private interface + void __cdecl UnregisterInstance( _In_ SoundEffectInstance* instance ); + + friend class SoundEffectInstance; + }; + + + //---------------------------------------------------------------------------------- + struct AudioListener : public X3DAUDIO_LISTENER + { + AudioListener() + { + memset( this, 0, sizeof(X3DAUDIO_LISTENER) ); + + OrientFront.z = -1.f; + + OrientTop.y = 1.f; + } + + void XM_CALLCONV SetPosition( FXMVECTOR v ) + { + XMStoreFloat3( reinterpret_cast( &Position ), v ); + } + void __cdecl SetPosition( const XMFLOAT3& pos ) + { + Position.x = pos.x; + Position.y = pos.y; + Position.z = pos.z; + } + + void XM_CALLCONV SetVelocity( FXMVECTOR v ) + { + XMStoreFloat3( reinterpret_cast( &Velocity ), v ); + } + void __cdecl SetVelocity( const XMFLOAT3& vel ) + { + Velocity.x = vel.x; + Velocity.y = vel.y; + Velocity.z = vel.z; + } + + void XM_CALLCONV SetOrientation( FXMVECTOR forward, FXMVECTOR up ) + { + XMStoreFloat3( reinterpret_cast( &OrientFront ), forward ); + XMStoreFloat3( reinterpret_cast( &OrientTop ), up ); + } + void __cdecl SetOrientation( const XMFLOAT3& forward, const XMFLOAT3& up ) + { + OrientFront.x = forward.x; OrientTop.x = up.x; + OrientFront.y = forward.y; OrientTop.y = up.y; + OrientFront.z = forward.z; OrientTop.z = up.z; + } + + void XM_CALLCONV SetOrientationFromQuaternion( FXMVECTOR quat ) + { + XMVECTOR forward = XMVector3Rotate( g_XMIdentityR2, quat ); + XMStoreFloat3( reinterpret_cast( &OrientFront ), forward ); + + XMVECTOR up = XMVector3Rotate( g_XMIdentityR1, quat ); + XMStoreFloat3( reinterpret_cast( &OrientTop ), up ); + } + + void XM_CALLCONV Update( FXMVECTOR newPos, XMVECTOR upDir, float dt ) + // Updates velocity and orientation by tracking changes in position over time... + { + if ( dt > 0.f ) + { + XMVECTOR lastPos = XMLoadFloat3( reinterpret_cast( &Position ) ); + + XMVECTOR vDelta = ( newPos - lastPos ); + XMVECTOR v = vDelta / dt; + XMStoreFloat3( reinterpret_cast( &Velocity ), v ); + + vDelta = XMVector3Normalize( vDelta ); + XMStoreFloat3( reinterpret_cast( &OrientFront ), vDelta ); + + v = XMVector3Cross( upDir, vDelta ); + v = XMVector3Normalize( v ); + + v = XMVector3Cross( vDelta, v ); + v = XMVector3Normalize( v ); + XMStoreFloat3( reinterpret_cast( &OrientTop ), v ); + + XMStoreFloat3( reinterpret_cast( &Position ), newPos ); + } + } + }; + + + //---------------------------------------------------------------------------------- + struct AudioEmitter : public X3DAUDIO_EMITTER + { + float EmitterAzimuths[XAUDIO2_MAX_AUDIO_CHANNELS]; + + AudioEmitter() + { + memset( this, 0, sizeof(X3DAUDIO_EMITTER) ); + memset( EmitterAzimuths, 0, sizeof(EmitterAzimuths) ); + + OrientFront.z = -1.f; + + OrientTop.y = + ChannelRadius = + CurveDistanceScaler = + DopplerScaler = 1.f; + + ChannelCount = 1; + pChannelAzimuths = EmitterAzimuths; + + InnerRadiusAngle = X3DAUDIO_PI / 4.0f; + } + + void XM_CALLCONV SetPosition( FXMVECTOR v ) + { + XMStoreFloat3( reinterpret_cast( &Position ), v ); + } + void __cdecl SetPosition( const XMFLOAT3& pos ) + { + Position.x = pos.x; + Position.y = pos.y; + Position.z = pos.z; + } + + void XM_CALLCONV SetVelocity( FXMVECTOR v ) + { + XMStoreFloat3( reinterpret_cast( &Velocity ), v ); + } + void __cdecl SetVelocity( const XMFLOAT3& vel ) + { + Velocity.x = vel.x; + Velocity.y = vel.y; + Velocity.z = vel.z; + } + + void XM_CALLCONV SetOrientation( FXMVECTOR forward, FXMVECTOR up ) + { + XMStoreFloat3( reinterpret_cast( &OrientFront ), forward ); + XMStoreFloat3( reinterpret_cast( &OrientTop ), up ); + } + void __cdecl SetOrientation( const XMFLOAT3& forward, const XMFLOAT3& up ) + { + OrientFront.x = forward.x; OrientTop.x = up.x; + OrientFront.y = forward.y; OrientTop.y = up.y; + OrientFront.z = forward.z; OrientTop.z = up.z; + } + + void XM_CALLCONV SetOrientationFromQuaternion( FXMVECTOR quat ) + { + XMVECTOR forward = XMVector3Rotate( g_XMIdentityR2, quat ); + XMStoreFloat3( reinterpret_cast( &OrientFront ), forward ); + + XMVECTOR up = XMVector3Rotate( g_XMIdentityR1, quat ); + XMStoreFloat3( reinterpret_cast( &OrientTop ), up ); + } + + void XM_CALLCONV Update( FXMVECTOR newPos, XMVECTOR upDir, float dt ) + // Updates velocity and orientation by tracking changes in position over time... + { + if ( dt > 0.f ) + { + XMVECTOR lastPos = XMLoadFloat3( reinterpret_cast( &Position ) ); + + XMVECTOR vDelta = ( newPos - lastPos ); + XMVECTOR v = vDelta / dt; + XMStoreFloat3( reinterpret_cast( &Velocity ), v ); + + vDelta = XMVector3Normalize( vDelta ); + XMStoreFloat3( reinterpret_cast( &OrientFront ), vDelta ); + + v = XMVector3Cross( upDir, vDelta ); + v = XMVector3Normalize( v ); + + v = XMVector3Cross( vDelta, v ); + v = XMVector3Normalize( v ); + XMStoreFloat3( reinterpret_cast( &OrientTop ), v ); + + XMStoreFloat3( reinterpret_cast( &Position ), newPos ); + } + } + }; + + + //---------------------------------------------------------------------------------- + class SoundEffectInstance + { + public: + SoundEffectInstance(SoundEffectInstance&& moveFrom); + SoundEffectInstance& operator= (SoundEffectInstance&& moveFrom); + + SoundEffectInstance(SoundEffectInstance const&) = delete; + SoundEffectInstance& operator= (SoundEffectInstance const&) = delete; + + virtual ~SoundEffectInstance(); + + void __cdecl Play( bool loop = false ); + void __cdecl Stop( bool immediate = true ); + void __cdecl Pause(); + void __cdecl Resume(); + + void __cdecl SetVolume( float volume ); + void __cdecl SetPitch( float pitch ); + void __cdecl SetPan( float pan ); + + void __cdecl Apply3D( const AudioListener& listener, const AudioEmitter& emitter, bool rhcoords = true ); + + bool __cdecl IsLooped() const; + + SoundState __cdecl GetState(); + + // Notifications. + void __cdecl OnDestroyParent(); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + // Private constructors + SoundEffectInstance( _In_ AudioEngine* engine, _In_ SoundEffect* effect, SOUND_EFFECT_INSTANCE_FLAGS flags ); + SoundEffectInstance( _In_ AudioEngine* engine, _In_ WaveBank* effect, int index, SOUND_EFFECT_INSTANCE_FLAGS flags ); + + friend std::unique_ptr __cdecl SoundEffect::CreateInstance( SOUND_EFFECT_INSTANCE_FLAGS ); + friend std::unique_ptr __cdecl WaveBank::CreateInstance( int, SOUND_EFFECT_INSTANCE_FLAGS ); + }; + + + //---------------------------------------------------------------------------------- + class DynamicSoundEffectInstance + { + public: + DynamicSoundEffectInstance( _In_ AudioEngine* engine, + _In_opt_ std::function bufferNeeded, + int sampleRate, int channels, int sampleBits = 16, + SOUND_EFFECT_INSTANCE_FLAGS flags = SoundEffectInstance_Default ); + DynamicSoundEffectInstance(DynamicSoundEffectInstance&& moveFrom); + DynamicSoundEffectInstance& operator= (DynamicSoundEffectInstance&& moveFrom); + + DynamicSoundEffectInstance(DynamicSoundEffectInstance const&) = delete; + DynamicSoundEffectInstance& operator= (DynamicSoundEffectInstance const&) = delete; + + virtual ~DynamicSoundEffectInstance(); + + void __cdecl Play(); + void __cdecl Stop( bool immediate = true ); + void __cdecl Pause(); + void __cdecl Resume(); + + void __cdecl SetVolume( float volume ); + void __cdecl SetPitch( float pitch ); + void __cdecl SetPan( float pan ); + + void __cdecl Apply3D( const AudioListener& listener, const AudioEmitter& emitter, bool rhcoords = true ); + + void __cdecl SubmitBuffer( _In_reads_bytes_(audioBytes) const uint8_t* pAudioData, size_t audioBytes ); + void __cdecl SubmitBuffer( _In_reads_bytes_(audioBytes) const uint8_t* pAudioData, uint32_t offset, size_t audioBytes ); + + SoundState __cdecl GetState(); + + size_t __cdecl GetSampleDuration( size_t bytes ) const; + // Returns duration in samples of a buffer of a given size + + size_t __cdecl GetSampleDurationMS( size_t bytes ) const; + // Returns duration in milliseconds of a buffer of a given size + + size_t __cdecl GetSampleSizeInBytes( uint64_t duration ) const; + // Returns size of a buffer for a duration given in milliseconds + + int __cdecl GetPendingBufferCount() const; + + const WAVEFORMATEX* __cdecl GetFormat() const; + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; +} diff --git a/DirectXTK/Inc/CommonStates.h b/DirectXTK/Inc/CommonStates.h new file mode 100644 index 0000000..19864cb --- /dev/null +++ b/DirectXTK/Inc/CommonStates.h @@ -0,0 +1,70 @@ +//-------------------------------------------------------------------------------------- +// File: CommonStates.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include + + +namespace DirectX +{ + class CommonStates + { + public: + explicit CommonStates(_In_ ID3D11Device* device); + CommonStates(CommonStates&& moveFrom); + CommonStates& operator= (CommonStates&& moveFrom); + + CommonStates(CommonStates const&) = delete; + CommonStates& operator= (CommonStates const&) = delete; + + virtual ~CommonStates(); + + // Blend states. + ID3D11BlendState* __cdecl Opaque() const; + ID3D11BlendState* __cdecl AlphaBlend() const; + ID3D11BlendState* __cdecl Additive() const; + ID3D11BlendState* __cdecl NonPremultiplied() const; + + // Depth stencil states. + ID3D11DepthStencilState* __cdecl DepthNone() const; + ID3D11DepthStencilState* __cdecl DepthDefault() const; + ID3D11DepthStencilState* __cdecl DepthRead() const; + + // Rasterizer states. + ID3D11RasterizerState* __cdecl CullNone() const; + ID3D11RasterizerState* __cdecl CullClockwise() const; + ID3D11RasterizerState* __cdecl CullCounterClockwise() const; + ID3D11RasterizerState* __cdecl Wireframe() const; + + // Sampler states. + ID3D11SamplerState* __cdecl PointWrap() const; + ID3D11SamplerState* __cdecl PointClamp() const; + ID3D11SamplerState* __cdecl LinearWrap() const; + ID3D11SamplerState* __cdecl LinearClamp() const; + ID3D11SamplerState* __cdecl AnisotropicWrap() const; + ID3D11SamplerState* __cdecl AnisotropicClamp() const; + + private: + // Private implementation. + class Impl; + + std::shared_ptr pImpl; + }; +} diff --git a/DirectXTK/Inc/DDSTextureLoader.h b/DirectXTK/Inc/DDSTextureLoader.h new file mode 100644 index 0000000..27e6b5e --- /dev/null +++ b/DirectXTK/Inc/DDSTextureLoader.h @@ -0,0 +1,158 @@ +//-------------------------------------------------------------------------------------- +// File: DDSTextureLoader.h +// +// Functions for loading a DDS texture and creating a Direct3D runtime resource for it +// +// Note these functions are useful as a light-weight runtime loader for DDS files. For +// a full-featured DDS file reader, writer, and texture processing pipeline see +// the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include + + +namespace DirectX +{ + enum DDS_ALPHA_MODE + { + DDS_ALPHA_MODE_UNKNOWN = 0, + DDS_ALPHA_MODE_STRAIGHT = 1, + DDS_ALPHA_MODE_PREMULTIPLIED = 2, + DDS_ALPHA_MODE_OPAQUE = 3, + DDS_ALPHA_MODE_CUSTOM = 4, + }; + + // Standard version + HRESULT __cdecl CreateDDSTextureFromMemory( + _In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr); + + HRESULT __cdecl CreateDDSTextureFromFile( + _In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr); + + // Standard version with optional auto-gen mipmap support + HRESULT __cdecl CreateDDSTextureFromMemory( + #if defined(_XBOX_ONE) && defined(_TITLE) + _In_ ID3D11DeviceX* d3dDevice, + _In_opt_ ID3D11DeviceContextX* d3dContext, + #else + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + #endif + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr); + + HRESULT __cdecl CreateDDSTextureFromFile( + #if defined(_XBOX_ONE) && defined(_TITLE) + _In_ ID3D11DeviceX* d3dDevice, + _In_opt_ ID3D11DeviceContextX* d3dContext, + #else + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + #endif + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr); + + // Extended version + HRESULT __cdecl CreateDDSTextureFromMemoryEx( + _In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr); + + HRESULT __cdecl CreateDDSTextureFromFileEx( + _In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr); + + // Extended version with optional auto-gen mipmap support + HRESULT __cdecl CreateDDSTextureFromMemoryEx( + #if defined(_XBOX_ONE) && defined(_TITLE) + _In_ ID3D11DeviceX* d3dDevice, + _In_opt_ ID3D11DeviceContextX* d3dContext, + #else + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + #endif + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr); + + HRESULT __cdecl CreateDDSTextureFromFileEx( + #if defined(_XBOX_ONE) && defined(_TITLE) + _In_ ID3D11DeviceX* d3dDevice, + _In_opt_ ID3D11DeviceContextX* d3dContext, + #else + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + #endif + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr); +} \ No newline at end of file diff --git a/DirectXTK/Inc/DirectXHelpers.h b/DirectXTK/Inc/DirectXHelpers.h new file mode 100644 index 0000000..bf5ffc1 --- /dev/null +++ b/DirectXTK/Inc/DirectXHelpers.h @@ -0,0 +1,150 @@ +//-------------------------------------------------------------------------------------- +// File: DirectXHelpers.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#if !defined(_XBOX_ONE) || !defined(_TITLE) +#pragma comment(lib,"dxguid.lib") +#endif +#endif + +#ifndef IID_GRAPHICS_PPV_ARGS +#define IID_GRAPHICS_PPV_ARGS(x) IID_PPV_ARGS(x) +#endif + +#include +#include + +// +// The core Direct3D headers provide the following helper C++ classes +// CD3D11_RECT +// CD3D11_BOX +// CD3D11_DEPTH_STENCIL_DESC +// CD3D11_BLEND_DESC, CD3D11_BLEND_DESC1 +// CD3D11_RASTERIZER_DESC, CD3D11_RASTERIZER_DESC1 +// CD3D11_BUFFER_DESC +// CD3D11_TEXTURE1D_DESC +// CD3D11_TEXTURE2D_DESC +// CD3D11_TEXTURE3D_DESC +// CD3D11_SHADER_RESOURCE_VIEW_DESC +// CD3D11_RENDER_TARGET_VIEW_DESC +// CD3D11_VIEWPORT +// CD3D11_DEPTH_STENCIL_VIEW_DESC +// CD3D11_UNORDERED_ACCESS_VIEW_DESC +// CD3D11_SAMPLER_DESC +// CD3D11_QUERY_DESC +// CD3D11_COUNTER_DESC +// + + +namespace DirectX +{ + // simliar to std::lock_guard for exception-safe Direct3D resource locking + class MapGuard : public D3D11_MAPPED_SUBRESOURCE + { + public: + MapGuard( _In_ ID3D11DeviceContext* context, + _In_ ID3D11Resource *resource, + _In_ UINT subresource, + _In_ D3D11_MAP mapType, + _In_ UINT mapFlags ) + : mContext(context), mResource(resource), mSubresource(subresource) + { + HRESULT hr = mContext->Map( resource, subresource, mapType, mapFlags, this ); + if (FAILED(hr)) + { + throw std::exception(); + } + } + + ~MapGuard() + { + mContext->Unmap( mResource, mSubresource ); + } + + uint8_t* get() const + { + return reinterpret_cast( pData ); + } + uint8_t* get(size_t slice) const + { + return reinterpret_cast( pData ) + ( slice * DepthPitch ); + } + + uint8_t* scanline(size_t row) const + { + return reinterpret_cast( pData ) + ( row * RowPitch ); + } + uint8_t* scanline(size_t slice, size_t row) const + { + return reinterpret_cast( pData ) + ( slice * DepthPitch ) + ( row * RowPitch ); + } + + private: + ID3D11DeviceContext* mContext; + ID3D11Resource* mResource; + UINT mSubresource; + + MapGuard(MapGuard const&); + MapGuard& operator= (MapGuard const&); + }; + + + // Helper sets a D3D resource name string (used by PIX and debug layer leak reporting). + template + inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_z_ const char (&name)[TNameLength]) + { + #if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) + #if defined(_XBOX_ONE) && defined(_TITLE) + wchar_t wname[MAX_PATH]; + int result = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, name, TNameLength, wname, MAX_PATH ); + if ( result > 0 ) + { + resource->SetName( wname ); + } + #else + resource->SetPrivateData(WKPDID_D3DDebugObjectName, TNameLength - 1, name); + #endif + #else + UNREFERENCED_PARAMETER(resource); + UNREFERENCED_PARAMETER(name); + #endif + } + + template + inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_z_ const wchar_t (&name)[TNameLength]) + { + #if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) + #if defined(_XBOX_ONE) && defined(_TITLE) + resource->SetName( name ); + #else + char aname[MAX_PATH]; + int result = WideCharToMultiByte( CP_ACP, 0, name, TNameLength, aname, MAX_PATH, nullptr, nullptr ); + if ( result > 0 ) + { + resource->SetPrivateData(WKPDID_D3DDebugObjectName, TNameLength - 1, aname); + } + #endif + #else + UNREFERENCED_PARAMETER(resource); + UNREFERENCED_PARAMETER(name); + #endif + } +} \ No newline at end of file diff --git a/DirectXTK/Inc/Effects.h b/DirectXTK/Inc/Effects.h new file mode 100644 index 0000000..67b87a6 --- /dev/null +++ b/DirectXTK/Inc/Effects.h @@ -0,0 +1,691 @@ +//-------------------------------------------------------------------------------------- +// File: Effects.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include +#include + + +namespace DirectX +{ + //---------------------------------------------------------------------------------- + // Abstract interface representing any effect which can be applied onto a D3D device context. + class IEffect + { + public: + virtual ~IEffect() { } + + virtual void __cdecl Apply(_In_ ID3D11DeviceContext* deviceContext) = 0; + + virtual void __cdecl GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) = 0; + }; + + + // Abstract interface for effects with world, view, and projection matrices. + class IEffectMatrices + { + public: + virtual ~IEffectMatrices() { } + + virtual void XM_CALLCONV SetWorld(FXMMATRIX value) = 0; + virtual void XM_CALLCONV SetView(FXMMATRIX value) = 0; + virtual void XM_CALLCONV SetProjection(FXMMATRIX value) = 0; + virtual void XM_CALLCONV SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection); + }; + + + // Abstract interface for effects which support directional lighting. + class IEffectLights + { + public: + virtual ~IEffectLights() { } + + virtual void __cdecl SetLightingEnabled(bool value) = 0; + virtual void __cdecl SetPerPixelLighting(bool value) = 0; + virtual void XM_CALLCONV SetAmbientLightColor(FXMVECTOR value) = 0; + + virtual void __cdecl SetLightEnabled(int whichLight, bool value) = 0; + virtual void XM_CALLCONV SetLightDirection(int whichLight, FXMVECTOR value) = 0; + virtual void XM_CALLCONV SetLightDiffuseColor(int whichLight, FXMVECTOR value) = 0; + virtual void XM_CALLCONV SetLightSpecularColor(int whichLight, FXMVECTOR value) = 0; + + virtual void __cdecl EnableDefaultLighting() = 0; + + static const int MaxDirectionalLights = 3; + }; + + + // Abstract interface for effects which support fog. + class IEffectFog + { + public: + virtual ~IEffectFog() { } + + virtual void __cdecl SetFogEnabled(bool value) = 0; + virtual void __cdecl SetFogStart(float value) = 0; + virtual void __cdecl SetFogEnd(float value) = 0; + virtual void XM_CALLCONV SetFogColor(FXMVECTOR value) = 0; + }; + + + // Abstract interface for effects which support skinning + class IEffectSkinning + { + public: + virtual ~IEffectSkinning() { } + + virtual void __cdecl SetWeightsPerVertex(int value) = 0; + virtual void __cdecl SetBoneTransforms(_In_reads_(count) XMMATRIX const* value, size_t count) = 0; + virtual void __cdecl ResetBoneTransforms() = 0; + + static const int MaxBones = 72; + }; + + + //---------------------------------------------------------------------------------- + // Built-in shader supports optional texture mapping, vertex coloring, directional lighting, and fog. + class BasicEffect : public IEffect, public IEffectMatrices, public IEffectLights, public IEffectFog + { + public: + explicit BasicEffect(_In_ ID3D11Device* device); + BasicEffect(BasicEffect&& moveFrom); + BasicEffect& operator= (BasicEffect&& moveFrom); + + BasicEffect(BasicEffect const&) = delete; + BasicEffect& operator= (BasicEffect const&) = delete; + + virtual ~BasicEffect(); + + // IEffect methods. + void __cdecl Apply(_In_ ID3D11DeviceContext* deviceContext) override; + + void __cdecl GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) override; + + // Camera settings. + void XM_CALLCONV SetWorld(FXMMATRIX value) override; + void XM_CALLCONV SetView(FXMMATRIX value) override; + void XM_CALLCONV SetProjection(FXMMATRIX value) override; + void XM_CALLCONV SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) override; + + // Material settings. + void XM_CALLCONV SetDiffuseColor(FXMVECTOR value); + void XM_CALLCONV SetEmissiveColor(FXMVECTOR value); + void XM_CALLCONV SetSpecularColor(FXMVECTOR value); + void __cdecl SetSpecularPower(float value); + void __cdecl DisableSpecular(); + void __cdecl SetAlpha(float value); + void XM_CALLCONV SetColorAndAlpha(FXMVECTOR value); + + // Light settings. + void __cdecl SetLightingEnabled(bool value) override; + void __cdecl SetPerPixelLighting(bool value) override; + void XM_CALLCONV SetAmbientLightColor(FXMVECTOR value) override; + + void __cdecl SetLightEnabled(int whichLight, bool value) override; + void XM_CALLCONV SetLightDirection(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightDiffuseColor(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightSpecularColor(int whichLight, FXMVECTOR value) override; + + void __cdecl EnableDefaultLighting() override; + + // Fog settings. + void __cdecl SetFogEnabled(bool value) override; + void __cdecl SetFogStart(float value) override; + void __cdecl SetFogEnd(float value) override; + void XM_CALLCONV SetFogColor(FXMVECTOR value) override; + + // Vertex color setting. + void __cdecl SetVertexColorEnabled(bool value); + + // Texture setting. + void __cdecl SetTextureEnabled(bool value); + void __cdecl SetTexture(_In_opt_ ID3D11ShaderResourceView* value); + + // Normal compression settings. + void __cdecl SetBiasedVertexNormals(bool value); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; + + + + // Built-in shader supports per-pixel alpha testing. + class AlphaTestEffect : public IEffect, public IEffectMatrices, public IEffectFog + { + public: + explicit AlphaTestEffect(_In_ ID3D11Device* device); + AlphaTestEffect(AlphaTestEffect&& moveFrom); + AlphaTestEffect& operator= (AlphaTestEffect&& moveFrom); + + AlphaTestEffect(AlphaTestEffect const&) = delete; + AlphaTestEffect& operator= (AlphaTestEffect const&) = delete; + + virtual ~AlphaTestEffect(); + + // IEffect methods. + void __cdecl Apply(_In_ ID3D11DeviceContext* deviceContext) override; + + void __cdecl GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) override; + + // Camera settings. + void XM_CALLCONV SetWorld(FXMMATRIX value) override; + void XM_CALLCONV SetView(FXMMATRIX value) override; + void XM_CALLCONV SetProjection(FXMMATRIX value) override; + void XM_CALLCONV SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) override; + + // Material settings. + void XM_CALLCONV SetDiffuseColor(FXMVECTOR value); + void __cdecl SetAlpha(float value); + void XM_CALLCONV SetColorAndAlpha(FXMVECTOR value); + + // Fog settings. + void __cdecl SetFogEnabled(bool value) override; + void __cdecl SetFogStart(float value) override; + void __cdecl SetFogEnd(float value) override; + void XM_CALLCONV SetFogColor(FXMVECTOR value) override; + + // Vertex color setting. + void __cdecl SetVertexColorEnabled(bool value); + + // Texture setting. + void __cdecl SetTexture(_In_opt_ ID3D11ShaderResourceView* value); + + // Alpha test settings. + void __cdecl SetAlphaFunction(D3D11_COMPARISON_FUNC value); + void __cdecl SetReferenceAlpha(int value); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; + + + + // Built-in shader supports two layer multitexturing (eg. for lightmaps or detail textures). + class DualTextureEffect : public IEffect, public IEffectMatrices, public IEffectFog + { + public: + explicit DualTextureEffect(_In_ ID3D11Device* device); + DualTextureEffect(DualTextureEffect&& moveFrom); + DualTextureEffect& operator= (DualTextureEffect&& moveFrom); + + DualTextureEffect(DualTextureEffect const&) = delete; + DualTextureEffect& operator= (DualTextureEffect const&) = delete; + + ~DualTextureEffect(); + + // IEffect methods. + void __cdecl Apply(_In_ ID3D11DeviceContext* deviceContext) override; + + void __cdecl GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) override; + + // Camera settings. + void XM_CALLCONV SetWorld(FXMMATRIX value) override; + void XM_CALLCONV SetView(FXMMATRIX value) override; + void XM_CALLCONV SetProjection(FXMMATRIX value) override; + void XM_CALLCONV SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) override; + + // Material settings. + void XM_CALLCONV SetDiffuseColor(FXMVECTOR value); + void __cdecl SetAlpha(float value); + void XM_CALLCONV SetColorAndAlpha(FXMVECTOR value); + + // Fog settings. + void __cdecl SetFogEnabled(bool value) override; + void __cdecl SetFogStart(float value) override; + void __cdecl SetFogEnd(float value) override; + void XM_CALLCONV SetFogColor(FXMVECTOR value) override; + + // Vertex color setting. + void __cdecl SetVertexColorEnabled(bool value); + + // Texture settings. + void __cdecl SetTexture(_In_opt_ ID3D11ShaderResourceView* value); + void __cdecl SetTexture2(_In_opt_ ID3D11ShaderResourceView* value); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; + + + + // Built-in shader supports cubic environment mapping. + class EnvironmentMapEffect : public IEffect, public IEffectMatrices, public IEffectLights, public IEffectFog + { + public: + explicit EnvironmentMapEffect(_In_ ID3D11Device* device); + EnvironmentMapEffect(EnvironmentMapEffect&& moveFrom); + EnvironmentMapEffect& operator= (EnvironmentMapEffect&& moveFrom); + + EnvironmentMapEffect(EnvironmentMapEffect const&) = delete; + EnvironmentMapEffect& operator= (EnvironmentMapEffect const&) = delete; + + virtual ~EnvironmentMapEffect(); + + // IEffect methods. + void __cdecl Apply(_In_ ID3D11DeviceContext* deviceContext) override; + + void __cdecl GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) override; + + // Camera settings. + void XM_CALLCONV SetWorld(FXMMATRIX value) override; + void XM_CALLCONV SetView(FXMMATRIX value) override; + void XM_CALLCONV SetProjection(FXMMATRIX value) override; + void XM_CALLCONV SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) override; + + // Material settings. + void XM_CALLCONV SetDiffuseColor(FXMVECTOR value); + void XM_CALLCONV SetEmissiveColor(FXMVECTOR value); + void __cdecl SetAlpha(float value); + void XM_CALLCONV SetColorAndAlpha(FXMVECTOR value); + + // Light settings. + void XM_CALLCONV SetAmbientLightColor(FXMVECTOR value) override; + + void __cdecl SetPerPixelLighting(bool value) override; + void __cdecl SetLightEnabled(int whichLight, bool value) override; + void XM_CALLCONV SetLightDirection(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightDiffuseColor(int whichLight, FXMVECTOR value) override; + + void __cdecl EnableDefaultLighting() override; + + // Fog settings. + void __cdecl SetFogEnabled(bool value) override; + void __cdecl SetFogStart(float value) override; + void __cdecl SetFogEnd(float value) override; + void XM_CALLCONV SetFogColor(FXMVECTOR value) override; + + // Texture setting. + void __cdecl SetTexture(_In_opt_ ID3D11ShaderResourceView* value); + + // Environment map settings. + void __cdecl SetEnvironmentMap(_In_opt_ ID3D11ShaderResourceView* value); + void __cdecl SetEnvironmentMapAmount(float value); + void XM_CALLCONV SetEnvironmentMapSpecular(FXMVECTOR value); + void __cdecl SetFresnelFactor(float value); + + // Normal compression settings. + void __cdecl SetBiasedVertexNormals(bool value); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + // Unsupported interface methods. + void __cdecl SetLightingEnabled(bool value) override; + void XM_CALLCONV SetLightSpecularColor(int whichLight, FXMVECTOR value) override; + }; + + + + // Built-in shader supports skinned animation. + class SkinnedEffect : public IEffect, public IEffectMatrices, public IEffectLights, public IEffectFog, public IEffectSkinning + { + public: + explicit SkinnedEffect(_In_ ID3D11Device* device); + SkinnedEffect(SkinnedEffect&& moveFrom); + SkinnedEffect& operator= (SkinnedEffect&& moveFrom); + + SkinnedEffect(SkinnedEffect const&) = delete; + SkinnedEffect& operator= (SkinnedEffect const&) = delete; + + virtual ~SkinnedEffect(); + + // IEffect methods. + void __cdecl Apply(_In_ ID3D11DeviceContext* deviceContext) override; + + void __cdecl GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) override; + + // Camera settings. + void XM_CALLCONV SetWorld(FXMMATRIX value) override; + void XM_CALLCONV SetView(FXMMATRIX value) override; + void XM_CALLCONV SetProjection(FXMMATRIX value) override; + void XM_CALLCONV SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) override; + + // Material settings. + void XM_CALLCONV SetDiffuseColor(FXMVECTOR value); + void XM_CALLCONV SetEmissiveColor(FXMVECTOR value); + void XM_CALLCONV SetSpecularColor(FXMVECTOR value); + void __cdecl SetSpecularPower(float value); + void __cdecl DisableSpecular(); + void __cdecl SetAlpha(float value); + void XM_CALLCONV SetColorAndAlpha(FXMVECTOR value); + + // Light settings. + void __cdecl SetPerPixelLighting(bool value) override; + void XM_CALLCONV SetAmbientLightColor(FXMVECTOR value) override; + + void __cdecl SetLightEnabled(int whichLight, bool value) override; + void XM_CALLCONV SetLightDirection(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightDiffuseColor(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightSpecularColor(int whichLight, FXMVECTOR value) override; + + void __cdecl EnableDefaultLighting() override; + + // Fog settings. + void __cdecl SetFogEnabled(bool value) override; + void __cdecl SetFogStart(float value) override; + void __cdecl SetFogEnd(float value) override; + void XM_CALLCONV SetFogColor(FXMVECTOR value) override; + + // Texture setting. + void __cdecl SetTexture(_In_opt_ ID3D11ShaderResourceView* value); + + // Animation settings. + void __cdecl SetWeightsPerVertex(int value) override; + void __cdecl SetBoneTransforms(_In_reads_(count) XMMATRIX const* value, size_t count) override; + void __cdecl ResetBoneTransforms() override; + + // Normal compression settings. + void __cdecl SetBiasedVertexNormals(bool value); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + // Unsupported interface method. + void __cdecl SetLightingEnabled(bool value) override; + }; + + + + //---------------------------------------------------------------------------------- + // Built-in effect for Visual Studio Shader Designer (DGSL) shaders + class DGSLEffect : public IEffect, public IEffectMatrices, public IEffectLights, public IEffectSkinning + { + public: + explicit DGSLEffect( _In_ ID3D11Device* device, _In_opt_ ID3D11PixelShader* pixelShader = nullptr, + _In_ bool enableSkinning = false ); + DGSLEffect(DGSLEffect&& moveFrom); + DGSLEffect& operator= (DGSLEffect&& moveFrom); + + DGSLEffect(DGSLEffect const&) = delete; + DGSLEffect& operator= (DGSLEffect const&) = delete; + + virtual ~DGSLEffect(); + + // IEffect methods. + void __cdecl Apply(_In_ ID3D11DeviceContext* deviceContext) override; + + void __cdecl GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) override; + + // Camera settings. + void XM_CALLCONV SetWorld(FXMMATRIX value) override; + void XM_CALLCONV SetView(FXMMATRIX value) override; + void XM_CALLCONV SetProjection(FXMMATRIX value) override; + void XM_CALLCONV SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) override; + + // Material settings. + void XM_CALLCONV SetAmbientColor(FXMVECTOR value); + void XM_CALLCONV SetDiffuseColor(FXMVECTOR value); + void XM_CALLCONV SetEmissiveColor(FXMVECTOR value); + void XM_CALLCONV SetSpecularColor(FXMVECTOR value); + void __cdecl SetSpecularPower(float value); + void __cdecl DisableSpecular(); + void __cdecl SetAlpha(float value); + void XM_CALLCONV SetColorAndAlpha(FXMVECTOR value); + + // Additional settings. + void XM_CALLCONV SetUVTransform(FXMMATRIX value); + void __cdecl SetViewport( float width, float height ); + void __cdecl SetTime( float time ); + void __cdecl SetAlphaDiscardEnable(bool value); + + // Light settings. + void __cdecl SetLightingEnabled(bool value) override; + void XM_CALLCONV SetAmbientLightColor(FXMVECTOR value) override; + + void __cdecl SetLightEnabled(int whichLight, bool value) override; + void XM_CALLCONV SetLightDirection(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightDiffuseColor(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightSpecularColor(int whichLight, FXMVECTOR value) override; + + void __cdecl EnableDefaultLighting() override; + + static const int MaxDirectionalLights = 4; + + // Vertex color setting. + void __cdecl SetVertexColorEnabled(bool value); + + // Texture settings. + void __cdecl SetTextureEnabled(bool value); + void __cdecl SetTexture(_In_opt_ ID3D11ShaderResourceView* value); + void __cdecl SetTexture(int whichTexture, _In_opt_ ID3D11ShaderResourceView* value); + + static const int MaxTextures = 8; + + // Animation setting. + void __cdecl SetWeightsPerVertex(int value) override; + void __cdecl SetBoneTransforms(_In_reads_(count) XMMATRIX const* value, size_t count) override; + void __cdecl ResetBoneTransforms() override; + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + // Unsupported interface methods. + void __cdecl SetPerPixelLighting(bool value) override; + }; + + //---------------------------------------------------------------------------------- + // Built-in shader extends BasicEffect with normal maps and optional specular maps + class NormalMapEffect : public IEffect, public IEffectMatrices, public IEffectLights, public IEffectFog + { + public: + explicit NormalMapEffect(_In_ ID3D11Device* device); + NormalMapEffect(NormalMapEffect&& moveFrom); + NormalMapEffect& operator= (NormalMapEffect&& moveFrom); + + NormalMapEffect(NormalMapEffect const&) = delete; + NormalMapEffect& operator= (NormalMapEffect const&) = delete; + + virtual ~NormalMapEffect(); + + // IEffect methods. + void __cdecl Apply(_In_ ID3D11DeviceContext* deviceContext) override; + + void __cdecl GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) override; + + // Camera settings. + void XM_CALLCONV SetWorld(FXMMATRIX value) override; + void XM_CALLCONV SetView(FXMMATRIX value) override; + void XM_CALLCONV SetProjection(FXMMATRIX value) override; + void XM_CALLCONV SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) override; + + // Material settings. + void XM_CALLCONV SetDiffuseColor(FXMVECTOR value); + void XM_CALLCONV SetEmissiveColor(FXMVECTOR value); + void XM_CALLCONV SetSpecularColor(FXMVECTOR value); + void __cdecl SetSpecularPower(float value); + void __cdecl DisableSpecular(); + void __cdecl SetAlpha(float value); + void XM_CALLCONV SetColorAndAlpha(FXMVECTOR value); + + // Light settings. + void XM_CALLCONV SetAmbientLightColor(FXMVECTOR value) override; + + void __cdecl SetLightEnabled(int whichLight, bool value) override; + void XM_CALLCONV SetLightDirection(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightDiffuseColor(int whichLight, FXMVECTOR value) override; + void XM_CALLCONV SetLightSpecularColor(int whichLight, FXMVECTOR value) override; + + void __cdecl EnableDefaultLighting() override; + + // Fog settings. + void __cdecl SetFogEnabled(bool value) override; + void __cdecl SetFogStart(float value) override; + void __cdecl SetFogEnd(float value) override; + void XM_CALLCONV SetFogColor(FXMVECTOR value) override; + + // Vertex color setting. + void __cdecl SetVertexColorEnabled(bool value); + + // Texture setting - albedo, normal and specular intensity + void __cdecl SetTexture(_In_opt_ ID3D11ShaderResourceView* value); + void __cdecl SetNormalTexture(_In_opt_ ID3D11ShaderResourceView* value); + void __cdecl SetSpecularTexture(_In_opt_ ID3D11ShaderResourceView* value); + + // Normal compression settings. + void __cdecl SetBiasedVertexNormalsAndTangents(bool value); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + // Unsupported interface methods. + void __cdecl SetLightingEnabled(bool value) override; + void __cdecl SetPerPixelLighting(bool value) override; + }; + + //---------------------------------------------------------------------------------- + // Abstract interface to factory for sharing effects and texture resources + class IEffectFactory + { + public: + virtual ~IEffectFactory() {} + + struct EffectInfo + { + const wchar_t* name; + bool perVertexColor; + bool enableSkinning; + bool enableDualTexture; + bool enableNormalMaps; + bool biasedVertexNormals; + float specularPower; + float alpha; + DirectX::XMFLOAT3 ambientColor; + DirectX::XMFLOAT3 diffuseColor; + DirectX::XMFLOAT3 specularColor; + DirectX::XMFLOAT3 emissiveColor; + const wchar_t* diffuseTexture; + const wchar_t* specularTexture; + const wchar_t* normalTexture; + + EffectInfo() { memset( this, 0, sizeof(EffectInfo) ); }; + }; + + virtual std::shared_ptr __cdecl CreateEffect( _In_ const EffectInfo& info, _In_opt_ ID3D11DeviceContext* deviceContext ) = 0; + + virtual void __cdecl CreateTexture( _In_z_ const wchar_t* name, _In_opt_ ID3D11DeviceContext* deviceContext, _Outptr_ ID3D11ShaderResourceView** textureView ) = 0; + }; + + + // Factory for sharing effects and texture resources + class EffectFactory : public IEffectFactory + { + public: + explicit EffectFactory(_In_ ID3D11Device* device); + EffectFactory(EffectFactory&& moveFrom); + EffectFactory& operator= (EffectFactory&& moveFrom); + + EffectFactory(EffectFactory const&) = delete; + EffectFactory& operator= (EffectFactory const&) = delete; + + virtual ~EffectFactory(); + + // IEffectFactory methods. + virtual std::shared_ptr __cdecl CreateEffect( _In_ const EffectInfo& info, _In_opt_ ID3D11DeviceContext* deviceContext ) override; + virtual void __cdecl CreateTexture( _In_z_ const wchar_t* name, _In_opt_ ID3D11DeviceContext* deviceContext, _Outptr_ ID3D11ShaderResourceView** textureView ) override; + + // Settings. + void __cdecl ReleaseCache(); + + void __cdecl SetSharing( bool enabled ); + + void __cdecl EnableNormalMapEffect( bool enabled ); + void __cdecl EnableForceSRGB( bool forceSRGB ); + + void __cdecl SetDirectory( _In_opt_z_ const wchar_t* path ); + + private: + // Private implementation. + class Impl; + + std::shared_ptr pImpl; + }; + + + // Factory for sharing Visual Studio Shader Designer (DGSL) shaders and texture resources + class DGSLEffectFactory : public IEffectFactory + { + public: + explicit DGSLEffectFactory(_In_ ID3D11Device* device); + DGSLEffectFactory(DGSLEffectFactory&& moveFrom); + DGSLEffectFactory& operator= (DGSLEffectFactory&& moveFrom); + + DGSLEffectFactory(DGSLEffectFactory const&) = delete; + DGSLEffectFactory& operator= (DGSLEffectFactory const&) = delete; + + virtual ~DGSLEffectFactory(); + + // IEffectFactory methods. + virtual std::shared_ptr __cdecl CreateEffect( _In_ const EffectInfo& info, _In_opt_ ID3D11DeviceContext* deviceContext ) override; + virtual void __cdecl CreateTexture( _In_z_ const wchar_t* name, _In_opt_ ID3D11DeviceContext* deviceContext, _Outptr_ ID3D11ShaderResourceView** textureView ) override; + + // DGSL methods. + struct DGSLEffectInfo : public EffectInfo + { + static const int BaseTextureOffset = 3; + + const wchar_t* textures[DGSLEffect::MaxTextures - BaseTextureOffset]; + const wchar_t* pixelShader; + + DGSLEffectInfo() { memset( this, 0, sizeof(DGSLEffectInfo) ); }; + }; + + virtual std::shared_ptr __cdecl CreateDGSLEffect( _In_ const DGSLEffectInfo& info, _In_opt_ ID3D11DeviceContext* deviceContext ); + + virtual void __cdecl CreatePixelShader( _In_z_ const wchar_t* shader, _Outptr_ ID3D11PixelShader** pixelShader ); + + // Settings. + void __cdecl ReleaseCache(); + + void __cdecl SetSharing( bool enabled ); + + void __cdecl EnableForceSRGB( bool forceSRGB ); + + void __cdecl SetDirectory( _In_opt_z_ const wchar_t* path ); + + private: + // Private implementation. + class Impl; + + std::shared_ptr pImpl; + }; + +} diff --git a/DirectXTK/Inc/GamePad.h b/DirectXTK/Inc/GamePad.h new file mode 100644 index 0000000..f96d116 --- /dev/null +++ b/DirectXTK/Inc/GamePad.h @@ -0,0 +1,272 @@ +//-------------------------------------------------------------------------------------- +// File: GamePad.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if (_WIN32_WINNT < 0x0A00 /*_WIN32_WINNT_WIN10*/) +#ifndef _XBOX_ONE +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP) +#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/ ) +#pragma comment(lib,"xinput.lib") +#else +#pragma comment(lib,"xinput9_1_0.lib") +#endif +#endif +#endif +#endif + +#include +#include + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) +#include +#endif + + +namespace DirectX +{ + class GamePad + { + public: + GamePad(); + GamePad(GamePad&& moveFrom); + GamePad& operator= (GamePad&& moveFrom); + + GamePad(GamePad const&) = delete; + GamePad& operator=(GamePad const&) = delete; + + virtual ~GamePad(); + +#if (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/ ) || defined(_XBOX_ONE) + static const int MAX_PLAYER_COUNT = 8; +#else + static const int MAX_PLAYER_COUNT = 4; +#endif + + enum DeadZone + { + DEAD_ZONE_INDEPENDENT_AXES = 0, + DEAD_ZONE_CIRCULAR, + DEAD_ZONE_NONE, + }; + + struct Buttons + { + bool a; + bool b; + bool x; + bool y; + bool leftStick; + bool rightStick; + bool leftShoulder; + bool rightShoulder; + union + { + bool back; + bool view; + }; + union + { + bool start; + bool menu; + }; + }; + + struct DPad + { + bool up; + bool down; + bool right; + bool left; + }; + + struct ThumbSticks + { + float leftX; + float leftY; + float rightX; + float rightY; + }; + + struct Triggers + { + float left; + float right; + }; + + struct State + { + bool connected; + uint64_t packet; + Buttons buttons; + DPad dpad; + ThumbSticks thumbSticks; + Triggers triggers; + + bool __cdecl IsConnected() const { return connected; } + + // Is the button pressed currently? + bool __cdecl IsAPressed() const { return buttons.a; } + bool __cdecl IsBPressed() const { return buttons.b; } + bool __cdecl IsXPressed() const { return buttons.x; } + bool __cdecl IsYPressed() const { return buttons.y; } + + bool __cdecl IsLeftStickPressed() const { return buttons.leftStick; } + bool __cdecl IsRightStickPressed() const { return buttons.rightStick; } + + bool __cdecl IsLeftShoulderPressed() const { return buttons.leftShoulder; } + bool __cdecl IsRightShoulderPressed() const { return buttons.rightShoulder; } + + bool __cdecl IsBackPressed() const { return buttons.back; } + bool __cdecl IsViewPressed() const { return buttons.view; } + bool __cdecl IsStartPressed() const { return buttons.start; } + bool __cdecl IsMenuPressed() const { return buttons.menu; } + + bool __cdecl IsDPadDownPressed() const { return dpad.down; }; + bool __cdecl IsDPadUpPressed() const { return dpad.up; }; + bool __cdecl IsDPadLeftPressed() const { return dpad.left; }; + bool __cdecl IsDPadRightPressed() const { return dpad.right; }; + + bool __cdecl IsLeftThumbStickUp() const { return (thumbSticks.leftY > 0.5f) != 0; } + bool __cdecl IsLeftThumbStickDown() const { return (thumbSticks.leftY < -0.5f) != 0; } + bool __cdecl IsLeftThumbStickLeft() const { return (thumbSticks.leftX < -0.5f) != 0; } + bool __cdecl IsLeftThumbStickRight() const { return (thumbSticks.leftX > 0.5f) != 0; } + + bool __cdecl IsRightThumbStickUp() const { return (thumbSticks.rightY > 0.5f ) != 0; } + bool __cdecl IsRightThumbStickDown() const { return (thumbSticks.rightY < -0.5f) != 0; } + bool __cdecl IsRightThumbStickLeft() const { return (thumbSticks.rightX < -0.5f) != 0; } + bool __cdecl IsRightThumbStickRight() const { return (thumbSticks.rightX > 0.5f) != 0; } + + bool __cdecl IsLeftTriggerPressed() const { return (triggers.left > 0.5f) != 0; } + bool __cdecl IsRightTriggerPressed() const { return (triggers.right > 0.5f) != 0; } + }; + + struct Capabilities + { + enum Type + { + UNKNOWN = 0, + GAMEPAD, + WHEEL, + ARCADE_STICK, + FLIGHT_STICK, + DANCE_PAD, + GUITAR, + GUITAR_ALTERNATE, + DRUM_KIT, + GUITAR_BASS = 11, + ARCADE_PAD = 19, + }; + + bool connected; + Type gamepadType; +#if (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/) + std::wstring id; +#else + uint64_t id; +#endif + + bool __cdecl IsConnected() const { return connected; } + }; + + class ButtonStateTracker + { + public: + enum ButtonState + { + UP = 0, // Button is up + HELD = 1, // Button is held down + RELEASED = 2, // Button was just released + PRESSED = 3, // Buton was just pressed + }; + + ButtonState a; + ButtonState b; + ButtonState x; + ButtonState y; + + ButtonState leftStick; + ButtonState rightStick; + + ButtonState leftShoulder; + ButtonState rightShoulder; + + union + { + ButtonState back; + ButtonState view; + }; + + union + { + ButtonState start; + ButtonState menu; + }; + + ButtonState dpadUp; + ButtonState dpadDown; + ButtonState dpadLeft; + ButtonState dpadRight; + + ButtonState leftStickUp; + ButtonState leftStickDown; + ButtonState leftStickLeft; + ButtonState leftStickRight; + + ButtonState rightStickUp; + ButtonState rightStickDown; + ButtonState rightStickLeft; + ButtonState rightStickRight; + + ButtonState leftTrigger; + ButtonState rightTrigger; + + ButtonStateTracker() { Reset(); } + + void __cdecl Update( const State& state ); + + void __cdecl Reset(); + + State __cdecl GetLastState() const { return lastState; } + + private: + State lastState; + }; + + // Retrieve the current state of the gamepad of the associated player index + State __cdecl GetState(int player, DeadZone deadZoneMode = DEAD_ZONE_INDEPENDENT_AXES); + + // Retrieve the current capabilities of the gamepad of the associated player index + Capabilities __cdecl GetCapabilities(int player); + + // Set the vibration motor speeds of the gamepad + bool __cdecl SetVibration( int player, float leftMotor, float rightMotor, float leftTrigger = 0.f, float rightTrigger = 0.f ); + + // Handle suspending/resuming + void __cdecl Suspend(); + void __cdecl Resume(); + +#if (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/ ) || defined(_XBOX_ONE) + void __cdecl RegisterEvents(void* ctrlChanged, void* userChanged); +#endif + + // Singleton + static GamePad& __cdecl Get(); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; +} diff --git a/DirectXTK/Inc/GeometricPrimitive.h b/DirectXTK/Inc/GeometricPrimitive.h new file mode 100644 index 0000000..a658933 --- /dev/null +++ b/DirectXTK/Inc/GeometricPrimitive.h @@ -0,0 +1,83 @@ +//-------------------------------------------------------------------------------------- +// File: GeometricPrimitive.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include "VertexTypes.h" + +#include +#include +#include +#include + + +namespace DirectX +{ + class IEffect; + + class GeometricPrimitive + { + public: + GeometricPrimitive(GeometricPrimitive const&) = delete; + GeometricPrimitive& operator= (GeometricPrimitive const&) = delete; + + virtual ~GeometricPrimitive(); + + // Factory methods. + static std::unique_ptr __cdecl CreateCube (_In_ ID3D11DeviceContext* deviceContext, float size = 1, bool rhcoords = true); + static std::unique_ptr __cdecl CreateBox (_In_ ID3D11DeviceContext* deviceContext, const XMFLOAT3& size, bool rhcoords = true, bool invertn = false); + static std::unique_ptr __cdecl CreateSphere (_In_ ID3D11DeviceContext* deviceContext, float diameter = 1, size_t tessellation = 16, bool rhcoords = true, bool invertn = false); + static std::unique_ptr __cdecl CreateGeoSphere (_In_ ID3D11DeviceContext* deviceContext, float diameter = 1, size_t tessellation = 3, bool rhcoords = true); + static std::unique_ptr __cdecl CreateCylinder (_In_ ID3D11DeviceContext* deviceContext, float height = 1, float diameter = 1, size_t tessellation = 32, bool rhcoords = true); + static std::unique_ptr __cdecl CreateCone (_In_ ID3D11DeviceContext* deviceContext, float diameter = 1, float height = 1, size_t tessellation = 32, bool rhcoords = true); + static std::unique_ptr __cdecl CreateTorus (_In_ ID3D11DeviceContext* deviceContext, float diameter = 1, float thickness = 0.333f, size_t tessellation = 32, bool rhcoords = true); + static std::unique_ptr __cdecl CreateTetrahedron (_In_ ID3D11DeviceContext* deviceContext, float size = 1, bool rhcoords = true); + static std::unique_ptr __cdecl CreateOctahedron (_In_ ID3D11DeviceContext* deviceContext, float size = 1, bool rhcoords = true); + static std::unique_ptr __cdecl CreateDodecahedron (_In_ ID3D11DeviceContext* deviceContext, float size = 1, bool rhcoords = true); + static std::unique_ptr __cdecl CreateIcosahedron (_In_ ID3D11DeviceContext* deviceContext, float size = 1, bool rhcoords = true); + static std::unique_ptr __cdecl CreateTeapot (_In_ ID3D11DeviceContext* deviceContext, float size = 1, size_t tessellation = 8, bool rhcoords = true); + static std::unique_ptr __cdecl CreateCustom (_In_ ID3D11DeviceContext* deviceContext, const std::vector& vertices, const std::vector& indices); + + static void __cdecl CreateCube (std::vector& vertices, std::vector& indices, float size = 1, bool rhcoords = true); + static void __cdecl CreateBox (std::vector& vertices, std::vector& indices, const XMFLOAT3& size, bool rhcoords = true, bool invertn = false); + static void __cdecl CreateSphere (std::vector& vertices, std::vector& indices, float diameter = 1, size_t tessellation = 16, bool rhcoords = true, bool invertn = false); + static void __cdecl CreateGeoSphere (std::vector& vertices, std::vector& indices, float diameter = 1, size_t tessellation = 3, bool rhcoords = true); + static void __cdecl CreateCylinder (std::vector& vertices, std::vector& indices, float height = 1, float diameter = 1, size_t tessellation = 32, bool rhcoords = true); + static void __cdecl CreateCone (std::vector& vertices, std::vector& indices, float diameter = 1, float height = 1, size_t tessellation = 32, bool rhcoords = true); + static void __cdecl CreateTorus (std::vector& vertices, std::vector& indices, float diameter = 1, float thickness = 0.333f, size_t tessellation = 32, bool rhcoords = true); + static void __cdecl CreateTetrahedron (std::vector& vertices, std::vector& indices, float size = 1, bool rhcoords = true); + static void __cdecl CreateOctahedron (std::vector& vertices, std::vector& indices, float size = 1, bool rhcoords = true); + static void __cdecl CreateDodecahedron (std::vector& vertices, std::vector& indices, float size = 1, bool rhcoords = true); + static void __cdecl CreateIcosahedron (std::vector& vertices, std::vector& indices, float size = 1, bool rhcoords = true); + static void __cdecl CreateTeapot (std::vector& vertices, std::vector& indices, float size = 1, size_t tessellation = 8, bool rhcoords = true); + + // Draw the primitive. + void XM_CALLCONV Draw(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection, FXMVECTOR color = Colors::White, _In_opt_ ID3D11ShaderResourceView* texture = nullptr, bool wireframe = false, + _In_opt_ std::function setCustomState = nullptr ) const; + + // Draw the primitive using a custom effect. + void __cdecl Draw( _In_ IEffect* effect, _In_ ID3D11InputLayout* inputLayout, bool alpha = false, bool wireframe = false, + _In_opt_ std::function setCustomState = nullptr ) const; + + // Create input layout for drawing with a custom effect. + void __cdecl CreateInputLayout( _In_ IEffect* effect, _Outptr_ ID3D11InputLayout** inputLayout ) const; + + private: + GeometricPrimitive(); + + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; +} diff --git a/DirectXTK/Inc/GraphicsMemory.h b/DirectXTK/Inc/GraphicsMemory.h new file mode 100644 index 0000000..3c0e419 --- /dev/null +++ b/DirectXTK/Inc/GraphicsMemory.h @@ -0,0 +1,56 @@ +//-------------------------------------------------------------------------------------- +// File: GraphicsMemory.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include + + +namespace DirectX +{ + class GraphicsMemory + { + public: + #if defined(_XBOX_ONE) && defined(_TITLE) + GraphicsMemory(_In_ ID3D11DeviceX* device, UINT backBufferCount = 2); + #else + GraphicsMemory(_In_ ID3D11Device* device, UINT backBufferCount = 2); + #endif + GraphicsMemory(GraphicsMemory&& moveFrom); + GraphicsMemory& operator= (GraphicsMemory&& moveFrom); + + GraphicsMemory(GraphicsMemory const&) = delete; + GraphicsMemory& operator=(GraphicsMemory const&) = delete; + + virtual ~GraphicsMemory(); + + void* __cdecl Allocate(_In_opt_ ID3D11DeviceContext* context, size_t size, int alignment); + + void __cdecl Commit(); + + // Singleton + static GraphicsMemory& __cdecl Get(); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; +} diff --git a/DirectXTK/Inc/Keyboard.h b/DirectXTK/Inc/Keyboard.h new file mode 100644 index 0000000..9c5d600 --- /dev/null +++ b/DirectXTK/Inc/Keyboard.h @@ -0,0 +1,482 @@ +//-------------------------------------------------------------------------------------- +// File: Keyboard.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include +#include + +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) +namespace ABI { namespace Windows { namespace UI { namespace Core { struct ICoreWindow; } } } } +#endif + + +namespace DirectX +{ + class Keyboard + { + public: + Keyboard(); + Keyboard(Keyboard&& moveFrom); + Keyboard& operator= (Keyboard&& moveFrom); + + Keyboard(Keyboard const&) = delete; + Keyboard& operator=(Keyboard const&) = delete; + + virtual ~Keyboard(); + + enum Keys + { + None = 0, + + Back = 0x8, + Tab = 0x9, + + Enter = 0xd, + + Pause = 0x13, + CapsLock = 0x14, + Kana = 0x15, + + Kanji = 0x19, + + Escape = 0x1b, + ImeConvert = 0x1c, + ImeNoConvert = 0x1d, + + Space = 0x20, + PageUp = 0x21, + PageDown = 0x22, + End = 0x23, + Home = 0x24, + Left = 0x25, + Up = 0x26, + Right = 0x27, + Down = 0x28, + Select = 0x29, + Print = 0x2a, + Execute = 0x2b, + PrintScreen = 0x2c, + Insert = 0x2d, + Delete = 0x2e, + Help = 0x2f, + D0 = 0x30, + D1 = 0x31, + D2 = 0x32, + D3 = 0x33, + D4 = 0x34, + D5 = 0x35, + D6 = 0x36, + D7 = 0x37, + D8 = 0x38, + D9 = 0x39, + + A = 0x41, + B = 0x42, + C = 0x43, + D = 0x44, + E = 0x45, + F = 0x46, + G = 0x47, + H = 0x48, + I = 0x49, + J = 0x4a, + K = 0x4b, + L = 0x4c, + M = 0x4d, + N = 0x4e, + O = 0x4f, + P = 0x50, + Q = 0x51, + R = 0x52, + S = 0x53, + T = 0x54, + U = 0x55, + V = 0x56, + W = 0x57, + X = 0x58, + Y = 0x59, + Z = 0x5a, + LeftWindows = 0x5b, + RightWindows = 0x5c, + Apps = 0x5d, + + Sleep = 0x5f, + NumPad0 = 0x60, + NumPad1 = 0x61, + NumPad2 = 0x62, + NumPad3 = 0x63, + NumPad4 = 0x64, + NumPad5 = 0x65, + NumPad6 = 0x66, + NumPad7 = 0x67, + NumPad8 = 0x68, + NumPad9 = 0x69, + Multiply = 0x6a, + Add = 0x6b, + Separator = 0x6c, + Subtract = 0x6d, + + Decimal = 0x6e, + Divide = 0x6f, + F1 = 0x70, + F2 = 0x71, + F3 = 0x72, + F4 = 0x73, + F5 = 0x74, + F6 = 0x75, + F7 = 0x76, + F8 = 0x77, + F9 = 0x78, + F10 = 0x79, + F11 = 0x7a, + F12 = 0x7b, + F13 = 0x7c, + F14 = 0x7d, + F15 = 0x7e, + F16 = 0x7f, + F17 = 0x80, + F18 = 0x81, + F19 = 0x82, + F20 = 0x83, + F21 = 0x84, + F22 = 0x85, + F23 = 0x86, + F24 = 0x87, + + NumLock = 0x90, + Scroll = 0x91, + + LeftShift = 0xa0, + RightShift = 0xa1, + LeftControl = 0xa2, + RightControl = 0xa3, + LeftAlt = 0xa4, + RightAlt = 0xa5, + BrowserBack = 0xa6, + BrowserForward = 0xa7, + BrowserRefresh = 0xa8, + BrowserStop = 0xa9, + BrowserSearch = 0xaa, + BrowserFavorites = 0xab, + BrowserHome = 0xac, + VolumeMute = 0xad, + VolumeDown = 0xae, + VolumeUp = 0xaf, + MediaNextTrack = 0xb0, + MediaPreviousTrack = 0xb1, + MediaStop = 0xb2, + MediaPlayPause = 0xb3, + LaunchMail = 0xb4, + SelectMedia = 0xb5, + LaunchApplication1 = 0xb6, + LaunchApplication2 = 0xb7, + + OemSemicolon = 0xba, + OemPlus = 0xbb, + OemComma = 0xbc, + OemMinus = 0xbd, + OemPeriod = 0xbe, + OemQuestion = 0xbf, + OemTilde = 0xc0, + + OemOpenBrackets = 0xdb, + OemPipe = 0xdc, + OemCloseBrackets = 0xdd, + OemQuotes = 0xde, + Oem8 = 0xdf, + + OemBackslash = 0xe2, + + ProcessKey = 0xe5, + + OemCopy = 0xf2, + OemAuto = 0xf3, + OemEnlW = 0xf4, + + Attn = 0xf6, + Crsel = 0xf7, + Exsel = 0xf8, + EraseEof = 0xf9, + Play = 0xfa, + Zoom = 0xfb, + + Pa1 = 0xfd, + OemClear = 0xfe, + }; + + struct State + { + bool Reserved0 : 8; + bool Back : 1; // VK_BACK, 0x8 + bool Tab : 1; // VK_TAB, 0x9 + bool Reserved1 : 3; + bool Enter : 1; // VK_RETURN, 0xD + bool Reserved2 : 2; + bool Reserved3 : 3; + bool Pause : 1; // VK_PAUSE, 0x13 + bool CapsLock : 1; // VK_CAPITAL, 0x14 + bool Kana : 1; // VK_KANA, 0x15 + bool Reserved4 : 2; + bool Reserved5 : 1; + bool Kanji : 1; // VK_KANJI, 0x19 + bool Reserved6 : 1; + bool Escape : 1; // VK_ESCAPE, 0x1B + bool ImeConvert : 1; // VK_CONVERT, 0x1C + bool ImeNoConvert : 1; // VK_NONCONVERT, 0x1D + bool Reserved7 : 2; + bool Space : 1; // VK_SPACE, 0x20 + bool PageUp : 1; // VK_PRIOR, 0x21 + bool PageDown : 1; // VK_NEXT, 0x22 + bool End : 1; // VK_END, 0x23 + bool Home : 1; // VK_HOME, 0x24 + bool Left : 1; // VK_LEFT, 0x25 + bool Up : 1; // VK_UP, 0x26 + bool Right : 1; // VK_RIGHT, 0x27 + bool Down : 1; // VK_DOWN, 0x28 + bool Select : 1; // VK_SELECT, 0x29 + bool Print : 1; // VK_PRINT, 0x2A + bool Execute : 1; // VK_EXECUTE, 0x2B + bool PrintScreen : 1; // VK_SNAPSHOT, 0x2C + bool Insert : 1; // VK_INSERT, 0x2D + bool Delete : 1; // VK_DELETE, 0x2E + bool Help : 1; // VK_HELP, 0x2F + bool D0 : 1; // 0x30 + bool D1 : 1; // 0x31 + bool D2 : 1; // 0x32 + bool D3 : 1; // 0x33 + bool D4 : 1; // 0x34 + bool D5 : 1; // 0x35 + bool D6 : 1; // 0x36 + bool D7 : 1; // 0x37 + bool D8 : 1; // 0x38 + bool D9 : 1; // 0x39 + bool Reserved8 : 6; + bool Reserved9 : 1; + bool A : 1; // 0x41 + bool B : 1; // 0x42 + bool C : 1; // 0x43 + bool D : 1; // 0x44 + bool E : 1; // 0x45 + bool F : 1; // 0x46 + bool G : 1; // 0x47 + bool H : 1; // 0x48 + bool I : 1; // 0x49 + bool J : 1; // 0x4A + bool K : 1; // 0x4B + bool L : 1; // 0x4C + bool M : 1; // 0x4D + bool N : 1; // 0x4E + bool O : 1; // 0x4F + bool P : 1; // 0x50 + bool Q : 1; // 0x51 + bool R : 1; // 0x52 + bool S : 1; // 0x53 + bool T : 1; // 0x54 + bool U : 1; // 0x55 + bool V : 1; // 0x56 + bool W : 1; // 0x57 + bool X : 1; // 0x58 + bool Y : 1; // 0x59 + bool Z : 1; // 0x5A + bool LeftWindows : 1; // VK_LWIN, 0x5B + bool RightWindows : 1; // VK_RWIN, 0x5C + bool Apps : 1; // VK_APPS, 0x5D + bool Reserved10 : 1; + bool Sleep : 1; // VK_SLEEP, 0x5F + bool NumPad0 : 1; // VK_NUMPAD0, 0x60 + bool NumPad1 : 1; // VK_NUMPAD1, 0x61 + bool NumPad2 : 1; // VK_NUMPAD2, 0x62 + bool NumPad3 : 1; // VK_NUMPAD3, 0x63 + bool NumPad4 : 1; // VK_NUMPAD4, 0x64 + bool NumPad5 : 1; // VK_NUMPAD5, 0x65 + bool NumPad6 : 1; // VK_NUMPAD6, 0x66 + bool NumPad7 : 1; // VK_NUMPAD7, 0x67 + bool NumPad8 : 1; // VK_NUMPAD8, 0x68 + bool NumPad9 : 1; // VK_NUMPAD9, 0x69 + bool Multiply : 1; // VK_MULTIPLY, 0x6A + bool Add : 1; // VK_ADD, 0x6B + bool Separator : 1; // VK_SEPARATOR, 0x6C + bool Subtract : 1; // VK_SUBTRACT, 0x6D + bool Decimal : 1; // VK_DECIMANL, 0x6E + bool Divide : 1; // VK_DIVIDE, 0x6F + bool F1 : 1; // VK_F1, 0x70 + bool F2 : 1; // VK_F2, 0x71 + bool F3 : 1; // VK_F3, 0x72 + bool F4 : 1; // VK_F4, 0x73 + bool F5 : 1; // VK_F5, 0x74 + bool F6 : 1; // VK_F6, 0x75 + bool F7 : 1; // VK_F7, 0x76 + bool F8 : 1; // VK_F8, 0x77 + bool F9 : 1; // VK_F9, 0x78 + bool F10 : 1; // VK_F10, 0x79 + bool F11 : 1; // VK_F11, 0x7A + bool F12 : 1; // VK_F12, 0x7B + bool F13 : 1; // VK_F13, 0x7C + bool F14 : 1; // VK_F14, 0x7D + bool F15 : 1; // VK_F15, 0x7E + bool F16 : 1; // VK_F16, 0x7F + bool F17 : 1; // VK_F17, 0x80 + bool F18 : 1; // VK_F18, 0x81 + bool F19 : 1; // VK_F19, 0x82 + bool F20 : 1; // VK_F20, 0x83 + bool F21 : 1; // VK_F21, 0x84 + bool F22 : 1; // VK_F22, 0x85 + bool F23 : 1; // VK_F23, 0x86 + bool F24 : 1; // VK_F24, 0x87 + bool Reserved11 : 8; + bool NumLock : 1; // VK_NUMLOCK, 0x90 + bool Scroll : 1; // VK_SCROLL, 0x91 + bool Reserved12 : 6; + bool Reserved13 : 8; + bool LeftShift : 1; // VK_LSHIFT, 0xA0 + bool RightShift : 1; // VK_RSHIFT, 0xA1 + bool LeftControl : 1; // VK_LCONTROL, 0xA2 + bool RightControl : 1; // VK_RCONTROL, 0xA3 + bool LeftAlt : 1; // VK_LMENU, 0xA4 + bool RightAlt : 1; // VK_RMENU, 0xA5 + bool BrowserBack : 1; // VK_BROWSER_BACK, 0xA6 + bool BrowserForward : 1; // VK_BROWSER_FORWARD, 0xA7 + bool BrowserRefresh : 1; // VK_BROWSER_REFRESH, 0xA8 + bool BrowserStop : 1; // VK_BROWSER_STOP, 0xA9 + bool BrowserSearch : 1; // VK_BROWSER_SEARCH, 0xAA + bool BrowserFavorites : 1; // VK_BROWSER_FAVORITES, 0xAB + bool BrowserHome : 1; // VK_BROWSER_HOME, 0xAC + bool VolumeMute : 1; // VK_VOLUME_MUTE, 0xAD + bool VolumeDown : 1; // VK_VOLUME_DOWN, 0xAE + bool VolumeUp : 1; // VK_VOLUME_UP, 0xAF + bool MediaNextTrack : 1; // VK_MEDIA_NEXT_TRACK, 0xB0 + bool MediaPreviousTrack : 1;// VK_MEDIA_PREV_TRACK, 0xB1 + bool MediaStop : 1; // VK_MEDIA_STOP, 0xB2 + bool MediaPlayPause : 1; // VK_MEDIA_PLAY_PAUSE, 0xB3 + bool LaunchMail : 1; // VK_LAUNCH_MAIL, 0xB4 + bool SelectMedia : 1; // VK_LAUNCH_MEDIA_SELECT, 0xB5 + bool LaunchApplication1 : 1;// VK_LAUNCH_APP1, 0xB6 + bool LaunchApplication2 : 1;// VK_LAUNCH_APP2, 0xB7 + bool Reserved14 : 2; + bool OemSemicolon : 1; // VK_OEM_1, 0xBA + bool OemPlus : 1; // VK_OEM_PLUS, 0xBB + bool OemComma : 1; // VK_OEM_COMMA, 0xBC + bool OemMinus : 1; // VK_OEM_MINUS, 0xBD + bool OemPeriod : 1; // VK_OEM_PERIOD, 0xBE + bool OemQuestion : 1; // VK_OEM_2, 0xBF + bool OemTilde : 1; // VK_OEM_3, 0xC0 + bool Reserved15 : 7; + bool Reserved16 : 8; + bool Reserved17 : 8; + bool Reserved18 : 3; + bool OemOpenBrackets : 1; // VK_OEM_4, 0xDB + bool OemPipe : 1; // VK_OEM_5, 0xDC + bool OemCloseBrackets : 1; // VK_OEM_6, 0xDD + bool OemQuotes : 1; // VK_OEM_7, 0xDE + bool Oem8 : 1; // VK_OEM_8, 0xDF + bool Reserved19 : 2; + bool OemBackslash : 1; // VK_OEM_102, 0xE2 + bool Reserved20 : 2; + bool ProcessKey : 1; // VK_PROCESSKEY, 0xE5 + bool Reserved21 : 2; + bool Reserved22 : 8; + bool Reserved23 : 2; + bool OemCopy : 1; // 0XF2 + bool OemAuto : 1; // 0xF3 + bool OemEnlW : 1; // 0xF4 + bool Reserved24 : 1; + bool Attn : 1; // VK_ATTN, 0xF6 + bool Crsel : 1; // VK_CRSEL, 0xF7 + bool Exsel : 1; // VK_EXSEL, 0xF8 + bool EraseEof : 1; // VK_EREOF, 0xF9 + bool Play : 1; // VK_PLAY, 0xFA + bool Zoom : 1; // VK_ZOOM, 0xFB + bool Reserved25 : 1; + bool Pa1 : 1; // VK_PA1, 0xFD + bool OemClear : 1; // VK_OEM_CLEAR, 0xFE + bool Reserved26: 1; + + bool __cdecl IsKeyDown(Keys key) const + { + if (key >= 0 && key <= 0xfe) + { + auto ptr = reinterpret_cast(this); + unsigned int bf = 1u << (key & 0x1f); + return (ptr[(key >> 5)] & bf) != 0; + } + return false; + } + + bool __cdecl IsKeyUp(Keys key) const + { + if (key >= 0 && key <= 0xfe) + { + auto ptr = reinterpret_cast(this); + unsigned int bf = 1u << (key & 0x1f); + return (ptr[(key >> 5)] & bf) == 0; + } + return false; + } + }; + + class KeyboardStateTracker + { + public: + State released; + State pressed; + + KeyboardStateTracker() { Reset(); } + + void __cdecl Update(const State& state); + + void __cdecl Reset(); + + bool __cdecl IsKeyPressed(Keys key) const { return pressed.IsKeyDown(key); } + bool __cdecl IsKeyReleased(Keys key) const { return released.IsKeyDown(key); } + + State __cdecl GetLastState() const { return lastState; } + + public: + State lastState; + }; + + // Retrieve the current state of the keyboard + State __cdecl GetState() const; + + // Reset the keyboard state + void __cdecl Reset(); + + // Feature detection + bool __cdecl IsConnected() const; + +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) && defined(WM_USER) + static void __cdecl ProcessMessage(UINT message, WPARAM wParam, LPARAM lParam); +#endif + +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) + void __cdecl SetWindow(ABI::Windows::UI::Core::ICoreWindow* window); +#ifdef __cplusplus_winrt + void __cdecl SetWindow(Windows::UI::Core::CoreWindow^ window) + { + // See https://msdn.microsoft.com/en-us/library/hh755802.aspx + SetWindow(reinterpret_cast(window)); + } +#endif +#endif + + // Singleton + static Keyboard& __cdecl Get(); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; +} diff --git a/DirectXTK/Inc/Model.h b/DirectXTK/Inc/Model.h new file mode 100644 index 0000000..776bf06 --- /dev/null +++ b/DirectXTK/Inc/Model.h @@ -0,0 +1,145 @@ +//-------------------------------------------------------------------------------------- +// File: Model.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + + +namespace DirectX +{ + class IEffect; + class IEffectFactory; + class CommonStates; + class ModelMesh; + + //---------------------------------------------------------------------------------- + // Each mesh part is a submesh with a single effect + class ModelMeshPart + { + public: + ModelMeshPart(); + virtual ~ModelMeshPart(); + + uint32_t indexCount; + uint32_t startIndex; + uint32_t vertexOffset; + uint32_t vertexStride; + D3D_PRIMITIVE_TOPOLOGY primitiveType; + DXGI_FORMAT indexFormat; + Microsoft::WRL::ComPtr inputLayout; + Microsoft::WRL::ComPtr indexBuffer; + Microsoft::WRL::ComPtr vertexBuffer; + std::shared_ptr effect; + std::shared_ptr> vbDecl; + bool isAlpha; + + typedef std::vector> Collection; + + // Draw mesh part with custom effect + void __cdecl Draw( _In_ ID3D11DeviceContext* deviceContext, _In_ IEffect* ieffect, _In_ ID3D11InputLayout* iinputLayout, + _In_opt_ std::function setCustomState = nullptr ) const; + + // Create input layout for drawing with a custom effect. + void __cdecl CreateInputLayout( _In_ ID3D11Device* d3dDevice, _In_ IEffect* ieffect, _Outptr_ ID3D11InputLayout** iinputLayout ) const; + + // Change effect used by part and regenerate input layout (be sure to call Model::Modified as well) + void __cdecl ModifyEffect( _In_ ID3D11Device* d3dDevice, _In_ std::shared_ptr& ieffect, bool isalpha = false ); + }; + + + //---------------------------------------------------------------------------------- + // A mesh consists of one or more model mesh parts + class ModelMesh + { + public: + ModelMesh(); + virtual ~ModelMesh(); + + BoundingSphere boundingSphere; + BoundingBox boundingBox; + ModelMeshPart::Collection meshParts; + std::wstring name; + bool ccw; + bool pmalpha; + + typedef std::vector> Collection; + + // Setup states for drawing mesh + void __cdecl PrepareForRendering( _In_ ID3D11DeviceContext* deviceContext, const CommonStates& states, bool alpha = false, bool wireframe = false ) const; + + // Draw the mesh + void XM_CALLCONV Draw( _In_ ID3D11DeviceContext* deviceContext, FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection, + bool alpha = false, _In_opt_ std::function setCustomState = nullptr ) const; + }; + + + //---------------------------------------------------------------------------------- + // A model consists of one or more meshes + class Model + { + public: + virtual ~Model(); + + ModelMesh::Collection meshes; + std::wstring name; + + // Draw all the meshes in the model + void XM_CALLCONV Draw( _In_ ID3D11DeviceContext* deviceContext, const CommonStates& states, FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection, + bool wireframe = false, _In_opt_ std::function setCustomState = nullptr ) const; + + // Notify model that effects, parts list, or mesh list has changed + void __cdecl Modified() { mEffectCache.clear(); } + + // Update all effects used by the model + void __cdecl UpdateEffects( _In_ std::function setEffect ); + + // Loads a model from a Visual Studio Starter Kit .CMO file + static std::unique_ptr __cdecl CreateFromCMO( _In_ ID3D11Device* d3dDevice, _In_reads_bytes_(dataSize) const uint8_t* meshData, size_t dataSize, + _In_ IEffectFactory& fxFactory, bool ccw = true, bool pmalpha = false ); + static std::unique_ptr __cdecl CreateFromCMO( _In_ ID3D11Device* d3dDevice, _In_z_ const wchar_t* szFileName, + _In_ IEffectFactory& fxFactory, bool ccw = true, bool pmalpha = false ); + + // Loads a model from a DirectX SDK .SDKMESH file + static std::unique_ptr __cdecl CreateFromSDKMESH( _In_ ID3D11Device* d3dDevice, _In_reads_bytes_(dataSize) const uint8_t* meshData, _In_ size_t dataSize, + _In_ IEffectFactory& fxFactory, bool ccw = false, bool pmalpha = false ); + static std::unique_ptr __cdecl CreateFromSDKMESH( _In_ ID3D11Device* d3dDevice, _In_z_ const wchar_t* szFileName, + _In_ IEffectFactory& fxFactory, bool ccw = false, bool pmalpha = false ); + + // Loads a model from a .VBO file + static std::unique_ptr __cdecl CreateFromVBO( _In_ ID3D11Device* d3dDevice, _In_reads_bytes_(dataSize) const uint8_t* meshData, _In_ size_t dataSize, + _In_opt_ std::shared_ptr ieffect = nullptr, bool ccw = false, bool pmalpha = false ); + static std::unique_ptr __cdecl CreateFromVBO( _In_ ID3D11Device* d3dDevice, _In_z_ const wchar_t* szFileName, + _In_opt_ std::shared_ptr ieffect = nullptr, bool ccw = false, bool pmalpha = false ); + + private: + std::set mEffectCache; + }; + } \ No newline at end of file diff --git a/DirectXTK/Inc/Mouse.h b/DirectXTK/Inc/Mouse.h new file mode 100644 index 0000000..504d047 --- /dev/null +++ b/DirectXTK/Inc/Mouse.h @@ -0,0 +1,123 @@ +//-------------------------------------------------------------------------------------- +// File: Mouse.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include + +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) +namespace ABI { namespace Windows { namespace UI { namespace Core { struct ICoreWindow; } } } } +#endif + + +namespace DirectX +{ + class Mouse + { + public: + Mouse(); + Mouse(Mouse&& moveFrom); + Mouse& operator= (Mouse&& moveFrom); + + Mouse(Mouse const&) = delete; + Mouse& operator=(Mouse const&) = delete; + + virtual ~Mouse(); + + enum Mode + { + MODE_ABSOLUTE = 0, + MODE_RELATIVE, + }; + + struct State + { + bool leftButton; + bool middleButton; + bool rightButton; + bool xButton1; + bool xButton2; + int x; + int y; + int scrollWheelValue; + Mode positionMode; + }; + + class ButtonStateTracker + { + public: + enum ButtonState + { + UP = 0, // Button is up + HELD = 1, // Button is held down + RELEASED = 2, // Button was just released + PRESSED = 3, // Buton was just pressed + }; + + ButtonState leftButton; + ButtonState middleButton; + ButtonState rightButton; + ButtonState xButton1; + ButtonState xButton2; + + ButtonStateTracker() { Reset(); } + + void __cdecl Update( const State& state ); + + void __cdecl Reset(); + + State __cdecl GetLastState() const { return lastState; } + + private: + State lastState; + }; + + // Retrieve the current state of the mouse + State __cdecl GetState() const; + + // Resets the accumulated scroll wheel value + void __cdecl ResetScrollWheelValue(); + + // Sets mouse mode (defaults to absolute) + void __cdecl SetMode(Mode mode); + + // Feature detection + bool __cdecl IsConnected() const; + +#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) && defined(WM_USER) + void __cdecl SetWindow(HWND window); + static void __cdecl ProcessMessage(UINT message, WPARAM wParam, LPARAM lParam); +#endif + +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) + void __cdecl SetWindow(ABI::Windows::UI::Core::ICoreWindow* window); +#ifdef __cplusplus_winrt + void __cdecl SetWindow(Windows::UI::Core::CoreWindow^ window) + { + // See https://msdn.microsoft.com/en-us/library/hh755802.aspx + SetWindow(reinterpret_cast(window)); + } +#endif + static void __cdecl SetDpi(float dpi); +#endif + + // Singleton + static Mouse& __cdecl Get(); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; +} diff --git a/DirectXTK/Inc/PostProcess.h b/DirectXTK/Inc/PostProcess.h new file mode 100644 index 0000000..896497b --- /dev/null +++ b/DirectXTK/Inc/PostProcess.h @@ -0,0 +1,201 @@ +//-------------------------------------------------------------------------------------- +// File: PostProcess.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#error Post-processing not supported for Windows Phone 8.x; requires Direct3D hardware Feature Level 10.0 or better +#endif + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include +#include +#include + + +namespace DirectX +{ + //---------------------------------------------------------------------------------- + // Abstract interface representing a post-process pass + class IPostProcess + { + public: + virtual ~IPostProcess() { } + + virtual void __cdecl Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState = nullptr) = 0; + }; + + + //---------------------------------------------------------------------------------- + // Basic post-process + class BasicPostProcess : public IPostProcess + { + public: + enum Effect + { + Copy, + Monochrome, + Sepia, + DownScale_2x2, + DownScale_4x4, + GaussianBlur_5x5, + BloomExtract, + BloomBlur, + Effect_Max + }; + + explicit BasicPostProcess(_In_ ID3D11Device* device); + BasicPostProcess(BasicPostProcess&& moveFrom); + BasicPostProcess& operator= (BasicPostProcess&& moveFrom); + + BasicPostProcess(BasicPostProcess const&) = delete; + BasicPostProcess& operator= (BasicPostProcess const&) = delete; + + virtual ~BasicPostProcess(); + + // IPostProcess methods. + void __cdecl Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState = nullptr) override; + + // Shader control + void __cdecl SetEffect(Effect fx); + + // Properties + void __cdecl SetSourceTexture(_In_opt_ ID3D11ShaderResourceView* value); + + // Sets multiplier for GaussianBlur_5x5 + void __cdecl SetGaussianParameter(float multiplier); + + // Sets parameters for BloomExtract + void __cdecl SetBloomExtractParameter(float threshold); + + // Sets parameters for BloomBlur + void __cdecl SetBloomBlurParameters(bool horizontal, float size, float brightness); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; + + + //---------------------------------------------------------------------------------- + // Dual-texure post-process + class DualPostProcess : public IPostProcess + { + public: + enum Effect + { + Merge, + BloomCombine, + Effect_Max + }; + + explicit DualPostProcess(_In_ ID3D11Device* device); + DualPostProcess(DualPostProcess&& moveFrom); + DualPostProcess& operator= (DualPostProcess&& moveFrom); + + DualPostProcess(DualPostProcess const&) = delete; + DualPostProcess& operator= (DualPostProcess const&) = delete; + + virtual ~DualPostProcess(); + + // IPostProcess methods. + void __cdecl Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState = nullptr) override; + + // Shader control + void __cdecl SetEffect(Effect fx); + + // Properties + void __cdecl SetSourceTexture(_In_opt_ ID3D11ShaderResourceView* value); + void __cdecl SetSourceTexture2(_In_opt_ ID3D11ShaderResourceView* value); + + // Sets parameters for Merge + void __cdecl SetMergeParameters(float weight1, float weight2); + + // Sets parameters for BloomCombine + void __cdecl SetBloomCombineParameters(float bloom, float base, float bloomSaturation, float baseSaturation); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; + + + //---------------------------------------------------------------------------------- + // Tone-map post-process + class ToneMapPostProcess : public IPostProcess + { + public: + enum Operator // Tone-mapping operator + { + None, // Pass-through + Saturate, // Clamp [0,1] + Reinhard, // x/(1+x) + ACESFilmic, + Operator_Max + }; + + enum TransferFunction // Electro-Optical Transfer Function (EOTF) + { + Linear, // Pass-through + SRGB, // sRGB (Rec.709 and approximate sRGB display curve) + ST2084, // HDR10 (Rec.2020 color primaries and ST.2084 display curve) + TransferFunction_Max + }; + + explicit ToneMapPostProcess(_In_ ID3D11Device* device); + ToneMapPostProcess(ToneMapPostProcess&& moveFrom); + ToneMapPostProcess& operator= (ToneMapPostProcess&& moveFrom); + + ToneMapPostProcess(ToneMapPostProcess const&) = delete; + ToneMapPostProcess& operator= (ToneMapPostProcess const&) = delete; + + virtual ~ToneMapPostProcess(); + + // IPostProcess methods. + void __cdecl Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState = nullptr) override; + + // Shader control + void __cdecl SetOperator(Operator op); + + void __cdecl SetTransferFunction(TransferFunction func); + + #if defined(_XBOX_ONE) && defined(_TITLE) + // Uses Multiple Render Targets to generate both HDR10 and GameDVR SDR signals + void __cdecl SetMRTOutput(bool value = true); + #endif + + // Properties + void __cdecl SetHDRSourceTexture(_In_opt_ ID3D11ShaderResourceView* value); + + // Sets exposure value for LDR tonemap operators + void SetExposure(float exposureValue); + + // Sets ST.2084 parameter for how bright white should be in nits + void SetST2084Parameter(float paperWhiteNits); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; +} diff --git a/DirectXTK/Inc/PrimitiveBatch.h b/DirectXTK/Inc/PrimitiveBatch.h new file mode 100644 index 0000000..7b6efc4 --- /dev/null +++ b/DirectXTK/Inc/PrimitiveBatch.h @@ -0,0 +1,143 @@ +//-------------------------------------------------------------------------------------- +// File: PrimitiveBatch.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include +#include +#include + + +namespace DirectX +{ + namespace Internal + { + // Base class, not to be used directly: clients should access this via the derived PrimitiveBatch. + class PrimitiveBatchBase + { + protected: + PrimitiveBatchBase(_In_ ID3D11DeviceContext* deviceContext, size_t maxIndices, size_t maxVertices, size_t vertexSize); + PrimitiveBatchBase(PrimitiveBatchBase&& moveFrom); + PrimitiveBatchBase& operator= (PrimitiveBatchBase&& moveFrom); + + PrimitiveBatchBase(PrimitiveBatchBase const&) = delete; + PrimitiveBatchBase& operator= (PrimitiveBatchBase const&) = delete; + + virtual ~PrimitiveBatchBase(); + + public: + // Begin/End a batch of primitive drawing operations. + void __cdecl Begin(); + void __cdecl End(); + + protected: + // Internal, untyped drawing method. + void __cdecl Draw(D3D11_PRIMITIVE_TOPOLOGY topology, bool isIndexed, _In_opt_count_(indexCount) uint16_t const* indices, size_t indexCount, size_t vertexCount, _Out_ void** pMappedVertices); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + }; + } + + + // Template makes the API typesafe, eg. PrimitiveBatch. + template + class PrimitiveBatch : public Internal::PrimitiveBatchBase + { + static const size_t DefaultBatchSize = 2048; + + public: + explicit PrimitiveBatch(_In_ ID3D11DeviceContext* deviceContext, size_t maxIndices = DefaultBatchSize * 3, size_t maxVertices = DefaultBatchSize) + : PrimitiveBatchBase(deviceContext, maxIndices, maxVertices, sizeof(TVertex)) + { } + + PrimitiveBatch(PrimitiveBatch&& moveFrom) + : PrimitiveBatchBase(std::move(moveFrom)) + { } + + PrimitiveBatch& operator= (PrimitiveBatch&& moveFrom) + { + PrimitiveBatchBase::operator=(std::move(moveFrom)); + return *this; + } + + + // Similar to the D3D9 API DrawPrimitiveUP. + void Draw(D3D11_PRIMITIVE_TOPOLOGY topology, _In_reads_(vertexCount) TVertex const* vertices, size_t vertexCount) + { + void* mappedVertices; + + PrimitiveBatchBase::Draw(topology, false, nullptr, 0, vertexCount, &mappedVertices); + + memcpy(mappedVertices, vertices, vertexCount * sizeof(TVertex)); + } + + + // Similar to the D3D9 API DrawIndexedPrimitiveUP. + void DrawIndexed(D3D11_PRIMITIVE_TOPOLOGY topology, _In_reads_(indexCount) uint16_t const* indices, size_t indexCount, _In_reads_(vertexCount) TVertex const* vertices, size_t vertexCount) + { + void* mappedVertices; + + PrimitiveBatchBase::Draw(topology, true, indices, indexCount, vertexCount, &mappedVertices); + + memcpy(mappedVertices, vertices, vertexCount * sizeof(TVertex)); + } + + + void DrawLine(TVertex const& v1, TVertex const& v2) + { + TVertex* mappedVertices; + + PrimitiveBatchBase::Draw(D3D11_PRIMITIVE_TOPOLOGY_LINELIST, false, nullptr, 0, 2, reinterpret_cast(&mappedVertices)); + + mappedVertices[0] = v1; + mappedVertices[1] = v2; + } + + + void DrawTriangle(TVertex const& v1, TVertex const& v2, TVertex const& v3) + { + TVertex* mappedVertices; + + PrimitiveBatchBase::Draw(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, false, nullptr, 0, 3, reinterpret_cast(&mappedVertices)); + + mappedVertices[0] = v1; + mappedVertices[1] = v2; + mappedVertices[2] = v3; + } + + + void DrawQuad(TVertex const& v1, TVertex const& v2, TVertex const& v3, TVertex const& v4) + { + static const uint16_t quadIndices[] = { 0, 1, 2, 0, 2, 3 }; + + TVertex* mappedVertices; + + PrimitiveBatchBase::Draw(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, true, quadIndices, 6, 4, reinterpret_cast(&mappedVertices)); + + mappedVertices[0] = v1; + mappedVertices[1] = v2; + mappedVertices[2] = v3; + mappedVertices[3] = v4; + } + }; +} diff --git a/DirectXTK/Inc/ScreenGrab.h b/DirectXTK/Inc/ScreenGrab.h new file mode 100644 index 0000000..6bc5e39 --- /dev/null +++ b/DirectXTK/Inc/ScreenGrab.h @@ -0,0 +1,50 @@ +//-------------------------------------------------------------------------------------- +// File: ScreenGrab.h +// +// Function for capturing a 2D texture and saving it to a file (aka a 'screenshot' +// when used on a Direct3D Render Target). +// +// Note these functions are useful as a light-weight runtime screen grabber. For +// full-featured texture capture, DDS writer, and texture processing pipeline, +// see the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include + +#include +#include + + +namespace DirectX +{ + HRESULT __cdecl SaveDDSTextureToFile( + _In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _In_z_ const wchar_t* fileName); + + HRESULT __cdecl SaveWICTextureToFile( + _In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _In_ REFGUID guidContainerFormat, + _In_z_ const wchar_t* fileName, + _In_opt_ const GUID* targetFormat = nullptr, + _In_opt_ std::function setCustomProps = nullptr); +} \ No newline at end of file diff --git a/DirectXTK/Inc/SimpleMath.h b/DirectXTK/Inc/SimpleMath.h new file mode 100644 index 0000000..a6c6da8 --- /dev/null +++ b/DirectXTK/Inc/SimpleMath.h @@ -0,0 +1,1026 @@ +//------------------------------------------------------------------------------------- +// SimpleMath.h -- Simplified C++ Math wrapper for DirectXMath +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//------------------------------------------------------------------------------------- + +#pragma once + +#if !defined(__d3d11_h__) && !defined(__d3d11_x_h__) && !defined(__d3d12_h__) && !defined(__d3d12_x_h__) +#error include d3d11.h or d3d12.h before including SimpleMath.h +#endif + +#if !defined(_XBOX_ONE) || !defined(_TITLE) +#include +#endif + +#include +#include +#include + +#include +#include +#include + + +namespace DirectX +{ + +namespace SimpleMath +{ + +struct Vector2; +struct Vector4; +struct Matrix; +struct Quaternion; +struct Plane; + +//------------------------------------------------------------------------------ +// 2D rectangle +struct Rectangle +{ + long x; + long y; + long width; + long height; + + // Creators + Rectangle() : x(0), y(0), width(0), height(0) {} + Rectangle(long ix, long iy, long iw, long ih) : x(ix), y(iy), width(iw), height(ih) {} + explicit Rectangle(const RECT& rct) : x(rct.left), y(rct.top), width(rct.right - rct.left), height(rct.bottom - rct.top) {} + + operator RECT() { RECT rct; rct.left = x; rct.top = y; rct.right = (x + width); rct.bottom = (y + height); return rct; } +#ifdef __cplusplus_winrt + operator Windows::Foundation::Rect() { return Windows::Foundation::Rect(float(x), float(y), float(width), float(height)); } +#endif + + // Comparison operators + bool operator == (const Rectangle& r) const { return (x == r.x) && (y == r.y) && (width == r.width) && (height == r.height); } + bool operator == (const RECT& rct) const { return (x == rct.left) && (y == rct.top) && (width == (rct.right - rct.left)) && (height == (rct.bottom - rct.top)); } + + bool operator != (const Rectangle& r) const { return (x != r.x) || (y != r.y) || (width != r.width) || (height != r.height); } + bool operator != (const RECT& rct) const { return (x != rct.left) || (y != rct.top) || (width != (rct.right - rct.left)) || (height != (rct.bottom - rct.top)); } + + // Assignment operators + Rectangle& operator=(_In_ const Rectangle& r) { x = r.x; y = r.y; width = r.width; height = r.height; return *this; } + Rectangle& operator=(_In_ const RECT& rct) { x = rct.left; y = rct.top; width = (rct.right - rct.left); height = (rct.bottom - rct.top); return *this; } + + // Rectangle operations + Vector2 Location() const; + Vector2 Center() const; + + bool IsEmpty() const { return (width == 0 && height == 0 && x == 0 && y == 0); } + + bool Contains(long ix, long iy) const { return (x <= ix) && (ix < (x + width)) && (y <= iy) && (iy < (y + height)); } + bool Contains(const Vector2& point) const; + bool Contains(const Rectangle& r) const { return (x <= r.x) && ((r.x + r.width) <= (x + width)) && (y <= r.y) && ((r.y + r.height) <= (y + height)); } + bool Contains(const RECT& rct) const { return (x <= rct.left) && (rct.right <= (x + width)) && (y <= rct.top) && (rct.bottom <= (y + height)); } + + void Inflate(long horizAmount, long vertAmount); + + bool Intersects(const Rectangle& r) const { return (r.x < (x + width)) && (x < (r.x + r.width)) && (r.y < (y + height)) && (y < (r.y + r.height)); } + bool Intersects(const RECT& rct) const { return (rct.left < (x + width)) && (x < rct.right) && (rct.top < (y + height)) && (y < rct.bottom); } + + void Offset(long ox, long oy) { x += ox; y += oy; } + + // Static functions + static Rectangle Intersect(const Rectangle& ra, const Rectangle& rb); + static RECT Intersect(const RECT& rcta, const RECT& rctb); + + static Rectangle Union(const Rectangle& ra, const Rectangle& rb); + static RECT Union(const RECT& rcta, const RECT& rctb); +}; + +//------------------------------------------------------------------------------ +// 2D vector +struct Vector2 : public XMFLOAT2 +{ + Vector2() : XMFLOAT2(0.f, 0.f) {} + explicit Vector2(float x) : XMFLOAT2( x, x ) {} + Vector2(float _x, float _y) : XMFLOAT2(_x, _y) {} + explicit Vector2(_In_reads_(2) const float *pArray) : XMFLOAT2(pArray) {} + Vector2(FXMVECTOR V) { XMStoreFloat2( this, V ); } + Vector2(const XMFLOAT2& V) { this->x = V.x; this->y = V.y; } + explicit Vector2(const XMVECTORF32& F) { this->x = F.f[0]; this->y = F.f[1]; } + + operator XMVECTOR() const { return XMLoadFloat2( this ); } + + // Comparison operators + bool operator == ( const Vector2& V ) const; + bool operator != ( const Vector2& V ) const; + + // Assignment operators + Vector2& operator= (const Vector2& V) { x = V.x; y = V.y; return *this; } + Vector2& operator= (const XMFLOAT2& V) { x = V.x; y = V.y; return *this; } + Vector2& operator= (const XMVECTORF32& F) { x = F.f[0]; y = F.f[1]; return *this; } + Vector2& operator+= (const Vector2& V); + Vector2& operator-= (const Vector2& V); + Vector2& operator*= (const Vector2& V); + Vector2& operator*= (float S); + Vector2& operator/= (float S); + + // Unary operators + Vector2 operator+ () const { return *this; } + Vector2 operator- () const { return Vector2(-x, -y); } + + // Vector operations + bool InBounds( const Vector2& Bounds ) const; + + float Length() const; + float LengthSquared() const; + + float Dot( const Vector2& V ) const; + void Cross( const Vector2& V, Vector2& result ) const; + Vector2 Cross( const Vector2& V ) const; + + void Normalize(); + void Normalize( Vector2& result ) const; + + void Clamp( const Vector2& vmin, const Vector2& vmax ); + void Clamp( const Vector2& vmin, const Vector2& vmax, Vector2& result ) const; + + // Static functions + static float Distance( const Vector2& v1, const Vector2& v2 ); + static float DistanceSquared( const Vector2& v1, const Vector2& v2 ); + + static void Min( const Vector2& v1, const Vector2& v2, Vector2& result ); + static Vector2 Min( const Vector2& v1, const Vector2& v2 ); + + static void Max( const Vector2& v1, const Vector2& v2, Vector2& result ); + static Vector2 Max( const Vector2& v1, const Vector2& v2 ); + + static void Lerp( const Vector2& v1, const Vector2& v2, float t, Vector2& result ); + static Vector2 Lerp( const Vector2& v1, const Vector2& v2, float t ); + + static void SmoothStep( const Vector2& v1, const Vector2& v2, float t, Vector2& result ); + static Vector2 SmoothStep( const Vector2& v1, const Vector2& v2, float t ); + + static void Barycentric( const Vector2& v1, const Vector2& v2, const Vector2& v3, float f, float g, Vector2& result ); + static Vector2 Barycentric( const Vector2& v1, const Vector2& v2, const Vector2& v3, float f, float g ); + + static void CatmullRom( const Vector2& v1, const Vector2& v2, const Vector2& v3, const Vector2& v4, float t, Vector2& result ); + static Vector2 CatmullRom( const Vector2& v1, const Vector2& v2, const Vector2& v3, const Vector2& v4, float t ); + + static void Hermite( const Vector2& v1, const Vector2& t1, const Vector2& v2, const Vector2& t2, float t, Vector2& result ); + static Vector2 Hermite( const Vector2& v1, const Vector2& t1, const Vector2& v2, const Vector2& t2, float t ); + + static void Reflect( const Vector2& ivec, const Vector2& nvec, Vector2& result ); + static Vector2 Reflect( const Vector2& ivec, const Vector2& nvec ); + + static void Refract( const Vector2& ivec, const Vector2& nvec, float refractionIndex, Vector2& result ); + static Vector2 Refract( const Vector2& ivec, const Vector2& nvec, float refractionIndex ); + + static void Transform( const Vector2& v, const Quaternion& quat, Vector2& result ); + static Vector2 Transform( const Vector2& v, const Quaternion& quat ); + + static void Transform( const Vector2& v, const Matrix& m, Vector2& result ); + static Vector2 Transform( const Vector2& v, const Matrix& m ); + static void Transform( _In_reads_(count) const Vector2* varray, size_t count, const Matrix& m, _Out_writes_(count) Vector2* resultArray ); + + static void Transform( const Vector2& v, const Matrix& m, Vector4& result ); + static void Transform( _In_reads_(count) const Vector2* varray, size_t count, const Matrix& m, _Out_writes_(count) Vector4* resultArray ); + + static void TransformNormal( const Vector2& v, const Matrix& m, Vector2& result ); + static Vector2 TransformNormal( const Vector2& v, const Matrix& m ); + static void TransformNormal( _In_reads_(count) const Vector2* varray, size_t count, const Matrix& m, _Out_writes_(count) Vector2* resultArray ); + + // Constants + static const Vector2 Zero; + static const Vector2 One; + static const Vector2 UnitX; + static const Vector2 UnitY; +}; + +// Binary operators +Vector2 operator+ (const Vector2& V1, const Vector2& V2); +Vector2 operator- (const Vector2& V1, const Vector2& V2); +Vector2 operator* (const Vector2& V1, const Vector2& V2); +Vector2 operator* (const Vector2& V, float S); +Vector2 operator/ (const Vector2& V1, const Vector2& V2); +Vector2 operator* (float S, const Vector2& V); + +//------------------------------------------------------------------------------ +// 3D vector +struct Vector3 : public XMFLOAT3 +{ + Vector3() : XMFLOAT3(0.f, 0.f, 0.f) {} + explicit Vector3(float x) : XMFLOAT3( x, x, x ) {} + Vector3(float _x, float _y, float _z) : XMFLOAT3(_x, _y, _z) {} + explicit Vector3(_In_reads_(3) const float *pArray) : XMFLOAT3(pArray) {} + Vector3(FXMVECTOR V) { XMStoreFloat3( this, V ); } + Vector3(const XMFLOAT3& V) { this->x = V.x; this->y = V.y; this->z = V.z; } + explicit Vector3(const XMVECTORF32& F) { this->x = F.f[0]; this->y = F.f[1]; this->z = F.f[2]; } + + operator XMVECTOR() const { return XMLoadFloat3( this ); } + + // Comparison operators + bool operator == ( const Vector3& V ) const; + bool operator != ( const Vector3& V ) const; + + // Assignment operators + Vector3& operator= (const Vector3& V) { x = V.x; y = V.y; z = V.z; return *this; } + Vector3& operator= (const XMFLOAT3& V) { x = V.x; y = V.y; z = V.z; return *this; } + Vector3& operator= (const XMVECTORF32& F) { x = F.f[0]; y = F.f[1]; z = F.f[2]; return *this; } + Vector3& operator+= (const Vector3& V); + Vector3& operator-= (const Vector3& V); + Vector3& operator*= (const Vector3& V); + Vector3& operator*= (float S); + Vector3& operator/= (float S); + + // Unary operators + Vector3 operator+ () const { return *this; } + Vector3 operator- () const; + + // Vector operations + bool InBounds( const Vector3& Bounds ) const; + + float Length() const; + float LengthSquared() const; + + float Dot( const Vector3& V ) const; + void Cross( const Vector3& V, Vector3& result ) const; + Vector3 Cross( const Vector3& V ) const; + + void Normalize(); + void Normalize( Vector3& result ) const; + + void Clamp( const Vector3& vmin, const Vector3& vmax ); + void Clamp( const Vector3& vmin, const Vector3& vmax, Vector3& result ) const; + + // Static functions + static float Distance( const Vector3& v1, const Vector3& v2 ); + static float DistanceSquared( const Vector3& v1, const Vector3& v2 ); + + static void Min( const Vector3& v1, const Vector3& v2, Vector3& result ); + static Vector3 Min( const Vector3& v1, const Vector3& v2 ); + + static void Max( const Vector3& v1, const Vector3& v2, Vector3& result ); + static Vector3 Max( const Vector3& v1, const Vector3& v2 ); + + static void Lerp( const Vector3& v1, const Vector3& v2, float t, Vector3& result ); + static Vector3 Lerp( const Vector3& v1, const Vector3& v2, float t ); + + static void SmoothStep( const Vector3& v1, const Vector3& v2, float t, Vector3& result ); + static Vector3 SmoothStep( const Vector3& v1, const Vector3& v2, float t ); + + static void Barycentric( const Vector3& v1, const Vector3& v2, const Vector3& v3, float f, float g, Vector3& result ); + static Vector3 Barycentric( const Vector3& v1, const Vector3& v2, const Vector3& v3, float f, float g ); + + static void CatmullRom( const Vector3& v1, const Vector3& v2, const Vector3& v3, const Vector3& v4, float t, Vector3& result ); + static Vector3 CatmullRom( const Vector3& v1, const Vector3& v2, const Vector3& v3, const Vector3& v4, float t ); + + static void Hermite( const Vector3& v1, const Vector3& t1, const Vector3& v2, const Vector3& t2, float t, Vector3& result ); + static Vector3 Hermite( const Vector3& v1, const Vector3& t1, const Vector3& v2, const Vector3& t2, float t ); + + static void Reflect( const Vector3& ivec, const Vector3& nvec, Vector3& result ); + static Vector3 Reflect( const Vector3& ivec, const Vector3& nvec ); + + static void Refract( const Vector3& ivec, const Vector3& nvec, float refractionIndex, Vector3& result ); + static Vector3 Refract( const Vector3& ivec, const Vector3& nvec, float refractionIndex ); + + static void Transform( const Vector3& v, const Quaternion& quat, Vector3& result ); + static Vector3 Transform( const Vector3& v, const Quaternion& quat ); + + static void Transform( const Vector3& v, const Matrix& m, Vector3& result ); + static Vector3 Transform( const Vector3& v, const Matrix& m ); + static void Transform( _In_reads_(count) const Vector3* varray, size_t count, const Matrix& m, _Out_writes_(count) Vector3* resultArray ); + + static void Transform( const Vector3& v, const Matrix& m, Vector4& result ); + static void Transform( _In_reads_(count) const Vector3* varray, size_t count, const Matrix& m, _Out_writes_(count) Vector4* resultArray ); + + static void TransformNormal( const Vector3& v, const Matrix& m, Vector3& result ); + static Vector3 TransformNormal( const Vector3& v, const Matrix& m ); + static void TransformNormal( _In_reads_(count) const Vector3* varray, size_t count, const Matrix& m, _Out_writes_(count) Vector3* resultArray ); + + // Constants + static const Vector3 Zero; + static const Vector3 One; + static const Vector3 UnitX; + static const Vector3 UnitY; + static const Vector3 UnitZ; + static const Vector3 Up; + static const Vector3 Down; + static const Vector3 Right; + static const Vector3 Left; + static const Vector3 Forward; + static const Vector3 Backward; +}; + +// Binary operators +Vector3 operator+ (const Vector3& V1, const Vector3& V2); +Vector3 operator- (const Vector3& V1, const Vector3& V2); +Vector3 operator* (const Vector3& V1, const Vector3& V2); +Vector3 operator* (const Vector3& V, float S); +Vector3 operator/ (const Vector3& V1, const Vector3& V2); +Vector3 operator* (float S, const Vector3& V); + +//------------------------------------------------------------------------------ +// 4D vector +struct Vector4 : public XMFLOAT4 +{ + Vector4() : XMFLOAT4(0.f, 0.f, 0.f, 0.f) {} + explicit Vector4(float x) : XMFLOAT4( x, x, x, x ) {} + Vector4(float _x, float _y, float _z, float _w) : XMFLOAT4(_x, _y, _z, _w) {} + explicit Vector4(_In_reads_(4) const float *pArray) : XMFLOAT4(pArray) {} + Vector4(FXMVECTOR V) { XMStoreFloat4( this, V ); } + Vector4(const XMFLOAT4& V) { this->x = V.x; this->y = V.y; this->z = V.z; this->w = V.w; } + explicit Vector4(const XMVECTORF32& F) { this->x = F.f[0]; this->y = F.f[1]; this->z = F.f[2]; this->w = F.f[3]; } + + operator XMVECTOR() const { return XMLoadFloat4( this ); } + + // Comparison operators + bool operator == ( const Vector4& V ) const; + bool operator != ( const Vector4& V ) const; + + // Assignment operators + Vector4& operator= (const Vector4& V) { x = V.x; y = V.y; z = V.z; w = V.w; return *this; } + Vector4& operator= (const XMFLOAT4& V) { x = V.x; y = V.y; z = V.z; w = V.w; return *this; } + Vector4& operator= (const XMVECTORF32& F) { x = F.f[0]; y = F.f[1]; z = F.f[2]; w = F.f[3]; return *this; } + Vector4& operator+= (const Vector4& V); + Vector4& operator-= (const Vector4& V); + Vector4& operator*= (const Vector4& V); + Vector4& operator*= (float S); + Vector4& operator/= (float S); + + // Unary operators + Vector4 operator+ () const { return *this; } + Vector4 operator- () const; + + // Vector operations + bool InBounds( const Vector4& Bounds ) const; + + float Length() const; + float LengthSquared() const; + + float Dot( const Vector4& V ) const; + void Cross( const Vector4& v1, const Vector4& v2, Vector4& result ) const; + Vector4 Cross( const Vector4& v1, const Vector4& v2 ) const; + + void Normalize(); + void Normalize( Vector4& result ) const; + + void Clamp( const Vector4& vmin, const Vector4& vmax ); + void Clamp( const Vector4& vmin, const Vector4& vmax, Vector4& result ) const; + + // Static functions + static float Distance( const Vector4& v1, const Vector4& v2 ); + static float DistanceSquared( const Vector4& v1, const Vector4& v2 ); + + static void Min( const Vector4& v1, const Vector4& v2, Vector4& result ); + static Vector4 Min( const Vector4& v1, const Vector4& v2 ); + + static void Max( const Vector4& v1, const Vector4& v2, Vector4& result ); + static Vector4 Max( const Vector4& v1, const Vector4& v2 ); + + static void Lerp( const Vector4& v1, const Vector4& v2, float t, Vector4& result ); + static Vector4 Lerp( const Vector4& v1, const Vector4& v2, float t ); + + static void SmoothStep( const Vector4& v1, const Vector4& v2, float t, Vector4& result ); + static Vector4 SmoothStep( const Vector4& v1, const Vector4& v2, float t ); + + static void Barycentric( const Vector4& v1, const Vector4& v2, const Vector4& v3, float f, float g, Vector4& result ); + static Vector4 Barycentric( const Vector4& v1, const Vector4& v2, const Vector4& v3, float f, float g ); + + static void CatmullRom( const Vector4& v1, const Vector4& v2, const Vector4& v3, const Vector4& v4, float t, Vector4& result ); + static Vector4 CatmullRom( const Vector4& v1, const Vector4& v2, const Vector4& v3, const Vector4& v4, float t ); + + static void Hermite( const Vector4& v1, const Vector4& t1, const Vector4& v2, const Vector4& t2, float t, Vector4& result ); + static Vector4 Hermite( const Vector4& v1, const Vector4& t1, const Vector4& v2, const Vector4& t2, float t ); + + static void Reflect( const Vector4& ivec, const Vector4& nvec, Vector4& result ); + static Vector4 Reflect( const Vector4& ivec, const Vector4& nvec ); + + static void Refract( const Vector4& ivec, const Vector4& nvec, float refractionIndex, Vector4& result ); + static Vector4 Refract( const Vector4& ivec, const Vector4& nvec, float refractionIndex ); + + static void Transform( const Vector2& v, const Quaternion& quat, Vector4& result ); + static Vector4 Transform( const Vector2& v, const Quaternion& quat ); + + static void Transform( const Vector3& v, const Quaternion& quat, Vector4& result ); + static Vector4 Transform( const Vector3& v, const Quaternion& quat ); + + static void Transform( const Vector4& v, const Quaternion& quat, Vector4& result ); + static Vector4 Transform( const Vector4& v, const Quaternion& quat ); + + static void Transform( const Vector4& v, const Matrix& m, Vector4& result ); + static Vector4 Transform( const Vector4& v, const Matrix& m ); + static void Transform( _In_reads_(count) const Vector4* varray, size_t count, const Matrix& m, _Out_writes_(count) Vector4* resultArray ); + + // Constants + static const Vector4 Zero; + static const Vector4 One; + static const Vector4 UnitX; + static const Vector4 UnitY; + static const Vector4 UnitZ; + static const Vector4 UnitW; +}; + +// Binary operators +Vector4 operator+ (const Vector4& V1, const Vector4& V2); +Vector4 operator- (const Vector4& V1, const Vector4& V2); +Vector4 operator* (const Vector4& V1, const Vector4& V2); +Vector4 operator* (const Vector4& V, float S); +Vector4 operator/ (const Vector4& V1, const Vector4& V2); +Vector4 operator* (float S, const Vector4& V); + +//------------------------------------------------------------------------------ +// 4x4 Matrix (assumes right-handed cooordinates) +struct Matrix : public XMFLOAT4X4 +{ + Matrix() : XMFLOAT4X4( 1.f, 0, 0, 0, + 0, 1.f, 0, 0, + 0, 0, 1.f, 0, + 0, 0, 0, 1.f ) {} + Matrix(float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33) : XMFLOAT4X4(m00, m01, m02, m03, + m10, m11, m12, m13, + m20, m21, m22, m23, + m30, m31, m32, m33) {} + explicit Matrix( const Vector3& r0, const Vector3& r1, const Vector3& r2 ) : XMFLOAT4X4( r0.x, r0.y, r0.z, 0, + r1.x, r1.y, r1.z, 0, + r2.x, r2.y, r2.z, 0, + 0, 0, 0, 1.f ) {} + explicit Matrix( const Vector4& r0, const Vector4& r1, const Vector4& r2, const Vector4& r3 ) : XMFLOAT4X4( r0.x, r0.y, r0.z, r0.w, + r1.x, r1.y, r1.z, r1.w, + r2.x, r2.y, r2.z, r2.w, + r3.x, r3.y, r3.z, r3.w ) {} + Matrix(const XMFLOAT4X4& M) { memcpy_s(this, sizeof(float)*16, &M, sizeof(XMFLOAT4X4)); } + Matrix(const XMFLOAT3X3& M); + Matrix(const XMFLOAT4X3& M); + + explicit Matrix(_In_reads_(16) const float *pArray) : XMFLOAT4X4(pArray) {} + Matrix( CXMMATRIX M ) { XMStoreFloat4x4( this, M ); } + + operator XMMATRIX() const { return XMLoadFloat4x4( this ); } + + // Comparison operators + bool operator == ( const Matrix& M ) const; + bool operator != ( const Matrix& M ) const; + + // Assignment operators + Matrix& operator= (const Matrix& M) { memcpy_s( this, sizeof(float)*16, &M, sizeof(float)*16 ); return *this; } + Matrix& operator= (const XMFLOAT4X4& M) { memcpy_s( this, sizeof(float)*16, &M, sizeof(XMFLOAT4X4) ); return *this; } + Matrix& operator= (const XMFLOAT3X3& M); + Matrix& operator= (const XMFLOAT4X3& M); + Matrix& operator+= (const Matrix& M); + Matrix& operator-= (const Matrix& M); + Matrix& operator*= (const Matrix& M); + Matrix& operator*= (float S); + Matrix& operator/= (float S); + + Matrix& operator/= (const Matrix& M); + // Element-wise divide + + // Unary operators + Matrix operator+ () const { return *this; } + Matrix operator- () const; + + // Properties + Vector3 Up() const { return Vector3( _21, _22, _23); } + void Up( const Vector3& v ) { _21 = v.x; _22 = v.y; _23 = v.z; } + + Vector3 Down() const { return Vector3( -_21, -_22, -_23); } + void Down( const Vector3& v ) { _21 = -v.x; _22 = -v.y; _23 = -v.z; } + + Vector3 Right() const { return Vector3( _11, _12, _13 ); } + void Right( const Vector3& v ) { _11 = v.x; _12 = v.y; _13 = v.z; } + + Vector3 Left() const { return Vector3( -_11, -_12, -_13 ); } + void Left( const Vector3& v ) { _11 = -v.x; _12 = -v.y; _13 = -v.z; } + + Vector3 Forward() const { return Vector3( -_31, -_32, -_33 ); } + void Forward( const Vector3& v ) { _31 = -v.x; _32 = -v.y; _33 = -v.z; } + + Vector3 Backward() const { return Vector3( _31, _32, _33 ); } + void Backward( const Vector3& v ) { _31 = v.x; _32 = v.y; _33 = v.z; } + + Vector3 Translation() const { return Vector3( _41, _42, _43 ); } + void Translation( const Vector3& v ) { _41 = v.x; _42 = v.y; _43 = v.z; } + + // Matrix operations + bool Decompose( Vector3& scale, Quaternion& rotation, Vector3& translation ); + + Matrix Transpose() const; + void Transpose( Matrix& result ) const; + + Matrix Invert() const; + void Invert( Matrix& result ) const; + + float Determinant() const; + + // Static functions + static Matrix CreateBillboard( const Vector3& object, const Vector3& cameraPosition, const Vector3& cameraUp, _In_opt_ const Vector3* cameraForward = nullptr ); + + static Matrix CreateConstrainedBillboard( const Vector3& object, const Vector3& cameraPosition, const Vector3& rotateAxis, + _In_opt_ const Vector3* cameraForward = nullptr, _In_opt_ const Vector3* objectForward = nullptr); + + static Matrix CreateTranslation( const Vector3& position ); + static Matrix CreateTranslation( float x, float y, float z ); + + static Matrix CreateScale( const Vector3& scales ); + static Matrix CreateScale( float xs, float ys, float zs ); + static Matrix CreateScale( float scale ); + + static Matrix CreateRotationX( float radians ); + static Matrix CreateRotationY( float radians ); + static Matrix CreateRotationZ( float radians ); + + static Matrix CreateFromAxisAngle( const Vector3& axis, float angle ); + + static Matrix CreatePerspectiveFieldOfView( float fov, float aspectRatio, float nearPlane, float farPlane ); + static Matrix CreatePerspective( float width, float height, float nearPlane, float farPlane ); + static Matrix CreatePerspectiveOffCenter( float left, float right, float bottom, float top, float nearPlane, float farPlane ); + static Matrix CreateOrthographic( float width, float height, float zNearPlane, float zFarPlane ); + static Matrix CreateOrthographicOffCenter( float left, float right, float bottom, float top, float zNearPlane, float zFarPlane ); + + static Matrix CreateLookAt( const Vector3& position, const Vector3& target, const Vector3& up ); + static Matrix CreateWorld( const Vector3& position, const Vector3& forward, const Vector3& up ); + + static Matrix CreateFromQuaternion( const Quaternion& quat ); + + static Matrix CreateFromYawPitchRoll( float yaw, float pitch, float roll ); + + static Matrix CreateShadow( const Vector3& lightDir, const Plane& plane ); + + static Matrix CreateReflection( const Plane& plane ); + + static void Lerp( const Matrix& M1, const Matrix& M2, float t, Matrix& result ); + static Matrix Lerp( const Matrix& M1, const Matrix& M2, float t ); + + static void Transform( const Matrix& M, const Quaternion& rotation, Matrix& result ); + static Matrix Transform( const Matrix& M, const Quaternion& rotation ); + + // Constants + static const Matrix Identity; +}; + +// Binary operators +Matrix operator+ (const Matrix& M1, const Matrix& M2); +Matrix operator- (const Matrix& M1, const Matrix& M2); +Matrix operator* (const Matrix& M1, const Matrix& M2); +Matrix operator* (const Matrix& M, float S); +Matrix operator/ (const Matrix& M, float S); +Matrix operator/ (const Matrix& M1, const Matrix& M2); + // Element-wise divide +Matrix operator* (float S, const Matrix& M); + + +//----------------------------------------------------------------------------- +// Plane +struct Plane : public XMFLOAT4 +{ + Plane() : XMFLOAT4(0.f, 1.f, 0.f, 0.f) {} + Plane(float _x, float _y, float _z, float _w) : XMFLOAT4(_x, _y, _z, _w) {} + Plane(const Vector3& normal, float d) : XMFLOAT4(normal.x, normal.y, normal.z, d) {} + Plane(const Vector3& point1, const Vector3& point2, const Vector3& point3 ); + Plane(const Vector3& point, const Vector3& normal); + explicit Plane(const Vector4& v) : XMFLOAT4(v.x, v.y, v.z, v.w) {} + explicit Plane(_In_reads_(4) const float *pArray) : XMFLOAT4(pArray) {} + Plane(FXMVECTOR V) { XMStoreFloat4( this, V ); } + Plane(const XMFLOAT4& p) { this->x = p.x; this->y = p.y; this->z = p.z; this->w = p.w; } + explicit Plane(const XMVECTORF32& F) { this->x = F.f[0]; this->y = F.f[1]; this->z = F.f[2]; this->w = F.f[3]; } + + operator XMVECTOR() const { return XMLoadFloat4( this ); } + + // Comparison operators + bool operator == ( const Plane& p ) const; + bool operator != ( const Plane& p ) const; + + // Assignment operators + Plane& operator= (const Plane& p) { x = p.x; y = p.y; z = p.z; w = p.w; return *this; } + Plane& operator= (const XMFLOAT4& p) { x = p.x; y = p.y; z = p.z; w = p.w; return *this; } + Plane& operator= (const XMVECTORF32& F) { x = F.f[0]; y = F.f[1]; z = F.f[2]; w = F.f[3]; return *this; } + + // Properties + Vector3 Normal() const { return Vector3( x, y, z ); } + void Normal( const Vector3& normal ) { x = normal.x; y = normal.y; z = normal.z; } + + float D() const { return w; } + void D(float d) { w = d; } + + // Plane operations + void Normalize(); + void Normalize( Plane& result ) const; + + float Dot( const Vector4& v ) const; + float DotCoordinate( const Vector3& position ) const; + float DotNormal( const Vector3& normal ) const; + + // Static functions + static void Transform( const Plane& plane, const Matrix& M, Plane& result ); + static Plane Transform( const Plane& plane, const Matrix& M ); + + static void Transform( const Plane& plane, const Quaternion& rotation, Plane& result ); + static Plane Transform( const Plane& plane, const Quaternion& rotation ); + // Input quaternion must be the inverse transpose of the transformation +}; + +//------------------------------------------------------------------------------ +// Quaternion +struct Quaternion : public XMFLOAT4 +{ + Quaternion() : XMFLOAT4(0, 0, 0, 1.f) {} + Quaternion( float _x, float _y, float _z, float _w ) : XMFLOAT4(_x, _y, _z, _w) {} + Quaternion( const Vector3& v, float scalar ) : XMFLOAT4( v.x, v.y, v.z, scalar ) {} + explicit Quaternion( const Vector4& v ) : XMFLOAT4( v.x, v.y, v.z, v.w ) {} + explicit Quaternion(_In_reads_(4) const float *pArray) : XMFLOAT4(pArray) {} + Quaternion(FXMVECTOR V) { XMStoreFloat4( this, V ); } + Quaternion(const XMFLOAT4& q) { this->x = q.x; this->y = q.y; this->z = q.z; this->w = q.w; } + explicit Quaternion(const XMVECTORF32& F) { this->x = F.f[0]; this->y = F.f[1]; this->z = F.f[2]; this->w = F.f[3]; } + + operator XMVECTOR() const { return XMLoadFloat4( this ); } + + // Comparison operators + bool operator == ( const Quaternion& q ) const; + bool operator != ( const Quaternion& q ) const; + + // Assignment operators + Quaternion& operator= (const Quaternion& q) { x = q.x; y = q.y; z = q.z; w = q.w; return *this; } + Quaternion& operator= (const XMFLOAT4& q) { x = q.x; y = q.y; z = q.z; w = q.w; return *this; } + Quaternion& operator= (const XMVECTORF32& F) { x = F.f[0]; y = F.f[1]; z = F.f[2]; w = F.f[3]; return *this; } + Quaternion& operator+= (const Quaternion& q); + Quaternion& operator-= (const Quaternion& q); + Quaternion& operator*= (const Quaternion& q); + Quaternion& operator*= (float S); + Quaternion& operator/= (const Quaternion& q); + + // Unary operators + Quaternion operator+ () const { return *this; } + Quaternion operator- () const; + + // Quaternion operations + float Length() const; + float LengthSquared() const; + + void Normalize(); + void Normalize( Quaternion& result ) const; + + void Conjugate(); + void Conjugate( Quaternion& result ) const; + + void Inverse( Quaternion& result ) const; + + float Dot( const Quaternion& Q ) const; + + // Static functions + static Quaternion CreateFromAxisAngle( const Vector3& axis, float angle ); + static Quaternion CreateFromYawPitchRoll( float yaw, float pitch, float roll ); + static Quaternion CreateFromRotationMatrix( const Matrix& M ); + + static void Lerp( const Quaternion& q1, const Quaternion& q2, float t, Quaternion& result ); + static Quaternion Lerp( const Quaternion& q1, const Quaternion& q2, float t ); + + static void Slerp( const Quaternion& q1, const Quaternion& q2, float t, Quaternion& result ); + static Quaternion Slerp( const Quaternion& q1, const Quaternion& q2, float t ); + + static void Concatenate( const Quaternion& q1, const Quaternion& q2, Quaternion& result ); + static Quaternion Concatenate( const Quaternion& q1, const Quaternion& q2 ); + + // Constants + static const Quaternion Identity; +}; + +// Binary operators +Quaternion operator+ (const Quaternion& Q1, const Quaternion& Q2); +Quaternion operator- (const Quaternion& Q1, const Quaternion& Q2); +Quaternion operator* (const Quaternion& Q1, const Quaternion& Q2); +Quaternion operator* (const Quaternion& Q, float S); +Quaternion operator/ (const Quaternion& Q1, const Quaternion& Q2); +Quaternion operator* (float S, const Quaternion& Q); + +//------------------------------------------------------------------------------ +// Color +struct Color : public XMFLOAT4 +{ + Color() : XMFLOAT4(0, 0, 0, 1.f) {} + Color( float _r, float _g, float _b ) : XMFLOAT4(_r, _g, _b, 1.f) {} + Color( float _r, float _g, float _b, float _a ) : XMFLOAT4(_r, _g, _b, _a) {} + explicit Color( const Vector3& clr ) : XMFLOAT4( clr.x, clr.y, clr.z, 1.f ) {} + explicit Color( const Vector4& clr ) : XMFLOAT4( clr.x, clr.y, clr.z, clr.w ) {} + explicit Color(_In_reads_(4) const float *pArray) : XMFLOAT4(pArray) {} + Color(FXMVECTOR V) { XMStoreFloat4( this, V ); } + Color(const XMFLOAT4& c) { this->x = c.x; this->y = c.y; this->z = c.z; this->w = c.w; } + explicit Color(const XMVECTORF32& F) { this->x = F.f[0]; this->y = F.f[1]; this->z = F.f[2]; this->w = F.f[3]; } + + explicit Color( const DirectX::PackedVector::XMCOLOR& Packed ); + // BGRA Direct3D 9 D3DCOLOR packed color + + explicit Color( const DirectX::PackedVector::XMUBYTEN4& Packed ); + // RGBA XNA Game Studio packed color + + operator XMVECTOR() const { return XMLoadFloat4( this ); } + operator const float*() const { return reinterpret_cast(this); } + + // Comparison operators + bool operator == ( const Color& c ) const; + bool operator != ( const Color& c ) const; + + // Assignment operators + Color& operator= (const Color& c) { x = c.x; y = c.y; z = c.z; w = c.w; return *this; } + Color& operator= (const XMFLOAT4& c) { x = c.x; y = c.y; z = c.z; w = c.w; return *this; } + Color& operator= (const XMVECTORF32& F) { x = F.f[0]; y = F.f[1]; z = F.f[2]; w = F.f[3]; return *this; } + Color& operator= (const DirectX::PackedVector::XMCOLOR& Packed); + Color& operator= (const DirectX::PackedVector::XMUBYTEN4& Packed); + Color& operator+= (const Color& c); + Color& operator-= (const Color& c); + Color& operator*= (const Color& c); + Color& operator*= (float S); + Color& operator/= (const Color& c); + + // Unary operators + Color operator+ () const { return *this; } + Color operator- () const; + + // Properties + float R() const { return x; } + void R(float r) { x = r; } + + float G() const { return y; } + void G(float g) { y = g; } + + float B() const { return z; } + void B(float b) { z = b; } + + float A() const { return w; } + void A(float a) { w = a; } + + // Color operations + DirectX::PackedVector::XMCOLOR BGRA() const; + DirectX::PackedVector::XMUBYTEN4 RGBA() const; + + Vector3 ToVector3() const; + Vector4 ToVector4() const; + + void Negate(); + void Negate( Color& result ) const; + + void Saturate(); + void Saturate( Color& result ) const; + + void Premultiply(); + void Premultiply( Color& result ) const; + + void AdjustSaturation( float sat ); + void AdjustSaturation( float sat, Color& result ) const; + + void AdjustContrast( float contrast ); + void AdjustContrast( float contrast, Color& result ) const; + + // Static functions + static void Modulate( const Color& c1, const Color& c2, Color& result ); + static Color Modulate( const Color& c1, const Color& c2 ); + + static void Lerp( const Color& c1, const Color& c2, float t, Color& result ); + static Color Lerp( const Color& c1, const Color& c2, float t ); +}; + +// Binary operators +Color operator+ (const Color& C1, const Color& C2); +Color operator- (const Color& C1, const Color& C2); +Color operator* (const Color& C1, const Color& C2); +Color operator* (const Color& C, float S); +Color operator/ (const Color& C1, const Color& C2); +Color operator* (float S, const Color& C); + +//------------------------------------------------------------------------------ +// Ray +class Ray +{ +public: + Vector3 position; + Vector3 direction; + + Ray() : position(0,0,0), direction(0,0,1) {} + Ray( const Vector3& pos, const Vector3& dir ) : position(pos), direction(dir) {} + + // Comparison operators + bool operator == ( const Ray& r ) const; + bool operator != ( const Ray& r ) const; + + // Ray operations + bool Intersects( const BoundingSphere& sphere, _Out_ float& Dist ) const; + bool Intersects( const BoundingBox& box, _Out_ float& Dist ) const; + bool Intersects( const Vector3& tri0, const Vector3& tri1, const Vector3& tri2, _Out_ float& Dist ) const; + bool Intersects( const Plane& plane, _Out_ float& Dist ) const; +}; + +//------------------------------------------------------------------------------ +// Viewport +class Viewport +{ +public: + float x; + float y; + float width; + float height; + float minDepth; + float maxDepth; + + Viewport() : + x(0.f), y(0.f), width(0.f), height(0.f), minDepth(0.f), maxDepth(1.f) {} + Viewport( float ix, float iy, float iw, float ih, float iminz = 0.f, float imaxz = 1.f ) : + x(ix), y(iy), width(iw), height(ih), minDepth(iminz), maxDepth(imaxz) {} + explicit Viewport(const RECT& rct) : + x(float(rct.left)), y(float(rct.top)), + width(float(rct.right - rct.left)), + height(float(rct.bottom - rct.top)), + minDepth(0.f), maxDepth(1.f) {} + +#if defined(__d3d11_h__) || defined(__d3d11_x_h__) + // Direct3D 11 interop + explicit Viewport(const D3D11_VIEWPORT& vp) : + x(vp.TopLeftX), y(vp.TopLeftY), + width(vp.Width), height(vp.Height), + minDepth(vp.MinDepth), maxDepth(vp.MaxDepth) {} + + operator D3D11_VIEWPORT() { return *reinterpret_cast(this); } + const D3D11_VIEWPORT* Get11() const { return reinterpret_cast(this); } + Viewport& operator= (const D3D11_VIEWPORT& vp); +#endif + +#if defined(__d3d12_h__) || defined(__d3d12_x_h__) + // Direct3D 12 interop + explicit Viewport(const D3D12_VIEWPORT& vp) : + x(vp.TopLeftX), y(vp.TopLeftY), + width(vp.Width), height(vp.Height), + minDepth(vp.MinDepth), maxDepth(vp.MaxDepth) {} + + operator D3D12_VIEWPORT() { return *reinterpret_cast(this); } + const D3D12_VIEWPORT* Get12() const { return reinterpret_cast(this); } + Viewport& operator= (const D3D12_VIEWPORT& vp); +#endif + + // Comparison operators + bool operator == ( const Viewport& vp ) const; + bool operator != ( const Viewport& vp ) const; + + // Assignment operators + Viewport& operator= (const Viewport& vp); + Viewport& operator= (const RECT& rct); + + // Viewport operations + float AspectRatio() const; + + Vector3 Project(const Vector3& p, const Matrix& proj, const Matrix& view, const Matrix& world ) const; + void Project(const Vector3& p, const Matrix& proj, const Matrix& view, const Matrix& world, Vector3& result ) const; + + Vector3 Unproject(const Vector3& p, const Matrix& proj, const Matrix& view, const Matrix& world ) const; + void Unproject(const Vector3& p, const Matrix& proj, const Matrix& view, const Matrix& world, Vector3& result ) const; + + // Static methods + static RECT __cdecl ComputeDisplayArea(DXGI_SCALING scaling, UINT backBufferWidth, UINT backBufferHeight, int outputWidth, int outputHeight); + static RECT __cdecl ComputeTitleSafeArea(UINT backBufferWidth, UINT backBufferHeight); +}; + +#include "SimpleMath.inl" + +}; // namespace SimpleMath + +}; // namespace DirectX + +//------------------------------------------------------------------------------ +// Support for SimpleMath and Standard C++ Library containers +namespace std +{ + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Rectangle& r1, const DirectX::SimpleMath::Rectangle& r2) const + { + return ((r1.x < r2.x) + || ((r1.x == r2.x) && (r1.y < r2.y)) + || ((r1.x == r2.x) && (r1.y == r2.y) && (r1.width < r2.width)) + || ((r1.x == r2.x) && (r1.y == r2.y) && (r1.width == r2.width) && (r1.height < r2.height))); + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Vector2& V1, const DirectX::SimpleMath::Vector2& V2) const + { + return ( (V1.x < V2.x) || ((V1.x == V2.x) && (V1.y < V2.y)) ); + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Vector3& V1, const DirectX::SimpleMath::Vector3& V2) const + { + return ( (V1.x < V2.x) + || ((V1.x == V2.x) && (V1.y < V2.y)) + || ((V1.x == V2.x) && (V1.y == V2.y) && (V1.z < V2.z)) ); + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Vector4& V1, const DirectX::SimpleMath::Vector4& V2) const + { + return ( (V1.x < V2.x) + || ((V1.x == V2.x) && (V1.y < V2.y)) + || ((V1.x == V2.x) && (V1.y == V2.y) && (V1.z < V2.z)) + || ((V1.x == V2.x) && (V1.y == V2.y) && (V1.z == V2.z) && (V1.w < V2.w)) ); + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Matrix& M1, const DirectX::SimpleMath::Matrix& M2) const + { + if (M1._11 != M2._11) return M1._11 < M2._11; + if (M1._12 != M2._12) return M1._12 < M2._12; + if (M1._13 != M2._13) return M1._13 < M2._13; + if (M1._14 != M2._14) return M1._14 < M2._14; + if (M1._21 != M2._21) return M1._21 < M2._21; + if (M1._22 != M2._22) return M1._22 < M2._22; + if (M1._23 != M2._23) return M1._23 < M2._23; + if (M1._24 != M2._24) return M1._24 < M2._24; + if (M1._31 != M2._31) return M1._31 < M2._31; + if (M1._32 != M2._32) return M1._32 < M2._32; + if (M1._33 != M2._33) return M1._33 < M2._33; + if (M1._34 != M2._34) return M1._34 < M2._34; + if (M1._41 != M2._41) return M1._41 < M2._41; + if (M1._42 != M2._42) return M1._42 < M2._42; + if (M1._43 != M2._43) return M1._43 < M2._43; + if (M1._44 != M2._44) return M1._44 < M2._44; + + return false; + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Plane& P1, const DirectX::SimpleMath::Plane& P2) const + { + return ( (P1.x < P2.x) + || ((P1.x == P2.x) && (P1.y < P2.y)) + || ((P1.x == P2.x) && (P1.y == P2.y) && (P1.z < P2.z)) + || ((P1.x == P2.x) && (P1.y == P2.y) && (P1.z == P2.z) && (P1.w < P2.w)) ); + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Quaternion& Q1, const DirectX::SimpleMath::Quaternion& Q2) const + { + return ( (Q1.x < Q2.x) + || ((Q1.x == Q2.x) && (Q1.y < Q2.y)) + || ((Q1.x == Q2.x) && (Q1.y == Q2.y) && (Q1.z < Q2.z)) + || ((Q1.x == Q2.x) && (Q1.y == Q2.y) && (Q1.z == Q2.z) && (Q1.w < Q2.w)) ); + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Color& C1, const DirectX::SimpleMath::Color& C2) const + { + return ( (C1.x < C2.x) + || ((C1.x == C2.x) && (C1.y < C2.y)) + || ((C1.x == C2.x) && (C1.y == C2.y) && (C1.z < C2.z)) + || ((C1.x == C2.x) && (C1.y == C2.y) && (C1.z == C2.z) && (C1.w < C2.w)) ); + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Ray& R1, const DirectX::SimpleMath::Ray& R2) const + { + if (R1.position.x != R2.position.x) return R1.position.x < R2.position.x; + if (R1.position.y != R2.position.y) return R1.position.y < R2.position.y; + if (R1.position.z != R2.position.z) return R1.position.z < R2.position.z; + + if (R1.direction.x != R2.direction.x) return R1.direction.x < R2.direction.x; + if (R1.direction.y != R2.direction.y) return R1.direction.y < R2.direction.y; + if (R1.direction.z != R2.direction.z) return R1.direction.z < R2.direction.z; + + return false; + } + }; + + template<> struct less + { + bool operator()(const DirectX::SimpleMath::Viewport& vp1, const DirectX::SimpleMath::Viewport& vp2) const + { + if (vp1.x != vp2.x) return (vp1.x < vp2.x); + if (vp1.y != vp2.y) return (vp1.y < vp2.y); + + if (vp1.width != vp2.width) return (vp1.width < vp2.width); + if (vp1.height != vp2.height) return (vp1.height < vp2.height); + + if (vp1.minDepth != vp2.minDepth) return (vp1.minDepth < vp2.minDepth); + if (vp1.maxDepth != vp2.maxDepth) return (vp1.maxDepth < vp2.maxDepth); + + return false; + } + }; + +} // namespace std diff --git a/DirectXTK/Inc/SimpleMath.inl b/DirectXTK/Inc/SimpleMath.inl new file mode 100644 index 0000000..ad42b20 --- /dev/null +++ b/DirectXTK/Inc/SimpleMath.inl @@ -0,0 +1,3706 @@ +//------------------------------------------------------------------------------------- +// SimpleMath.inl -- Simplified C++ Math wrapper for DirectXMath +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//------------------------------------------------------------------------------------- + +#pragma once + +/**************************************************************************** +* +* Rectangle +* +****************************************************************************/ + +//------------------------------------------------------------------------------ +// Rectangle operations +//------------------------------------------------------------------------------ +inline Vector2 Rectangle::Location() const +{ + return Vector2(float(x), float(y)); +} + +inline Vector2 Rectangle::Center() const +{ + return Vector2(float(x) + float(width / 2.f), float(y) + float(height / 2.f)); +} + +inline bool Rectangle::Contains(const Vector2& point) const +{ + return (float(x) <= point.x) && (point.x < float(x + width)) && (float(y) <= point.y) && (point.y < float(y + height)); +} + +inline void Rectangle::Inflate(long horizAmount, long vertAmount) +{ + x -= horizAmount; + y -= vertAmount; + width += horizAmount; + height += vertAmount; +} + +//------------------------------------------------------------------------------ +// Static functions +//------------------------------------------------------------------------------ + +inline Rectangle Rectangle::Intersect(const Rectangle& ra, const Rectangle& rb) +{ + long righta = ra.x + ra.width; + long rightb = rb.x + rb.width; + + long bottoma = ra.y + ra.height; + long bottomb = rb.y + rb.height; + + long maxX = ra.x > rb.x ? ra.x : rb.x; + long maxY = ra.y > rb.y ? ra.y : rb.y; + + long minRight = righta < rightb ? righta : rightb; + long minBottom = bottoma < bottomb ? bottoma : bottomb; + + Rectangle result; + + if ((minRight > maxX) && (minBottom > maxY)) + { + result.x = maxX; + result.y = maxY; + result.width = minRight - maxX; + result.height = minBottom - maxY; + } + else + { + result.x = 0; + result.y = 0; + result.width = 0; + result.height = 0; + } + + return result; +} + +inline RECT Rectangle::Intersect(const RECT& rcta, const RECT& rctb) +{ + long maxX = rcta.left > rctb.left ? rcta.left : rctb.left; + long maxY = rcta.top > rctb.top ? rcta.top : rctb.top; + + long minRight = rcta.right < rctb.right ? rcta.right : rctb.right; + long minBottom = rcta.bottom < rctb.bottom ? rcta.bottom : rctb.bottom; + + RECT result; + + if ((minRight > maxX) && (minBottom > maxY)) + { + result.left = maxX; + result.top = maxY; + result.right = minRight; + result.bottom = minBottom; + } + else + { + result.left = 0; + result.top = 0; + result.right = 0; + result.bottom = 0; + } + + return result; +} + +inline Rectangle Rectangle::Union(const Rectangle& ra, const Rectangle& rb) +{ + long righta = ra.x + ra.width; + long rightb = rb.x + rb.width; + + long bottoma = ra.y + ra.height; + long bottomb = rb.y + rb.height; + + int minX = ra.x < rb.x ? ra.x : rb.x; + int minY = ra.y < rb.y ? ra.y : rb.y; + + int maxRight = righta > rightb ? righta : rightb; + int maxBottom = bottoma > bottomb ? bottoma : bottomb; + + Rectangle result; + result.x = minX; + result.y = minY; + result.width = maxRight - minX; + result.height = maxBottom - minY; + return result; +} + +inline RECT Rectangle::Union(const RECT& rcta, const RECT& rctb) +{ + RECT result; + result.left = rcta.left < rctb.left ? rcta.left : rctb.left; + result.top = rcta.top < rctb.top ? rcta.top : rctb.top; + result.right = rcta.right > rctb.right ? rcta.right : rctb.right; + result.bottom = rcta.bottom > rctb.bottom ? rcta.bottom : rctb.bottom; + return result; +} + + +/**************************************************************************** + * + * Vector2 + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparision operators +//------------------------------------------------------------------------------ + +inline bool Vector2::operator == ( const Vector2& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &V ); + return XMVector2Equal( v1, v2 ); +} + +inline bool Vector2::operator != ( const Vector2& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &V ); + return XMVector2NotEqual( v1, v2 ); +} + +//------------------------------------------------------------------------------ +// Assignment operators +//------------------------------------------------------------------------------ + +inline Vector2& Vector2::operator+= (const Vector2& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &V ); + XMVECTOR X = XMVectorAdd(v1,v2); + XMStoreFloat2( this, X ); + return *this; +} + +inline Vector2& Vector2::operator-= (const Vector2& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &V ); + XMVECTOR X = XMVectorSubtract(v1,v2); + XMStoreFloat2( this, X ); + return *this; +} + +inline Vector2& Vector2::operator*= (const Vector2& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &V ); + XMVECTOR X = XMVectorMultiply(v1,v2); + XMStoreFloat2( this, X ); + return *this; +} + +inline Vector2& Vector2::operator*= (float S) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR X = XMVectorScale(v1,S); + XMStoreFloat2( this, X ); + return *this; +} + +inline Vector2& Vector2::operator/= (float S) +{ + using namespace DirectX; + assert( S != 0.0f ); + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR X = XMVectorScale(v1, 1.f/S); + XMStoreFloat2( this, X ); + return *this; +} + +//------------------------------------------------------------------------------ +// Binary operators +//------------------------------------------------------------------------------ + +inline Vector2 operator+ (const Vector2& V1, const Vector2& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &V1 ); + XMVECTOR v2 = XMLoadFloat2( &V2 ); + XMVECTOR X = XMVectorAdd(v1,v2); + Vector2 R; + XMStoreFloat2( &R, X ); + return R; +} + +inline Vector2 operator- (const Vector2& V1, const Vector2& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &V1 ); + XMVECTOR v2 = XMLoadFloat2( &V2 ); + XMVECTOR X = XMVectorSubtract(v1,v2); + Vector2 R; + XMStoreFloat2( &R, X ); + return R; +} + +inline Vector2 operator* (const Vector2& V1, const Vector2& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &V1 ); + XMVECTOR v2 = XMLoadFloat2( &V2 ); + XMVECTOR X = XMVectorMultiply(v1,v2); + Vector2 R; + XMStoreFloat2( &R, X ); + return R; +} + +inline Vector2 operator* (const Vector2& V, float S) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &V ); + XMVECTOR X = XMVectorScale(v1,S); + Vector2 R; + XMStoreFloat2( &R, X ); + return R; +} + +inline Vector2 operator/ (const Vector2& V1, const Vector2& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &V1 ); + XMVECTOR v2 = XMLoadFloat2( &V2 ); + XMVECTOR X = XMVectorDivide(v1,v2); + Vector2 R; + XMStoreFloat2( &R, X ); + return R; +} + +inline Vector2 operator* (float S, const Vector2& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &V ); + XMVECTOR X = XMVectorScale(v1,S); + Vector2 R; + XMStoreFloat2( &R, X ); + return R; +} + +//------------------------------------------------------------------------------ +// Vector operations +//------------------------------------------------------------------------------ + +inline bool Vector2::InBounds( const Vector2& Bounds ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &Bounds ); + return XMVector2InBounds( v1, v2 ); +} + +inline float Vector2::Length() const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR X = XMVector2Length( v1 ); + return XMVectorGetX( X ); +} + +inline float Vector2::LengthSquared() const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR X = XMVector2LengthSq( v1 ); + return XMVectorGetX( X ); +} + +inline float Vector2::Dot( const Vector2& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &V ); + XMVECTOR X = XMVector2Dot( v1, v2 ); + return XMVectorGetX( X ); +} + +inline void Vector2::Cross( const Vector2& V, Vector2& result ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &V ); + XMVECTOR R = XMVector2Cross( v1, v2 ); + XMStoreFloat2( &result, R ); +} + +inline Vector2 Vector2::Cross( const Vector2& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &V ); + XMVECTOR R = XMVector2Cross( v1, v2 ); + + Vector2 result; + XMStoreFloat2( &result, R ); + return result; +} + +inline void Vector2::Normalize() +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR X = XMVector2Normalize( v1 ); + XMStoreFloat2( this, X ); +} + +inline void Vector2::Normalize( Vector2& result ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR X = XMVector2Normalize( v1 ); + XMStoreFloat2( &result, X ); +} + +inline void Vector2::Clamp( const Vector2& vmin, const Vector2& vmax ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &vmin ); + XMVECTOR v3 = XMLoadFloat2( &vmax ); + XMVECTOR X = XMVectorClamp( v1, v2, v3 ); + XMStoreFloat2( this, X ); +} + +inline void Vector2::Clamp( const Vector2& vmin, const Vector2& vmax, Vector2& result ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( this ); + XMVECTOR v2 = XMLoadFloat2( &vmin ); + XMVECTOR v3 = XMLoadFloat2( &vmax ); + XMVECTOR X = XMVectorClamp( v1, v2, v3 ); + XMStoreFloat2( &result, X ); +} + +//------------------------------------------------------------------------------ +// Static functions +//------------------------------------------------------------------------------ + +inline float Vector2::Distance( const Vector2& v1, const Vector2& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR V = XMVectorSubtract( x2, x1 ); + XMVECTOR X = XMVector2Length( V ); + return XMVectorGetX( X ); +} + +inline float Vector2::DistanceSquared( const Vector2& v1, const Vector2& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR V = XMVectorSubtract( x2, x1 ); + XMVECTOR X = XMVector2LengthSq( V ); + return XMVectorGetX( X ); +} + +inline void Vector2::Min( const Vector2& v1, const Vector2& v2, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR X = XMVectorMin( x1, x2 ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Min( const Vector2& v1, const Vector2& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR X = XMVectorMin( x1, x2 ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::Max( const Vector2& v1, const Vector2& v2, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR X = XMVectorMax( x1, x2 ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Max( const Vector2& v1, const Vector2& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR X = XMVectorMax( x1, x2 ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::Lerp( const Vector2& v1, const Vector2& v2, float t, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Lerp( const Vector2& v1, const Vector2& v2, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::SmoothStep( const Vector2& v1, const Vector2& v2, float t, Vector2& result ) +{ + using namespace DirectX; + t = (t > 1.0f) ? 1.0f : ((t < 0.0f) ? 0.0f : t); // Clamp value to 0 to 1 + t = t*t*(3.f - 2.f*t); + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::SmoothStep( const Vector2& v1, const Vector2& v2, float t ) +{ + using namespace DirectX; + t = (t > 1.0f) ? 1.0f : ((t < 0.0f) ? 0.0f : t); // Clamp value to 0 to 1 + t = t*t*(3.f - 2.f*t); + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::Barycentric( const Vector2& v1, const Vector2& v2, const Vector2& v3, float f, float g, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR x3 = XMLoadFloat2( &v3 ); + XMVECTOR X = XMVectorBaryCentric( x1, x2, x3, f, g ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Barycentric( const Vector2& v1, const Vector2& v2, const Vector2& v3, float f, float g ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR x3 = XMLoadFloat2( &v3 ); + XMVECTOR X = XMVectorBaryCentric( x1, x2, x3, f, g ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::CatmullRom( const Vector2& v1, const Vector2& v2, const Vector2& v3, const Vector2& v4, float t, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR x3 = XMLoadFloat2( &v3 ); + XMVECTOR x4 = XMLoadFloat2( &v4 ); + XMVECTOR X = XMVectorCatmullRom( x1, x2, x3, x4, t ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::CatmullRom( const Vector2& v1, const Vector2& v2, const Vector2& v3, const Vector2& v4, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &v2 ); + XMVECTOR x3 = XMLoadFloat2( &v3 ); + XMVECTOR x4 = XMLoadFloat2( &v4 ); + XMVECTOR X = XMVectorCatmullRom( x1, x2, x3, x4, t ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::Hermite( const Vector2& v1, const Vector2& t1, const Vector2& v2, const Vector2& t2, float t, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &t1 ); + XMVECTOR x3 = XMLoadFloat2( &v2 ); + XMVECTOR x4 = XMLoadFloat2( &t2 ); + XMVECTOR X = XMVectorHermite( x1, x2, x3, x4, t ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Hermite( const Vector2& v1, const Vector2& t1, const Vector2& v2, const Vector2& t2, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat2( &v1 ); + XMVECTOR x2 = XMLoadFloat2( &t1 ); + XMVECTOR x3 = XMLoadFloat2( &v2 ); + XMVECTOR x4 = XMLoadFloat2( &t2 ); + XMVECTOR X = XMVectorHermite( x1, x2, x3, x4, t ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::Reflect( const Vector2& ivec, const Vector2& nvec, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat2( &ivec ); + XMVECTOR n = XMLoadFloat2( &nvec ); + XMVECTOR X = XMVector2Reflect( i, n ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Reflect( const Vector2& ivec, const Vector2& nvec ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat2( &ivec ); + XMVECTOR n = XMLoadFloat2( &nvec ); + XMVECTOR X = XMVector2Reflect( i, n ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::Refract( const Vector2& ivec, const Vector2& nvec, float refractionIndex, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat2( &ivec ); + XMVECTOR n = XMLoadFloat2( &nvec ); + XMVECTOR X = XMVector2Refract( i, n, refractionIndex ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Refract( const Vector2& ivec, const Vector2& nvec, float refractionIndex ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat2( &ivec ); + XMVECTOR n = XMLoadFloat2( &nvec ); + XMVECTOR X = XMVector2Refract( i, n, refractionIndex ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::Transform( const Vector2& v, const Quaternion& quat, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Transform( const Vector2& v, const Quaternion& quat ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +inline void Vector2::Transform( const Vector2& v, const Matrix& m, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector2TransformCoord( v1, M ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::Transform( const Vector2& v, const Matrix& m ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector2TransformCoord( v1, M ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +_Use_decl_annotations_ +inline void Vector2::Transform( const Vector2* varray, size_t count, const Matrix& m, Vector2* resultArray ) +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVector2TransformCoordStream( resultArray, sizeof(XMFLOAT2), varray, sizeof(XMFLOAT2), count, M ); +} + +inline void Vector2::Transform( const Vector2& v, const Matrix& m, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector2Transform( v1, M ); + XMStoreFloat4( &result, X ); +} + +_Use_decl_annotations_ +inline void Vector2::Transform( const Vector2* varray, size_t count, const Matrix& m, Vector4* resultArray ) +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVector2TransformStream( resultArray, sizeof(XMFLOAT4), varray, sizeof(XMFLOAT2), count, M ); +} + +inline void Vector2::TransformNormal( const Vector2& v, const Matrix& m, Vector2& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector2TransformNormal( v1, M ); + XMStoreFloat2( &result, X ); +} + +inline Vector2 Vector2::TransformNormal( const Vector2& v, const Matrix& m ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector2TransformNormal( v1, M ); + + Vector2 result; + XMStoreFloat2( &result, X ); + return result; +} + +_Use_decl_annotations_ +inline void Vector2::TransformNormal( const Vector2* varray, size_t count, const Matrix& m, Vector2* resultArray ) +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVector2TransformNormalStream( resultArray, sizeof(XMFLOAT2), varray, sizeof(XMFLOAT2), count, M ); +} + + +/**************************************************************************** + * + * Vector3 + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparision operators +//------------------------------------------------------------------------------ + +inline bool Vector3::operator == ( const Vector3& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &V ); + return XMVector3Equal( v1, v2 ); +} + +inline bool Vector3::operator != ( const Vector3& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &V ); + return XMVector3NotEqual( v1, v2 ); +} + +//------------------------------------------------------------------------------ +// Assignment operators +//------------------------------------------------------------------------------ + +inline Vector3& Vector3::operator+= (const Vector3& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &V ); + XMVECTOR X = XMVectorAdd(v1,v2); + XMStoreFloat3( this, X ); + return *this; +} + +inline Vector3& Vector3::operator-= (const Vector3& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &V ); + XMVECTOR X = XMVectorSubtract(v1,v2); + XMStoreFloat3( this, X ); + return *this; +} + +inline Vector3& Vector3::operator*= (const Vector3& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &V ); + XMVECTOR X = XMVectorMultiply(v1,v2); + XMStoreFloat3( this, X ); + return *this; +} + +inline Vector3& Vector3::operator*= (float S) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR X = XMVectorScale(v1,S); + XMStoreFloat3( this, X ); + return *this; +} + +inline Vector3& Vector3::operator/= (float S) +{ + using namespace DirectX; + assert( S != 0.0f ); + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR X = XMVectorScale(v1, 1.f/S); + XMStoreFloat3( this, X ); + return *this; +} + +//------------------------------------------------------------------------------ +// Urnary operators +//------------------------------------------------------------------------------ + +inline Vector3 Vector3::operator- () const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR X = XMVectorNegate( v1 ); + Vector3 R; + XMStoreFloat3( &R, X ); + return R; +} + +//------------------------------------------------------------------------------ +// Binary operators +//------------------------------------------------------------------------------ + +inline Vector3 operator+ (const Vector3& V1, const Vector3& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &V1 ); + XMVECTOR v2 = XMLoadFloat3( &V2 ); + XMVECTOR X = XMVectorAdd(v1,v2); + Vector3 R; + XMStoreFloat3( &R, X ); + return R; +} + +inline Vector3 operator- (const Vector3& V1, const Vector3& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &V1 ); + XMVECTOR v2 = XMLoadFloat3( &V2 ); + XMVECTOR X = XMVectorSubtract(v1,v2); + Vector3 R; + XMStoreFloat3( &R, X ); + return R; +} + +inline Vector3 operator* (const Vector3& V1, const Vector3& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &V1 ); + XMVECTOR v2 = XMLoadFloat3( &V2 ); + XMVECTOR X = XMVectorMultiply(v1,v2); + Vector3 R; + XMStoreFloat3( &R, X ); + return R; +} + +inline Vector3 operator* (const Vector3& V, float S) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &V ); + XMVECTOR X = XMVectorScale(v1,S); + Vector3 R; + XMStoreFloat3( &R, X ); + return R; +} + +inline Vector3 operator/ (const Vector3& V1, const Vector3& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &V1 ); + XMVECTOR v2 = XMLoadFloat3( &V2 ); + XMVECTOR X = XMVectorDivide(v1,v2); + Vector3 R; + XMStoreFloat3( &R, X ); + return R; +} + +inline Vector3 operator* (float S, const Vector3& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &V ); + XMVECTOR X = XMVectorScale(v1,S); + Vector3 R; + XMStoreFloat3( &R, X ); + return R; +} + +//------------------------------------------------------------------------------ +// Vector operations +//------------------------------------------------------------------------------ + +inline bool Vector3::InBounds( const Vector3& Bounds ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &Bounds ); + return XMVector3InBounds( v1, v2 ); +} + +inline float Vector3::Length() const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR X = XMVector3Length( v1 ); + return XMVectorGetX( X ); +} + +inline float Vector3::LengthSquared() const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR X = XMVector3LengthSq( v1 ); + return XMVectorGetX( X ); +} + +inline float Vector3::Dot( const Vector3& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &V ); + XMVECTOR X = XMVector3Dot( v1, v2 ); + return XMVectorGetX( X ); +} + +inline void Vector3::Cross( const Vector3& V, Vector3& result ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &V ); + XMVECTOR R = XMVector3Cross( v1, v2 ); + XMStoreFloat3( &result, R ); +} + +inline Vector3 Vector3::Cross( const Vector3& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &V ); + XMVECTOR R = XMVector3Cross( v1, v2 ); + + Vector3 result; + XMStoreFloat3( &result, R ); + return result; +} + +inline void Vector3::Normalize() +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR X = XMVector3Normalize( v1 ); + XMStoreFloat3( this, X ); +} + +inline void Vector3::Normalize( Vector3& result ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR X = XMVector3Normalize( v1 ); + XMStoreFloat3( &result, X ); +} + +inline void Vector3::Clamp( const Vector3& vmin, const Vector3& vmax ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &vmin ); + XMVECTOR v3 = XMLoadFloat3( &vmax ); + XMVECTOR X = XMVectorClamp( v1, v2, v3 ); + XMStoreFloat3( this, X ); +} + +inline void Vector3::Clamp( const Vector3& vmin, const Vector3& vmax, Vector3& result ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( this ); + XMVECTOR v2 = XMLoadFloat3( &vmin ); + XMVECTOR v3 = XMLoadFloat3( &vmax ); + XMVECTOR X = XMVectorClamp( v1, v2, v3 ); + XMStoreFloat3( &result, X ); +} + +//------------------------------------------------------------------------------ +// Static functions +//------------------------------------------------------------------------------ + +inline float Vector3::Distance( const Vector3& v1, const Vector3& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR V = XMVectorSubtract( x2, x1 ); + XMVECTOR X = XMVector3Length( V ); + return XMVectorGetX( X ); +} + +inline float Vector3::DistanceSquared( const Vector3& v1, const Vector3& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR V = XMVectorSubtract( x2, x1 ); + XMVECTOR X = XMVector3LengthSq( V ); + return XMVectorGetX( X ); +} + +inline void Vector3::Min( const Vector3& v1, const Vector3& v2, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR X = XMVectorMin( x1, x2 ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Min( const Vector3& v1, const Vector3& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR X = XMVectorMin( x1, x2 ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::Max( const Vector3& v1, const Vector3& v2, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR X = XMVectorMax( x1, x2 ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Max( const Vector3& v1, const Vector3& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR X = XMVectorMax( x1, x2 ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::Lerp( const Vector3& v1, const Vector3& v2, float t, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Lerp( const Vector3& v1, const Vector3& v2, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::SmoothStep( const Vector3& v1, const Vector3& v2, float t, Vector3& result ) +{ + using namespace DirectX; + t = (t > 1.0f) ? 1.0f : ((t < 0.0f) ? 0.0f : t); // Clamp value to 0 to 1 + t = t*t*(3.f - 2.f*t); + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::SmoothStep( const Vector3& v1, const Vector3& v2, float t ) +{ + using namespace DirectX; + t = (t > 1.0f) ? 1.0f : ((t < 0.0f) ? 0.0f : t); // Clamp value to 0 to 1 + t = t*t*(3.f - 2.f*t); + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::Barycentric( const Vector3& v1, const Vector3& v2, const Vector3& v3, float f, float g, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR x3 = XMLoadFloat3( &v3 ); + XMVECTOR X = XMVectorBaryCentric( x1, x2, x3, f, g ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Barycentric( const Vector3& v1, const Vector3& v2, const Vector3& v3, float f, float g ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR x3 = XMLoadFloat3( &v3 ); + XMVECTOR X = XMVectorBaryCentric( x1, x2, x3, f, g ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::CatmullRom( const Vector3& v1, const Vector3& v2, const Vector3& v3, const Vector3& v4, float t, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR x3 = XMLoadFloat3( &v3 ); + XMVECTOR x4 = XMLoadFloat3( &v4 ); + XMVECTOR X = XMVectorCatmullRom( x1, x2, x3, x4, t ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::CatmullRom( const Vector3& v1, const Vector3& v2, const Vector3& v3, const Vector3& v4, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &v2 ); + XMVECTOR x3 = XMLoadFloat3( &v3 ); + XMVECTOR x4 = XMLoadFloat3( &v4 ); + XMVECTOR X = XMVectorCatmullRom( x1, x2, x3, x4, t ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::Hermite( const Vector3& v1, const Vector3& t1, const Vector3& v2, const Vector3& t2, float t, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &t1 ); + XMVECTOR x3 = XMLoadFloat3( &v2 ); + XMVECTOR x4 = XMLoadFloat3( &t2 ); + XMVECTOR X = XMVectorHermite( x1, x2, x3, x4, t ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Hermite( const Vector3& v1, const Vector3& t1, const Vector3& v2, const Vector3& t2, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat3( &v1 ); + XMVECTOR x2 = XMLoadFloat3( &t1 ); + XMVECTOR x3 = XMLoadFloat3( &v2 ); + XMVECTOR x4 = XMLoadFloat3( &t2 ); + XMVECTOR X = XMVectorHermite( x1, x2, x3, x4, t ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::Reflect( const Vector3& ivec, const Vector3& nvec, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat3( &ivec ); + XMVECTOR n = XMLoadFloat3( &nvec ); + XMVECTOR X = XMVector3Reflect( i, n ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Reflect( const Vector3& ivec, const Vector3& nvec ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat3( &ivec ); + XMVECTOR n = XMLoadFloat3( &nvec ); + XMVECTOR X = XMVector3Reflect( i, n ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::Refract( const Vector3& ivec, const Vector3& nvec, float refractionIndex, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat3( &ivec ); + XMVECTOR n = XMLoadFloat3( &nvec ); + XMVECTOR X = XMVector3Refract( i, n, refractionIndex ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Refract( const Vector3& ivec, const Vector3& nvec, float refractionIndex ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat3( &ivec ); + XMVECTOR n = XMLoadFloat3( &nvec ); + XMVECTOR X = XMVector3Refract( i, n, refractionIndex ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::Transform( const Vector3& v, const Quaternion& quat, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Transform( const Vector3& v, const Quaternion& quat ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +inline void Vector3::Transform( const Vector3& v, const Matrix& m, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector3TransformCoord( v1, M ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::Transform( const Vector3& v, const Matrix& m ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector3TransformCoord( v1, M ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +_Use_decl_annotations_ +inline void Vector3::Transform( const Vector3* varray, size_t count, const Matrix& m, Vector3* resultArray ) +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVector3TransformCoordStream( resultArray, sizeof(XMFLOAT3), varray, sizeof(XMFLOAT3), count, M ); +} + +inline void Vector3::Transform( const Vector3& v, const Matrix& m, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector3Transform( v1, M ); + XMStoreFloat4( &result, X ); +} + +_Use_decl_annotations_ +inline void Vector3::Transform( const Vector3* varray, size_t count, const Matrix& m, Vector4* resultArray ) +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVector3TransformStream( resultArray, sizeof(XMFLOAT4), varray, sizeof(XMFLOAT3), count, M ); +} + +inline void Vector3::TransformNormal( const Vector3& v, const Matrix& m, Vector3& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector3TransformNormal( v1, M ); + XMStoreFloat3( &result, X ); +} + +inline Vector3 Vector3::TransformNormal( const Vector3& v, const Matrix& m ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector3TransformNormal( v1, M ); + + Vector3 result; + XMStoreFloat3( &result, X ); + return result; +} + +_Use_decl_annotations_ +inline void Vector3::TransformNormal( const Vector3* varray, size_t count, const Matrix& m, Vector3* resultArray ) +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVector3TransformNormalStream( resultArray, sizeof(XMFLOAT3), varray, sizeof(XMFLOAT3), count, M ); +} + + +/**************************************************************************** + * + * Vector4 + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparision operators +//------------------------------------------------------------------------------ + +inline bool Vector4::operator == ( const Vector4& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &V ); + return XMVector4Equal( v1, v2 ); +} + +inline bool Vector4::operator != ( const Vector4& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &V ); + return XMVector4NotEqual( v1, v2 ); +} + +//------------------------------------------------------------------------------ +// Assignment operators +//------------------------------------------------------------------------------ + +inline Vector4& Vector4::operator+= (const Vector4& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &V ); + XMVECTOR X = XMVectorAdd(v1,v2); + XMStoreFloat4( this, X ); + return *this; +} + +inline Vector4& Vector4::operator-= (const Vector4& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &V ); + XMVECTOR X = XMVectorSubtract(v1,v2); + XMStoreFloat4( this, X ); + return *this; +} + +inline Vector4& Vector4::operator*= (const Vector4& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &V ); + XMVECTOR X = XMVectorMultiply(v1,v2); + XMStoreFloat4( this, X ); + return *this; +} + +inline Vector4& Vector4::operator*= (float S) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR X = XMVectorScale(v1,S); + XMStoreFloat4( this, X ); + return *this; +} + +inline Vector4& Vector4::operator/= (float S) +{ + using namespace DirectX; + assert( S != 0.0f ); + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR X = XMVectorScale(v1, 1.f/S); + XMStoreFloat4( this, X ); + return *this; +} + +//------------------------------------------------------------------------------ +// Urnary operators +//------------------------------------------------------------------------------ + +inline Vector4 Vector4::operator- () const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR X = XMVectorNegate( v1 ); + Vector4 R; + XMStoreFloat4( &R, X ); + return R; +} + +//------------------------------------------------------------------------------ +// Binary operators +//------------------------------------------------------------------------------ + +inline Vector4 operator+ (const Vector4& V1, const Vector4& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &V1 ); + XMVECTOR v2 = XMLoadFloat4( &V2 ); + XMVECTOR X = XMVectorAdd(v1,v2); + Vector4 R; + XMStoreFloat4( &R, X ); + return R; +} + +inline Vector4 operator- (const Vector4& V1, const Vector4& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &V1 ); + XMVECTOR v2 = XMLoadFloat4( &V2 ); + XMVECTOR X = XMVectorSubtract(v1,v2); + Vector4 R; + XMStoreFloat4( &R, X ); + return R; +} + +inline Vector4 operator* (const Vector4& V1, const Vector4& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &V1 ); + XMVECTOR v2 = XMLoadFloat4( &V2 ); + XMVECTOR X = XMVectorMultiply(v1,v2); + Vector4 R; + XMStoreFloat4( &R, X ); + return R; +} + +inline Vector4 operator* (const Vector4& V, float S) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &V ); + XMVECTOR X = XMVectorScale(v1,S); + Vector4 R; + XMStoreFloat4( &R, X ); + return R; +} + +inline Vector4 operator/ (const Vector4& V1, const Vector4& V2) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &V1 ); + XMVECTOR v2 = XMLoadFloat4( &V2 ); + XMVECTOR X = XMVectorDivide(v1,v2); + Vector4 R; + XMStoreFloat4( &R, X ); + return R; +} + +inline Vector4 operator* (float S, const Vector4& V) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &V ); + XMVECTOR X = XMVectorScale(v1,S); + Vector4 R; + XMStoreFloat4( &R, X ); + return R; +} + +//------------------------------------------------------------------------------ +// Vector operations +//------------------------------------------------------------------------------ + +inline bool Vector4::InBounds( const Vector4& Bounds ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &Bounds ); + return XMVector4InBounds( v1, v2 ); +} + +inline float Vector4::Length() const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR X = XMVector4Length( v1 ); + return XMVectorGetX( X ); +} + +inline float Vector4::LengthSquared() const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR X = XMVector4LengthSq( v1 ); + return XMVectorGetX( X ); +} + +inline float Vector4::Dot( const Vector4& V ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &V ); + XMVECTOR X = XMVector4Dot( v1, v2 ); + return XMVectorGetX( X ); +} + +inline void Vector4::Cross( const Vector4& v1, const Vector4& v2, Vector4& result ) const +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( this ); + XMVECTOR x2 = XMLoadFloat4( &v1 ); + XMVECTOR x3 = XMLoadFloat4( &v2 ); + XMVECTOR R = XMVector4Cross( x1, x2, x3 ); + XMStoreFloat4( &result, R ); +} + +inline Vector4 Vector4::Cross( const Vector4& v1, const Vector4& v2 ) const +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( this ); + XMVECTOR x2 = XMLoadFloat4( &v1 ); + XMVECTOR x3 = XMLoadFloat4( &v2 ); + XMVECTOR R = XMVector4Cross( x1, x2, x3 ); + + Vector4 result; + XMStoreFloat4( &result, R ); + return result; +} + +inline void Vector4::Normalize() +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR X = XMVector4Normalize( v1 ); + XMStoreFloat4( this, X ); +} + +inline void Vector4::Normalize( Vector4& result ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR X = XMVector4Normalize( v1 ); + XMStoreFloat4( &result, X ); +} + +inline void Vector4::Clamp( const Vector4& vmin, const Vector4& vmax ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &vmin ); + XMVECTOR v3 = XMLoadFloat4( &vmax ); + XMVECTOR X = XMVectorClamp( v1, v2, v3 ); + XMStoreFloat4( this, X ); +} + +inline void Vector4::Clamp( const Vector4& vmin, const Vector4& vmax, Vector4& result ) const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( this ); + XMVECTOR v2 = XMLoadFloat4( &vmin ); + XMVECTOR v3 = XMLoadFloat4( &vmax ); + XMVECTOR X = XMVectorClamp( v1, v2, v3 ); + XMStoreFloat4( &result, X ); +} + +//------------------------------------------------------------------------------ +// Static functions +//------------------------------------------------------------------------------ + +inline float Vector4::Distance( const Vector4& v1, const Vector4& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR V = XMVectorSubtract( x2, x1 ); + XMVECTOR X = XMVector4Length( V ); + return XMVectorGetX( X ); +} + +inline float Vector4::DistanceSquared( const Vector4& v1, const Vector4& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR V = XMVectorSubtract( x2, x1 ); + XMVECTOR X = XMVector4LengthSq( V ); + return XMVectorGetX( X ); +} + +inline void Vector4::Min( const Vector4& v1, const Vector4& v2, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR X = XMVectorMin( x1, x2 ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Min( const Vector4& v1, const Vector4& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR X = XMVectorMin( x1, x2 ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Max( const Vector4& v1, const Vector4& v2, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR X = XMVectorMax( x1, x2 ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Max( const Vector4& v1, const Vector4& v2 ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR X = XMVectorMax( x1, x2 ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Lerp( const Vector4& v1, const Vector4& v2, float t, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Lerp( const Vector4& v1, const Vector4& v2, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::SmoothStep( const Vector4& v1, const Vector4& v2, float t, Vector4& result ) +{ + using namespace DirectX; + t = (t > 1.0f) ? 1.0f : ((t < 0.0f) ? 0.0f : t); // Clamp value to 0 to 1 + t = t*t*(3.f - 2.f*t); + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::SmoothStep( const Vector4& v1, const Vector4& v2, float t ) +{ + using namespace DirectX; + t = (t > 1.0f) ? 1.0f : ((t < 0.0f) ? 0.0f : t); // Clamp value to 0 to 1 + t = t*t*(3.f - 2.f*t); + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR X = XMVectorLerp( x1, x2, t ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Barycentric( const Vector4& v1, const Vector4& v2, const Vector4& v3, float f, float g, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR x3 = XMLoadFloat4( &v3 ); + XMVECTOR X = XMVectorBaryCentric( x1, x2, x3, f, g ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Barycentric( const Vector4& v1, const Vector4& v2, const Vector4& v3, float f, float g ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR x3 = XMLoadFloat4( &v3 ); + XMVECTOR X = XMVectorBaryCentric( x1, x2, x3, f, g ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::CatmullRom( const Vector4& v1, const Vector4& v2, const Vector4& v3, const Vector4& v4, float t, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR x3 = XMLoadFloat4( &v3 ); + XMVECTOR x4 = XMLoadFloat4( &v4 ); + XMVECTOR X = XMVectorCatmullRom( x1, x2, x3, x4, t ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::CatmullRom( const Vector4& v1, const Vector4& v2, const Vector4& v3, const Vector4& v4, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &v2 ); + XMVECTOR x3 = XMLoadFloat4( &v3 ); + XMVECTOR x4 = XMLoadFloat4( &v4 ); + XMVECTOR X = XMVectorCatmullRom( x1, x2, x3, x4, t ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Hermite( const Vector4& v1, const Vector4& t1, const Vector4& v2, const Vector4& t2, float t, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &t1 ); + XMVECTOR x3 = XMLoadFloat4( &v2 ); + XMVECTOR x4 = XMLoadFloat4( &t2 ); + XMVECTOR X = XMVectorHermite( x1, x2, x3, x4, t ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Hermite( const Vector4& v1, const Vector4& t1, const Vector4& v2, const Vector4& t2, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( &v1 ); + XMVECTOR x2 = XMLoadFloat4( &t1 ); + XMVECTOR x3 = XMLoadFloat4( &v2 ); + XMVECTOR x4 = XMLoadFloat4( &t2 ); + XMVECTOR X = XMVectorHermite( x1, x2, x3, x4, t ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Reflect( const Vector4& ivec, const Vector4& nvec, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat4( &ivec ); + XMVECTOR n = XMLoadFloat4( &nvec ); + XMVECTOR X = XMVector4Reflect( i, n ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Reflect( const Vector4& ivec, const Vector4& nvec ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat4( &ivec ); + XMVECTOR n = XMLoadFloat4( &nvec ); + XMVECTOR X = XMVector4Reflect( i, n ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Refract( const Vector4& ivec, const Vector4& nvec, float refractionIndex, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat4( &ivec ); + XMVECTOR n = XMLoadFloat4( &nvec ); + XMVECTOR X = XMVector4Refract( i, n, refractionIndex ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Refract( const Vector4& ivec, const Vector4& nvec, float refractionIndex ) +{ + using namespace DirectX; + XMVECTOR i = XMLoadFloat4( &ivec ); + XMVECTOR n = XMLoadFloat4( &nvec ); + XMVECTOR X = XMVector4Refract( i, n, refractionIndex ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Transform( const Vector2& v, const Quaternion& quat, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + X = XMVectorSelect( g_XMIdentityR3, X, g_XMSelect1110 ); // result.w = 1.f + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Transform( const Vector2& v, const Quaternion& quat ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat2( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + X = XMVectorSelect( g_XMIdentityR3, X, g_XMSelect1110 ); // result.w = 1.f + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Transform( const Vector3& v, const Quaternion& quat, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + X = XMVectorSelect( g_XMIdentityR3, X, g_XMSelect1110 ); // result.w = 1.f + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Transform( const Vector3& v, const Quaternion& quat ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat3( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + X = XMVectorSelect( g_XMIdentityR3, X, g_XMSelect1110 ); // result.w = 1.f + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Transform( const Vector4& v, const Quaternion& quat, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + X = XMVectorSelect( v1, X, g_XMSelect1110 ); // result.w = v.w + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Transform( const Vector4& v, const Quaternion& quat ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &v ); + XMVECTOR q = XMLoadFloat4( &quat ); + XMVECTOR X = XMVector3Rotate( v1, q ); + X = XMVectorSelect( v1, X, g_XMSelect1110 ); // result.w = v.w + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +inline void Vector4::Transform( const Vector4& v, const Matrix& m, Vector4& result ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector4Transform( v1, M ); + XMStoreFloat4( &result, X ); +} + +inline Vector4 Vector4::Transform( const Vector4& v, const Matrix& m ) +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( &v ); + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVECTOR X = XMVector4Transform( v1, M ); + + Vector4 result; + XMStoreFloat4( &result, X ); + return result; +} + +_Use_decl_annotations_ +inline void Vector4::Transform( const Vector4* varray, size_t count, const Matrix& m, Vector4* resultArray ) +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( &m ); + XMVector4TransformStream( resultArray, sizeof(XMFLOAT4), varray, sizeof(XMFLOAT4), count, M ); +} + + +/**************************************************************************** + * + * Matrix + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparision operators +//------------------------------------------------------------------------------ + +inline bool Matrix::operator == ( const Matrix& M ) const +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&_11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&_21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&_31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&_41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M._41) ); + + return ( XMVector4Equal( x1, y1 ) + && XMVector4Equal( x2, y2 ) + && XMVector4Equal( x3, y3 ) + && XMVector4Equal( x4, y4 ) ) != 0; +} + +inline bool Matrix::operator != ( const Matrix& M ) const +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&_11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&_21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&_31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&_41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M._41) ); + + return ( XMVector4NotEqual( x1, y1 ) + || XMVector4NotEqual( x2, y2 ) + || XMVector4NotEqual( x3, y3 ) + || XMVector4NotEqual( x4, y4 ) ) != 0; +} + +//------------------------------------------------------------------------------ +// Assignment operators +//------------------------------------------------------------------------------ + +inline Matrix::Matrix(const XMFLOAT3X3& M) +{ + _11 = M._11; _12 = M._12; _13 = M._13; _14 = 0.f; + _21 = M._21; _22 = M._22; _23 = M._23; _24 = 0.f; + _31 = M._31; _32 = M._32; _33 = M._33; _34 = 0.f; + _41 = 0.f; _42 = 0.f; _43 = 0.f; _44 = 1.f; +} + +inline Matrix::Matrix(const XMFLOAT4X3& M) +{ + _11 = M._11; _12 = M._12; _13 = M._13; _14 = 0.f; + _21 = M._21; _22 = M._22; _23 = M._23; _24 = 0.f; + _31 = M._31; _32 = M._32; _33 = M._33; _34 = 0.f; + _41 = M._41; _42 = M._42; _43 = M._43; _44 = 1.f; +} + +inline Matrix& Matrix::operator= (const XMFLOAT3X3& M) +{ + _11 = M._11; _12 = M._12; _13 = M._13; _14 = 0.f; + _21 = M._21; _22 = M._22; _23 = M._23; _24 = 0.f; + _31 = M._31; _32 = M._32; _33 = M._33; _34 = 0.f; + _41 = 0.f; _42 = 0.f; _43 = 0.f; _44 = 1.f; + return *this; +} + +inline Matrix& Matrix::operator= (const XMFLOAT4X3& M) +{ + _11 = M._11; _12 = M._12; _13 = M._13; _14 = 0.f; + _21 = M._21; _22 = M._22; _23 = M._23; _24 = 0.f; + _31 = M._31; _32 = M._32; _33 = M._33; _34 = 0.f; + _41 = M._41; _42 = M._42; _43 = M._43; _44 = 1.f; + return *this; +} + +inline Matrix& Matrix::operator+= (const Matrix& M) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&_11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&_21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&_31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&_41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M._41) ); + + x1 = XMVectorAdd( x1, y1 ); + x2 = XMVectorAdd( x2, y2 ); + x3 = XMVectorAdd( x3, y3 ); + x4 = XMVectorAdd( x4, y4 ); + + XMStoreFloat4( reinterpret_cast(&_11), x1 ); + XMStoreFloat4( reinterpret_cast(&_21), x2 ); + XMStoreFloat4( reinterpret_cast(&_31), x3 ); + XMStoreFloat4( reinterpret_cast(&_41), x4 ); + return *this; +} + +inline Matrix& Matrix::operator-= (const Matrix& M) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&_11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&_21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&_31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&_41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M._41) ); + + x1 = XMVectorSubtract( x1, y1 ); + x2 = XMVectorSubtract( x2, y2 ); + x3 = XMVectorSubtract( x3, y3 ); + x4 = XMVectorSubtract( x4, y4 ); + + XMStoreFloat4( reinterpret_cast(&_11), x1 ); + XMStoreFloat4( reinterpret_cast(&_21), x2 ); + XMStoreFloat4( reinterpret_cast(&_31), x3 ); + XMStoreFloat4( reinterpret_cast(&_41), x4 ); + return *this; +} + +inline Matrix& Matrix::operator*= (const Matrix& M) +{ + using namespace DirectX; + XMMATRIX M1 = XMLoadFloat4x4( this ); + XMMATRIX M2 = XMLoadFloat4x4( &M ); + XMMATRIX X = XMMatrixMultiply( M1, M2 ); + XMStoreFloat4x4( this, X ); + return *this; +} + +inline Matrix& Matrix::operator*= (float S) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&_11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&_21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&_31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&_41) ); + + x1 = XMVectorScale( x1, S ); + x2 = XMVectorScale( x2, S ); + x3 = XMVectorScale( x3, S ); + x4 = XMVectorScale( x4, S ); + + XMStoreFloat4( reinterpret_cast(&_11), x1 ); + XMStoreFloat4( reinterpret_cast(&_21), x2 ); + XMStoreFloat4( reinterpret_cast(&_31), x3 ); + XMStoreFloat4( reinterpret_cast(&_41), x4 ); + return *this; +} + +inline Matrix& Matrix::operator/= (float S) +{ + using namespace DirectX; + assert( S != 0.f ); + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&_11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&_21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&_31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&_41) ); + + float rs = 1.f / S; + + x1 = XMVectorScale( x1, rs ); + x2 = XMVectorScale( x2, rs ); + x3 = XMVectorScale( x3, rs ); + x4 = XMVectorScale( x4, rs ); + + XMStoreFloat4( reinterpret_cast(&_11), x1 ); + XMStoreFloat4( reinterpret_cast(&_21), x2 ); + XMStoreFloat4( reinterpret_cast(&_31), x3 ); + XMStoreFloat4( reinterpret_cast(&_41), x4 ); + return *this; +} + +inline Matrix& Matrix::operator/= (const Matrix& M) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&_11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&_21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&_31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&_41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M._41) ); + + x1 = XMVectorDivide( x1, y1 ); + x2 = XMVectorDivide( x2, y2 ); + x3 = XMVectorDivide( x3, y3 ); + x4 = XMVectorDivide( x4, y4 ); + + XMStoreFloat4( reinterpret_cast(&_11), x1 ); + XMStoreFloat4( reinterpret_cast(&_21), x2 ); + XMStoreFloat4( reinterpret_cast(&_31), x3 ); + XMStoreFloat4( reinterpret_cast(&_41), x4 ); + return *this; +} + +//------------------------------------------------------------------------------ +// Urnary operators +//------------------------------------------------------------------------------ + +inline Matrix Matrix::operator- () const +{ + using namespace DirectX; + XMVECTOR v1 = XMLoadFloat4( reinterpret_cast(&_11) ); + XMVECTOR v2 = XMLoadFloat4( reinterpret_cast(&_21) ); + XMVECTOR v3 = XMLoadFloat4( reinterpret_cast(&_31) ); + XMVECTOR v4 = XMLoadFloat4( reinterpret_cast(&_41) ); + + v1 = XMVectorNegate( v1 ); + v2 = XMVectorNegate( v2 ); + v3 = XMVectorNegate( v3 ); + v4 = XMVectorNegate( v4 ); + + Matrix R; + XMStoreFloat4( reinterpret_cast(&R._11), v1 ); + XMStoreFloat4( reinterpret_cast(&R._21), v2 ); + XMStoreFloat4( reinterpret_cast(&R._31), v3 ); + XMStoreFloat4( reinterpret_cast(&R._41), v4 ); + return R; +} + +//------------------------------------------------------------------------------ +// Binary operators +//------------------------------------------------------------------------------ + +inline Matrix operator+ (const Matrix& M1, const Matrix& M2) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&M1._11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&M1._21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&M1._31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&M1._41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M2._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M2._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M2._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M2._41) ); + + x1 = XMVectorAdd( x1, y1 ); + x2 = XMVectorAdd( x2, y2 ); + x3 = XMVectorAdd( x3, y3 ); + x4 = XMVectorAdd( x4, y4 ); + + Matrix R; + XMStoreFloat4( reinterpret_cast(&R._11), x1 ); + XMStoreFloat4( reinterpret_cast(&R._21), x2 ); + XMStoreFloat4( reinterpret_cast(&R._31), x3 ); + XMStoreFloat4( reinterpret_cast(&R._41), x4 ); + return R; +} + +inline Matrix operator- (const Matrix& M1, const Matrix& M2) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&M1._11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&M1._21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&M1._31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&M1._41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M2._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M2._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M2._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M2._41) ); + + x1 = XMVectorSubtract( x1, y1 ); + x2 = XMVectorSubtract( x2, y2 ); + x3 = XMVectorSubtract( x3, y3 ); + x4 = XMVectorSubtract( x4, y4 ); + + Matrix R; + XMStoreFloat4( reinterpret_cast(&R._11), x1 ); + XMStoreFloat4( reinterpret_cast(&R._21), x2 ); + XMStoreFloat4( reinterpret_cast(&R._31), x3 ); + XMStoreFloat4( reinterpret_cast(&R._41), x4 ); + return R; +} + +inline Matrix operator* (const Matrix& M1, const Matrix& M2) +{ + using namespace DirectX; + XMMATRIX m1 = XMLoadFloat4x4( &M1 ); + XMMATRIX m2 = XMLoadFloat4x4( &M2 ); + XMMATRIX X = XMMatrixMultiply( m1, m2 ); + + Matrix R; + XMStoreFloat4x4( &R, X ); + return R; +} + +inline Matrix operator* (const Matrix& M, float S) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&M._11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&M._21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&M._31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&M._41) ); + + x1 = XMVectorScale( x1, S ); + x2 = XMVectorScale( x2, S ); + x3 = XMVectorScale( x3, S ); + x4 = XMVectorScale( x4, S ); + + Matrix R; + XMStoreFloat4( reinterpret_cast(&R._11), x1 ); + XMStoreFloat4( reinterpret_cast(&R._21), x2 ); + XMStoreFloat4( reinterpret_cast(&R._31), x3 ); + XMStoreFloat4( reinterpret_cast(&R._41), x4 ); + return R; +} + +inline Matrix operator/ (const Matrix& M, float S) +{ + using namespace DirectX; + assert( S != 0.f ); + + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&M._11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&M._21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&M._31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&M._41) ); + + float rs = 1.f / S; + + x1 = XMVectorScale( x1, rs ); + x2 = XMVectorScale( x2, rs ); + x3 = XMVectorScale( x3, rs ); + x4 = XMVectorScale( x4, rs ); + + Matrix R; + XMStoreFloat4( reinterpret_cast(&R._11), x1 ); + XMStoreFloat4( reinterpret_cast(&R._21), x2 ); + XMStoreFloat4( reinterpret_cast(&R._31), x3 ); + XMStoreFloat4( reinterpret_cast(&R._41), x4 ); + return R; +} + +inline Matrix operator/ (const Matrix& M1, const Matrix& M2) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&M1._11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&M1._21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&M1._31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&M1._41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M2._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M2._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M2._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M2._41) ); + + x1 = XMVectorDivide( x1, y1 ); + x2 = XMVectorDivide( x2, y2 ); + x3 = XMVectorDivide( x3, y3 ); + x4 = XMVectorDivide( x4, y4 ); + + Matrix R; + XMStoreFloat4( reinterpret_cast(&R._11), x1 ); + XMStoreFloat4( reinterpret_cast(&R._21), x2 ); + XMStoreFloat4( reinterpret_cast(&R._31), x3 ); + XMStoreFloat4( reinterpret_cast(&R._41), x4 ); + return R; +} + +inline Matrix operator* (float S, const Matrix& M) +{ + using namespace DirectX; + + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&M._11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&M._21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&M._31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&M._41) ); + + x1 = XMVectorScale( x1, S ); + x2 = XMVectorScale( x2, S ); + x3 = XMVectorScale( x3, S ); + x4 = XMVectorScale( x4, S ); + + Matrix R; + XMStoreFloat4( reinterpret_cast(&R._11), x1 ); + XMStoreFloat4( reinterpret_cast(&R._21), x2 ); + XMStoreFloat4( reinterpret_cast(&R._31), x3 ); + XMStoreFloat4( reinterpret_cast(&R._41), x4 ); + return R; +} + +//------------------------------------------------------------------------------ +// Matrix operations +//------------------------------------------------------------------------------ + +inline bool Matrix::Decompose( Vector3& scale, Quaternion& rotation, Vector3& translation ) +{ + using namespace DirectX; + + XMVECTOR s, r, t; + + if ( !XMMatrixDecompose( &s, &r, &t, *this ) ) + return false; + + XMStoreFloat3( &scale, s ); + XMStoreFloat4( &rotation, r ); + XMStoreFloat3( &translation, t ); + + return true; +} + +inline Matrix Matrix::Transpose() const +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( this ); + Matrix R; + XMStoreFloat4x4( &R, XMMatrixTranspose( M ) ); + return R; +} + +inline void Matrix::Transpose( Matrix& result ) const +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( this ); + XMStoreFloat4x4( &result, XMMatrixTranspose( M ) ); +} + +inline Matrix Matrix::Invert() const +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( this ); + Matrix R; + XMVECTOR det; + XMStoreFloat4x4( &R, XMMatrixInverse( &det, M ) ); + return R; +} + +inline void Matrix::Invert( Matrix& result ) const +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( this ); + XMVECTOR det; + XMStoreFloat4x4( &result, XMMatrixInverse( &det, M ) ); +} + +inline float Matrix::Determinant() const +{ + using namespace DirectX; + XMMATRIX M = XMLoadFloat4x4( this ); + return XMVectorGetX( XMMatrixDeterminant( M ) ); +} + +//------------------------------------------------------------------------------ +// Static functions +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline Matrix Matrix::CreateBillboard( const Vector3& object, const Vector3& cameraPosition, const Vector3& cameraUp, const Vector3* cameraForward ) +{ + using namespace DirectX; + XMVECTOR O = XMLoadFloat3( &object ); + XMVECTOR C = XMLoadFloat3( &cameraPosition ); + XMVECTOR Z = XMVectorSubtract( O, C ); + + XMVECTOR N = XMVector3LengthSq( Z ); + if ( XMVector3Less( N, g_XMEpsilon ) ) + { + if ( cameraForward ) + { + XMVECTOR F = XMLoadFloat3( cameraForward ); + Z = XMVectorNegate( F ); + } + else + Z = g_XMNegIdentityR2; + } + else + { + Z = XMVector3Normalize( Z ); + } + + XMVECTOR up = XMLoadFloat3( &cameraUp ); + XMVECTOR X = XMVector3Cross( up, Z ); + X = XMVector3Normalize( X ); + + XMVECTOR Y = XMVector3Cross( Z, X ); + + XMMATRIX M; + M.r[0] = X; + M.r[1] = Y; + M.r[2] = Z; + M.r[3] = XMVectorSetW( O, 1.f ); + + Matrix R; + XMStoreFloat4x4( &R, M ); + return R; +} + +_Use_decl_annotations_ +inline Matrix Matrix::CreateConstrainedBillboard( const Vector3& object, const Vector3& cameraPosition, const Vector3& rotateAxis, + const Vector3* cameraForward, const Vector3* objectForward ) +{ + using namespace DirectX; + + static const XMVECTORF32 s_minAngle = { { { 0.99825467075f, 0.99825467075f, 0.99825467075f, 0.99825467075f } } }; // 1.0 - XMConvertToRadians( 0.1f ); + + XMVECTOR O = XMLoadFloat3( &object ); + XMVECTOR C = XMLoadFloat3( &cameraPosition ); + XMVECTOR faceDir = XMVectorSubtract( O, C ); + + XMVECTOR N = XMVector3LengthSq( faceDir ); + if (XMVector3Less(N, g_XMEpsilon)) + { + if (cameraForward) + { + XMVECTOR F = XMLoadFloat3( cameraForward ); + faceDir = XMVectorNegate( F ); + } + else + faceDir = g_XMNegIdentityR2; + } + else + { + faceDir = XMVector3Normalize( faceDir ); + } + + XMVECTOR Y = XMLoadFloat3( &rotateAxis ); + XMVECTOR X, Z; + + XMVECTOR dot = XMVectorAbs( XMVector3Dot( Y, faceDir ) ); + if ( XMVector3Greater( dot, s_minAngle ) ) + { + if ( objectForward ) + { + Z = XMLoadFloat3( objectForward ); + dot = XMVectorAbs( XMVector3Dot( Y, Z ) ); + if ( XMVector3Greater( dot, s_minAngle ) ) + { + dot = XMVectorAbs( XMVector3Dot( Y, g_XMNegIdentityR2 ) ); + Z = ( XMVector3Greater( dot, s_minAngle ) ) ? g_XMIdentityR0 : g_XMNegIdentityR2; + } + } + else + { + dot = XMVectorAbs( XMVector3Dot( Y, g_XMNegIdentityR2 ) ); + Z = ( XMVector3Greater( dot, s_minAngle ) ) ? g_XMIdentityR0 : g_XMNegIdentityR2; + } + + X = XMVector3Cross( Y, Z ); + X = XMVector3Normalize( X ); + + Z = XMVector3Cross( X, Y ); + Z = XMVector3Normalize( Z ); + } + else + { + X = XMVector3Cross( Y, faceDir ); + X = XMVector3Normalize( X ); + + Z = XMVector3Cross( X, Y ); + Z = XMVector3Normalize( Z ); + } + + XMMATRIX M; + M.r[0] = X; + M.r[1] = Y; + M.r[2] = Z; + M.r[3] = XMVectorSetW( O, 1.f ); + + Matrix R; + XMStoreFloat4x4( &R, M ); + return R; +} + +inline Matrix Matrix::CreateTranslation( const Vector3& position ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixTranslation( position.x, position.y, position.z ) ); + return R; +} + +inline Matrix Matrix::CreateTranslation( float x, float y, float z ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixTranslation( x, y, z ) ); + return R; +} + +inline Matrix Matrix::CreateScale( const Vector3& scales ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixScaling( scales.x, scales.y, scales.z ) ); + return R; +} + +inline Matrix Matrix::CreateScale( float xs, float ys, float zs ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixScaling( xs, ys, zs ) ); + return R; +} + +inline Matrix Matrix::CreateScale( float scale ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixScaling( scale, scale, scale ) ); + return R; +} + +inline Matrix Matrix::CreateRotationX( float radians ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixRotationX( radians ) ); + return R; +} + +inline Matrix Matrix::CreateRotationY( float radians ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixRotationY( radians ) ); + return R; +} + +inline Matrix Matrix::CreateRotationZ( float radians ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixRotationZ( radians ) ); + return R; +} + +inline Matrix Matrix::CreateFromAxisAngle( const Vector3& axis, float angle ) +{ + using namespace DirectX; + Matrix R; + XMVECTOR a = XMLoadFloat3( &axis ); + XMStoreFloat4x4( &R, XMMatrixRotationAxis( a, angle ) ); + return R; +} + +inline Matrix Matrix::CreatePerspectiveFieldOfView( float fov, float aspectRatio, float nearPlane, float farPlane ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixPerspectiveFovRH( fov, aspectRatio, nearPlane, farPlane ) ); + return R; +} + +inline Matrix Matrix::CreatePerspective( float width, float height, float nearPlane, float farPlane ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixPerspectiveRH( width, height, nearPlane, farPlane ) ); + return R; +} + +inline Matrix Matrix::CreatePerspectiveOffCenter( float left, float right, float bottom, float top, float nearPlane, float farPlane ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixPerspectiveOffCenterRH( left, right, bottom, top, nearPlane, farPlane ) ); + return R; +} + +inline Matrix Matrix::CreateOrthographic( float width, float height, float zNearPlane, float zFarPlane ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixOrthographicRH( width, height, zNearPlane, zFarPlane ) ); + return R; +} + +inline Matrix Matrix::CreateOrthographicOffCenter( float left, float right, float bottom, float top, float zNearPlane, float zFarPlane ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixOrthographicOffCenterRH( left, right, bottom, top, zNearPlane, zFarPlane ) ); + return R; +} + +inline Matrix Matrix::CreateLookAt( const Vector3& eye, const Vector3& target, const Vector3& up ) +{ + using namespace DirectX; + Matrix R; + XMVECTOR eyev = XMLoadFloat3( &eye ); + XMVECTOR targetv = XMLoadFloat3( &target ); + XMVECTOR upv = XMLoadFloat3( &up ); + XMStoreFloat4x4( &R, XMMatrixLookAtRH( eyev, targetv, upv ) ); + return R; +} + +inline Matrix Matrix::CreateWorld( const Vector3& position, const Vector3& forward, const Vector3& up ) +{ + using namespace DirectX; + XMVECTOR zaxis = XMVector3Normalize( XMVectorNegate( XMLoadFloat3( &forward ) ) ); + XMVECTOR yaxis = XMLoadFloat3( &up ); + XMVECTOR xaxis = XMVector3Normalize( XMVector3Cross( yaxis, zaxis ) ); + yaxis = XMVector3Cross( zaxis, xaxis ); + + Matrix R; + XMStoreFloat3( reinterpret_cast( &R._11 ), xaxis ); + XMStoreFloat3( reinterpret_cast( &R._21 ), yaxis ); + XMStoreFloat3( reinterpret_cast( &R._31 ), zaxis ); + R._14 = R._24 = R._34 = 0.f; + R._41 = position.x; R._42 = position.y; R._43 = position.z; + R._44 = 1.f; + return R; +} + +inline Matrix Matrix::CreateFromQuaternion( const Quaternion& rotation ) +{ + using namespace DirectX; + Matrix R; + XMVECTOR quatv = XMLoadFloat4( &rotation ); + XMStoreFloat4x4( &R, XMMatrixRotationQuaternion( quatv ) ); + return R; +} + +inline Matrix Matrix::CreateFromYawPitchRoll( float yaw, float pitch, float roll ) +{ + using namespace DirectX; + Matrix R; + XMStoreFloat4x4( &R, XMMatrixRotationRollPitchYaw( pitch, yaw, roll ) ); + return R; +} + +inline Matrix Matrix::CreateShadow( const Vector3& lightDir, const Plane& plane ) +{ + using namespace DirectX; + Matrix R; + XMVECTOR light = XMLoadFloat3( &lightDir ); + XMVECTOR planev = XMLoadFloat4( &plane ); + XMStoreFloat4x4( &R, XMMatrixShadow( planev, light ) ); + return R; +} + +inline Matrix Matrix::CreateReflection( const Plane& plane ) +{ + using namespace DirectX; + Matrix R; + XMVECTOR planev = XMLoadFloat4( &plane ); + XMStoreFloat4x4( &R, XMMatrixReflect( planev ) ); + return R; +} + +inline void Matrix::Lerp( const Matrix& M1, const Matrix& M2, float t, Matrix& result ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&M1._11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&M1._21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&M1._31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&M1._41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M2._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M2._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M2._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M2._41) ); + + x1 = XMVectorLerp( x1, y1, t ); + x2 = XMVectorLerp( x2, y2, t ); + x3 = XMVectorLerp( x3, y3, t ); + x4 = XMVectorLerp( x4, y4, t ); + + XMStoreFloat4( reinterpret_cast(&result._11), x1 ); + XMStoreFloat4( reinterpret_cast(&result._21), x2 ); + XMStoreFloat4( reinterpret_cast(&result._31), x3 ); + XMStoreFloat4( reinterpret_cast(&result._41), x4 ); +} + +inline Matrix Matrix::Lerp( const Matrix& M1, const Matrix& M2, float t ) +{ + using namespace DirectX; + XMVECTOR x1 = XMLoadFloat4( reinterpret_cast(&M1._11) ); + XMVECTOR x2 = XMLoadFloat4( reinterpret_cast(&M1._21) ); + XMVECTOR x3 = XMLoadFloat4( reinterpret_cast(&M1._31) ); + XMVECTOR x4 = XMLoadFloat4( reinterpret_cast(&M1._41) ); + + XMVECTOR y1 = XMLoadFloat4( reinterpret_cast(&M2._11) ); + XMVECTOR y2 = XMLoadFloat4( reinterpret_cast(&M2._21) ); + XMVECTOR y3 = XMLoadFloat4( reinterpret_cast(&M2._31) ); + XMVECTOR y4 = XMLoadFloat4( reinterpret_cast(&M2._41) ); + + x1 = XMVectorLerp( x1, y1, t ); + x2 = XMVectorLerp( x2, y2, t ); + x3 = XMVectorLerp( x3, y3, t ); + x4 = XMVectorLerp( x4, y4, t ); + + Matrix result; + XMStoreFloat4( reinterpret_cast(&result._11), x1 ); + XMStoreFloat4( reinterpret_cast(&result._21), x2 ); + XMStoreFloat4( reinterpret_cast(&result._31), x3 ); + XMStoreFloat4( reinterpret_cast(&result._41), x4 ); + return result; +} + +inline void Matrix::Transform( const Matrix& M, const Quaternion& rotation, Matrix& result ) +{ + using namespace DirectX; + XMVECTOR quatv = XMLoadFloat4( &rotation ); + + XMMATRIX M0 = XMLoadFloat4x4( &M ); + XMMATRIX M1 = XMMatrixRotationQuaternion( quatv ); + + XMStoreFloat4x4( &result, XMMatrixMultiply( M0, M1 ) ); +} + +inline Matrix Matrix::Transform( const Matrix& M, const Quaternion& rotation ) +{ + using namespace DirectX; + XMVECTOR quatv = XMLoadFloat4( &rotation ); + + XMMATRIX M0 = XMLoadFloat4x4( &M ); + XMMATRIX M1 = XMMatrixRotationQuaternion( quatv ); + + Matrix result; + XMStoreFloat4x4( &result, XMMatrixMultiply( M0, M1 ) ); + return result; +} + + +/**************************************************************************** + * + * Plane + * + ****************************************************************************/ + +inline Plane::Plane(const Vector3& point1, const Vector3& point2, const Vector3& point3 ) +{ + using namespace DirectX; + XMVECTOR P0 = XMLoadFloat3( &point1 ); + XMVECTOR P1 = XMLoadFloat3( &point2 ); + XMVECTOR P2 = XMLoadFloat3( &point3 ); + XMStoreFloat4( this, XMPlaneFromPoints( P0, P1, P2 ) ); +} + +inline Plane::Plane(const Vector3& point, const Vector3& normal) +{ + using namespace DirectX; + XMVECTOR P = XMLoadFloat3( &point ); + XMVECTOR N = XMLoadFloat3( &normal ); + XMStoreFloat4( this, XMPlaneFromPointNormal( P, N ) ); +} + +//------------------------------------------------------------------------------ +// Comparision operators +//------------------------------------------------------------------------------ + +inline bool Plane::operator == ( const Plane& p ) const +{ + using namespace DirectX; + XMVECTOR p1 = XMLoadFloat4( this ); + XMVECTOR p2 = XMLoadFloat4( &p ); + return XMPlaneEqual( p1, p2 ); +} + +inline bool Plane::operator != ( const Plane& p ) const +{ + using namespace DirectX; + XMVECTOR p1 = XMLoadFloat4( this ); + XMVECTOR p2 = XMLoadFloat4( &p ); + return XMPlaneNotEqual( p1, p2 ); +} + +//------------------------------------------------------------------------------ +// Plane operations +//------------------------------------------------------------------------------ + +inline void Plane::Normalize() +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( this ); + XMStoreFloat4( this, XMPlaneNormalize( p ) ); +} + +inline void Plane::Normalize( Plane& result ) const +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( this ); + XMStoreFloat4( &result, XMPlaneNormalize( p ) ); +} + +inline float Plane::Dot( const Vector4& v ) const +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( this ); + XMVECTOR v0 = XMLoadFloat4( &v ); + return XMVectorGetX( XMPlaneDot( p, v0 ) ); +} + +inline float Plane::DotCoordinate( const Vector3& position ) const +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( this ); + XMVECTOR v0 = XMLoadFloat3( &position ); + return XMVectorGetX( XMPlaneDotCoord( p, v0 ) ); +} + +inline float Plane::DotNormal( const Vector3& normal ) const +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( this ); + XMVECTOR n0 = XMLoadFloat3( &normal ); + return XMVectorGetX( XMPlaneDotNormal( p, n0 ) ); +} + +//------------------------------------------------------------------------------ +// Static functions +//------------------------------------------------------------------------------ + +inline void Plane::Transform( const Plane& plane, const Matrix& M, Plane& result ) +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( &plane ); + XMMATRIX m0 = XMLoadFloat4x4( &M ); + XMStoreFloat4( &result, XMPlaneTransform( p, m0 ) ); +} + +inline Plane Plane::Transform( const Plane& plane, const Matrix& M ) +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( &plane ); + XMMATRIX m0 = XMLoadFloat4x4( &M ); + + Plane result; + XMStoreFloat4( &result, XMPlaneTransform( p, m0 ) ); + return result; +} + +inline void Plane::Transform( const Plane& plane, const Quaternion& rotation, Plane& result ) +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( &plane ); + XMVECTOR q = XMLoadFloat4( &rotation ); + XMVECTOR X = XMVector3Rotate( p, q ); + X = XMVectorSelect( p, X, g_XMSelect1110 ); // result.d = plane.d + XMStoreFloat4( &result, X ); +} + +inline Plane Plane::Transform( const Plane& plane, const Quaternion& rotation ) +{ + using namespace DirectX; + XMVECTOR p = XMLoadFloat4( &plane ); + XMVECTOR q = XMLoadFloat4( &rotation ); + XMVECTOR X = XMVector3Rotate( p, q ); + X = XMVectorSelect( p, X, g_XMSelect1110 ); // result.d = plane.d + + Plane result; + XMStoreFloat4( &result, X ); + return result; +} + + +/**************************************************************************** + * + * Quaternion + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparision operators +//------------------------------------------------------------------------------ + +inline bool Quaternion::operator == ( const Quaternion& q ) const +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( this ); + XMVECTOR q2 = XMLoadFloat4( &q ); + return XMQuaternionEqual( q1, q2 ); +} + +inline bool Quaternion::operator != ( const Quaternion& q ) const +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( this ); + XMVECTOR q2 = XMLoadFloat4( &q ); + return XMQuaternionNotEqual( q1, q2 ); +} + +//------------------------------------------------------------------------------ +// Assignment operators +//------------------------------------------------------------------------------ + +inline Quaternion& Quaternion::operator+= (const Quaternion& q) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( this ); + XMVECTOR q2 = XMLoadFloat4( &q ); + XMStoreFloat4( this, XMVectorAdd( q1, q2 ) ); + return *this; +} + +inline Quaternion& Quaternion::operator-= (const Quaternion& q) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( this ); + XMVECTOR q2 = XMLoadFloat4( &q ); + XMStoreFloat4( this, XMVectorSubtract( q1, q2 ) ); + return *this; +} + +inline Quaternion& Quaternion::operator*= (const Quaternion& q) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( this ); + XMVECTOR q2 = XMLoadFloat4( &q ); + XMStoreFloat4( this, XMQuaternionMultiply( q1, q2 ) ); + return *this; +} + +inline Quaternion& Quaternion::operator*= (float S) +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + XMStoreFloat4( this, XMVectorScale( q, S ) ); + return *this; +} + +inline Quaternion& Quaternion::operator/= (const Quaternion& q) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( this ); + XMVECTOR q2 = XMLoadFloat4( &q ); + q2 = XMQuaternionInverse( q2 ); + XMStoreFloat4( this, XMQuaternionMultiply( q1, q2 ) ); + return *this; +} + +//------------------------------------------------------------------------------ +// Urnary operators +//------------------------------------------------------------------------------ + +inline Quaternion Quaternion::operator- () const +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + + Quaternion R; + XMStoreFloat4( &R, XMVectorNegate( q ) ); + return R; +} + +//------------------------------------------------------------------------------ +// Binary operators +//------------------------------------------------------------------------------ + +inline Quaternion operator+ (const Quaternion& Q1, const Quaternion& Q2) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( &Q1 ); + XMVECTOR q2 = XMLoadFloat4( &Q2 ); + + Quaternion R; + XMStoreFloat4( &R, XMVectorAdd( q1, q2 ) ); + return R; +} + +inline Quaternion operator- (const Quaternion& Q1, const Quaternion& Q2) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( &Q1 ); + XMVECTOR q2 = XMLoadFloat4( &Q2 ); + + Quaternion R; + XMStoreFloat4( &R, XMVectorSubtract( q1, q2 ) ); + return R; +} + +inline Quaternion operator* (const Quaternion& Q1, const Quaternion& Q2) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( &Q1 ); + XMVECTOR q2 = XMLoadFloat4( &Q2 ); + + Quaternion R; + XMStoreFloat4( &R, XMQuaternionMultiply( q1, q2 ) ); + return R; +} + +inline Quaternion operator* (const Quaternion& Q, float S) +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( &Q ); + + Quaternion R; + XMStoreFloat4( &R, XMVectorScale( q, S ) ); + return R; +} + +inline Quaternion operator/ (const Quaternion& Q1, const Quaternion& Q2) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( &Q1 ); + XMVECTOR q2 = XMLoadFloat4( &Q2 ); + q2 = XMQuaternionInverse( q2 ); + + Quaternion R; + XMStoreFloat4( &R, XMQuaternionMultiply( q1, q2 ) ); + return R; +} + +inline Quaternion operator* (float S, const Quaternion& Q) +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( &Q ); + + Quaternion R; + XMStoreFloat4( &R, XMVectorScale( q1, S ) ); + return R; +} + +//------------------------------------------------------------------------------ +// Quaternion operations +//------------------------------------------------------------------------------ + +inline float Quaternion::Length() const +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + return XMVectorGetX( XMQuaternionLength( q ) ); +} + +inline float Quaternion::LengthSquared() const +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + return XMVectorGetX( XMQuaternionLengthSq( q ) ); +} + +inline void Quaternion::Normalize() +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + XMStoreFloat4( this, XMQuaternionNormalize( q ) ); +} + +inline void Quaternion::Normalize( Quaternion& result ) const +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + XMStoreFloat4( &result, XMQuaternionNormalize( q ) ); +} + +inline void Quaternion::Conjugate() +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + XMStoreFloat4( this, XMQuaternionConjugate( q ) ); +} + +inline void Quaternion::Conjugate( Quaternion& result ) const +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + XMStoreFloat4( &result, XMQuaternionConjugate( q ) ); +} + +inline void Quaternion::Inverse( Quaternion& result ) const +{ + using namespace DirectX; + XMVECTOR q = XMLoadFloat4( this ); + XMStoreFloat4( &result, XMQuaternionInverse( q ) ); +} + +inline float Quaternion::Dot( const Quaternion& q ) const +{ + using namespace DirectX; + XMVECTOR q1 = XMLoadFloat4( this ); + XMVECTOR q2 = XMLoadFloat4( &q ); + return XMVectorGetX( XMQuaternionDot( q1, q2 ) ); +} + +//------------------------------------------------------------------------------ +// Static functions +//------------------------------------------------------------------------------ + +inline Quaternion Quaternion::CreateFromAxisAngle( const Vector3& axis, float angle ) +{ + using namespace DirectX; + XMVECTOR a = XMLoadFloat3( &axis ); + + Quaternion R; + XMStoreFloat4( &R, XMQuaternionRotationAxis( a, angle ) ); + return R; +} + +inline Quaternion Quaternion::CreateFromYawPitchRoll( float yaw, float pitch, float roll ) +{ + using namespace DirectX; + Quaternion R; + XMStoreFloat4( &R, XMQuaternionRotationRollPitchYaw( pitch, yaw, roll ) ); + return R; +} + +inline Quaternion Quaternion::CreateFromRotationMatrix( const Matrix& M ) +{ + using namespace DirectX; + XMMATRIX M0 = XMLoadFloat4x4( &M ); + + Quaternion R; + XMStoreFloat4( &R, XMQuaternionRotationMatrix( M0 ) ); + return R; +} + +inline void Quaternion::Lerp( const Quaternion& q1, const Quaternion& q2, float t, Quaternion& result ) +{ + using namespace DirectX; + XMVECTOR Q0 = XMLoadFloat4( &q1 ); + XMVECTOR Q1 = XMLoadFloat4( &q2 ); + + XMVECTOR dot = XMVector4Dot( Q0, Q1 ); + + XMVECTOR R; + if ( XMVector4GreaterOrEqual( dot, XMVectorZero() ) ) + { + R = XMVectorLerp( Q0, Q1, t ); + } + else + { + XMVECTOR tv = XMVectorReplicate( t ); + XMVECTOR t1v = XMVectorReplicate( 1.f - t ); + XMVECTOR X0 = XMVectorMultiply( Q0, t1v ); + XMVECTOR X1 = XMVectorMultiply( Q1, tv ); + R = XMVectorSubtract( X0, X1 ); + } + + XMStoreFloat4( &result, XMQuaternionNormalize( R ) ); +} + +inline Quaternion Quaternion::Lerp( const Quaternion& q1, const Quaternion& q2, float t ) +{ + using namespace DirectX; + XMVECTOR Q0 = XMLoadFloat4( &q1 ); + XMVECTOR Q1 = XMLoadFloat4( &q2 ); + + XMVECTOR dot = XMVector4Dot( Q0, Q1 ); + + XMVECTOR R; + if ( XMVector4GreaterOrEqual( dot, XMVectorZero() ) ) + { + R = XMVectorLerp( Q0, Q1, t ); + } + else + { + XMVECTOR tv = XMVectorReplicate( t ); + XMVECTOR t1v = XMVectorReplicate( 1.f - t ); + XMVECTOR X0 = XMVectorMultiply( Q0, t1v ); + XMVECTOR X1 = XMVectorMultiply( Q1, tv ); + R = XMVectorSubtract( X0, X1 ); + } + + Quaternion result; + XMStoreFloat4( &result, XMQuaternionNormalize( R ) ); + return result; +} + +inline void Quaternion::Slerp( const Quaternion& q1, const Quaternion& q2, float t, Quaternion& result ) +{ + using namespace DirectX; + XMVECTOR Q0 = XMLoadFloat4( &q1 ); + XMVECTOR Q1 = XMLoadFloat4( &q2 ); + XMStoreFloat4( &result, XMQuaternionSlerp( Q0, Q1, t ) ); +} + +inline Quaternion Quaternion::Slerp( const Quaternion& q1, const Quaternion& q2, float t ) +{ + using namespace DirectX; + XMVECTOR Q0 = XMLoadFloat4( &q1 ); + XMVECTOR Q1 = XMLoadFloat4( &q2 ); + + Quaternion result; + XMStoreFloat4( &result, XMQuaternionSlerp( Q0, Q1, t ) ); + return result; +} + +inline void Quaternion::Concatenate( const Quaternion& q1, const Quaternion& q2, Quaternion& result ) +{ + using namespace DirectX; + XMVECTOR Q0 = XMLoadFloat4( &q1 ); + XMVECTOR Q1 = XMLoadFloat4( &q2 ); + XMStoreFloat4( &result, XMQuaternionMultiply( Q1, Q0 ) ); +} + +inline Quaternion Quaternion::Concatenate( const Quaternion& q1, const Quaternion& q2 ) +{ + using namespace DirectX; + XMVECTOR Q0 = XMLoadFloat4( &q1 ); + XMVECTOR Q1 = XMLoadFloat4( &q2 ); + + Quaternion result; + XMStoreFloat4( &result, XMQuaternionMultiply( Q1, Q0 ) ); + return result; +} + + +/**************************************************************************** + * + * Color + * + ****************************************************************************/ + +inline Color::Color( const DirectX::PackedVector::XMCOLOR& Packed ) +{ + using namespace DirectX; + XMStoreFloat4( this, PackedVector::XMLoadColor( &Packed ) ); +} + +inline Color::Color( const DirectX::PackedVector::XMUBYTEN4& Packed ) +{ + using namespace DirectX; + XMStoreFloat4( this, PackedVector::XMLoadUByteN4( &Packed ) ); +} + +//------------------------------------------------------------------------------ +// Comparision operators +//------------------------------------------------------------------------------ +inline bool Color::operator == ( const Color& c ) const +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( this ); + XMVECTOR c2 = XMLoadFloat4( &c ); + return XMColorEqual( c1, c2 ); +} + +inline bool Color::operator != ( const Color& c ) const +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( this ); + XMVECTOR c2 = XMLoadFloat4( &c ); + return XMColorNotEqual( c1, c2 ); +} + +//------------------------------------------------------------------------------ +// Assignment operators +//------------------------------------------------------------------------------ + +inline Color& Color::operator= (const DirectX::PackedVector::XMCOLOR& Packed) +{ + using namespace DirectX; + XMStoreFloat4( this, PackedVector::XMLoadColor( &Packed ) ); + return *this; +} + +inline Color& Color::operator= (const DirectX::PackedVector::XMUBYTEN4& Packed) +{ + using namespace DirectX; + XMStoreFloat4( this, PackedVector::XMLoadUByteN4( &Packed ) ); + return *this; +} + +inline Color& Color::operator+= (const Color& c) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( this ); + XMVECTOR c2 = XMLoadFloat4( &c ); + XMStoreFloat4( this, XMVectorAdd( c1, c2 ) ); + return *this; +} + +inline Color& Color::operator-= (const Color& c) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( this ); + XMVECTOR c2 = XMLoadFloat4( &c ); + XMStoreFloat4( this, XMVectorSubtract( c1, c2 ) ); + return *this; +} + +inline Color& Color::operator*= (const Color& c) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( this ); + XMVECTOR c2 = XMLoadFloat4( &c ); + XMStoreFloat4( this, XMVectorMultiply( c1, c2 ) ); + return *this; +} + +inline Color& Color::operator*= (float S) +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( this, XMVectorScale( c, S ) ); + return *this; +} + +inline Color& Color::operator/= (const Color& c) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( this ); + XMVECTOR c2 = XMLoadFloat4( &c ); + XMStoreFloat4( this, XMVectorDivide( c1, c2 ) ); + return *this; +} + +//------------------------------------------------------------------------------ +// Urnary operators +//------------------------------------------------------------------------------ + +inline Color Color::operator- () const +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + Color R; + XMStoreFloat4( &R, XMVectorNegate( c ) ); + return R; +} + +//------------------------------------------------------------------------------ +// Binary operators +//------------------------------------------------------------------------------ + +inline Color operator+ (const Color& C1, const Color& C2) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( &C1 ); + XMVECTOR c2 = XMLoadFloat4( &C2 ); + Color R; + XMStoreFloat4( &R, XMVectorAdd( c1, c2 ) ); + return R; +} + +inline Color operator- (const Color& C1, const Color& C2) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( &C1 ); + XMVECTOR c2 = XMLoadFloat4( &C2 ); + Color R; + XMStoreFloat4( &R, XMVectorSubtract( c1, c2 ) ); + return R; +} + +inline Color operator* (const Color& C1, const Color& C2) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( &C1 ); + XMVECTOR c2 = XMLoadFloat4( &C2 ); + Color R; + XMStoreFloat4( &R, XMVectorMultiply( c1, c2 ) ); + return R; +} + +inline Color operator* (const Color& C, float S) +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( &C ); + Color R; + XMStoreFloat4( &R, XMVectorScale( c, S ) ); + return R; +} + +inline Color operator/ (const Color& C1, const Color& C2) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( &C1 ); + XMVECTOR c2 = XMLoadFloat4( &C2 ); + Color R; + XMStoreFloat4( &R, XMVectorDivide( c1, c2 ) ); + return R; +} + +inline Color operator* (float S, const Color& C) +{ + using namespace DirectX; + XMVECTOR c1 = XMLoadFloat4( &C ); + Color R; + XMStoreFloat4( &R, XMVectorScale( c1, S ) ); + return R; +} + +//------------------------------------------------------------------------------ +// Color operations +//------------------------------------------------------------------------------ + +inline DirectX::PackedVector::XMCOLOR Color::BGRA() const +{ + using namespace DirectX; + XMVECTOR clr = XMLoadFloat4( this ); + PackedVector::XMCOLOR Packed; + PackedVector::XMStoreColor( &Packed, clr ); + return Packed; +} + +inline DirectX::PackedVector::XMUBYTEN4 Color::RGBA() const +{ + using namespace DirectX; + XMVECTOR clr = XMLoadFloat4( this ); + PackedVector::XMUBYTEN4 Packed; + PackedVector::XMStoreUByteN4( &Packed, clr ); + return Packed; +} + +inline Vector3 Color::ToVector3() const +{ + return Vector3( x, y, z ); +} + +inline Vector4 Color::ToVector4() const +{ + return Vector4( x, y, z, w ); +} + +inline void Color::Negate() +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( this, XMColorNegative( c) ); +} + +inline void Color::Negate( Color& result ) const +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( &result, XMColorNegative( c ) ); +} + +inline void Color::Saturate() +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( this, XMVectorSaturate( c ) ); +} + +inline void Color::Saturate( Color& result ) const +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( &result, XMVectorSaturate( c ) ); +} + +inline void Color::Premultiply() +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMVECTOR a = XMVectorSplatW( c ); + a = XMVectorSelect( g_XMIdentityR3, a, g_XMSelect1110 ); + XMStoreFloat4( this, XMVectorMultiply( c, a ) ); +} + +inline void Color::Premultiply( Color& result ) const +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMVECTOR a = XMVectorSplatW( c ); + a = XMVectorSelect( g_XMIdentityR3, a, g_XMSelect1110 ); + XMStoreFloat4( &result, XMVectorMultiply( c, a ) ); +} + +inline void Color::AdjustSaturation( float sat ) +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( this, XMColorAdjustSaturation( c, sat ) ); +} + +inline void Color::AdjustSaturation( float sat, Color& result ) const +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( &result, XMColorAdjustSaturation( c, sat ) ); +} + +inline void Color::AdjustContrast( float contrast ) +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( this, XMColorAdjustContrast( c, contrast ) ); +} + +inline void Color::AdjustContrast( float contrast, Color& result ) const +{ + using namespace DirectX; + XMVECTOR c = XMLoadFloat4( this ); + XMStoreFloat4( &result, XMColorAdjustContrast( c, contrast ) ); +} + +//------------------------------------------------------------------------------ +// Static functions +//------------------------------------------------------------------------------ + +inline void Color::Modulate( const Color& c1, const Color& c2, Color& result ) +{ + using namespace DirectX; + XMVECTOR C0 = XMLoadFloat4( &c1 ); + XMVECTOR C1 = XMLoadFloat4( &c2 ); + XMStoreFloat4( &result, XMColorModulate( C0, C1 ) ); +} + +inline Color Color::Modulate( const Color& c1, const Color& c2 ) +{ + using namespace DirectX; + XMVECTOR C0 = XMLoadFloat4( &c1 ); + XMVECTOR C1 = XMLoadFloat4( &c2 ); + + Color result; + XMStoreFloat4( &result, XMColorModulate( C0, C1 ) ); + return result; +} + +inline void Color::Lerp( const Color& c1, const Color& c2, float t, Color& result ) +{ + using namespace DirectX; + XMVECTOR C0 = XMLoadFloat4( &c1 ); + XMVECTOR C1 = XMLoadFloat4( &c2 ); + XMStoreFloat4( &result, XMVectorLerp( C0, C1, t ) ); +} + +inline Color Color::Lerp( const Color& c1, const Color& c2, float t ) +{ + using namespace DirectX; + XMVECTOR C0 = XMLoadFloat4( &c1 ); + XMVECTOR C1 = XMLoadFloat4( &c2 ); + + Color result; + XMStoreFloat4( &result, XMVectorLerp( C0, C1, t ) ); + return result; +} + + +/**************************************************************************** + * + * Ray + * + ****************************************************************************/ + +//----------------------------------------------------------------------------- +// Comparision operators +//------------------------------------------------------------------------------ +inline bool Ray::operator == ( const Ray& r ) const +{ + using namespace DirectX; + XMVECTOR r1p = XMLoadFloat3( &position ); + XMVECTOR r2p = XMLoadFloat3( &r.position ); + XMVECTOR r1d = XMLoadFloat3( &direction ); + XMVECTOR r2d = XMLoadFloat3( &r.direction ); + return XMVector3Equal( r1p, r2p ) && XMVector3Equal( r1d, r2d ); +} + +inline bool Ray::operator != ( const Ray& r ) const +{ + using namespace DirectX; + XMVECTOR r1p = XMLoadFloat3( &position ); + XMVECTOR r2p = XMLoadFloat3( &r.position ); + XMVECTOR r1d = XMLoadFloat3( &direction ); + XMVECTOR r2d = XMLoadFloat3( &r.direction ); + return XMVector3NotEqual( r1p, r2p ) && XMVector3NotEqual( r1d, r2d ); +} + +//----------------------------------------------------------------------------- +// Ray operators +//------------------------------------------------------------------------------ + +inline bool Ray::Intersects( const BoundingSphere& sphere, _Out_ float& Dist ) const +{ + return sphere.Intersects( position, direction, Dist ); +} + +inline bool Ray::Intersects( const BoundingBox& box, _Out_ float& Dist ) const +{ + return box.Intersects( position, direction, Dist ); +} + +inline bool Ray::Intersects( const Vector3& tri0, const Vector3& tri1, const Vector3& tri2, _Out_ float& Dist ) const +{ + return DirectX::TriangleTests::Intersects( position, direction, tri0, tri1, tri2, Dist ); +} + +inline bool Ray::Intersects( const Plane& plane, _Out_ float& Dist ) const +{ + using namespace DirectX; + + XMVECTOR p = XMLoadFloat4( &plane ); + XMVECTOR dir = XMLoadFloat3( &direction ); + + XMVECTOR nd = XMPlaneDotNormal( p, dir ); + + if ( XMVector3LessOrEqual( XMVectorAbs( nd ), g_RayEpsilon ) ) + { + Dist = 0.f; + return false; + } + else + { + // t = -(dot(n,origin) + D) / dot(n,dir) + XMVECTOR pos = XMLoadFloat3( &position ); + XMVECTOR v = XMPlaneDotNormal( p, pos ); + v = XMVectorAdd( v, XMVectorSplatW(p) ); + v = XMVectorDivide( v, nd ); + float dist = - XMVectorGetX( v ); + if (dist < 0) + { + Dist = 0.f; + return false; + } + else + { + Dist = dist; + return true; + } + } +} + + +/**************************************************************************** + * + * Viewport + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparision operators +//------------------------------------------------------------------------------ + +inline bool Viewport::operator == ( const Viewport& vp ) const +{ + return (x == vp.x && y == vp.y + && width == vp.width && height == vp.height + && minDepth == vp.minDepth && maxDepth == vp.maxDepth); +} + +inline bool Viewport::operator != ( const Viewport& vp ) const +{ + return (x != vp.x || y != vp.y + || width != vp.width || height != vp.height + || minDepth != vp.minDepth || maxDepth != vp.maxDepth); +} + +//------------------------------------------------------------------------------ +// Assignment operators +//------------------------------------------------------------------------------ + +inline Viewport& Viewport::operator= (const Viewport& vp) +{ + x = vp.x; y = vp.y; + width = vp.width; height = vp.height; + minDepth = vp.minDepth; maxDepth = vp.maxDepth; + return *this; +} + +inline Viewport& Viewport::operator= (const RECT& rct) +{ + x = float(rct.left); y = float(rct.top); + width = float(rct.right - rct.left); + height = float(rct.bottom - rct.top); + minDepth = 0.f; maxDepth = 1.f; + return *this; +} + +#if defined(__d3d11_h__) || defined(__d3d11_x_h__) +inline Viewport& Viewport::operator= (const D3D11_VIEWPORT& vp) +{ + x = vp.TopLeftX; y = vp.TopLeftY; + width = vp.Width; height = vp.Height; + minDepth = vp.MinDepth; maxDepth = vp.MaxDepth; + return *this; +} +#endif + +#if defined(__d3d12_h__) || defined(__d3d12_x_h__) +inline Viewport& Viewport::operator= (const D3D12_VIEWPORT& vp) +{ + x = vp.TopLeftX; y = vp.TopLeftY; + width = vp.Width; height = vp.Height; + minDepth = vp.MinDepth; maxDepth = vp.MaxDepth; + return *this; +} +#endif + +//------------------------------------------------------------------------------ +// Viewport operations +//------------------------------------------------------------------------------ + +inline float Viewport::AspectRatio() const +{ + if (width == 0.f || height == 0.f) + return 0.f; + + return (width / height); +} + +inline Vector3 Viewport::Project(const Vector3& p, const Matrix& proj, const Matrix& view, const Matrix& world) const +{ + using namespace DirectX; + XMVECTOR v = XMLoadFloat3(&p); + XMMATRIX projection = XMLoadFloat4x4(&proj); + v = XMVector3Project(v, x, y, width, height, minDepth, maxDepth, projection, view, world); + Vector3 result; + XMStoreFloat3(&result, v); + return result; +} + +inline void Viewport::Project(const Vector3& p, const Matrix& proj, const Matrix& view, const Matrix& world, Vector3& result) const +{ + using namespace DirectX; + XMVECTOR v = XMLoadFloat3(&p); + XMMATRIX projection = XMLoadFloat4x4(&proj); + v = XMVector3Project(v, x, y, width, height, minDepth, maxDepth, projection, view, world); + XMStoreFloat3(&result, v); +} + +inline Vector3 Viewport::Unproject(const Vector3& p, const Matrix& proj, const Matrix& view, const Matrix& world) const +{ + using namespace DirectX; + XMVECTOR v = XMLoadFloat3(&p); + XMMATRIX projection = XMLoadFloat4x4(&proj); + v = XMVector3Unproject(v, x, y, width, height, minDepth, maxDepth, projection, view, world); + Vector3 result; + XMStoreFloat3(&result, v); + return result; +} + +inline void Viewport::Unproject(const Vector3& p, const Matrix& proj, const Matrix& view, const Matrix& world, Vector3& result) const +{ + using namespace DirectX; + XMVECTOR v = XMLoadFloat3(&p); + XMMATRIX projection = XMLoadFloat4x4(&proj); + v = XMVector3Unproject(v, x, y, width, height, minDepth, maxDepth, projection, view, world); + XMStoreFloat3(&result, v); +} diff --git a/DirectXTK/Inc/SpriteBatch.h b/DirectXTK/Inc/SpriteBatch.h new file mode 100644 index 0000000..19f0f54 --- /dev/null +++ b/DirectXTK/Inc/SpriteBatch.h @@ -0,0 +1,96 @@ +//-------------------------------------------------------------------------------------- +// File: SpriteBatch.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include +#include +#include +#include + + +namespace DirectX +{ + enum SpriteSortMode + { + SpriteSortMode_Deferred, + SpriteSortMode_Immediate, + SpriteSortMode_Texture, + SpriteSortMode_BackToFront, + SpriteSortMode_FrontToBack, + }; + + + enum SpriteEffects + { + SpriteEffects_None = 0, + SpriteEffects_FlipHorizontally = 1, + SpriteEffects_FlipVertically = 2, + SpriteEffects_FlipBoth = SpriteEffects_FlipHorizontally | SpriteEffects_FlipVertically, + }; + + + class SpriteBatch + { + public: + explicit SpriteBatch(_In_ ID3D11DeviceContext* deviceContext); + SpriteBatch(SpriteBatch&& moveFrom); + SpriteBatch& operator= (SpriteBatch&& moveFrom); + + SpriteBatch(SpriteBatch const&) = delete; + SpriteBatch& operator= (SpriteBatch const&) = delete; + + virtual ~SpriteBatch(); + + // Begin/End a batch of sprite drawing operations. + void XM_CALLCONV Begin(SpriteSortMode sortMode = SpriteSortMode_Deferred, _In_opt_ ID3D11BlendState* blendState = nullptr, _In_opt_ ID3D11SamplerState* samplerState = nullptr, _In_opt_ ID3D11DepthStencilState* depthStencilState = nullptr, _In_opt_ ID3D11RasterizerState* rasterizerState = nullptr, + _In_opt_ std::function setCustomShaders = nullptr, FXMMATRIX transformMatrix = MatrixIdentity); + void __cdecl End(); + + // Draw overloads specifying position, origin and scale as XMFLOAT2. + void XM_CALLCONV Draw(_In_ ID3D11ShaderResourceView* texture, XMFLOAT2 const& position, FXMVECTOR color = Colors::White); + void XM_CALLCONV Draw(_In_ ID3D11ShaderResourceView* texture, XMFLOAT2 const& position, _In_opt_ RECT const* sourceRectangle, FXMVECTOR color = Colors::White, float rotation = 0, XMFLOAT2 const& origin = Float2Zero, float scale = 1, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0); + void XM_CALLCONV Draw(_In_ ID3D11ShaderResourceView* texture, XMFLOAT2 const& position, _In_opt_ RECT const* sourceRectangle, FXMVECTOR color, float rotation, XMFLOAT2 const& origin, XMFLOAT2 const& scale, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0); + + // Draw overloads specifying position, origin and scale via the first two components of an XMVECTOR. + void XM_CALLCONV Draw(_In_ ID3D11ShaderResourceView* texture, FXMVECTOR position, FXMVECTOR color = Colors::White); + void XM_CALLCONV Draw(_In_ ID3D11ShaderResourceView* texture, FXMVECTOR position, _In_opt_ RECT const* sourceRectangle, FXMVECTOR color = Colors::White, float rotation = 0, FXMVECTOR origin = g_XMZero, float scale = 1, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0); + void XM_CALLCONV Draw(_In_ ID3D11ShaderResourceView* texture, FXMVECTOR position, _In_opt_ RECT const* sourceRectangle, FXMVECTOR color, float rotation, FXMVECTOR origin, GXMVECTOR scale, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0); + + // Draw overloads specifying position as a RECT. + void XM_CALLCONV Draw(_In_ ID3D11ShaderResourceView* texture, RECT const& destinationRectangle, FXMVECTOR color = Colors::White); + void XM_CALLCONV Draw(_In_ ID3D11ShaderResourceView* texture, RECT const& destinationRectangle, _In_opt_ RECT const* sourceRectangle, FXMVECTOR color = Colors::White, float rotation = 0, XMFLOAT2 const& origin = Float2Zero, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0); + + // Rotation mode to be applied to the sprite transformation + void __cdecl SetRotation( DXGI_MODE_ROTATION mode ); + DXGI_MODE_ROTATION __cdecl GetRotation() const; + + // Set viewport for sprite transformation + void __cdecl SetViewport( const D3D11_VIEWPORT& viewPort ); + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + static const XMMATRIX MatrixIdentity; + static const XMFLOAT2 Float2Zero; + }; +} diff --git a/DirectXTK/Inc/SpriteFont.h b/DirectXTK/Inc/SpriteFont.h new file mode 100644 index 0000000..cfd9465 --- /dev/null +++ b/DirectXTK/Inc/SpriteFont.h @@ -0,0 +1,81 @@ +//-------------------------------------------------------------------------------------- +// File: SpriteFont.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include "SpriteBatch.h" + + +namespace DirectX +{ + class SpriteFont + { + public: + struct Glyph; + + SpriteFont(_In_ ID3D11Device* device, _In_z_ wchar_t const* fileName, bool forceSRGB = false); + SpriteFont(_In_ ID3D11Device* device, _In_reads_bytes_(dataSize) uint8_t const* dataBlob, _In_ size_t dataSize, bool forceSRGB = false); + SpriteFont(_In_ ID3D11ShaderResourceView* texture, _In_reads_(glyphCount) Glyph const* glyphs, _In_ size_t glyphCount, _In_ float lineSpacing); + + SpriteFont(SpriteFont&& moveFrom); + SpriteFont& operator= (SpriteFont&& moveFrom); + + SpriteFont(SpriteFont const&) = delete; + SpriteFont& operator= (SpriteFont const&) = delete; + + virtual ~SpriteFont(); + + void XM_CALLCONV DrawString(_In_ SpriteBatch* spriteBatch, _In_z_ wchar_t const* text, XMFLOAT2 const& position, FXMVECTOR color = Colors::White, float rotation = 0, XMFLOAT2 const& origin = Float2Zero, float scale = 1, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0) const; + void XM_CALLCONV DrawString(_In_ SpriteBatch* spriteBatch, _In_z_ wchar_t const* text, XMFLOAT2 const& position, FXMVECTOR color, float rotation, XMFLOAT2 const& origin, XMFLOAT2 const& scale, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0) const; + void XM_CALLCONV DrawString(_In_ SpriteBatch* spriteBatch, _In_z_ wchar_t const* text, FXMVECTOR position, FXMVECTOR color = Colors::White, float rotation = 0, FXMVECTOR origin = g_XMZero, float scale = 1, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0) const; + void XM_CALLCONV DrawString(_In_ SpriteBatch* spriteBatch, _In_z_ wchar_t const* text, FXMVECTOR position, FXMVECTOR color, float rotation, FXMVECTOR origin, GXMVECTOR scale, SpriteEffects effects = SpriteEffects_None, float layerDepth = 0) const; + + XMVECTOR XM_CALLCONV MeasureString(_In_z_ wchar_t const* text) const; + + RECT __cdecl MeasureDrawBounds(_In_z_ wchar_t const* text, XMFLOAT2 const& position) const; + RECT XM_CALLCONV MeasureDrawBounds(_In_z_ wchar_t const* text, FXMVECTOR position) const; + + // Spacing properties + float __cdecl GetLineSpacing() const; + void __cdecl SetLineSpacing(float spacing); + + // Font properties + wchar_t __cdecl GetDefaultCharacter() const; + void __cdecl SetDefaultCharacter(wchar_t character); + + bool __cdecl ContainsCharacter(wchar_t character) const; + + // Custom layout/rendering + Glyph const* __cdecl FindGlyph(wchar_t character) const; + void __cdecl GetSpriteSheet( ID3D11ShaderResourceView** texture ) const; + + // Describes a single character glyph. + struct Glyph + { + uint32_t Character; + RECT Subrect; + float XOffset; + float YOffset; + float XAdvance; + }; + + + private: + // Private implementation. + class Impl; + + std::unique_ptr pImpl; + + static const XMFLOAT2 Float2Zero; + }; +} diff --git a/DirectXTK/Inc/VertexTypes.h b/DirectXTK/Inc/VertexTypes.h new file mode 100644 index 0000000..6ff69fb --- /dev/null +++ b/DirectXTK/Inc/VertexTypes.h @@ -0,0 +1,366 @@ +//-------------------------------------------------------------------------------------- +// File: VertexTypes.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include + + +namespace DirectX +{ + // Vertex struct holding position information. + struct VertexPosition + { + VertexPosition() = default; + + VertexPosition(XMFLOAT3 const& position) + : position(position) + { } + + VertexPosition(FXMVECTOR position) + { + XMStoreFloat3(&this->position, position); + } + + XMFLOAT3 position; + + static const int InputElementCount = 1; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct holding position and color information. + struct VertexPositionColor + { + VertexPositionColor() = default; + + VertexPositionColor(XMFLOAT3 const& position, XMFLOAT4 const& color) + : position(position), + color(color) + { } + + VertexPositionColor(FXMVECTOR position, FXMVECTOR color) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat4(&this->color, color); + } + + XMFLOAT3 position; + XMFLOAT4 color; + + static const int InputElementCount = 2; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct holding position and texture mapping information. + struct VertexPositionTexture + { + VertexPositionTexture() = default; + + VertexPositionTexture(XMFLOAT3 const& position, XMFLOAT2 const& textureCoordinate) + : position(position), + textureCoordinate(textureCoordinate) + { } + + VertexPositionTexture(FXMVECTOR position, FXMVECTOR textureCoordinate) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat2(&this->textureCoordinate, textureCoordinate); + } + + XMFLOAT3 position; + XMFLOAT2 textureCoordinate; + + static const int InputElementCount = 2; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct holding position and dual texture mapping information. + struct VertexPositionDualTexture + { + VertexPositionDualTexture() = default; + + VertexPositionDualTexture(XMFLOAT3 const& position, XMFLOAT2 const& textureCoordinate0, XMFLOAT2 const& textureCoordinate1) + : position(position), + textureCoordinate0(textureCoordinate0), + textureCoordinate1(textureCoordinate1) + { } + + VertexPositionDualTexture(FXMVECTOR position, + FXMVECTOR textureCoordinate0, + FXMVECTOR textureCoordinate1) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat2(&this->textureCoordinate0, textureCoordinate0); + XMStoreFloat2(&this->textureCoordinate1, textureCoordinate1); + } + + XMFLOAT3 position; + XMFLOAT2 textureCoordinate0; + XMFLOAT2 textureCoordinate1; + + static const int InputElementCount = 3; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct holding position and normal vector. + struct VertexPositionNormal + { + VertexPositionNormal() = default; + + VertexPositionNormal(XMFLOAT3 const& position, XMFLOAT3 const& normal) + : position(position), + normal(normal) + { } + + VertexPositionNormal(FXMVECTOR position, FXMVECTOR normal) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat3(&this->normal, normal); + } + + XMFLOAT3 position; + XMFLOAT3 normal; + + static const int InputElementCount = 2; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct holding position, color, and texture mapping information. + struct VertexPositionColorTexture + { + VertexPositionColorTexture() = default; + + VertexPositionColorTexture(XMFLOAT3 const& position, XMFLOAT4 const& color, XMFLOAT2 const& textureCoordinate) + : position(position), + color(color), + textureCoordinate(textureCoordinate) + { } + + VertexPositionColorTexture(FXMVECTOR position, FXMVECTOR color, FXMVECTOR textureCoordinate) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat4(&this->color, color); + XMStoreFloat2(&this->textureCoordinate, textureCoordinate); + } + + XMFLOAT3 position; + XMFLOAT4 color; + XMFLOAT2 textureCoordinate; + + static const int InputElementCount = 3; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct holding position, normal vector, and color information. + struct VertexPositionNormalColor + { + VertexPositionNormalColor() = default; + + VertexPositionNormalColor(XMFLOAT3 const& position, XMFLOAT3 const& normal, XMFLOAT4 const& color) + : position(position), + normal(normal), + color(color) + { } + + VertexPositionNormalColor(FXMVECTOR position, FXMVECTOR normal, FXMVECTOR color) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat3(&this->normal, normal); + XMStoreFloat4(&this->color, color); + } + + XMFLOAT3 position; + XMFLOAT3 normal; + XMFLOAT4 color; + + static const int InputElementCount = 3; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct holding position, normal vector, and texture mapping information. + struct VertexPositionNormalTexture + { + VertexPositionNormalTexture() = default; + + VertexPositionNormalTexture(XMFLOAT3 const& position, XMFLOAT3 const& normal, XMFLOAT2 const& textureCoordinate) + : position(position), + normal(normal), + textureCoordinate(textureCoordinate) + { } + + VertexPositionNormalTexture(FXMVECTOR position, FXMVECTOR normal, FXMVECTOR textureCoordinate) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat3(&this->normal, normal); + XMStoreFloat2(&this->textureCoordinate, textureCoordinate); + } + + XMFLOAT3 position; + XMFLOAT3 normal; + XMFLOAT2 textureCoordinate; + + static const int InputElementCount = 3; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct holding position, normal vector, color, and texture mapping information. + struct VertexPositionNormalColorTexture + { + VertexPositionNormalColorTexture() = default; + + VertexPositionNormalColorTexture(XMFLOAT3 const& position, XMFLOAT3 const& normal, XMFLOAT4 const& color, XMFLOAT2 const& textureCoordinate) + : position(position), + normal(normal), + color(color), + textureCoordinate(textureCoordinate) + { } + + VertexPositionNormalColorTexture(FXMVECTOR position, FXMVECTOR normal, FXMVECTOR color, CXMVECTOR textureCoordinate) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat3(&this->normal, normal); + XMStoreFloat4(&this->color, color); + XMStoreFloat2(&this->textureCoordinate, textureCoordinate); + } + + XMFLOAT3 position; + XMFLOAT3 normal; + XMFLOAT4 color; + XMFLOAT2 textureCoordinate; + + static const int InputElementCount = 4; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct for Visual Studio Shader Designer (DGSL) holding position, normal, + // tangent, color (RGBA), and texture mapping information + struct VertexPositionNormalTangentColorTexture + { + VertexPositionNormalTangentColorTexture() = default; + + XMFLOAT3 position; + XMFLOAT3 normal; + XMFLOAT4 tangent; + uint32_t color; + XMFLOAT2 textureCoordinate; + + VertexPositionNormalTangentColorTexture(XMFLOAT3 const& position, XMFLOAT3 const& normal, XMFLOAT4 const& tangent, uint32_t rgba, XMFLOAT2 const& textureCoordinate) + : position(position), + normal(normal), + tangent(tangent), + color(rgba), + textureCoordinate(textureCoordinate) + { + } + + VertexPositionNormalTangentColorTexture(FXMVECTOR position, FXMVECTOR normal, FXMVECTOR tangent, uint32_t rgba, CXMVECTOR textureCoordinate) + : color(rgba) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat3(&this->normal, normal); + XMStoreFloat4(&this->tangent, tangent); + XMStoreFloat2(&this->textureCoordinate, textureCoordinate); + } + + VertexPositionNormalTangentColorTexture(XMFLOAT3 const& position, XMFLOAT3 const& normal, XMFLOAT4 const& tangent, XMFLOAT4 const& color, XMFLOAT2 const& textureCoordinate) + : position(position), + normal(normal), + tangent(tangent), + textureCoordinate(textureCoordinate) + { + SetColor( color ); + } + + VertexPositionNormalTangentColorTexture(FXMVECTOR position, FXMVECTOR normal, FXMVECTOR tangent, CXMVECTOR color, CXMVECTOR textureCoordinate) + { + XMStoreFloat3(&this->position, position); + XMStoreFloat3(&this->normal, normal); + XMStoreFloat4(&this->tangent, tangent); + XMStoreFloat2(&this->textureCoordinate, textureCoordinate); + + SetColor( color ); + } + + void __cdecl SetColor( XMFLOAT4 const& icolor ) { SetColor( XMLoadFloat4( &icolor ) ); } + void XM_CALLCONV SetColor( FXMVECTOR icolor ); + + static const int InputElementCount = 5; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; + + + // Vertex struct for Visual Studio Shader Designer (DGSL) holding position, normal, + // tangent, color (RGBA), texture mapping information, and skinning weights + struct VertexPositionNormalTangentColorTextureSkinning : public VertexPositionNormalTangentColorTexture + { + VertexPositionNormalTangentColorTextureSkinning() = default; + + uint32_t indices; + uint32_t weights; + + VertexPositionNormalTangentColorTextureSkinning(XMFLOAT3 const& position, XMFLOAT3 const& normal, XMFLOAT4 const& tangent, uint32_t rgba, + XMFLOAT2 const& textureCoordinate, XMUINT4 const& indices, XMFLOAT4 const& weights) + : VertexPositionNormalTangentColorTexture(position,normal,tangent,rgba,textureCoordinate) + { + SetBlendIndices( indices ); + SetBlendWeights( weights ); + } + + VertexPositionNormalTangentColorTextureSkinning(FXMVECTOR position, FXMVECTOR normal, FXMVECTOR tangent, uint32_t rgba, CXMVECTOR textureCoordinate, + XMUINT4 const& indices, CXMVECTOR weights) + : VertexPositionNormalTangentColorTexture(position,normal,tangent,rgba,textureCoordinate) + { + SetBlendIndices( indices ); + SetBlendWeights( weights ); + } + + VertexPositionNormalTangentColorTextureSkinning(XMFLOAT3 const& position, XMFLOAT3 const& normal, XMFLOAT4 const& tangent, XMFLOAT4 const& color, + XMFLOAT2 const& textureCoordinate, XMUINT4 const& indices, XMFLOAT4 const& weights) + : VertexPositionNormalTangentColorTexture(position,normal,tangent,color,textureCoordinate) + { + SetBlendIndices( indices ); + SetBlendWeights( weights ); + } + + VertexPositionNormalTangentColorTextureSkinning(FXMVECTOR position, FXMVECTOR normal, FXMVECTOR tangent, CXMVECTOR color, CXMVECTOR textureCoordinate, + XMUINT4 const& indices, CXMVECTOR weights) + : VertexPositionNormalTangentColorTexture(position,normal,tangent,color,textureCoordinate) + { + SetBlendIndices( indices ); + SetBlendWeights( weights ); + } + + void __cdecl SetBlendIndices( XMUINT4 const& iindices ); + + void __cdecl SetBlendWeights( XMFLOAT4 const& iweights ) { SetBlendWeights( XMLoadFloat4( &iweights ) ); } + void XM_CALLCONV SetBlendWeights( FXMVECTOR iweights ); + + static const int InputElementCount = 7; + static const D3D11_INPUT_ELEMENT_DESC InputElements[InputElementCount]; + }; +} diff --git a/DirectXTK/Inc/WICTextureLoader.h b/DirectXTK/Inc/WICTextureLoader.h new file mode 100644 index 0000000..bc69efe --- /dev/null +++ b/DirectXTK/Inc/WICTextureLoader.h @@ -0,0 +1,155 @@ +//-------------------------------------------------------------------------------------- +// File: WICTextureLoader.h +// +// Function for loading a WIC image and creating a Direct3D runtime texture for it +// (auto-generating mipmaps if possible) +// +// Note: Assumes application has already called CoInitializeEx +// +// Warning: CreateWICTexture* functions are not thread-safe if given a d3dContext instance for +// auto-gen mipmap support. +// +// Note these functions are useful for images created as simple 2D textures. For +// more complex resources, DDSTextureLoader is an excellent light-weight runtime loader. +// For a full-featured DDS file reader, writer, and texture processing pipeline see +// the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XBOX_ONE) && defined(_TITLE) +#include +#else +#include +#endif + +#include + + +namespace DirectX +{ + enum WIC_LOADER_FLAGS + { + WIC_LOADER_DEFAULT = 0, + WIC_LOADER_FORCE_SRGB = 0x1, + WIC_LOADER_IGNORE_SRGB = 0x2, + }; + + // Standard version + HRESULT __cdecl CreateWICTextureFromMemory( + _In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0); + + HRESULT __cdecl CreateWICTextureFromFile( + _In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0); + + // Standard version with optional auto-gen mipmap support + HRESULT __cdecl CreateWICTextureFromMemory( + #if defined(_XBOX_ONE) && defined(_TITLE) + _In_ ID3D11DeviceX* d3dDevice, + _In_opt_ ID3D11DeviceContextX* d3dContext, + #else + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + #endif + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0); + + HRESULT __cdecl CreateWICTextureFromFile( + #if defined(_XBOX_ONE) && defined(_TITLE) + _In_ ID3D11DeviceX* d3dDevice, + _In_opt_ ID3D11DeviceContextX* d3dContext, + #else + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + #endif + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0); + + // Extended version + HRESULT __cdecl CreateWICTextureFromMemoryEx( + _In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ unsigned int loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView); + + HRESULT __cdecl CreateWICTextureFromFileEx( + _In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ unsigned int loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView); + + // Extended version with optional auto-gen mipmap support + HRESULT __cdecl CreateWICTextureFromMemoryEx( +#if defined(_XBOX_ONE) && defined(_TITLE) + _In_ ID3D11DeviceX* d3dDevice, + _In_opt_ ID3D11DeviceContextX* d3dContext, + #else + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + #endif + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ unsigned int loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView); + + HRESULT __cdecl CreateWICTextureFromFileEx( + #if defined(_XBOX_ONE) && defined(_TITLE) + _In_ ID3D11DeviceX* d3dDevice, + _In_opt_ ID3D11DeviceContextX* d3dContext, + #else + _In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + #endif + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ unsigned int loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView); +} \ No newline at end of file diff --git a/DirectXTK/Inc/XboxDDSTextureLoader.h b/DirectXTK/Inc/XboxDDSTextureLoader.h new file mode 100644 index 0000000..e1e0481 --- /dev/null +++ b/DirectXTK/Inc/XboxDDSTextureLoader.h @@ -0,0 +1,62 @@ +//-------------------------------------------------------------------------------------- +// File: XboxDDSTextureLoader.h +// +// Functions for loading a DDS texture using the XBOX extended header and creating a +// Direct3D11.X runtime resource for it via the CreatePlacement APIs +// +// Note these functions will not load standard DDS files. Use the DDSTextureLoader +// module in the DirectXTex package or as part of the DirectXTK library to load +// these files which use standard Direct3D resource creation APIs. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#if !defined(_XBOX_ONE) || !defined(_TITLE) +#error This module only supports Xbox One exclusive apps +#endif + +#include + +#include + +namespace Xbox +{ + enum DDS_ALPHA_MODE + { + DDS_ALPHA_MODE_UNKNOWN = 0, + DDS_ALPHA_MODE_STRAIGHT = 1, + DDS_ALPHA_MODE_PREMULTIPLIED = 2, + DDS_ALPHA_MODE_OPAQUE = 3, + DDS_ALPHA_MODE_CUSTOM = 4, + }; + + HRESULT __cdecl CreateDDSTextureFromMemory( + _In_ ID3D11DeviceX* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Outptr_ void** grfxMemory, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, + _In_ bool forceSRGB = false); + + HRESULT __cdecl CreateDDSTextureFromFile( _In_ ID3D11DeviceX* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Outptr_ void** grfxMemory, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, + _In_ bool forceSRGB = false); + + void FreeDDSTextureMemory( _In_opt_ void* grfxMemory ); +} \ No newline at end of file diff --git a/DirectXTK/LICENSE b/DirectXTK/LICENSE new file mode 100644 index 0000000..73617f0 --- /dev/null +++ b/DirectXTK/LICENSE @@ -0,0 +1,21 @@ + The MIT License (MIT) + +Copyright (c) 2017 Microsoft Corp + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/DirectXTK/MakeSpriteFont/BitmapImporter.cs b/DirectXTK/MakeSpriteFont/BitmapImporter.cs new file mode 100644 index 0000000..abc31b9 --- /dev/null +++ b/DirectXTK/MakeSpriteFont/BitmapImporter.cs @@ -0,0 +1,125 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System; +using System.Linq; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; + +namespace MakeSpriteFont +{ + // Extracts font glyphs from a specially marked 2D bitmap. Characters should be + // arranged in a grid ordered from top left to bottom right. Monochrome characters + // should use white for solid areas and black for transparent areas. To include + // multicolored characters, add an alpha channel to the bitmap and use that to + // control which parts of the character are solid. The spaces between characters + // and around the edges of the grid should be filled with bright pink (red=255, + // green=0, blue=255). It doesn't matter if your grid includes lots of wasted space, + // because the converter will rearrange characters, packing as tightly as possible. + public class BitmapImporter : IFontImporter + { + // Properties hold the imported font data. + public IEnumerable Glyphs { get; private set; } + + public float LineSpacing { get; private set; } + + + public void Import(CommandLineOptions options) + { + // Load the source bitmap. + Bitmap bitmap; + + try + { + bitmap = new Bitmap(options.SourceFont); + } + catch + { + throw new Exception(string.Format("Unable to load '{0}'.", options.SourceFont)); + } + + // Convert to our desired pixel format. + bitmap = BitmapUtils.ChangePixelFormat(bitmap, PixelFormat.Format32bppArgb); + + // What characters are included in this font? + var characters = CharacterRegion.Flatten(options.CharacterRegions).ToArray(); + int characterIndex = 0; + char currentCharacter = '\0'; + + // Split the source image into a list of individual glyphs. + var glyphList = new List(); + + Glyphs = glyphList; + LineSpacing = 0; + + foreach (Rectangle rectangle in FindGlyphs(bitmap)) + { + if (characterIndex < characters.Length) + currentCharacter = characters[characterIndex++]; + else + currentCharacter++; + + glyphList.Add(new Glyph(currentCharacter, bitmap, rectangle)); + + LineSpacing = Math.Max(LineSpacing, rectangle.Height); + } + + // If the bitmap doesn't already have an alpha channel, create one now. + if (BitmapUtils.IsAlphaEntirely(255, bitmap)) + { + BitmapUtils.ConvertGreyToAlpha(bitmap); + } + } + + + // Searches a 2D bitmap for characters that are surrounded by a marker pink color. + static IEnumerable FindGlyphs(Bitmap bitmap) + { + using (var bitmapData = new BitmapUtils.PixelAccessor(bitmap, ImageLockMode.ReadOnly)) + { + for (int y = 1; y < bitmap.Height; y++) + { + for (int x = 1; x < bitmap.Width; x++) + { + // Look for the top left corner of a character (a pixel that is not pink, but was pink immediately to the left and above it) + if (!IsMarkerColor(bitmapData[x, y]) && + IsMarkerColor(bitmapData[x - 1, y]) && + IsMarkerColor(bitmapData[x, y - 1])) + { + // Measure the size of this character. + int w = 1, h = 1; + + while ((x + w < bitmap.Width) && !IsMarkerColor(bitmapData[x + w, y])) + { + w++; + } + + while ((y + h < bitmap.Height) && !IsMarkerColor(bitmapData[x, y + h])) + { + h++; + } + + yield return new Rectangle(x, y, w, h); + } + } + } + } + } + + + // Checks whether a color is the magic magenta marker value. + static bool IsMarkerColor(Color color) + { + return color.ToArgb() == Color.Magenta.ToArgb(); + } + } +} diff --git a/DirectXTK/MakeSpriteFont/BitmapUtils.cs b/DirectXTK/MakeSpriteFont/BitmapUtils.cs new file mode 100644 index 0000000..19c41f3 --- /dev/null +++ b/DirectXTK/MakeSpriteFont/BitmapUtils.cs @@ -0,0 +1,244 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; + +namespace MakeSpriteFont +{ + // Assorted helpers for doing useful things with bitmaps. + public static class BitmapUtils + { + // Copies a rectangular area from one bitmap to another. + public static void CopyRect(Bitmap source, Rectangle sourceRegion, Bitmap output, Rectangle outputRegion) + { + if (sourceRegion.Width != outputRegion.Width || + sourceRegion.Height != outputRegion.Height) + { + throw new ArgumentException(); + } + + using (var sourceData = new PixelAccessor(source, ImageLockMode.ReadOnly, sourceRegion)) + using (var outputData = new PixelAccessor(output, ImageLockMode.WriteOnly, outputRegion)) + { + for (int y = 0; y < sourceRegion.Height; y++) + { + for (int x = 0; x < sourceRegion.Width; x++) + { + outputData[x, y] = sourceData[x, y]; + } + } + } + } + + + // Checks whether an area of a bitmap contains entirely the specified alpha value. + public static bool IsAlphaEntirely(byte expectedAlpha, Bitmap bitmap, Rectangle? region = null) + { + using (var bitmapData = new PixelAccessor(bitmap, ImageLockMode.ReadOnly, region)) + { + for (int y = 0; y < bitmapData.Region.Height; y++) + { + for (int x = 0; x < bitmapData.Region.Width; x++) + { + byte alpha = bitmapData[x, y].A; + + if (alpha != expectedAlpha) + return false; + } + } + } + + return true; + } + + + // Checks whether a bitmap contains entirely the specified RGB value. + public static bool IsRgbEntirely(Color expectedRgb, Bitmap bitmap) + { + using (var bitmapData = new PixelAccessor(bitmap, ImageLockMode.ReadOnly)) + { + for (int y = 0; y < bitmap.Height; y++) + { + for (int x = 0; x < bitmap.Width; x++) + { + Color color = bitmapData[x, y]; + + if (color.A == 0) + continue; + + if ((color.R != expectedRgb.R) || + (color.G != expectedRgb.G) || + (color.B != expectedRgb.B)) + { + return false; + } + } + } + } + + return true; + } + + + // Converts greyscale luminosity to alpha data. + public static void ConvertGreyToAlpha(Bitmap bitmap) + { + using (var bitmapData = new PixelAccessor(bitmap, ImageLockMode.ReadWrite)) + { + for (int y = 0; y < bitmap.Height; y++) + { + for (int x = 0; x < bitmap.Width; x++) + { + Color color = bitmapData[x, y]; + + // Average the red, green and blue values to compute brightness. + int alpha = (color.R + color.G + color.B) / 3; + + bitmapData[x, y] = Color.FromArgb(alpha, 255, 255, 255); + } + } + } + } + + + // Converts a bitmap to premultiplied alpha format. + public static void PremultiplyAlpha(Bitmap bitmap) + { + using (var bitmapData = new PixelAccessor(bitmap, ImageLockMode.ReadWrite)) + { + for (int y = 0; y < bitmap.Height; y++) + { + for (int x = 0; x < bitmap.Width; x++) + { + Color color = bitmapData[x, y]; + + int a = color.A; + int r = color.R * a / 255; + int g = color.G * a / 255; + int b = color.B * a / 255; + + bitmapData[x, y] = Color.FromArgb(a, r, g, b); + } + } + } + } + + + // To avoid filtering artifacts when scaling or rotating fonts that do not use premultiplied alpha, + // make sure the one pixel border around each glyph contains the same RGB values as the edge of the + // glyph itself, but with zero alpha. This processing is an elaborate no-op when using premultiplied + // alpha, because the premultiply conversion will change the RGB of all such zero alpha pixels to black. + public static void PadBorderPixels(Bitmap bitmap, Rectangle region) + { + using (var bitmapData = new PixelAccessor(bitmap, ImageLockMode.ReadWrite)) + { + // Pad the top and bottom. + for (int x = region.Left; x < region.Right; x++) + { + CopyBorderPixel(bitmapData, x, region.Top, x, region.Top - 1); + CopyBorderPixel(bitmapData, x, region.Bottom - 1, x, region.Bottom); + } + + // Pad the left and right. + for (int y = region.Top; y < region.Bottom; y++) + { + CopyBorderPixel(bitmapData, region.Left, y, region.Left - 1, y); + CopyBorderPixel(bitmapData, region.Right - 1, y, region.Right, y); + } + + // Pad the four corners. + CopyBorderPixel(bitmapData, region.Left, region.Top, region.Left - 1, region.Top - 1); + CopyBorderPixel(bitmapData, region.Right - 1, region.Top, region.Right, region.Top - 1); + CopyBorderPixel(bitmapData, region.Left, region.Bottom - 1, region.Left - 1, region.Bottom); + CopyBorderPixel(bitmapData, region.Right - 1, region.Bottom - 1, region.Right, region.Bottom); + } + } + + + // Copies a single pixel within a bitmap, preserving RGB but forcing alpha to zero. + static void CopyBorderPixel(PixelAccessor bitmapData, int sourceX, int sourceY, int destX, int destY) + { + Color color = bitmapData[sourceX, sourceY]; + + bitmapData[destX, destY] = Color.FromArgb(0, color); + } + + + // Converts a bitmap to the specified pixel format. + public static Bitmap ChangePixelFormat(Bitmap bitmap, PixelFormat format) + { + Rectangle bounds = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + + return bitmap.Clone(bounds, format); + } + + + // Helper for locking a bitmap and efficiently reading or writing its pixels. + public sealed class PixelAccessor : IDisposable + { + // Constructor locks the bitmap. + public PixelAccessor(Bitmap bitmap, ImageLockMode mode, Rectangle? region = null) + { + this.bitmap = bitmap; + + this.Region = region.GetValueOrDefault(new Rectangle(0, 0, bitmap.Width, bitmap.Height)); + + this.data = bitmap.LockBits(Region, mode, PixelFormat.Format32bppArgb); + } + + + // Dispose unlocks the bitmap. + public void Dispose() + { + if (data != null) + { + bitmap.UnlockBits(data); + + data = null; + } + } + + + // Query what part of the bitmap is locked. + public Rectangle Region { get; private set; } + + + // Get or set a pixel value. + public Color this[int x, int y] + { + get + { + return Color.FromArgb(Marshal.ReadInt32(PixelAddress(x, y))); + } + + set + { + Marshal.WriteInt32(PixelAddress(x, y), value.ToArgb()); + } + } + + + // Helper computes the address of the specified pixel. + IntPtr PixelAddress(int x, int y) + { + return data.Scan0 + (y * data.Stride) + (x * sizeof(int)); + } + + + // Fields. + Bitmap bitmap; + BitmapData data; + } + } +} diff --git a/DirectXTK/MakeSpriteFont/CharacterRegion.cs b/DirectXTK/MakeSpriteFont/CharacterRegion.cs new file mode 100644 index 0000000..3832f8e --- /dev/null +++ b/DirectXTK/MakeSpriteFont/CharacterRegion.cs @@ -0,0 +1,137 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System; +using System.Linq; +using System.ComponentModel; +using System.Globalization; +using System.Collections.Generic; + +namespace MakeSpriteFont +{ + // Describes a range of consecutive characters that should be included in the font. + [TypeConverter(typeof(CharacterRegionTypeConverter))] + public class CharacterRegion + { + // Constructor. + public CharacterRegion(char start, char end) + { + if (start > end) + throw new ArgumentException(); + + this.Start = start; + this.End = end; + } + + + // Fields. + public char Start; + public char End; + + + // Enumerates all characters within the region. + public IEnumerable Characters + { + get + { + for (char c = Start; c <= End; c++) + { + yield return c; + } + } + } + + + // Flattens a list of character regions into a combined list of individual characters. + public static IEnumerable Flatten(IEnumerable regions) + { + if (regions.Any()) + { + // If we have any regions, flatten them and remove duplicates. + return regions.SelectMany(region => region.Characters).Distinct(); + } + else + { + // If no regions were specified, use the default. + return defaultRegion.Characters; + } + } + + + // Default to just the base ASCII character set. + static CharacterRegion defaultRegion = new CharacterRegion(' ', '~'); + } + + + + // Custom type converter enables CommandLineParser to parse CharacterRegion command line options. + public class CharacterRegionTypeConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + return sourceType == typeof(string); + } + + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + // Input must be a string. + string source = value as string; + + if (string.IsNullOrEmpty(source)) + { + throw new ArgumentException(); + } + + // Supported input formats: + // A + // A-Z + // 32-127 + // 0x20-0x7F + + char[] split = source.Split('-') + .Select(ConvertCharacter) + .ToArray(); + + switch (split.Length) + { + case 1: + // Only a single character (eg. "a"). + return new CharacterRegion(split[0], split[0]); + + case 2: + // Range of characters (eg. "a-z"). + return new CharacterRegion(split[0], split[1]); + + default: + throw new ArgumentException(); + } + } + + + static char ConvertCharacter(string value) + { + if (value.Length == 1) + { + // Single character directly specifies a codepoint. + return value[0]; + } + else + { + // Otherwise it must be an integer (eg. "32" or "0x20"). + return (char)(int)intConverter.ConvertFromInvariantString(value); + } + } + + + static TypeConverter intConverter = TypeDescriptor.GetConverter(typeof(int)); + } +} diff --git a/DirectXTK/MakeSpriteFont/CommandLineOptions.cs b/DirectXTK/MakeSpriteFont/CommandLineOptions.cs new file mode 100644 index 0000000..9548af4 --- /dev/null +++ b/DirectXTK/MakeSpriteFont/CommandLineOptions.cs @@ -0,0 +1,99 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System.Collections.Generic; +using System.Drawing; + +namespace MakeSpriteFont +{ + // Available output texture formats. + public enum TextureFormat + { + Auto, + Rgba32, + Bgra4444, + CompressedMono, + } + + + // Feature levels + public enum FeatureLevel + { + FL9_1, + FL9_2, + FL9_3, + FL10_0, + FL10_1, + FL11_0, + FL11_1, + FL12_0, + FL12_1, + } + + + // Options telling the tool what to do. + public class CommandLineOptions + { + // Input can be either a system (TrueType) font or a specially marked bitmap file. + [CommandLineParser.Required] + public string SourceFont; + + + // Output spritefont binary. + [CommandLineParser.Required] + public string OutputFile; + + + // Which characters to include in the font (eg. "/CharacterRegion:0x20-0x7F /CharacterRegion:0x123") + [CommandLineParser.Name("CharacterRegion")] + public readonly List CharacterRegions = new List(); + + + // Fallback character used when asked to render a codepoint that is not + // included in the font. If zero, missing characters throw exceptions. + public readonly int DefaultCharacter = 0; + + + // Size and style for TrueType fonts (ignored when converting a bitmap font). + public float FontSize = 23; + + public FontStyle FontStyle = FontStyle.Regular; + + + // Spacing overrides. Zero is default spacing, negative closer together, positive further apart. + public float LineSpacing = 0; + public float CharacterSpacing = 0; + + + // Use smooth or sharp antialiasing mode for TrueType rasterization? + public bool Sharp = false; + + + // What format should the output texture be? + public TextureFormat TextureFormat = TextureFormat.Auto; + + + // By default, font textures use premultiplied alpha format. Set this if you want interpolative alpha instead. + public bool NoPremultiply = false; + + + // Dumps the generated sprite texture to a bitmap file (useful for debugging). + public string DebugOutputSpriteSheet = null; + + + // Controls texture-size based warnings + public FeatureLevel FeatureLevel = FeatureLevel.FL9_1; + + + // For large fonts, the default tightest pack is too slow + public bool FastPack = false; + } +} diff --git a/DirectXTK/MakeSpriteFont/CommandLineParser.cs b/DirectXTK/MakeSpriteFont/CommandLineParser.cs new file mode 100644 index 0000000..61d42bf --- /dev/null +++ b/DirectXTK/MakeSpriteFont/CommandLineParser.cs @@ -0,0 +1,253 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System; +using System.IO; +using System.Linq; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using System.ComponentModel; + +namespace MakeSpriteFont +{ + // Reusable, reflection based helper for parsing commandline options. + public class CommandLineParser + { + object optionsObject; + + Queue requiredOptions = new Queue(); + Dictionary optionalOptions = new Dictionary(); + + List requiredUsageHelp = new List(); + List optionalUsageHelp = new List(); + + + // Constructor. + public CommandLineParser(object optionsObject) + { + this.optionsObject = optionsObject; + + // Reflect to find what commandline options are available. + foreach (FieldInfo field in optionsObject.GetType().GetFields()) + { + string fieldName = GetOptionName(field); + + if (GetAttribute(field) != null) + { + // Record a required option. + requiredOptions.Enqueue(field); + + requiredUsageHelp.Add(string.Format("<{0}>", fieldName)); + } + else + { + // Record an optional option. + optionalOptions.Add(fieldName.ToLowerInvariant(), field); + + if (field.FieldType == typeof(bool)) + { + optionalUsageHelp.Add(string.Format("/{0}", fieldName)); + } + else + { + optionalUsageHelp.Add(string.Format("/{0}:value", fieldName)); + } + } + } + } + + + public bool ParseCommandLine(string[] args) + { + // Parse each argument in turn. + foreach (string arg in args) + { + if (!ParseArgument(arg.Trim())) + { + return false; + } + } + + // Make sure we got all the required options. + FieldInfo missingRequiredOption = requiredOptions.FirstOrDefault(field => !IsList(field) || GetList(field).Count == 0); + + if (missingRequiredOption != null) + { + ShowError("Missing argument '{0}'", GetOptionName(missingRequiredOption)); + return false; + } + + return true; + } + + + bool ParseArgument(string arg) + { + if (arg.StartsWith("/")) + { + // Parse an optional argument. + char[] separators = { ':' }; + + string[] split = arg.Substring(1).Split(separators, 2, StringSplitOptions.None); + + string name = split[0]; + string value = (split.Length > 1) ? split[1] : "true"; + + FieldInfo field; + + if (!optionalOptions.TryGetValue(name.ToLowerInvariant(), out field)) + { + ShowError("Unknown option '{0}'", name); + return false; + } + + return SetOption(field, value); + } + else + { + // Parse a required argument. + if (requiredOptions.Count == 0) + { + ShowError("Too many arguments"); + return false; + } + + FieldInfo field = requiredOptions.Peek(); + + if (!IsList(field)) + { + requiredOptions.Dequeue(); + } + + return SetOption(field, arg); + } + } + + + bool SetOption(FieldInfo field, string value) + { + try + { + if (IsList(field)) + { + // Append this value to a list of options. + GetList(field).Add(ChangeType(value, ListElementType(field))); + } + else + { + // Set the value of a single option. + field.SetValue(optionsObject, ChangeType(value, field.FieldType)); + } + + return true; + } + catch + { + ShowError("Invalid value '{0}' for option '{1}'", value, GetOptionName(field)); + return false; + } + } + + + static object ChangeType(string value, Type type) + { + TypeConverter converter = TypeDescriptor.GetConverter(type); + + return converter.ConvertFromInvariantString(value); + } + + + static bool IsList(FieldInfo field) + { + return typeof(IList).IsAssignableFrom(field.FieldType); + } + + + IList GetList(FieldInfo field) + { + return (IList)field.GetValue(optionsObject); + } + + + static Type ListElementType(FieldInfo field) + { + var interfaces = from i in field.FieldType.GetInterfaces() + where i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>) + select i; + + return interfaces.First().GetGenericArguments()[0]; + } + + + static string GetOptionName(FieldInfo field) + { + var nameAttribute = GetAttribute(field); + + if (nameAttribute != null) + { + return nameAttribute.Name; + } + else + { + return field.Name; + } + } + + + void ShowError(string message, params object[] args) + { + string name = Path.GetFileNameWithoutExtension(Process.GetCurrentProcess().ProcessName); + + Console.Error.WriteLine(message, args); + Console.Error.WriteLine(); + Console.Error.WriteLine("Usage: {0} {1}", name, string.Join(" ", requiredUsageHelp)); + + if (optionalUsageHelp.Count > 0) + { + Console.Error.WriteLine(); + Console.Error.WriteLine("Options:"); + + foreach (string optional in optionalUsageHelp) + { + Console.Error.WriteLine(" {0}", optional); + } + } + } + + + static T GetAttribute(ICustomAttributeProvider provider) where T : Attribute + { + return provider.GetCustomAttributes(typeof(T), false).OfType().FirstOrDefault(); + } + + + // Used on optionsObject fields to indicate which options are required. + [AttributeUsage(AttributeTargets.Field)] + public sealed class RequiredAttribute : Attribute + { + } + + + // Used on an optionsObject field to rename the corresponding commandline option. + [AttributeUsage(AttributeTargets.Field)] + public sealed class NameAttribute : Attribute + { + public NameAttribute(string name) + { + this.Name = name; + } + + public string Name { get; private set; } + } + } +} diff --git a/DirectXTK/MakeSpriteFont/Glyph.cs b/DirectXTK/MakeSpriteFont/Glyph.cs new file mode 100644 index 0000000..82f08ff --- /dev/null +++ b/DirectXTK/MakeSpriteFont/Glyph.cs @@ -0,0 +1,43 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System.Drawing; + +namespace MakeSpriteFont +{ + // Represents a single character within a font. + public class Glyph + { + // Constructor. + public Glyph(char character, Bitmap bitmap, Rectangle? subrect = null) + { + this.Character = character; + this.Bitmap = bitmap; + this.Subrect = subrect.GetValueOrDefault(new Rectangle(0, 0, bitmap.Width, bitmap.Height)); + } + + + // Unicode codepoint. + public char Character; + + + // Glyph image data (may only use a portion of a larger bitmap). + public Bitmap Bitmap; + public Rectangle Subrect; + + + // Layout information. + public float XOffset; + public float YOffset; + + public float XAdvance; + } +} diff --git a/DirectXTK/MakeSpriteFont/GlyphCropper.cs b/DirectXTK/MakeSpriteFont/GlyphCropper.cs new file mode 100644 index 0000000..d427f6a --- /dev/null +++ b/DirectXTK/MakeSpriteFont/GlyphCropper.cs @@ -0,0 +1,54 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System.Drawing; + +namespace MakeSpriteFont +{ + // Crops unused space from around the edge of a glyph bitmap. + public static class GlyphCropper + { + public static void Crop(Glyph glyph) + { + // Crop the top. + while ((glyph.Subrect.Height > 1) && BitmapUtils.IsAlphaEntirely(0, glyph.Bitmap, new Rectangle(glyph.Subrect.X, glyph.Subrect.Y, glyph.Subrect.Width, 1))) + { + glyph.Subrect.Y++; + glyph.Subrect.Height--; + + glyph.YOffset++; + } + + // Crop the bottom. + while ((glyph.Subrect.Height > 1) && BitmapUtils.IsAlphaEntirely(0, glyph.Bitmap, new Rectangle(glyph.Subrect.X, glyph.Subrect.Bottom - 1, glyph.Subrect.Width, 1))) + { + glyph.Subrect.Height--; + } + + // Crop the left. + while ((glyph.Subrect.Width > 1) && BitmapUtils.IsAlphaEntirely(0, glyph.Bitmap, new Rectangle(glyph.Subrect.X, glyph.Subrect.Y, 1, glyph.Subrect.Height))) + { + glyph.Subrect.X++; + glyph.Subrect.Width--; + + glyph.XOffset++; + } + + // Crop the right. + while ((glyph.Subrect.Width > 1) && BitmapUtils.IsAlphaEntirely(0, glyph.Bitmap, new Rectangle(glyph.Subrect.Right - 1, glyph.Subrect.Y, 1, glyph.Subrect.Height))) + { + glyph.Subrect.Width--; + + glyph.XAdvance++; + } + } + } +} diff --git a/DirectXTK/MakeSpriteFont/GlyphPacker.cs b/DirectXTK/MakeSpriteFont/GlyphPacker.cs new file mode 100644 index 0000000..2f7445f --- /dev/null +++ b/DirectXTK/MakeSpriteFont/GlyphPacker.cs @@ -0,0 +1,285 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; + +namespace MakeSpriteFont +{ + // Helper for arranging many small bitmaps onto a single larger surface. + public static class GlyphPacker + { + public static Bitmap ArrangeGlyphsFast(Glyph[] sourceGlyphs) + { + // Build up a list of all the glyphs needing to be arranged. + List glyphs = new List(); + + int largestWidth = 1; + int largestHeight = 1; + + for (int i = 0; i < sourceGlyphs.Length; i++) + { + ArrangedGlyph glyph = new ArrangedGlyph(); + + glyph.Source = sourceGlyphs[i]; + + // Leave a one pixel border around every glyph in the output bitmap. + glyph.Width = sourceGlyphs[i].Subrect.Width + 2; + glyph.Height = sourceGlyphs[i].Subrect.Height + 2; + + if (glyph.Width > largestWidth) + largestWidth = glyph.Width; + + if (glyph.Height > largestHeight) + largestHeight = glyph.Height; + + glyphs.Add(glyph); + } + + // Work out how big the output bitmap should be. + int outputWidth = GuessOutputWidth(sourceGlyphs); + + // Place each glyph in a grid based on the largest glyph size + int curx = 0; + int cury = 0; + + for (int i = 0; i < glyphs.Count; i++) + { + glyphs[i].X = curx; + glyphs[i].Y = cury; + + curx += largestWidth; + + if (curx + largestWidth > outputWidth) + { + curx = 0; + cury += largestHeight; + } + } + + // Create the merged output bitmap. + int outputHeight = MakeValidTextureSize(cury + largestHeight, false); + + return CopyGlyphsToOutput(glyphs, outputWidth, outputHeight); + } + + public static Bitmap ArrangeGlyphs(Glyph[] sourceGlyphs) + { + // Build up a list of all the glyphs needing to be arranged. + List glyphs = new List(); + + for (int i = 0; i < sourceGlyphs.Length; i++) + { + ArrangedGlyph glyph = new ArrangedGlyph(); + + glyph.Source = sourceGlyphs[i]; + + // Leave a one pixel border around every glyph in the output bitmap. + glyph.Width = sourceGlyphs[i].Subrect.Width + 2; + glyph.Height = sourceGlyphs[i].Subrect.Height + 2; + + glyphs.Add(glyph); + } + + // Sort so the largest glyphs get arranged first. + glyphs.Sort(CompareGlyphSizes); + + // Work out how big the output bitmap should be. + int outputWidth = GuessOutputWidth(sourceGlyphs); + int outputHeight = 0; + + // Choose positions for each glyph, one at a time. + for (int i = 0; i < glyphs.Count; i++) + { + if (i > 0 && (i % 500) == 0) + { + Console.Write("."); + } + + PositionGlyph(glyphs, i, outputWidth); + + outputHeight = Math.Max(outputHeight, glyphs[i].Y + glyphs[i].Height); + } + + if (glyphs.Count >= 500) + { + Console.WriteLine(); + } + + // Create the merged output bitmap. + outputHeight = MakeValidTextureSize(outputHeight, false); + + return CopyGlyphsToOutput(glyphs, outputWidth, outputHeight); + } + + + // Once arranging is complete, copies each glyph to its chosen position in the single larger output bitmap. + static Bitmap CopyGlyphsToOutput(List glyphs, int width, int height) + { + Bitmap output = new Bitmap(width, height, PixelFormat.Format32bppArgb); + + int usedPixels = 0; + + foreach (ArrangedGlyph glyph in glyphs) + { + Glyph sourceGlyph = glyph.Source; + Rectangle sourceRegion = sourceGlyph.Subrect; + Rectangle destinationRegion = new Rectangle(glyph.X + 1, glyph.Y + 1, sourceRegion.Width, sourceRegion.Height); + + BitmapUtils.CopyRect(sourceGlyph.Bitmap, sourceRegion, output, destinationRegion); + + BitmapUtils.PadBorderPixels(output, destinationRegion); + + sourceGlyph.Bitmap = output; + sourceGlyph.Subrect = destinationRegion; + + usedPixels += (glyph.Width * glyph.Height); + } + + float utilization = ( (float)usedPixels / (float)(width * height) ) * 100; + + Console.WriteLine("Packing efficiency {0}%", utilization ); + + return output; + } + + + // Internal helper class keeps track of a glyph while it is being arranged. + class ArrangedGlyph + { + public Glyph Source; + + public int X; + public int Y; + + public int Width; + public int Height; + } + + + // Works out where to position a single glyph. + static void PositionGlyph(List glyphs, int index, int outputWidth) + { + int x = 0; + int y = 0; + + while (true) + { + // Is this position free for us to use? + int intersects = FindIntersectingGlyph(glyphs, index, x, y); + + if (intersects < 0) + { + glyphs[index].X = x; + glyphs[index].Y = y; + + return; + } + + // Skip past the existing glyph that we collided with. + x = glyphs[intersects].X + glyphs[intersects].Width; + + // If we ran out of room to move to the right, try the next line down instead. + if (x + glyphs[index].Width > outputWidth) + { + x = 0; + y++; + } + } + } + + + // Checks if a proposed glyph position collides with anything that we already arranged. + static int FindIntersectingGlyph(List glyphs, int index, int x, int y) + { + int w = glyphs[index].Width; + int h = glyphs[index].Height; + + for (int i = 0; i < index; i++) + { + if (glyphs[i].X >= x + w) + continue; + + if (glyphs[i].X + glyphs[i].Width <= x) + continue; + + if (glyphs[i].Y >= y + h) + continue; + + if (glyphs[i].Y + glyphs[i].Height <= y) + continue; + + return i; + } + + return -1; + } + + + // Comparison function for sorting glyphs by size. + static int CompareGlyphSizes(ArrangedGlyph a, ArrangedGlyph b) + { + const int heightWeight = 1024; + + int aSize = a.Height * heightWeight + a.Width; + int bSize = b.Height * heightWeight + b.Width; + + if (aSize != bSize) + return bSize.CompareTo(aSize); + else + return a.Source.Character.CompareTo(b.Source.Character); + } + + + // Heuristic guesses what might be a good output width for a list of glyphs. + static int GuessOutputWidth(Glyph[] sourceGlyphs) + { + int maxWidth = 0; + int totalSize = 0; + + foreach (Glyph glyph in sourceGlyphs) + { + maxWidth = Math.Max(maxWidth, glyph.Subrect.Width); + totalSize += glyph.Subrect.Width * glyph.Subrect.Height; + } + + int width = Math.Max((int)Math.Sqrt(totalSize), maxWidth); + + return MakeValidTextureSize(width, true); + } + + + // Rounds a value up to the next larger valid texture size. + static int MakeValidTextureSize(int value, bool requirePowerOfTwo) + { + // In case we want to DXT compress, make sure the size is a multiple of 4. + const int blockSize = 4; + + if (requirePowerOfTwo) + { + // Round up to a power of two. + int powerOfTwo = blockSize; + + while (powerOfTwo < value) + powerOfTwo <<= 1; + + return powerOfTwo; + } + else + { + // Round up to the specified block size. + return (value + blockSize - 1) & ~(blockSize - 1); + } + } + } +} diff --git a/DirectXTK/MakeSpriteFont/IFontImporter.cs b/DirectXTK/MakeSpriteFont/IFontImporter.cs new file mode 100644 index 0000000..deb5af9 --- /dev/null +++ b/DirectXTK/MakeSpriteFont/IFontImporter.cs @@ -0,0 +1,25 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System.Collections.Generic; + +namespace MakeSpriteFont +{ + // Importer interface allows the conversion tool to support multiple source font formats. + public interface IFontImporter + { + void Import(CommandLineOptions options); + + IEnumerable Glyphs { get; } + + float LineSpacing { get; } + } +} diff --git a/DirectXTK/MakeSpriteFont/MakeSpriteFont.csproj b/DirectXTK/MakeSpriteFont/MakeSpriteFont.csproj new file mode 100644 index 0000000..c35145f --- /dev/null +++ b/DirectXTK/MakeSpriteFont/MakeSpriteFont.csproj @@ -0,0 +1,60 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {7329B02D-C504-482A-A156-181D48CE493C} + Exe + Properties + MakeSpriteFont + MakeSpriteFont + v4.0 + Client + 512 + + + true + bin\Debug\ + DEBUG;TRACE + full + AnyCPU + prompt + + + bin\Release\ + TRACE + true + pdbonly + AnyCPU + prompt + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DirectXTK/MakeSpriteFont/Program.cs b/DirectXTK/MakeSpriteFont/Program.cs new file mode 100644 index 0000000..f8eb765 --- /dev/null +++ b/DirectXTK/MakeSpriteFont/Program.cs @@ -0,0 +1,187 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System; +using System.IO; +using System.Linq; +using System.Drawing; + +namespace MakeSpriteFont +{ + public class Program + { + public static int Main(string[] args) + { + // Parse the commandline options. + var options = new CommandLineOptions(); + var parser = new CommandLineParser(options); + + if (!parser.ParseCommandLine(args)) + return 1; + + try + { + // Convert the font. + MakeSpriteFont(options); + + return 0; + } + catch (Exception e) + { + // Print an error message if conversion failed. + Console.WriteLine(); + Console.Error.WriteLine("Error: {0}", e.Message); + + return 1; + } + } + + + static void MakeSpriteFont(CommandLineOptions options) + { + // Import. + Console.WriteLine("Importing {0}", options.SourceFont); + + float lineSpacing; + + Glyph[] glyphs = ImportFont(options, out lineSpacing); + + Console.WriteLine("Captured {0} glyphs", glyphs.Length); + + // Optimize. + Console.WriteLine("Cropping glyph borders"); + + foreach (Glyph glyph in glyphs) + { + GlyphCropper.Crop(glyph); + } + + Console.WriteLine("Packing glyphs into sprite sheet"); + + Bitmap bitmap; + + if (options.FastPack) + { + bitmap = GlyphPacker.ArrangeGlyphsFast(glyphs); + } + else + { + bitmap = GlyphPacker.ArrangeGlyphs(glyphs); + } + + // Emit texture size warning based on known Feature Level limits. + if (bitmap.Width > 16384 || bitmap.Height > 16384) + { + Console.WriteLine("WARNING: Resulting texture is too large for all known Feature Levels (9.1 - 12.1)"); + } + else if (bitmap.Width > 8192 || bitmap.Height > 8192) + { + if (options.FeatureLevel < FeatureLevel.FL11_0) + { + Console.WriteLine("WARNING: Resulting texture requires a Feature Level 11.0 or later device."); + } + } + else if (bitmap.Width > 4096 || bitmap.Height > 4096) + { + if (options.FeatureLevel < FeatureLevel.FL10_0) + { + Console.WriteLine("WARNING: Resulting texture requires a Feature Level 10.0 or later device."); + } + } + else if (bitmap.Width > 2048 || bitmap.Height > 2048) + { + if (options.FeatureLevel < FeatureLevel.FL9_3) + { + Console.WriteLine("WARNING: Resulting texture requires a Feature Level 9.3 or later device."); + } + } + + // Adjust line and character spacing. + lineSpacing += options.LineSpacing; + + foreach (Glyph glyph in glyphs) + { + glyph.XAdvance += options.CharacterSpacing; + } + + // Automatically detect whether this is a monochromatic or color font? + if (options.TextureFormat == TextureFormat.Auto) + { + bool isMono = BitmapUtils.IsRgbEntirely(Color.White, bitmap); + + options.TextureFormat = isMono ? TextureFormat.CompressedMono : + TextureFormat.Rgba32; + } + + // Convert to premultiplied alpha format. + if (!options.NoPremultiply) + { + Console.WriteLine("Premultiplying alpha"); + + BitmapUtils.PremultiplyAlpha(bitmap); + } + + // Save output files. + if (!string.IsNullOrEmpty(options.DebugOutputSpriteSheet)) + { + Console.WriteLine("Saving debug output spritesheet {0}", options.DebugOutputSpriteSheet); + + bitmap.Save(options.DebugOutputSpriteSheet); + } + + Console.WriteLine("Writing {0} ({1} format)", options.OutputFile, options.TextureFormat); + + SpriteFontWriter.WriteSpriteFont(options, glyphs, lineSpacing, bitmap); + } + + + static Glyph[] ImportFont(CommandLineOptions options, out float lineSpacing) + { + // Which importer knows how to read this source font? + IFontImporter importer; + + string fileExtension = Path.GetExtension(options.SourceFont).ToLowerInvariant(); + + string[] BitmapFileExtensions = { ".bmp", ".png", ".gif" }; + + if (BitmapFileExtensions.Contains(fileExtension)) + { + importer = new BitmapImporter(); + } + else + { + importer = new TrueTypeImporter(); + } + + // Import the source font data. + importer.Import(options); + + lineSpacing = importer.LineSpacing; + + var glyphs = importer.Glyphs + .OrderBy(glyph => glyph.Character) + .ToArray(); + + // Validate. + if (glyphs.Length == 0) + { + throw new Exception("Font does not contain any glyphs."); + } + + if ((options.DefaultCharacter != 0) && !glyphs.Any(glyph => glyph.Character == options.DefaultCharacter)) + { + throw new Exception("The specified DefaultCharacter is not part of this font."); + } + + return glyphs; + } + } +} diff --git a/DirectXTK/MakeSpriteFont/Properties/AssemblyInfo.cs b/DirectXTK/MakeSpriteFont/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0128d84 --- /dev/null +++ b/DirectXTK/MakeSpriteFont/Properties/AssemblyInfo.cs @@ -0,0 +1,45 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MakeSpriteFont")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft Corporation")] +[assembly: AssemblyProduct("MakeSpriteFont")] +[assembly: AssemblyCopyright("Copyright (c) Microsoft Corporation. All rights reserved")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("12c0da00-f622-41f2-ab8f-1b4e19aa2a6f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/DirectXTK/MakeSpriteFont/SpriteFontWriter.cs b/DirectXTK/MakeSpriteFont/SpriteFontWriter.cs new file mode 100644 index 0000000..59c907a --- /dev/null +++ b/DirectXTK/MakeSpriteFont/SpriteFontWriter.cs @@ -0,0 +1,272 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System; +using System.IO; +using System.Drawing; +using System.Drawing.Imaging; + +namespace MakeSpriteFont +{ + // Writes the output spritefont binary file. + public static class SpriteFontWriter + { + const string spriteFontMagic = "DXTKfont"; + + const int DXGI_FORMAT_R8G8B8A8_UNORM = 28; + const int DXGI_FORMAT_B4G4R4A4_UNORM = 115; + const int DXGI_FORMAT_BC2_UNORM = 74; + + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")] + public static void WriteSpriteFont(CommandLineOptions options, Glyph[] glyphs, float lineSpacing, Bitmap bitmap) + { + using (FileStream file = File.OpenWrite(options.OutputFile)) + using (BinaryWriter writer = new BinaryWriter(file)) + { + WriteMagic(writer); + WriteGlyphs(writer, glyphs); + + writer.Write(lineSpacing); + writer.Write(options.DefaultCharacter); + + WriteBitmap(writer, options, bitmap); + } + } + + + static void WriteMagic(BinaryWriter writer) + { + foreach (char magic in spriteFontMagic) + { + writer.Write((byte)magic); + } + } + + + static void WriteGlyphs(BinaryWriter writer, Glyph[] glyphs) + { + writer.Write(glyphs.Length); + + foreach (Glyph glyph in glyphs) + { + writer.Write((int)glyph.Character); + + writer.Write(glyph.Subrect.Left); + writer.Write(glyph.Subrect.Top); + writer.Write(glyph.Subrect.Right); + writer.Write(glyph.Subrect.Bottom); + + writer.Write(glyph.XOffset); + writer.Write(glyph.YOffset); + writer.Write(glyph.XAdvance); + } + } + + + static void WriteBitmap(BinaryWriter writer, CommandLineOptions options, Bitmap bitmap) + { + writer.Write(bitmap.Width); + writer.Write(bitmap.Height); + + switch (options.TextureFormat) + { + case TextureFormat.Rgba32: + WriteRgba32(writer, bitmap); + break; + + case TextureFormat.Bgra4444: + WriteBgra4444(writer, bitmap); + break; + + case TextureFormat.CompressedMono: + WriteCompressedMono(writer, bitmap, options); + break; + + default: + throw new NotSupportedException(); + } + } + + + // Writes an uncompressed 32 bit font texture. + static void WriteRgba32(BinaryWriter writer, Bitmap bitmap) + { + writer.Write(DXGI_FORMAT_R8G8B8A8_UNORM); + + writer.Write(bitmap.Width * 4); + writer.Write(bitmap.Height); + + using (var bitmapData = new BitmapUtils.PixelAccessor(bitmap, ImageLockMode.ReadOnly)) + { + for (int y = 0; y < bitmap.Height; y++) + { + for (int x = 0; x < bitmap.Width; x++) + { + Color color = bitmapData[x, y]; + + writer.Write(color.R); + writer.Write(color.G); + writer.Write(color.B); + writer.Write(color.A); + } + } + } + } + + + // Writes a 16 bit font texture. + static void WriteBgra4444(BinaryWriter writer, Bitmap bitmap) + { + writer.Write(DXGI_FORMAT_B4G4R4A4_UNORM); + + writer.Write(bitmap.Width * sizeof(ushort)); + writer.Write(bitmap.Height); + + using (var bitmapData = new BitmapUtils.PixelAccessor(bitmap, ImageLockMode.ReadOnly)) + { + for (int y = 0; y < bitmap.Height; y++) + { + for (int x = 0; x < bitmap.Width; x++) + { + Color color = bitmapData[x, y]; + + int r = color.R >> 4; + int g = color.G >> 4; + int b = color.B >> 4; + int a = color.A >> 4; + + int packed = b | (g << 4) | (r << 8) | (a << 12); + + writer.Write((ushort)packed); + } + } + } + } + + + // Writes a block compressed monochromatic font texture. + static void WriteCompressedMono(BinaryWriter writer, Bitmap bitmap, CommandLineOptions options) + { + if ((bitmap.Width & 3) != 0 || + (bitmap.Height & 3) != 0) + { + throw new ArgumentException("Block compression requires texture size to be a multiple of 4."); + } + + writer.Write(DXGI_FORMAT_BC2_UNORM); + + writer.Write(bitmap.Width * 4); + writer.Write(bitmap.Height / 4); + + using (var bitmapData = new BitmapUtils.PixelAccessor(bitmap, ImageLockMode.ReadOnly)) + { + for (int y = 0; y < bitmap.Height; y += 4) + { + for (int x = 0; x < bitmap.Width; x += 4) + { + CompressBlock(writer, bitmapData, x, y, options); + } + } + } + } + + + // We want to compress our font textures, because, like, smaller is better, + // right? But a standard DXT compressor doesn't do a great job with fonts that + // are in premultiplied alpha format. Our font data is greyscale, so all of the + // RGBA channels have the same value. If one channel is compressed differently + // to another, this causes an ugly variation in brightness of the rendered text. + // Also, fonts are mostly either black or white, with grey values only used for + // antialiasing along their edges. It is very important that the black and white + // areas be accurately represented, while the precise value of grey is less + // important. + // + // Trouble is, your average DXT compressor knows nothing about these + // requirements. It will optimize to minimize a generic error metric such as + // RMS, but this will often sacrifice crisp black and white in exchange for + // needless accuracy of the antialiasing pixels, or encode RGB differently to + // alpha. UGLY! + // + // Fortunately, encoding monochrome fonts turns out to be trivial. Using DXT3, + // we can fix the end colors as black and white, which gives guaranteed exact + // encoding of the font inside and outside, plus two fractional values for edge + // antialiasing. Also, these RGB values (0, 1/3, 2/3, 1) map exactly to four of + // the possible 16 alpha values available in DXT3, so we can ensure the RGB and + // alpha channels always exactly match. + + static void CompressBlock(BinaryWriter writer, BitmapUtils.PixelAccessor bitmapData, int blockX, int blockY, CommandLineOptions options) + { + long alphaBits = 0; + int rgbBits = 0; + + int pixelCount = 0; + + for (int y = 0; y < 4; y++) + { + for (int x = 0; x < 4; x++) + { + long alpha; + int rgb; + + int value = bitmapData[blockX + x, blockY + y].A; + + if (options.NoPremultiply) + { + // If we are not premultiplied, RGB is always white and we have 4 bit alpha. + alpha = value >> 4; + rgb = 0; + } + else + { + // For premultiplied encoding, quantize the source value to 2 bit precision. + if (value < 256 / 6) + { + alpha = 0; + rgb = 1; + } + else if (value < 256 / 2) + { + alpha = 5; + rgb = 3; + } + else if (value < 256 * 5 / 6) + { + alpha = 10; + rgb = 2; + } + else + { + alpha = 15; + rgb = 0; + } + } + + // Add this pixel to the alpha and RGB bit masks. + alphaBits |= alpha << (pixelCount * 4); + rgbBits |= rgb << (pixelCount * 2); + + pixelCount++; + } + } + + // Output the alpha bit mask. + writer.Write(alphaBits); + + // Output the two endpoint colors (black and white in 5.6.5 format). + writer.Write((ushort)0xFFFF); + writer.Write((ushort)0); + + // Output the RGB bit mask. + writer.Write(rgbBits); + } + } +} diff --git a/DirectXTK/MakeSpriteFont/TrueTypeImporter.cs b/DirectXTK/MakeSpriteFont/TrueTypeImporter.cs new file mode 100644 index 0000000..6718cb4 --- /dev/null +++ b/DirectXTK/MakeSpriteFont/TrueTypeImporter.cs @@ -0,0 +1,252 @@ +// DirectXTK MakeSpriteFont tool +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Drawing.Text; +using System.Runtime.InteropServices; + +namespace MakeSpriteFont +{ + // Uses System.Drawing (aka GDI+) to rasterize TrueType fonts into a series of glyph bitmaps. + public class TrueTypeImporter : IFontImporter + { + // Properties hold the imported font data. + public IEnumerable Glyphs { get; private set; } + + public float LineSpacing { get; private set; } + + + // Size of the temp surface used for GDI+ rasterization. + const int MaxGlyphSize = 1024; + + + public void Import(CommandLineOptions options) + { + // Create a bunch of GDI+ objects. + using (Font font = CreateFont(options)) + using (Brush brush = new SolidBrush(Color.White)) + using (StringFormat stringFormat = new StringFormat(StringFormatFlags.NoFontFallback)) + using (Bitmap bitmap = new Bitmap(MaxGlyphSize, MaxGlyphSize, PixelFormat.Format32bppArgb)) + using (Graphics graphics = Graphics.FromImage(bitmap)) + { + graphics.PixelOffsetMode = options.Sharp ? PixelOffsetMode.None : PixelOffsetMode.HighQuality; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; + + // Which characters do we want to include? + var characters = CharacterRegion.Flatten(options.CharacterRegions); + + var glyphList = new List(); + + // Rasterize each character in turn. + int count = 0; + + foreach (char character in characters) + { + ++count; + + if (count == 500) + { + if (!options.FastPack) + { + Console.WriteLine("WARNING: capturing a large font. This may take a long time to complete and could result in too large a texture. Consider using /FastPack."); + } + Console.Write("."); + } + else if ((count % 500) == 0) + { + Console.Write("."); + } + + Glyph glyph = ImportGlyph(character, font, brush, stringFormat, bitmap, graphics); + + glyphList.Add(glyph); + } + + if (count > 500) + { + Console.WriteLine(); + } + + Glyphs = glyphList; + + // Store the font height. + LineSpacing = font.GetHeight(); + } + } + + + // Attempts to instantiate the requested GDI+ font object. + static Font CreateFont(CommandLineOptions options) + { + Font font = new Font(options.SourceFont, PointsToPixels(options.FontSize), options.FontStyle, GraphicsUnit.Pixel); + + try + { + // The font constructor automatically substitutes fonts if it can't find the one requested. + // But we prefer the caller to know if anything is wrong with their data. A simple string compare + // isn't sufficient because some fonts (eg. MS Mincho) change names depending on the locale. + + // Early out: in most cases the name will match the current or invariant culture. + if (options.SourceFont.Equals(font.FontFamily.GetName(CultureInfo.CurrentCulture.LCID), StringComparison.OrdinalIgnoreCase) || + options.SourceFont.Equals(font.FontFamily.GetName(CultureInfo.InvariantCulture.LCID), StringComparison.OrdinalIgnoreCase)) + { + return font; + } + + // Check the font name in every culture. + foreach (CultureInfo culture in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) + { + if (options.SourceFont.Equals(font.FontFamily.GetName(culture.LCID), StringComparison.OrdinalIgnoreCase)) + { + return font; + } + } + + // A font substitution must have occurred. + throw new Exception(string.Format("Can't find font '{0}'.", options.SourceFont)); + } + catch + { + font.Dispose(); + throw; + } + } + + + // Converts a font size from points to pixels. Can't just let GDI+ do this for us, + // because we want identical results on every machine regardless of system DPI settings. + static float PointsToPixels(float points) + { + return points * 96 / 72; + } + + + // Rasterizes a single character glyph. + static Glyph ImportGlyph(char character, Font font, Brush brush, StringFormat stringFormat, Bitmap bitmap, Graphics graphics) + { + string characterString = character.ToString(); + + // Measure the size of this character. + SizeF size = graphics.MeasureString(characterString, font, Point.Empty, stringFormat); + + int characterWidth = (int)Math.Ceiling(size.Width); + int characterHeight = (int)Math.Ceiling(size.Height); + + // Pad to make sure we capture any overhangs (negative ABC spacing, etc.) + int padWidth = characterWidth; + int padHeight = characterHeight / 2; + + int bitmapWidth = characterWidth + padWidth * 2; + int bitmapHeight = characterHeight + padHeight * 2; + + if (bitmapWidth > MaxGlyphSize || bitmapHeight > MaxGlyphSize) + throw new Exception("Excessively large glyph won't fit in my lazily implemented fixed size temp surface."); + + // Render the character. + graphics.Clear(Color.Black); + graphics.DrawString(characterString, font, brush, padWidth, padHeight, stringFormat); + graphics.Flush(); + + // Clone the newly rendered image. + Bitmap glyphBitmap = bitmap.Clone(new Rectangle(0, 0, bitmapWidth, bitmapHeight), PixelFormat.Format32bppArgb); + + BitmapUtils.ConvertGreyToAlpha(glyphBitmap); + + // Query its ABC spacing. + float? abc = GetCharacterWidth(character, font, graphics); + + // Construct the output Glyph object. + return new Glyph(character, glyphBitmap) + { + XOffset = -padWidth, + XAdvance = abc.HasValue ? padWidth - bitmapWidth + abc.Value : -padWidth, + YOffset = -padHeight, + }; + } + + + // Queries APC spacing for the specified character. + static float? GetCharacterWidth(char character, Font font, Graphics graphics) + { + // Look up the native device context and font handles. + IntPtr hdc = graphics.GetHdc(); + + try + { + IntPtr hFont = font.ToHfont(); + + try + { + // Select our font into the DC. + IntPtr oldFont = NativeMethods.SelectObject(hdc, hFont); + + try + { + // Query the character spacing. + var result = new NativeMethods.ABCFloat[1]; + + if (NativeMethods.GetCharABCWidthsFloat(hdc, character, character, result)) + { + return result[0].A + + result[0].B + + result[0].C; + } + else + { + return null; + } + } + finally + { + NativeMethods.SelectObject(hdc, oldFont); + } + } + finally + { + NativeMethods.DeleteObject(hFont); + } + } + finally + { + graphics.ReleaseHdc(hdc); + } + } + + + // Interop to the native GDI GetCharABCWidthsFloat method. + static class NativeMethods + { + [DllImport("gdi32.dll")] + public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject); + + [DllImport("gdi32.dll")] + public static extern bool DeleteObject(IntPtr hObject); + + [DllImport("gdi32.dll", CharSet = CharSet.Unicode)] + public static extern bool GetCharABCWidthsFloat(IntPtr hdc, uint iFirstChar, uint iLastChar, [Out] ABCFloat[] lpABCF); + + + [StructLayout(LayoutKind.Sequential)] + public struct ABCFloat + { + public float A; + public float B; + public float C; + } + } + } +} diff --git a/DirectXTK/Readme.txt b/DirectXTK/Readme.txt new file mode 100644 index 0000000..6c10856 --- /dev/null +++ b/DirectXTK/Readme.txt @@ -0,0 +1,385 @@ +----------------------------------------------- +DirectXTK - the DirectX Tool Kit for DirectX 11 +----------------------------------------------- + +Copyright (c) Microsoft Corporation. All rights reserved. + +September 22, 2017 + +This package contains the "DirectX Tool Kit", a collection of helper classes for +writing Direct3D 11 C++ code for Universal Windows Platform (UWP) apps for Windows 10, +Windows Store apps, Windows phone 8.1 applications, Xbox One exclusive apps, +Windows 8.x Win32 desktop applications, Windows 7 Service Pack 1 applications, and +Windows Vista Service Pack 2 Direct3D 11.0 applications. + +This code is designed to build with Visual Studio 2013 Update 5, Visual Studio 2015 Update 3, +or Visual Studio 2017. It is recommended that you make use of VS 2015 Update 3, Windows Tools +1.4.1, and the Windows 10 Anniversary Update SDK (14393) or VS 2017 with the Windows 10 +Creators Update SDK (15063). + +These components are designed to work without requiring any content from the DirectX SDK. For details, +see "Where is the DirectX SDK?" . + +Inc\ + Public Header Files (in the DirectX C++ namespace): + + Audio.h - low-level audio API using XAudio2 (DirectXTK for Audio public header) + CommonStates.h - factory providing commonly used D3D state objects + DDSTextureLoader.h - light-weight DDS file texture loader + DirectXHelpers.h - misc C++ helpers for D3D programming + Effects.h - set of built-in shaders for common rendering tasks + GamePad.h - gamepad controller helper using XInput + GeometricPrimitive.h - draws basic shapes such as cubes and spheres + GraphicsMemory.h - helper for managing dynamic graphics memory allocation + Keyboard.h - keyboard state tracking helper + Model.h - draws meshes loaded from .CMO, .SDKMESH, or .VBO files + Mouse.h - mouse helper + PostProcess.h - set of built-in shaders for common post-processing operations + PrimitiveBatch.h - simple and efficient way to draw user primitives + ScreenGrab.h - light-weight screen shot saver + SimpleMath.h - simplified C++ wrapper for DirectXMath + SpriteBatch.h - simple & efficient 2D sprite rendering + SpriteFont.h - bitmap based text rendering + VertexTypes.h - structures for commonly used vertex data formats + WICTextureLoader.h - WIC-based image file texture loader + XboxDDSTextureLoader.h - Xbox One exclusive apps variant of DDSTextureLoader + +Src\ + DirectXTK source files and internal implementation headers + +Audio\ + DirectXTK for Audio source files and internal implementation headers + +MakeSpriteFont\ + Command line tool used to generate binary resources for use with SpriteFont + +XWBTool\ + Command line tool for building XACT-style wave banks for use with DirectXTK for Audio's WaveBank class + +All content and source code for this package are subject to the terms of the MIT License. +. + +Documentation is available at . + +For the latest version of DirectX Tool Kit, bug reports, etc. please visit the project site. + +http://go.microsoft.com/fwlink/?LinkId=248929 + +Note: Xbox One exclusive apps developers using the Xbox One XDK need to generate the + Src\Shaders\Compiled\XboxOne*.inc files to build the library as they are not + included in the distribution package. They are built by running the script + in Src\Shaders - "CompileShaders xbox", and should be generated with the matching + FXC compiler from the Xbox One XDK. While they will continue to work if outdated, + a mismatch will cause runtime compilation overhead that would otherwise be avoided. + +This project has adopted the Microsoft Open Source Code of Conduct. For more information see the +Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments. + +https://opensource.microsoft.com/codeofconduct/ + + +--------------- +RELEASE HISTORY +--------------- + +September 22, 2017 + Updated for VS 2017 15.3 update /permissive- changes + ScreenGrab updated to use non-sRGB metadata for PNG + Mouse use of WM_INPUT updated for Remote Desktop scenarios + Fix for CMO load issue when no materials are defined + xwbtool: added -flist option + +July 28, 2017 + Fix for WIC writer when codec target format requires a palette + Code cleanup + +June 21, 2017 + Post-processing support + SDKMESH loader fix when loading legacy files with all zero materials + DirectXTK for Audio: Minor fixes for environmental audio + Minor code cleanup + +April 24, 2017 + VS 2017 project updates + Regenerated shaders using Windows 10 Creators Update SDK (15063) + Fixed NormalMapEffect shader selection for specular texture usage + Fixed AudioEngine enumeration when using Single Threaded Apartment (STA) + Fixed bug with GamePad (Windows.Gaming.Input) when no user bound + +April 7, 2017 + VS 2017 updated for Windows Creators Update SDK (15063) + XboxDDSTextureLoader updates + +February 10, 2017 + GamePad now supports special value of -1 for 'most recently connected controller' + WIC format 40bppCMYKAlpha should be converted to RGBA8 rather than RGBA16 + DDS support for L8A8 with bitcount 8 rather than 16 + Minor code cleanup + +December 5, 2016 + Mouse and Keyboard classes updated with IsConnected method + Windows10 project /ZW switch removed to support use in C++/WinRT projection apps + VS 2017 RC projects added + Minor code cleanup + +October 6, 2016 + SDKMESH loader and BasicEffects support for compressed vertex normals with biasing + WICTextureLoader Ex bool forceSRGB parameter is now a WIC_LOADER flag + Minor code cleanup + +September 15, 2016 + Minor code cleanup + xwbtool: added wildcard support for input filename and optional -r switch for recursive search + +September 1, 2016 + Added forceSRGB optional parameter to SpriteFont ctor + EffectFactory method EnableForceSRGB added + DGSLEffect now defaults to diffuse/alpha of 1 + Removed problematic ABI::Windows::Foundation::Rect interop for SimpleMath + Minor code cleanup + +August 4, 2016 + Regenerated shaders using Windows 10 Anniversary Update SDK (14393) + +August 2, 2016 + Updated for VS 2015 Update 3 and Windows 10 SDK (14393) + +August 1, 2016 + GamePad capabilities information updated for Universal Windows and Xbox One platforms + Specular falloff lighting computation fix in shaders + +July 18, 2016 + NormalMapEffect for normal-map with optional specular map rendering + EnvironmentMapEffect now supports per-pixel lighting + Effects updated with SetMatrices and SetColorAndAlpha methods + SimpleMath: improved interop with DirectXMath constants + Minor code cleanup + +June 30, 2016 + MeasureDrawString added to SpriteFont; bad fix to MeasureString reverted + GamePad tracker updated to track emulated buttons (i.e. leftStickUp) + EffectFactory SetDirectory now checks current working directory (CWD) as well + *breaking change* must include before including + Code refactor for sharing some files with DirectX 12 version + Minor code cleanup + +May 31, 2016 + Added VertexPosition and VertexPositionDualTexture to VertexTypes + Xbox One platform fix for PrimitiveBatch + CompileShader script updated to build external pdbs + Code cleanup + +April 26, 2016 + Added Rectangle class to SimpleMath + Fix for SDKMESH loader when loading models with 'extra' texture coordinate sets + Made SimpleMath's Viewport ComputeTitleSafeArea less conservative + Added view/menu alises to GamePad::ButtonStateTracker for Xbox One Controller naming + Retired Windows phone 8.0 projects and obsolete adapter code + Minor code and project file cleanup + +February 23, 2016 + Fixed width computation bug in SpriteFont::MeasureString + Fix to clean up partial or zero-length image files on failed write + Fix to WaveBankReader for UWP platform + Retired VS 2012 projects + Xbox One platform updates + Minor code and project file cleanup + +January 5, 2016 + Xbox One platform updates + *breaking change* Need to add use of GraphicsMemory class to Xbox One titles + Minor code cleanup + +November 30, 2015 + SimpleMath improvements including Viewport class + Fixed bug with Keyboard for OpenBracket and later VK codes + Fixed bug with Mouse that reset the scrollwheel on app activate + MakeSpriteFont updated with /FastPack and /FeatureLevel switches + Updated for VS 2015 Update 1 and Windows 10 SDK (10586) + +October 30, 2015 + DirectXTK for Audio 3D updates + *breaking change* emitters/listeners now use RH coordinates by default + GeometricPrimitive support for custom geometry + SimpleMath Matrix class improvements + DDS support for legacy bumpmap formats (V8U8, Q8W8V8U8, V16U16) + Mouse fix for WinRT implementation with multiple buttons pressed + Wireframe CommonStates no longer does backface culling + Xbox One platform updates + Minor code cleanup + +August 18, 2015 + Xbox One platform updates + +July 29, 2015 + - Added CreateBox method to GeometricPrimitive + - Added 'invertn' optional parameter to CreateSphere + - Updates for Keyboard, Mouse class + - Fixed bug when loading older SDKMESH models + - Updated for VS 2015 and Windows 10 SDK RTM + - Retired VS 2010 and Windows Store 8.0 projects + +July 1, 2015 + - Added Keyboard, Mouse class + - Support for loading pre-lit models with SDKMESH + - GamePad implemented using Windows.Gaming.Input for Windows 10 + - DirectXTK for Audio updates for xWMA support with XAudio 2.9 + - Added FindGlyph and GetSpriteSheet methods to SpriteFont + +March 27, 2015 + Added projects for Windows apps Technical Preview + - GamePad temporarily uses 'null' device for universal Windows applicaton platform + +February 25, 2015 + DirectXTK for Audio updates + - *breaking change* pitch now defined as -1 to 1 with 0 as the default + - One-shot Play method with volume, pitch, and pan + - GetMasterVolume/SetMasterVolume method for AudioEngine + - Fix for compact wavebank validation + - Improved voice cleanup and shutdown + Minor code cleanup and C++11 =default/=delete usage + +January 26, 2015 + GamePad class: emulate XInputEnable behavior for XInput 9.1.0 + DirectXTK for Audio fix for Stop followed by Play doing a proper restart + DirectXTK for Audio fix when using XAudio 2.7 on a system with no audio device + Updates for Xbox One platform support + Minor code cleanup and C99 printf string conformance + +November 24, 2014 + SimpleMath fix for Matrix operator != + DirectXTK for Audio workaround for XAudio 2.7 on Windows 7 problem + Updates for Windows phone 8.1 platform support + Updates for Visual Studio 2015 Technical Preview + Minor code cleanup + +October 28, 2014 + Model support for loading from VBO files + Model render now sets samplers on slots 0,1 by default for dual-texture effects + Updates for Xbox One platform support + Minor code cleanup + +September 5, 2014 + GamePad class: gamepad controller helper using XInput on Windows, IGamepad for Xbox One + SimpleMath updates; Matrix billboard methods; *breaking change*: Matrix::Identity() -> Matrix::Identity + SpriteBatch new optional SetViewport method + SpriteFont fix for white-space character rendering optimization + DDSTextureLoader fix for auto-gen mipmaps for volume textures + Explicit calling-convention annotation for public headers + Updates for Xbox One platform support + Minor code and project cleanup + +July 15, 2014 + DirectXTK for Audio and XWBTool fixes + Updates to Xbox One platform support + +April 3, 2014 + Windows phone 8.1 platform support + +February 24, 2014 + DirectXHelper: new utility header with MapGuard and public version of SetDebugObjectName template + DDSTextureLoader: Optional support for auto-gen mipmaps + DDSTextureLoader/ScreenGrab: support for Direct3D 11 video formats including legacy "YUY2" DDS files + GeometricPrimtive: Handedness fix for tetrahedron, octahedron, dodecahedron, and icosahedron + SpriteBatch::SetRotation(DXGI_MODE_ROTATION_UNSPECIFIED) to disable viewport matrix + XboxDDSTextureLoader: optional forceSRGB parameter + +January 24, 2014 + DirectXTK for Audio updated with voice management and optional mastering volume limiter + Added orientation rotation support to SpriteBatch + Fixed a resource leak with GetDefaultTexture() used by some Effects + Code cleanup (removed DXGI_1_2_FORMATS control define; d2d1.h workaround not needed; ScopedObject typedef removed) + +December 24, 2013 + DirectXTK for Audio + Xbox One platform support + MakeSpriteFont tool updated with more progress feedback when capturing large fonts + Minor updates for .SDKMESH Model loader + Fixed bug in .CMO Model loader when handling multiple textures + Improved debugging output + +October 28, 2013 + Updated for Visual Studio 2013 and Windows 8.1 SDK RTM + Added DGSLEffect, DGSLEffectFactory, VertexPositionNormalTangentColorTexture, and VertexPositionNormalTangentColorTextureSkinning + Model loading and effect factories support loading skinned models + MakeSpriteFont now has a smooth vs. sharp antialiasing option: /sharp + Model loading from CMOs now handles UV transforms for texture coordinates + A number of small fixes for EffectFactory + Minor code and project cleanup + Added NO_D3D11_DEBUG_NAME compilation define to control population of Direct3D debug layer names for debug builds + +July 1, 2013 + VS 2013 Preview projects added and updates for DirectXMath 3.05 __vectorcall + Added use of sRGB WIC metadata for JPEG, PNG, and TIFF + SaveToWIC functions updated with new optional setCustomProps parameter and error check with optional targetFormat + +May 30, 2013 + Added more GeometricPrimitives: Cone, Tetrahedron, Octahedron, Dodecahedron, Icosahedron + Updated to support loading new metadata from DDS files (if present) + Fixed bug with loading of WIC 32bpp RGBE format images + Fixed bug when skipping mipmaps in a 1D or 2D array texture DDS file + +February 22, 2013 + Added SimpleMath header + Fixed bug that prevented properly overriding EffectFactory::CreateTexture + Fixed forceSRGB logic in DDSTextureLoader and WICTextureLoader + Break circular reference chains when using SpriteBatch with a setCustomShaders lambda + Updated projects with /fp:fast for all configs, /arch:SSE2 for Win32 configs + Sensibly named .pdb output files + Added WIC_USE_FACTORY_PROXY build option (uses WindowsCodecs.dll entrypoint rather than CoCreateInstance) + +January 25, 2013 + GeometricPrimitive support for left-handed coordinates and drawing with custom effects + Model, ModelMesh, and ModelMeshPart added with loading of rigid non-animating models from .CMO and .SDKMESH files + EffectFactory helper class added + +December 11, 2012 + Ex versions of DDSTextureLoader and WICTextureLoader + Removed use of ATL's CComPtr in favor of WRL's ComPtr for all platforms to support VS Express editions + Updated VS 2010 project for official 'property sheet' integration for Windows 8.0 SDK + Minor fix to CommonStates for Feature Level 9.1 + Tweaked AlphaTestEffect.cpp to work around ARM NEON compiler codegen bug + Added dxguid.lib as a default library for Debug builds to resolve GUID link issues + +November 15, 2012 + Added support for WIC2 when available on Windows 8 and Windows 7 with KB 2670838 + Cleaned up warning level 4 warnings + +October 30, 2012 + Added project files for Windows phone 8 + +October 12, 2012 + Added PrimitiveBatch for drawing user primitives + Debug object names for all D3D resources (for PIX and debug layer leak reporting) + +October 2, 2012 + Added ScreenGrab module + Added CreateGeoSphere for drawing a geodesic sphere + Put DDSTextureLoader and WICTextureLoader into the DirectX C++ namespace + +September 7, 2012 + Renamed project files for better naming consistency + Updated WICTextureLoader for Windows 8 96bpp floating-point formats + Win32 desktop projects updated to use Windows Vista (0x0600) rather than Windows 7 (0x0601) APIs + Tweaked SpriteBatch.cpp to workaround ARM NEON compiler codegen bug + +May 31, 2012 + Updated Windows Store project for Visual Studio 2012 Release Candidate changes + Cleaned up x64 Debug configuration warnings and switched to use "_DEBUG" instead of "DEBUG" + Minor fix for DDSTextureLoader's retry fallback that can happen with 10level9 feature levels + +May 2, 2012 + Added SpriteFont implementation and the MakeSpriteFont utility + +March 29, 2012 + WICTextureLoader updated with Windows 8 WIC native pixel formats + +March 6, 2012 + Fix for too much temp memory used by WICTextureLoader + Add separate Visual Studio 11 projects for Desktop vs. Windows Store builds + +March 5, 2012 + Bug fix for SpriteBatch with batches > 2048 + +February 24, 2012 + Original release diff --git a/DirectXTK/Src/AlignedNew.h b/DirectXTK/Src/AlignedNew.h new file mode 100644 index 0000000..4c33c33 --- /dev/null +++ b/DirectXTK/Src/AlignedNew.h @@ -0,0 +1,67 @@ +//-------------------------------------------------------------------------------------- +// File: AlignedNew.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include +#include + + +namespace DirectX +{ + // Derive from this to customize operator new and delete for + // types that have special heap alignment requirements. + // + // Example usage: + // + // __declspec(align(16)) struct MyAlignedType : public AlignedNew + + template + struct AlignedNew + { + // Allocate aligned memory. + static void* operator new (size_t size) + { + const size_t alignment = __alignof(TDerived); + + static_assert(alignment > 8, "AlignedNew is only useful for types with > 8 byte alignment. Did you forget a __declspec(align) on TDerived?"); + + void* ptr = _aligned_malloc(size, alignment); + + if (!ptr) + throw std::bad_alloc(); + + return ptr; + } + + + // Free aligned memory. + static void operator delete (void* ptr) + { + _aligned_free(ptr); + } + + + // Array overloads. + static void* operator new[] (size_t size) + { + return operator new(size); + } + + + static void operator delete[] (void* ptr) + { + operator delete(ptr); + } + }; +} diff --git a/DirectXTK/Src/AlphaTestEffect.cpp b/DirectXTK/Src/AlphaTestEffect.cpp new file mode 100644 index 0000000..27ea2e1 --- /dev/null +++ b/DirectXTK/Src/AlphaTestEffect.cpp @@ -0,0 +1,447 @@ +//-------------------------------------------------------------------------------------- +// File: AlphaTestEffect.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "EffectCommon.h" + +using namespace DirectX; + + +// Constant buffer layout. Must match the shader! +struct AlphaTestEffectConstants +{ + XMVECTOR diffuseColor; + XMVECTOR alphaTest; + XMVECTOR fogColor; + XMVECTOR fogVector; + XMMATRIX worldViewProj; +}; + +static_assert( ( sizeof(AlphaTestEffectConstants) % 16 ) == 0, "CB size not padded correctly" ); + + +// Traits type describes our characteristics to the EffectBase template. +struct AlphaTestEffectTraits +{ + typedef AlphaTestEffectConstants ConstantBufferType; + + static const int VertexShaderCount = 4; + static const int PixelShaderCount = 4; + static const int ShaderPermutationCount = 8; +}; + + +// Internal AlphaTestEffect implementation class. +class AlphaTestEffect::Impl : public EffectBase +{ +public: + Impl(_In_ ID3D11Device* device); + + D3D11_COMPARISON_FUNC alphaFunction; + int referenceAlpha; + + bool vertexColorEnabled; + + EffectColor color; + + int GetCurrentShaderPermutation() const; + + void Apply(_In_ ID3D11DeviceContext* deviceContext); +}; + + +// Include the precompiled shader code. +namespace +{ +#if defined(_XBOX_ONE) && defined(_TITLE) + #include "Shaders/Compiled/XboxOneAlphaTestEffect_VSAlphaTest.inc" + #include "Shaders/Compiled/XboxOneAlphaTestEffect_VSAlphaTestNoFog.inc" + #include "Shaders/Compiled/XboxOneAlphaTestEffect_VSAlphaTestVc.inc" + #include "Shaders/Compiled/XboxOneAlphaTestEffect_VSAlphaTestVcNoFog.inc" + + #include "Shaders/Compiled/XboxOneAlphaTestEffect_PSAlphaTestLtGt.inc" + #include "Shaders/Compiled/XboxOneAlphaTestEffect_PSAlphaTestLtGtNoFog.inc" + #include "Shaders/Compiled/XboxOneAlphaTestEffect_PSAlphaTestEqNe.inc" + #include "Shaders/Compiled/XboxOneAlphaTestEffect_PSAlphaTestEqNeNoFog.inc" +#else + #include "Shaders/Compiled/AlphaTestEffect_VSAlphaTest.inc" + #include "Shaders/Compiled/AlphaTestEffect_VSAlphaTestNoFog.inc" + #include "Shaders/Compiled/AlphaTestEffect_VSAlphaTestVc.inc" + #include "Shaders/Compiled/AlphaTestEffect_VSAlphaTestVcNoFog.inc" + + #include "Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGt.inc" + #include "Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGtNoFog.inc" + #include "Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNe.inc" + #include "Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNeNoFog.inc" +#endif +} + + +template<> +const ShaderBytecode EffectBase::VertexShaderBytecode[] = +{ + { AlphaTestEffect_VSAlphaTest, sizeof(AlphaTestEffect_VSAlphaTest) }, + { AlphaTestEffect_VSAlphaTestNoFog, sizeof(AlphaTestEffect_VSAlphaTestNoFog) }, + { AlphaTestEffect_VSAlphaTestVc, sizeof(AlphaTestEffect_VSAlphaTestVc) }, + { AlphaTestEffect_VSAlphaTestVcNoFog, sizeof(AlphaTestEffect_VSAlphaTestVcNoFog) }, +}; + + +template<> +const int EffectBase::VertexShaderIndices[] = +{ + 0, // lt/gt + 1, // lt/gt, no fog + 2, // lt/gt, vertex color + 3, // lt/gt, vertex color, no fog + + 0, // eq/ne + 1, // eq/ne, no fog + 2, // eq/ne, vertex color + 3, // eq/ne, vertex color, no fog +}; + + +template<> +const ShaderBytecode EffectBase::PixelShaderBytecode[] = +{ + { AlphaTestEffect_PSAlphaTestLtGt, sizeof(AlphaTestEffect_PSAlphaTestLtGt) }, + { AlphaTestEffect_PSAlphaTestLtGtNoFog, sizeof(AlphaTestEffect_PSAlphaTestLtGtNoFog) }, + { AlphaTestEffect_PSAlphaTestEqNe, sizeof(AlphaTestEffect_PSAlphaTestEqNe) }, + { AlphaTestEffect_PSAlphaTestEqNeNoFog, sizeof(AlphaTestEffect_PSAlphaTestEqNeNoFog) }, +}; + + +template<> +const int EffectBase::PixelShaderIndices[] = +{ + 0, // lt/gt + 1, // lt/gt, no fog + 0, // lt/gt, vertex color + 1, // lt/gt, vertex color, no fog + + 2, // eq/ne + 3, // eq/ne, no fog + 2, // eq/ne, vertex color + 3, // eq/ne, vertex color, no fog +}; + + +// Global pool of per-device AlphaTestEffect resources. +template<> +SharedResourcePool::DeviceResources> EffectBase::deviceResourcesPool; + + +// Constructor. +AlphaTestEffect::Impl::Impl(_In_ ID3D11Device* device) + : EffectBase(device), + alphaFunction(D3D11_COMPARISON_GREATER), + referenceAlpha(0), + vertexColorEnabled(false) +{ + static_assert( _countof(EffectBase::VertexShaderIndices) == AlphaTestEffectTraits::ShaderPermutationCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::VertexShaderBytecode) == AlphaTestEffectTraits::VertexShaderCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::PixelShaderBytecode) == AlphaTestEffectTraits::PixelShaderCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::PixelShaderIndices) == AlphaTestEffectTraits::ShaderPermutationCount, "array/max mismatch" ); +} + + +int AlphaTestEffect::Impl::GetCurrentShaderPermutation() const +{ + int permutation = 0; + + // Use optimized shaders if fog is disabled. + if (!fog.enabled) + { + permutation += 1; + } + + // Support vertex coloring? + if (vertexColorEnabled) + { + permutation += 2; + } + + // Which alpha compare mode? + if (alphaFunction == D3D11_COMPARISON_EQUAL || + alphaFunction == D3D11_COMPARISON_NOT_EQUAL) + { + permutation += 4; + } + + return permutation; +} + + +// Sets our state onto the D3D device. +void AlphaTestEffect::Impl::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + // Compute derived parameter values. + matrices.SetConstants(dirtyFlags, constants.worldViewProj); + + fog.SetConstants(dirtyFlags, matrices.worldView, constants.fogVector); + + color.SetConstants(dirtyFlags, constants.diffuseColor); + + // Recompute the alpha test settings? + if (dirtyFlags & EffectDirtyFlags::AlphaTest) + { + // Convert reference alpha from 8 bit integer to 0-1 float format. + float reference = (float)referenceAlpha / 255.0f; + + // Comparison tolerance of half the 8 bit integer precision. + const float threshold = 0.5f / 255.0f; + + // What to do if the alpha comparison passes or fails. Positive accepts the pixel, negative clips it. + static const XMVECTORF32 selectIfTrue = { { { 1, -1 } } }; + static const XMVECTORF32 selectIfFalse = { { { -1, 1 } } }; + static const XMVECTORF32 selectNever = { { { -1, -1 } } }; + static const XMVECTORF32 selectAlways = { { { 1, 1 } } }; + + float compareTo; + XMVECTOR resultSelector; + + switch (alphaFunction) + { + case D3D11_COMPARISON_LESS: + // Shader will evaluate: clip((a < x) ? z : w) + compareTo = reference - threshold; + resultSelector = selectIfTrue; + break; + + case D3D11_COMPARISON_LESS_EQUAL: + // Shader will evaluate: clip((a < x) ? z : w) + compareTo = reference + threshold; + resultSelector = selectIfTrue; + break; + + case D3D11_COMPARISON_GREATER_EQUAL: + // Shader will evaluate: clip((a < x) ? z : w) + compareTo = reference - threshold; + resultSelector = selectIfFalse; + break; + + case D3D11_COMPARISON_GREATER: + // Shader will evaluate: clip((a < x) ? z : w) + compareTo = reference + threshold; + resultSelector = selectIfFalse; + break; + + case D3D11_COMPARISON_EQUAL: + // Shader will evaluate: clip((abs(a - x) < y) ? z : w) + compareTo = reference; + resultSelector = selectIfTrue; + break; + + case D3D11_COMPARISON_NOT_EQUAL: + // Shader will evaluate: clip((abs(a - x) < y) ? z : w) + compareTo = reference; + resultSelector = selectIfFalse; + break; + + case D3D11_COMPARISON_NEVER: + // Shader will evaluate: clip((a < x) ? z : w) + compareTo = 0; + resultSelector = selectNever; + break; + + case D3D11_COMPARISON_ALWAYS: + // Shader will evaluate: clip((a < x) ? z : w) + compareTo = 0; + resultSelector = selectAlways; + break; + + default: + throw std::exception("Unknown alpha test function"); + } + + // x = compareTo, y = threshold, zw = resultSelector. + constants.alphaTest = XMVectorPermute<0, 1, 4, 5>(XMVectorSet(compareTo, threshold, 0, 0), resultSelector); + + dirtyFlags &= ~EffectDirtyFlags::AlphaTest; + dirtyFlags |= EffectDirtyFlags::ConstantBuffer; + } + + // Set the texture. + ID3D11ShaderResourceView* textures[1] = { texture.Get() }; + + deviceContext->PSSetShaderResources(0, 1, textures); + + // Set shaders and constant buffers. + ApplyShaders(deviceContext, GetCurrentShaderPermutation()); +} + + +// Public constructor. +AlphaTestEffect::AlphaTestEffect(_In_ ID3D11Device* device) + : pImpl(new Impl(device)) +{ +} + + +// Move constructor. +AlphaTestEffect::AlphaTestEffect(AlphaTestEffect&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +AlphaTestEffect& AlphaTestEffect::operator= (AlphaTestEffect&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +AlphaTestEffect::~AlphaTestEffect() +{ +} + + +// IEffect methods. +void AlphaTestEffect::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + pImpl->Apply(deviceContext); +} + + +void AlphaTestEffect::GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) +{ + pImpl->GetVertexShaderBytecode(pImpl->GetCurrentShaderPermutation(), pShaderByteCode, pByteCodeLength); +} + + +// Camera settings. +void XM_CALLCONV AlphaTestEffect::SetWorld(FXMMATRIX value) +{ + pImpl->matrices.world = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV AlphaTestEffect::SetView(FXMMATRIX value) +{ + pImpl->matrices.view = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV AlphaTestEffect::SetProjection(FXMMATRIX value) +{ + pImpl->matrices.projection = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj; +} + + +void XM_CALLCONV AlphaTestEffect::SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) +{ + pImpl->matrices.world = world; + pImpl->matrices.view = view; + pImpl->matrices.projection = projection; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +// Material settings +void XM_CALLCONV AlphaTestEffect::SetDiffuseColor(FXMVECTOR value) +{ + pImpl->color.diffuseColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void AlphaTestEffect::SetAlpha(float value) +{ + pImpl->color.alpha = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV AlphaTestEffect::SetColorAndAlpha(FXMVECTOR value) +{ + pImpl->color.diffuseColor = value; + pImpl->color.alpha = XMVectorGetW(value); + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +// Fog settings. +void AlphaTestEffect::SetFogEnabled(bool value) +{ + pImpl->fog.enabled = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogEnable; +} + + +void AlphaTestEffect::SetFogStart(float value) +{ + pImpl->fog.start = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void AlphaTestEffect::SetFogEnd(float value) +{ + pImpl->fog.end = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV AlphaTestEffect::SetFogColor(FXMVECTOR value) +{ + pImpl->constants.fogColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +// Vertex color setting. +void AlphaTestEffect::SetVertexColorEnabled(bool value) +{ + pImpl->vertexColorEnabled = value; +} + + +// Texture settings. +void AlphaTestEffect::SetTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture = value; +} + + +void AlphaTestEffect::SetAlphaFunction(D3D11_COMPARISON_FUNC value) +{ + pImpl->alphaFunction = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::AlphaTest; +} + + +void AlphaTestEffect::SetReferenceAlpha(int value) +{ + pImpl->referenceAlpha = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::AlphaTest; +} diff --git a/DirectXTK/Src/BasicEffect.cpp b/DirectXTK/Src/BasicEffect.cpp new file mode 100644 index 0000000..6402270 --- /dev/null +++ b/DirectXTK/Src/BasicEffect.cpp @@ -0,0 +1,733 @@ +//-------------------------------------------------------------------------------------- +// File: BasicEffect.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "EffectCommon.h" + +using namespace DirectX; + + +// Constant buffer layout. Must match the shader! +struct BasicEffectConstants +{ + XMVECTOR diffuseColor; + XMVECTOR emissiveColor; + XMVECTOR specularColorAndPower; + + XMVECTOR lightDirection[IEffectLights::MaxDirectionalLights]; + XMVECTOR lightDiffuseColor[IEffectLights::MaxDirectionalLights]; + XMVECTOR lightSpecularColor[IEffectLights::MaxDirectionalLights]; + + XMVECTOR eyePosition; + + XMVECTOR fogColor; + XMVECTOR fogVector; + + XMMATRIX world; + XMVECTOR worldInverseTranspose[3]; + XMMATRIX worldViewProj; +}; + +static_assert( ( sizeof(BasicEffectConstants) % 16 ) == 0, "CB size not padded correctly" ); + + +// Traits type describes our characteristics to the EffectBase template. +struct BasicEffectTraits +{ + typedef BasicEffectConstants ConstantBufferType; + + static const int VertexShaderCount = 32; + static const int PixelShaderCount = 10; + static const int ShaderPermutationCount = 56; +}; + + +// Internal BasicEffect implementation class. +class BasicEffect::Impl : public EffectBase +{ +public: + Impl(_In_ ID3D11Device* device); + + bool lightingEnabled; + bool preferPerPixelLighting; + bool vertexColorEnabled; + bool textureEnabled; + bool biasedVertexNormals; + + EffectLights lights; + + int GetCurrentShaderPermutation() const; + + void Apply(_In_ ID3D11DeviceContext* deviceContext); +}; + + +// Include the precompiled shader code. +namespace +{ +#if defined(_XBOX_ONE) && defined(_TITLE) + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasic.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicNoFog.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVc.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVcNoFog.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicTx.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicTxNoFog.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicTxVc.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicTxVcNoFog.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVertexLighting.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVertexLightingVc.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVertexLightingTx.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVertexLightingTxVc.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicOneLight.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicOneLightVc.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicOneLightTx.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicOneLightTxVc.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicPixelLighting.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicPixelLightingVc.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicPixelLightingTx.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicPixelLightingTxVc.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVertexLightingBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVertexLightingVcBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVertexLightingTxBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicVertexLightingTxVcBn.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicOneLightBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicOneLightVcBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicOneLightTxBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicOneLightTxVcBn.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicPixelLightingBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicPixelLightingVcBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicPixelLightingTxBn.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_VSBasicPixelLightingTxVcBn.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasic.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicNoFog.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicTx.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicTxNoFog.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicVertexLighting.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicVertexLightingNoFog.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicVertexLightingTx.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicVertexLightingTxNoFog.inc" + + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicPixelLighting.inc" + #include "Shaders/Compiled/XboxOneBasicEffect_PSBasicPixelLightingTx.inc" +#else + #include "Shaders/Compiled/BasicEffect_VSBasic.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicNoFog.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicVc.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicVcNoFog.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicTx.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicTxNoFog.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicTxVc.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicTxVcNoFog.inc" + + #include "Shaders/Compiled/BasicEffect_VSBasicVertexLighting.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicVertexLightingVc.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicVertexLightingTx.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVc.inc" + + #include "Shaders/Compiled/BasicEffect_VSBasicOneLight.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicOneLightVc.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicOneLightTx.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicOneLightTxVc.inc" + + #include "Shaders/Compiled/BasicEffect_VSBasicPixelLighting.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicPixelLightingVc.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicPixelLightingTx.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVc.inc" + + #include "Shaders/Compiled/BasicEffect_VSBasicVertexLightingBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicVertexLightingVcBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVcBn.inc" + + #include "Shaders/Compiled/BasicEffect_VSBasicOneLightBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicOneLightVcBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicOneLightTxBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicOneLightTxVcBn.inc" + + #include "Shaders/Compiled/BasicEffect_VSBasicPixelLightingBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicPixelLightingVcBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxBn.inc" + #include "Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVcBn.inc" + + #include "Shaders/Compiled/BasicEffect_PSBasic.inc" + #include "Shaders/Compiled/BasicEffect_PSBasicNoFog.inc" + #include "Shaders/Compiled/BasicEffect_PSBasicTx.inc" + #include "Shaders/Compiled/BasicEffect_PSBasicTxNoFog.inc" + + #include "Shaders/Compiled/BasicEffect_PSBasicVertexLighting.inc" + #include "Shaders/Compiled/BasicEffect_PSBasicVertexLightingNoFog.inc" + #include "Shaders/Compiled/BasicEffect_PSBasicVertexLightingTx.inc" + #include "Shaders/Compiled/BasicEffect_PSBasicVertexLightingTxNoFog.inc" + + #include "Shaders/Compiled/BasicEffect_PSBasicPixelLighting.inc" + #include "Shaders/Compiled/BasicEffect_PSBasicPixelLightingTx.inc" +#endif +} + + +template<> +const ShaderBytecode EffectBase::VertexShaderBytecode[] = +{ + { BasicEffect_VSBasic, sizeof(BasicEffect_VSBasic) }, + { BasicEffect_VSBasicNoFog, sizeof(BasicEffect_VSBasicNoFog) }, + { BasicEffect_VSBasicVc, sizeof(BasicEffect_VSBasicVc) }, + { BasicEffect_VSBasicVcNoFog, sizeof(BasicEffect_VSBasicVcNoFog) }, + { BasicEffect_VSBasicTx, sizeof(BasicEffect_VSBasicTx) }, + { BasicEffect_VSBasicTxNoFog, sizeof(BasicEffect_VSBasicTxNoFog) }, + { BasicEffect_VSBasicTxVc, sizeof(BasicEffect_VSBasicTxVc) }, + { BasicEffect_VSBasicTxVcNoFog, sizeof(BasicEffect_VSBasicTxVcNoFog) }, + + { BasicEffect_VSBasicVertexLighting, sizeof(BasicEffect_VSBasicVertexLighting) }, + { BasicEffect_VSBasicVertexLightingVc, sizeof(BasicEffect_VSBasicVertexLightingVc) }, + { BasicEffect_VSBasicVertexLightingTx, sizeof(BasicEffect_VSBasicVertexLightingTx) }, + { BasicEffect_VSBasicVertexLightingTxVc, sizeof(BasicEffect_VSBasicVertexLightingTxVc) }, + + { BasicEffect_VSBasicOneLight, sizeof(BasicEffect_VSBasicOneLight) }, + { BasicEffect_VSBasicOneLightVc, sizeof(BasicEffect_VSBasicOneLightVc) }, + { BasicEffect_VSBasicOneLightTx, sizeof(BasicEffect_VSBasicOneLightTx) }, + { BasicEffect_VSBasicOneLightTxVc, sizeof(BasicEffect_VSBasicOneLightTxVc) }, + + { BasicEffect_VSBasicPixelLighting, sizeof(BasicEffect_VSBasicPixelLighting) }, + { BasicEffect_VSBasicPixelLightingVc, sizeof(BasicEffect_VSBasicPixelLightingVc) }, + { BasicEffect_VSBasicPixelLightingTx, sizeof(BasicEffect_VSBasicPixelLightingTx) }, + { BasicEffect_VSBasicPixelLightingTxVc, sizeof(BasicEffect_VSBasicPixelLightingTxVc) }, + + { BasicEffect_VSBasicVertexLightingBn, sizeof(BasicEffect_VSBasicVertexLightingBn) }, + { BasicEffect_VSBasicVertexLightingVcBn, sizeof(BasicEffect_VSBasicVertexLightingVcBn) }, + { BasicEffect_VSBasicVertexLightingTxBn, sizeof(BasicEffect_VSBasicVertexLightingTxBn) }, + { BasicEffect_VSBasicVertexLightingTxVcBn, sizeof(BasicEffect_VSBasicVertexLightingTxVcBn) }, + + { BasicEffect_VSBasicOneLightBn, sizeof(BasicEffect_VSBasicOneLightBn) }, + { BasicEffect_VSBasicOneLightVcBn, sizeof(BasicEffect_VSBasicOneLightVcBn) }, + { BasicEffect_VSBasicOneLightTxBn, sizeof(BasicEffect_VSBasicOneLightTxBn) }, + { BasicEffect_VSBasicOneLightTxVcBn, sizeof(BasicEffect_VSBasicOneLightTxVcBn) }, + + { BasicEffect_VSBasicPixelLightingBn, sizeof(BasicEffect_VSBasicPixelLightingBn) }, + { BasicEffect_VSBasicPixelLightingVcBn, sizeof(BasicEffect_VSBasicPixelLightingVcBn) }, + { BasicEffect_VSBasicPixelLightingTxBn, sizeof(BasicEffect_VSBasicPixelLightingTxBn) }, + { BasicEffect_VSBasicPixelLightingTxVcBn, sizeof(BasicEffect_VSBasicPixelLightingTxVcBn) }, +}; + + +template<> +const int EffectBase::VertexShaderIndices[] = +{ + 0, // basic + 1, // no fog + 2, // vertex color + 3, // vertex color, no fog + 4, // texture + 5, // texture, no fog + 6, // texture + vertex color + 7, // texture + vertex color, no fog + + 8, // vertex lighting + 8, // vertex lighting, no fog + 9, // vertex lighting + vertex color + 9, // vertex lighting + vertex color, no fog + 10, // vertex lighting + texture + 10, // vertex lighting + texture, no fog + 11, // vertex lighting + texture + vertex color + 11, // vertex lighting + texture + vertex color, no fog + + 12, // one light + 12, // one light, no fog + 13, // one light + vertex color + 13, // one light + vertex color, no fog + 14, // one light + texture + 14, // one light + texture, no fog + 15, // one light + texture + vertex color + 15, // one light + texture + vertex color, no fog + + 16, // pixel lighting + 16, // pixel lighting, no fog + 17, // pixel lighting + vertex color + 17, // pixel lighting + vertex color, no fog + 18, // pixel lighting + texture + 18, // pixel lighting + texture, no fog + 19, // pixel lighting + texture + vertex color + 19, // pixel lighting + texture + vertex color, no fog + + 20, // vertex lighting (biased vertex normals) + 20, // vertex lighting (biased vertex normals), no fog + 21, // vertex lighting (biased vertex normals) + vertex color + 21, // vertex lighting (biased vertex normals) + vertex color, no fog + 22, // vertex lighting (biased vertex normals) + texture + 22, // vertex lighting (biased vertex normals) + texture, no fog + 23, // vertex lighting (biased vertex normals) + texture + vertex color + 23, // vertex lighting (biased vertex normals) + texture + vertex color, no fog + + 24, // one light (biased vertex normals) + 24, // one light (biased vertex normals), no fog + 25, // one light (biased vertex normals) + vertex color + 25, // one light (biased vertex normals) + vertex color, no fog + 26, // one light (biased vertex normals) + texture + 26, // one light (biased vertex normals) + texture, no fog + 27, // one light (biased vertex normals) + texture + vertex color + 27, // one light (biased vertex normals) + texture + vertex color, no fog + + 28, // pixel lighting (biased vertex normals) + 28, // pixel lighting (biased vertex normals), no fog + 29, // pixel lighting (biased vertex normals) + vertex color + 29, // pixel lighting (biased vertex normals) + vertex color, no fog + 30, // pixel lighting (biased vertex normals) + texture + 30, // pixel lighting (biased vertex normals) + texture, no fog + 31, // pixel lighting (biased vertex normals) + texture + vertex color + 31, // pixel lighting (biased vertex normals) + texture + vertex color, no fog +}; + + +template<> +const ShaderBytecode EffectBase::PixelShaderBytecode[] = +{ + { BasicEffect_PSBasic, sizeof(BasicEffect_PSBasic) }, + { BasicEffect_PSBasicNoFog, sizeof(BasicEffect_PSBasicNoFog) }, + { BasicEffect_PSBasicTx, sizeof(BasicEffect_PSBasicTx) }, + { BasicEffect_PSBasicTxNoFog, sizeof(BasicEffect_PSBasicTxNoFog) }, + + { BasicEffect_PSBasicVertexLighting, sizeof(BasicEffect_PSBasicVertexLighting) }, + { BasicEffect_PSBasicVertexLightingNoFog, sizeof(BasicEffect_PSBasicVertexLightingNoFog) }, + { BasicEffect_PSBasicVertexLightingTx, sizeof(BasicEffect_PSBasicVertexLightingTx) }, + { BasicEffect_PSBasicVertexLightingTxNoFog, sizeof(BasicEffect_PSBasicVertexLightingTxNoFog) }, + + { BasicEffect_PSBasicPixelLighting, sizeof(BasicEffect_PSBasicPixelLighting) }, + { BasicEffect_PSBasicPixelLightingTx, sizeof(BasicEffect_PSBasicPixelLightingTx) }, +}; + + +template<> +const int EffectBase::PixelShaderIndices[] = +{ + 0, // basic + 1, // no fog + 0, // vertex color + 1, // vertex color, no fog + 2, // texture + 3, // texture, no fog + 2, // texture + vertex color + 3, // texture + vertex color, no fog + + 4, // vertex lighting + 5, // vertex lighting, no fog + 4, // vertex lighting + vertex color + 5, // vertex lighting + vertex color, no fog + 6, // vertex lighting + texture + 7, // vertex lighting + texture, no fog + 6, // vertex lighting + texture + vertex color + 7, // vertex lighting + texture + vertex color, no fog + + 4, // one light + 5, // one light, no fog + 4, // one light + vertex color + 5, // one light + vertex color, no fog + 6, // one light + texture + 7, // one light + texture, no fog + 6, // one light + texture + vertex color + 7, // one light + texture + vertex color, no fog + + 8, // pixel lighting + 8, // pixel lighting, no fog + 8, // pixel lighting + vertex color + 8, // pixel lighting + vertex color, no fog + 9, // pixel lighting + texture + 9, // pixel lighting + texture, no fog + 9, // pixel lighting + texture + vertex color + 9, // pixel lighting + texture + vertex color, no fog + + 4, // vertex lighting (biased vertex normals) + 5, // vertex lighting (biased vertex normals), no fog + 4, // vertex lighting (biased vertex normals) + vertex color + 5, // vertex lighting (biased vertex normals) + vertex color, no fog + 6, // vertex lighting (biased vertex normals) + texture + 7, // vertex lighting (biased vertex normals) + texture, no fog + 6, // vertex lighting (biased vertex normals) + texture + vertex color + 7, // vertex lighting (biased vertex normals) + texture + vertex color, no fog + + 4, // one light (biased vertex normals) + 5, // one light (biased vertex normals), no fog + 4, // one light (biased vertex normals) + vertex color + 5, // one light (biased vertex normals) + vertex color, no fog + 6, // one light (biased vertex normals) + texture + 7, // one light (biased vertex normals) + texture, no fog + 6, // one light (biased vertex normals) + texture + vertex color + 7, // one light (biased vertex normals) + texture + vertex color, no fog + + 8, // pixel lighting (biased vertex normals) + 8, // pixel lighting (biased vertex normals), no fog + 8, // pixel lighting (biased vertex normals) + vertex color + 8, // pixel lighting (biased vertex normals) + vertex color, no fog + 9, // pixel lighting (biased vertex normals) + texture + 9, // pixel lighting (biased vertex normals) + texture, no fog + 9, // pixel lighting (biased vertex normals) + texture + vertex color + 9, // pixel lighting (biased vertex normals) + texture + vertex color, no fog +}; + + +// Global pool of per-device BasicEffect resources. +SharedResourcePool::DeviceResources> EffectBase::deviceResourcesPool; + + +// Constructor. +BasicEffect::Impl::Impl(_In_ ID3D11Device* device) + : EffectBase(device), + lightingEnabled(false), + preferPerPixelLighting(false), + vertexColorEnabled(false), + textureEnabled(false), + biasedVertexNormals(false) +{ + static_assert(_countof(EffectBase::VertexShaderIndices) == BasicEffectTraits::ShaderPermutationCount, "array/max mismatch"); + static_assert(_countof(EffectBase::VertexShaderBytecode) == BasicEffectTraits::VertexShaderCount, "array/max mismatch"); + static_assert(_countof(EffectBase::PixelShaderBytecode) == BasicEffectTraits::PixelShaderCount, "array/max mismatch"); + static_assert(_countof(EffectBase::PixelShaderIndices) == BasicEffectTraits::ShaderPermutationCount, "array/max mismatch"); + + lights.InitializeConstants(constants.specularColorAndPower, constants.lightDirection, constants.lightDiffuseColor, constants.lightSpecularColor); +} + + +int BasicEffect::Impl::GetCurrentShaderPermutation() const +{ + int permutation = 0; + + // Use optimized shaders if fog is disabled. + if (!fog.enabled) + { + permutation += 1; + } + + // Support vertex coloring? + if (vertexColorEnabled) + { + permutation += 2; + } + + // Support texturing? + if (textureEnabled) + { + permutation += 4; + } + + if (lightingEnabled) + { + if (preferPerPixelLighting) + { + // Do lighting in the pixel shader. + permutation += 24; + } + else if (!lights.lightEnabled[1] && !lights.lightEnabled[2]) + { + // Use the only-bother-with-the-first-light shader optimization. + permutation += 16; + } + else + { + // Compute all three lights in the vertex shader. + permutation += 8; + } + + if (biasedVertexNormals) + { + // Compressed normals need to be scaled and biased in the vertex shader. + permutation += 24; + } + } + + return permutation; +} + + +// Sets our state onto the D3D device. +void BasicEffect::Impl::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + // Compute derived parameter values. + matrices.SetConstants(dirtyFlags, constants.worldViewProj); + + fog.SetConstants(dirtyFlags, matrices.worldView, constants.fogVector); + + lights.SetConstants(dirtyFlags, matrices, constants.world, constants.worldInverseTranspose, constants.eyePosition, constants.diffuseColor, constants.emissiveColor, lightingEnabled); + + // Set the texture. + if (textureEnabled) + { + ID3D11ShaderResourceView* textures[1] = { texture.Get() }; + + deviceContext->PSSetShaderResources(0, 1, textures); + } + + // Set shaders and constant buffers. + ApplyShaders(deviceContext, GetCurrentShaderPermutation()); +} + + +// Public constructor. +BasicEffect::BasicEffect(_In_ ID3D11Device* device) + : pImpl(new Impl(device)) +{ +} + + +// Move constructor. +BasicEffect::BasicEffect(BasicEffect&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +BasicEffect& BasicEffect::operator= (BasicEffect&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +BasicEffect::~BasicEffect() +{ +} + + +// IEffect methods. +void BasicEffect::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + pImpl->Apply(deviceContext); +} + + +void BasicEffect::GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) +{ + pImpl->GetVertexShaderBytecode(pImpl->GetCurrentShaderPermutation(), pShaderByteCode, pByteCodeLength); +} + + +// Camera settings. +void XM_CALLCONV BasicEffect::SetWorld(FXMMATRIX value) +{ + pImpl->matrices.world = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV BasicEffect::SetView(FXMMATRIX value) +{ + pImpl->matrices.view = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV BasicEffect::SetProjection(FXMMATRIX value) +{ + pImpl->matrices.projection = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj; +} + + +void XM_CALLCONV BasicEffect::SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) +{ + pImpl->matrices.world = world; + pImpl->matrices.view = view; + pImpl->matrices.projection = projection; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +// Material settings. +void XM_CALLCONV BasicEffect::SetDiffuseColor(FXMVECTOR value) +{ + pImpl->lights.diffuseColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV BasicEffect::SetEmissiveColor(FXMVECTOR value) +{ + pImpl->lights.emissiveColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV BasicEffect::SetSpecularColor(FXMVECTOR value) +{ + // Set xyz to new value, but preserve existing w (specular power). + pImpl->constants.specularColorAndPower = XMVectorSelect(pImpl->constants.specularColorAndPower, value, g_XMSelect1110); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void BasicEffect::SetSpecularPower(float value) +{ + // Set w to new value, but preserve existing xyz (specular color). + pImpl->constants.specularColorAndPower = XMVectorSetW(pImpl->constants.specularColorAndPower, value); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void BasicEffect::DisableSpecular() +{ + // Set specular color to black, power to 1 + // Note: Don't use a power of 0 or the shader will generate strange highlights on non-specular materials + + pImpl->constants.specularColorAndPower = g_XMIdentityR3; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void BasicEffect::SetAlpha(float value) +{ + pImpl->lights.alpha = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV BasicEffect::SetColorAndAlpha(FXMVECTOR value) +{ + pImpl->lights.diffuseColor = value; + pImpl->lights.alpha = XMVectorGetW(value); + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +// Light settings. +void BasicEffect::SetLightingEnabled(bool value) +{ + pImpl->lightingEnabled = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void BasicEffect::SetPerPixelLighting(bool value) +{ + pImpl->preferPerPixelLighting = value; +} + + +void XM_CALLCONV BasicEffect::SetAmbientLightColor(FXMVECTOR value) +{ + pImpl->lights.ambientLightColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void BasicEffect::SetLightEnabled(int whichLight, bool value) +{ + pImpl->dirtyFlags |= pImpl->lights.SetLightEnabled(whichLight, value, pImpl->constants.lightDiffuseColor, pImpl->constants.lightSpecularColor); +} + + +void XM_CALLCONV BasicEffect::SetLightDirection(int whichLight, FXMVECTOR value) +{ + EffectLights::ValidateLightIndex(whichLight); + + pImpl->constants.lightDirection[whichLight] = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void XM_CALLCONV BasicEffect::SetLightDiffuseColor(int whichLight, FXMVECTOR value) +{ + pImpl->dirtyFlags |= pImpl->lights.SetLightDiffuseColor(whichLight, value, pImpl->constants.lightDiffuseColor); +} + + +void XM_CALLCONV BasicEffect::SetLightSpecularColor(int whichLight, FXMVECTOR value) +{ + pImpl->dirtyFlags |= pImpl->lights.SetLightSpecularColor(whichLight, value, pImpl->constants.lightSpecularColor); +} + + +void BasicEffect::EnableDefaultLighting() +{ + EffectLights::EnableDefaultLighting(this); +} + + +// Fog settings. +void BasicEffect::SetFogEnabled(bool value) +{ + pImpl->fog.enabled = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogEnable; +} + + +void BasicEffect::SetFogStart(float value) +{ + pImpl->fog.start = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void BasicEffect::SetFogEnd(float value) +{ + pImpl->fog.end = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV BasicEffect::SetFogColor(FXMVECTOR value) +{ + pImpl->constants.fogColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +// Vertex color setting. +void BasicEffect::SetVertexColorEnabled(bool value) +{ + pImpl->vertexColorEnabled = value; +} + + +// Texture settings. +void BasicEffect::SetTextureEnabled(bool value) +{ + pImpl->textureEnabled = value; +} + + +void BasicEffect::SetTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture = value; +} + + +// Normal compression settings. +void BasicEffect::SetBiasedVertexNormals(bool value) +{ + pImpl->biasedVertexNormals = value; +} diff --git a/DirectXTK/Src/BasicPostProcess.cpp b/DirectXTK/Src/BasicPostProcess.cpp new file mode 100644 index 0000000..e389fa2 --- /dev/null +++ b/DirectXTK/Src/BasicPostProcess.cpp @@ -0,0 +1,596 @@ +//-------------------------------------------------------------------------------------- +// File: BasicPostProcess.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "PostProcess.h" + +#include "AlignedNew.h" +#include "CommonStates.h" +#include "ConstantBuffer.h" +#include "DemandCreate.h" +#include "DirectXHelpers.h" +#include "SharedResourcePool.h" + +using namespace DirectX; + +using Microsoft::WRL::ComPtr; + +namespace +{ + const int c_MaxSamples = 16; + + const int Dirty_ConstantBuffer = 0x01; + const int Dirty_Parameters = 0x02; + + // Constant buffer layout. Must match the shader! + __declspec(align(16)) struct PostProcessConstants + { + XMVECTOR sampleOffsets[c_MaxSamples]; + XMVECTOR sampleWeights[c_MaxSamples]; + }; + + static_assert((sizeof(PostProcessConstants) % 16) == 0, "CB size not padded correctly"); + + // 2-parameter Gaussian distribution given standard deviation (rho) + inline float GaussianDistribution(float x, float y, float rho) + { + return expf(-(x * x + y * y) / (2 * rho * rho)) / sqrtf(2 * XM_PI * rho * rho); + } +} + +// Include the precompiled shader code. +namespace +{ +#if defined(_XBOX_ONE) && defined(_TITLE) + #include "Shaders/Compiled/XboxOnePostProcess_VSQuad.inc" + + #include "Shaders/Compiled/XboxOnePostProcess_PSCopy.inc" + #include "Shaders/Compiled/XboxOnePostProcess_PSMonochrome.inc" + #include "Shaders/Compiled/XboxOnePostProcess_PSSepia.inc" + #include "Shaders/Compiled/XboxOnePostProcess_PSDownScale2x2.inc" + #include "Shaders/Compiled/XboxOnePostProcess_PSDownScale4x4.inc" + #include "Shaders/Compiled/XboxOnePostProcess_PSGaussianBlur5x5.inc" + #include "Shaders/Compiled/XboxOnePostProcess_PSBloomExtract.inc" + #include "Shaders/Compiled/XboxOnePostProcess_PSBloomBlur.inc" +#else + #include "Shaders/Compiled/PostProcess_VSQuad.inc" + + #include "Shaders/Compiled/PostProcess_PSCopy.inc" + #include "Shaders/Compiled/PostProcess_PSMonochrome.inc" + #include "Shaders/Compiled/PostProcess_PSSepia.inc" + #include "Shaders/Compiled/PostProcess_PSDownScale2x2.inc" + #include "Shaders/Compiled/PostProcess_PSDownScale4x4.inc" + #include "Shaders/Compiled/PostProcess_PSGaussianBlur5x5.inc" + #include "Shaders/Compiled/PostProcess_PSBloomExtract.inc" + #include "Shaders/Compiled/PostProcess_PSBloomBlur.inc" +#endif +} + +namespace +{ + struct ShaderBytecode + { + void const* code; + size_t length; + }; + + const ShaderBytecode pixelShaders[] = + { + { PostProcess_PSCopy, sizeof(PostProcess_PSCopy) }, + { PostProcess_PSMonochrome, sizeof(PostProcess_PSMonochrome) }, + { PostProcess_PSSepia, sizeof(PostProcess_PSSepia) }, + { PostProcess_PSDownScale2x2, sizeof(PostProcess_PSDownScale2x2) }, + { PostProcess_PSDownScale4x4, sizeof(PostProcess_PSDownScale4x4) }, + { PostProcess_PSGaussianBlur5x5, sizeof(PostProcess_PSGaussianBlur5x5) }, + { PostProcess_PSBloomExtract, sizeof(PostProcess_PSBloomExtract) }, + { PostProcess_PSBloomBlur, sizeof(PostProcess_PSBloomBlur) }, + }; + + static_assert(_countof(pixelShaders) == BasicPostProcess::Effect_Max, "array/max mismatch"); + + // Factory for lazily instantiating shaders. + class DeviceResources + { + public: + DeviceResources(_In_ ID3D11Device* device) + : stateObjects(device), + mDevice(device) + { } + + // Gets or lazily creates the vertex shader. + ID3D11VertexShader* GetVertexShader() + { + return DemandCreate(mVertexShader, mMutex, [&](ID3D11VertexShader** pResult) -> HRESULT + { + HRESULT hr = mDevice->CreateVertexShader(PostProcess_VSQuad, sizeof(PostProcess_VSQuad), nullptr, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "BasicPostProcess"); + + return hr; + }); + } + + // Gets or lazily creates the specified pixel shader. + ID3D11PixelShader* GetPixelShader(int shaderIndex) + { + assert(shaderIndex >= 0 && shaderIndex < BasicPostProcess::Effect_Max); + _Analysis_assume_(shaderIndex >= 0 && shaderIndex < BasicPostProcess::Effect_Max); + + return DemandCreate(mPixelShaders[shaderIndex], mMutex, [&](ID3D11PixelShader** pResult) -> HRESULT + { + HRESULT hr = mDevice->CreatePixelShader(pixelShaders[shaderIndex].code, pixelShaders[shaderIndex].length, nullptr, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "BasicPostProcess"); + + return hr; + }); + } + + CommonStates stateObjects; + + protected: + ComPtr mDevice; + ComPtr mVertexShader; + ComPtr mPixelShaders[BasicPostProcess::Effect_Max]; + std::mutex mMutex; + }; +} + +class BasicPostProcess::Impl : public AlignedNew +{ +public: + Impl(_In_ ID3D11Device* device); + + void Process(_In_ ID3D11DeviceContext* deviceContext, std::function& setCustomState); + + void SetConstants(bool value = true) { mUseConstants = value; mDirtyFlags = INT_MAX; } + void SetDirtyFlag() { mDirtyFlags = INT_MAX; } + + // Fields. + BasicPostProcess::Effect fx; + PostProcessConstants constants; + ComPtr texture; + unsigned texWidth; + unsigned texHeight; + float guassianMultiplier; + float bloomSize; + float bloomBrightness; + float bloomThreshold; + bool bloomHorizontal; + +private: + bool mUseConstants; + int mDirtyFlags; + + void DownScale2x2(); + void DownScale4x4(); + void GaussianBlur5x5(float multiplier); + void Bloom(bool horizontal, float size, float brightness); + + ConstantBuffer mConstantBuffer; + + // Per-device resources. + std::shared_ptr mDeviceResources; + + static SharedResourcePool deviceResourcesPool; +}; + + +// Global pool of per-device BasicPostProcess resources. +SharedResourcePool BasicPostProcess::Impl::deviceResourcesPool; + + +// Constructor. +BasicPostProcess::Impl::Impl(_In_ ID3D11Device* device) + : fx(BasicPostProcess::Copy), + texWidth(0), + texHeight(0), + guassianMultiplier(1.f), + bloomSize(1.f), + bloomBrightness(1.f), + bloomThreshold(0.25f), + bloomHorizontal(true), + mUseConstants(false), + mDirtyFlags(INT_MAX), + mConstantBuffer(device), + mDeviceResources(deviceResourcesPool.DemandCreate(device)), + constants{} +{ + if (device->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0) + { + throw std::exception("BasicPostProcess requires Feature Level 10.0 or later"); + } +} + + +// Sets our state onto the D3D device. +void BasicPostProcess::Impl::Process(_In_ ID3D11DeviceContext* deviceContext, std::function& setCustomState) +{ + // Set the texture. + ID3D11ShaderResourceView* textures[1] = { texture.Get() }; + deviceContext->PSSetShaderResources(0, 1, textures); + + auto sampler = mDeviceResources->stateObjects.LinearClamp(); + deviceContext->PSSetSamplers(0, 1, &sampler); + + // Set state objects. + deviceContext->OMSetBlendState(mDeviceResources->stateObjects.Opaque(), nullptr, 0xffffffff); + deviceContext->OMSetDepthStencilState(mDeviceResources->stateObjects.DepthNone(), 0); + deviceContext->RSSetState(mDeviceResources->stateObjects.CullNone()); + + // Set shaders. + auto vertexShader = mDeviceResources->GetVertexShader(); + auto pixelShader = mDeviceResources->GetPixelShader(fx); + + deviceContext->VSSetShader(vertexShader, nullptr, 0); + deviceContext->PSSetShader(pixelShader, nullptr, 0); + + // Set constants. + if (mUseConstants) + { + if (mDirtyFlags & Dirty_Parameters) + { + mDirtyFlags &= ~Dirty_Parameters; + mDirtyFlags |= Dirty_ConstantBuffer; + + switch (fx) + { + case DownScale_2x2: + DownScale2x2(); + break; + + case DownScale_4x4: + DownScale4x4(); + break; + + case GaussianBlur_5x5: + GaussianBlur5x5(guassianMultiplier); + break; + + case BloomExtract: + constants.sampleWeights[0] = XMVectorReplicate(bloomThreshold); + break; + + case BloomBlur: + Bloom(bloomHorizontal, bloomSize, bloomBrightness); + break; + + default: + break; + } + } + +#if defined(_XBOX_ONE) && defined(_TITLE) + void *grfxMemory; + mConstantBuffer.SetData(deviceContext, constants, &grfxMemory); + + Microsoft::WRL::ComPtr deviceContextX; + ThrowIfFailed(deviceContext->QueryInterface(IID_GRAPHICS_PPV_ARGS(deviceContextX.GetAddressOf()))); + + auto buffer = mConstantBuffer.GetBuffer(); + + deviceContextX->PSSetPlacementConstantBuffer(0, buffer, grfxMemory); +#else + if (mDirtyFlags & Dirty_ConstantBuffer) + { + mDirtyFlags &= ~Dirty_ConstantBuffer; + mConstantBuffer.SetData(deviceContext, constants); + } + + // Set the constant buffer. + auto buffer = mConstantBuffer.GetBuffer(); + + deviceContext->PSSetConstantBuffers(0, 1, &buffer); +#endif + } + + if (setCustomState) + { + setCustomState(); + } + + // Draw quad. + deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + + deviceContext->Draw(4, 0); +} + + +void BasicPostProcess::Impl::DownScale2x2() +{ + mUseConstants = true; + + if ( !texWidth || !texHeight) + { + throw std::exception("Call SetSourceTexture before setting post-process effect"); + } + + float tu = 1.0f / float(texWidth); + float tv = 1.0f / float(texHeight); + + // Sample from the 4 surrounding points. Since the center point will be in the exact + // center of 4 texels, a 0.5f offset is needed to specify a texel center. + auto ptr = reinterpret_cast(constants.sampleOffsets); + for (int y = 0; y < 2; ++y) + { + for (int x = 0; x < 2; ++x) + { + ptr->x = (float(x) - 0.5f) * tu; + ptr->y = (float(y) - 0.5f) * tv; + ++ptr; + } + } + +} + + +void BasicPostProcess::Impl::DownScale4x4() +{ + mUseConstants = true; + + if (!texWidth || !texHeight) + { + throw std::exception("Call SetSourceTexture before setting post-process effect"); + } + + float tu = 1.0f / float(texWidth); + float tv = 1.0f / float(texHeight); + + // Sample from the 16 surrounding points. Since the center point will be in the + // exact center of 16 texels, a 1.5f offset is needed to specify a texel center. + auto ptr = reinterpret_cast(constants.sampleOffsets); + for (int y = 0; y < 4; ++y) + { + for (int x = 0; x < 4; ++x) + { + ptr->x = (float(x) - 1.5f) * tu; + ptr->y = (float(y) - 1.5f) * tv; + ++ptr; + } + } + +} + + +void BasicPostProcess::Impl::GaussianBlur5x5(float multiplier) +{ + mUseConstants = true; + + if (!texWidth || !texHeight) + { + throw std::exception("Call SetSourceTexture before setting post-process effect"); + } + + float tu = 1.0f / float(texWidth); + float tv = 1.0f / float(texHeight); + + float totalWeight = 0.0f; + size_t index = 0; + auto offsets = reinterpret_cast(constants.sampleOffsets); + auto weights = constants.sampleWeights; + for (int x = -2; x <= 2; ++x) + { + for (int y = -2; y <= 2; ++y) + { + // Exclude pixels with a block distance greater than 2. This will + // create a kernel which approximates a 5x5 kernel using only 13 + // sample points instead of 25; this is necessary since 2.0 shaders + // only support 16 texture grabs. + if (fabs(float(x)) + fabs(float(y)) > 2.0f) + continue; + + // Get the unscaled Gaussian intensity for this offset + offsets[index].x = float(x) * tu; + offsets[index].y = float(y) * tv; + offsets[index].z = 0.0f; + offsets[index].w = 0.0f; + + float g = GaussianDistribution(float(x), float(y), 1.0f); + weights[index] = XMVectorReplicate(g); + + totalWeight += XMVectorGetX(weights[index]); + + ++index; + } + } + + // Divide the current weight by the total weight of all the samples; Gaussian + // blur kernels add to 1.0f to ensure that the intensity of the image isn't + // changed when the blur occurs. An optional multiplier variable is used to + // add or remove image intensity during the blur. + for (size_t i = 0; i < index; ++i) + { + weights[i] /= totalWeight; + weights[i] *= multiplier; + } +} + + +void BasicPostProcess::Impl::Bloom(bool horizontal, float size, float brightness) +{ + mUseConstants = true; + + if (!texWidth || !texHeight) + { + throw std::exception("Call SetSourceTexture before setting post-process effect"); + } + + float tu = 0.f; + float tv = 0.f; + if (horizontal) + { + tu = 1.f / float(texWidth); + } + else + { + tv = 1.f / float(texHeight); + } + + auto weights = reinterpret_cast(constants.sampleWeights); + auto offsets = reinterpret_cast(constants.sampleOffsets); + + // Fill the center texel + float weight = brightness * GaussianDistribution(0, 0, size); + weights[0] = XMFLOAT4(weight, weight, weight, 1.0f); + offsets[0].x = offsets[0].y = offsets[0].z = offsets[0].w = 0.f; + + // Fill the first half + for (int i = 1; i < 8; ++i) + { + // Get the Gaussian intensity for this offset + weight = brightness * GaussianDistribution(float(i), 0, size); + weights[i] = XMFLOAT4(weight, weight, weight, 1.0f); + offsets[i] = XMFLOAT4(float(i) * tu, float(i) * tv, 0.f, 0.f); + } + + // Mirror to the second half + for (int i = 8; i < 15; i++) + { + weights[i] = weights[i - 7]; + offsets[i] = XMFLOAT4(-offsets[i - 7].x, -offsets[i - 7].y, 0.f, 0.f); + } +} + + +// Public constructor. +BasicPostProcess::BasicPostProcess(_In_ ID3D11Device* device) + : pImpl(new Impl(device)) +{ +} + + +// Move constructor. +BasicPostProcess::BasicPostProcess(BasicPostProcess&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +BasicPostProcess& BasicPostProcess::operator= (BasicPostProcess&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +BasicPostProcess::~BasicPostProcess() +{ +} + + +// IPostProcess methods. +void BasicPostProcess::Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState) +{ + pImpl->Process(deviceContext, setCustomState); +} + + +// Shader control. +void BasicPostProcess::SetEffect(Effect fx) +{ + if (fx < 0 || fx >= Effect_Max) + throw std::out_of_range("Effect not defined"); + + pImpl->fx = fx; + + switch (fx) + { + case Copy: + case Monochrome: + case Sepia: + // These shaders don't use the constant buffer + pImpl->SetConstants(false); + break; + + default: + pImpl->SetConstants(true); + break; + } +} + + +// Properties +void BasicPostProcess::SetSourceTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture = value; + + if (value) + { + ComPtr res; + value->GetResource(res.GetAddressOf()); + + D3D11_RESOURCE_DIMENSION resType = D3D11_RESOURCE_DIMENSION_UNKNOWN; + res->GetType(&resType); + + switch (resType) + { + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + { + ComPtr tex; + ThrowIfFailed(res.As(&tex)); + + D3D11_TEXTURE1D_DESC desc = {}; + tex->GetDesc(&desc); + pImpl->texWidth = desc.Width; + pImpl->texHeight = 1; + break; + } + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + { + ComPtr tex; + ThrowIfFailed(res.As(&tex)); + + D3D11_TEXTURE2D_DESC desc = {}; + tex->GetDesc(&desc); + pImpl->texWidth = desc.Width; + pImpl->texHeight = desc.Height; + break; + } + + default: + throw std::exception("Unsupported texture type"); + } + } + else + { + pImpl->texWidth = pImpl->texHeight = 0; + } +} + + +void BasicPostProcess::SetGaussianParameter(float multiplier) +{ + pImpl->guassianMultiplier = multiplier; + pImpl->SetDirtyFlag(); +} + + +void BasicPostProcess::SetBloomExtractParameter(float threshold) +{ + pImpl->bloomThreshold = threshold; + pImpl->SetDirtyFlag(); +} + + +void BasicPostProcess::SetBloomBlurParameters(bool horizontal, float size, float brightness) +{ + pImpl->bloomSize = size; + pImpl->bloomBrightness = brightness; + pImpl->bloomHorizontal = horizontal; + pImpl->SetDirtyFlag(); +} \ No newline at end of file diff --git a/DirectXTK/Src/Bezier.h b/DirectXTK/Src/Bezier.h new file mode 100644 index 0000000..0b7d196 --- /dev/null +++ b/DirectXTK/Src/Bezier.h @@ -0,0 +1,169 @@ +//-------------------------------------------------------------------------------------- +// File: Bezier.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include + + +namespace Bezier +{ + // Performs a cubic bezier interpolation between four control points, + // returning the value at the specified time (t ranges 0 to 1). + // This template implementation can be used to interpolate XMVECTOR, + // float, or any other types that define suitable * and + operators. + template + T CubicInterpolate(T const& p1, T const& p2, T const& p3, T const& p4, float t) + { + using DirectX::operator*; + using DirectX::operator+; + + return p1 * (1 - t) * (1 - t) * (1 - t) + + p2 * 3 * t * (1 - t) * (1 - t) + + p3 * 3 * t * t * (1 - t) + + p4 * t * t * t; + } + + + // Computes the tangent of a cubic bezier curve at the specified time. + // Template supports XMVECTOR, float, or any other types with * and + operators. + template + T CubicTangent(T const& p1, T const& p2, T const& p3, T const& p4, float t) + { + using DirectX::operator*; + using DirectX::operator+; + + return p1 * (-1 + 2 * t - t * t) + + p2 * (1 - 4 * t + 3 * t * t) + + p3 * (2 * t - 3 * t * t) + + p4 * (t * t); + } + + + // Creates vertices for a patch that is tessellated at the specified level. + // Calls the specified outputVertex function for each generated vertex, + // passing the position, normal, and texture coordinate as parameters. + template + void CreatePatchVertices(_In_reads_(16) DirectX::XMVECTOR patch[16], size_t tessellation, bool isMirrored, TOutputFunc outputVertex) + { + using namespace DirectX; + + for (size_t i = 0; i <= tessellation; i++) + { + float u = (float)i / tessellation; + + for (size_t j = 0; j <= tessellation; j++) + { + float v = (float)j / tessellation; + + // Perform four horizontal bezier interpolations + // between the control points of this patch. + XMVECTOR p1 = CubicInterpolate(patch[0], patch[1], patch[2], patch[3], u); + XMVECTOR p2 = CubicInterpolate(patch[4], patch[5], patch[6], patch[7], u); + XMVECTOR p3 = CubicInterpolate(patch[8], patch[9], patch[10], patch[11], u); + XMVECTOR p4 = CubicInterpolate(patch[12], patch[13], patch[14], patch[15], u); + + // Perform a vertical interpolation between the results of the + // previous horizontal interpolations, to compute the position. + XMVECTOR position = CubicInterpolate(p1, p2, p3, p4, v); + + // Perform another four bezier interpolations between the control + // points, but this time vertically rather than horizontally. + XMVECTOR q1 = CubicInterpolate(patch[0], patch[4], patch[8], patch[12], v); + XMVECTOR q2 = CubicInterpolate(patch[1], patch[5], patch[9], patch[13], v); + XMVECTOR q3 = CubicInterpolate(patch[2], patch[6], patch[10], patch[14], v); + XMVECTOR q4 = CubicInterpolate(patch[3], patch[7], patch[11], patch[15], v); + + // Compute vertical and horizontal tangent vectors. + XMVECTOR tangent1 = CubicTangent(p1, p2, p3, p4, v); + XMVECTOR tangent2 = CubicTangent(q1, q2, q3, q4, u); + + // Cross the two tangent vectors to compute the normal. + XMVECTOR normal = XMVector3Cross(tangent1, tangent2); + + if (!XMVector3NearEqual(normal, XMVectorZero(), g_XMEpsilon)) + { + normal = XMVector3Normalize(normal); + + // If this patch is mirrored, we must invert the normal. + if (isMirrored) + { + normal = -normal; + } + } + else + { + // In a tidy and well constructed bezier patch, the preceding + // normal computation will always work. But the classic teapot + // model is not tidy or well constructed! At the top and bottom + // of the teapot, it contains degenerate geometry where a patch + // has several control points in the same place, which causes + // the tangent computation to fail and produce a zero normal. + // We 'fix' these cases by just hard-coding a normal that points + // either straight up or straight down, depending on whether we + // are on the top or bottom of the teapot. This is not a robust + // solution for all possible degenerate bezier patches, but hey, + // it's good enough to make the teapot work correctly! + + normal = XMVectorSelect(g_XMIdentityR1, g_XMNegIdentityR1, XMVectorLess(position, XMVectorZero())); + } + + // Compute the texture coordinate. + float mirroredU = isMirrored ? 1 - u : u; + + XMVECTOR textureCoordinate = XMVectorSet(mirroredU, v, 0, 0); + + // Output this vertex. + outputVertex(position, normal, textureCoordinate); + } + } + } + + + // Creates indices for a patch that is tessellated at the specified level. + // Calls the specified outputIndex function for each generated index value. + template + void CreatePatchIndices(size_t tessellation, bool isMirrored, TOutputFunc outputIndex) + { + size_t stride = tessellation + 1; + + for (size_t i = 0; i < tessellation; i++) + { + for (size_t j = 0; j < tessellation; j++) + { + // Make a list of six index values (two triangles). + std::array indices = + { + i * stride + j, + (i + 1) * stride + j, + (i + 1) * stride + j + 1, + + i * stride + j, + (i + 1) * stride + j + 1, + i * stride + j + 1, + }; + + // If this patch is mirrored, reverse indices to fix the winding order. + if (isMirrored) + { + std::reverse(indices.begin(), indices.end()); + } + + // Output these index values. + std::for_each(indices.begin(), indices.end(), outputIndex); + } + } + } +} diff --git a/DirectXTK/Src/BinaryReader.cpp b/DirectXTK/Src/BinaryReader.cpp new file mode 100644 index 0000000..060bbf5 --- /dev/null +++ b/DirectXTK/Src/BinaryReader.cpp @@ -0,0 +1,92 @@ +//-------------------------------------------------------------------------------------- +// File: BinaryReader.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" + +#include "BinaryReader.h" + +using namespace DirectX; + + +// Constructor reads from the filesystem. +BinaryReader::BinaryReader(_In_z_ wchar_t const* fileName) : + mPos(nullptr), + mEnd(nullptr) +{ + size_t dataSize; + + HRESULT hr = ReadEntireFile(fileName, mOwnedData, &dataSize); + if ( FAILED(hr) ) + { + DebugTrace( "BinaryReader failed (%08X) to load '%ls'\n", hr, fileName ); + throw std::exception( "BinaryReader" ); + } + + mPos = mOwnedData.get(); + mEnd = mOwnedData.get() + dataSize; +} + + +// Constructor reads from an existing memory buffer. +BinaryReader::BinaryReader(_In_reads_bytes_(dataSize) uint8_t const* dataBlob, size_t dataSize) : + mPos(dataBlob), + mEnd(dataBlob + dataSize) +{ +} + + +// Reads from the filesystem into memory. +HRESULT BinaryReader::ReadEntireFile(_In_z_ wchar_t const* fileName, _Inout_ std::unique_ptr& data, _Out_ size_t* dataSize) +{ + // Open the file. +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); +#else + ScopedHandle hFile(safe_handle(CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr))); +#endif + + if (!hFile) + return HRESULT_FROM_WIN32(GetLastError()); + + // Get the file size. + FILE_STANDARD_INFO fileInfo; + if (!GetFileInformationByHandleEx(hFile.get(), FileStandardInfo, &fileInfo, sizeof(fileInfo))) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + // File is too big for 32-bit allocation, so reject read. + if (fileInfo.EndOfFile.HighPart > 0) + return E_FAIL; + + // Create enough space for the file data. + data.reset(new uint8_t[fileInfo.EndOfFile.LowPart]); + + if (!data) + return E_OUTOFMEMORY; + + // Read the data in. + DWORD bytesRead = 0; + + if (!ReadFile(hFile.get(), data.get(), fileInfo.EndOfFile.LowPart, &bytesRead, nullptr)) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + if (bytesRead < fileInfo.EndOfFile.LowPart) + return E_FAIL; + + *dataSize = bytesRead; + + return S_OK; +} diff --git a/DirectXTK/Src/BinaryReader.h b/DirectXTK/Src/BinaryReader.h new file mode 100644 index 0000000..0fab441 --- /dev/null +++ b/DirectXTK/Src/BinaryReader.h @@ -0,0 +1,75 @@ +//-------------------------------------------------------------------------------------- +// File: BinaryReader.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include +#include + +#include "PlatformHelpers.h" + + +namespace DirectX +{ + // Helper for reading binary data, either from the filesystem a memory buffer. + class BinaryReader + { + public: + explicit BinaryReader(_In_z_ wchar_t const* fileName); + BinaryReader(_In_reads_bytes_(dataSize) uint8_t const* dataBlob, size_t dataSize); + + BinaryReader(BinaryReader const&) = delete; + BinaryReader& operator= (BinaryReader const&) = delete; + + // Reads a single value. + template T const& Read() + { + return *ReadArray(1); + } + + + // Reads an array of values. + template T const* ReadArray(size_t elementCount) + { + static_assert(std::is_pod::value, "Can only read plain-old-data types"); + + uint8_t const* newPos = mPos + sizeof(T) * elementCount; + + if (newPos < mPos) + throw std::overflow_error("ReadArray"); + + if (newPos > mEnd) + throw std::exception("End of file"); + + auto result = reinterpret_cast(mPos); + + mPos = newPos; + + return result; + } + + + // Lower level helper reads directly from the filesystem into memory. + static HRESULT ReadEntireFile(_In_z_ wchar_t const* fileName, _Inout_ std::unique_ptr& data, _Out_ size_t* dataSize); + + + private: + // The data currently being read. + uint8_t const* mPos; + uint8_t const* mEnd; + + std::unique_ptr mOwnedData; + }; +} diff --git a/DirectXTK/Src/CommonStates.cpp b/DirectXTK/Src/CommonStates.cpp new file mode 100644 index 0000000..e4182cb --- /dev/null +++ b/DirectXTK/Src/CommonStates.cpp @@ -0,0 +1,365 @@ +//-------------------------------------------------------------------------------------- +// File: CommonStates.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "CommonStates.h" +#include "DemandCreate.h" +#include "DirectXHelpers.h" +#include "SharedResourcePool.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +// Internal state object implementation class. Only one of these helpers is allocated +// per D3D device, even if there are multiple public facing CommonStates instances. +class CommonStates::Impl +{ +public: + Impl(_In_ ID3D11Device* device) + : device(device) + { } + + HRESULT CreateBlendState(D3D11_BLEND srcBlend, D3D11_BLEND destBlend, _Out_ ID3D11BlendState** pResult); + HRESULT CreateDepthStencilState(bool enable, bool writeEnable, _Out_ ID3D11DepthStencilState** pResult); + HRESULT CreateRasterizerState(D3D11_CULL_MODE cullMode, D3D11_FILL_MODE fillMode, _Out_ ID3D11RasterizerState** pResult); + HRESULT CreateSamplerState(D3D11_FILTER filter, D3D11_TEXTURE_ADDRESS_MODE addressMode, _Out_ ID3D11SamplerState** pResult); + + ComPtr device; + + ComPtr opaque; + ComPtr alphaBlend; + ComPtr additive; + ComPtr nonPremultiplied; + + ComPtr depthNone; + ComPtr depthDefault; + ComPtr depthRead; + + ComPtr cullNone; + ComPtr cullClockwise; + ComPtr cullCounterClockwise; + ComPtr wireframe; + + ComPtr pointWrap; + ComPtr pointClamp; + ComPtr linearWrap; + ComPtr linearClamp; + ComPtr anisotropicWrap; + ComPtr anisotropicClamp; + + std::mutex mutex; + + static SharedResourcePool instancePool; +}; + + +// Global instance pool. +SharedResourcePool CommonStates::Impl::instancePool; + + +// Helper for creating blend state objects. +HRESULT CommonStates::Impl::CreateBlendState(D3D11_BLEND srcBlend, D3D11_BLEND destBlend, _Out_ ID3D11BlendState** pResult) +{ + D3D11_BLEND_DESC desc = {}; + + desc.RenderTarget[0].BlendEnable = (srcBlend != D3D11_BLEND_ONE) || + (destBlend != D3D11_BLEND_ZERO); + + desc.RenderTarget[0].SrcBlend = desc.RenderTarget[0].SrcBlendAlpha = srcBlend; + desc.RenderTarget[0].DestBlend = desc.RenderTarget[0].DestBlendAlpha = destBlend; + desc.RenderTarget[0].BlendOp = desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + + desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + + HRESULT hr = device->CreateBlendState(&desc, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DirectXTK:CommonStates"); + + return hr; +} + + +// Helper for creating depth stencil state objects. +HRESULT CommonStates::Impl::CreateDepthStencilState(bool enable, bool writeEnable, _Out_ ID3D11DepthStencilState** pResult) +{ + D3D11_DEPTH_STENCIL_DESC desc = {}; + + desc.DepthEnable = enable ? TRUE : FALSE; + desc.DepthWriteMask = writeEnable ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO; + desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; + + desc.StencilEnable = FALSE; + desc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; + desc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; + + desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; + desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; + desc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; + desc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; + + desc.BackFace = desc.FrontFace; + + HRESULT hr = device->CreateDepthStencilState(&desc, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DirectXTK:CommonStates"); + + return hr; +} + + +// Helper for creating rasterizer state objects. +HRESULT CommonStates::Impl::CreateRasterizerState(D3D11_CULL_MODE cullMode, D3D11_FILL_MODE fillMode, _Out_ ID3D11RasterizerState** pResult) +{ + D3D11_RASTERIZER_DESC desc = {}; + + desc.CullMode = cullMode; + desc.FillMode = fillMode; + desc.DepthClipEnable = TRUE; + desc.MultisampleEnable = TRUE; + + HRESULT hr = device->CreateRasterizerState(&desc, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DirectXTK:CommonStates"); + + return hr; +} + + +// Helper for creating sampler state objects. +HRESULT CommonStates::Impl::CreateSamplerState(D3D11_FILTER filter, D3D11_TEXTURE_ADDRESS_MODE addressMode, _Out_ ID3D11SamplerState** pResult) +{ + D3D11_SAMPLER_DESC desc = {}; + + desc.Filter = filter; + + desc.AddressU = addressMode; + desc.AddressV = addressMode; + desc.AddressW = addressMode; + + desc.MaxAnisotropy = (device->GetFeatureLevel() > D3D_FEATURE_LEVEL_9_1) ? D3D11_MAX_MAXANISOTROPY : 2; + + desc.MaxLOD = FLT_MAX; + desc.ComparisonFunc = D3D11_COMPARISON_NEVER; + + HRESULT hr = device->CreateSamplerState(&desc, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DirectXTK:CommonStates"); + + return hr; +} + + +//-------------------------------------------------------------------------------------- +// CommonStates +//-------------------------------------------------------------------------------------- + +// Public constructor. +CommonStates::CommonStates(_In_ ID3D11Device* device) + : pImpl(Impl::instancePool.DemandCreate(device)) +{ +} + + +// Move constructor. +CommonStates::CommonStates(CommonStates&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +CommonStates& CommonStates::operator= (CommonStates&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +CommonStates::~CommonStates() +{ +} + + +//-------------------------------------------------------------------------------------- +// Blend states +//-------------------------------------------------------------------------------------- + +ID3D11BlendState* CommonStates::Opaque() const +{ + return DemandCreate(pImpl->opaque, pImpl->mutex, [&](ID3D11BlendState** pResult) + { + return pImpl->CreateBlendState(D3D11_BLEND_ONE, D3D11_BLEND_ZERO, pResult); + }); +} + + +ID3D11BlendState* CommonStates::AlphaBlend() const +{ + return DemandCreate(pImpl->alphaBlend, pImpl->mutex, [&](ID3D11BlendState** pResult) + { + return pImpl->CreateBlendState(D3D11_BLEND_ONE, D3D11_BLEND_INV_SRC_ALPHA, pResult); + }); +} + + +ID3D11BlendState* CommonStates::Additive() const +{ + return DemandCreate(pImpl->additive, pImpl->mutex, [&](ID3D11BlendState** pResult) + { + return pImpl->CreateBlendState(D3D11_BLEND_SRC_ALPHA, D3D11_BLEND_ONE, pResult); + }); +} + + +ID3D11BlendState* CommonStates::NonPremultiplied() const +{ + return DemandCreate(pImpl->nonPremultiplied, pImpl->mutex, [&](ID3D11BlendState** pResult) + { + return pImpl->CreateBlendState(D3D11_BLEND_SRC_ALPHA, D3D11_BLEND_INV_SRC_ALPHA, pResult); + }); +} + + +//-------------------------------------------------------------------------------------- +// Depth stencil states +//-------------------------------------------------------------------------------------- + +ID3D11DepthStencilState* CommonStates::DepthNone() const +{ + return DemandCreate(pImpl->depthNone, pImpl->mutex, [&](ID3D11DepthStencilState** pResult) + { + return pImpl->CreateDepthStencilState(false, false, pResult); + }); +} + + +ID3D11DepthStencilState* CommonStates::DepthDefault() const +{ + return DemandCreate(pImpl->depthDefault, pImpl->mutex, [&](ID3D11DepthStencilState** pResult) + { + return pImpl->CreateDepthStencilState(true, true, pResult); + }); +} + + +ID3D11DepthStencilState* CommonStates::DepthRead() const +{ + return DemandCreate(pImpl->depthRead, pImpl->mutex, [&](ID3D11DepthStencilState** pResult) + { + return pImpl->CreateDepthStencilState(true, false, pResult); + }); +} + + +//-------------------------------------------------------------------------------------- +// Rasterizer states +//-------------------------------------------------------------------------------------- + +ID3D11RasterizerState* CommonStates::CullNone() const +{ + return DemandCreate(pImpl->cullNone, pImpl->mutex, [&](ID3D11RasterizerState** pResult) + { + return pImpl->CreateRasterizerState(D3D11_CULL_NONE, D3D11_FILL_SOLID, pResult); + }); +} + + +ID3D11RasterizerState* CommonStates::CullClockwise() const +{ + return DemandCreate(pImpl->cullClockwise, pImpl->mutex, [&](ID3D11RasterizerState** pResult) + { + return pImpl->CreateRasterizerState(D3D11_CULL_FRONT, D3D11_FILL_SOLID, pResult); + }); +} + + +ID3D11RasterizerState* CommonStates::CullCounterClockwise() const +{ + return DemandCreate(pImpl->cullCounterClockwise, pImpl->mutex, [&](ID3D11RasterizerState** pResult) + { + return pImpl->CreateRasterizerState(D3D11_CULL_BACK, D3D11_FILL_SOLID, pResult); + }); +} + + +ID3D11RasterizerState* CommonStates::Wireframe() const +{ + return DemandCreate(pImpl->wireframe, pImpl->mutex, [&](ID3D11RasterizerState** pResult) + { + return pImpl->CreateRasterizerState(D3D11_CULL_NONE, D3D11_FILL_WIREFRAME, pResult); + }); +} + + +//-------------------------------------------------------------------------------------- +// Sampler states +//-------------------------------------------------------------------------------------- + +ID3D11SamplerState* CommonStates::PointWrap() const +{ + return DemandCreate(pImpl->pointWrap, pImpl->mutex, [&](ID3D11SamplerState** pResult) + { + return pImpl->CreateSamplerState(D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_WRAP, pResult); + }); +} + + +ID3D11SamplerState* CommonStates::PointClamp() const +{ + return DemandCreate(pImpl->pointClamp, pImpl->mutex, [&](ID3D11SamplerState** pResult) + { + return pImpl->CreateSamplerState(D3D11_FILTER_MIN_MAG_MIP_POINT, D3D11_TEXTURE_ADDRESS_CLAMP, pResult); + }); +} + + +ID3D11SamplerState* CommonStates::LinearWrap() const +{ + return DemandCreate(pImpl->linearWrap, pImpl->mutex, [&](ID3D11SamplerState** pResult) + { + return pImpl->CreateSamplerState(D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_WRAP, pResult); + }); +} + + +ID3D11SamplerState* CommonStates::LinearClamp() const +{ + return DemandCreate(pImpl->linearClamp, pImpl->mutex, [&](ID3D11SamplerState** pResult) + { + return pImpl->CreateSamplerState(D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_TEXTURE_ADDRESS_CLAMP, pResult); + }); +} + + +ID3D11SamplerState* CommonStates::AnisotropicWrap() const +{ + return DemandCreate(pImpl->anisotropicWrap, pImpl->mutex, [&](ID3D11SamplerState** pResult) + { + return pImpl->CreateSamplerState(D3D11_FILTER_ANISOTROPIC, D3D11_TEXTURE_ADDRESS_WRAP, pResult); + }); +} + + +ID3D11SamplerState* CommonStates::AnisotropicClamp() const +{ + return DemandCreate(pImpl->anisotropicClamp, pImpl->mutex, [&](ID3D11SamplerState** pResult) + { + return pImpl->CreateSamplerState(D3D11_FILTER_ANISOTROPIC, D3D11_TEXTURE_ADDRESS_CLAMP, pResult); + }); +} diff --git a/DirectXTK/Src/ConstantBuffer.h b/DirectXTK/Src/ConstantBuffer.h new file mode 100644 index 0000000..0856e2f --- /dev/null +++ b/DirectXTK/Src/ConstantBuffer.h @@ -0,0 +1,115 @@ +//-------------------------------------------------------------------------------------- +// File: ConstantBuffer.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include "DirectXHelpers.h" +#include "GraphicsMemory.h" +#include "PlatformHelpers.h" + + +namespace DirectX +{ + // Strongly typed wrapper around a D3D constant buffer. + template + class ConstantBuffer + { + public: + // Constructor. + ConstantBuffer() = default; + explicit ConstantBuffer(_In_ ID3D11Device* device) + { + Create( device ); + } + + ConstantBuffer(ConstantBuffer const&) = delete; + ConstantBuffer& operator= (ConstantBuffer const&) = delete; + + #if defined(_XBOX_ONE) && defined(_TITLE) + void Create(_In_ ID3D11Device* device) + { + D3D11_BUFFER_DESC desc = {}; + + desc.ByteWidth = sizeof(T); + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + Microsoft::WRL::ComPtr deviceX; + ThrowIfFailed(device->QueryInterface(IID_GRAPHICS_PPV_ARGS(deviceX.GetAddressOf()))); + + ThrowIfFailed(deviceX->CreatePlacementBuffer(&desc, nullptr, mConstantBuffer.ReleaseAndGetAddressOf())); + + SetDebugObjectName(mConstantBuffer.Get(), L"DirectXTK"); + } + + + // Writes new data into the constant buffer. + void SetData(_In_ ID3D11DeviceContext* deviceContext, T const& value, void** grfxMemory) + { + assert( grfxMemory != 0 ); + + void* ptr = GraphicsMemory::Get().Allocate( deviceContext, sizeof(T), 64 ); + assert( ptr != 0 ); + + *(T*)ptr = value; + + *grfxMemory = ptr; + } + #else + void Create(_In_ ID3D11Device* device) + { + D3D11_BUFFER_DESC desc = {}; + + desc.ByteWidth = sizeof(T); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + ThrowIfFailed( + device->CreateBuffer(&desc, nullptr, mConstantBuffer.ReleaseAndGetAddressOf() ) + ); + + SetDebugObjectName(mConstantBuffer.Get(), "DirectXTK"); + } + + + // Writes new data into the constant buffer. + void SetData(_In_ ID3D11DeviceContext* deviceContext, T const& value) + { + assert( mConstantBuffer.Get() != 0 ); + + D3D11_MAPPED_SUBRESOURCE mappedResource; + + ThrowIfFailed( + deviceContext->Map(mConstantBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource) + ); + + *(T*)mappedResource.pData = value; + + deviceContext->Unmap(mConstantBuffer.Get(), 0); + } + #endif + + // Looks up the underlying D3D constant buffer. + ID3D11Buffer* GetBuffer() + { + return mConstantBuffer.Get(); + } + + + private: + // The underlying D3D object. + Microsoft::WRL::ComPtr mConstantBuffer; + }; +} diff --git a/DirectXTK/Src/DDSTextureLoader.cpp b/DirectXTK/Src/DDSTextureLoader.cpp new file mode 100644 index 0000000..cc5ccf6 --- /dev/null +++ b/DirectXTK/Src/DDSTextureLoader.cpp @@ -0,0 +1,1332 @@ +//-------------------------------------------------------------------------------------- +// File: DDSTextureLoader.cpp +// +// Functions for loading a DDS texture and creating a Direct3D runtime resource for it +// +// Note these functions are useful as a light-weight runtime loader for DDS files. For +// a full-featured DDS file reader, writer, and texture processing pipeline see +// the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" + +#include "DDSTextureLoader.h" + +#include "dds.h" +#include "DirectXHelpers.h" +#include "PlatformHelpers.h" +#include "LoaderHelpers.h" + +using namespace DirectX; +using namespace DirectX::LoaderHelpers; + +static_assert(static_cast(DDS_DIMENSION_TEXTURE1D) == static_cast(D3D11_RESOURCE_DIMENSION_TEXTURE1D), "dds mismatch"); +static_assert(static_cast(DDS_DIMENSION_TEXTURE2D) == static_cast(D3D11_RESOURCE_DIMENSION_TEXTURE2D), "dds mismatch"); +static_assert(static_cast(DDS_DIMENSION_TEXTURE3D) == static_cast(D3D11_RESOURCE_DIMENSION_TEXTURE3D), "dds mismatch"); +static_assert(static_cast(DDS_RESOURCE_MISC_TEXTURECUBE) == static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE), "dds mismatch"); + +namespace +{ + //-------------------------------------------------------------------------------------- + HRESULT FillInitData(_In_ size_t width, + _In_ size_t height, + _In_ size_t depth, + _In_ size_t mipCount, + _In_ size_t arraySize, + _In_ DXGI_FORMAT format, + _In_ size_t maxsize, + _In_ size_t bitSize, + _In_reads_bytes_(bitSize) const uint8_t* bitData, + _Out_ size_t& twidth, + _Out_ size_t& theight, + _Out_ size_t& tdepth, + _Out_ size_t& skipMip, + _Out_writes_(mipCount*arraySize) D3D11_SUBRESOURCE_DATA* initData) + { + if (!bitData || !initData) + { + return E_POINTER; + } + + skipMip = 0; + twidth = 0; + theight = 0; + tdepth = 0; + + size_t NumBytes = 0; + size_t RowBytes = 0; + const uint8_t* pSrcBits = bitData; + const uint8_t* pEndBits = bitData + bitSize; + + size_t index = 0; + for (size_t j = 0; j < arraySize; j++) + { + size_t w = width; + size_t h = height; + size_t d = depth; + for (size_t i = 0; i < mipCount; i++) + { + GetSurfaceInfo(w, + h, + format, + &NumBytes, + &RowBytes, + nullptr + ); + + if ((mipCount <= 1) || !maxsize || (w <= maxsize && h <= maxsize && d <= maxsize)) + { + if (!twidth) + { + twidth = w; + theight = h; + tdepth = d; + } + + assert(index < mipCount * arraySize); + _Analysis_assume_(index < mipCount * arraySize); + initData[index].pSysMem = reinterpret_cast(pSrcBits); + initData[index].SysMemPitch = static_cast(RowBytes); + initData[index].SysMemSlicePitch = static_cast(NumBytes); + ++index; + } + else if (!j) + { + // Count number of skipped mipmaps (first item only) + ++skipMip; + } + + if (pSrcBits + (NumBytes*d) > pEndBits) + { + return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); + } + + pSrcBits += NumBytes * d; + + w = w >> 1; + h = h >> 1; + d = d >> 1; + if (w == 0) + { + w = 1; + } + if (h == 0) + { + h = 1; + } + if (d == 0) + { + d = 1; + } + } + } + + return (index > 0) ? S_OK : E_FAIL; + } + + //-------------------------------------------------------------------------------------- + HRESULT CreateD3DResources(_In_ ID3D11Device* d3dDevice, + _In_ uint32_t resDim, + _In_ size_t width, + _In_ size_t height, + _In_ size_t depth, + _In_ size_t mipCount, + _In_ size_t arraySize, + _In_ DXGI_FORMAT format, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _In_ bool isCubeMap, + _In_reads_opt_(mipCount*arraySize) const D3D11_SUBRESOURCE_DATA* initData, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) + { + if (!d3dDevice) + return E_POINTER; + + HRESULT hr = E_FAIL; + + if (forceSRGB) + { + format = MakeSRGB(format); + } + + switch (resDim) + { + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + { + D3D11_TEXTURE1D_DESC desc; + desc.Width = static_cast(width); + desc.MipLevels = static_cast(mipCount); + desc.ArraySize = static_cast(arraySize); + desc.Format = format; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE; + + ID3D11Texture1D* tex = nullptr; + hr = d3dDevice->CreateTexture1D(&desc, + initData, + &tex + ); + if (SUCCEEDED(hr) && tex != 0) + { + if (textureView != 0) + { + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; + SRVDesc.Format = format; + + if (arraySize > 1) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; + SRVDesc.Texture1DArray.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + SRVDesc.Texture1DArray.ArraySize = static_cast(arraySize); + } + else + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; + SRVDesc.Texture1D.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + } + + hr = d3dDevice->CreateShaderResourceView(tex, + &SRVDesc, + textureView + ); + if (FAILED(hr)) + { + tex->Release(); + return hr; + } + } + + if (texture != 0) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); + } + } + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + { + D3D11_TEXTURE2D_DESC desc; + desc.Width = static_cast(width); + desc.Height = static_cast(height); + desc.MipLevels = static_cast(mipCount); + desc.ArraySize = static_cast(arraySize); + desc.Format = format; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + if (isCubeMap) + { + desc.MiscFlags = miscFlags | D3D11_RESOURCE_MISC_TEXTURECUBE; + } + else + { + desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE; + } + + ID3D11Texture2D* tex = nullptr; + hr = d3dDevice->CreateTexture2D(&desc, + initData, + &tex + ); + if (SUCCEEDED(hr) && tex != 0) + { + if (textureView != 0) + { + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; + SRVDesc.Format = format; + + if (isCubeMap) + { + if (arraySize > 6) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; + SRVDesc.TextureCubeArray.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + + // Earlier we set arraySize to (NumCubes * 6) + SRVDesc.TextureCubeArray.NumCubes = static_cast(arraySize / 6); + } + else + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; + SRVDesc.TextureCube.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + } + } + else if (arraySize > 1) + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; + SRVDesc.Texture2DArray.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + SRVDesc.Texture2DArray.ArraySize = static_cast(arraySize); + } + else + { + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.Texture2D.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + } + + hr = d3dDevice->CreateShaderResourceView(tex, + &SRVDesc, + textureView + ); + if (FAILED(hr)) + { + tex->Release(); + return hr; + } + } + + if (texture != 0) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); + } + } + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + { + D3D11_TEXTURE3D_DESC desc; + desc.Width = static_cast(width); + desc.Height = static_cast(height); + desc.Depth = static_cast(depth); + desc.MipLevels = static_cast(mipCount); + desc.Format = format; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE; + + ID3D11Texture3D* tex = nullptr; + hr = d3dDevice->CreateTexture3D(&desc, + initData, + &tex + ); + if (SUCCEEDED(hr) && tex != 0) + { + if (textureView != 0) + { + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; + SRVDesc.Format = format; + + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + SRVDesc.Texture3D.MipLevels = (!mipCount) ? -1 : desc.MipLevels; + + hr = d3dDevice->CreateShaderResourceView(tex, + &SRVDesc, + textureView + ); + if (FAILED(hr)) + { + tex->Release(); + return hr; + } + } + + if (texture != 0) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); + } + } + } + break; + } + + return hr; + } + + //-------------------------------------------------------------------------------------- + HRESULT CreateTextureFromDDS(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, +#if defined(_XBOX_ONE) && defined(_TITLE) + _In_opt_ ID3D11DeviceX* d3dDeviceX, + _In_opt_ ID3D11DeviceContextX* d3dContextX, +#endif + _In_ const DDS_HEADER* header, + _In_reads_bytes_(bitSize) const uint8_t* bitData, + _In_ size_t bitSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ bool forceSRGB, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) + { + HRESULT hr = S_OK; + + UINT width = header->width; + UINT height = header->height; + UINT depth = header->depth; + + uint32_t resDim = D3D11_RESOURCE_DIMENSION_UNKNOWN; + UINT arraySize = 1; + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; + bool isCubeMap = false; + + size_t mipCount = header->mipMapCount; + if (0 == mipCount) + { + mipCount = 1; + } + + if ((header->ddspf.flags & DDS_FOURCC) && + (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC)) + { + auto d3d10ext = reinterpret_cast((const char*)header + sizeof(DDS_HEADER)); + + arraySize = d3d10ext->arraySize; + if (arraySize == 0) + { + return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); + } + + switch (d3d10ext->dxgiFormat) + { + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + case DXGI_FORMAT_A8P8: + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + + default: + if (BitsPerPixel(d3d10ext->dxgiFormat) == 0) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + } + + format = d3d10ext->dxgiFormat; + + switch (d3d10ext->resourceDimension) + { + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + // D3DX writes 1D textures with a fixed Height of 1 + if ((header->flags & DDS_HEIGHT) && height != 1) + { + return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); + } + height = depth = 1; + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + if (d3d10ext->miscFlag & D3D11_RESOURCE_MISC_TEXTURECUBE) + { + arraySize *= 6; + isCubeMap = true; + } + depth = 1; + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + if (!(header->flags & DDS_HEADER_FLAGS_VOLUME)) + { + return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); + } + + if (arraySize > 1) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + break; + + default: + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + + resDim = d3d10ext->resourceDimension; + } + else + { + format = GetDXGIFormat(header->ddspf); + + if (format == DXGI_FORMAT_UNKNOWN) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + + if (header->flags & DDS_HEADER_FLAGS_VOLUME) + { + resDim = D3D11_RESOURCE_DIMENSION_TEXTURE3D; + } + else + { + if (header->caps2 & DDS_CUBEMAP) + { + // We require all six faces to be defined + if ((header->caps2 & DDS_CUBEMAP_ALLFACES) != DDS_CUBEMAP_ALLFACES) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + + arraySize = 6; + isCubeMap = true; + } + + depth = 1; + resDim = D3D11_RESOURCE_DIMENSION_TEXTURE2D; + + // Note there's no way for a legacy Direct3D 9 DDS to express a '1D' texture + } + + assert(BitsPerPixel(format) != 0); + } + + // Bound sizes (for security purposes we don't trust DDS file metadata larger than the Direct3D hardware requirements) + if (mipCount > D3D11_REQ_MIP_LEVELS) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + + switch (resDim) + { + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + if ((arraySize > D3D11_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || + (width > D3D11_REQ_TEXTURE1D_U_DIMENSION)) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + if (isCubeMap) + { + // This is the right bound because we set arraySize to (NumCubes*6) above + if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || + (width > D3D11_REQ_TEXTURECUBE_DIMENSION) || + (height > D3D11_REQ_TEXTURECUBE_DIMENSION)) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + } + else if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || + (width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION) || + (height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION)) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + if ((arraySize > 1) || + (width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || + (height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || + (depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + break; + + default: + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + + bool autogen = false; + if (mipCount == 1 && d3dContext != 0 && textureView != 0) // Must have context and shader-view to auto generate mipmaps + { + // See if format is supported for auto-gen mipmaps (varies by feature level) + UINT fmtSupport = 0; + hr = d3dDevice->CheckFormatSupport(format, &fmtSupport); + if (SUCCEEDED(hr) && (fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN)) + { + // 10level9 feature levels do not support auto-gen mipgen for volume textures + if ((resDim != D3D11_RESOURCE_DIMENSION_TEXTURE3D) + || (d3dDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_10_0)) + { + autogen = true; +#if defined(_XBOX_ONE) && defined(_TITLE) + if (!d3dDeviceX || !d3dContextX) + return E_INVALIDARG; +#endif + } + } + } + + if (autogen) + { + // Create texture with auto-generated mipmaps + ID3D11Resource* tex = nullptr; + hr = CreateD3DResources(d3dDevice, resDim, width, height, depth, 0, arraySize, + format, usage, + bindFlags | D3D11_BIND_RENDER_TARGET, + cpuAccessFlags, + miscFlags | D3D11_RESOURCE_MISC_GENERATE_MIPS, forceSRGB, + isCubeMap, nullptr, &tex, textureView); + if (SUCCEEDED(hr)) + { + size_t numBytes = 0; + size_t rowBytes = 0; + GetSurfaceInfo(width, height, format, &numBytes, &rowBytes, nullptr); + + if (numBytes > bitSize) + { + (*textureView)->Release(); + *textureView = nullptr; + tex->Release(); + return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); + } + + D3D11_SHADER_RESOURCE_VIEW_DESC desc; + (*textureView)->GetDesc(&desc); + + UINT mipLevels = 1; + + switch (desc.ViewDimension) + { + case D3D_SRV_DIMENSION_TEXTURE1D: mipLevels = desc.Texture1D.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE1DARRAY: mipLevels = desc.Texture1DArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE2D: mipLevels = desc.Texture2D.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE2DARRAY: mipLevels = desc.Texture2DArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURECUBE: mipLevels = desc.TextureCube.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURECUBEARRAY:mipLevels = desc.TextureCubeArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE3D: mipLevels = desc.Texture3D.MipLevels; break; + default: + (*textureView)->Release(); + *textureView = nullptr; + tex->Release(); + return E_UNEXPECTED; + } + +#if defined(_XBOX_ONE) && defined(_TITLE) + + std::unique_ptr initData(new (std::nothrow) D3D11_SUBRESOURCE_DATA[arraySize]); + if (!initData) + { + return E_OUTOFMEMORY; + } + + const uint8_t* pSrcBits = bitData; + const uint8_t* pEndBits = bitData + bitSize; + for (UINT item = 0; item < arraySize; ++item) + { + if ((pSrcBits + numBytes) > pEndBits) + { + (*textureView)->Release(); + *textureView = nullptr; + tex->Release(); + return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); + } + + initData[item].pSysMem = pSrcBits; + initData[item].SysMemPitch = static_cast(rowBytes); + initData[item].SysMemSlicePitch = static_cast(numBytes); + pSrcBits += numBytes; + } + + ID3D11Resource* pStaging = nullptr; + switch (resDim) + { + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + { + ID3D11Texture1D *temp = nullptr; + CD3D11_TEXTURE1D_DESC stagingDesc(format, width, arraySize, 1, 0, D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ); + hr = d3dDevice->CreateTexture1D(&stagingDesc, initData.get(), &temp); + if (SUCCEEDED(hr)) + pStaging = temp; + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + { + ID3D11Texture2D *temp = nullptr; + CD3D11_TEXTURE2D_DESC stagingDesc(format, width, height, arraySize, 1, 0, D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ, 1, 0, isCubeMap ? D3D11_RESOURCE_MISC_TEXTURECUBE : 0); + hr = d3dDevice->CreateTexture2D(&stagingDesc, initData.get(), &temp); + if (SUCCEEDED(hr)) + pStaging = temp; + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + { + ID3D11Texture3D *temp = nullptr; + CD3D11_TEXTURE3D_DESC stagingDesc(format, width, height, depth, 1, 0, D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_READ); + hr = d3dDevice->CreateTexture3D(&stagingDesc, initData.get(), &temp); + if (SUCCEEDED(hr)) + pStaging = temp; + } + break; + }; + + if (SUCCEEDED(hr)) + { + for (UINT item = 0; item < arraySize; ++item) + { + UINT res = D3D11CalcSubresource(0, item, mipLevels); + d3dContext->CopySubresourceRegion(tex, res, 0, 0, 0, pStaging, item, nullptr); + } + + UINT64 copyFence = d3dContextX->InsertFence(0); + while (d3dDeviceX->IsFencePending(copyFence)) { SwitchToThread(); } + pStaging->Release(); + } +#else + if (arraySize > 1) + { + const uint8_t* pSrcBits = bitData; + const uint8_t* pEndBits = bitData + bitSize; + for (UINT item = 0; item < arraySize; ++item) + { + if ((pSrcBits + numBytes) > pEndBits) + { + (*textureView)->Release(); + *textureView = nullptr; + tex->Release(); + return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); + } + + UINT res = D3D11CalcSubresource(0, item, mipLevels); + d3dContext->UpdateSubresource(tex, res, nullptr, pSrcBits, static_cast(rowBytes), static_cast(numBytes)); + pSrcBits += numBytes; + } + } + else + { + d3dContext->UpdateSubresource(tex, 0, nullptr, bitData, static_cast(rowBytes), static_cast(numBytes)); + } +#endif + + d3dContext->GenerateMips(*textureView); + + if (texture) + { + *texture = tex; + } + else + { + tex->Release(); + } + } + } + else + { + // Create the texture + std::unique_ptr initData(new (std::nothrow) D3D11_SUBRESOURCE_DATA[mipCount * arraySize]); + if (!initData) + { + return E_OUTOFMEMORY; + } + + size_t skipMip = 0; + size_t twidth = 0; + size_t theight = 0; + size_t tdepth = 0; + hr = FillInitData(width, height, depth, mipCount, arraySize, format, maxsize, bitSize, bitData, + twidth, theight, tdepth, skipMip, initData.get()); + + if (SUCCEEDED(hr)) + { + hr = CreateD3DResources(d3dDevice, resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, + format, usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + isCubeMap, initData.get(), texture, textureView); + + if (FAILED(hr) && !maxsize && (mipCount > 1)) + { + // Retry with a maxsize determined by feature level + switch (d3dDevice->GetFeatureLevel()) + { + case D3D_FEATURE_LEVEL_9_1: + case D3D_FEATURE_LEVEL_9_2: + if (isCubeMap) + { + maxsize = 512 /*D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION*/; + } + else + { + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) + ? 256 /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : 2048 /*D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + } + break; + + case D3D_FEATURE_LEVEL_9_3: + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) + ? 256 /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : 4096 /*D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + break; + + default: // D3D_FEATURE_LEVEL_10_0 & D3D_FEATURE_LEVEL_10_1 + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) + ? 2048 /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : 8192 /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + break; + } + + hr = FillInitData(width, height, depth, mipCount, arraySize, format, maxsize, bitSize, bitData, + twidth, theight, tdepth, skipMip, initData.get()); + if (SUCCEEDED(hr)) + { + hr = CreateD3DResources(d3dDevice, resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, + format, usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + isCubeMap, initData.get(), texture, textureView); + } + } + } + } + + return hr; + } +} // anonymous namespace + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromMemory(ID3D11Device* d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode) +{ + return CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView, alphaMode); +} + +_Use_decl_annotations_ +#if defined(_XBOX_ONE) && defined(_TITLE) + HRESULT DirectX::CreateDDSTextureFromMemory( ID3D11DeviceX* d3dDevice, + ID3D11DeviceContextX* d3dContext, +#else + HRESULT DirectX::CreateDDSTextureFromMemory(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, +#endif + const uint8_t* ddsData, + size_t ddsDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode) +{ + return CreateDDSTextureFromMemoryEx(d3dDevice, d3dContext, ddsData, ddsDataSize, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView, alphaMode); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromMemoryEx(ID3D11Device* d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode) +{ + if (texture) + { + *texture = nullptr; + } + if (textureView) + { + *textureView = nullptr; + } + if (alphaMode) + { + *alphaMode = DDS_ALPHA_MODE_UNKNOWN; + } + + if (!d3dDevice || !ddsData || (!texture && !textureView)) + { + return E_INVALIDARG; + } + + // Validate DDS file in memory + if (ddsDataSize < (sizeof(uint32_t) + sizeof(DDS_HEADER))) + { + return E_FAIL; + } + + uint32_t dwMagicNumber = *(const uint32_t*)(ddsData); + if (dwMagicNumber != DDS_MAGIC) + { + return E_FAIL; + } + + auto header = reinterpret_cast(ddsData + sizeof(uint32_t)); + + // Verify header to validate DDS file + if (header->size != sizeof(DDS_HEADER) || + header->ddspf.size != sizeof(DDS_PIXELFORMAT)) + { + return E_FAIL; + } + + // Check for DX10 extension + bool bDXT10Header = false; + if ((header->ddspf.flags & DDS_FOURCC) && + (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC)) + { + // Must be long enough for both headers and magic value + if (ddsDataSize < (sizeof(DDS_HEADER) + sizeof(uint32_t) + sizeof(DDS_HEADER_DXT10))) + { + return E_FAIL; + } + + bDXT10Header = true; + } + + ptrdiff_t offset = sizeof(uint32_t) + + sizeof(DDS_HEADER) + + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0); + + HRESULT hr = CreateTextureFromDDS(d3dDevice, nullptr, +#if defined(_XBOX_ONE) && defined(_TITLE) + nullptr, nullptr, +#endif + header, ddsData + offset, ddsDataSize - offset, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView); + if (SUCCEEDED(hr)) + { + if (texture != 0 && *texture != 0) + { + SetDebugObjectName(*texture, "DDSTextureLoader"); + } + + if (textureView != 0 && *textureView != 0) + { + SetDebugObjectName(*textureView, "DDSTextureLoader"); + } + + if (alphaMode) + *alphaMode = GetAlphaMode(header); + } + + return hr; +} + +_Use_decl_annotations_ +#if defined(_XBOX_ONE) && defined(_TITLE) + HRESULT DirectX::CreateDDSTextureFromMemoryEx( ID3D11DeviceX* d3dDevice, + ID3D11DeviceContextX* d3dContext, +#else + HRESULT DirectX::CreateDDSTextureFromMemoryEx(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, +#endif + const uint8_t* ddsData, + size_t ddsDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode) +{ + if (texture) + { + *texture = nullptr; + } + if (textureView) + { + *textureView = nullptr; + } + if (alphaMode) + { + *alphaMode = DDS_ALPHA_MODE_UNKNOWN; + } + + if (!d3dDevice || !ddsData || (!texture && !textureView)) + { + return E_INVALIDARG; + } + + // Validate DDS file in memory + if (ddsDataSize < (sizeof(uint32_t) + sizeof(DDS_HEADER))) + { + return E_FAIL; + } + + uint32_t dwMagicNumber = *(const uint32_t*)(ddsData); + if (dwMagicNumber != DDS_MAGIC) + { + return E_FAIL; + } + + auto header = reinterpret_cast(ddsData + sizeof(uint32_t)); + + // Verify header to validate DDS file + if (header->size != sizeof(DDS_HEADER) || + header->ddspf.size != sizeof(DDS_PIXELFORMAT)) + { + return E_FAIL; + } + + // Check for DX10 extension + bool bDXT10Header = false; + if ((header->ddspf.flags & DDS_FOURCC) && + (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC)) + { + // Must be long enough for both headers and magic value + if (ddsDataSize < (sizeof(DDS_HEADER) + sizeof(uint32_t) + sizeof(DDS_HEADER_DXT10))) + { + return E_FAIL; + } + + bDXT10Header = true; + } + + ptrdiff_t offset = sizeof(uint32_t) + + sizeof(DDS_HEADER) + + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0); + + HRESULT hr = CreateTextureFromDDS(d3dDevice, d3dContext, +#if defined(_XBOX_ONE) && defined(_TITLE) + d3dDevice, d3dContext, +#endif + header, ddsData + offset, ddsDataSize - offset, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView); + if (SUCCEEDED(hr)) + { + if (texture != 0 && *texture != 0) + { + SetDebugObjectName(*texture, "DDSTextureLoader"); + } + + if (textureView != 0 && *textureView != 0) + { + SetDebugObjectName(*textureView, "DDSTextureLoader"); + } + + if (alphaMode) + *alphaMode = GetAlphaMode(header); + } + + return hr; +} + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromFile(ID3D11Device* d3dDevice, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode) +{ + return CreateDDSTextureFromFileEx(d3dDevice, fileName, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView, alphaMode); +} + +_Use_decl_annotations_ +#if defined(_XBOX_ONE) && defined(_TITLE) + HRESULT DirectX::CreateDDSTextureFromFile( ID3D11DeviceX* d3dDevice, + ID3D11DeviceContextX* d3dContext, +#else + HRESULT DirectX::CreateDDSTextureFromFile(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, +#endif + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode) +{ + return CreateDDSTextureFromFileEx(d3dDevice, d3dContext, fileName, maxsize, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + texture, textureView, alphaMode); +} + +_Use_decl_annotations_ +HRESULT DirectX::CreateDDSTextureFromFileEx(ID3D11Device* d3dDevice, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode) +{ + if (texture) + { + *texture = nullptr; + } + if (textureView) + { + *textureView = nullptr; + } + if (alphaMode) + { + *alphaMode = DDS_ALPHA_MODE_UNKNOWN; + } + + if (!d3dDevice || !fileName || (!texture && !textureView)) + { + return E_INVALIDARG; + } + + const DDS_HEADER* header = nullptr; + const uint8_t* bitData = nullptr; + size_t bitSize = 0; + + std::unique_ptr ddsData; + HRESULT hr = LoadTextureDataFromFile(fileName, + ddsData, + &header, + &bitData, + &bitSize + ); + if (FAILED(hr)) + { + return hr; + } + + hr = CreateTextureFromDDS(d3dDevice, nullptr, +#if defined(_XBOX_ONE) && defined(_TITLE) + nullptr, nullptr, +#endif + header, bitData, bitSize, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView); + + if (SUCCEEDED(hr)) + { +#if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) + if (texture != 0 || textureView != 0) + { +#if defined(_XBOX_ONE) && defined(_TITLE) + const wchar_t* pstrName = wcsrchr(fileName, '\\'); + if (!pstrName) + { + pstrName = fileName; + } + else + { + pstrName++; + } + if (texture != 0 && *texture != 0) + { + (*texture)->SetName(pstrName); + } + if (textureView != 0 && *textureView != 0) + { + (*textureView)->SetName(pstrName); + } +#else + CHAR strFileA[MAX_PATH]; + int result = WideCharToMultiByte(CP_ACP, + WC_NO_BEST_FIT_CHARS, + fileName, + -1, + strFileA, + MAX_PATH, + nullptr, + FALSE + ); + if (result > 0) + { + const char* pstrName = strrchr(strFileA, '\\'); + if (!pstrName) + { + pstrName = strFileA; + } + else + { + pstrName++; + } + + if (texture != 0 && *texture != 0) + { + (*texture)->SetPrivateData(WKPDID_D3DDebugObjectName, + static_cast(strnlen_s(pstrName, MAX_PATH)), + pstrName + ); + } + + if (textureView != 0 && *textureView != 0) + { + (*textureView)->SetPrivateData(WKPDID_D3DDebugObjectName, + static_cast(strnlen_s(pstrName, MAX_PATH)), + pstrName + ); + } + } +#endif + } +#endif + + if (alphaMode) + *alphaMode = GetAlphaMode(header); + } + + return hr; +} + +_Use_decl_annotations_ +#if defined(_XBOX_ONE) && defined(_TITLE) + HRESULT DirectX::CreateDDSTextureFromFileEx( ID3D11DeviceX* d3dDevice, + ID3D11DeviceContextX* d3dContext, +#else + HRESULT DirectX::CreateDDSTextureFromFileEx(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, +#endif + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + bool forceSRGB, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode) +{ + if (texture) + { + *texture = nullptr; + } + if (textureView) + { + *textureView = nullptr; + } + if (alphaMode) + { + *alphaMode = DDS_ALPHA_MODE_UNKNOWN; + } + + if (!d3dDevice || !fileName || (!texture && !textureView)) + { + return E_INVALIDARG; + } + + const DDS_HEADER* header = nullptr; + const uint8_t* bitData = nullptr; + size_t bitSize = 0; + + std::unique_ptr ddsData; + HRESULT hr = LoadTextureDataFromFile(fileName, + ddsData, + &header, + &bitData, + &bitSize + ); + if (FAILED(hr)) + { + return hr; + } + + hr = CreateTextureFromDDS(d3dDevice, d3dContext, +#if defined(_XBOX_ONE) && defined(_TITLE) + d3dDevice, d3dContext, +#endif + header, bitData, bitSize, maxsize, + usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + texture, textureView); + + if (SUCCEEDED(hr)) + { +#if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) + if (texture != 0 || textureView != 0) + { +#if defined(_XBOX_ONE) && defined(_TITLE) + const wchar_t* pstrName = wcsrchr(fileName, '\\'); + if (!pstrName) + { + pstrName = fileName; + } + else + { + pstrName++; + } + if (texture != 0 && *texture != 0) + { + (*texture)->SetName(pstrName); + } + if (textureView != 0 && *textureView != 0) + { + (*textureView)->SetName(pstrName); + } +#else + CHAR strFileA[MAX_PATH]; + int result = WideCharToMultiByte(CP_ACP, + WC_NO_BEST_FIT_CHARS, + fileName, + -1, + strFileA, + MAX_PATH, + nullptr, + FALSE + ); + if (result > 0) + { + const char* pstrName = strrchr(strFileA, '\\'); + if (!pstrName) + { + pstrName = strFileA; + } + else + { + pstrName++; + } + + if (texture != 0 && *texture != 0) + { + (*texture)->SetPrivateData(WKPDID_D3DDebugObjectName, + static_cast(strnlen_s(pstrName, MAX_PATH)), + pstrName + ); + } + + if (textureView != 0 && *textureView != 0) + { + (*textureView)->SetPrivateData(WKPDID_D3DDebugObjectName, + static_cast(strnlen_s(pstrName, MAX_PATH)), + pstrName + ); + } + } +#endif + } +#endif + + if (alphaMode) + *alphaMode = GetAlphaMode(header); + } + + return hr; +} diff --git a/DirectXTK/Src/DGSLEffect.cpp b/DirectXTK/Src/DGSLEffect.cpp new file mode 100644 index 0000000..6ac9aeb --- /dev/null +++ b/DirectXTK/Src/DGSLEffect.cpp @@ -0,0 +1,941 @@ +//-------------------------------------------------------------------------------------- +// File: DGSLEffect.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "EffectCommon.h" +#include "DemandCreate.h" + +// +// Based on the Visual Studio 3D Starter Kit +// +// http://aka.ms/vs3dkit +// + +namespace DirectX +{ + +namespace EffectDirtyFlags +{ + const int ConstantBufferMaterial = 0x10000; + const int ConstantBufferLight = 0x20000; + const int ConstantBufferObject = 0x40000; + const int ConstantBufferMisc = 0x80000; + const int ConstantBufferBones = 0x100000; +} + +} + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + +// Constant buffer layout. Must match the shader! +#pragma pack(push,1) + +// Slot 0 +struct MaterialConstants +{ + XMVECTOR Ambient; + XMVECTOR Diffuse; + XMVECTOR Specular; + XMVECTOR Emissive; + float SpecularPower; + float Padding0; + float Padding1; + float Padding2; +}; + +// Slot 1 +struct LightConstants +{ + XMVECTOR Ambient; + XMVECTOR LightColor[DGSLEffect::MaxDirectionalLights]; + XMVECTOR LightAttenuation[DGSLEffect::MaxDirectionalLights]; + XMVECTOR LightDirection[DGSLEffect::MaxDirectionalLights]; + XMVECTOR LightSpecularIntensity[DGSLEffect::MaxDirectionalLights]; + UINT IsPointLight[DGSLEffect::MaxDirectionalLights]; + UINT ActiveLights; + float Padding0; + float Padding1; + float Padding2; +}; + +// Note - DGSL does not appear to make use of LightAttenuation or IsPointLight. Not sure if it uses ActiveLights either. + +// Slot 2 +struct ObjectConstants +{ + XMMATRIX LocalToWorld4x4; + XMMATRIX LocalToProjected4x4; + XMMATRIX WorldToLocal4x4; + XMMATRIX WorldToView4x4; + XMMATRIX UvTransform4x4; + XMVECTOR EyePosition; +}; + +// Slot 3 +struct MiscConstants +{ + float ViewportWidth; + float ViewportHeight; + float Time; + float Padding1; +}; + +// Slot 4 +struct BoneConstants +{ + XMVECTOR Bones[DGSLEffect::MaxBones][3]; +}; + +#pragma pack(pop) + +static_assert( ( sizeof(MaterialConstants) % 16 ) == 0, "CB size not padded correctly" ); +static_assert( ( sizeof(LightConstants) % 16 ) == 0, "CB size not padded correctly" ); +static_assert( ( sizeof(ObjectConstants) % 16 ) == 0, "CB size not padded correctly" ); +static_assert( ( sizeof(MiscConstants) % 16 ) == 0, "CB size not padded correctly" ); +static_assert( ( sizeof(BoneConstants) % 16 ) == 0, "CB size not padded correctly" ); + +__declspec(align(16)) struct DGSLEffectConstants +{ + MaterialConstants material; + LightConstants light; + ObjectConstants object; + MiscConstants misc; + BoneConstants bones; +}; + +struct DGSLEffectTraits +{ + static const int VertexShaderCount = 8; + static const int PixelShaderCount = 12; + + static const ShaderBytecode VertexShaderBytecode[VertexShaderCount]; + static const ShaderBytecode PixelShaderBytecode[PixelShaderCount]; +}; + + +// Include the precompiled shader code. +namespace +{ +#if defined(_XBOX_ONE) && defined(_TITLE) + // VS + #include "Shaders/Compiled/XboxOneDGSLEffect_main.inc" + #include "Shaders/Compiled/XboxOneDGSLEffect_mainVc.inc" + #include "Shaders/Compiled/XboxOneDGSLEffect_main1Bones.inc" + #include "Shaders/Compiled/XboxOneDGSLEffect_main1BonesVc.inc" + #include "Shaders/Compiled/XboxOneDGSLEffect_main2Bones.inc" + #include "Shaders/Compiled/XboxOneDGSLEffect_main2BonesVc.inc" + #include "Shaders/Compiled/XboxOneDGSLEffect_main4Bones.inc" + #include "Shaders/Compiled/XboxOneDGSLEffect_main4BonesVc.inc" + + // PS + #include "Shaders/Compiled/XboxOneDGSLUnlit_main.inc" + #include "Shaders/Compiled/XboxOneDGSLLambert_main.inc" + #include "Shaders/Compiled/XboxOneDGSLPhong_main.inc" + + #include "Shaders/Compiled/XboxOneDGSLUnlit_mainTk.inc" + #include "Shaders/Compiled/XboxOneDGSLLambert_mainTk.inc" + #include "Shaders/Compiled/XboxOneDGSLPhong_mainTk.inc" + + #include "Shaders/Compiled/XboxOneDGSLUnlit_mainTx.inc" + #include "Shaders/Compiled/XboxOneDGSLLambert_mainTx.inc" + #include "Shaders/Compiled/XboxOneDGSLPhong_mainTx.inc" + + #include "Shaders/Compiled/XboxOneDGSLUnlit_mainTxTk.inc" + #include "Shaders/Compiled/XboxOneDGSLLambert_mainTxTk.inc" + #include "Shaders/Compiled/XboxOneDGSLPhong_mainTxTk.inc" +#else + // VS + #include "Shaders/Compiled/DGSLEffect_main.inc" + #include "Shaders/Compiled/DGSLEffect_mainVc.inc" + #include "Shaders/Compiled/DGSLEffect_main1Bones.inc" + #include "Shaders/Compiled/DGSLEffect_main1BonesVc.inc" + #include "Shaders/Compiled/DGSLEffect_main2Bones.inc" + #include "Shaders/Compiled/DGSLEffect_main2BonesVc.inc" + #include "Shaders/Compiled/DGSLEffect_main4Bones.inc" + #include "Shaders/Compiled/DGSLEffect_main4BonesVc.inc" + + // PS + #include "Shaders/Compiled/DGSLUnlit_main.inc" + #include "Shaders/Compiled/DGSLLambert_main.inc" + #include "Shaders/Compiled/DGSLPhong_main.inc" + + #include "Shaders/Compiled/DGSLUnlit_mainTk.inc" + #include "Shaders/Compiled/DGSLLambert_mainTk.inc" + #include "Shaders/Compiled/DGSLPhong_mainTk.inc" + + #include "Shaders/Compiled/DGSLUnlit_mainTx.inc" + #include "Shaders/Compiled/DGSLLambert_mainTx.inc" + #include "Shaders/Compiled/DGSLPhong_mainTx.inc" + + #include "Shaders/Compiled/DGSLUnlit_mainTxTk.inc" + #include "Shaders/Compiled/DGSLLambert_mainTxTk.inc" + #include "Shaders/Compiled/DGSLPhong_mainTxTk.inc" +#endif +} + + +const ShaderBytecode DGSLEffectTraits::VertexShaderBytecode[] = +{ + { DGSLEffect_main, sizeof(DGSLEffect_main) }, + { DGSLEffect_mainVc, sizeof(DGSLEffect_mainVc) }, + { DGSLEffect_main1Bones, sizeof(DGSLEffect_main1Bones) }, + { DGSLEffect_main1BonesVc, sizeof(DGSLEffect_main1BonesVc) }, + { DGSLEffect_main2Bones, sizeof(DGSLEffect_main2Bones) }, + { DGSLEffect_main2BonesVc, sizeof(DGSLEffect_main2BonesVc) }, + { DGSLEffect_main4Bones, sizeof(DGSLEffect_main4Bones) }, + { DGSLEffect_main4BonesVc, sizeof(DGSLEffect_main4BonesVc) }, +}; + + +const ShaderBytecode DGSLEffectTraits::PixelShaderBytecode[] = +{ + { DGSLUnlit_main, sizeof(DGSLUnlit_main) }, // UNLIT (no texture) + { DGSLLambert_main, sizeof(DGSLLambert_main) }, // LAMBERT (no texture) + { DGSLPhong_main, sizeof(DGSLPhong_main) }, // PHONG (no texture) + + { DGSLUnlit_mainTx, sizeof(DGSLUnlit_mainTx) }, // UNLIT (textured) + { DGSLLambert_mainTx, sizeof(DGSLLambert_mainTx) }, // LAMBERT (textured) + { DGSLPhong_mainTx, sizeof(DGSLPhong_mainTx) }, // PHONG (textured) + + { DGSLUnlit_mainTk, sizeof(DGSLUnlit_mainTk) }, // UNLIT (no texture, discard) + { DGSLLambert_mainTk, sizeof(DGSLLambert_mainTk) }, // LAMBERT (no texture, discard) + { DGSLPhong_mainTk, sizeof(DGSLPhong_mainTk) }, // PHONG (no texture, discard) + + { DGSLUnlit_mainTxTk, sizeof(DGSLUnlit_mainTxTk) }, // UNLIT (textured, discard) + { DGSLLambert_mainTxTk, sizeof(DGSLLambert_mainTxTk) }, // LAMBERT (textured, discard) + { DGSLPhong_mainTxTk, sizeof(DGSLPhong_mainTxTk) }, // PHONG (textured, discard) +}; + + +class DGSLEffect::Impl : public AlignedNew +{ +public: + Impl( _In_ ID3D11Device* device, _In_opt_ ID3D11PixelShader* pixelShader, _In_ bool enableSkinning ) : + dirtyFlags( INT_MAX ), + vertexColorEnabled(false), + textureEnabled(false), + specularEnabled(false), + alphaDiscardEnabled(false), + weightsPerVertex( enableSkinning ? 4 : 0 ), + mCBMaterial( device ), + mCBLight( device ), + mCBObject( device ), + mCBMisc( device ), + mPixelShader( pixelShader ), + mDeviceResources( deviceResourcesPool.DemandCreate(device) ) + { + static_assert( _countof(DGSLEffectTraits::VertexShaderBytecode) == DGSLEffectTraits::VertexShaderCount, "array/max mismatch" ); + static_assert( _countof(DGSLEffectTraits::PixelShaderBytecode) == DGSLEffectTraits::PixelShaderCount, "array/max mismatch" ); + + memset( &constants, 0, sizeof(constants) ); + + XMMATRIX id = XMMatrixIdentity(); + world = id; + view = id; + projection = id; + constants.material.Diffuse = g_XMOne; + constants.material.Specular = g_XMOne; + constants.material.SpecularPower = 16; + constants.object.UvTransform4x4 = id; + + static_assert( MaxDirectionalLights == 4, "Mismatch with DGSL pipline" ); + for( int i = 0; i < MaxDirectionalLights; ++i ) + { + lightEnabled[i] = (i == 0); + lightDiffuseColor[i] = g_XMZero; + lightSpecularColor[i] = g_XMOne; + + constants.light.LightDirection[i] = g_XMNegIdentityR1; + constants.light.LightColor[i] = lightEnabled[i] ? lightDiffuseColor[i] : g_XMZero; + constants.light.LightSpecularIntensity[i] = lightEnabled[i] ? lightSpecularColor[i] : g_XMZero; + } + + if ( enableSkinning ) + { + mCBBone.Create( device ); + + for( size_t j = 0; j < MaxBones; ++j ) + { + constants.bones.Bones[ j ][0] = g_XMIdentityR0; + constants.bones.Bones[ j ][1] = g_XMIdentityR1; + constants.bones.Bones[ j ][2] = g_XMIdentityR2; + } + } + } + + // Methods + void Apply( _In_ ID3D11DeviceContext* deviceContext ); + void GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength); + + // Fields + DGSLEffectConstants constants; + + XMMATRIX world; + XMMATRIX view; + XMMATRIX projection; + + bool lightEnabled[MaxDirectionalLights]; + XMVECTOR lightDiffuseColor[MaxDirectionalLights]; + XMVECTOR lightSpecularColor[MaxDirectionalLights]; + + ComPtr textures[MaxTextures]; + + int dirtyFlags; + + bool vertexColorEnabled; + bool textureEnabled; + bool specularEnabled; + bool alphaDiscardEnabled; + int weightsPerVertex; + +private: + ConstantBuffer mCBMaterial; + ConstantBuffer mCBLight; + ConstantBuffer mCBObject; + ConstantBuffer mCBMisc; + ConstantBuffer mCBBone; + ComPtr mPixelShader; + + int GetCurrentVSPermutation() const; + int GetCurrentPSPermutation() const; + + // Only one of these helpers is allocated per D3D device, even if there are multiple effect instances. + class DeviceResources : protected EffectDeviceResources + { + public: + DeviceResources(_In_ ID3D11Device* device) : EffectDeviceResources(device) {} + + // Gets or lazily creates the vertex shader. + ID3D11VertexShader* GetVertexShader( int permutation ) + { + assert(permutation >= 0 && permutation < DGSLEffectTraits::VertexShaderCount); + + return DemandCreateVertexShader(mVertexShaders[permutation], DGSLEffectTraits::VertexShaderBytecode[permutation]); + } + + // Gets or lazily creates the specified pixel shader permutation. + ID3D11PixelShader* GetPixelShader( int permutation ) + { + assert(permutation >= 0 && permutation < DGSLEffectTraits::PixelShaderCount); + + return DemandCreatePixelShader(mPixelShaders[permutation], DGSLEffectTraits::PixelShaderBytecode[permutation]); + } + + // Gets or lazily creates the default texture + ID3D11ShaderResourceView* GetDefaultTexture() { return EffectDeviceResources::GetDefaultTexture(); } + + + private: + ComPtr mVertexShaders[DGSLEffectTraits::VertexShaderCount]; + ComPtr mPixelShaders[DGSLEffectTraits::PixelShaderCount]; + ComPtr mDefaultTexture; + }; + + // Per-device resources. + std::shared_ptr mDeviceResources; + + static SharedResourcePool deviceResourcesPool; +}; + + +SharedResourcePool DGSLEffect::Impl::deviceResourcesPool; + + +void DGSLEffect::Impl::Apply( _In_ ID3D11DeviceContext* deviceContext ) +{ + auto vertexShader = mDeviceResources->GetVertexShader( GetCurrentVSPermutation() ); + auto pixelShader = mPixelShader.Get(); + if( !pixelShader ) + { + pixelShader = mDeviceResources->GetPixelShader( GetCurrentPSPermutation() ); + } + + deviceContext->VSSetShader( vertexShader, nullptr, 0 ); + deviceContext->PSSetShader( pixelShader, nullptr, 0 ); + + // Check for any required matrices updates + if (dirtyFlags & EffectDirtyFlags::WorldViewProj) + { + constants.object.LocalToWorld4x4 = XMMatrixTranspose( world ); + constants.object.WorldToView4x4 = XMMatrixTranspose( view ); + + XMMATRIX worldView = XMMatrixMultiply( world, view ); + + constants.object.LocalToProjected4x4 = XMMatrixTranspose( XMMatrixMultiply( worldView, projection ) ); + + dirtyFlags &= ~EffectDirtyFlags::WorldViewProj; + dirtyFlags |= EffectDirtyFlags::ConstantBufferObject; + } + + if (dirtyFlags & EffectDirtyFlags::WorldInverseTranspose) + { + XMMATRIX worldInverse = XMMatrixInverse( nullptr, world ); + + constants.object.WorldToLocal4x4 = XMMatrixTranspose( worldInverse ); + + dirtyFlags &= ~EffectDirtyFlags::WorldInverseTranspose; + dirtyFlags |= EffectDirtyFlags::ConstantBufferObject; + } + + if (dirtyFlags & EffectDirtyFlags::EyePosition) + { + XMMATRIX viewInverse = XMMatrixInverse( nullptr, view ); + + constants.object.EyePosition = viewInverse.r[3]; + + dirtyFlags &= ~EffectDirtyFlags::EyePosition; + dirtyFlags |= EffectDirtyFlags::ConstantBufferObject; + } + +#if defined(_XBOX_ONE) && defined(_TITLE) + void* grfxMemoryMaterial; + mCBMaterial.SetData(deviceContext, constants.material, &grfxMemoryMaterial); + + void* grfxMemoryLight; + mCBLight.SetData(deviceContext, constants.light, &grfxMemoryLight); + + void* grfxMemoryObject; + mCBObject.SetData(deviceContext, constants.object, &grfxMemoryObject); + + void *grfxMemoryMisc; + mCBMisc.SetData(deviceContext, constants.misc, &grfxMemoryMisc); + + ComPtr deviceContextX; + ThrowIfFailed(deviceContext->QueryInterface(IID_GRAPHICS_PPV_ARGS(deviceContextX.GetAddressOf()))); + + auto buffer = mCBMaterial.GetBuffer(); + deviceContextX->VSSetPlacementConstantBuffer( 0, buffer, grfxMemoryMaterial ); + deviceContextX->PSSetPlacementConstantBuffer( 0, buffer, grfxMemoryMaterial ); + + buffer = mCBLight.GetBuffer(); + deviceContextX->VSSetPlacementConstantBuffer( 1, buffer, grfxMemoryMaterial ); + deviceContextX->PSSetPlacementConstantBuffer( 1, buffer, grfxMemoryMaterial ); + + buffer = mCBObject.GetBuffer(); + deviceContextX->VSSetPlacementConstantBuffer( 2, buffer, grfxMemoryObject ); + deviceContextX->PSSetPlacementConstantBuffer( 2, buffer, grfxMemoryObject ); + + buffer = mCBMisc.GetBuffer(); + deviceContextX->VSSetPlacementConstantBuffer( 3, buffer, grfxMemoryMisc ); + deviceContextX->PSSetPlacementConstantBuffer( 3, buffer, grfxMemoryMisc ); + + if ( weightsPerVertex > 0 ) + { + void* grfxMemoryBone; + mCBBone.SetData(deviceContext, constants.bones, &grfxMemoryBone); + + deviceContextX->VSSetPlacementConstantBuffer( 4, mCBBone.GetBuffer(), grfxMemoryBone ); + } +#else + // Make sure the constant buffers are up to date. + if (dirtyFlags & EffectDirtyFlags::ConstantBufferMaterial) + { + mCBMaterial.SetData(deviceContext, constants.material); + + dirtyFlags &= ~EffectDirtyFlags::ConstantBufferMaterial; + } + + if (dirtyFlags & EffectDirtyFlags::ConstantBufferLight) + { + mCBLight.SetData(deviceContext, constants.light); + + dirtyFlags &= ~EffectDirtyFlags::ConstantBufferLight; + } + + if (dirtyFlags & EffectDirtyFlags::ConstantBufferObject) + { + mCBObject.SetData(deviceContext, constants.object); + + dirtyFlags &= ~EffectDirtyFlags::ConstantBufferObject; + } + + if (dirtyFlags & EffectDirtyFlags::ConstantBufferMisc) + { + mCBMisc.SetData(deviceContext, constants.misc); + + dirtyFlags &= ~EffectDirtyFlags::ConstantBufferMisc; + } + + if ( weightsPerVertex > 0 ) + { + if (dirtyFlags & EffectDirtyFlags::ConstantBufferBones) + { + mCBBone.SetData(deviceContext, constants.bones); + + dirtyFlags &= ~EffectDirtyFlags::ConstantBufferBones; + } + + ID3D11Buffer* buffers[5] = { mCBMaterial.GetBuffer(), mCBLight.GetBuffer(), mCBObject.GetBuffer(), + mCBMisc.GetBuffer(), mCBBone.GetBuffer() }; + + deviceContext->VSSetConstantBuffers( 0, 5, buffers ); + deviceContext->PSSetConstantBuffers( 0, 4, buffers ); + } + else + { + ID3D11Buffer* buffers[4] = { mCBMaterial.GetBuffer(), mCBLight.GetBuffer(), mCBObject.GetBuffer(), mCBMisc.GetBuffer() }; + + deviceContext->VSSetConstantBuffers( 0, 4, buffers ); + deviceContext->PSSetConstantBuffers( 0, 4, buffers ); + } +#endif + + // Set the textures + if ( textureEnabled ) + { + ID3D11ShaderResourceView* txt[MaxTextures] = { textures[0].Get(), textures[1].Get(), textures[2].Get(), textures[3].Get(), + textures[4].Get(), textures[5].Get(), textures[6].Get(), textures[7].Get() }; + deviceContext->PSSetShaderResources( 0, MaxTextures, txt ); + } + else + { + ID3D11ShaderResourceView* txt[MaxTextures] = { mDeviceResources->GetDefaultTexture(), 0 }; + deviceContext->PSSetShaderResources( 0, MaxTextures, txt ); + } +} + + +void DGSLEffect::Impl::GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) +{ + int permutation = GetCurrentVSPermutation(); + + assert( permutation < DGSLEffectTraits::VertexShaderCount ); + _Analysis_assume_( permutation < DGSLEffectTraits::VertexShaderCount ); + + auto shader = DGSLEffectTraits::VertexShaderBytecode[permutation]; + *pShaderByteCode = shader.code; + *pByteCodeLength = shader.length; +} + + +int DGSLEffect::Impl::GetCurrentVSPermutation() const +{ + int permutation = (vertexColorEnabled) ? 1 : 0; + + if( weightsPerVertex > 0 ) + { + // Evaluate 1, 2, or 4 weights per vertex? + permutation += 2; + + if (weightsPerVertex == 2) + { + permutation += 2; + } + else if (weightsPerVertex == 4) + { + permutation += 4; + } + } + + return permutation; +} + + +int DGSLEffect::Impl::GetCurrentPSPermutation() const +{ + int permutation = 0; + + if ( constants.light.ActiveLights > 0 ) + { + permutation = ( specularEnabled ) ? 2 : 1; + } + + if ( textureEnabled ) + permutation += 3; + + if ( alphaDiscardEnabled ) + permutation += 6; + + return permutation; +} + + + +//-------------------------------------------------------------------------------------- +// DGSLEffect +//-------------------------------------------------------------------------------------- + +DGSLEffect::DGSLEffect(_In_ ID3D11Device* device, _In_opt_ ID3D11PixelShader* pixelShader, _In_ bool enableSkinning) + : pImpl(new Impl(device, pixelShader, enableSkinning)) +{ +} + + +DGSLEffect::DGSLEffect(DGSLEffect&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +DGSLEffect& DGSLEffect::operator= (DGSLEffect&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +DGSLEffect::~DGSLEffect() +{ +} + + +// IEffect methods. +void DGSLEffect::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + pImpl->Apply(deviceContext); +} + + +void DGSLEffect::GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) +{ + pImpl->GetVertexShaderBytecode( pShaderByteCode, pByteCodeLength ); +} + + +// Camera settings. +void XM_CALLCONV DGSLEffect::SetWorld(FXMMATRIX value) +{ + pImpl->world = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose; +} + + +void XM_CALLCONV DGSLEffect::SetView(FXMMATRIX value) +{ + pImpl->view = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::EyePosition; +} + + +void XM_CALLCONV DGSLEffect::SetProjection(FXMMATRIX value) +{ + pImpl->projection = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj; +} + + +void XM_CALLCONV DGSLEffect::SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) +{ + pImpl->world = world; + pImpl->view = view; + pImpl->projection = projection; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::EyePosition; +} + + +// Material settings. +void XM_CALLCONV DGSLEffect::SetAmbientColor(FXMVECTOR value) +{ + pImpl->constants.material.Ambient = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMaterial; +} + + +void XM_CALLCONV DGSLEffect::SetDiffuseColor(FXMVECTOR value) +{ + pImpl->constants.material.Diffuse = XMVectorSelect(pImpl->constants.material.Diffuse, value, g_XMSelect1110); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMaterial; +} + + +void XM_CALLCONV DGSLEffect::SetEmissiveColor(FXMVECTOR value) +{ + pImpl->constants.material.Emissive = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMaterial; +} + + +void XM_CALLCONV DGSLEffect::SetSpecularColor(FXMVECTOR value) +{ + pImpl->specularEnabled = true; + pImpl->constants.material.Specular = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMaterial; +} + + +void DGSLEffect::SetSpecularPower(float value) +{ + pImpl->specularEnabled = true; + pImpl->constants.material.SpecularPower = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMaterial; +} + + +void DGSLEffect::DisableSpecular() +{ + pImpl->specularEnabled = false; + pImpl->constants.material.Specular = g_XMZero; + pImpl->constants.material.SpecularPower = 1.f; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMaterial; +} + + +void DGSLEffect::SetAlpha(float value) +{ + // Set w to new value, but preserve existing xyz (diffuse color). + pImpl->constants.material.Diffuse = XMVectorSetW(pImpl->constants.material.Diffuse, value); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMaterial; +} + + +void XM_CALLCONV DGSLEffect::SetColorAndAlpha(FXMVECTOR value) +{ + pImpl->constants.material.Diffuse = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMaterial; +} + + +// Additional settings. +void XM_CALLCONV DGSLEffect::SetUVTransform(FXMMATRIX value) +{ + pImpl->constants.object.UvTransform4x4 = XMMatrixTranspose( value ); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferObject; +} + + +void DGSLEffect::SetViewport( float width, float height ) +{ + pImpl->constants.misc.ViewportWidth = width; + pImpl->constants.misc.ViewportHeight = height; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMisc; +} + + +void DGSLEffect::SetTime( float time ) +{ + pImpl->constants.misc.Time = time; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferMisc; +} + + +void DGSLEffect::SetAlphaDiscardEnable(bool value) +{ + pImpl->alphaDiscardEnabled = value; +} + + +// Light settings. +void DGSLEffect::SetLightingEnabled(bool value) +{ + if (value) + { + if ( !pImpl->constants.light.ActiveLights ) + pImpl->constants.light.ActiveLights = 1; + } + else + { + pImpl->constants.light.ActiveLights = 0; + } + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferLight; +} + + +void DGSLEffect::SetPerPixelLighting(bool) +{ + // Unsupported interface method. +} + + +void XM_CALLCONV DGSLEffect::SetAmbientLightColor(FXMVECTOR value) +{ + pImpl->constants.light.Ambient = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferLight; +} + + +void DGSLEffect::SetLightEnabled(int whichLight, bool value) +{ + if ( whichLight < 0 || whichLight >= MaxDirectionalLights ) + throw std::out_of_range("whichLight parameter out of range"); + + if ( pImpl->lightEnabled[whichLight] == value ) + return; + + pImpl->lightEnabled[whichLight] = value; + + if ( value ) + { + if ( whichLight >= (int)pImpl->constants.light.ActiveLights ) + pImpl->constants.light.ActiveLights = static_cast( whichLight + 1 ); + + pImpl->constants.light.LightColor[whichLight] = pImpl->lightDiffuseColor[whichLight]; + pImpl->constants.light.LightSpecularIntensity[whichLight] = pImpl->lightSpecularColor[whichLight]; + } + else + { + pImpl->constants.light.LightColor[whichLight] = + pImpl->constants.light.LightSpecularIntensity[whichLight] = g_XMZero; + } + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferLight; +} + + +void XM_CALLCONV DGSLEffect::SetLightDirection(int whichLight, FXMVECTOR value) +{ + if ( whichLight < 0 || whichLight >= MaxDirectionalLights ) + throw std::out_of_range("whichLight parameter out of range"); + + // DGSL effects lights do not negate the direction like BasicEffect + pImpl->constants.light.LightDirection[whichLight] = XMVectorNegate( value ); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferLight; +} + + +void XM_CALLCONV DGSLEffect::SetLightDiffuseColor(int whichLight, FXMVECTOR value) +{ + if ( whichLight < 0 || whichLight >= MaxDirectionalLights ) + throw std::out_of_range("whichLight parameter out of range"); + + pImpl->lightDiffuseColor[whichLight] = value; + + if ( pImpl->lightEnabled[whichLight] ) + { + pImpl->constants.light.LightColor[whichLight] = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferLight; + } +} + + +void XM_CALLCONV DGSLEffect::SetLightSpecularColor(int whichLight, FXMVECTOR value) +{ + if ( whichLight < 0 || whichLight >= MaxDirectionalLights ) + throw std::out_of_range("whichLight parameter out of range"); + + pImpl->lightSpecularColor[whichLight] = value; + + if ( pImpl->lightEnabled[whichLight] ) + { + pImpl->constants.light.LightSpecularIntensity[whichLight] = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferLight; + } +} + + +void DGSLEffect::EnableDefaultLighting() +{ + EffectLights::EnableDefaultLighting(this); +} + + +// Vertex color setting. +void DGSLEffect::SetVertexColorEnabled(bool value) +{ + pImpl->vertexColorEnabled = value; +} + + +// Texture settings. +void DGSLEffect::SetTextureEnabled(bool value) +{ + pImpl->textureEnabled = value; +} + + +void DGSLEffect::SetTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->textures[0] = value; +} + +void DGSLEffect::SetTexture(int whichTexture, _In_opt_ ID3D11ShaderResourceView* value) +{ + if ( whichTexture < 0 || whichTexture >= MaxTextures ) + throw std::out_of_range("whichTexture parameter out of range"); + + pImpl->textures[ whichTexture ] = value; +} + + +// Animation settings. +void DGSLEffect::SetWeightsPerVertex(int value) +{ + if ( !pImpl->weightsPerVertex ) + { + // Safe to ignore since it's only an optimization hint + return; + } + + if ((value != 1) && + (value != 2) && + (value != 4)) + { + throw std::out_of_range("WeightsPerVertex must be 1, 2, or 4"); + } + + pImpl->weightsPerVertex = value; +} + + +void DGSLEffect::SetBoneTransforms(_In_reads_(count) XMMATRIX const* value, size_t count) +{ + if ( !pImpl->weightsPerVertex ) + throw std::exception("Skinning not enabled for this effect"); + + if (count > MaxBones) + throw std::out_of_range("count parameter out of range"); + + auto boneConstant = pImpl->constants.bones.Bones; + + for (size_t i = 0; i < count; i++) + { + XMMATRIX boneMatrix = XMMatrixTranspose(value[i]); + + boneConstant[i][0] = boneMatrix.r[0]; + boneConstant[i][1] = boneMatrix.r[1]; + boneConstant[i][2] = boneMatrix.r[2]; + } + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferBones; +} + + +void DGSLEffect::ResetBoneTransforms() +{ + if ( !pImpl->weightsPerVertex ) + { + // Safe to ignore since it just returns things back to default settings + return; + } + + auto boneConstant = pImpl->constants.bones.Bones; + + for(size_t i = 0; i < MaxBones; ++i) + { + boneConstant[i][0] = g_XMIdentityR0; + boneConstant[i][1] = g_XMIdentityR1; + boneConstant[i][2] = g_XMIdentityR2; + } + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBufferBones; +} diff --git a/DirectXTK/Src/DGSLEffectFactory.cpp b/DirectXTK/Src/DGSLEffectFactory.cpp new file mode 100644 index 0000000..3baacf1 --- /dev/null +++ b/DirectXTK/Src/DGSLEffectFactory.cpp @@ -0,0 +1,591 @@ +//-------------------------------------------------------------------------------------- +// File: DGSLEffectFactory.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Effects.h" +#include "DemandCreate.h" +#include "SharedResourcePool.h" + +#include "DDSTextureLoader.h" +#include "WICTextureLoader.h" + +#include + +#include "BinaryReader.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + +#if defined(_MSC_VER) && (_MSC_VER >= 1900) +static_assert(DGSLEffect::MaxTextures == DGSLEffectFactory::DGSLEffectInfo::BaseTextureOffset + _countof(DGSLEffectFactory::DGSLEffectInfo::textures), "DGSL supports 8 textures"); +#endif + +// Internal DGSLEffectFactory implementation class. Only one of these helpers is allocated +// per D3D device, even if there are multiple public facing DGSLEffectFactory instances. +class DGSLEffectFactory::Impl +{ +public: + Impl(_In_ ID3D11Device* device) + : mPath{}, + device(device), + mSharing(true), + mForceSRGB(false) + {} + + std::shared_ptr CreateEffect( _In_ DGSLEffectFactory* factory, _In_ const IEffectFactory::EffectInfo& info, _In_opt_ ID3D11DeviceContext* deviceContext ); + std::shared_ptr CreateDGSLEffect( _In_ DGSLEffectFactory* factory, _In_ const DGSLEffectInfo& info, _In_opt_ ID3D11DeviceContext* deviceContext ); + void CreateTexture( _In_z_ const wchar_t* texture, _In_opt_ ID3D11DeviceContext* deviceContext, _Outptr_ ID3D11ShaderResourceView** textureView ); + void CreatePixelShader( _In_z_ const wchar_t* shader, _Outptr_ ID3D11PixelShader** pixelShader ); + + void ReleaseCache(); + void SetSharing( bool enabled ) { mSharing = enabled; } + void EnableForceSRGB(bool forceSRGB) { mForceSRGB = forceSRGB; } + + static SharedResourcePool instancePool; + + wchar_t mPath[MAX_PATH]; + +private: + ComPtr device; + + typedef std::map< std::wstring, std::shared_ptr > EffectCache; + typedef std::map< std::wstring, ComPtr > TextureCache; + typedef std::map< std::wstring, ComPtr > ShaderCache; + + EffectCache mEffectCache; + EffectCache mEffectCacheSkinning; + TextureCache mTextureCache; + ShaderCache mShaderCache; + + bool mSharing; + bool mForceSRGB; + + std::mutex mutex; +}; + + +// Global instance pool. +SharedResourcePool DGSLEffectFactory::Impl::instancePool; + + +_Use_decl_annotations_ +std::shared_ptr DGSLEffectFactory::Impl::CreateEffect( DGSLEffectFactory* factory, const DGSLEffectFactory::EffectInfo& info, ID3D11DeviceContext* deviceContext ) +{ + if ( info.enableDualTexture ) + { + throw std::exception( "DGSLEffect does not support multiple texcoords" ); + } + + if ( mSharing && info.name && *info.name ) + { + if ( info.enableSkinning ) + { + auto it = mEffectCacheSkinning.find( info.name ); + if ( it != mEffectCacheSkinning.end() ) + { + return it->second; + } + } + else + { + auto it = mEffectCache.find( info.name ); + if ( it != mEffectCache.end() ) + { + return it->second; + } + } + } + + auto effect = std::make_shared( device.Get(), nullptr, info.enableSkinning ); + + effect->EnableDefaultLighting(); + effect->SetLightingEnabled(true); + + XMVECTOR color = XMLoadFloat3( &info.ambientColor ); + effect->SetAmbientColor( color ); + + color = XMLoadFloat3( &info.diffuseColor ); + effect->SetDiffuseColor( color ); + + effect->SetAlpha( info.alpha ); + + if ( info.perVertexColor ) + { + effect->SetVertexColorEnabled( true ); + } + + if ( info.specularColor.x != 0 || info.specularColor.y != 0 || info.specularColor.z != 0 ) + { + color = XMLoadFloat3( &info.specularColor ); + effect->SetSpecularColor( color ); + effect->SetSpecularPower( info.specularPower ); + } + + if ( info.emissiveColor.x != 0 || info.emissiveColor.y != 0 || info.emissiveColor.z != 0 ) + { + color = XMLoadFloat3( &info.emissiveColor ); + effect->SetEmissiveColor( color ); + } + + if ( info.diffuseTexture && *info.diffuseTexture ) + { + ComPtr srv; + + factory->CreateTexture( info.diffuseTexture, deviceContext, srv.GetAddressOf() ); + + effect->SetTexture( srv.Get() ); + effect->SetTextureEnabled(true); + } + + if ( mSharing && info.name && *info.name ) + { + std::lock_guard lock(mutex); + if ( info.enableSkinning ) + { + mEffectCacheSkinning.insert( EffectCache::value_type( info.name, effect ) ); + } + else + { + mEffectCache.insert( EffectCache::value_type( info.name, effect ) ); + } + } + + return effect; +} + + +_Use_decl_annotations_ +std::shared_ptr DGSLEffectFactory::Impl::CreateDGSLEffect( DGSLEffectFactory* factory, const DGSLEffectFactory::DGSLEffectInfo& info, ID3D11DeviceContext* deviceContext ) +{ + if ( mSharing && info.name && *info.name ) + { + if ( info.enableSkinning ) + { + auto it = mEffectCacheSkinning.find( info.name ); + if ( it != mEffectCacheSkinning.end() ) + { + return it->second; + } + } + else + { + auto it = mEffectCache.find( info.name ); + if ( it != mEffectCache.end() ) + { + return it->second; + } + } + } + + std::shared_ptr effect; + + bool lighting = true; + bool allowSpecular = true; + + if ( !info.pixelShader || !*info.pixelShader ) + { + effect = std::make_shared( device.Get(), nullptr, info.enableSkinning ); + } + else + { + wchar_t root[ MAX_PATH ] = {}; + auto last = wcsrchr( info.pixelShader, '_' ); + if ( last ) + { + wcscpy_s( root, last+1 ); + } + else + { + wcscpy_s( root, info.pixelShader ); + } + + auto first = wcschr( root, '.' ); + if ( first ) + *first = 0; + + if ( !_wcsicmp( root, L"lambert" ) ) + { + allowSpecular = false; + effect = std::make_shared( device.Get(), nullptr, info.enableSkinning ); + } + else if ( !_wcsicmp( root, L"phong" ) ) + { + effect = std::make_shared( device.Get(), nullptr, info.enableSkinning ); + } + else if ( !_wcsicmp( root, L"unlit" ) ) + { + lighting = false; + effect = std::make_shared( device.Get(), nullptr, info.enableSkinning ); + } + else if ( device->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0 ) + { + // DGSL shaders are not compatible with Feature Level 9.x, use fallback shader + wcscat_s( root, L".cso" ); + + ComPtr ps; + factory->CreatePixelShader( root, ps.GetAddressOf() ); + + effect = std::make_shared( device.Get(), ps.Get(), info.enableSkinning ); + } + else + { + // Create DGSL shader and use it for the effect + ComPtr ps; + factory->CreatePixelShader( info.pixelShader, ps.GetAddressOf() ); + + effect = std::make_shared( device.Get(), ps.Get(), info.enableSkinning ); + } + } + + if ( lighting ) + { + effect->EnableDefaultLighting(); + effect->SetLightingEnabled(true); + } + + XMVECTOR color = XMLoadFloat3( &info.ambientColor ); + effect->SetAmbientColor( color ); + + color = XMLoadFloat3( &info.diffuseColor ); + effect->SetDiffuseColor( color ); + effect->SetAlpha( info.alpha ); + + if ( info.perVertexColor ) + { + effect->SetVertexColorEnabled( true ); + } + + effect->SetAlphaDiscardEnable(true); + + if ( allowSpecular + && ( info.specularColor.x != 0 || info.specularColor.y != 0 || info.specularColor.z != 0 ) ) + { + color = XMLoadFloat3( &info.specularColor ); + effect->SetSpecularColor( color ); + effect->SetSpecularPower( info.specularPower ); + } + else + { + effect->DisableSpecular(); + } + + if ( info.emissiveColor.x != 0 || info.emissiveColor.y != 0 || info.emissiveColor.z != 0 ) + { + color = XMLoadFloat3( &info.emissiveColor ); + effect->SetEmissiveColor( color ); + } + + if ( info.diffuseTexture && *info.diffuseTexture ) + { + ComPtr srv; + + factory->CreateTexture( info.diffuseTexture, deviceContext, srv.GetAddressOf() ); + + effect->SetTexture( srv.Get() ); + effect->SetTextureEnabled(true); + } + + if ( info.specularTexture && *info.specularTexture ) + { + ComPtr srv; + + factory->CreateTexture( info.specularTexture, deviceContext, srv.GetAddressOf() ); + + effect->SetTexture( 1, srv.Get() ); + effect->SetTextureEnabled(true); + } + + if ( info.normalTexture && *info.normalTexture ) + { + ComPtr srv; + + factory->CreateTexture( info.normalTexture, deviceContext, srv.GetAddressOf() ); + + effect->SetTexture( 2, srv.Get() ); + effect->SetTextureEnabled(true); + } + + for( int j = 0; j < _countof(info.textures); ++j ) + { + if ( info.textures[j] && *info.textures[j] ) + { + ComPtr srv; + + factory->CreateTexture( info.textures[j], deviceContext, srv.GetAddressOf() ); + + effect->SetTexture( j + DGSLEffectInfo::BaseTextureOffset, srv.Get() ); + effect->SetTextureEnabled(true); + } + } + + if ( mSharing && info.name && *info.name ) + { + std::lock_guard lock(mutex); + if ( info.enableSkinning ) + { + mEffectCacheSkinning.insert( EffectCache::value_type( info.name, effect ) ); + } + else + { + mEffectCache.insert( EffectCache::value_type( info.name, effect ) ); + } + } + + return effect; +} + + +_Use_decl_annotations_ +void DGSLEffectFactory::Impl::CreateTexture( const wchar_t* name, ID3D11DeviceContext* deviceContext, ID3D11ShaderResourceView** textureView ) +{ + if ( !name || !textureView ) + throw std::exception("invalid arguments"); + +#if defined(_XBOX_ONE) && defined(_TITLE) + UNREFERENCED_PARAMETER(deviceContext); +#endif + + auto it = mTextureCache.find( name ); + + if ( mSharing && it != mTextureCache.end() ) + { + ID3D11ShaderResourceView* srv = it->second.Get(); + srv->AddRef(); + *textureView = srv; + } + else + { + wchar_t fullName[MAX_PATH] = {}; + wcscpy_s( fullName, mPath ); + wcscat_s( fullName, name ); + + WIN32_FILE_ATTRIBUTE_DATA fileAttr = {}; + if ( !GetFileAttributesExW(fullName, GetFileExInfoStandard, &fileAttr) ) + { + // Try Current Working Directory (CWD) + wcscpy_s( fullName, name ); + if ( !GetFileAttributesExW(fullName, GetFileExInfoStandard, &fileAttr) ) + { + DebugTrace( "DGSLEffectFactory could not find texture file '%ls'\n", name ); + throw std::exception( "CreateTexture" ); + } + } + + wchar_t ext[_MAX_EXT]; + _wsplitpath_s( name, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT ); + + if ( _wcsicmp( ext, L".dds" ) == 0 ) + { + HRESULT hr = CreateDDSTextureFromFileEx( + device.Get(), fullName, 0, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + mForceSRGB, nullptr, textureView); + if ( FAILED(hr) ) + { + DebugTrace( "CreateDDSTextureFromFile failed (%08X) for '%ls'\n", hr, fullName ); + throw std::exception( "CreateDDSTextureFromFile" ); + } + } +#if !defined(_XBOX_ONE) || !defined(_TITLE) + else if ( deviceContext ) + { + std::lock_guard lock(mutex); + HRESULT hr = CreateWICTextureFromFileEx( + device.Get(), deviceContext, fullName, 0, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + mForceSRGB ? WIC_LOADER_FORCE_SRGB : WIC_LOADER_DEFAULT, nullptr, textureView ); + if ( FAILED(hr) ) + { + DebugTrace( "CreateWICTextureFromFile failed (%08X) for '%ls'\n", hr, fullName ); + throw std::exception( "CreateWICTextureFromFile" ); + } + } +#endif + else + { + HRESULT hr = CreateWICTextureFromFileEx( + device.Get(), fullName, 0, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + mForceSRGB ? WIC_LOADER_FORCE_SRGB : WIC_LOADER_DEFAULT, nullptr, textureView ); + if ( FAILED(hr) ) + { + DebugTrace( "CreateWICTextureFromFile failed (%08X) for '%ls'\n", hr, fullName ); + throw std::exception( "CreateWICTextureFromFile" ); + } + } + + if ( mSharing && *name && it == mTextureCache.end() ) + { + std::lock_guard lock(mutex); + mTextureCache.insert( TextureCache::value_type( name, *textureView ) ); + } + } +} + + +_Use_decl_annotations_ +void DGSLEffectFactory::Impl::CreatePixelShader( const wchar_t* name, ID3D11PixelShader** pixelShader ) +{ + if ( !name || !pixelShader ) + throw std::exception("invalid arguments"); + + auto it = mShaderCache.find( name ); + + if ( mSharing && it != mShaderCache.end() ) + { + ID3D11PixelShader* ps = it->second.Get(); + ps->AddRef(); + *pixelShader = ps; + } + else + { + wchar_t fullName[MAX_PATH] = {}; + wcscpy_s( fullName, mPath ); + wcscat_s( fullName, name ); + + WIN32_FILE_ATTRIBUTE_DATA fileAttr = {}; + if ( !GetFileAttributesExW(fullName, GetFileExInfoStandard, &fileAttr) ) + { + // Try Current Working Directory (CWD) + wcscpy_s( fullName, name ); + if ( !GetFileAttributesExW(fullName, GetFileExInfoStandard, &fileAttr) ) + { + DebugTrace( "DGSLEffectFactory could not find shader file '%ls'\n", name ); + throw std::exception( "CreatePixelShader" ); + } + } + + size_t dataSize = 0; + std::unique_ptr data; + HRESULT hr = BinaryReader::ReadEntireFile( fullName, data, &dataSize ); + if ( FAILED(hr) ) + { + DebugTrace( "CreatePixelShader failed (%08X) to load shader file '%ls'\n", hr, fullName ); + throw std::exception( "CreatePixelShader" ); + } + + ThrowIfFailed( + device->CreatePixelShader( data.get(), dataSize, nullptr, pixelShader ) ); + + _Analysis_assume_(*pixelShader != 0); + + if ( mSharing && *name && it == mShaderCache.end() ) + { + std::lock_guard lock(mutex); + mShaderCache.insert( ShaderCache::value_type( name, *pixelShader ) ); + } + } +} + + +void DGSLEffectFactory::Impl::ReleaseCache() +{ + std::lock_guard lock(mutex); + mEffectCache.clear(); + mEffectCacheSkinning.clear(); + mTextureCache.clear(); + mShaderCache.clear(); +} + + + +//-------------------------------------------------------------------------------------- +// DGSLEffectFactory +//-------------------------------------------------------------------------------------- + +DGSLEffectFactory::DGSLEffectFactory(_In_ ID3D11Device* device) + : pImpl(Impl::instancePool.DemandCreate(device)) +{ +} + +DGSLEffectFactory::~DGSLEffectFactory() +{ +} + + +DGSLEffectFactory::DGSLEffectFactory(DGSLEffectFactory&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + +DGSLEffectFactory& DGSLEffectFactory::operator= (DGSLEffectFactory&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// IEffectFactory methods +_Use_decl_annotations_ +std::shared_ptr DGSLEffectFactory::CreateEffect( const EffectInfo& info, ID3D11DeviceContext* deviceContext ) +{ + return pImpl->CreateEffect( this, info, deviceContext ); +} + +_Use_decl_annotations_ +void DGSLEffectFactory::CreateTexture( const wchar_t* name, ID3D11DeviceContext* deviceContext, ID3D11ShaderResourceView** textureView ) +{ + return pImpl->CreateTexture( name, deviceContext, textureView ); +} + + +// DGSL methods. +_Use_decl_annotations_ +std::shared_ptr DGSLEffectFactory::CreateDGSLEffect( const DGSLEffectInfo& info, ID3D11DeviceContext* deviceContext ) +{ + return pImpl->CreateDGSLEffect( this, info, deviceContext ); +} + + +_Use_decl_annotations_ +void DGSLEffectFactory::CreatePixelShader( const wchar_t* shader, ID3D11PixelShader** pixelShader ) +{ + pImpl->CreatePixelShader( shader, pixelShader ); +} + + +// Settings +void DGSLEffectFactory::ReleaseCache() +{ + pImpl->ReleaseCache(); +} + +void DGSLEffectFactory::SetSharing( bool enabled ) +{ + pImpl->SetSharing( enabled ); +} + +void DGSLEffectFactory::EnableForceSRGB(bool forceSRGB) +{ + pImpl->EnableForceSRGB( forceSRGB ); +} + +void DGSLEffectFactory::SetDirectory( _In_opt_z_ const wchar_t* path ) +{ + if ( path && *path != 0 ) + { + wcscpy_s( pImpl->mPath, path ); + size_t len = wcsnlen( pImpl->mPath, MAX_PATH ); + if ( len > 0 && len < (MAX_PATH-1) ) + { + // Ensure it has a trailing slash + if ( pImpl->mPath[len-1] != L'\\' ) + { + pImpl->mPath[len] = L'\\'; + pImpl->mPath[len+1] = 0; + } + } + } + else + *pImpl->mPath = 0; +} \ No newline at end of file diff --git a/DirectXTK/Src/DemandCreate.h b/DirectXTK/Src/DemandCreate.h new file mode 100644 index 0000000..968c419 --- /dev/null +++ b/DirectXTK/Src/DemandCreate.h @@ -0,0 +1,51 @@ +//-------------------------------------------------------------------------------------- +// File: DemandCreate.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include "PlatformHelpers.h" + + +namespace DirectX +{ + // Helper for lazily creating a D3D resource. + template + static T* DemandCreate(Microsoft::WRL::ComPtr& comPtr, std::mutex& mutex, TCreateFunc createFunc) + { + T* result = comPtr.Get(); + + // Double-checked lock pattern. + MemoryBarrier(); + + if (!result) + { + std::lock_guard lock(mutex); + + result = comPtr.Get(); + + if (!result) + { + // Create the new object. + ThrowIfFailed( + createFunc(&result) + ); + + MemoryBarrier(); + + comPtr.Attach(result); + } + } + + return result; + } +} diff --git a/DirectXTK/Src/DualPostProcess.cpp b/DirectXTK/Src/DualPostProcess.cpp new file mode 100644 index 0000000..2eedc9f --- /dev/null +++ b/DirectXTK/Src/DualPostProcess.cpp @@ -0,0 +1,340 @@ +//-------------------------------------------------------------------------------------- +// File: DualPostProcess.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "PostProcess.h" + +#include "AlignedNew.h" +#include "CommonStates.h" +#include "ConstantBuffer.h" +#include "DemandCreate.h" +#include "DirectXHelpers.h" +#include "SharedResourcePool.h" + +using namespace DirectX; + +using Microsoft::WRL::ComPtr; + +namespace +{ + const int c_MaxSamples = 16; + + const int Dirty_ConstantBuffer = 0x01; + const int Dirty_Parameters = 0x02; + + // Constant buffer layout. Must match the shader! + __declspec(align(16)) struct PostProcessConstants + { + XMVECTOR sampleOffsets[c_MaxSamples]; + XMVECTOR sampleWeights[c_MaxSamples]; + }; + + static_assert((sizeof(PostProcessConstants) % 16) == 0, "CB size not padded correctly"); +} + +// Include the precompiled shader code. +namespace +{ +#if defined(_XBOX_ONE) && defined(_TITLE) + #include "Shaders/Compiled/XboxOnePostProcess_VSQuad.inc" + + #include "Shaders/Compiled/XboxOnePostProcess_PSMerge.inc" + #include "Shaders/Compiled/XboxOnePostProcess_PSBloomCombine.inc" +#else + #include "Shaders/Compiled/PostProcess_VSQuad.inc" + + #include "Shaders/Compiled/PostProcess_PSMerge.inc" + #include "Shaders/Compiled/PostProcess_PSBloomCombine.inc" +#endif +} + +namespace +{ + struct ShaderBytecode + { + void const* code; + size_t length; + }; + + const ShaderBytecode pixelShaders[] = + { + { PostProcess_PSMerge, sizeof(PostProcess_PSMerge) }, + { PostProcess_PSBloomCombine, sizeof(PostProcess_PSBloomCombine) }, + }; + + static_assert(_countof(pixelShaders) == DualPostProcess::Effect_Max, "array/max mismatch"); + + // Factory for lazily instantiating shaders. + class DeviceResources + { + public: + DeviceResources(_In_ ID3D11Device* device) + : stateObjects(device), + mDevice(device) + { } + + // Gets or lazily creates the vertex shader. + ID3D11VertexShader* GetVertexShader() + { + return DemandCreate(mVertexShader, mMutex, [&](ID3D11VertexShader** pResult) -> HRESULT + { + HRESULT hr = mDevice->CreateVertexShader(PostProcess_VSQuad, sizeof(PostProcess_VSQuad), nullptr, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DualPostProcess"); + + return hr; + }); + } + + // Gets or lazily creates the specified pixel shader. + ID3D11PixelShader* GetPixelShader(int shaderIndex) + { + assert(shaderIndex >= 0 && shaderIndex < DualPostProcess::Effect_Max); + _Analysis_assume_(shaderIndex >= 0 && shaderIndex < DualPostProcess::Effect_Max); + + return DemandCreate(mPixelShaders[shaderIndex], mMutex, [&](ID3D11PixelShader** pResult) -> HRESULT + { + HRESULT hr = mDevice->CreatePixelShader(pixelShaders[shaderIndex].code, pixelShaders[shaderIndex].length, nullptr, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DualPostProcess"); + + return hr; + }); + } + + CommonStates stateObjects; + + protected: + ComPtr mDevice; + ComPtr mVertexShader; + ComPtr mPixelShaders[DualPostProcess::Effect_Max]; + std::mutex mMutex; + }; +} + +class DualPostProcess::Impl : public AlignedNew +{ +public: + Impl(_In_ ID3D11Device* device); + + void Process(_In_ ID3D11DeviceContext* deviceContext, std::function& setCustomState); + + void SetDirtyFlag() { mDirtyFlags = INT_MAX; } + + // Fields. + DualPostProcess::Effect fx; + PostProcessConstants constants; + ComPtr texture; + ComPtr texture2; + float mergeWeight1; + float mergeWeight2; + float bloomIntensity; + float bloomBaseIntensity; + float bloomSaturation; + float bloomBaseSaturation; + +private: + int mDirtyFlags; + + ConstantBuffer mConstantBuffer; + + // Per-device resources. + std::shared_ptr mDeviceResources; + + static SharedResourcePool deviceResourcesPool; +}; + + +// Global pool of per-device DualPostProcess resources. +SharedResourcePool DualPostProcess::Impl::deviceResourcesPool; + + +// Constructor. +DualPostProcess::Impl::Impl(_In_ ID3D11Device* device) + : fx(DualPostProcess::Merge), + mergeWeight1(0.5f), + mergeWeight2(0.5f), + bloomIntensity(1.25f), + bloomBaseIntensity(1.f), + bloomSaturation(1.f), + bloomBaseSaturation(1.f), + mDirtyFlags(INT_MAX), + mConstantBuffer(device), + mDeviceResources(deviceResourcesPool.DemandCreate(device)), + constants{} +{ + if (device->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0) + { + throw std::exception("DualPostProcess requires Feature Level 10.0 or later"); + } +} + + +// Sets our state onto the D3D device. +void DualPostProcess::Impl::Process(_In_ ID3D11DeviceContext* deviceContext, std::function& setCustomState) +{ + // Set the texture. + ID3D11ShaderResourceView* textures[2] = { texture.Get(), texture2.Get() }; + deviceContext->PSSetShaderResources(0, 2, textures); + + auto sampler = mDeviceResources->stateObjects.LinearClamp(); + deviceContext->PSSetSamplers(0, 1, &sampler); + + // Set state objects. + deviceContext->OMSetBlendState(mDeviceResources->stateObjects.Opaque(), nullptr, 0xffffffff); + deviceContext->OMSetDepthStencilState(mDeviceResources->stateObjects.DepthNone(), 0); + deviceContext->RSSetState(mDeviceResources->stateObjects.CullNone()); + + // Set shaders. + auto vertexShader = mDeviceResources->GetVertexShader(); + auto pixelShader = mDeviceResources->GetPixelShader(fx); + + deviceContext->VSSetShader(vertexShader, nullptr, 0); + deviceContext->PSSetShader(pixelShader, nullptr, 0); + + // Set constants. + if (mDirtyFlags & Dirty_Parameters) + { + mDirtyFlags &= ~Dirty_Parameters; + mDirtyFlags |= Dirty_ConstantBuffer; + + switch (fx) + { + case Merge: + constants.sampleWeights[0] = XMVectorReplicate(mergeWeight1); + constants.sampleWeights[1] = XMVectorReplicate(mergeWeight2); + break; + + case BloomCombine: + constants.sampleWeights[0] = XMVectorSet(bloomBaseSaturation, bloomSaturation, 0.f, 0.f); + constants.sampleWeights[1] = XMVectorReplicate(bloomBaseIntensity); + constants.sampleWeights[2] = XMVectorReplicate(bloomIntensity); + break; + + default: + break; + } + } + +#if defined(_XBOX_ONE) && defined(_TITLE) + void *grfxMemory; + mConstantBuffer.SetData(deviceContext, constants, &grfxMemory); + + Microsoft::WRL::ComPtr deviceContextX; + ThrowIfFailed(deviceContext->QueryInterface(IID_GRAPHICS_PPV_ARGS(deviceContextX.GetAddressOf()))); + + auto buffer = mConstantBuffer.GetBuffer(); + + deviceContextX->PSSetPlacementConstantBuffer(0, buffer, grfxMemory); +#else + if (mDirtyFlags & Dirty_ConstantBuffer) + { + mDirtyFlags &= ~Dirty_ConstantBuffer; + mConstantBuffer.SetData(deviceContext, constants); + } + + // Set the constant buffer. + auto buffer = mConstantBuffer.GetBuffer(); + + deviceContext->PSSetConstantBuffers(0, 1, &buffer); +#endif + + if (setCustomState) + { + setCustomState(); + } + + // Draw quad. + deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + + deviceContext->Draw(4, 0); +} + + +// Public constructor. +DualPostProcess::DualPostProcess(_In_ ID3D11Device* device) + : pImpl(new Impl(device)) +{ +} + + +// Move constructor. +DualPostProcess::DualPostProcess(DualPostProcess&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +DualPostProcess& DualPostProcess::operator= (DualPostProcess&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +DualPostProcess::~DualPostProcess() +{ +} + + +// IPostProcess methods. +void DualPostProcess::Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState) +{ + pImpl->Process(deviceContext, setCustomState); +} + + +// Shader control. +void DualPostProcess::SetEffect(Effect fx) +{ + if (fx < 0 || fx >= Effect_Max) + throw std::out_of_range("Effect not defined"); + + pImpl->fx = fx; + pImpl->SetDirtyFlag(); +} + + +// Properties +void DualPostProcess::SetSourceTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture = value; +} + + +void DualPostProcess::SetSourceTexture2(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture2 = value; +} + + +void DualPostProcess::SetMergeParameters(float weight1, float weight2) +{ + pImpl->mergeWeight1 = weight1; + pImpl->mergeWeight2 = weight2; + pImpl->SetDirtyFlag(); +} + + +void DualPostProcess::SetBloomCombineParameters(float bloom, float base, float bloomSaturation, float baseSaturation) +{ + pImpl->bloomIntensity = bloom; + pImpl->bloomBaseIntensity = base; + pImpl->bloomSaturation = bloomSaturation; + pImpl->bloomBaseSaturation = baseSaturation; + pImpl->SetDirtyFlag(); +} diff --git a/DirectXTK/Src/DualTextureEffect.cpp b/DirectXTK/Src/DualTextureEffect.cpp new file mode 100644 index 0000000..8e12847 --- /dev/null +++ b/DirectXTK/Src/DualTextureEffect.cpp @@ -0,0 +1,338 @@ +//-------------------------------------------------------------------------------------- +// File: DualTextureEffect.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "EffectCommon.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +// Constant buffer layout. Must match the shader! +struct DualTextureEffectConstants +{ + XMVECTOR diffuseColor; + XMVECTOR fogColor; + XMVECTOR fogVector; + XMMATRIX worldViewProj; +}; + +static_assert( ( sizeof(DualTextureEffectConstants) % 16 ) == 0, "CB size not padded correctly" ); + + +// Traits type describes our characteristics to the EffectBase template. +struct DualTextureEffectTraits +{ + typedef DualTextureEffectConstants ConstantBufferType; + + static const int VertexShaderCount = 4; + static const int PixelShaderCount = 2; + static const int ShaderPermutationCount = 4; +}; + + +// Internal DualTextureEffect implementation class. +class DualTextureEffect::Impl : public EffectBase +{ +public: + Impl(_In_ ID3D11Device* device); + + bool vertexColorEnabled; + + EffectColor color; + + ComPtr texture2; + + int GetCurrentShaderPermutation() const; + + void Apply(_In_ ID3D11DeviceContext* deviceContext); +}; + + +// Include the precompiled shader code. +namespace +{ +#if defined(_XBOX_ONE) && defined(_TITLE) + #include "Shaders/Compiled/XboxOneDualTextureEffect_VSDualTexture.inc" + #include "Shaders/Compiled/XboxOneDualTextureEffect_VSDualTextureNoFog.inc" + #include "Shaders/Compiled/XboxOneDualTextureEffect_VSDualTextureVc.inc" + #include "Shaders/Compiled/XboxOneDualTextureEffect_VSDualTextureVcNoFog.inc" + + #include "Shaders/Compiled/XboxOneDualTextureEffect_PSDualTexture.inc" + #include "Shaders/Compiled/XboxOneDualTextureEffect_PSDualTextureNoFog.inc" +#else + #include "Shaders/Compiled/DualTextureEffect_VSDualTexture.inc" + #include "Shaders/Compiled/DualTextureEffect_VSDualTextureNoFog.inc" + #include "Shaders/Compiled/DualTextureEffect_VSDualTextureVc.inc" + #include "Shaders/Compiled/DualTextureEffect_VSDualTextureVcNoFog.inc" + + #include "Shaders/Compiled/DualTextureEffect_PSDualTexture.inc" + #include "Shaders/Compiled/DualTextureEffect_PSDualTextureNoFog.inc" +#endif +} + + +template<> +const ShaderBytecode EffectBase::VertexShaderBytecode[] = +{ + { DualTextureEffect_VSDualTexture, sizeof(DualTextureEffect_VSDualTexture) }, + { DualTextureEffect_VSDualTextureNoFog, sizeof(DualTextureEffect_VSDualTextureNoFog) }, + { DualTextureEffect_VSDualTextureVc, sizeof(DualTextureEffect_VSDualTextureVc) }, + { DualTextureEffect_VSDualTextureVcNoFog, sizeof(DualTextureEffect_VSDualTextureVcNoFog) }, + +}; + + +template<> +const int EffectBase::VertexShaderIndices[] = +{ + 0, // basic + 1, // no fog + 2, // vertex color + 3, // vertex color, no fog +}; + + +template<> +const ShaderBytecode EffectBase::PixelShaderBytecode[] = +{ + { DualTextureEffect_PSDualTexture, sizeof(DualTextureEffect_PSDualTexture) }, + { DualTextureEffect_PSDualTextureNoFog, sizeof(DualTextureEffect_PSDualTextureNoFog) }, + +}; + + +template<> +const int EffectBase::PixelShaderIndices[] = +{ + 0, // basic + 1, // no fog + 0, // vertex color + 1, // vertex color, no fog +}; + + +// Global pool of per-device DualTextureEffect resources. +template<> +SharedResourcePool::DeviceResources> EffectBase::deviceResourcesPool; + + +// Constructor. +DualTextureEffect::Impl::Impl(_In_ ID3D11Device* device) + : EffectBase(device), + vertexColorEnabled(false) +{ + static_assert( _countof(EffectBase::VertexShaderIndices) == DualTextureEffectTraits::ShaderPermutationCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::VertexShaderBytecode) == DualTextureEffectTraits::VertexShaderCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::PixelShaderBytecode) == DualTextureEffectTraits::PixelShaderCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::PixelShaderIndices) == DualTextureEffectTraits::ShaderPermutationCount, "array/max mismatch" ); +} + + +int DualTextureEffect::Impl::GetCurrentShaderPermutation() const +{ + int permutation = 0; + + // Use optimized shaders if fog is disabled. + if (!fog.enabled) + { + permutation += 1; + } + + // Support vertex coloring? + if (vertexColorEnabled) + { + permutation += 2; + } + + return permutation; +} + + +// Sets our state onto the D3D device. +void DualTextureEffect::Impl::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + // Compute derived parameter values. + matrices.SetConstants(dirtyFlags, constants.worldViewProj); + + fog.SetConstants(dirtyFlags, matrices.worldView, constants.fogVector); + + color.SetConstants(dirtyFlags, constants.diffuseColor); + + // Set the textures. + ID3D11ShaderResourceView* textures[2] = + { + texture.Get(), + texture2.Get(), + }; + + deviceContext->PSSetShaderResources(0, 2, textures); + + // Set shaders and constant buffers. + ApplyShaders(deviceContext, GetCurrentShaderPermutation()); +} + + +// Public constructor. +DualTextureEffect::DualTextureEffect(_In_ ID3D11Device* device) + : pImpl(new Impl(device)) +{ +} + + +// Move constructor. +DualTextureEffect::DualTextureEffect(DualTextureEffect&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +DualTextureEffect& DualTextureEffect::operator= (DualTextureEffect&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +DualTextureEffect::~DualTextureEffect() +{ +} + + +// IEffect methods. +void DualTextureEffect::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + pImpl->Apply(deviceContext); +} + + +void DualTextureEffect::GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) +{ + pImpl->GetVertexShaderBytecode(pImpl->GetCurrentShaderPermutation(), pShaderByteCode, pByteCodeLength); +} + + +// Camera settings. +void XM_CALLCONV DualTextureEffect::SetWorld(FXMMATRIX value) +{ + pImpl->matrices.world = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV DualTextureEffect::SetView(FXMMATRIX value) +{ + pImpl->matrices.view = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV DualTextureEffect::SetProjection(FXMMATRIX value) +{ + pImpl->matrices.projection = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj; +} + + +void XM_CALLCONV DualTextureEffect::SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) +{ + pImpl->matrices.world = world; + pImpl->matrices.view = view; + pImpl->matrices.projection = projection; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +// Material settings. +void XM_CALLCONV DualTextureEffect::SetDiffuseColor(FXMVECTOR value) +{ + pImpl->color.diffuseColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void DualTextureEffect::SetAlpha(float value) +{ + pImpl->color.alpha = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV DualTextureEffect::SetColorAndAlpha(FXMVECTOR value) +{ + pImpl->color.diffuseColor = value; + pImpl->color.alpha = XMVectorGetW(value); + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +// Fog settings. +void DualTextureEffect::SetFogEnabled(bool value) +{ + pImpl->fog.enabled = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogEnable; +} + + +void DualTextureEffect::SetFogStart(float value) +{ + pImpl->fog.start = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void DualTextureEffect::SetFogEnd(float value) +{ + pImpl->fog.end = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV DualTextureEffect::SetFogColor(FXMVECTOR value) +{ + pImpl->constants.fogColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +// Vertex color setting. +void DualTextureEffect::SetVertexColorEnabled(bool value) +{ + pImpl->vertexColorEnabled = value; +} + + +// Texture settings. +void DualTextureEffect::SetTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture = value; +} + + +void DualTextureEffect::SetTexture2(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture2 = value; +} diff --git a/DirectXTK/Src/EffectCommon.cpp b/DirectXTK/Src/EffectCommon.cpp new file mode 100644 index 0000000..570447e --- /dev/null +++ b/DirectXTK/Src/EffectCommon.cpp @@ -0,0 +1,451 @@ +//-------------------------------------------------------------------------------------- +// File: EffectCommon.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "EffectCommon.h" +#include "DemandCreate.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +// IEffectMatrices default method +void XM_CALLCONV IEffectMatrices::SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) +{ + SetWorld(world); + SetView(view); + SetProjection(projection); +} + + +// Constructor initializes default matrix values. +EffectMatrices::EffectMatrices() +{ + world = XMMatrixIdentity(); + view = XMMatrixIdentity(); + projection = XMMatrixIdentity(); + worldView = XMMatrixIdentity(); +} + + +// Lazily recomputes the combined world+view+projection matrix. +_Use_decl_annotations_ void EffectMatrices::SetConstants(int& dirtyFlags, XMMATRIX& worldViewProjConstant) +{ + if (dirtyFlags & EffectDirtyFlags::WorldViewProj) + { + worldView = XMMatrixMultiply(world, view); + + worldViewProjConstant = XMMatrixTranspose(XMMatrixMultiply(worldView, projection)); + + dirtyFlags &= ~EffectDirtyFlags::WorldViewProj; + dirtyFlags |= EffectDirtyFlags::ConstantBuffer; + } +} + + +// Constructor initializes default fog settings. +EffectFog::EffectFog() : + enabled(false), + start(0), + end(1.f) +{ +} + + +// Lazily recomputes the derived vector used by shader fog calculations. +_Use_decl_annotations_ +void XM_CALLCONV EffectFog::SetConstants(int& dirtyFlags, FXMMATRIX worldView, XMVECTOR& fogVectorConstant) +{ + if (enabled) + { + if (dirtyFlags & (EffectDirtyFlags::FogVector | EffectDirtyFlags::FogEnable)) + { + if (start == end) + { + // Degenerate case: force everything to 100% fogged if start and end are the same. + static const XMVECTORF32 fullyFogged = { { { 0, 0, 0, 1 } } }; + + fogVectorConstant = fullyFogged; + } + else + { + // We want to transform vertex positions into view space, take the resulting + // Z value, then scale and offset according to the fog start/end distances. + // Because we only care about the Z component, the shader can do all this + // with a single dot product, using only the Z row of the world+view matrix. + + // _13, _23, _33, _43 + XMVECTOR worldViewZ = XMVectorMergeXY(XMVectorMergeZW(worldView.r[0], worldView.r[2]), + XMVectorMergeZW(worldView.r[1], worldView.r[3])); + + // 0, 0, 0, fogStart + XMVECTOR wOffset = XMVectorSwizzle<1, 2, 3, 0>(XMLoadFloat(&start)); + + fogVectorConstant = (worldViewZ + wOffset) / (start - end); + } + + dirtyFlags &= ~(EffectDirtyFlags::FogVector | EffectDirtyFlags::FogEnable); + dirtyFlags |= EffectDirtyFlags::ConstantBuffer; + } + } + else + { + // When fog is disabled, make sure the fog vector is reset to zero. + if (dirtyFlags & EffectDirtyFlags::FogEnable) + { + fogVectorConstant = g_XMZero; + + dirtyFlags &= ~EffectDirtyFlags::FogEnable; + dirtyFlags |= EffectDirtyFlags::ConstantBuffer; + } + } +} + + +// Constructor initializes default material color settings. +EffectColor::EffectColor() : + alpha(1.f) +{ + diffuseColor = g_XMOne; +} + + +// Lazily recomputes the material color parameter for shaders that do not support realtime lighting. +void EffectColor::SetConstants(_Inout_ int& dirtyFlags, _Inout_ XMVECTOR& diffuseColorConstant) +{ + if (dirtyFlags & EffectDirtyFlags::MaterialColor) + { + XMVECTOR alphaVector = XMVectorReplicate(alpha); + + // xyz = diffuse * alpha, w = alpha. + diffuseColorConstant = XMVectorSelect(alphaVector, diffuseColor * alphaVector, g_XMSelect1110); + + dirtyFlags &= ~EffectDirtyFlags::MaterialColor; + dirtyFlags |= EffectDirtyFlags::ConstantBuffer; + } +} + + +// Constructor initializes default light settings. +EffectLights::EffectLights() +{ + emissiveColor = g_XMZero; + ambientLightColor = g_XMZero; + + for (int i = 0; i < MaxDirectionalLights; i++) + { + lightEnabled[i] = (i == 0); + lightDiffuseColor[i] = g_XMOne; + lightSpecularColor[i] = g_XMZero; + } +} + + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable:22103, "PREFAST doesn't understand buffer is bounded by a static const value even with SAL" ) +#endif + +// Initializes constant buffer fields to match the current lighting state. +_Use_decl_annotations_ void EffectLights::InitializeConstants(XMVECTOR& specularColorAndPowerConstant, XMVECTOR* lightDirectionConstant, XMVECTOR* lightDiffuseConstant, XMVECTOR* lightSpecularConstant) const +{ + static const XMVECTORF32 defaultSpecular = { { { 1, 1, 1, 16 } } }; + static const XMVECTORF32 defaultLightDirection = { { { 0, -1, 0, 0 } } }; + + specularColorAndPowerConstant = defaultSpecular; + + for (int i = 0; i < MaxDirectionalLights; i++) + { + lightDirectionConstant[i] = defaultLightDirection; + + lightDiffuseConstant[i] = lightEnabled[i] ? lightDiffuseColor[i] : g_XMZero; + lightSpecularConstant[i] = lightEnabled[i] ? lightSpecularColor[i] : g_XMZero; + } +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + + +// Lazily recomputes derived parameter values used by shader lighting calculations. +_Use_decl_annotations_ void EffectLights::SetConstants(int& dirtyFlags, EffectMatrices const& matrices, XMMATRIX& worldConstant, XMVECTOR worldInverseTransposeConstant[3], XMVECTOR& eyePositionConstant, XMVECTOR& diffuseColorConstant, XMVECTOR& emissiveColorConstant, bool lightingEnabled) +{ + if (lightingEnabled) + { + // World inverse transpose matrix. + if (dirtyFlags & EffectDirtyFlags::WorldInverseTranspose) + { + worldConstant = XMMatrixTranspose(matrices.world); + + XMMATRIX worldInverse = XMMatrixInverse(nullptr, matrices.world); + + worldInverseTransposeConstant[0] = worldInverse.r[0]; + worldInverseTransposeConstant[1] = worldInverse.r[1]; + worldInverseTransposeConstant[2] = worldInverse.r[2]; + + dirtyFlags &= ~EffectDirtyFlags::WorldInverseTranspose; + dirtyFlags |= EffectDirtyFlags::ConstantBuffer; + } + + // Eye position vector. + if (dirtyFlags & EffectDirtyFlags::EyePosition) + { + XMMATRIX viewInverse = XMMatrixInverse(nullptr, matrices.view); + + eyePositionConstant = viewInverse.r[3]; + + dirtyFlags &= ~EffectDirtyFlags::EyePosition; + dirtyFlags |= EffectDirtyFlags::ConstantBuffer; + } + } + + // Material color parameters. The desired lighting model is: + // + // ((ambientLightColor + sum(diffuse directional light)) * diffuseColor) + emissiveColor + // + // When lighting is disabled, ambient and directional lights are ignored, leaving: + // + // diffuseColor + emissiveColor + // + // For the lighting disabled case, we can save one shader instruction by precomputing + // diffuse+emissive on the CPU, after which the shader can use diffuseColor directly, + // ignoring its emissive parameter. + // + // When lighting is enabled, we can merge the ambient and emissive settings. If we + // set our emissive parameter to emissive+(ambient*diffuse), the shader no longer + // needs to bother adding the ambient contribution, simplifying its computation to: + // + // (sum(diffuse directional light) * diffuseColor) + emissiveColor + // + // For futher optimization goodness, we merge material alpha with the diffuse + // color parameter, and premultiply all color values by this alpha. + + if (dirtyFlags & EffectDirtyFlags::MaterialColor) + { + XMVECTOR diffuse = diffuseColor; + XMVECTOR alphaVector = XMVectorReplicate(alpha); + + if (lightingEnabled) + { + // Merge emissive and ambient light contributions. + emissiveColorConstant = (emissiveColor + ambientLightColor * diffuse) * alphaVector; + } + else + { + // Merge diffuse and emissive light contributions. + diffuse += emissiveColor; + } + + // xyz = diffuse * alpha, w = alpha. + diffuseColorConstant = XMVectorSelect(alphaVector, diffuse * alphaVector, g_XMSelect1110); + + dirtyFlags &= ~EffectDirtyFlags::MaterialColor; + dirtyFlags |= EffectDirtyFlags::ConstantBuffer; + } +} + + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable:26015, "PREFAST doesn't understand that ValidateLightIndex bounds whichLight" ) +#endif + +// Helper for turning one of the directional lights on or off. +_Use_decl_annotations_ int EffectLights::SetLightEnabled(int whichLight, bool value, XMVECTOR* lightDiffuseConstant, XMVECTOR* lightSpecularConstant) +{ + ValidateLightIndex(whichLight); + + if (lightEnabled[whichLight] == value) + return 0; + + lightEnabled[whichLight] = value; + + if (value) + { + // If this light is now on, store its color in the constant buffer. + lightDiffuseConstant[whichLight] = lightDiffuseColor[whichLight]; + lightSpecularConstant[whichLight] = lightSpecularColor[whichLight]; + } + else + { + // If the light is off, reset constant buffer colors to zero. + lightDiffuseConstant[whichLight] = g_XMZero; + lightSpecularConstant[whichLight] = g_XMZero; + } + + return EffectDirtyFlags::ConstantBuffer; +} + + +// Helper for setting diffuse color of one of the directional lights. +_Use_decl_annotations_ +int XM_CALLCONV EffectLights::SetLightDiffuseColor(int whichLight, FXMVECTOR value, XMVECTOR* lightDiffuseConstant) +{ + ValidateLightIndex(whichLight); + + // Locally store the new color. + lightDiffuseColor[whichLight] = value; + + // If this light is currently on, also update the constant buffer. + if (lightEnabled[whichLight]) + { + lightDiffuseConstant[whichLight] = value; + + return EffectDirtyFlags::ConstantBuffer; + } + + return 0; +} + + +// Helper for setting specular color of one of the directional lights. +_Use_decl_annotations_ +int XM_CALLCONV EffectLights::SetLightSpecularColor(int whichLight, FXMVECTOR value, XMVECTOR* lightSpecularConstant) +{ + ValidateLightIndex(whichLight); + + // Locally store the new color. + lightSpecularColor[whichLight] = value; + + // If this light is currently on, also update the constant buffer. + if (lightEnabled[whichLight]) + { + lightSpecularConstant[whichLight] = value; + + return EffectDirtyFlags::ConstantBuffer; + } + + return 0; +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + + +// Parameter validation helper. +void EffectLights::ValidateLightIndex(int whichLight) +{ + if (whichLight < 0 || whichLight >= MaxDirectionalLights) + { + throw std::out_of_range("whichLight parameter out of range"); + } +} + + +// Activates the default lighting rig (key, fill, and back lights). +void EffectLights::EnableDefaultLighting(_In_ IEffectLights* effect) +{ + static const XMVECTORF32 defaultDirections[MaxDirectionalLights] = + { + { { { -0.5265408f, -0.5735765f, -0.6275069f, 0 } } }, + { { { 0.7198464f, 0.3420201f, 0.6040227f, 0 } } }, + { { { 0.4545195f, -0.7660444f, 0.4545195f, 0 } } }, + }; + + static const XMVECTORF32 defaultDiffuse[MaxDirectionalLights] = + { + { { { 1.0000000f, 0.9607844f, 0.8078432f, 0 } } }, + { { { 0.9647059f, 0.7607844f, 0.4078432f, 0 } } }, + { { { 0.3231373f, 0.3607844f, 0.3937255f, 0 } } }, + }; + + static const XMVECTORF32 defaultSpecular[MaxDirectionalLights] = + { + { { { 1.0000000f, 0.9607844f, 0.8078432f, 0 } } }, + { { { 0.0000000f, 0.0000000f, 0.0000000f, 0 } } }, + { { { 0.3231373f, 0.3607844f, 0.3937255f, 0 } } }, + }; + + static const XMVECTORF32 defaultAmbient = { { { 0.05333332f, 0.09882354f, 0.1819608f, 0 } } }; + + effect->SetLightingEnabled(true); + effect->SetAmbientLightColor(defaultAmbient); + + for (int i = 0; i < MaxDirectionalLights; i++) + { + effect->SetLightEnabled(i, true); + effect->SetLightDirection(i, defaultDirections[i]); + effect->SetLightDiffuseColor(i, defaultDiffuse[i]); + effect->SetLightSpecularColor(i, defaultSpecular[i]); + } +} + + +// Gets or lazily creates the specified vertex shader permutation. +ID3D11VertexShader* EffectDeviceResources::DemandCreateVertexShader(_Inout_ ComPtr& vertexShader, ShaderBytecode const& bytecode) +{ + return DemandCreate(vertexShader, mMutex, [&](ID3D11VertexShader** pResult) -> HRESULT + { + HRESULT hr = mDevice->CreateVertexShader(bytecode.code, bytecode.length, nullptr, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DirectXTK:Effect"); + + return hr; + }); +} + + +// Gets or lazily creates the specified pixel shader permutation. +ID3D11PixelShader* EffectDeviceResources::DemandCreatePixelShader(_Inout_ ComPtr& pixelShader, ShaderBytecode const& bytecode) +{ + return DemandCreate(pixelShader, mMutex, [&](ID3D11PixelShader** pResult) -> HRESULT + { + HRESULT hr = mDevice->CreatePixelShader(bytecode.code, bytecode.length, nullptr, pResult); + + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DirectXTK:Effect"); + + return hr; + }); +} + + +// Gets or lazily creates the default texture +ID3D11ShaderResourceView* EffectDeviceResources::GetDefaultTexture() +{ + return DemandCreate(mDefaultTexture, mMutex, [&](ID3D11ShaderResourceView** pResult) -> HRESULT + { + static const uint32_t s_pixel = 0xffffffff; + + D3D11_SUBRESOURCE_DATA initData = { &s_pixel, sizeof(uint32_t), 0 }; + + D3D11_TEXTURE2D_DESC desc = {}; + desc.Width = desc.Height = desc.MipLevels = desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_IMMUTABLE; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + ComPtr tex; + HRESULT hr = mDevice->CreateTexture2D( &desc, &initData, tex.GetAddressOf() ); + + if (SUCCEEDED(hr)) + { + SetDebugObjectName(tex.Get(), "DirectXTK:Effect"); + + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; + SRVDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.Texture2D.MipLevels = 1; + + hr = mDevice->CreateShaderResourceView( tex.Get(), &SRVDesc, pResult ); + if (SUCCEEDED(hr)) + SetDebugObjectName(*pResult, "DirectXTK:Effect"); + } + + return hr; + }); +} diff --git a/DirectXTK/Src/EffectCommon.h b/DirectXTK/Src/EffectCommon.h new file mode 100644 index 0000000..5a3c41f --- /dev/null +++ b/DirectXTK/Src/EffectCommon.h @@ -0,0 +1,293 @@ +//-------------------------------------------------------------------------------------- +// File: EffectCommon.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include + +#include "Effects.h" +#include "PlatformHelpers.h" +#include "ConstantBuffer.h" +#include "SharedResourcePool.h" +#include "AlignedNew.h" + + +// BasicEffect, SkinnedEffect, et al, have many things in common, but also significant +// differences (for instance, not all the effects support lighting). This header breaks +// out common functionality into a set of helpers which can be assembled in different +// combinations to build up whatever subset is needed by each effect. + + +namespace DirectX +{ + // Bitfield tracks which derived parameter values need to be recomputed. + namespace EffectDirtyFlags + { + const int ConstantBuffer = 0x01; + const int WorldViewProj = 0x02; + const int WorldInverseTranspose = 0x04; + const int EyePosition = 0x08; + const int MaterialColor = 0x10; + const int FogVector = 0x20; + const int FogEnable = 0x40; + const int AlphaTest = 0x80; + } + + + // Helper stores matrix parameter values, and computes derived matrices. + struct EffectMatrices + { + EffectMatrices(); + + XMMATRIX world; + XMMATRIX view; + XMMATRIX projection; + XMMATRIX worldView; + + void SetConstants(_Inout_ int& dirtyFlags, _Inout_ XMMATRIX& worldViewProjConstant); + }; + + + // Helper stores the current fog settings, and computes derived shader parameters. + struct EffectFog + { + EffectFog(); + + bool enabled; + float start; + float end; + + void XM_CALLCONV SetConstants(_Inout_ int& dirtyFlags, _In_ FXMMATRIX worldView, _Inout_ XMVECTOR& fogVectorConstant); + }; + + + // Helper stores material color settings, and computes derived parameters for shaders that do not support realtime lighting. + struct EffectColor + { + EffectColor(); + + XMVECTOR diffuseColor; + float alpha; + + void SetConstants(_Inout_ int& dirtyFlags, _Inout_ XMVECTOR& diffuseColorConstant); + }; + + + // Helper stores the current light settings, and computes derived shader parameters. + struct EffectLights : public EffectColor + { + EffectLights(); + + static const int MaxDirectionalLights = IEffectLights::MaxDirectionalLights; + + + // Fields. + XMVECTOR emissiveColor; + XMVECTOR ambientLightColor; + + bool lightEnabled[MaxDirectionalLights]; + XMVECTOR lightDiffuseColor[MaxDirectionalLights]; + XMVECTOR lightSpecularColor[MaxDirectionalLights]; + + + // Methods. + void InitializeConstants(_Out_ XMVECTOR& specularColorAndPowerConstant, _Out_writes_all_(MaxDirectionalLights) XMVECTOR* lightDirectionConstant, _Out_writes_all_(MaxDirectionalLights) XMVECTOR* lightDiffuseConstant, _Out_writes_all_(MaxDirectionalLights) XMVECTOR* lightSpecularConstant) const; + void SetConstants(_Inout_ int& dirtyFlags, _In_ EffectMatrices const& matrices, _Inout_ XMMATRIX& worldConstant, _Inout_updates_(3) XMVECTOR worldInverseTransposeConstant[3], _Inout_ XMVECTOR& eyePositionConstant, _Inout_ XMVECTOR& diffuseColorConstant, _Inout_ XMVECTOR& emissiveColorConstant, bool lightingEnabled); + + int SetLightEnabled(int whichLight, bool value, _Inout_updates_(MaxDirectionalLights) XMVECTOR* lightDiffuseConstant, _Inout_updates_(MaxDirectionalLights) XMVECTOR* lightSpecularConstant); + int XM_CALLCONV SetLightDiffuseColor(int whichLight, FXMVECTOR value, _Inout_updates_(MaxDirectionalLights) XMVECTOR* lightDiffuseConstant); + int XM_CALLCONV SetLightSpecularColor(int whichLight, FXMVECTOR value, _Inout_updates_(MaxDirectionalLights) XMVECTOR* lightSpecularConstant); + + static void ValidateLightIndex(int whichLight); + static void EnableDefaultLighting(_In_ IEffectLights* effect); + }; + + + // Points to a precompiled vertex or pixel shader program. + struct ShaderBytecode + { + void const* code; + size_t length; + }; + + + // Factory for lazily instantiating shaders. BasicEffect supports many different + // shader permutations, so we only bother creating the ones that are actually used. + class EffectDeviceResources + { + public: + EffectDeviceResources(_In_ ID3D11Device* device) + : mDevice(device) + { } + + ID3D11VertexShader* DemandCreateVertexShader(_Inout_ Microsoft::WRL::ComPtr& vertexShader, ShaderBytecode const& bytecode); + ID3D11PixelShader * DemandCreatePixelShader (_Inout_ Microsoft::WRL::ComPtr & pixelShader, ShaderBytecode const& bytecode); + ID3D11ShaderResourceView* GetDefaultTexture(); + + protected: + Microsoft::WRL::ComPtr mDevice; + Microsoft::WRL::ComPtr mDefaultTexture; + + std::mutex mMutex; + }; + + + // Templated base class provides functionality common to all the built-in effects. + template + class EffectBase : public AlignedNew + { + public: + // Constructor. + EffectBase(_In_ ID3D11Device* device) + : dirtyFlags(INT_MAX), + mConstantBuffer(device), + mDeviceResources(deviceResourcesPool.DemandCreate(device)), + constants{} + { + } + + + // Fields. + typename Traits::ConstantBufferType constants; + + EffectMatrices matrices; + EffectFog fog; + + Microsoft::WRL::ComPtr texture; + + int dirtyFlags; + + + // Helper looks up the bytecode for the specified vertex shader permutation. + // Client code needs this in order to create matching input layouts. + void GetVertexShaderBytecode(int permutation, _Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) + { + assert(permutation >= 0 && permutation < Traits::ShaderPermutationCount); + _Analysis_assume_(permutation >= 0 && permutation < Traits::ShaderPermutationCount); + int shaderIndex = VertexShaderIndices[permutation]; + assert(shaderIndex >= 0 && shaderIndex < Traits::VertexShaderCount); + _Analysis_assume_(shaderIndex >= 0 && shaderIndex < Traits::VertexShaderCount); + + ShaderBytecode const& bytecode = VertexShaderBytecode[shaderIndex]; + + *pShaderByteCode = bytecode.code; + *pByteCodeLength = bytecode.length; + } + + + // Helper sets our shaders and constant buffers onto the D3D device. + void ApplyShaders(_In_ ID3D11DeviceContext* deviceContext, int permutation) + { + // Set shaders. + auto vertexShader = mDeviceResources->GetVertexShader(permutation); + auto pixelShader = mDeviceResources->GetPixelShader(permutation); + + deviceContext->VSSetShader(vertexShader, nullptr, 0); + deviceContext->PSSetShader(pixelShader, nullptr, 0); + +#if defined(_XBOX_ONE) && defined(_TITLE) + void *grfxMemory; + mConstantBuffer.SetData(deviceContext, constants, &grfxMemory); + + Microsoft::WRL::ComPtr deviceContextX; + ThrowIfFailed(deviceContext->QueryInterface(IID_GRAPHICS_PPV_ARGS(deviceContextX.GetAddressOf()))); + + auto buffer = mConstantBuffer.GetBuffer(); + + deviceContextX->VSSetPlacementConstantBuffer(0, buffer, grfxMemory); + deviceContextX->PSSetPlacementConstantBuffer(0, buffer, grfxMemory); +#else + // Make sure the constant buffer is up to date. + if (dirtyFlags & EffectDirtyFlags::ConstantBuffer) + { + mConstantBuffer.SetData(deviceContext, constants); + + dirtyFlags &= ~EffectDirtyFlags::ConstantBuffer; + } + + // Set the constant buffer. + ID3D11Buffer* buffer = mConstantBuffer.GetBuffer(); + + deviceContext->VSSetConstantBuffers(0, 1, &buffer); + deviceContext->PSSetConstantBuffers(0, 1, &buffer); +#endif + } + + + // Helper returns the default texture. + ID3D11ShaderResourceView* GetDefaultTexture() { return mDeviceResources->GetDefaultTexture(); } + + + protected: + // Static arrays hold all the precompiled shader permutations. + static const ShaderBytecode VertexShaderBytecode[Traits::VertexShaderCount]; + static const ShaderBytecode PixelShaderBytecode[Traits::PixelShaderCount]; + + static const int VertexShaderIndices[Traits::ShaderPermutationCount]; + static const int PixelShaderIndices[Traits::ShaderPermutationCount]; + + private: + // D3D constant buffer holds a copy of the same data as the public 'constants' field. + ConstantBuffer mConstantBuffer; + + // Only one of these helpers is allocated per D3D device, even if there are multiple effect instances. + class DeviceResources : protected EffectDeviceResources + { + public: + DeviceResources(_In_ ID3D11Device* device) + : EffectDeviceResources(device) + { } + + + // Gets or lazily creates the specified vertex shader permutation. + ID3D11VertexShader* GetVertexShader(int permutation) + { + assert(permutation >= 0 && permutation < Traits::ShaderPermutationCount); + _Analysis_assume_(permutation >= 0 && permutation < Traits::ShaderPermutationCount); + int shaderIndex = VertexShaderIndices[permutation]; + assert(shaderIndex >= 0 && shaderIndex < Traits::VertexShaderCount); + _Analysis_assume_(shaderIndex >= 0 && shaderIndex < Traits::VertexShaderCount); + + return DemandCreateVertexShader(mVertexShaders[shaderIndex], VertexShaderBytecode[shaderIndex]); + } + + + // Gets or lazily creates the specified pixel shader permutation. + ID3D11PixelShader* GetPixelShader(int permutation) + { + assert(permutation >= 0 && permutation < Traits::ShaderPermutationCount); + _Analysis_assume_(permutation >= 0 && permutation < Traits::ShaderPermutationCount); + int shaderIndex = PixelShaderIndices[permutation]; + assert(shaderIndex >= 0 && shaderIndex < Traits::PixelShaderCount); + _Analysis_assume_(shaderIndex >= 0 && shaderIndex < Traits::PixelShaderCount); + + return DemandCreatePixelShader(mPixelShaders[shaderIndex], PixelShaderBytecode[shaderIndex]); + } + + + // Gets or lazily creates the default texture + ID3D11ShaderResourceView* GetDefaultTexture() { return EffectDeviceResources::GetDefaultTexture(); } + + + private: + Microsoft::WRL::ComPtr mVertexShaders[Traits::VertexShaderCount]; + Microsoft::WRL::ComPtr mPixelShaders[Traits::PixelShaderCount]; + }; + + + // Per-device resources. + std::shared_ptr mDeviceResources; + + static SharedResourcePool deviceResourcesPool; + }; +} diff --git a/DirectXTK/Src/EffectFactory.cpp b/DirectXTK/Src/EffectFactory.cpp new file mode 100644 index 0000000..8e3acd9 --- /dev/null +++ b/DirectXTK/Src/EffectFactory.cpp @@ -0,0 +1,521 @@ +//-------------------------------------------------------------------------------------- +// File: EffectFactory.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Effects.h" +#include "DemandCreate.h" +#include "SharedResourcePool.h" + +#include "DDSTextureLoader.h" +#include "WICTextureLoader.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + +// Internal EffectFactory implementation class. Only one of these helpers is allocated +// per D3D device, even if there are multiple public facing EffectFactory instances. +class EffectFactory::Impl +{ +public: + Impl(_In_ ID3D11Device* device) + : mPath{}, + device(device), + mSharing(true), + mUseNormalMapEffect(true), + mForceSRGB(false) + {} + + std::shared_ptr CreateEffect( _In_ IEffectFactory* factory, _In_ const IEffectFactory::EffectInfo& info, _In_opt_ ID3D11DeviceContext* deviceContext ); + void CreateTexture( _In_z_ const wchar_t* texture, _In_opt_ ID3D11DeviceContext* deviceContext, _Outptr_ ID3D11ShaderResourceView** textureView ); + + void ReleaseCache(); + void SetSharing( bool enabled ) { mSharing = enabled; } + void EnableNormalMapEffect( bool enabled ) { mUseNormalMapEffect = enabled; } + void EnableForceSRGB(bool forceSRGB) { mForceSRGB = forceSRGB; } + + static SharedResourcePool instancePool; + + wchar_t mPath[MAX_PATH]; + +private: + ComPtr device; + + typedef std::map< std::wstring, std::shared_ptr > EffectCache; + typedef std::map< std::wstring, ComPtr > TextureCache; + + EffectCache mEffectCache; + EffectCache mEffectCacheSkinning; + EffectCache mEffectCacheDualTexture; + EffectCache mEffectNormalMap; + TextureCache mTextureCache; + + bool mSharing; + bool mUseNormalMapEffect; + bool mForceSRGB; + + std::mutex mutex; +}; + + +// Global instance pool. +SharedResourcePool EffectFactory::Impl::instancePool; + + +_Use_decl_annotations_ +std::shared_ptr EffectFactory::Impl::CreateEffect(IEffectFactory* factory, const IEffectFactory::EffectInfo& info, ID3D11DeviceContext* deviceContext) +{ + if (info.enableSkinning) + { + // SkinnedEffect + if (mSharing && info.name && *info.name) + { + auto it = mEffectCacheSkinning.find(info.name); + if (mSharing && it != mEffectCacheSkinning.end()) + { + return it->second; + } + } + + auto effect = std::make_shared(device.Get()); + + effect->EnableDefaultLighting(); + + effect->SetAlpha(info.alpha); + + // Skinned Effect does not have an ambient material color, or per-vertex color support + + XMVECTOR color = XMLoadFloat3(&info.diffuseColor); + effect->SetDiffuseColor(color); + + if (info.specularColor.x != 0 || info.specularColor.y != 0 || info.specularColor.z != 0) + { + color = XMLoadFloat3(&info.specularColor); + effect->SetSpecularColor(color); + effect->SetSpecularPower(info.specularPower); + } + else + { + effect->DisableSpecular(); + } + + if (info.emissiveColor.x != 0 || info.emissiveColor.y != 0 || info.emissiveColor.z != 0) + { + color = XMLoadFloat3(&info.emissiveColor); + effect->SetEmissiveColor(color); + } + + if (info.diffuseTexture && *info.diffuseTexture) + { + ComPtr srv; + + factory->CreateTexture(info.diffuseTexture, deviceContext, srv.GetAddressOf()); + + effect->SetTexture(srv.Get()); + } + + if (info.biasedVertexNormals) + { + effect->SetBiasedVertexNormals(true); + } + + if (mSharing && info.name && *info.name) + { + std::lock_guard lock(mutex); + mEffectCacheSkinning.insert(EffectCache::value_type(info.name, effect)); + } + + return effect; + } + else if (info.enableDualTexture) + { + // DualTextureEffect + if (mSharing && info.name && *info.name) + { + auto it = mEffectCacheDualTexture.find(info.name); + if (mSharing && it != mEffectCacheDualTexture.end()) + { + return it->second; + } + } + + auto effect = std::make_shared(device.Get()); + + // Dual texture effect doesn't support lighting (usually it's lightmaps) + + effect->SetAlpha(info.alpha); + + if (info.perVertexColor) + { + effect->SetVertexColorEnabled(true); + } + + XMVECTOR color = XMLoadFloat3(&info.diffuseColor); + effect->SetDiffuseColor(color); + + if (info.diffuseTexture && *info.diffuseTexture) + { + ComPtr srv; + + factory->CreateTexture(info.diffuseTexture, deviceContext, srv.GetAddressOf()); + + effect->SetTexture(srv.Get()); + } + + if (info.specularTexture && *info.specularTexture) + { + ComPtr srv; + + factory->CreateTexture(info.specularTexture, deviceContext, srv.GetAddressOf()); + + effect->SetTexture2(srv.Get()); + } + + if (mSharing && info.name && *info.name) + { + std::lock_guard lock(mutex); + mEffectCacheDualTexture.insert(EffectCache::value_type(info.name, effect)); + } + + return effect; + } + else if (info.enableNormalMaps && mUseNormalMapEffect) + { + // NormalMapEffect + if (mSharing && info.name && *info.name) + { + auto it = mEffectNormalMap.find(info.name); + if (mSharing && it != mEffectNormalMap.end()) + { + return it->second; + } + } + + auto effect = std::make_shared(device.Get()); + + effect->EnableDefaultLighting(); + + effect->SetAlpha(info.alpha); + + if (info.perVertexColor) + { + effect->SetVertexColorEnabled(true); + } + + // NormalMap Effect does not have an ambient material color + + XMVECTOR color = XMLoadFloat3(&info.diffuseColor); + effect->SetDiffuseColor(color); + + if (info.specularColor.x != 0 || info.specularColor.y != 0 || info.specularColor.z != 0) + { + color = XMLoadFloat3(&info.specularColor); + effect->SetSpecularColor(color); + effect->SetSpecularPower(info.specularPower); + } + else + { + effect->DisableSpecular(); + } + + if (info.emissiveColor.x != 0 || info.emissiveColor.y != 0 || info.emissiveColor.z != 0) + { + color = XMLoadFloat3(&info.emissiveColor); + effect->SetEmissiveColor(color); + } + + if (info.diffuseTexture && *info.diffuseTexture) + { + ComPtr srv; + + factory->CreateTexture(info.diffuseTexture, deviceContext, srv.GetAddressOf()); + + effect->SetTexture(srv.Get()); + } + + if (info.specularTexture && *info.specularTexture) + { + ComPtr srv; + + factory->CreateTexture(info.specularTexture, deviceContext, srv.GetAddressOf()); + + effect->SetSpecularTexture(srv.Get()); + } + + if (info.normalTexture && *info.normalTexture) + { + ComPtr srv; + + factory->CreateTexture(info.normalTexture, deviceContext, srv.GetAddressOf()); + + effect->SetNormalTexture(srv.Get()); + } + + if (info.biasedVertexNormals) + { + effect->SetBiasedVertexNormalsAndTangents(true); + } + + if (mSharing && info.name && *info.name) + { + std::lock_guard lock(mutex); + mEffectNormalMap.insert(EffectCache::value_type(info.name, effect)); + } + + return effect; + } + else + { + // BasicEffect + if (mSharing && info.name && *info.name) + { + auto it = mEffectCache.find(info.name); + if (mSharing && it != mEffectCache.end()) + { + return it->second; + } + } + + auto effect = std::make_shared(device.Get()); + + effect->EnableDefaultLighting(); + effect->SetLightingEnabled(true); + + effect->SetAlpha(info.alpha); + + if (info.perVertexColor) + { + effect->SetVertexColorEnabled(true); + } + + // Basic Effect does not have an ambient material color + + XMVECTOR color = XMLoadFloat3(&info.diffuseColor); + effect->SetDiffuseColor(color); + + if (info.specularColor.x != 0 || info.specularColor.y != 0 || info.specularColor.z != 0) + { + color = XMLoadFloat3(&info.specularColor); + effect->SetSpecularColor(color); + effect->SetSpecularPower(info.specularPower); + } + else + { + effect->DisableSpecular(); + } + + if (info.emissiveColor.x != 0 || info.emissiveColor.y != 0 || info.emissiveColor.z != 0) + { + color = XMLoadFloat3(&info.emissiveColor); + effect->SetEmissiveColor(color); + } + + if (info.diffuseTexture && *info.diffuseTexture) + { + ComPtr srv; + + factory->CreateTexture(info.diffuseTexture, deviceContext, srv.GetAddressOf()); + + effect->SetTexture(srv.Get()); + effect->SetTextureEnabled(true); + } + + if (info.biasedVertexNormals) + { + effect->SetBiasedVertexNormals(true); + } + + if (mSharing && info.name && *info.name) + { + std::lock_guard lock(mutex); + mEffectCache.insert(EffectCache::value_type(info.name, effect)); + } + + return effect; + } +} + +_Use_decl_annotations_ +void EffectFactory::Impl::CreateTexture(const wchar_t* name, ID3D11DeviceContext* deviceContext, ID3D11ShaderResourceView** textureView) +{ + if (!name || !textureView) + throw std::exception("invalid arguments"); + +#if defined(_XBOX_ONE) && defined(_TITLE) + UNREFERENCED_PARAMETER(deviceContext); +#endif + + auto it = mTextureCache.find(name); + + if (mSharing && it != mTextureCache.end()) + { + ID3D11ShaderResourceView* srv = it->second.Get(); + srv->AddRef(); + *textureView = srv; + } + else + { + wchar_t fullName[MAX_PATH] = {}; + wcscpy_s(fullName, mPath); + wcscat_s(fullName, name); + + WIN32_FILE_ATTRIBUTE_DATA fileAttr = {}; + if (!GetFileAttributesExW(fullName, GetFileExInfoStandard, &fileAttr)) + { + // Try Current Working Directory (CWD) + wcscpy_s(fullName, name); + if (!GetFileAttributesExW(fullName, GetFileExInfoStandard, &fileAttr)) + { + DebugTrace("EffectFactory could not find texture file '%ls'\n", name); + throw std::exception("CreateTexture"); + } + } + + wchar_t ext[_MAX_EXT]; + _wsplitpath_s(name, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT); + + if (_wcsicmp(ext, L".dds") == 0) + { + HRESULT hr = CreateDDSTextureFromFileEx( + device.Get(), fullName, 0, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + mForceSRGB, nullptr, textureView); + if (FAILED(hr)) + { + DebugTrace("CreateDDSTextureFromFile failed (%08X) for '%ls'\n", hr, fullName); + throw std::exception("CreateDDSTextureFromFile"); + } + } +#if !defined(_XBOX_ONE) || !defined(_TITLE) + else if (deviceContext) + { + std::lock_guard lock(mutex); + HRESULT hr = CreateWICTextureFromFileEx( + device.Get(), deviceContext, fullName, 0, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + mForceSRGB ? WIC_LOADER_FORCE_SRGB : WIC_LOADER_DEFAULT, nullptr, textureView); + if (FAILED(hr)) + { + DebugTrace("CreateWICTextureFromFile failed (%08X) for '%ls'\n", hr, fullName); + throw std::exception("CreateWICTextureFromFile"); + } + } +#endif + else + { + HRESULT hr = CreateWICTextureFromFileEx( + device.Get(), fullName, 0, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + mForceSRGB ? WIC_LOADER_FORCE_SRGB : WIC_LOADER_DEFAULT, nullptr, textureView); + if (FAILED(hr)) + { + DebugTrace("CreateWICTextureFromFile failed (%08X) for '%ls'\n", hr, fullName); + throw std::exception("CreateWICTextureFromFile"); + } + } + + if (mSharing && *name && it == mTextureCache.end()) + { + std::lock_guard lock(mutex); + mTextureCache.insert(TextureCache::value_type(name, *textureView)); + } + } +} + +void EffectFactory::Impl::ReleaseCache() +{ + std::lock_guard lock(mutex); + mEffectCache.clear(); + mEffectCacheSkinning.clear(); + mEffectCacheDualTexture.clear(); + mEffectNormalMap.clear(); + mTextureCache.clear(); +} + + + +//-------------------------------------------------------------------------------------- +// EffectFactory +//-------------------------------------------------------------------------------------- + +EffectFactory::EffectFactory(_In_ ID3D11Device* device) + : pImpl(Impl::instancePool.DemandCreate(device)) +{ +} + +EffectFactory::~EffectFactory() +{ +} + + +EffectFactory::EffectFactory(EffectFactory&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + +EffectFactory& EffectFactory::operator= (EffectFactory&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + +_Use_decl_annotations_ +std::shared_ptr EffectFactory::CreateEffect(const EffectInfo& info, ID3D11DeviceContext* deviceContext) +{ + return pImpl->CreateEffect(this, info, deviceContext); +} + +_Use_decl_annotations_ +void EffectFactory::CreateTexture(const wchar_t* name, ID3D11DeviceContext* deviceContext, ID3D11ShaderResourceView** textureView) +{ + return pImpl->CreateTexture(name, deviceContext, textureView); +} + +void EffectFactory::ReleaseCache() +{ + pImpl->ReleaseCache(); +} + +void EffectFactory::SetSharing(bool enabled) +{ + pImpl->SetSharing(enabled); +} + +void EffectFactory::EnableNormalMapEffect(bool enabled) +{ + pImpl->EnableNormalMapEffect( enabled ); +} + +void EffectFactory::EnableForceSRGB(bool forceSRGB) +{ + pImpl->EnableForceSRGB( forceSRGB ); +} + +void EffectFactory::SetDirectory(_In_opt_z_ const wchar_t* path) +{ + if (path && *path != 0) + { + wcscpy_s(pImpl->mPath, path); + size_t len = wcsnlen(pImpl->mPath, MAX_PATH); + if (len > 0 && len < (MAX_PATH - 1)) + { + // Ensure it has a trailing slash + if (pImpl->mPath[len - 1] != L'\\') + { + pImpl->mPath[len] = L'\\'; + pImpl->mPath[len + 1] = 0; + } + } + } + else + *pImpl->mPath = 0; +} \ No newline at end of file diff --git a/DirectXTK/Src/EnvironmentMapEffect.cpp b/DirectXTK/Src/EnvironmentMapEffect.cpp new file mode 100644 index 0000000..b5a4e3f --- /dev/null +++ b/DirectXTK/Src/EnvironmentMapEffect.cpp @@ -0,0 +1,606 @@ +//-------------------------------------------------------------------------------------- +// File: EnvironmentMapEffect.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "EffectCommon.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +// Constant buffer layout. Must match the shader! +struct EnvironmentMapEffectConstants +{ + XMVECTOR environmentMapSpecular; + float environmentMapAmount; + float fresnelFactor; + float pad[2]; + + XMVECTOR diffuseColor; + XMVECTOR emissiveColor; + + XMVECTOR lightDirection[IEffectLights::MaxDirectionalLights]; + XMVECTOR lightDiffuseColor[IEffectLights::MaxDirectionalLights]; + + XMVECTOR eyePosition; + + XMVECTOR fogColor; + XMVECTOR fogVector; + + XMMATRIX world; + XMVECTOR worldInverseTranspose[3]; + XMMATRIX worldViewProj; +}; + +static_assert( ( sizeof(EnvironmentMapEffectConstants) % 16 ) == 0, "CB size not padded correctly" ); + + +// Traits type describes our characteristics to the EffectBase template. +struct EnvironmentMapEffectTraits +{ + typedef EnvironmentMapEffectConstants ConstantBufferType; + + static const int VertexShaderCount = 10; + static const int PixelShaderCount = 8; + static const int ShaderPermutationCount = 40; +}; + + +// Internal EnvironmentMapEffect implementation class. +class EnvironmentMapEffect::Impl : public EffectBase +{ +public: + Impl(_In_ ID3D11Device* device); + + bool preferPerPixelLighting; + bool fresnelEnabled; + bool specularEnabled; + bool biasedVertexNormals; + + EffectLights lights; + + ComPtr environmentMap; + + int GetCurrentShaderPermutation() const; + + void Apply(_In_ ID3D11DeviceContext* deviceContext); +}; + + +// Include the precompiled shader code. +namespace +{ +#if defined(_XBOX_ONE) && defined(_TITLE) + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMap.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapFresnel.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapOneLight.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapOneLightFresnel.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapPixelLighting.inc" + + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapBn.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapFresnelBn.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapOneLightBn.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapOneLightFresnelBn.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_VSEnvMapPixelLightingBn.inc" + + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_PSEnvMap.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_PSEnvMapNoFog.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_PSEnvMapSpecular.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_PSEnvMapSpecularNoFog.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_PSEnvMapPixelLighting.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_PSEnvMapPixelLightingNoFog.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_PSEnvMapPixelLightingFresnel.inc" + #include "Shaders/Compiled/XboxOneEnvironmentMapEffect_PSEnvMapPixelLightingFresnelNoFog.inc" +#else + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMap.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapFresnel.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLight.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightFresnel.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapPixelLighting.inc" + + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapBn.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapFresnelBn.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightBn.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapOneLightFresnelBn.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_VSEnvMapPixelLightingBn.inc" + + #include "Shaders/Compiled/EnvironmentMapEffect_PSEnvMap.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_PSEnvMapNoFog.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_PSEnvMapSpecular.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_PSEnvMapSpecularNoFog.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLighting.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingNoFog.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingFresnel.inc" + #include "Shaders/Compiled/EnvironmentMapEffect_PSEnvMapPixelLightingFresnelNoFog.inc" +#endif +} + + +template<> +const ShaderBytecode EffectBase::VertexShaderBytecode[] = +{ + { EnvironmentMapEffect_VSEnvMap, sizeof(EnvironmentMapEffect_VSEnvMap) }, + { EnvironmentMapEffect_VSEnvMapFresnel, sizeof(EnvironmentMapEffect_VSEnvMapFresnel) }, + { EnvironmentMapEffect_VSEnvMapOneLight, sizeof(EnvironmentMapEffect_VSEnvMapOneLight) }, + { EnvironmentMapEffect_VSEnvMapOneLightFresnel, sizeof(EnvironmentMapEffect_VSEnvMapOneLightFresnel) }, + { EnvironmentMapEffect_VSEnvMapPixelLighting, sizeof(EnvironmentMapEffect_VSEnvMapPixelLighting) }, + + { EnvironmentMapEffect_VSEnvMapBn, sizeof(EnvironmentMapEffect_VSEnvMapBn) }, + { EnvironmentMapEffect_VSEnvMapFresnelBn, sizeof(EnvironmentMapEffect_VSEnvMapFresnelBn) }, + { EnvironmentMapEffect_VSEnvMapOneLightBn, sizeof(EnvironmentMapEffect_VSEnvMapOneLightBn) }, + { EnvironmentMapEffect_VSEnvMapOneLightFresnelBn, sizeof(EnvironmentMapEffect_VSEnvMapOneLightFresnelBn) }, + { EnvironmentMapEffect_VSEnvMapPixelLightingBn, sizeof(EnvironmentMapEffect_VSEnvMapPixelLightingBn) }, +}; + + +template<> +const int EffectBase::VertexShaderIndices[] = +{ + 0, // basic + 0, // basic, no fog + 1, // fresnel + 1, // fresnel, no fog + 0, // specular + 0, // specular, no fog + 1, // fresnel + specular + 1, // fresnel + specular, no fog + + 2, // one light + 2, // one light, no fog + 3, // one light, fresnel + 3, // one light, fresnel, no fog + 2, // one light, specular + 2, // one light, specular, no fog + 3, // one light, fresnel + specular + 3, // one light, fresnel + specular, no fog + + 4, // pixel lighting + 4, // pixel lighting, no fog + 4, // pixel lighting, fresnel + 4, // pixel lighting, fresnel, no fog + + 5, // basic (biased vertex normals) + 5, // basic (biased vertex normals), no fog + 6, // fresnel (biased vertex normals) + 6, // fresnel (biased vertex normals), no fog + 5, // specular (biased vertex normals) + 5, // specular (biased vertex normals), no fog + 6, // fresnel + specular (biased vertex normals) + 6, // fresnel + specular (biased vertex normals), no fog + + 7, // one light (biased vertex normals) + 7, // one light (biased vertex normals), no fog + 8, // one light (biased vertex normals), fresnel + 8, // one light (biased vertex normals), fresnel, no fog + 7, // one light (biased vertex normals), specular + 7, // one light (biased vertex normals), specular, no fog + 8, // one light (biased vertex normals), fresnel + specular + 8, // one light (biased vertex normals), fresnel + specular, no fog + + 9, // pixel lighting (biased vertex normals) + 9, // pixel lighting (biased vertex normals), no fog + 9, // pixel lighting (biased vertex normals), fresnel + 9, // pixel lighting (biased vertex normals), fresnel, no fog +}; + + +template<> +const ShaderBytecode EffectBase::PixelShaderBytecode[] = +{ + { EnvironmentMapEffect_PSEnvMap, sizeof(EnvironmentMapEffect_PSEnvMap) }, + { EnvironmentMapEffect_PSEnvMapNoFog, sizeof(EnvironmentMapEffect_PSEnvMapNoFog) }, + { EnvironmentMapEffect_PSEnvMapSpecular, sizeof(EnvironmentMapEffect_PSEnvMapSpecular) }, + { EnvironmentMapEffect_PSEnvMapSpecularNoFog, sizeof(EnvironmentMapEffect_PSEnvMapSpecularNoFog) }, + { EnvironmentMapEffect_PSEnvMapPixelLighting, sizeof(EnvironmentMapEffect_PSEnvMapPixelLighting) }, + { EnvironmentMapEffect_PSEnvMapPixelLightingNoFog, sizeof(EnvironmentMapEffect_PSEnvMapPixelLightingNoFog) }, + { EnvironmentMapEffect_PSEnvMapPixelLightingFresnel, sizeof(EnvironmentMapEffect_PSEnvMapPixelLightingFresnel) }, + { EnvironmentMapEffect_PSEnvMapPixelLightingFresnelNoFog, sizeof(EnvironmentMapEffect_PSEnvMapPixelLightingFresnelNoFog) }, +}; + + +template<> +const int EffectBase::PixelShaderIndices[] = +{ + 0, // basic + 1, // basic, no fog + 0, // fresnel + 1, // fresnel, no fog + 2, // specular + 3, // specular, no fog + 2, // fresnel + specular + 3, // fresnel + specular, no fog + + 0, // one light + 1, // one light, no fog + 0, // one light, fresnel + 1, // one light, fresnel, no fog + 2, // one light, specular + 3, // one light, specular, no fog + 2, // one light, fresnel + specular + 3, // one light, fresnel + specular, no fog + + 4, // per pixel lighting + 5, // per pixel lighting, no fog + 6, // per pixel lighting, fresnel + 7, // per pixel lighting, fresnel, no fog + + 0, // basic (biased vertex normals) + 1, // basic (biased vertex normals), no fog + 0, // fresnel (biased vertex normals) + 1, // fresnel (biased vertex normals), no fog + 2, // specular (biased vertex normals) + 3, // specular (biased vertex normals), no fog + 2, // fresnel + specular (biased vertex normals) + 3, // fresnel + specular (biased vertex normals), no fog + + 0, // one light (biased vertex normals) + 1, // one light (biased vertex normals), no fog + 0, // one light (biased vertex normals), fresnel + 1, // one light (biased vertex normals), fresnel, no fog + 2, // one light (biased vertex normals), specular + 3, // one light (biased vertex normals), specular, no fog + 2, // one light (biased vertex normals), fresnel + specular + 3, // one light (biased vertex normals), fresnel + specular, no fog + + 4, // per pixel lighting (biased vertex normals) + 5, // per pixel lighting (biased vertex normals), no fog + 6, // per pixel lighting (biased vertex normals), fresnel + 7, // per pixel lighting (biased vertex normals), fresnel, no fog +}; + + +// Global pool of per-device EnvironmentMapEffect resources. +SharedResourcePool::DeviceResources> EffectBase::deviceResourcesPool; + + +// Constructor. +EnvironmentMapEffect::Impl::Impl(_In_ ID3D11Device* device) + : EffectBase(device), + preferPerPixelLighting(false), + fresnelEnabled(true), + specularEnabled(false), + biasedVertexNormals(false) +{ + static_assert( _countof(EffectBase::VertexShaderIndices) == EnvironmentMapEffectTraits::ShaderPermutationCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::VertexShaderBytecode) == EnvironmentMapEffectTraits::VertexShaderCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::PixelShaderBytecode) == EnvironmentMapEffectTraits::PixelShaderCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::PixelShaderIndices) == EnvironmentMapEffectTraits::ShaderPermutationCount, "array/max mismatch" ); + + constants.environmentMapAmount = 1; + constants.fresnelFactor = 1; + + XMVECTOR unwantedOutput[MaxDirectionalLights]; + + lights.InitializeConstants(unwantedOutput[0], constants.lightDirection, constants.lightDiffuseColor, unwantedOutput); +} + + +int EnvironmentMapEffect::Impl::GetCurrentShaderPermutation() const +{ + int permutation = 0; + + // Use optimized shaders if fog is disabled. + if (!fog.enabled) + { + permutation += 1; + } + + // Support fresnel? + if (fresnelEnabled) + { + permutation += 2; + } + + if (preferPerPixelLighting) + { + permutation += 16; + } + else + { + // Support specular? + if (specularEnabled) + { + permutation += 4; + } + + // Use the only-bother-with-the-first-light shader optimization? + if (!lights.lightEnabled[1] && !lights.lightEnabled[2]) + { + permutation += 8; + } + } + + if (biasedVertexNormals) + { + // Compressed normals need to be scaled and biased in the vertex shader. + permutation += 20; + } + + return permutation; +} + + +// Sets our state onto the D3D device. +void EnvironmentMapEffect::Impl::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + // Compute derived parameter values. + matrices.SetConstants(dirtyFlags, constants.worldViewProj); + + fog.SetConstants(dirtyFlags, matrices.worldView, constants.fogVector); + + lights.SetConstants(dirtyFlags, matrices, constants.world, constants.worldInverseTranspose, constants.eyePosition, constants.diffuseColor, constants.emissiveColor, true); + + // Set the textures. + ID3D11ShaderResourceView* textures[2] = + { + texture.Get(), + environmentMap.Get(), + }; + + deviceContext->PSSetShaderResources(0, 2, textures); + + // Set shaders and constant buffers. + ApplyShaders(deviceContext, GetCurrentShaderPermutation()); +} + + +// Public constructor. +EnvironmentMapEffect::EnvironmentMapEffect(_In_ ID3D11Device* device) + : pImpl(new Impl(device)) +{ +} + + +// Move constructor. +EnvironmentMapEffect::EnvironmentMapEffect(EnvironmentMapEffect&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +EnvironmentMapEffect& EnvironmentMapEffect::operator= (EnvironmentMapEffect&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +EnvironmentMapEffect::~EnvironmentMapEffect() +{ +} + + +// IEffect methods. +void EnvironmentMapEffect::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + pImpl->Apply(deviceContext); +} + + +void EnvironmentMapEffect::GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) +{ + pImpl->GetVertexShaderBytecode(pImpl->GetCurrentShaderPermutation(), pShaderByteCode, pByteCodeLength); +} + + +// Camera settings. +void XM_CALLCONV EnvironmentMapEffect::SetWorld(FXMMATRIX value) +{ + pImpl->matrices.world = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetView(FXMMATRIX value) +{ + pImpl->matrices.view = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetProjection(FXMMATRIX value) +{ + pImpl->matrices.projection = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) +{ + pImpl->matrices.world = world; + pImpl->matrices.view = view; + pImpl->matrices.projection = projection; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +// Material settings. +void XM_CALLCONV EnvironmentMapEffect::SetDiffuseColor(FXMVECTOR value) +{ + pImpl->lights.diffuseColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetEmissiveColor(FXMVECTOR value) +{ + pImpl->lights.emissiveColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void EnvironmentMapEffect::SetAlpha(float value) +{ + pImpl->lights.alpha = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetColorAndAlpha(FXMVECTOR value) +{ + pImpl->lights.diffuseColor = value; + pImpl->lights.alpha = XMVectorGetW(value); + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +// Light settings. +void EnvironmentMapEffect::SetLightingEnabled(bool value) +{ + if (!value) + { + throw std::exception("EnvironmentMapEffect does not support turning off lighting"); + } +} + + +void EnvironmentMapEffect::SetPerPixelLighting(bool value) +{ + pImpl->preferPerPixelLighting = value; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetAmbientLightColor(FXMVECTOR value) +{ + pImpl->lights.ambientLightColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void EnvironmentMapEffect::SetLightEnabled(int whichLight, bool value) +{ + XMVECTOR unwantedOutput[MaxDirectionalLights] = {}; + + pImpl->dirtyFlags |= pImpl->lights.SetLightEnabled(whichLight, value, pImpl->constants.lightDiffuseColor, unwantedOutput); +} + + +void XM_CALLCONV EnvironmentMapEffect::SetLightDirection(int whichLight, FXMVECTOR value) +{ + EffectLights::ValidateLightIndex(whichLight); + + pImpl->constants.lightDirection[whichLight] = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetLightDiffuseColor(int whichLight, FXMVECTOR value) +{ + pImpl->dirtyFlags |= pImpl->lights.SetLightDiffuseColor(whichLight, value, pImpl->constants.lightDiffuseColor); +} + + +void XM_CALLCONV EnvironmentMapEffect::SetLightSpecularColor(int, FXMVECTOR) +{ + // Unsupported interface method. +} + + +void EnvironmentMapEffect::EnableDefaultLighting() +{ + EffectLights::EnableDefaultLighting(this); +} + + +// Fog settings. +void EnvironmentMapEffect::SetFogEnabled(bool value) +{ + pImpl->fog.enabled = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogEnable; +} + + +void EnvironmentMapEffect::SetFogStart(float value) +{ + pImpl->fog.start = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void EnvironmentMapEffect::SetFogEnd(float value) +{ + pImpl->fog.end = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetFogColor(FXMVECTOR value) +{ + pImpl->constants.fogColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +// Texture settings. +void EnvironmentMapEffect::SetTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture = value; +} + + +void EnvironmentMapEffect::SetEnvironmentMap(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->environmentMap = value; +} + + +// Additional settings. +void EnvironmentMapEffect::SetEnvironmentMapAmount(float value) +{ + pImpl->constants.environmentMapAmount = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void XM_CALLCONV EnvironmentMapEffect::SetEnvironmentMapSpecular(FXMVECTOR value) +{ + pImpl->constants.environmentMapSpecular = value; + + pImpl->specularEnabled = !XMVector3Equal(value, XMVectorZero()); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void EnvironmentMapEffect::SetFresnelFactor(float value) +{ + pImpl->constants.fresnelFactor = value; + + pImpl->fresnelEnabled = (value != 0); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +// Normal compression settings. +void EnvironmentMapEffect::SetBiasedVertexNormals(bool value) +{ + pImpl->biasedVertexNormals = value; +} diff --git a/DirectXTK/Src/GamePad.cpp b/DirectXTK/Src/GamePad.cpp new file mode 100644 index 0000000..23d2c72 --- /dev/null +++ b/DirectXTK/Src/GamePad.cpp @@ -0,0 +1,1440 @@ +//-------------------------------------------------------------------------------------- +// File: GamePad.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" + +#include "GamePad.h" +#include "PlatformHelpers.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +namespace +{ + float ApplyLinearDeadZone( float value, float maxValue, float deadZoneSize ) + { + if ( value < -deadZoneSize ) + { + // Increase negative values to remove the deadzone discontinuity. + value += deadZoneSize; + } + else if ( value > deadZoneSize ) + { + // Decrease positive values to remove the deadzone discontinuity. + value -= deadZoneSize; + } + else + { + // Values inside the deadzone come out zero. + return 0; + } + + // Scale into 0-1 range. + float scaledValue = value / (maxValue - deadZoneSize); + return std::max( -1.f, std::min( scaledValue, 1.f ) ); + } + + void ApplyStickDeadZone( float x, float y, GamePad::DeadZone deadZoneMode, float maxValue, float deadZoneSize, + _Out_ float& resultX, _Out_ float& resultY) + { + switch( deadZoneMode ) + { + case GamePad::DEAD_ZONE_INDEPENDENT_AXES: + resultX = ApplyLinearDeadZone( x, maxValue, deadZoneSize ); + resultY = ApplyLinearDeadZone( y, maxValue, deadZoneSize ); + break; + + case GamePad::DEAD_ZONE_CIRCULAR: + { + float dist = sqrtf( x*x + y*y ); + float wanted = ApplyLinearDeadZone( dist, maxValue, deadZoneSize ); + + float scale = (wanted > 0.f) ? ( wanted / dist ) : 0.f; + + resultX = std::max( -1.f, std::min( x * scale, 1.f ) ); + resultY = std::max( -1.f, std::min( y * scale, 1.f ) ); + } + break; + + default: // GamePad::DEAD_ZONE_NONE + resultX = ApplyLinearDeadZone( x, maxValue, 0 ); + resultY = ApplyLinearDeadZone( y, maxValue, 0 ); + break; + } + } +} + + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + +//====================================================================================== +// Windows::Gaming::Input (Windows 10) +//====================================================================================== + +#pragma warning(push) +#pragma warning(disable : 4471) +#include +#pragma warning(pop) + +class GamePad::Impl +{ +public: + Impl(GamePad* owner) : + mOwner(owner), + mCtrlChanged(INVALID_HANDLE_VALUE), + mUserChanged(INVALID_HANDLE_VALUE), + mMostRecentGamepad(0) + { + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::Foundation; + + mAddedToken.value = 0; + mRemovedToken.value = 0; + + memset( &mUserChangeToken, 0, sizeof(mUserChangeToken) ); + + if ( s_gamePad ) + { + throw std::exception( "GamePad is a singleton" ); + } + + s_gamePad = this; + + mChanged.reset( CreateEventEx( nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE ) ); + if ( !mChanged ) + { + throw std::exception( "CreateEventEx" ); + } + + ThrowIfFailed( GetActivationFactory( HStringReference(RuntimeClass_Windows_Gaming_Input_Gamepad).Get(), mStatics.GetAddressOf() ) ); + + typedef __FIEventHandler_1_Windows__CGaming__CInput__CGamepad AddedHandler; + ThrowIfFailed( mStatics->add_GamepadAdded(Callback(GamepadAdded).Get(), &mAddedToken ) ); + + typedef __FIEventHandler_1_Windows__CGaming__CInput__CGamepad RemovedHandler; + ThrowIfFailed( mStatics->add_GamepadRemoved(Callback(GamepadRemoved).Get(), &mRemovedToken ) ); + + ScanGamePads(); + } + + ~Impl() + { + using namespace ABI::Windows::Gaming::Input; + + for (size_t j = 0; j < MAX_PLAYER_COUNT; ++j) + { + if (mGamePad[j]) + { + ComPtr ctrl; + HRESULT hr = mGamePad[j].As(&ctrl); + if (SUCCEEDED(hr) && ctrl) + { + (void)ctrl->remove_UserChanged( mUserChangeToken[j] ); + mUserChangeToken[j].value = 0; + } + + mGamePad[j].Reset(); + } + } + + if ( mStatics ) + { + (void)mStatics->remove_GamepadAdded( mAddedToken ); + mAddedToken.value = 0; + + (void)mStatics->remove_GamepadRemoved( mRemovedToken ); + mRemovedToken.value = 0; + + mStatics.Reset(); + } + + s_gamePad = nullptr; + } + + void GetState( int player, _Out_ State& state, DeadZone deadZoneMode ) + { + using namespace Microsoft::WRL; + using namespace ABI::Windows::Gaming::Input; + + if ( WaitForSingleObjectEx( mChanged.get(), 0, FALSE ) == WAIT_OBJECT_0 ) + { + ScanGamePads(); + } + + if (player == -1) + player = mMostRecentGamepad; + + if ( ( player >= 0 ) && ( player < MAX_PLAYER_COUNT ) ) + { + if ( mGamePad[ player ] ) + { + GamepadReading reading; + HRESULT hr = mGamePad[ player ]->GetCurrentReading( &reading ); + if ( SUCCEEDED(hr) ) + { + state.connected = true; + state.packet = reading.Timestamp; + + state.buttons.a = (reading.Buttons & GamepadButtons::GamepadButtons_A) != 0; + state.buttons.b = (reading.Buttons & GamepadButtons::GamepadButtons_B) != 0; + state.buttons.x = (reading.Buttons & GamepadButtons::GamepadButtons_X) != 0; + state.buttons.y = (reading.Buttons & GamepadButtons::GamepadButtons_Y) != 0; + + state.buttons.leftStick = (reading.Buttons & GamepadButtons::GamepadButtons_LeftThumbstick) != 0; + state.buttons.rightStick = (reading.Buttons & GamepadButtons::GamepadButtons_RightThumbstick) != 0; + + state.buttons.leftShoulder = (reading.Buttons & GamepadButtons::GamepadButtons_LeftShoulder) != 0; + state.buttons.rightShoulder = (reading.Buttons & GamepadButtons::GamepadButtons_RightShoulder) != 0; + + state.buttons.back = (reading.Buttons & GamepadButtons::GamepadButtons_View) != 0; + state.buttons.start = (reading.Buttons & GamepadButtons::GamepadButtons_Menu) != 0; + + state.dpad.up = (reading.Buttons & GamepadButtons::GamepadButtons_DPadUp) != 0; + state.dpad.down = (reading.Buttons & GamepadButtons::GamepadButtons_DPadDown) != 0; + state.dpad.right = (reading.Buttons & GamepadButtons::GamepadButtons_DPadRight) != 0; + state.dpad.left = (reading.Buttons & GamepadButtons::GamepadButtons_DPadLeft) != 0; + + ApplyStickDeadZone( static_cast(reading.LeftThumbstickX), static_cast(reading.LeftThumbstickY), + deadZoneMode, 1.f, .24f /* Recommended Xbox One deadzone */, + state.thumbSticks.leftX, state.thumbSticks.leftY ); + + ApplyStickDeadZone( static_cast(reading.RightThumbstickX), static_cast(reading.RightThumbstickY), + deadZoneMode, 1.f, .24f /* Recommended Xbox One deadzone */, + state.thumbSticks.rightX, state.thumbSticks.rightY ); + + state.triggers.left = static_cast(reading.LeftTrigger); + state.triggers.right = static_cast(reading.RightTrigger); + + return; + } + } + } + + memset( &state, 0, sizeof(State) ); + } + + void GetCapabilities( int player, Capabilities& caps ) + { + using namespace Microsoft::WRL; + using namespace ABI::Windows::System; + using namespace ABI::Windows::Gaming::Input; + + if ( WaitForSingleObjectEx( mChanged.get(), 0, FALSE ) == WAIT_OBJECT_0 ) + { + ScanGamePads(); + } + + if (player == -1) + player = mMostRecentGamepad; + + if ( ( player >= 0 ) && ( player < MAX_PLAYER_COUNT ) ) + { + if ( mGamePad[ player ] ) + { + caps.connected = true; + caps.gamepadType = Capabilities::GAMEPAD; + caps.id.clear(); + + ComPtr ctrl; + HRESULT hr = mGamePad[player].As(&ctrl); + if (SUCCEEDED(hr) && ctrl) + { + ComPtr user; + hr = ctrl->get_User(user.GetAddressOf()); + if (SUCCEEDED(hr) && user != nullptr) + { + Wrappers::HString str; + hr = user->get_NonRoamableId(str.GetAddressOf()); + if (SUCCEEDED(hr)) + { + caps.id = str.GetRawBuffer(nullptr); + } + } + } + return; + } + } + + caps.id.clear(); + caps = {}; + } + + bool SetVibration( int player, float leftMotor, float rightMotor, float leftTrigger, float rightTrigger ) + { + using namespace ABI::Windows::Gaming::Input; + + if (player == -1) + player = mMostRecentGamepad; + + if ( ( player >= 0 ) && ( player < MAX_PLAYER_COUNT ) ) + { + if ( mGamePad[ player ] ) + { + GamepadVibration vib; + vib.LeftMotor = leftMotor; + vib.RightMotor = rightMotor; + vib.LeftTrigger = leftTrigger; + vib.RightTrigger = rightTrigger; + HRESULT hr = mGamePad[ player ]->put_Vibration(vib); + + if ( SUCCEEDED(hr) ) + return true; + } + } + + return false; + } + + void Suspend() + { + for( size_t j = 0; j < MAX_PLAYER_COUNT; ++j ) + { + mGamePad[ j ].Reset(); + } + } + + void Resume() + { + // Make sure we rescan gamepads + SetEvent( mChanged.get() ); + } + + GamePad* mOwner; + + static GamePad::Impl* s_gamePad; + + HANDLE mCtrlChanged; + HANDLE mUserChanged; + +private: + int mMostRecentGamepad; + + void ScanGamePads() + { + using namespace Microsoft::WRL; + using namespace ABI::Windows::Foundation::Collections; + using namespace ABI::Windows::Gaming::Input; + + ComPtr> pads; + ThrowIfFailed( mStatics->get_Gamepads( pads.GetAddressOf() ) ); + + unsigned int count = 0; + ThrowIfFailed( pads->get_Size( &count ) ); + + // Check for removed gamepads + for( size_t j = 0; j < MAX_PLAYER_COUNT; ++j ) + { + if ( mGamePad[ j ] ) + { + unsigned int k = 0; + for( ; k < count; ++k ) + { + ComPtr pad; + HRESULT hr = pads->GetAt( k, pad.GetAddressOf() ); + if ( SUCCEEDED(hr) && ( pad == mGamePad[ j ] ) ) + { + break; + } + } + + if ( k >= count ) + { + ComPtr ctrl; + HRESULT hr = mGamePad[ j ].As(&ctrl); + if (SUCCEEDED(hr) && ctrl) + { + (void)ctrl->remove_UserChanged( mUserChangeToken[ j ] ); + mUserChangeToken[j].value = 0; + } + + mGamePad[ j ].Reset(); + } + } + } + + // Check for added gamepads + for( unsigned int j = 0; j < count; ++j ) + { + ComPtr pad; + HRESULT hr = pads->GetAt( j, pad.GetAddressOf() ); + if ( SUCCEEDED(hr) ) + { + size_t empty = MAX_PLAYER_COUNT; + size_t k = 0; + for( ; k < MAX_PLAYER_COUNT; ++k ) + { + if ( mGamePad[ k ] == pad ) + { + if (j == (count - 1)) + mMostRecentGamepad = static_cast(k); + break; + } + else if ( !mGamePad[ k ] ) + { + if ( empty >= MAX_PLAYER_COUNT ) + empty = k; + } + } + + if ( k >= MAX_PLAYER_COUNT ) + { + // Silently ignore "extra" gamepads as there's no hard limit + if ( empty < MAX_PLAYER_COUNT ) + { + mGamePad[ empty ] = pad; + if (j == (count - 1)) + mMostRecentGamepad = static_cast(empty); + + ComPtr ctrl; + hr = pad.As(&ctrl); + if (SUCCEEDED(hr) && ctrl) + { + typedef __FITypedEventHandler_2_Windows__CGaming__CInput__CIGameController_Windows__CSystem__CUserChangedEventArgs UserHandler; + ThrowIfFailed(ctrl->add_UserChanged(Callback(UserChanged).Get(), &mUserChangeToken[ empty ])); + } + } + } + } + } + } + + ComPtr mStatics; + ComPtr mGamePad[ MAX_PLAYER_COUNT ]; + EventRegistrationToken mUserChangeToken[ MAX_PLAYER_COUNT ]; + + EventRegistrationToken mAddedToken; + EventRegistrationToken mRemovedToken; + + ScopedHandle mChanged; + + static HRESULT GamepadAdded( IInspectable *, ABI::Windows::Gaming::Input::IGamepad* ) + { + if ( s_gamePad ) + { + SetEvent( s_gamePad->mChanged.get() ); + + if (s_gamePad->mCtrlChanged != INVALID_HANDLE_VALUE) + { + SetEvent( s_gamePad->mCtrlChanged ); + } + } + return S_OK; + } + + static HRESULT GamepadRemoved( IInspectable *, ABI::Windows::Gaming::Input::IGamepad* ) + { + if ( s_gamePad ) + { + SetEvent( s_gamePad->mChanged.get() ); + + if (s_gamePad->mCtrlChanged != INVALID_HANDLE_VALUE) + { + SetEvent( s_gamePad->mCtrlChanged ); + } + } + return S_OK; + } + + static HRESULT UserChanged( ABI::Windows::Gaming::Input::IGameController*, ABI::Windows::System::IUserChangedEventArgs* ) + { + if (s_gamePad) + { + if (s_gamePad->mUserChanged != INVALID_HANDLE_VALUE) + { + SetEvent( s_gamePad->mUserChanged ); + } + } + return S_OK; + } +}; + +GamePad::Impl* GamePad::Impl::s_gamePad = nullptr; + +#elif defined(_XBOX_ONE) + +//====================================================================================== +// Windows::Xbox::Input (Xbox One) +//====================================================================================== + +#include + +#include + +class GamePad::Impl +{ +public: + class GamepadAddedListener : public Microsoft::WRL::RuntimeClass, + ABI::Windows::Foundation::IEventHandler, + Microsoft::WRL::FtmBase> + { + public: + GamepadAddedListener(HANDLE event) : mEvent(event) {} + + STDMETHOD(Invoke)(_In_ IInspectable *, _In_ ABI::Windows::Xbox::Input::IGamepadAddedEventArgs *) override + { + SetEvent(mEvent); + + auto pad = GamePad::Impl::s_gamePad; + + if (pad && pad->mCtrlChanged != INVALID_HANDLE_VALUE) + { + SetEvent(pad->mCtrlChanged); + } + return S_OK; + } + + private: + HANDLE mEvent; + }; + + class GamepadRemovedListener : public Microsoft::WRL::RuntimeClass, + ABI::Windows::Foundation::IEventHandler, + Microsoft::WRL::FtmBase> + { + public: + GamepadRemovedListener(HANDLE event) : mEvent(event) {} + + STDMETHOD(Invoke)(_In_ IInspectable *, _In_ ABI::Windows::Xbox::Input::IGamepadRemovedEventArgs *) override + { + SetEvent(mEvent); + + auto pad = GamePad::Impl::s_gamePad; + + if (pad && pad->mCtrlChanged != INVALID_HANDLE_VALUE) + { + SetEvent(pad->mCtrlChanged); + } + return S_OK; + } + + private: + HANDLE mEvent; + }; + + class UserPairingListener : public Microsoft::WRL::RuntimeClass, + ABI::Windows::Foundation::IEventHandler, + Microsoft::WRL::FtmBase> + { + public: + UserPairingListener() {} + + STDMETHOD(Invoke)(_In_ IInspectable *, _In_ ABI::Windows::Xbox::Input::IControllerPairingChangedEventArgs *) override + { + auto pad = GamePad::Impl::s_gamePad; + + if (pad && pad->mUserChanged != INVALID_HANDLE_VALUE) + { + SetEvent(pad->mUserChanged); + } + return S_OK; + } + }; + + Impl(GamePad *owner) : + mOwner(owner), + mCtrlChanged(INVALID_HANDLE_VALUE), + mUserChanged(INVALID_HANDLE_VALUE), + mMostRecentGamepad(0) + { + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::Foundation; + + mAddedToken.value = 0; + mRemovedToken.value = 0; + mUserParingToken.value = 0; + + if ( s_gamePad ) + { + throw std::exception( "GamePad is a singleton" ); + } + + s_gamePad = this; + + mChanged.reset( CreateEventEx( nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE ) ); + if ( !mChanged ) + { + throw std::exception( "CreateEventEx" ); + } + + ThrowIfFailed( GetActivationFactory( HStringReference(RuntimeClass_Windows_Xbox_Input_Gamepad).Get(), mStatics.GetAddressOf() ) ); + + ThrowIfFailed( GetActivationFactory( HStringReference(RuntimeClass_Windows_Xbox_Input_Controller).Get(), mStaticsCtrl.GetAddressOf() ) ); + + ThrowIfFailed( mStatics->add_GamepadAdded(Make(mChanged.get()).Get(), &mAddedToken ) ); + + ThrowIfFailed( mStatics->add_GamepadRemoved(Make(mChanged.get()).Get(), &mRemovedToken ) ); + + ThrowIfFailed( mStaticsCtrl->add_ControllerPairingChanged(Make().Get(), &mUserParingToken ) ); + + ScanGamePads(); + } + + ~Impl() + { + if ( mStatics ) + { + (void)mStatics->remove_GamepadAdded( mAddedToken ); + mAddedToken.value = 0; + + (void)mStatics->remove_GamepadRemoved( mRemovedToken ); + mRemovedToken.value = 0; + + mStatics.Reset(); + } + + if (mStaticsCtrl) + { + (void)mStaticsCtrl->remove_ControllerPairingChanged( mUserParingToken ); + mUserParingToken.value = 0; + + mStaticsCtrl.Reset(); + } + + s_gamePad = nullptr; + } + + void GetState( int player, _Out_ State& state, DeadZone deadZoneMode ) + { + using namespace Microsoft::WRL; + using namespace ABI::Windows::Xbox::Input; + + if ( WaitForSingleObjectEx( mChanged.get(), 0, FALSE ) == WAIT_OBJECT_0 ) + { + ScanGamePads(); + } + + if (player == -1) + player = mMostRecentGamepad; + + if ( ( player >= 0 ) && ( player < MAX_PLAYER_COUNT ) ) + { + if ( mGamePad[ player ] ) + { + RawGamepadReading reading; + HRESULT hr = mGamePad[ player ]->GetRawCurrentReading( &reading ); + if ( SUCCEEDED(hr) ) + { + state.connected = true; + state.packet = reading.Timestamp; + + state.buttons.a = (reading.Buttons & GamepadButtons::GamepadButtons_A) != 0; + state.buttons.b = (reading.Buttons & GamepadButtons::GamepadButtons_B) != 0; + state.buttons.x = (reading.Buttons & GamepadButtons::GamepadButtons_X) != 0; + state.buttons.y = (reading.Buttons & GamepadButtons::GamepadButtons_Y) != 0; + + state.buttons.leftStick = (reading.Buttons & GamepadButtons::GamepadButtons_LeftThumbstick) != 0; + state.buttons.rightStick = (reading.Buttons & GamepadButtons::GamepadButtons_RightThumbstick) != 0; + + state.buttons.leftShoulder = (reading.Buttons & GamepadButtons::GamepadButtons_LeftShoulder) != 0; + state.buttons.rightShoulder = (reading.Buttons & GamepadButtons::GamepadButtons_RightShoulder) != 0; + + state.buttons.back = (reading.Buttons & GamepadButtons::GamepadButtons_View) != 0; + state.buttons.start = (reading.Buttons & GamepadButtons::GamepadButtons_Menu) != 0; + + state.dpad.up = (reading.Buttons & GamepadButtons::GamepadButtons_DPadUp) != 0; + state.dpad.down = (reading.Buttons & GamepadButtons::GamepadButtons_DPadDown) != 0; + state.dpad.right = (reading.Buttons & GamepadButtons::GamepadButtons_DPadRight) != 0; + state.dpad.left = (reading.Buttons & GamepadButtons::GamepadButtons_DPadLeft) != 0; + + ApplyStickDeadZone( reading.LeftThumbstickX, reading.LeftThumbstickY, + deadZoneMode, 1.f, .24f /* Recommended Xbox One deadzone */, + state.thumbSticks.leftX, state.thumbSticks.leftY ); + + ApplyStickDeadZone( reading.RightThumbstickX, reading.RightThumbstickY, + deadZoneMode, 1.f, .24f /* Recommended Xbox One deadzone */, + state.thumbSticks.rightX, state.thumbSticks.rightY ); + + state.triggers.left = reading.LeftTrigger; + state.triggers.right = reading.RightTrigger; + + return; + } + } + } + + memset( &state, 0, sizeof(State) ); + } + + void GetCapabilities( int player, _Out_ Capabilities& caps ) + { + using namespace Microsoft::WRL; + using namespace ABI::Windows::Xbox::Input; + + if ( WaitForSingleObjectEx( mChanged.get(), 0, FALSE ) == WAIT_OBJECT_0 ) + { + ScanGamePads(); + } + + if (player == -1) + player = mMostRecentGamepad; + + if ( ( player >= 0 ) && ( player < MAX_PLAYER_COUNT ) ) + { + if ( mGamePad[ player ] ) + { + caps.connected = true; + caps.gamepadType = Capabilities::UNKNOWN; + + ComPtr ctrl; + HRESULT hr = mGamePad[ player ].As( &ctrl ); + if ( SUCCEEDED(hr) && ctrl ) + { + hr = ctrl->get_Id( &caps.id ); + if ( FAILED(hr) ) + caps.id = 0; + + Wrappers::HString str; + hr = ctrl->get_Type(str.GetAddressOf()); + if ( SUCCEEDED(hr) ) + { + const wchar_t* typeStr = str.GetRawBuffer(nullptr); + if ( _wcsicmp(typeStr, L"Windows.Xbox.Input.Gamepad") == 0 ) + { + caps.gamepadType = Capabilities::GAMEPAD; + } + else if ( _wcsicmp(typeStr, L"Microsoft.Xbox.Input.ArcadeStick") == 0 ) + { + caps.gamepadType = Capabilities::ARCADE_STICK; + } + else if ( _wcsicmp(typeStr, L"Microsoft.Xbox.Input.Wheel") == 0 ) + { + caps.gamepadType = Capabilities::WHEEL; + } + } + } + else + caps.id = 0; + + return; + } + } + + memset( &caps, 0, sizeof(Capabilities) ); + } + + bool SetVibration( int player, float leftMotor, float rightMotor, float leftTrigger, float rightTrigger ) + { + using namespace ABI::Windows::Xbox::Input; + + if (player == -1) + player = mMostRecentGamepad; + + if ( ( player >= 0 ) && ( player < MAX_PLAYER_COUNT ) ) + { + if ( mGamePad[ player ] ) + { + HRESULT hr; + try + { + GamepadVibration vib; + vib.LeftMotorLevel = leftMotor; + vib.RightMotorLevel = rightMotor; + vib.LeftTriggerLevel = leftTrigger; + vib.RightTriggerLevel = rightTrigger; + hr = mGamePad[ player ]->SetVibration(vib); + } + catch( ... ) + { + // Handle case where gamepad might be invalid + hr = E_FAIL; + } + + if ( SUCCEEDED(hr) ) + return true; + } + } + + return false; + } + + void Suspend() + { + for( size_t j = 0; j < MAX_PLAYER_COUNT; ++j ) + { + mGamePad[ j ].Reset(); + } + } + + void Resume() + { + // Make sure we rescan gamepads + SetEvent( mChanged.get() ); + } + + GamePad* mOwner; + + static GamePad::Impl* s_gamePad; + + HANDLE mCtrlChanged; + HANDLE mUserChanged; + +private: + int mMostRecentGamepad; + + void ScanGamePads() + { + using namespace ABI::Windows::Foundation::Collections; + using namespace ABI::Windows::Xbox::Input; + + ComPtr> pads; + ThrowIfFailed( mStatics->get_Gamepads( pads.GetAddressOf() ) ); + + unsigned int count = 0; + ThrowIfFailed( pads->get_Size( &count ) ); + + // Check for removed gamepads + for( size_t j = 0; j < MAX_PLAYER_COUNT; ++j ) + { + if ( mGamePad[ j ] ) + { + unsigned int k = 0; + for( ; k < count; ++k ) + { + ComPtr pad; + HRESULT hr = pads->GetAt( k, pad.GetAddressOf() ); + if ( SUCCEEDED(hr) && ( pad == mGamePad[ j ] ) ) + { + break; + } + } + + if ( k >= count ) + { + mGamePad[ j ].Reset(); + } + } + } + + // Check for added gamepads + for( unsigned int j = 0; j < count; ++j ) + { + ComPtr pad; + HRESULT hr = pads->GetAt( j, pad.GetAddressOf() ); + if ( SUCCEEDED(hr) ) + { + size_t empty = MAX_PLAYER_COUNT; + size_t k = 0; + for( ; k < MAX_PLAYER_COUNT; ++k ) + { + if ( mGamePad[ k ] == pad ) + { + if (!j) + mMostRecentGamepad = static_cast(k); + break; + } + else if ( !mGamePad[ k ] ) + { + if ( empty >= MAX_PLAYER_COUNT ) + empty = k; + } + } + + if ( k >= MAX_PLAYER_COUNT ) + { + if ( empty >= MAX_PLAYER_COUNT ) + { + throw std::exception( "Too many gamepads found" ); + } + + mGamePad[ empty ] = pad; + if (!j) + mMostRecentGamepad = static_cast(empty); + } + } + } + } + + ComPtr mStatics; + ComPtr mStaticsCtrl; + ComPtr mGamePad[ MAX_PLAYER_COUNT ]; + + EventRegistrationToken mAddedToken; + EventRegistrationToken mRemovedToken; + EventRegistrationToken mUserParingToken; + + ScopedHandle mChanged; +}; + +GamePad::Impl* GamePad::Impl::s_gamePad = nullptr; + +#elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) + +//====================================================================================== +// Null device for Windows Phone +//====================================================================================== + +class GamePad::Impl +{ +public: + Impl(GamePad* owner) : + mOwner(owner) + { + if ( s_gamePad ) + { + throw std::exception( "GamePad is a singleton" ); + } + + s_gamePad = this; + } + + ~Impl() + { + s_gamePad = nullptr; + } + + void GetState(int player, _Out_ State& state, DeadZone) + { + UNREFERENCED_PARAMETER(player); + + memset( &state, 0, sizeof(State) ); + } + + void GetCapabilities(int player, _Out_ Capabilities& caps) + { + UNREFERENCED_PARAMETER(player); + + memset( &caps, 0, sizeof(Capabilities) ); + } + + bool SetVibration(int player, float leftMotor, float rightMotor, float leftTrigger, float rightTrigger) + { + UNREFERENCED_PARAMETER(player); + UNREFERENCED_PARAMETER(leftMotor); + UNREFERENCED_PARAMETER(rightMotor); + UNREFERENCED_PARAMETER(leftTrigger); + UNREFERENCED_PARAMETER(rightTrigger); + + return false; + } + + void Suspend() + { + } + + void Resume() + { + } + + GamePad* mOwner; + + static GamePad::Impl* s_gamePad; +}; + +GamePad::Impl* GamePad::Impl::s_gamePad = nullptr; + + +#else + +//====================================================================================== +// XInput +//====================================================================================== + +#include + +static_assert( GamePad::MAX_PLAYER_COUNT == XUSER_MAX_COUNT, "xinput.h mismatch" ); + +class GamePad::Impl +{ +public: + Impl(GamePad* owner) : + mOwner(owner) + { + for( int j = 0; j < XUSER_MAX_COUNT; ++j ) + { + ClearSlot( j, 0 ); + } + +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + mSuspended = false; +#endif + + if ( s_gamePad ) + { + throw std::exception( "GamePad is a singleton" ); + } + + s_gamePad = this; + } + + ~Impl() + { + s_gamePad = nullptr; + } + + void GetState( int player, _Out_ State& state, DeadZone deadZoneMode ) + { + if (player == -1) + player = GetMostRecent(); + + ULONGLONG time = GetTickCount64(); + + if ( !ThrottleRetry(player, time) ) + { +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + if ( mSuspended ) + { + memset( &state, 0, sizeof(State) ); + state.connected = mConnected[ player ]; + return; + } +#endif + + XINPUT_STATE xstate; + DWORD result = XInputGetState( DWORD(player), &xstate ); + if ( result == ERROR_DEVICE_NOT_CONNECTED ) + { + ClearSlot( player, time ); + } + else + { + if (!mConnected[player]) + mLastReadTime[player] = time; + + mConnected[ player ] = true; + + state.connected = true; + state.packet = xstate.dwPacketNumber; + + WORD xbuttons = xstate.Gamepad.wButtons; + state.buttons.a = (xbuttons & XINPUT_GAMEPAD_A) != 0; + state.buttons.b = (xbuttons & XINPUT_GAMEPAD_B) != 0; + state.buttons.x = (xbuttons & XINPUT_GAMEPAD_X) != 0; + state.buttons.y = (xbuttons & XINPUT_GAMEPAD_Y) != 0; + state.buttons.leftStick = (xbuttons & XINPUT_GAMEPAD_LEFT_THUMB) != 0; + state.buttons.rightStick = (xbuttons & XINPUT_GAMEPAD_RIGHT_THUMB) != 0; + state.buttons.leftShoulder = (xbuttons & XINPUT_GAMEPAD_LEFT_SHOULDER) != 0; + state.buttons.rightShoulder = (xbuttons & XINPUT_GAMEPAD_RIGHT_SHOULDER) != 0; + state.buttons.back = (xbuttons & XINPUT_GAMEPAD_BACK) != 0; + state.buttons.start = (xbuttons & XINPUT_GAMEPAD_START) != 0; + + state.dpad.up = (xbuttons & XINPUT_GAMEPAD_DPAD_UP) != 0; + state.dpad.down = (xbuttons & XINPUT_GAMEPAD_DPAD_DOWN) != 0; + state.dpad.right = (xbuttons & XINPUT_GAMEPAD_DPAD_RIGHT) != 0; + state.dpad.left = (xbuttons & XINPUT_GAMEPAD_DPAD_LEFT) != 0; + + if ( deadZoneMode == DEAD_ZONE_NONE ) + { + state.triggers.left = ApplyLinearDeadZone( float(xstate.Gamepad.bLeftTrigger), 255.f, 0.f ); + state.triggers.right = ApplyLinearDeadZone( float(xstate.Gamepad.bRightTrigger), 255.f, 0.f ); + } + else + { + state.triggers.left = ApplyLinearDeadZone( float(xstate.Gamepad.bLeftTrigger), 255.f, float(XINPUT_GAMEPAD_TRIGGER_THRESHOLD) ); + state.triggers.right = ApplyLinearDeadZone( float(xstate.Gamepad.bRightTrigger), 255.f, float(XINPUT_GAMEPAD_TRIGGER_THRESHOLD) ); + } + + ApplyStickDeadZone( float(xstate.Gamepad.sThumbLX), float(xstate.Gamepad.sThumbLY), + deadZoneMode, 32767.f, float(XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE), + state.thumbSticks.leftX, state.thumbSticks.leftY ); + + ApplyStickDeadZone( float(xstate.Gamepad.sThumbRX), float(xstate.Gamepad.sThumbRY), + deadZoneMode, 32767.f, float(XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE), + state.thumbSticks.rightX, state.thumbSticks.rightY ); + + return; + } + } + + memset( &state, 0, sizeof(State) ); + } + + void GetCapabilities( int player, _Out_ Capabilities& caps ) + { + if (player == -1) + player = GetMostRecent(); + + ULONGLONG time = GetTickCount64(); + + if ( !ThrottleRetry(player, time) ) + { + XINPUT_CAPABILITIES xcaps; + DWORD result = XInputGetCapabilities( DWORD(player), 0, &xcaps ); + if ( result == ERROR_DEVICE_NOT_CONNECTED ) + { + ClearSlot( player, time ); + } + else + { + if (!mConnected[player]) + mLastReadTime[player] = time; + + mConnected[ player ] = true; + + caps.connected = true; + caps.id = uint64_t( player ); + if ( xcaps.Type == XINPUT_DEVTYPE_GAMEPAD ) + { + static_assert(Capabilities::GAMEPAD == XINPUT_DEVSUBTYPE_GAMEPAD, "xinput.h mismatch"); +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + static_assert( XINPUT_DEVSUBTYPE_WHEEL == Capabilities::WHEEL, "xinput.h mismatch"); + static_assert( XINPUT_DEVSUBTYPE_ARCADE_STICK == Capabilities::ARCADE_STICK, "xinput.h mismatch"); + static_assert( XINPUT_DEVSUBTYPE_FLIGHT_STICK == Capabilities::FLIGHT_STICK, "xinput.h mismatch"); + static_assert( XINPUT_DEVSUBTYPE_DANCE_PAD == Capabilities::DANCE_PAD, "xinput.h mismatch"); + static_assert( XINPUT_DEVSUBTYPE_GUITAR == Capabilities::GUITAR, "xinput.h mismatch"); + static_assert( XINPUT_DEVSUBTYPE_GUITAR_ALTERNATE == Capabilities::GUITAR_ALTERNATE, "xinput.h mismatch"); + static_assert( XINPUT_DEVSUBTYPE_DRUM_KIT == Capabilities::DRUM_KIT, "xinput.h mismatch"); + static_assert( XINPUT_DEVSUBTYPE_GUITAR_BASS == Capabilities::GUITAR_BASS, "xinput.h mismatch"); + static_assert( XINPUT_DEVSUBTYPE_ARCADE_PAD == Capabilities::ARCADE_PAD, "xinput.h mismatch"); +#endif + + caps.gamepadType = Capabilities::Type(xcaps.SubType); + } + + return; + } + } + + memset( &caps, 0, sizeof(Capabilities) ); + } + + bool SetVibration( int player, float leftMotor, float rightMotor, float leftTrigger, float rightTrigger ) + { + if (player == -1) + player = GetMostRecent(); + + ULONGLONG time = GetTickCount64(); + + if ( ThrottleRetry(player, time) ) + { + return false; + } + + // XInput does not provide a way to set the left/right trigger impulse motors on the Xbox One Controller, + // and these motors are not present on the Xbox 360 Common Controller + UNREFERENCED_PARAMETER(leftTrigger); + UNREFERENCED_PARAMETER(rightTrigger); + +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + mLeftMotor[ player ] = leftMotor; + mRightMotor[ player ] = rightMotor; + + if ( mSuspended ) + return mConnected[ player ]; +#endif + + XINPUT_VIBRATION xvibration; + xvibration.wLeftMotorSpeed = WORD( leftMotor * 0xFFFF ); + xvibration.wRightMotorSpeed = WORD( rightMotor * 0xFFFF ); + DWORD result = XInputSetState( DWORD(player), &xvibration ); + if ( result == ERROR_DEVICE_NOT_CONNECTED ) + { + ClearSlot( player, time ); + return false; + } + else + { + if (!mConnected[player]) + mLastReadTime[player] = time; + + mConnected[ player ] = true; + return (result == ERROR_SUCCESS); + } + } + + void Suspend() + { +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + XInputEnable( FALSE ); +#else + // For XInput 9.1.0, we have to emulate the behavior of XInputEnable( FALSE ) + if ( !mSuspended ) + { + for( size_t j = 0; j < XUSER_MAX_COUNT; ++j ) + { + if ( mConnected[ j ] ) + { + XINPUT_VIBRATION xvibration; + xvibration.wLeftMotorSpeed = xvibration.wRightMotorSpeed = 0; + (void)XInputSetState( DWORD(j), &xvibration ); + } + } + + mSuspended = true; + } +#endif + } + + void Resume() + { +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + XInputEnable( TRUE ); +#else + // For XInput 9.1.0, we have to emulate the behavior of XInputEnable( TRUE ) + if ( mSuspended ) + { + ULONGLONG time = GetTickCount64(); + + for( int j = 0; j < XUSER_MAX_COUNT; ++j ) + { + if ( mConnected[ j ] ) + { + XINPUT_VIBRATION xvibration; + xvibration.wLeftMotorSpeed = WORD( mLeftMotor[ j ] * 0xFFFF ); + xvibration.wRightMotorSpeed = WORD( mRightMotor[ j ] * 0xFFFF ); + DWORD result = XInputSetState( DWORD(j), &xvibration ); + if ( result == ERROR_DEVICE_NOT_CONNECTED ) + { + ClearSlot( j, time ); + } + } + } + + mSuspended = false; + } +#endif + } + + GamePad* mOwner; + + static GamePad::Impl* s_gamePad; + +private: + bool mConnected[ XUSER_MAX_COUNT ]; + ULONGLONG mLastReadTime[ XUSER_MAX_COUNT ]; + +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + // Variables for emulating XInputEnable on XInput 9.1.0 + float mLeftMotor[ XUSER_MAX_COUNT ]; + float mRightMotor[ XUSER_MAX_COUNT ]; + bool mSuspended; +#endif + + bool ThrottleRetry( int player, ULONGLONG time ) + { + // This function minimizes a potential performance issue with XInput on Windows when + // checking a disconnected controller slot which requires device enumeration. + // This throttling keeps checks for newly connected gamepads to about once a second + + if ( ( player < 0 ) || ( player >= XUSER_MAX_COUNT ) ) + return true; + + if ( mConnected[ player ] ) + return false; + + for( size_t j = 0; j < XUSER_MAX_COUNT; ++j ) + { + if ( !mConnected[j] ) + { + LONGLONG delta = time - mLastReadTime[j]; + + LONGLONG interval = 1000; + if ( (int)j != player ) + interval /= 4; + + if ( (delta >= 0) && (delta < interval) ) + return true; + } + } + + return false; + } + + void ClearSlot( int player, ULONGLONG time ) + { + mConnected[ player ] = false; + mLastReadTime[ player ] = time; +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) + mLeftMotor[ player ] = mRightMotor[ player ] = 0.f; +#endif + } + + int GetMostRecent() + { + int player = -1; + ULONGLONG time = 0; + + for (size_t j = 0; j < XUSER_MAX_COUNT; ++j) + { + if (mConnected[j] && (mLastReadTime[j] > time)) + { + time = mLastReadTime[j]; + player = static_cast(j); + } + } + + return player; + } +}; + +GamePad::Impl* GamePad::Impl::s_gamePad = nullptr; + +#endif + +#pragma warning( disable : 4355 ) + +// Public constructor. +GamePad::GamePad() + : pImpl( new Impl(this) ) +{ +} + + +// Move constructor. +GamePad::GamePad(GamePad&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ + pImpl->mOwner = this; +} + + +// Move assignment. +GamePad& GamePad::operator= (GamePad&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + pImpl->mOwner = this; + return *this; +} + + +// Public destructor. +GamePad::~GamePad() +{ +} + + +GamePad::State GamePad::GetState(int player, DeadZone deadZoneMode) +{ + State state; + pImpl->GetState(player, state, deadZoneMode); + return state; +} + + +GamePad::Capabilities GamePad::GetCapabilities(int player) +{ + Capabilities caps; + pImpl->GetCapabilities(player, caps); + return caps; +} + + +bool GamePad::SetVibration( int player, float leftMotor, float rightMotor, float leftTrigger, float rightTrigger ) +{ + return pImpl->SetVibration( player, leftMotor, rightMotor, leftTrigger, rightTrigger ); +} + + +void GamePad::Suspend() +{ + pImpl->Suspend(); +} + + +void GamePad::Resume() +{ + pImpl->Resume(); +} + + +#if (_WIN32_WINNT >= 0x0A00 /*_WIN32_WINNT_WIN10*/ ) || defined(_XBOX_ONE) +void GamePad::RegisterEvents(HANDLE ctrlChanged, HANDLE userChanged) +{ + pImpl->mCtrlChanged = (!ctrlChanged) ? INVALID_HANDLE_VALUE : ctrlChanged; + pImpl->mUserChanged = (!userChanged) ? INVALID_HANDLE_VALUE : userChanged; +} +#endif + + +GamePad& GamePad::Get() +{ + if ( !Impl::s_gamePad || !Impl::s_gamePad->mOwner ) + throw std::exception( "GamePad is a singleton" ); + + return *Impl::s_gamePad->mOwner; +} + + + +//====================================================================================== +// ButtonStateTracker +//====================================================================================== + +#define UPDATE_BUTTON_STATE(field) field = static_cast( ( !!state.buttons.field ) | ( ( !!state.buttons.field ^ !!lastState.buttons.field ) << 1 ) ); + +void GamePad::ButtonStateTracker::Update( const GamePad::State& state ) +{ + UPDATE_BUTTON_STATE(a); + + assert( ( !state.buttons.a && !lastState.buttons.a ) == ( a == UP ) ); + assert( ( state.buttons.a && lastState.buttons.a ) == ( a == HELD ) ); + assert( ( !state.buttons.a && lastState.buttons.a ) == ( a == RELEASED ) ); + assert( ( state.buttons.a && !lastState.buttons.a ) == ( a == PRESSED ) ); + + UPDATE_BUTTON_STATE(b); + UPDATE_BUTTON_STATE(x); + UPDATE_BUTTON_STATE(y); + + UPDATE_BUTTON_STATE(leftStick); + UPDATE_BUTTON_STATE(rightStick); + + UPDATE_BUTTON_STATE(leftShoulder); + UPDATE_BUTTON_STATE(rightShoulder); + + UPDATE_BUTTON_STATE(back); + UPDATE_BUTTON_STATE(start); + + dpadUp = static_cast( ( !!state.dpad.up ) | ( ( !!state.dpad.up ^ !!lastState.dpad.up ) << 1 ) ); + dpadDown = static_cast( ( !!state.dpad.down ) | ( ( !!state.dpad.down ^ !!lastState.dpad.down ) << 1 ) ); + dpadLeft = static_cast( ( !!state.dpad.left ) | ( ( !!state.dpad.left ^ !!lastState.dpad.left ) << 1 ) ); + dpadRight = static_cast( ( !!state.dpad.right ) | ( ( !!state.dpad.right ^ !!lastState.dpad.right ) << 1 ) ); + + assert( ( !state.dpad.up && !lastState.dpad.up ) == ( dpadUp == UP ) ); + assert( ( state.dpad.up && lastState.dpad.up ) == ( dpadUp == HELD ) ); + assert( ( !state.dpad.up && lastState.dpad.up ) == ( dpadUp == RELEASED ) ); + assert( ( state.dpad.up && !lastState.dpad.up ) == ( dpadUp == PRESSED ) ); + + // Handle 'threshold' tests which emulate buttons + + bool threshold = state.IsLeftThumbStickUp(); + leftStickUp = static_cast( ( !!threshold) | ( ( !!threshold ^ !!lastState.IsLeftThumbStickUp() ) << 1 ) ); + + threshold = state.IsLeftThumbStickDown(); + leftStickDown = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsLeftThumbStickDown()) << 1)); + + threshold = state.IsLeftThumbStickLeft(); + leftStickLeft = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsLeftThumbStickLeft()) << 1)); + + threshold = state.IsLeftThumbStickRight(); + leftStickRight = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsLeftThumbStickRight()) << 1)); + + threshold = state.IsRightThumbStickUp(); + rightStickUp = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsRightThumbStickUp()) << 1)); + + threshold = state.IsRightThumbStickDown(); + rightStickDown = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsRightThumbStickDown()) << 1)); + + threshold = state.IsRightThumbStickLeft(); + rightStickLeft = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsRightThumbStickLeft()) << 1)); + + threshold = state.IsRightThumbStickRight(); + rightStickRight = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsRightThumbStickRight()) << 1)); + + threshold = state.IsLeftTriggerPressed(); + leftTrigger = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsLeftTriggerPressed()) << 1)); + + threshold = state.IsRightTriggerPressed(); + rightTrigger = static_cast((!!threshold) | ((!!threshold ^ !!lastState.IsRightTriggerPressed()) << 1)); + + lastState = state; +} + +#undef UPDATE_BUTTON_STATE + + +void GamePad::ButtonStateTracker::Reset() +{ + memset( this, 0, sizeof(ButtonStateTracker) ); +} diff --git a/DirectXTK/Src/GeometricPrimitive.cpp b/DirectXTK/Src/GeometricPrimitive.cpp new file mode 100644 index 0000000..2accb41 --- /dev/null +++ b/DirectXTK/Src/GeometricPrimitive.cpp @@ -0,0 +1,793 @@ +//-------------------------------------------------------------------------------------- +// File: GeometricPrimitive.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "GeometricPrimitive.h" +#include "Effects.h" +#include "CommonStates.h" +#include "DirectXHelpers.h" +#include "SharedResourcePool.h" +#include "Geometry.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +namespace +{ + // Helper for creating a D3D vertex or index buffer. + template + static void CreateBuffer(_In_ ID3D11Device* device, T const& data, D3D11_BIND_FLAG bindFlags, _Outptr_ ID3D11Buffer** pBuffer) + { + assert(pBuffer != 0); + + D3D11_BUFFER_DESC bufferDesc = {}; + + bufferDesc.ByteWidth = (UINT)data.size() * sizeof(typename T::value_type); + bufferDesc.BindFlags = bindFlags; + bufferDesc.Usage = D3D11_USAGE_DEFAULT; + + D3D11_SUBRESOURCE_DATA dataDesc = {}; + + dataDesc.pSysMem = data.data(); + + ThrowIfFailed( + device->CreateBuffer(&bufferDesc, &dataDesc, pBuffer) + ); + + _Analysis_assume_(*pBuffer != 0); + + SetDebugObjectName(*pBuffer, "DirectXTK:GeometricPrimitive"); + } + + + // Helper for creating a D3D input layout. + void CreateInputLayout(_In_ ID3D11Device* device, IEffect* effect, _Outptr_ ID3D11InputLayout** pInputLayout) + { + assert(pInputLayout != 0); + + void const* shaderByteCode; + size_t byteCodeLength; + + effect->GetVertexShaderBytecode(&shaderByteCode, &byteCodeLength); + + ThrowIfFailed( + device->CreateInputLayout(VertexPositionNormalTexture::InputElements, + VertexPositionNormalTexture::InputElementCount, + shaderByteCode, byteCodeLength, + pInputLayout) + ); + + _Analysis_assume_(*pInputLayout != 0); + + SetDebugObjectName(*pInputLayout, "DirectXTK:GeometricPrimitive"); + } +} + + +// Internal GeometricPrimitive implementation class. +class GeometricPrimitive::Impl +{ +public: + void Initialize(_In_ ID3D11DeviceContext* deviceContext, const VertexCollection& vertices, const IndexCollection& indices); + + void XM_CALLCONV Draw(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection, FXMVECTOR color, _In_opt_ ID3D11ShaderResourceView* texture, bool wireframe, std::function& setCustomState) const; + + void Draw(_In_ IEffect* effect, _In_ ID3D11InputLayout* inputLayout, bool alpha, bool wireframe, std::function& setCustomState) const; + + void CreateInputLayout(_In_ IEffect* effect, _Outptr_ ID3D11InputLayout** inputLayout) const; + +private: + ComPtr mVertexBuffer; + ComPtr mIndexBuffer; + + UINT mIndexCount; + + // Only one of these helpers is allocated per D3D device context, even if there are multiple GeometricPrimitive instances. + class SharedResources + { + public: + SharedResources(_In_ ID3D11DeviceContext* deviceContext); + + void PrepareForRendering(bool alpha, bool wireframe) const; + + ComPtr deviceContext; + std::unique_ptr effect; + + ComPtr inputLayoutTextured; + ComPtr inputLayoutUntextured; + + std::unique_ptr stateObjects; + }; + + + // Per-device-context data. + std::shared_ptr mResources; + + static SharedResourcePool sharedResourcesPool; +}; + + +// Global pool of per-device-context GeometricPrimitive resources. +SharedResourcePool GeometricPrimitive::Impl::sharedResourcesPool; + + +// Per-device-context constructor. +GeometricPrimitive::Impl::SharedResources::SharedResources(_In_ ID3D11DeviceContext* deviceContext) + : deviceContext(deviceContext) +{ + ComPtr device; + deviceContext->GetDevice(&device); + + // Create the BasicEffect. + effect = std::make_unique(device.Get()); + + effect->EnableDefaultLighting(); + + // Create state objects. + stateObjects = std::make_unique(device.Get()); + + // Create input layouts. + effect->SetTextureEnabled(true); + ::CreateInputLayout(device.Get(), effect.get(), &inputLayoutTextured); + + effect->SetTextureEnabled(false); + ::CreateInputLayout(device.Get(), effect.get(), &inputLayoutUntextured); +} + + +// Sets up D3D device state ready for drawing a primitive. +void GeometricPrimitive::Impl::SharedResources::PrepareForRendering(bool alpha, bool wireframe) const +{ + // Set the blend and depth stencil state. + ID3D11BlendState* blendState; + ID3D11DepthStencilState* depthStencilState; + + if (alpha) + { + // Alpha blended rendering. + blendState = stateObjects->AlphaBlend(); + depthStencilState = stateObjects->DepthRead(); + } + else + { + // Opaque rendering. + blendState = stateObjects->Opaque(); + depthStencilState = stateObjects->DepthDefault(); + } + + deviceContext->OMSetBlendState(blendState, nullptr, 0xFFFFFFFF); + deviceContext->OMSetDepthStencilState(depthStencilState, 0); + + // Set the rasterizer state. + if (wireframe) + deviceContext->RSSetState(stateObjects->Wireframe()); + else + deviceContext->RSSetState(stateObjects->CullCounterClockwise()); + + ID3D11SamplerState* samplerState = stateObjects->LinearWrap(); + + deviceContext->PSSetSamplers(0, 1, &samplerState); +} + + +// Initializes a geometric primitive instance that will draw the specified vertex and index data. +_Use_decl_annotations_ +void GeometricPrimitive::Impl::Initialize(ID3D11DeviceContext* deviceContext, const VertexCollection& vertices, const IndexCollection& indices) +{ + if (vertices.size() >= USHRT_MAX) + throw std::exception("Too many vertices for 16-bit index buffer"); + + mResources = sharedResourcesPool.DemandCreate(deviceContext); + + ComPtr device; + deviceContext->GetDevice(&device); + + CreateBuffer(device.Get(), vertices, D3D11_BIND_VERTEX_BUFFER, &mVertexBuffer); + CreateBuffer(device.Get(), indices, D3D11_BIND_INDEX_BUFFER, &mIndexBuffer); + + mIndexCount = static_cast(indices.size()); +} + + +// Draws the primitive. +_Use_decl_annotations_ +void XM_CALLCONV GeometricPrimitive::Impl::Draw( + FXMMATRIX world, + CXMMATRIX view, + CXMMATRIX projection, + FXMVECTOR color, + ID3D11ShaderResourceView* texture, + bool wireframe, + std::function& setCustomState) const +{ + assert(mResources != 0); + auto effect = mResources->effect.get(); + assert(effect != 0); + + ID3D11InputLayout *inputLayout; + if (texture) + { + effect->SetTextureEnabled(true); + effect->SetTexture(texture); + + inputLayout = mResources->inputLayoutTextured.Get(); + } + else + { + effect->SetTextureEnabled(false); + + inputLayout = mResources->inputLayoutUntextured.Get(); + } + + // Set effect parameters. + effect->SetMatrices(world, view, projection); + + effect->SetColorAndAlpha(color); + + float alpha = XMVectorGetW(color); + Draw(effect, inputLayout, (alpha < 1.f), wireframe, setCustomState); +} + + +// Draw the primitive using a custom effect. +_Use_decl_annotations_ +void GeometricPrimitive::Impl::Draw( + IEffect* effect, + ID3D11InputLayout* inputLayout, + bool alpha, + bool wireframe, + std::function& setCustomState) const +{ + assert(mResources != 0); + auto deviceContext = mResources->deviceContext.Get(); + assert(deviceContext != 0); + + // Set state objects. + mResources->PrepareForRendering(alpha, wireframe); + + // Set input layout. + assert(inputLayout != 0); + deviceContext->IASetInputLayout(inputLayout); + + // Activate our shaders, constant buffers, texture, etc. + assert(effect != 0); + effect->Apply(deviceContext); + + // Set the vertex and index buffer. + auto vertexBuffer = mVertexBuffer.Get(); + UINT vertexStride = sizeof(VertexPositionNormalTexture); + UINT vertexOffset = 0; + + deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &vertexStride, &vertexOffset); + + deviceContext->IASetIndexBuffer(mIndexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0); + + // Hook lets the caller replace our shaders or state settings with whatever else they see fit. + if (setCustomState) + { + setCustomState(); + } + + // Draw the primitive. + deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + deviceContext->DrawIndexed(mIndexCount, 0, 0); +} + + +// Create input layout for drawing with a custom effect. +_Use_decl_annotations_ +void GeometricPrimitive::Impl::CreateInputLayout(IEffect* effect, ID3D11InputLayout** inputLayout) const +{ + assert(effect != 0); + assert(inputLayout != 0); + + assert(mResources != 0); + auto deviceContext = mResources->deviceContext.Get(); + assert(deviceContext != 0); + + ComPtr device; + deviceContext->GetDevice(&device); + + ::CreateInputLayout(device.Get(), effect, inputLayout); +} + + +//-------------------------------------------------------------------------------------- +// GeometricPrimitive +//-------------------------------------------------------------------------------------- + +// Constructor. +GeometricPrimitive::GeometricPrimitive() + : pImpl(new Impl()) +{ +} + + +// Destructor. +GeometricPrimitive::~GeometricPrimitive() +{ +} + + +// Public entrypoints. +_Use_decl_annotations_ +void XM_CALLCONV GeometricPrimitive::Draw( + FXMMATRIX world, + CXMMATRIX view, + CXMMATRIX projection, + FXMVECTOR color, + ID3D11ShaderResourceView* texture, + bool wireframe, + std::function setCustomState) const +{ + pImpl->Draw(world, view, projection, color, texture, wireframe, setCustomState); +} + + +_Use_decl_annotations_ +void GeometricPrimitive::Draw( + IEffect* effect, + ID3D11InputLayout* inputLayout, + bool alpha, + bool wireframe, + std::function setCustomState) const +{ + pImpl->Draw(effect, inputLayout, alpha, wireframe, setCustomState); +} + + +_Use_decl_annotations_ +void GeometricPrimitive::CreateInputLayout(IEffect* effect, ID3D11InputLayout** inputLayout) const +{ + pImpl->CreateInputLayout(effect, inputLayout); +} + + +//-------------------------------------------------------------------------------------- +// Cube (aka a Hexahedron) or Box +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateCube( + ID3D11DeviceContext* deviceContext, + float size, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeBox(vertices, indices, XMFLOAT3(size, size, size), rhcoords, false); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateCube( + std::vector& vertices, + std::vector& indices, + float size, + bool rhcoords) +{ + ComputeBox(vertices, indices, XMFLOAT3(size, size, size), rhcoords, false); +} + + +// Creates a box primitive. +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateBox( + ID3D11DeviceContext* deviceContext, + const XMFLOAT3& size, + bool rhcoords, + bool invertn) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeBox(vertices, indices, size, rhcoords, invertn); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateBox( + std::vector& vertices, + std::vector& indices, + const XMFLOAT3& size, + bool rhcoords, + bool invertn) +{ + ComputeBox(vertices, indices, size, rhcoords, invertn); +} + + +//-------------------------------------------------------------------------------------- +// Sphere +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateSphere( + ID3D11DeviceContext* deviceContext, + float diameter, + size_t tessellation, + bool rhcoords, + bool invertn) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeSphere(vertices, indices, diameter, tessellation, rhcoords, invertn); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateSphere( + std::vector& vertices, + std::vector& indices, + float diameter, + size_t tessellation, + bool rhcoords, + bool invertn) +{ + ComputeSphere(vertices, indices, diameter, tessellation, rhcoords, invertn); +} + + +//-------------------------------------------------------------------------------------- +// Geodesic sphere +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateGeoSphere( + ID3D11DeviceContext* deviceContext, + float diameter, + size_t tessellation, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeGeoSphere(vertices, indices, diameter, tessellation, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateGeoSphere( + std::vector& vertices, + std::vector& indices, + float diameter, + size_t tessellation, bool rhcoords) +{ + ComputeGeoSphere(vertices, indices, diameter, tessellation, rhcoords); +} + + +//-------------------------------------------------------------------------------------- +// Cylinder / Cone +//-------------------------------------------------------------------------------------- + +// Creates a cylinder primitive. +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateCylinder( + ID3D11DeviceContext* deviceContext, + float height, + float diameter, + size_t tessellation, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeCylinder(vertices, indices, height, diameter, tessellation, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateCylinder( + std::vector& vertices, + std::vector& indices, + float height, + float diameter, + size_t tessellation, + bool rhcoords) +{ + ComputeCylinder(vertices, indices, height, diameter, tessellation, rhcoords); +} + + +// Creates a cone primitive. +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateCone( + ID3D11DeviceContext* deviceContext, + float diameter, + float height, + size_t tessellation, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeCone(vertices, indices, diameter, height, tessellation, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateCone( + std::vector& vertices, + std::vector& indices, + float diameter, + float height, + size_t tessellation, + bool rhcoords) +{ + ComputeCone(vertices, indices, diameter, height, tessellation, rhcoords); +} + + +//-------------------------------------------------------------------------------------- +// Torus +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateTorus( + ID3D11DeviceContext* deviceContext, + float diameter, + float thickness, + size_t tessellation, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeTorus(vertices, indices, diameter, thickness, tessellation, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateTorus( + std::vector& vertices, + std::vector& indices, + float diameter, + float thickness, + size_t tessellation, + bool rhcoords) +{ + ComputeTorus(vertices, indices, diameter, thickness, tessellation, rhcoords); +} + + +//-------------------------------------------------------------------------------------- +// Tetrahedron +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateTetrahedron( + ID3D11DeviceContext* deviceContext, + float size, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeTetrahedron(vertices, indices, size, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateTetrahedron( + std::vector& vertices, + std::vector& indices, + float size, + bool rhcoords) +{ + ComputeTetrahedron(vertices, indices, size, rhcoords); +} + + +//-------------------------------------------------------------------------------------- +// Octahedron +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateOctahedron( + ID3D11DeviceContext* deviceContext, + float size, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeOctahedron(vertices, indices, size, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateOctahedron( + std::vector& vertices, + std::vector& indices, + float size, + bool rhcoords) +{ + ComputeOctahedron(vertices, indices, size, rhcoords); +} + + +//-------------------------------------------------------------------------------------- +// Dodecahedron +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateDodecahedron( + ID3D11DeviceContext* deviceContext, + float size, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeDodecahedron(vertices, indices, size, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateDodecahedron( + std::vector& vertices, + std::vector& indices, + float size, + bool rhcoords) +{ + ComputeDodecahedron(vertices, indices, size, rhcoords); +} + + +//-------------------------------------------------------------------------------------- +// Icosahedron +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateIcosahedron( + ID3D11DeviceContext* deviceContext, + float size, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeIcosahedron(vertices, indices, size, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateIcosahedron( + std::vector& vertices, + std::vector& indices, + float size, + bool rhcoords) +{ + ComputeIcosahedron(vertices, indices, size, rhcoords); +} + + +//-------------------------------------------------------------------------------------- +// Teapot +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateTeapot( + ID3D11DeviceContext* deviceContext, + float size, + size_t tessellation, + bool rhcoords) +{ + VertexCollection vertices; + IndexCollection indices; + ComputeTeapot(vertices, indices, size, tessellation, rhcoords); + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} + +void GeometricPrimitive::CreateTeapot( + std::vector& vertices, + std::vector& indices, + float size, + size_t tessellation, + bool rhcoords) +{ + ComputeTeapot(vertices, indices, size, tessellation, rhcoords); +} + + +//-------------------------------------------------------------------------------------- +// Custom +//-------------------------------------------------------------------------------------- + +_Use_decl_annotations_ +std::unique_ptr GeometricPrimitive::CreateCustom( + ID3D11DeviceContext* deviceContext, + const std::vector& vertices, + const std::vector& indices) +{ + // Extra validation + if (vertices.empty() || indices.empty()) + throw std::exception("Requires both vertices and indices"); + + if (indices.size() % 3) + throw std::exception("Expected triangular faces"); + + size_t nVerts = vertices.size(); + if (nVerts >= USHRT_MAX) + throw std::exception("Too many vertices for 16-bit index buffer"); + + for (auto it = indices.cbegin(); it != indices.cend(); ++it) + { + if (*it >= nVerts) + { + throw std::exception("Index not in vertices list"); + } + } + + // Create the primitive object. + std::unique_ptr primitive(new GeometricPrimitive()); + + primitive->pImpl->Initialize(deviceContext, vertices, indices); + + return primitive; +} diff --git a/DirectXTK/Src/Geometry.cpp b/DirectXTK/Src/Geometry.cpp new file mode 100644 index 0000000..91a4188 --- /dev/null +++ b/DirectXTK/Src/Geometry.cpp @@ -0,0 +1,1184 @@ +//-------------------------------------------------------------------------------------- +// File: Geometry.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Geometry.h" +#include "Bezier.h" + +using namespace DirectX; + +namespace +{ + const float SQRT2 = 1.41421356237309504880f; + const float SQRT3 = 1.73205080756887729352f; + const float SQRT6 = 2.44948974278317809820f; + + inline void CheckIndexOverflow(size_t value) + { + // Use >=, not > comparison, because some D3D level 9_x hardware does not support 0xFFFF index values. + if (value >= USHRT_MAX) + throw std::exception("Index value out of range: cannot tesselate primitive so finely"); + } + + + // Collection types used when generating the geometry. + inline void index_push_back(IndexCollection& indices, size_t value) + { + CheckIndexOverflow(value); + indices.push_back((uint16_t)value); + } + + + // Helper for flipping winding of geometric primitives for LH vs. RH coords + inline void ReverseWinding(IndexCollection& indices, VertexCollection& vertices) + { + assert((indices.size() % 3) == 0); + for (auto it = indices.begin(); it != indices.end(); it += 3) + { + std::swap(*it, *(it + 2)); + } + + for (auto it = vertices.begin(); it != vertices.end(); ++it) + { + it->textureCoordinate.x = (1.f - it->textureCoordinate.x); + } + } + + + // Helper for inverting normals of geometric primitives for 'inside' vs. 'outside' viewing + inline void InvertNormals(VertexCollection& vertices) + { + for (auto it = vertices.begin(); it != vertices.end(); ++it) + { + it->normal.x = -it->normal.x; + it->normal.y = -it->normal.y; + it->normal.z = -it->normal.z; + } + } +} + + +//-------------------------------------------------------------------------------------- +// Cube (aka a Hexahedron) or Box +//-------------------------------------------------------------------------------------- +void DirectX::ComputeBox(VertexCollection& vertices, IndexCollection& indices, const XMFLOAT3& size, bool rhcoords, bool invertn) +{ + vertices.clear(); + indices.clear(); + + // A box has six faces, each one pointing in a different direction. + const int FaceCount = 6; + + static const XMVECTORF32 faceNormals[FaceCount] = + { + { { { 0, 0, 1, 0 } } }, + { { { 0, 0, -1, 0 } } }, + { { { 1, 0, 0, 0 } } }, + { { { -1, 0, 0, 0 } } }, + { { { 0, 1, 0, 0 } } }, + { { { 0, -1, 0, 0 } } }, + }; + + static const XMVECTORF32 textureCoordinates[4] = + { + { { { 1, 0, 0, 0 } } }, + { { { 1, 1, 0, 0 } } }, + { { { 0, 1, 0, 0 } } }, + { { { 0, 0, 0, 0 } } }, + }; + + XMVECTOR tsize = XMLoadFloat3(&size); + tsize = XMVectorDivide(tsize, g_XMTwo); + + // Create each face in turn. + for (int i = 0; i < FaceCount; i++) + { + XMVECTOR normal = faceNormals[i]; + + // Get two vectors perpendicular both to the face normal and to each other. + XMVECTOR basis = (i >= 4) ? g_XMIdentityR2 : g_XMIdentityR1; + + XMVECTOR side1 = XMVector3Cross(normal, basis); + XMVECTOR side2 = XMVector3Cross(normal, side1); + + // Six indices (two triangles) per face. + size_t vbase = vertices.size(); + index_push_back(indices, vbase + 0); + index_push_back(indices, vbase + 1); + index_push_back(indices, vbase + 2); + + index_push_back(indices, vbase + 0); + index_push_back(indices, vbase + 2); + index_push_back(indices, vbase + 3); + + // Four vertices per face. + vertices.push_back(VertexPositionNormalTexture((normal - side1 - side2) * tsize, normal, textureCoordinates[0])); + vertices.push_back(VertexPositionNormalTexture((normal - side1 + side2) * tsize, normal, textureCoordinates[1])); + vertices.push_back(VertexPositionNormalTexture((normal + side1 + side2) * tsize, normal, textureCoordinates[2])); + vertices.push_back(VertexPositionNormalTexture((normal + side1 - side2) * tsize, normal, textureCoordinates[3])); + } + + // Build RH above + if (!rhcoords) + ReverseWinding(indices, vertices); + + if (invertn) + InvertNormals(vertices); +} + + +//-------------------------------------------------------------------------------------- +// Sphere +//-------------------------------------------------------------------------------------- +void DirectX::ComputeSphere(VertexCollection& vertices, IndexCollection& indices, float diameter, size_t tessellation, bool rhcoords, bool invertn) +{ + vertices.clear(); + indices.clear(); + + if (tessellation < 3) + throw std::out_of_range("tesselation parameter out of range"); + + size_t verticalSegments = tessellation; + size_t horizontalSegments = tessellation * 2; + + float radius = diameter / 2; + + // Create rings of vertices at progressively higher latitudes. + for (size_t i = 0; i <= verticalSegments; i++) + { + float v = 1 - (float)i / verticalSegments; + + float latitude = (i * XM_PI / verticalSegments) - XM_PIDIV2; + float dy, dxz; + + XMScalarSinCos(&dy, &dxz, latitude); + + // Create a single ring of vertices at this latitude. + for (size_t j = 0; j <= horizontalSegments; j++) + { + float u = (float)j / horizontalSegments; + + float longitude = j * XM_2PI / horizontalSegments; + float dx, dz; + + XMScalarSinCos(&dx, &dz, longitude); + + dx *= dxz; + dz *= dxz; + + XMVECTOR normal = XMVectorSet(dx, dy, dz, 0); + XMVECTOR textureCoordinate = XMVectorSet(u, v, 0, 0); + + vertices.push_back(VertexPositionNormalTexture(normal * radius, normal, textureCoordinate)); + } + } + + // Fill the index buffer with triangles joining each pair of latitude rings. + size_t stride = horizontalSegments + 1; + + for (size_t i = 0; i < verticalSegments; i++) + { + for (size_t j = 0; j <= horizontalSegments; j++) + { + size_t nextI = i + 1; + size_t nextJ = (j + 1) % stride; + + index_push_back(indices, i * stride + j); + index_push_back(indices, nextI * stride + j); + index_push_back(indices, i * stride + nextJ); + + index_push_back(indices, i * stride + nextJ); + index_push_back(indices, nextI * stride + j); + index_push_back(indices, nextI * stride + nextJ); + } + } + + // Build RH above + if (!rhcoords) + ReverseWinding(indices, vertices); + + if (invertn) + InvertNormals(vertices); +} + + +//-------------------------------------------------------------------------------------- +// Geodesic sphere +//-------------------------------------------------------------------------------------- +void DirectX::ComputeGeoSphere(VertexCollection& vertices, IndexCollection& indices, float diameter, size_t tessellation, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + // An undirected edge between two vertices, represented by a pair of indexes into a vertex array. + // Becuse this edge is undirected, (a,b) is the same as (b,a). + typedef std::pair UndirectedEdge; + + // Makes an undirected edge. Rather than overloading comparison operators to give us the (a,b)==(b,a) property, + // we'll just ensure that the larger of the two goes first. This'll simplify things greatly. + auto makeUndirectedEdge = [](uint16_t a, uint16_t b) + { + return std::make_pair(std::max(a, b), std::min(a, b)); + }; + + // Key: an edge + // Value: the index of the vertex which lies midway between the two vertices pointed to by the key value + // This map is used to avoid duplicating vertices when subdividing triangles along edges. + typedef std::map EdgeSubdivisionMap; + + + static const XMFLOAT3 OctahedronVertices[] = + { + // when looking down the negative z-axis (into the screen) + XMFLOAT3(0, 1, 0), // 0 top + XMFLOAT3(0, 0, -1), // 1 front + XMFLOAT3(1, 0, 0), // 2 right + XMFLOAT3(0, 0, 1), // 3 back + XMFLOAT3(-1, 0, 0), // 4 left + XMFLOAT3(0, -1, 0), // 5 bottom + }; + static const uint16_t OctahedronIndices[] = + { + 0, 1, 2, // top front-right face + 0, 2, 3, // top back-right face + 0, 3, 4, // top back-left face + 0, 4, 1, // top front-left face + 5, 1, 4, // bottom front-left face + 5, 4, 3, // bottom back-left face + 5, 3, 2, // bottom back-right face + 5, 2, 1, // bottom front-right face + }; + + const float radius = diameter / 2.0f; + + // Start with an octahedron; copy the data into the vertex/index collection. + + std::vector vertexPositions(std::begin(OctahedronVertices), std::end(OctahedronVertices)); + + indices.insert(indices.begin(), std::begin(OctahedronIndices), std::end(OctahedronIndices)); + + // We know these values by looking at the above index list for the octahedron. Despite the subdivisions that are + // about to go on, these values aren't ever going to change because the vertices don't move around in the array. + // We'll need these values later on to fix the singularities that show up at the poles. + const uint16_t northPoleIndex = 0; + const uint16_t southPoleIndex = 5; + + for (size_t iSubdivision = 0; iSubdivision < tessellation; ++iSubdivision) + { + assert(indices.size() % 3 == 0); // sanity + + // We use this to keep track of which edges have already been subdivided. + EdgeSubdivisionMap subdividedEdges; + + // The new index collection after subdivision. + IndexCollection newIndices; + + const size_t triangleCount = indices.size() / 3; + for (size_t iTriangle = 0; iTriangle < triangleCount; ++iTriangle) + { + // For each edge on this triangle, create a new vertex in the middle of that edge. + // The winding order of the triangles we output are the same as the winding order of the inputs. + + // Indices of the vertices making up this triangle + uint16_t iv0 = indices[iTriangle * 3 + 0]; + uint16_t iv1 = indices[iTriangle * 3 + 1]; + uint16_t iv2 = indices[iTriangle * 3 + 2]; + + // Get the new vertices + XMFLOAT3 v01; // vertex on the midpoint of v0 and v1 + XMFLOAT3 v12; // ditto v1 and v2 + XMFLOAT3 v20; // ditto v2 and v0 + uint16_t iv01; // index of v01 + uint16_t iv12; // index of v12 + uint16_t iv20; // index of v20 + + // Function that, when given the index of two vertices, creates a new vertex at the midpoint of those vertices. + auto divideEdge = [&](uint16_t i0, uint16_t i1, XMFLOAT3& outVertex, uint16_t& outIndex) + { + const UndirectedEdge edge = makeUndirectedEdge(i0, i1); + + // Check to see if we've already generated this vertex + auto it = subdividedEdges.find(edge); + if (it != subdividedEdges.end()) + { + // We've already generated this vertex before + outIndex = it->second; // the index of this vertex + outVertex = vertexPositions[outIndex]; // and the vertex itself + } + else + { + // Haven't generated this vertex before: so add it now + + // outVertex = (vertices[i0] + vertices[i1]) / 2 + XMStoreFloat3( + &outVertex, + XMVectorScale( + XMVectorAdd(XMLoadFloat3(&vertexPositions[i0]), XMLoadFloat3(&vertexPositions[i1])), + 0.5f + ) + ); + + outIndex = static_cast(vertexPositions.size()); + CheckIndexOverflow(outIndex); + vertexPositions.push_back(outVertex); + + // Now add it to the map. + subdividedEdges.insert(std::make_pair(edge, outIndex)); + } + }; + + // Add/get new vertices and their indices + divideEdge(iv0, iv1, v01, iv01); + divideEdge(iv1, iv2, v12, iv12); + divideEdge(iv0, iv2, v20, iv20); + + // Add the new indices. We have four new triangles from our original one: + // v0 + // o + // /a\ + // v20 o---o v01 + // /b\c/d\ + // v2 o---o---o v1 + // v12 + const uint16_t indicesToAdd[] = + { + iv0, iv01, iv20, // a + iv20, iv12, iv2, // b + iv20, iv01, iv12, // c + iv01, iv1, iv12, // d + }; + newIndices.insert(newIndices.end(), std::begin(indicesToAdd), std::end(indicesToAdd)); + } + + indices = std::move(newIndices); + } + + // Now that we've completed subdivision, fill in the final vertex collection + vertices.reserve(vertexPositions.size()); + for (auto it = vertexPositions.begin(); it != vertexPositions.end(); ++it) + { + auto vertexValue = *it; + + auto normal = XMVector3Normalize(XMLoadFloat3(&vertexValue)); + auto pos = XMVectorScale(normal, radius); + + XMFLOAT3 normalFloat3; + XMStoreFloat3(&normalFloat3, normal); + + // calculate texture coordinates for this vertex + float longitude = atan2(normalFloat3.x, -normalFloat3.z); + float latitude = acos(normalFloat3.y); + + float u = longitude / XM_2PI + 0.5f; + float v = latitude / XM_PI; + + auto texcoord = XMVectorSet(1.0f - u, v, 0.0f, 0.0f); + vertices.push_back(VertexPositionNormalTexture(pos, normal, texcoord)); + } + + // There are a couple of fixes to do. One is a texture coordinate wraparound fixup. At some point, there will be + // a set of triangles somewhere in the mesh with texture coordinates such that the wraparound across 0.0/1.0 + // occurs across that triangle. Eg. when the left hand side of the triangle has a U coordinate of 0.98 and the + // right hand side has a U coordinate of 0.0. The intent is that such a triangle should render with a U of 0.98 to + // 1.0, not 0.98 to 0.0. If we don't do this fixup, there will be a visible seam across one side of the sphere. + // + // Luckily this is relatively easy to fix. There is a straight edge which runs down the prime meridian of the + // completed sphere. If you imagine the vertices along that edge, they circumscribe a semicircular arc starting at + // y=1 and ending at y=-1, and sweeping across the range of z=0 to z=1. x stays zero. It's along this edge that we + // need to duplicate our vertices - and provide the correct texture coordinates. + size_t preFixupVertexCount = vertices.size(); + for (size_t i = 0; i < preFixupVertexCount; ++i) + { + // This vertex is on the prime meridian if position.x and texcoord.u are both zero (allowing for small epsilon). + bool isOnPrimeMeridian = XMVector2NearEqual( + XMVectorSet(vertices[i].position.x, vertices[i].textureCoordinate.x, 0.0f, 0.0f), + XMVectorZero(), + XMVectorSplatEpsilon()); + + if (isOnPrimeMeridian) + { + size_t newIndex = vertices.size(); // the index of this vertex that we're about to add + CheckIndexOverflow(newIndex); + + // copy this vertex, correct the texture coordinate, and add the vertex + VertexPositionNormalTexture v = vertices[i]; + v.textureCoordinate.x = 1.0f; + vertices.push_back(v); + + // Now find all the triangles which contain this vertex and update them if necessary + for (size_t j = 0; j < indices.size(); j += 3) + { + uint16_t* triIndex0 = &indices[j + 0]; + uint16_t* triIndex1 = &indices[j + 1]; + uint16_t* triIndex2 = &indices[j + 2]; + + if (*triIndex0 == i) + { + // nothing; just keep going + } + else if (*triIndex1 == i) + { + std::swap(triIndex0, triIndex1); // swap the pointers (not the values) + } + else if (*triIndex2 == i) + { + std::swap(triIndex0, triIndex2); // swap the pointers (not the values) + } + else + { + // this triangle doesn't use the vertex we're interested in + continue; + } + + // If we got to this point then triIndex0 is the pointer to the index to the vertex we're looking at + assert(*triIndex0 == i); + assert(*triIndex1 != i && *triIndex2 != i); // assume no degenerate triangles + + const VertexPositionNormalTexture& v0 = vertices[*triIndex0]; + const VertexPositionNormalTexture& v1 = vertices[*triIndex1]; + const VertexPositionNormalTexture& v2 = vertices[*triIndex2]; + + // check the other two vertices to see if we might need to fix this triangle + + if (abs(v0.textureCoordinate.x - v1.textureCoordinate.x) > 0.5f || + abs(v0.textureCoordinate.x - v2.textureCoordinate.x) > 0.5f) + { + // yep; replace the specified index to point to the new, corrected vertex + *triIndex0 = static_cast(newIndex); + } + } + } + } + + // And one last fix we need to do: the poles. A common use-case of a sphere mesh is to map a rectangular texture onto + // it. If that happens, then the poles become singularities which map the entire top and bottom rows of the texture + // onto a single point. In general there's no real way to do that right. But to match the behavior of non-geodesic + // spheres, we need to duplicate the pole vertex for every triangle that uses it. This will introduce seams near the + // poles, but reduce stretching. + auto fixPole = [&](size_t poleIndex) + { + auto poleVertex = vertices[poleIndex]; + bool overwrittenPoleVertex = false; // overwriting the original pole vertex saves us one vertex + + for (size_t i = 0; i < indices.size(); i += 3) + { + // These pointers point to the three indices which make up this triangle. pPoleIndex is the pointer to the + // entry in the index array which represents the pole index, and the other two pointers point to the other + // two indices making up this triangle. + uint16_t* pPoleIndex; + uint16_t* pOtherIndex0; + uint16_t* pOtherIndex1; + if (indices[i + 0] == poleIndex) + { + pPoleIndex = &indices[i + 0]; + pOtherIndex0 = &indices[i + 1]; + pOtherIndex1 = &indices[i + 2]; + } + else if (indices[i + 1] == poleIndex) + { + pPoleIndex = &indices[i + 1]; + pOtherIndex0 = &indices[i + 2]; + pOtherIndex1 = &indices[i + 0]; + } + else if (indices[i + 2] == poleIndex) + { + pPoleIndex = &indices[i + 2]; + pOtherIndex0 = &indices[i + 0]; + pOtherIndex1 = &indices[i + 1]; + } + else + { + continue; + } + + const auto& otherVertex0 = vertices[*pOtherIndex0]; + const auto& otherVertex1 = vertices[*pOtherIndex1]; + + // Calculate the texcoords for the new pole vertex, add it to the vertices and update the index + VertexPositionNormalTexture newPoleVertex = poleVertex; + newPoleVertex.textureCoordinate.x = (otherVertex0.textureCoordinate.x + otherVertex1.textureCoordinate.x) / 2; + newPoleVertex.textureCoordinate.y = poleVertex.textureCoordinate.y; + + if (!overwrittenPoleVertex) + { + vertices[poleIndex] = newPoleVertex; + overwrittenPoleVertex = true; + } + else + { + CheckIndexOverflow(vertices.size()); + + *pPoleIndex = static_cast(vertices.size()); + vertices.push_back(newPoleVertex); + } + } + }; + + fixPole(northPoleIndex); + fixPole(southPoleIndex); + + // Build RH above + if (!rhcoords) + ReverseWinding(indices, vertices); +} + + +//-------------------------------------------------------------------------------------- +// Cylinder / Cone +//-------------------------------------------------------------------------------------- +namespace +{ + // Helper computes a point on a unit circle, aligned to the x/z plane and centered on the origin. + inline XMVECTOR GetCircleVector(size_t i, size_t tessellation) + { + float angle = i * XM_2PI / tessellation; + float dx, dz; + + XMScalarSinCos(&dx, &dz, angle); + + XMVECTORF32 v = { { { dx, 0, dz, 0 } } }; + return v; + } + + inline XMVECTOR GetCircleTangent(size_t i, size_t tessellation) + { + float angle = (i * XM_2PI / tessellation) + XM_PIDIV2; + float dx, dz; + + XMScalarSinCos(&dx, &dz, angle); + + XMVECTORF32 v = { { { dx, 0, dz, 0 } } }; + return v; + } + + + // Helper creates a triangle fan to close the end of a cylinder / cone + void CreateCylinderCap(VertexCollection& vertices, IndexCollection& indices, size_t tessellation, float height, float radius, bool isTop) + { + // Create cap indices. + for (size_t i = 0; i < tessellation - 2; i++) + { + size_t i1 = (i + 1) % tessellation; + size_t i2 = (i + 2) % tessellation; + + if (isTop) + { + std::swap(i1, i2); + } + + size_t vbase = vertices.size(); + index_push_back(indices, vbase); + index_push_back(indices, vbase + i1); + index_push_back(indices, vbase + i2); + } + + // Which end of the cylinder is this? + XMVECTOR normal = g_XMIdentityR1; + XMVECTOR textureScale = g_XMNegativeOneHalf; + + if (!isTop) + { + normal = -normal; + textureScale *= g_XMNegateX; + } + + // Create cap vertices. + for (size_t i = 0; i < tessellation; i++) + { + XMVECTOR circleVector = GetCircleVector(i, tessellation); + + XMVECTOR position = (circleVector * radius) + (normal * height); + + XMVECTOR textureCoordinate = XMVectorMultiplyAdd(XMVectorSwizzle<0, 2, 3, 3>(circleVector), textureScale, g_XMOneHalf); + + vertices.push_back(VertexPositionNormalTexture(position, normal, textureCoordinate)); + } + } +} + +void DirectX::ComputeCylinder(VertexCollection& vertices, IndexCollection& indices, float height, float diameter, size_t tessellation, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + if (tessellation < 3) + throw std::out_of_range("tesselation parameter out of range"); + + height /= 2; + + XMVECTOR topOffset = g_XMIdentityR1 * height; + + float radius = diameter / 2; + size_t stride = tessellation + 1; + + // Create a ring of triangles around the outside of the cylinder. + for (size_t i = 0; i <= tessellation; i++) + { + XMVECTOR normal = GetCircleVector(i, tessellation); + + XMVECTOR sideOffset = normal * radius; + + float u = (float)i / tessellation; + + XMVECTOR textureCoordinate = XMLoadFloat(&u); + + vertices.push_back(VertexPositionNormalTexture(sideOffset + topOffset, normal, textureCoordinate)); + vertices.push_back(VertexPositionNormalTexture(sideOffset - topOffset, normal, textureCoordinate + g_XMIdentityR1)); + + index_push_back(indices, i * 2); + index_push_back(indices, (i * 2 + 2) % (stride * 2)); + index_push_back(indices, i * 2 + 1); + + index_push_back(indices, i * 2 + 1); + index_push_back(indices, (i * 2 + 2) % (stride * 2)); + index_push_back(indices, (i * 2 + 3) % (stride * 2)); + } + + // Create flat triangle fan caps to seal the top and bottom. + CreateCylinderCap(vertices, indices, tessellation, height, radius, true); + CreateCylinderCap(vertices, indices, tessellation, height, radius, false); + + // Build RH above + if (!rhcoords) + ReverseWinding(indices, vertices); +} + + +// Creates a cone primitive. +void DirectX::ComputeCone(VertexCollection& vertices, IndexCollection& indices, float diameter, float height, size_t tessellation, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + if (tessellation < 3) + throw std::out_of_range("tesselation parameter out of range"); + + height /= 2; + + XMVECTOR topOffset = g_XMIdentityR1 * height; + + float radius = diameter / 2; + size_t stride = tessellation + 1; + + // Create a ring of triangles around the outside of the cone. + for (size_t i = 0; i <= tessellation; i++) + { + XMVECTOR circlevec = GetCircleVector(i, tessellation); + + XMVECTOR sideOffset = circlevec * radius; + + float u = (float)i / tessellation; + + XMVECTOR textureCoordinate = XMLoadFloat(&u); + + XMVECTOR pt = sideOffset - topOffset; + + XMVECTOR normal = XMVector3Cross(GetCircleTangent(i, tessellation), topOffset - pt); + normal = XMVector3Normalize(normal); + + // Duplicate the top vertex for distinct normals + vertices.push_back(VertexPositionNormalTexture(topOffset, normal, g_XMZero)); + vertices.push_back(VertexPositionNormalTexture(pt, normal, textureCoordinate + g_XMIdentityR1)); + + index_push_back(indices, i * 2); + index_push_back(indices, (i * 2 + 3) % (stride * 2)); + index_push_back(indices, (i * 2 + 1) % (stride * 2)); + } + + // Create flat triangle fan caps to seal the bottom. + CreateCylinderCap(vertices, indices, tessellation, height, radius, false); + + // Build RH above + if (!rhcoords) + ReverseWinding(indices, vertices); +} + + +//-------------------------------------------------------------------------------------- +// Torus +//-------------------------------------------------------------------------------------- +void DirectX::ComputeTorus(VertexCollection& vertices, IndexCollection& indices, float diameter, float thickness, size_t tessellation, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + if (tessellation < 3) + throw std::out_of_range("tesselation parameter out of range"); + + size_t stride = tessellation + 1; + + // First we loop around the main ring of the torus. + for (size_t i = 0; i <= tessellation; i++) + { + float u = (float)i / tessellation; + + float outerAngle = i * XM_2PI / tessellation - XM_PIDIV2; + + // Create a transform matrix that will align geometry to + // slice perpendicularly though the current ring position. + XMMATRIX transform = XMMatrixTranslation(diameter / 2, 0, 0) * XMMatrixRotationY(outerAngle); + + // Now we loop along the other axis, around the side of the tube. + for (size_t j = 0; j <= tessellation; j++) + { + float v = 1 - (float)j / tessellation; + + float innerAngle = j * XM_2PI / tessellation + XM_PI; + float dx, dy; + + XMScalarSinCos(&dy, &dx, innerAngle); + + // Create a vertex. + XMVECTOR normal = XMVectorSet(dx, dy, 0, 0); + XMVECTOR position = normal * thickness / 2; + XMVECTOR textureCoordinate = XMVectorSet(u, v, 0, 0); + + position = XMVector3Transform(position, transform); + normal = XMVector3TransformNormal(normal, transform); + + vertices.push_back(VertexPositionNormalTexture(position, normal, textureCoordinate)); + + // And create indices for two triangles. + size_t nextI = (i + 1) % stride; + size_t nextJ = (j + 1) % stride; + + index_push_back(indices, i * stride + j); + index_push_back(indices, i * stride + nextJ); + index_push_back(indices, nextI * stride + j); + + index_push_back(indices, i * stride + nextJ); + index_push_back(indices, nextI * stride + nextJ); + index_push_back(indices, nextI * stride + j); + } + } + + // Build RH above + if (!rhcoords) + ReverseWinding(indices, vertices); +} + + +//-------------------------------------------------------------------------------------- +// Tetrahedron +//-------------------------------------------------------------------------------------- +void DirectX::ComputeTetrahedron(VertexCollection& vertices, IndexCollection& indices, float size, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + static const XMVECTORF32 verts[4] = + { + { { { 0.f, 0.f, 1.f, 0 } } }, + { { { 2.f*SQRT2 / 3.f, 0.f, -1.f / 3.f, 0 } } }, + { { { -SQRT2 / 3.f, SQRT6 / 3.f, -1.f / 3.f, 0 } } }, + { { { -SQRT2 / 3.f, -SQRT6 / 3.f, -1.f / 3.f, 0 } } } + }; + + static const uint32_t faces[4 * 3] = + { + 0, 1, 2, + 0, 2, 3, + 0, 3, 1, + 1, 3, 2, + }; + + for (size_t j = 0; j < _countof(faces); j += 3) + { + uint32_t v0 = faces[j]; + uint32_t v1 = faces[j + 1]; + uint32_t v2 = faces[j + 2]; + + XMVECTOR normal = XMVector3Cross(verts[v1].v - verts[v0].v, + verts[v2].v - verts[v0].v); + normal = XMVector3Normalize(normal); + + size_t base = vertices.size(); + index_push_back(indices, base); + index_push_back(indices, base + 1); + index_push_back(indices, base + 2); + + // Duplicate vertices to use face normals + XMVECTOR position = XMVectorScale(verts[v0], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMZero /* 0, 0 */)); + + position = XMVectorScale(verts[v1], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMIdentityR0 /* 1, 0 */)); + + position = XMVectorScale(verts[v2], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMIdentityR1 /* 0, 1 */)); + } + + // Built LH above + if (rhcoords) + ReverseWinding(indices, vertices); + + assert(vertices.size() == 4 * 3); + assert(indices.size() == 4 * 3); +} + + +//-------------------------------------------------------------------------------------- +// Octahedron +//-------------------------------------------------------------------------------------- +void DirectX::ComputeOctahedron(VertexCollection& vertices, IndexCollection& indices, float size, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + static const XMVECTORF32 verts[6] = + { + { { { 1, 0, 0, 0 } } }, + { { { -1, 0, 0, 0 } } }, + { { { 0, 1, 0, 0 } } }, + { { { 0, -1, 0, 0 } } }, + { { { 0, 0, 1, 0 } } }, + { { { 0, 0, -1, 0 } } } + }; + + static const uint32_t faces[8 * 3] = + { + 4, 0, 2, + 4, 2, 1, + 4, 1, 3, + 4, 3, 0, + 5, 2, 0, + 5, 1, 2, + 5, 3, 1, + 5, 0, 3 + }; + + for (size_t j = 0; j < _countof(faces); j += 3) + { + uint32_t v0 = faces[j]; + uint32_t v1 = faces[j + 1]; + uint32_t v2 = faces[j + 2]; + + XMVECTOR normal = XMVector3Cross(verts[v1].v - verts[v0].v, + verts[v2].v - verts[v0].v); + normal = XMVector3Normalize(normal); + + size_t base = vertices.size(); + index_push_back(indices, base); + index_push_back(indices, base + 1); + index_push_back(indices, base + 2); + + // Duplicate vertices to use face normals + XMVECTOR position = XMVectorScale(verts[v0], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMZero /* 0, 0 */)); + + position = XMVectorScale(verts[v1], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMIdentityR0 /* 1, 0 */)); + + position = XMVectorScale(verts[v2], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMIdentityR1 /* 0, 1*/)); + } + + // Built LH above + if (rhcoords) + ReverseWinding(indices, vertices); + + assert(vertices.size() == 8 * 3); + assert(indices.size() == 8 * 3); +} + + +//-------------------------------------------------------------------------------------- +// Dodecahedron +//-------------------------------------------------------------------------------------- +void DirectX::ComputeDodecahedron(VertexCollection& vertices, IndexCollection& indices, float size, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + static const float a = 1.f / SQRT3; + static const float b = 0.356822089773089931942f; // sqrt( ( 3 - sqrt(5) ) / 6 ) + static const float c = 0.934172358962715696451f; // sqrt( ( 3 + sqrt(5) ) / 6 ); + + static const XMVECTORF32 verts[20] = + { + { { { a, a, a, 0 } } }, + { { { a, a, -a, 0 } } }, + { { { a, -a, a, 0 } } }, + { { { a, -a, -a, 0 } } }, + { { { -a, a, a, 0 } } }, + { { { -a, a, -a, 0 } } }, + { { { -a, -a, a, 0 } } }, + { { { -a, -a, -a, 0 } } }, + { { { b, c, 0, 0 } } }, + { { { -b, c, 0, 0 } } }, + { { { b, -c, 0, 0 } } }, + { { { -b, -c, 0, 0 } } }, + { { { c, 0, b, 0 } } }, + { { { c, 0, -b, 0 } } }, + { { { -c, 0, b, 0 } } }, + { { { -c, 0, -b, 0 } } }, + { { { 0, b, c, 0 } } }, + { { { 0, -b, c, 0 } } }, + { { { 0, b, -c, 0 } } }, + { { { 0, -b, -c, 0 } } } + }; + + static const uint32_t faces[12 * 5] = + { + 0, 8, 9, 4, 16, + 0, 16, 17, 2, 12, + 12, 2, 10, 3, 13, + 9, 5, 15, 14, 4, + 3, 19, 18, 1, 13, + 7, 11, 6, 14, 15, + 0, 12, 13, 1, 8, + 8, 1, 18, 5, 9, + 16, 4, 14, 6, 17, + 6, 11, 10, 2, 17, + 7, 15, 5, 18, 19, + 7, 19, 3, 10, 11, + }; + + static const XMVECTORF32 textureCoordinates[5] = + { + { { { 0.654508f, 0.0244717f, 0, 0 } } }, + { { { 0.0954915f, 0.206107f, 0, 0 } } }, + { { { 0.0954915f, 0.793893f, 0, 0 } } }, + { { { 0.654508f, 0.975528f, 0, 0 } } }, + { { { 1.f, 0.5f, 0, 0 } } } + }; + + static const uint32_t textureIndex[12][5] = + { + { 0, 1, 2, 3, 4 }, + { 2, 3, 4, 0, 1 }, + { 4, 0, 1, 2, 3 }, + { 1, 2, 3, 4, 0 }, + { 2, 3, 4, 0, 1 }, + { 0, 1, 2, 3, 4 }, + { 1, 2, 3, 4, 0 }, + { 4, 0, 1, 2, 3 }, + { 4, 0, 1, 2, 3 }, + { 1, 2, 3, 4, 0 }, + { 0, 1, 2, 3, 4 }, + { 2, 3, 4, 0, 1 }, + }; + + size_t t = 0; + for (size_t j = 0; j < _countof(faces); j += 5, ++t) + { + uint32_t v0 = faces[j]; + uint32_t v1 = faces[j + 1]; + uint32_t v2 = faces[j + 2]; + uint32_t v3 = faces[j + 3]; + uint32_t v4 = faces[j + 4]; + + XMVECTOR normal = XMVector3Cross(verts[v1].v - verts[v0].v, + verts[v2].v - verts[v0].v); + normal = XMVector3Normalize(normal); + + size_t base = vertices.size(); + + index_push_back(indices, base); + index_push_back(indices, base + 1); + index_push_back(indices, base + 2); + + index_push_back(indices, base); + index_push_back(indices, base + 2); + index_push_back(indices, base + 3); + + index_push_back(indices, base); + index_push_back(indices, base + 3); + index_push_back(indices, base + 4); + + // Duplicate vertices to use face normals + XMVECTOR position = XMVectorScale(verts[v0], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, textureCoordinates[textureIndex[t][0]])); + + position = XMVectorScale(verts[v1], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, textureCoordinates[textureIndex[t][1]])); + + position = XMVectorScale(verts[v2], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, textureCoordinates[textureIndex[t][2]])); + + position = XMVectorScale(verts[v3], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, textureCoordinates[textureIndex[t][3]])); + + position = XMVectorScale(verts[v4], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, textureCoordinates[textureIndex[t][4]])); + } + + // Built LH above + if (rhcoords) + ReverseWinding(indices, vertices); + + assert(vertices.size() == 12 * 5); + assert(indices.size() == 12 * 3 * 3); +} + + +//-------------------------------------------------------------------------------------- +// Icosahedron +//-------------------------------------------------------------------------------------- +void DirectX::ComputeIcosahedron(VertexCollection& vertices, IndexCollection& indices, float size, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + static const float t = 1.618033988749894848205f; // (1 + sqrt(5)) / 2 + static const float t2 = 1.519544995837552493271f; // sqrt( 1 + sqr( (1 + sqrt(5)) / 2 ) ) + + static const XMVECTORF32 verts[12] = + { + { { { t / t2, 1.f / t2, 0, 0 } } }, + { { { -t / t2, 1.f / t2, 0, 0 } } }, + { { { t / t2, -1.f / t2, 0, 0 } } }, + { { { -t / t2, -1.f / t2, 0, 0 } } }, + { { { 1.f / t2, 0, t / t2, 0 } } }, + { { { 1.f / t2, 0, -t / t2, 0 } } }, + { { { -1.f / t2, 0, t / t2, 0 } } }, + { { { -1.f / t2, 0, -t / t2, 0 } } }, + { { { 0, t / t2, 1.f / t2, 0 } } }, + { { { 0, -t / t2, 1.f / t2, 0 } } }, + { { { 0, t / t2, -1.f / t2, 0 } } }, + { { { 0, -t / t2, -1.f / t2, 0 } } } + }; + + static const uint32_t faces[20 * 3] = + { + 0, 8, 4, + 0, 5, 10, + 2, 4, 9, + 2, 11, 5, + 1, 6, 8, + 1, 10, 7, + 3, 9, 6, + 3, 7, 11, + 0, 10, 8, + 1, 8, 10, + 2, 9, 11, + 3, 11, 9, + 4, 2, 0, + 5, 0, 2, + 6, 1, 3, + 7, 3, 1, + 8, 6, 4, + 9, 4, 6, + 10, 5, 7, + 11, 7, 5 + }; + + for (size_t j = 0; j < _countof(faces); j += 3) + { + uint32_t v0 = faces[j]; + uint32_t v1 = faces[j + 1]; + uint32_t v2 = faces[j + 2]; + + XMVECTOR normal = XMVector3Cross(verts[v1].v - verts[v0].v, + verts[v2].v - verts[v0].v); + normal = XMVector3Normalize(normal); + + size_t base = vertices.size(); + index_push_back(indices, base); + index_push_back(indices, base + 1); + index_push_back(indices, base + 2); + + // Duplicate vertices to use face normals + XMVECTOR position = XMVectorScale(verts[v0], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMZero /* 0, 0 */)); + + position = XMVectorScale(verts[v1], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMIdentityR0 /* 1, 0 */)); + + position = XMVectorScale(verts[v2], size); + vertices.push_back(VertexPositionNormalTexture(position, normal, g_XMIdentityR1 /* 0, 1 */)); + } + + // Built LH above + if (rhcoords) + ReverseWinding(indices, vertices); + + assert(vertices.size() == 20 * 3); + assert(indices.size() == 20 * 3); +} + + +//-------------------------------------------------------------------------------------- +// Teapot +//-------------------------------------------------------------------------------------- + +// Include the teapot control point data. +namespace +{ +#include "TeapotData.inc" + + // Tessellates the specified bezier patch. + void XM_CALLCONV TessellatePatch(VertexCollection& vertices, IndexCollection& indices, TeapotPatch const& patch, size_t tessellation, FXMVECTOR scale, bool isMirrored) + { + // Look up the 16 control points for this patch. + XMVECTOR controlPoints[16]; + + for (int i = 0; i < 16; i++) + { + controlPoints[i] = TeapotControlPoints[patch.indices[i]] * scale; + } + + // Create the index data. + size_t vbase = vertices.size(); + Bezier::CreatePatchIndices(tessellation, isMirrored, [&](size_t index) + { + index_push_back(indices, vbase + index); + }); + + // Create the vertex data. + Bezier::CreatePatchVertices(controlPoints, tessellation, isMirrored, [&](FXMVECTOR position, FXMVECTOR normal, FXMVECTOR textureCoordinate) + { + vertices.push_back(VertexPositionNormalTexture(position, normal, textureCoordinate)); + }); + } +} + + +// Creates a teapot primitive. +void DirectX::ComputeTeapot(VertexCollection& vertices, IndexCollection& indices, float size, size_t tessellation, bool rhcoords) +{ + vertices.clear(); + indices.clear(); + + if (tessellation < 1) + throw std::out_of_range("tesselation parameter out of range"); + + XMVECTOR scaleVector = XMVectorReplicate(size); + + XMVECTOR scaleNegateX = scaleVector * g_XMNegateX; + XMVECTOR scaleNegateZ = scaleVector * g_XMNegateZ; + XMVECTOR scaleNegateXZ = scaleVector * g_XMNegateX * g_XMNegateZ; + + for (int i = 0; i < sizeof(TeapotPatches) / sizeof(TeapotPatches[0]); i++) + { + TeapotPatch const& patch = TeapotPatches[i]; + + // Because the teapot is symmetrical from left to right, we only store + // data for one side, then tessellate each patch twice, mirroring in X. + TessellatePatch(vertices, indices, patch, tessellation, scaleVector, false); + TessellatePatch(vertices, indices, patch, tessellation, scaleNegateX, true); + + if (patch.mirrorZ) + { + // Some parts of the teapot (the body, lid, and rim, but not the + // handle or spout) are also symmetrical from front to back, so + // we tessellate them four times, mirroring in Z as well as X. + TessellatePatch(vertices, indices, patch, tessellation, scaleNegateZ, true); + TessellatePatch(vertices, indices, patch, tessellation, scaleNegateXZ, false); + } + } + + // Built RH above + if (!rhcoords) + ReverseWinding(indices, vertices); +} \ No newline at end of file diff --git a/DirectXTK/Src/Geometry.h b/DirectXTK/Src/Geometry.h new file mode 100644 index 0000000..8423b39 --- /dev/null +++ b/DirectXTK/Src/Geometry.h @@ -0,0 +1,32 @@ +//-------------------------------------------------------------------------------------- +// File: Geometry.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "VertexTypes.h" + +namespace DirectX +{ + typedef std::vector VertexCollection; + typedef std::vector IndexCollection; + + void ComputeBox(VertexCollection& vertices, IndexCollection& indices, const XMFLOAT3& size, bool rhcoords, bool invertn); + void ComputeSphere(VertexCollection& vertices, IndexCollection& indices, float diameter, size_t tessellation, bool rhcoords, bool invertn); + void ComputeGeoSphere(VertexCollection& vertices, IndexCollection& indices, float diameter, size_t tessellation, bool rhcoords); + void ComputeCylinder(VertexCollection& vertices, IndexCollection& indices, float height, float diameter, size_t tessellation, bool rhcoords); + void ComputeCone(VertexCollection& vertices, IndexCollection& indices, float diameter, float height, size_t tessellation, bool rhcoords); + void ComputeTorus(VertexCollection& vertices, IndexCollection& indices, float diameter, float thickness, size_t tessellation, bool rhcoords); + void ComputeTetrahedron(VertexCollection& vertices, IndexCollection& indices, float size, bool rhcoords); + void ComputeOctahedron(VertexCollection& vertices, IndexCollection& indices, float size, bool rhcoords); + void ComputeDodecahedron(VertexCollection& vertices, IndexCollection& indices, float size, bool rhcoords); + void ComputeIcosahedron(VertexCollection& vertices, IndexCollection& indices, float size, bool rhcoords); + void ComputeTeapot(VertexCollection& vertices, IndexCollection& indices, float size, size_t tessellation, bool rhcoords); +} \ No newline at end of file diff --git a/DirectXTK/Src/GraphicsMemory.cpp b/DirectXTK/Src/GraphicsMemory.cpp new file mode 100644 index 0000000..b385f44 --- /dev/null +++ b/DirectXTK/Src/GraphicsMemory.cpp @@ -0,0 +1,334 @@ +//-------------------------------------------------------------------------------------- +// File: GraphicsMemory.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" + +#include "GraphicsMemory.h" +#include "PlatformHelpers.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +namespace +{ + template __forceinline T AlignUp(T value, size_t alignment) + { + assert(((alignment - 1) & alignment) == 0); + return static_cast( (static_cast(value) + alignment - 1) & ~(alignment - 1) ); + } +} + + +#if defined(_XBOX_ONE) && defined(_TITLE) + +//====================================================================================== +// Xbox One Direct3D 11.x +//====================================================================================== + +class GraphicsMemory::Impl +{ +public: + Impl(GraphicsMemory* owner) : + mOwner(owner), + mCurrentFrame(0) + { + if (s_graphicsMemory) + { + throw std::exception("GraphicsMemory is a singleton"); + } + + s_graphicsMemory = this; + } + + ~Impl() + { + if (mDevice && mDeviceContext) + { + UINT64 finalFence = mDeviceContext->InsertFence(0); + + while (mDevice->IsFencePending(finalFence)) + { + SwitchToThread(); + } + + mDeviceContext.Reset(); + mDevice.Reset(); + } + + s_graphicsMemory = nullptr; + } + + void Initialize(_In_ ID3D11DeviceX* device, UINT backBufferCount) + { + assert( device != 0 ); + mDevice = device; + + device->GetImmediateContextX( mDeviceContext.GetAddressOf() ); + + mFrames.resize( backBufferCount ); + } + + void* Allocate(_In_opt_ ID3D11DeviceContext* deviceContext, size_t size, int alignment) + { + // Currently use a single global allocator instead of a per-context allocator + UNREFERENCED_PARAMETER(deviceContext); + + std::lock_guard lock(mGuard); + + return mFrames[mCurrentFrame].Allocate(size, alignment); + } + + void Commit() + { + std::lock_guard lock(mGuard); + + mFrames[mCurrentFrame].mFence = mDeviceContext->InsertFence(D3D11_INSERT_FENCE_NO_KICKOFF); + + ++mCurrentFrame; + if (mCurrentFrame >= mFrames.size()) + { + mCurrentFrame = 0; + } + + mFrames[mCurrentFrame].WaitOnFence(mDevice.Get()); + + mFrames[mCurrentFrame].Clear(); + } + + GraphicsMemory* mOwner; + + std::mutex mGuard; + + struct MemoryPage + { + MemoryPage() : mPageSize(0), mGrfxMemory(nullptr) {} + + void Initialize(size_t reqSize) + { + mPageSize = 0x100000; // 1 MB general pages for Xbox One + if (mPageSize < reqSize) + { + mPageSize = AlignUp(reqSize, 65536); + } + + mGrfxMemory = VirtualAlloc(nullptr, mPageSize, + MEM_LARGE_PAGES | MEM_GRAPHICS | MEM_RESERVE | MEM_COMMIT, + PAGE_WRITECOMBINE | PAGE_READWRITE | PAGE_GPU_READONLY); + if (!mGrfxMemory) + throw std::bad_alloc(); + } + + size_t mPageSize; + void* mGrfxMemory; + }; + + struct MemoryFrame + { + MemoryFrame() : mCurOffset(0), mFence(0) {} + + ~MemoryFrame() { Clear(); } + + UINT mCurOffset; + + UINT64 mFence; + + void* Allocate(size_t size, size_t alignment) + { + size_t alignedSize = AlignUp(size, alignment); + + if (mPages.empty()) + { + MemoryPage newPage; + newPage.Initialize(alignedSize); + + mCurOffset = 0; + + mPages.emplace_back(newPage); + } + else + { + mCurOffset = AlignUp(mCurOffset, alignment); + + if (mCurOffset + alignedSize > mPages.front().mPageSize) + { + MemoryPage newPage; + newPage.Initialize(alignedSize); + + mCurOffset = 0; + + mPages.emplace_front(newPage); + } + } + + void* ptr = static_cast(mPages.front().mGrfxMemory) + mCurOffset; + + mCurOffset += static_cast( alignedSize ); + + return ptr; + } + + void WaitOnFence(ID3D11DeviceX* device) + { + if (mFence) + { + while (device->IsFencePending(mFence)) + { + SwitchToThread(); + } + + mFence = 0; + } + } + + void Clear() + { + for (auto it = mPages.begin(); it != mPages.end(); ++it) + { + if (it->mGrfxMemory) + { + VirtualFree(it->mGrfxMemory, 0, MEM_RELEASE); + it->mGrfxMemory = nullptr; + } + } + + mPages.clear(); + + mCurOffset = 0; + } + + std::list mPages; + }; + + UINT mCurrentFrame; + std::vector mFrames; + + ComPtr mDevice; + ComPtr mDeviceContext; + + static GraphicsMemory::Impl* s_graphicsMemory; +}; + +GraphicsMemory::Impl* GraphicsMemory::Impl::s_graphicsMemory = nullptr; + +#else + +//====================================================================================== +// Null allocator for standard Direct3D +//====================================================================================== + +class GraphicsMemory::Impl +{ +public: + Impl(GraphicsMemory* owner) : + mOwner(owner) + { + if (s_graphicsMemory) + { + throw std::exception("GraphicsMemory is a singleton"); + } + + s_graphicsMemory = this; + } + + ~Impl() + { + s_graphicsMemory = nullptr; + } + + void Initialize(_In_ ID3D11Device* device, UINT backBufferCount) + { + UNREFERENCED_PARAMETER(device); + UNREFERENCED_PARAMETER(backBufferCount); + } + + void* Allocate(_In_opt_ ID3D11DeviceContext* context, size_t size, int alignment) + { + UNREFERENCED_PARAMETER(context); + UNREFERENCED_PARAMETER(size); + UNREFERENCED_PARAMETER(alignment); + return nullptr; + } + + void Commit() + { + } + + GraphicsMemory* mOwner; + + static GraphicsMemory::Impl* s_graphicsMemory; +}; + +GraphicsMemory::Impl* GraphicsMemory::Impl::s_graphicsMemory = nullptr; + +#endif + + +//-------------------------------------------------------------------------------------- + +#pragma warning( disable : 4355 ) + +// Public constructor. +#if defined(_XBOX_ONE) && defined(_TITLE) +GraphicsMemory::GraphicsMemory(_In_ ID3D11DeviceX* device, UINT backBufferCount) +#else +GraphicsMemory::GraphicsMemory(_In_ ID3D11Device* device, UINT backBufferCount) +#endif + : pImpl(new Impl(this)) +{ + pImpl->Initialize(device, backBufferCount); +} + + +// Move constructor. +GraphicsMemory::GraphicsMemory(GraphicsMemory&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ + pImpl->mOwner = this; +} + + +// Move assignment. +GraphicsMemory& GraphicsMemory::operator= (GraphicsMemory&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + pImpl->mOwner = this; + return *this; +} + + +// Public destructor. +GraphicsMemory::~GraphicsMemory() +{ +} + + +void* GraphicsMemory::Allocate(_In_opt_ ID3D11DeviceContext* context, size_t size, int alignment) +{ + return pImpl->Allocate(context, size, alignment); +} + + +void GraphicsMemory::Commit() +{ + pImpl->Commit(); +} + + +GraphicsMemory& GraphicsMemory::Get() +{ + if (!Impl::s_graphicsMemory || !Impl::s_graphicsMemory->mOwner) + throw std::exception("GraphicsMemory singleton not created"); + + return *Impl::s_graphicsMemory->mOwner; +} diff --git a/DirectXTK/Src/Keyboard.cpp b/DirectXTK/Src/Keyboard.cpp new file mode 100644 index 0000000..2342c73 --- /dev/null +++ b/DirectXTK/Src/Keyboard.cpp @@ -0,0 +1,557 @@ +//-------------------------------------------------------------------------------------- +// File: Keyboard.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Keyboard.h" + +#include "PlatformHelpers.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + +static_assert(sizeof(Keyboard::State) == (256 / 8), "Size mismatch for State"); + +namespace +{ + void KeyDown(int key, Keyboard::State& state) + { + if (key < 0 || key > 0xfe) + return; + + auto ptr = reinterpret_cast(&state); + + unsigned int bf = 1u << (key & 0x1f); + ptr[(key >> 5)] |= bf; + } + + void KeyUp(int key, Keyboard::State& state) + { + if (key < 0 || key > 0xfe) + return; + + auto ptr = reinterpret_cast(&state); + + unsigned int bf = 1u << (key & 0x1f); + ptr[(key >> 5)] &= ~bf; + } +} + + +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) + +//====================================================================================== +// Windows Store or Universal Windows Platform (UWP) app implementation +//====================================================================================== + +// +// For a Windows Store app or Universal Windows Platform (UWP) app, add the following: +// +// void App::SetWindow(CoreWindow^ window ) +// { +// m_keyboard->SetWindow(window); +// } +// + +#include + +class Keyboard::Impl +{ +public: + Impl(Keyboard* owner) : + mOwner(owner) + { + mAcceleratorKeyToken.value = 0; + mActivatedToken.value = 0; + + if ( s_keyboard ) + { + throw std::exception( "Keyboard is a singleton" ); + } + + s_keyboard = this; + + memset( &mState, 0, sizeof(State) ); + } + + ~Impl() + { + s_keyboard = nullptr; + + RemoveHandlers(); + } + + void GetState(State& state) const + { + memcpy( &state, &mState, sizeof(State) ); + } + + void Reset() + { + memset( &mState, 0, sizeof(State) ); + } + + bool IsConnected() const + { + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::Devices::Input; + using namespace ABI::Windows::Foundation; + + ComPtr caps; + HRESULT hr = RoActivateInstance(HStringReference(RuntimeClass_Windows_Devices_Input_KeyboardCapabilities).Get(), &caps); + ThrowIfFailed(hr); + + INT32 value; + if (SUCCEEDED(caps->get_KeyboardPresent(&value))) + { + return value != 0; + } + + return false; + } + + void SetWindow(ABI::Windows::UI::Core::ICoreWindow* window) + { + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::UI::Core; + + if (mWindow.Get() == window) + return; + + RemoveHandlers(); + + mWindow = window; + + if (!window) + return; + + typedef __FITypedEventHandler_2_Windows__CUI__CCore__CCoreWindow_Windows__CUI__CCore__CWindowActivatedEventArgs ActivatedHandler; + HRESULT hr = window->add_Activated(Callback(Activated).Get(), &mActivatedToken); + ThrowIfFailed(hr); + + ComPtr dispatcher; + hr = window->get_Dispatcher( dispatcher.GetAddressOf() ); + ThrowIfFailed(hr); + + ComPtr keys; + hr = dispatcher.As(&keys); + ThrowIfFailed(hr); + + typedef __FITypedEventHandler_2_Windows__CUI__CCore__CCoreDispatcher_Windows__CUI__CCore__CAcceleratorKeyEventArgs AcceleratorKeyHandler; + hr = keys->add_AcceleratorKeyActivated( Callback(AcceleratorKeyEvent).Get(), &mAcceleratorKeyToken); + ThrowIfFailed(hr); + } + + State mState; + Keyboard* mOwner; + + static Keyboard::Impl* s_keyboard; + +private: + ComPtr mWindow; + + EventRegistrationToken mAcceleratorKeyToken; + EventRegistrationToken mActivatedToken; + + void RemoveHandlers() + { + if (mWindow) + { + using namespace ABI::Windows::UI::Core; + + ComPtr dispatcher; + HRESULT hr = mWindow->get_Dispatcher( dispatcher.GetAddressOf() ); + ThrowIfFailed(hr); + + (void)mWindow->remove_Activated(mActivatedToken); + mActivatedToken.value = 0; + + ComPtr keys; + hr = dispatcher.As(&keys); + ThrowIfFailed(hr); + + (void)keys->remove_AcceleratorKeyActivated(mAcceleratorKeyToken); + mAcceleratorKeyToken.value = 0; + } + } + + static HRESULT Activated( IInspectable *, ABI::Windows::UI::Core::IWindowActivatedEventArgs* ) + { + auto pImpl = Impl::s_keyboard; + + if (!pImpl) + return S_OK; + + pImpl->Reset(); + + return S_OK; + } + + static HRESULT AcceleratorKeyEvent( IInspectable *, ABI::Windows::UI::Core::IAcceleratorKeyEventArgs* args ) + { + using namespace ABI::Windows::System; + using namespace ABI::Windows::UI::Core; + + auto pImpl = Impl::s_keyboard; + + if (!pImpl) + return S_OK; + + CoreAcceleratorKeyEventType evtType; + HRESULT hr = args->get_EventType(&evtType); + ThrowIfFailed(hr); + + bool down = false; + + switch (evtType) + { + case CoreAcceleratorKeyEventType_KeyDown: + case CoreAcceleratorKeyEventType_SystemKeyDown: + down = true; + break; + + case CoreAcceleratorKeyEventType_KeyUp: + case CoreAcceleratorKeyEventType_SystemKeyUp: + break; + + default: + return S_OK; + } + + CorePhysicalKeyStatus status; + hr = args->get_KeyStatus(&status); + ThrowIfFailed(hr); + + VirtualKey virtualKey; + hr = args->get_VirtualKey(&virtualKey); + ThrowIfFailed(hr); + + int vk = static_cast( virtualKey ); + + switch (vk) + { + case VK_SHIFT: + vk = (status.ScanCode == 0x36) ? VK_RSHIFT : VK_LSHIFT; + if ( !down ) + { + // Workaround to ensure left vs. right shift get cleared when both were pressed at same time + KeyUp(VK_LSHIFT, pImpl->mState); + KeyUp(VK_RSHIFT, pImpl->mState); + } + break; + + case VK_CONTROL: + vk = (status.IsExtendedKey) ? VK_RCONTROL : VK_LCONTROL; + break; + + case VK_MENU: + vk = (status.IsExtendedKey) ? VK_RMENU : VK_LMENU; + break; + } + + if (down) + { + KeyDown(vk, pImpl->mState); + } + else + { + KeyUp(vk, pImpl->mState); + } + + return S_OK; + } +}; + + +Keyboard::Impl* Keyboard::Impl::s_keyboard = nullptr; + + +void Keyboard::SetWindow(ABI::Windows::UI::Core::ICoreWindow* window) +{ + pImpl->SetWindow(window); +} + +#elif defined(_XBOX_ONE) || ( defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) ) + +//====================================================================================== +// Null device for Windows Phone and Xbox One +//====================================================================================== + +class Keyboard::Impl +{ +public: + Impl(Keyboard* owner) : + mOwner(owner) + { + if ( s_keyboard ) + { + throw std::exception( "Keyboard is a singleton" ); + } + + s_keyboard = this; + } + + ~Impl() + { + s_keyboard = nullptr; + } + + void GetState(State& state) const + { + memset( &state, 0, sizeof(State) ); + } + + void Reset() + { + } + + bool IsConnected() const + { + return false; + } + + Keyboard* mOwner; + + static Keyboard::Impl* s_keyboard; +}; + +Keyboard::Impl* Keyboard::Impl::s_keyboard = nullptr; + +#else + +//====================================================================================== +// Win32 desktop implementation +//====================================================================================== + +// +// For a Win32 desktop application, call this function from your Window Message Procedure +// +// LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +// { +// switch (message) +// { +// +// case WM_ACTIVATEAPP: +// Keyboard::ProcessMessage(message, wParam, lParam); +// break; +// +// case WM_KEYDOWN: +// case WM_SYSKEYDOWN: +// case WM_KEYUP: +// case WM_SYSKEYUP: +// Keyboard::ProcessMessage(message, wParam, lParam); +// break; +// +// } +// } +// + +class Keyboard::Impl +{ +public: + Impl(Keyboard* owner) : + mOwner(owner) + { + if ( s_keyboard ) + { + throw std::exception( "Keyboard is a singleton" ); + } + + s_keyboard = this; + + memset( &mState, 0, sizeof(State) ); + } + + ~Impl() + { + s_keyboard = nullptr; + } + + void GetState(State& state) const + { + memcpy( &state, &mState, sizeof(State) ); + } + + void Reset() + { + memset( &mState, 0, sizeof(State) ); + } + + bool IsConnected() const + { + return true; + } + + State mState; + Keyboard* mOwner; + + static Keyboard::Impl* s_keyboard; +}; + + +Keyboard::Impl* Keyboard::Impl::s_keyboard = nullptr; + + +void Keyboard::ProcessMessage(UINT message, WPARAM wParam, LPARAM lParam) +{ + auto pImpl = Impl::s_keyboard; + + if (!pImpl) + return; + + bool down = false; + + switch (message) + { + case WM_ACTIVATEAPP: + pImpl->Reset(); + return; + + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + down = true; + break; + + case WM_KEYUP: + case WM_SYSKEYUP: + break; + + default: + return; + } + + int vk = static_cast( wParam ); + switch (vk) + { + case VK_SHIFT: + vk = MapVirtualKey((lParam & 0x00ff0000) >> 16, MAPVK_VSC_TO_VK_EX); + if ( !down ) + { + // Workaround to ensure left vs. right shift get cleared when both were pressed at same time + KeyUp(VK_LSHIFT, pImpl->mState); + KeyUp(VK_RSHIFT, pImpl->mState); + } + break; + + case VK_CONTROL: + vk = (lParam & 0x01000000) ? VK_RCONTROL : VK_LCONTROL; + break; + + case VK_MENU: + vk = (lParam & 0x01000000) ? VK_RMENU : VK_LMENU; + break; + } + + if (down) + { + KeyDown(vk, pImpl->mState); + } + else + { + KeyUp(vk, pImpl->mState); + } +} + +#endif + +#pragma warning( disable : 4355 ) + +// Public constructor. +Keyboard::Keyboard() + : pImpl( new Impl(this) ) +{ +} + + +// Move constructor. +Keyboard::Keyboard(Keyboard&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ + pImpl->mOwner = this; +} + + +// Move assignment. +Keyboard& Keyboard::operator= (Keyboard&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + pImpl->mOwner = this; + return *this; +} + + +// Public destructor. +Keyboard::~Keyboard() +{ +} + + +Keyboard::State Keyboard::GetState() const +{ + State state; + pImpl->GetState(state); + return state; +} + + +void Keyboard::Reset() +{ + pImpl->Reset(); +} + + +bool Keyboard::IsConnected() const +{ + return pImpl->IsConnected(); +} + +Keyboard& Keyboard::Get() +{ + if ( !Impl::s_keyboard || !Impl::s_keyboard->mOwner ) + throw std::exception( "Keyboard is a singleton" ); + + return *Impl::s_keyboard->mOwner; +} + + + +//====================================================================================== +// KeyboardStateTracker +//====================================================================================== + +void Keyboard::KeyboardStateTracker::Update( const State& state ) +{ + auto currPtr = reinterpret_cast(&state); + auto prevPtr = reinterpret_cast(&lastState); + auto releasedPtr = reinterpret_cast(&released); + auto pressedPtr = reinterpret_cast(&pressed); + for (size_t j = 0; j < (256 / 32); ++j) + { + *pressedPtr = *currPtr & ~(*prevPtr); + *releasedPtr = ~(*currPtr) & *prevPtr; + + ++currPtr; + ++prevPtr; + ++releasedPtr; + ++pressedPtr; + } + + lastState = state; +} + + +void Keyboard::KeyboardStateTracker::Reset() +{ + memset( this, 0, sizeof(KeyboardStateTracker) ); +} diff --git a/DirectXTK/Src/LoaderHelpers.h b/DirectXTK/Src/LoaderHelpers.h new file mode 100644 index 0000000..f40d5a4 --- /dev/null +++ b/DirectXTK/Src/LoaderHelpers.h @@ -0,0 +1,874 @@ +//-------------------------------------------------------------------------------------- +// File: LoaderHelpers.h +// +// Helper functions for texture loaders and screen grabber +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#include "DDS.h" +#include "DDSTextureLoader.h" + + +namespace DirectX +{ + + namespace LoaderHelpers + { + //-------------------------------------------------------------------------------------- + // Return the BPP for a particular format + //-------------------------------------------------------------------------------------- + inline size_t BitsPerPixel(_In_ DXGI_FORMAT fmt) + { + switch (fmt) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + return 128; + + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: + return 96; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DXGI_FORMAT_Y416: + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + return 64; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R11G11B10_FLOAT: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DXGI_FORMAT_AYUV: + case DXGI_FORMAT_Y410: + case DXGI_FORMAT_YUY2: + return 32; + + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + return 24; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_A8P8: + case DXGI_FORMAT_B4G4R4A4_UNORM: + return 16; + + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_420_OPAQUE: + case DXGI_FORMAT_NV11: + return 12; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + return 8; + + case DXGI_FORMAT_R1_UNORM: + return 1; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + return 4; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + return 8; + +#if defined(_XBOX_ONE) && defined(_TITLE) + + case DXGI_FORMAT_R10G10B10_7E3_A2_FLOAT: + case DXGI_FORMAT_R10G10B10_6E4_A2_FLOAT: + case DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: + return 32; + + case DXGI_FORMAT_D16_UNORM_S8_UINT: + case DXGI_FORMAT_R16_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X16_TYPELESS_G8_UINT: + return 24; + + case DXGI_FORMAT_R4G4_UNORM: + return 8; + +#endif // _XBOX_ONE && _TITLE + + default: + return 0; + } + } + + //-------------------------------------------------------------------------------------- + inline DXGI_FORMAT MakeSRGB(_In_ DXGI_FORMAT format) + { + switch (format) + { + case DXGI_FORMAT_R8G8B8A8_UNORM: + return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + + case DXGI_FORMAT_BC1_UNORM: + return DXGI_FORMAT_BC1_UNORM_SRGB; + + case DXGI_FORMAT_BC2_UNORM: + return DXGI_FORMAT_BC2_UNORM_SRGB; + + case DXGI_FORMAT_BC3_UNORM: + return DXGI_FORMAT_BC3_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8A8_UNORM: + return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8X8_UNORM: + return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + + case DXGI_FORMAT_BC7_UNORM: + return DXGI_FORMAT_BC7_UNORM_SRGB; + + default: + return format; + } + } + + //-------------------------------------------------------------------------------------- + inline bool IsCompressed(_In_ DXGI_FORMAT fmt) + { + switch (fmt) + { + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + return true; + + default: + return false; + } + } + + //-------------------------------------------------------------------------------------- + inline DXGI_FORMAT EnsureNotTypeless(DXGI_FORMAT fmt) + { + // Assumes UNORM or FLOAT; doesn't use UINT or SINT + switch (fmt) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_FLOAT; + case DXGI_FORMAT_R32G32B32_TYPELESS: return DXGI_FORMAT_R32G32B32_FLOAT; + case DXGI_FORMAT_R16G16B16A16_TYPELESS: return DXGI_FORMAT_R16G16B16A16_UNORM; + case DXGI_FORMAT_R32G32_TYPELESS: return DXGI_FORMAT_R32G32_FLOAT; + case DXGI_FORMAT_R10G10B10A2_TYPELESS: return DXGI_FORMAT_R10G10B10A2_UNORM; + case DXGI_FORMAT_R8G8B8A8_TYPELESS: return DXGI_FORMAT_R8G8B8A8_UNORM; + case DXGI_FORMAT_R16G16_TYPELESS: return DXGI_FORMAT_R16G16_UNORM; + case DXGI_FORMAT_R32_TYPELESS: return DXGI_FORMAT_R32_FLOAT; + case DXGI_FORMAT_R8G8_TYPELESS: return DXGI_FORMAT_R8G8_UNORM; + case DXGI_FORMAT_R16_TYPELESS: return DXGI_FORMAT_R16_UNORM; + case DXGI_FORMAT_R8_TYPELESS: return DXGI_FORMAT_R8_UNORM; + case DXGI_FORMAT_BC1_TYPELESS: return DXGI_FORMAT_BC1_UNORM; + case DXGI_FORMAT_BC2_TYPELESS: return DXGI_FORMAT_BC2_UNORM; + case DXGI_FORMAT_BC3_TYPELESS: return DXGI_FORMAT_BC3_UNORM; + case DXGI_FORMAT_BC4_TYPELESS: return DXGI_FORMAT_BC4_UNORM; + case DXGI_FORMAT_BC5_TYPELESS: return DXGI_FORMAT_BC5_UNORM; + case DXGI_FORMAT_B8G8R8A8_TYPELESS: return DXGI_FORMAT_B8G8R8A8_UNORM; + case DXGI_FORMAT_B8G8R8X8_TYPELESS: return DXGI_FORMAT_B8G8R8X8_UNORM; + case DXGI_FORMAT_BC7_TYPELESS: return DXGI_FORMAT_BC7_UNORM; + default: return fmt; + } + } + + //-------------------------------------------------------------------------------------- + inline HRESULT LoadTextureDataFromFile(_In_z_ const wchar_t* fileName, + std::unique_ptr& ddsData, + const DDS_HEADER** header, + const uint8_t** bitData, + size_t* bitSize + ) + { + if (!header || !bitData || !bitSize) + { + return E_POINTER; + } + + // open the file +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + ScopedHandle hFile(safe_handle(CreateFile2(fileName, + GENERIC_READ, + FILE_SHARE_READ, + OPEN_EXISTING, + nullptr))); +#else + ScopedHandle hFile(safe_handle(CreateFileW(fileName, + GENERIC_READ, + FILE_SHARE_READ, + nullptr, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + nullptr))); +#endif + + if (!hFile) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + // Get the file size + FILE_STANDARD_INFO fileInfo; + if (!GetFileInformationByHandleEx(hFile.get(), FileStandardInfo, &fileInfo, sizeof(fileInfo))) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + // File is too big for 32-bit allocation, so reject read + if (fileInfo.EndOfFile.HighPart > 0) + { + return E_FAIL; + } + + // Need at least enough data to fill the header and magic number to be a valid DDS + if (fileInfo.EndOfFile.LowPart < (sizeof(DDS_HEADER) + sizeof(uint32_t))) + { + return E_FAIL; + } + + // create enough space for the file data + ddsData.reset(new (std::nothrow) uint8_t[fileInfo.EndOfFile.LowPart]); + if (!ddsData) + { + return E_OUTOFMEMORY; + } + + // read the data in + DWORD BytesRead = 0; + if (!ReadFile(hFile.get(), + ddsData.get(), + fileInfo.EndOfFile.LowPart, + &BytesRead, + nullptr + )) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + if (BytesRead < fileInfo.EndOfFile.LowPart) + { + return E_FAIL; + } + + // DDS files always start with the same magic number ("DDS ") + uint32_t dwMagicNumber = *reinterpret_cast(ddsData.get()); + if (dwMagicNumber != DDS_MAGIC) + { + return E_FAIL; + } + + auto hdr = reinterpret_cast(ddsData.get() + sizeof(uint32_t)); + + // Verify header to validate DDS file + if (hdr->size != sizeof(DDS_HEADER) || + hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) + { + return E_FAIL; + } + + // Check for DX10 extension + bool bDXT10Header = false; + if ((hdr->ddspf.flags & DDS_FOURCC) && + (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) + { + // Must be long enough for both headers and magic value + if (fileInfo.EndOfFile.LowPart < (sizeof(DDS_HEADER) + sizeof(uint32_t) + sizeof(DDS_HEADER_DXT10))) + { + return E_FAIL; + } + + bDXT10Header = true; + } + + // setup the pointers in the process request + *header = hdr; + ptrdiff_t offset = sizeof(uint32_t) + sizeof(DDS_HEADER) + + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0); + *bitData = ddsData.get() + offset; + *bitSize = fileInfo.EndOfFile.LowPart - offset; + + return S_OK; + } + + //-------------------------------------------------------------------------------------- + // Get surface information for a particular format + //-------------------------------------------------------------------------------------- + inline void GetSurfaceInfo(_In_ size_t width, + _In_ size_t height, + _In_ DXGI_FORMAT fmt, + _Out_opt_ size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows) + { + size_t numBytes = 0; + size_t rowBytes = 0; + size_t numRows = 0; + + bool bc = false; + bool packed = false; + bool planar = false; + size_t bpe = 0; + switch (fmt) + { + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + bc = true; + bpe = 8; + break; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + bc = true; + bpe = 16; + break; + + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_YUY2: + packed = true; + bpe = 4; + break; + + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + packed = true; + bpe = 8; + break; + + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_420_OPAQUE: + planar = true; + bpe = 2; + break; + + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + planar = true; + bpe = 4; + break; + +#if defined(_XBOX_ONE) && defined(_TITLE) + + case DXGI_FORMAT_D16_UNORM_S8_UINT: + case DXGI_FORMAT_R16_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X16_TYPELESS_G8_UINT: + planar = true; + bpe = 4; + break; + +#endif + + default: + break; + } + + if (bc) + { + size_t numBlocksWide = 0; + if (width > 0) + { + numBlocksWide = std::max(1, (width + 3) / 4); + } + size_t numBlocksHigh = 0; + if (height > 0) + { + numBlocksHigh = std::max(1, (height + 3) / 4); + } + rowBytes = numBlocksWide * bpe; + numRows = numBlocksHigh; + numBytes = rowBytes * numBlocksHigh; + } + else if (packed) + { + rowBytes = ((width + 1) >> 1) * bpe; + numRows = height; + numBytes = rowBytes * height; + } + else if (fmt == DXGI_FORMAT_NV11) + { + rowBytes = ((width + 3) >> 2) * 4; + numRows = height * 2; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data + numBytes = rowBytes * numRows; + } + else if (planar) + { + rowBytes = ((width + 1) >> 1) * bpe; + numBytes = (rowBytes * height) + ((rowBytes * height + 1) >> 1); + numRows = height + ((height + 1) >> 1); + } + else + { + size_t bpp = BitsPerPixel(fmt); + rowBytes = (width * bpp + 7) / 8; // round up to nearest byte + numRows = height; + numBytes = rowBytes * height; + } + + if (outNumBytes) + { + *outNumBytes = numBytes; + } + if (outRowBytes) + { + *outRowBytes = rowBytes; + } + if (outNumRows) + { + *outNumRows = numRows; + } + } + + //-------------------------------------------------------------------------------------- +#define ISBITMASK( r,g,b,a ) ( ddpf.RBitMask == r && ddpf.GBitMask == g && ddpf.BBitMask == b && ddpf.ABitMask == a ) + + inline DXGI_FORMAT GetDXGIFormat(const DDS_PIXELFORMAT& ddpf) + { + if (ddpf.flags & DDS_RGB) + { + // Note that sRGB formats are written using the "DX10" extended header + + switch (ddpf.RGBBitCount) + { + case 32: + if (ISBITMASK(0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000)) + { + return DXGI_FORMAT_R8G8B8A8_UNORM; + } + + if (ISBITMASK(0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000)) + { + return DXGI_FORMAT_B8G8R8A8_UNORM; + } + + if (ISBITMASK(0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000)) + { + return DXGI_FORMAT_B8G8R8X8_UNORM; + } + + // No DXGI format maps to ISBITMASK(0x000000ff,0x0000ff00,0x00ff0000,0x00000000) aka D3DFMT_X8B8G8R8 + + // Note that many common DDS reader/writers (including D3DX) swap the + // the RED/BLUE masks for 10:10:10:2 formats. We assume + // below that the 'backwards' header mask is being used since it is most + // likely written by D3DX. The more robust solution is to use the 'DX10' + // header extension and specify the DXGI_FORMAT_R10G10B10A2_UNORM format directly + + // For 'correct' writers, this should be 0x000003ff,0x000ffc00,0x3ff00000 for RGB data + if (ISBITMASK(0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000)) + { + return DXGI_FORMAT_R10G10B10A2_UNORM; + } + + // No DXGI format maps to ISBITMASK(0x000003ff,0x000ffc00,0x3ff00000,0xc0000000) aka D3DFMT_A2R10G10B10 + + if (ISBITMASK(0x0000ffff, 0xffff0000, 0x00000000, 0x00000000)) + { + return DXGI_FORMAT_R16G16_UNORM; + } + + if (ISBITMASK(0xffffffff, 0x00000000, 0x00000000, 0x00000000)) + { + // Only 32-bit color channel format in D3D9 was R32F + return DXGI_FORMAT_R32_FLOAT; // D3DX writes this out as a FourCC of 114 + } + break; + + case 24: + // No 24bpp DXGI formats aka D3DFMT_R8G8B8 + break; + + case 16: + if (ISBITMASK(0x7c00, 0x03e0, 0x001f, 0x8000)) + { + return DXGI_FORMAT_B5G5R5A1_UNORM; + } + if (ISBITMASK(0xf800, 0x07e0, 0x001f, 0x0000)) + { + return DXGI_FORMAT_B5G6R5_UNORM; + } + + // No DXGI format maps to ISBITMASK(0x7c00,0x03e0,0x001f,0x0000) aka D3DFMT_X1R5G5B5 + + if (ISBITMASK(0x0f00, 0x00f0, 0x000f, 0xf000)) + { + return DXGI_FORMAT_B4G4R4A4_UNORM; + } + + // No DXGI format maps to ISBITMASK(0x0f00,0x00f0,0x000f,0x0000) aka D3DFMT_X4R4G4B4 + + // No 3:3:2, 3:3:2:8, or paletted DXGI formats aka D3DFMT_A8R3G3B2, D3DFMT_R3G3B2, D3DFMT_P8, D3DFMT_A8P8, etc. + break; + } + } + else if (ddpf.flags & DDS_LUMINANCE) + { + if (8 == ddpf.RGBBitCount) + { + if (ISBITMASK(0x000000ff, 0x00000000, 0x00000000, 0x00000000)) + { + return DXGI_FORMAT_R8_UNORM; // D3DX10/11 writes this out as DX10 extension + } + + // No DXGI format maps to ISBITMASK(0x0f,0x00,0x00,0xf0) aka D3DFMT_A4L4 + + if (ISBITMASK(0x000000ff, 0x00000000, 0x00000000, 0x0000ff00)) + { + return DXGI_FORMAT_R8G8_UNORM; // Some DDS writers assume the bitcount should be 8 instead of 16 + } + } + + if (16 == ddpf.RGBBitCount) + { + if (ISBITMASK(0x0000ffff, 0x00000000, 0x00000000, 0x00000000)) + { + return DXGI_FORMAT_R16_UNORM; // D3DX10/11 writes this out as DX10 extension + } + if (ISBITMASK(0x000000ff, 0x00000000, 0x00000000, 0x0000ff00)) + { + return DXGI_FORMAT_R8G8_UNORM; // D3DX10/11 writes this out as DX10 extension + } + } + } + else if (ddpf.flags & DDS_ALPHA) + { + if (8 == ddpf.RGBBitCount) + { + return DXGI_FORMAT_A8_UNORM; + } + } + else if (ddpf.flags & DDS_BUMPDUDV) + { + if (16 == ddpf.RGBBitCount) + { + if (ISBITMASK(0x00ff, 0xff00, 0x0000, 0x0000)) + { + return DXGI_FORMAT_R8G8_SNORM; // D3DX10/11 writes this out as DX10 extension + } + } + + if (32 == ddpf.RGBBitCount) + { + if (ISBITMASK(0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000)) + { + return DXGI_FORMAT_R8G8B8A8_SNORM; // D3DX10/11 writes this out as DX10 extension + } + if (ISBITMASK(0x0000ffff, 0xffff0000, 0x00000000, 0x00000000)) + { + return DXGI_FORMAT_R16G16_SNORM; // D3DX10/11 writes this out as DX10 extension + } + + // No DXGI format maps to ISBITMASK(0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000) aka D3DFMT_A2W10V10U10 + } + } + else if (ddpf.flags & DDS_FOURCC) + { + if (MAKEFOURCC('D', 'X', 'T', '1') == ddpf.fourCC) + { + return DXGI_FORMAT_BC1_UNORM; + } + if (MAKEFOURCC('D', 'X', 'T', '3') == ddpf.fourCC) + { + return DXGI_FORMAT_BC2_UNORM; + } + if (MAKEFOURCC('D', 'X', 'T', '5') == ddpf.fourCC) + { + return DXGI_FORMAT_BC3_UNORM; + } + + // While pre-multiplied alpha isn't directly supported by the DXGI formats, + // they are basically the same as these BC formats so they can be mapped + if (MAKEFOURCC('D', 'X', 'T', '2') == ddpf.fourCC) + { + return DXGI_FORMAT_BC2_UNORM; + } + if (MAKEFOURCC('D', 'X', 'T', '4') == ddpf.fourCC) + { + return DXGI_FORMAT_BC3_UNORM; + } + + if (MAKEFOURCC('A', 'T', 'I', '1') == ddpf.fourCC) + { + return DXGI_FORMAT_BC4_UNORM; + } + if (MAKEFOURCC('B', 'C', '4', 'U') == ddpf.fourCC) + { + return DXGI_FORMAT_BC4_UNORM; + } + if (MAKEFOURCC('B', 'C', '4', 'S') == ddpf.fourCC) + { + return DXGI_FORMAT_BC4_SNORM; + } + + if (MAKEFOURCC('A', 'T', 'I', '2') == ddpf.fourCC) + { + return DXGI_FORMAT_BC5_UNORM; + } + if (MAKEFOURCC('B', 'C', '5', 'U') == ddpf.fourCC) + { + return DXGI_FORMAT_BC5_UNORM; + } + if (MAKEFOURCC('B', 'C', '5', 'S') == ddpf.fourCC) + { + return DXGI_FORMAT_BC5_SNORM; + } + + // BC6H and BC7 are written using the "DX10" extended header + + if (MAKEFOURCC('R', 'G', 'B', 'G') == ddpf.fourCC) + { + return DXGI_FORMAT_R8G8_B8G8_UNORM; + } + if (MAKEFOURCC('G', 'R', 'G', 'B') == ddpf.fourCC) + { + return DXGI_FORMAT_G8R8_G8B8_UNORM; + } + + if (MAKEFOURCC('Y', 'U', 'Y', '2') == ddpf.fourCC) + { + return DXGI_FORMAT_YUY2; + } + + // Check for D3DFORMAT enums being set here + switch (ddpf.fourCC) + { + case 36: // D3DFMT_A16B16G16R16 + return DXGI_FORMAT_R16G16B16A16_UNORM; + + case 110: // D3DFMT_Q16W16V16U16 + return DXGI_FORMAT_R16G16B16A16_SNORM; + + case 111: // D3DFMT_R16F + return DXGI_FORMAT_R16_FLOAT; + + case 112: // D3DFMT_G16R16F + return DXGI_FORMAT_R16G16_FLOAT; + + case 113: // D3DFMT_A16B16G16R16F + return DXGI_FORMAT_R16G16B16A16_FLOAT; + + case 114: // D3DFMT_R32F + return DXGI_FORMAT_R32_FLOAT; + + case 115: // D3DFMT_G32R32F + return DXGI_FORMAT_R32G32_FLOAT; + + case 116: // D3DFMT_A32B32G32R32F + return DXGI_FORMAT_R32G32B32A32_FLOAT; + } + } + + return DXGI_FORMAT_UNKNOWN; + } + +#undef ISBITMASK + + //-------------------------------------------------------------------------------------- + inline DirectX::DDS_ALPHA_MODE GetAlphaMode(_In_ const DDS_HEADER* header) + { + if (header->ddspf.flags & DDS_FOURCC) + { + if (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC) + { + auto d3d10ext = reinterpret_cast((const char*)header + sizeof(DDS_HEADER)); + auto mode = static_cast(d3d10ext->miscFlags2 & DDS_MISC_FLAGS2_ALPHA_MODE_MASK); + switch (mode) + { + case DDS_ALPHA_MODE_STRAIGHT: + case DDS_ALPHA_MODE_PREMULTIPLIED: + case DDS_ALPHA_MODE_OPAQUE: + case DDS_ALPHA_MODE_CUSTOM: + return mode; + + default: + break; + } + } + else if ((MAKEFOURCC('D', 'X', 'T', '2') == header->ddspf.fourCC) + || (MAKEFOURCC('D', 'X', 'T', '4') == header->ddspf.fourCC)) + { + return DDS_ALPHA_MODE_PREMULTIPLIED; + } + } + + return DDS_ALPHA_MODE_UNKNOWN; + } + + //-------------------------------------------------------------------------------------- + class auto_delete_file + { + public: + auto_delete_file(HANDLE hFile) : m_handle(hFile) {} + + auto_delete_file(const auto_delete_file&) = delete; + auto_delete_file& operator=(const auto_delete_file&) = delete; + + ~auto_delete_file() + { + if (m_handle) + { + FILE_DISPOSITION_INFO info = {}; + info.DeleteFile = TRUE; + (void)SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); + } + } + + void clear() { m_handle = 0; } + + private: + HANDLE m_handle; + }; + + class auto_delete_file_wic + { + public: + auto_delete_file_wic(Microsoft::WRL::ComPtr& hFile, LPCWSTR szFile) : m_filename(szFile), m_handle(hFile) {} + + auto_delete_file_wic(const auto_delete_file_wic&) = delete; + auto_delete_file_wic& operator=(const auto_delete_file_wic&) = delete; + + ~auto_delete_file_wic() + { + if (m_filename) + { + m_handle.Reset(); + DeleteFileW(m_filename); + } + } + + void clear() { m_filename = 0; } + + private: + LPCWSTR m_filename; + Microsoft::WRL::ComPtr& m_handle; + }; + + } +} \ No newline at end of file diff --git a/DirectXTK/Src/Model.cpp b/DirectXTK/Src/Model.cpp new file mode 100644 index 0000000..747a3d1 --- /dev/null +++ b/DirectXTK/Src/Model.cpp @@ -0,0 +1,302 @@ +//-------------------------------------------------------------------------------------- +// File: Model.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Model.h" + +#include "CommonStates.h" +#include "DirectXHelpers.h" +#include "Effects.h" +#include "PlatformHelpers.h" + +using namespace DirectX; + +#ifndef _CPPRTTI +#error Model requires RTTI +#endif + +//-------------------------------------------------------------------------------------- +// ModelMeshPart +//-------------------------------------------------------------------------------------- + +ModelMeshPart::ModelMeshPart() : + indexCount(0), + startIndex(0), + vertexOffset(0), + vertexStride(0), + primitiveType(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST), + indexFormat(DXGI_FORMAT_R16_UINT), + isAlpha(false) +{ +} + + +ModelMeshPart::~ModelMeshPart() +{ +} + + +_Use_decl_annotations_ +void ModelMeshPart::Draw( + ID3D11DeviceContext* deviceContext, + IEffect* ieffect, + ID3D11InputLayout* iinputLayout, + std::function setCustomState) const +{ + deviceContext->IASetInputLayout(iinputLayout); + + auto vb = vertexBuffer.Get(); + UINT vbStride = vertexStride; + UINT vbOffset = 0; + deviceContext->IASetVertexBuffers(0, 1, &vb, &vbStride, &vbOffset); + + // Note that if indexFormat is DXGI_FORMAT_R32_UINT, this model mesh part requires a Feature Level 9.2 or greater device + deviceContext->IASetIndexBuffer(indexBuffer.Get(), indexFormat, 0); + + assert(ieffect != 0); + ieffect->Apply(deviceContext); + + // Hook lets the caller replace our shaders or state settings with whatever else they see fit. + if (setCustomState) + { + setCustomState(); + } + + // Draw the primitive. + deviceContext->IASetPrimitiveTopology(primitiveType); + + deviceContext->DrawIndexed(indexCount, startIndex, vertexOffset); +} + + +_Use_decl_annotations_ +void ModelMeshPart::CreateInputLayout(ID3D11Device* d3dDevice, IEffect* ieffect, ID3D11InputLayout** iinputLayout) const +{ + if (!vbDecl || vbDecl->empty()) + throw std::exception("Model mesh part missing vertex buffer input elements data"); + + void const* shaderByteCode; + size_t byteCodeLength; + + assert(ieffect != 0); + ieffect->GetVertexShaderBytecode(&shaderByteCode, &byteCodeLength); + + assert(d3dDevice != 0); + + ThrowIfFailed( + d3dDevice->CreateInputLayout(vbDecl->data(), + static_cast(vbDecl->size()), + shaderByteCode, byteCodeLength, + iinputLayout) + ); + + _Analysis_assume_(*iinputLayout != 0); +} + + +_Use_decl_annotations_ +void ModelMeshPart::ModifyEffect(ID3D11Device* d3dDevice, std::shared_ptr& ieffect, bool isalpha) +{ + if (!vbDecl || vbDecl->empty()) + throw std::exception("Model mesh part missing vertex buffer input elements data"); + + assert(ieffect != 0); + this->effect = ieffect; + this->isAlpha = isalpha; + + void const* shaderByteCode; + size_t byteCodeLength; + + effect->GetVertexShaderBytecode(&shaderByteCode, &byteCodeLength); + + assert(d3dDevice != 0); + + ThrowIfFailed( + d3dDevice->CreateInputLayout(vbDecl->data(), + static_cast(vbDecl->size()), + shaderByteCode, byteCodeLength, + &inputLayout) + ); +} + + +//-------------------------------------------------------------------------------------- +// ModelMesh +//-------------------------------------------------------------------------------------- + +ModelMesh::ModelMesh() : + ccw(true), + pmalpha(true) +{ +} + + +ModelMesh::~ModelMesh() +{ +} + + +_Use_decl_annotations_ +void ModelMesh::PrepareForRendering( + ID3D11DeviceContext* deviceContext, + const CommonStates& states, + bool alpha, + bool wireframe) const +{ + assert(deviceContext != 0); + + // Set the blend and depth stencil state. + ID3D11BlendState* blendState; + ID3D11DepthStencilState* depthStencilState; + + if (alpha) + { + if (pmalpha) + { + blendState = states.AlphaBlend(); + depthStencilState = states.DepthRead(); + } + else + { + blendState = states.NonPremultiplied(); + depthStencilState = states.DepthRead(); + } + } + else + { + blendState = states.Opaque(); + depthStencilState = states.DepthDefault(); + } + + deviceContext->OMSetBlendState(blendState, nullptr, 0xFFFFFFFF); + deviceContext->OMSetDepthStencilState(depthStencilState, 0); + + // Set the rasterizer state. + if (wireframe) + deviceContext->RSSetState(states.Wireframe()); + else + deviceContext->RSSetState(ccw ? states.CullCounterClockwise() : states.CullClockwise()); + + // Set sampler state. + ID3D11SamplerState* samplers[] = + { + states.LinearWrap(), + states.LinearWrap(), + }; + + deviceContext->PSSetSamplers(0, 2, samplers); +} + + +_Use_decl_annotations_ +void XM_CALLCONV ModelMesh::Draw( + ID3D11DeviceContext* deviceContext, + FXMMATRIX world, + CXMMATRIX view, + CXMMATRIX projection, + bool alpha, + std::function setCustomState) const +{ + assert(deviceContext != 0); + + for (auto it = meshParts.cbegin(); it != meshParts.cend(); ++it) + { + auto part = (*it).get(); + assert(part != 0); + + if (part->isAlpha != alpha) + { + // Skip alpha parts when drawing opaque or skip opaque parts if drawing alpha + continue; + } + + auto imatrices = dynamic_cast(part->effect.get()); + if (imatrices) + { + imatrices->SetMatrices(world, view, projection); + } + + part->Draw(deviceContext, part->effect.get(), part->inputLayout.Get(), setCustomState); + } +} + + +//-------------------------------------------------------------------------------------- +// Model +//-------------------------------------------------------------------------------------- + +Model::~Model() +{ +} + + +_Use_decl_annotations_ +void XM_CALLCONV Model::Draw( + ID3D11DeviceContext* deviceContext, + const CommonStates& states, + FXMMATRIX world, + CXMMATRIX view, + CXMMATRIX projection, + bool wireframe, std::function setCustomState) const +{ + assert(deviceContext != 0); + + // Draw opaque parts + for (auto it = meshes.cbegin(); it != meshes.cend(); ++it) + { + auto mesh = it->get(); + assert(mesh != 0); + + mesh->PrepareForRendering(deviceContext, states, false, wireframe); + + mesh->Draw(deviceContext, world, view, projection, false, setCustomState); + } + + // Draw alpha parts + for (auto it = meshes.cbegin(); it != meshes.cend(); ++it) + { + auto mesh = it->get(); + assert(mesh != 0); + + mesh->PrepareForRendering(deviceContext, states, true, wireframe); + + mesh->Draw(deviceContext, world, view, projection, true, setCustomState); + } +} + + +void Model::UpdateEffects(_In_ std::function setEffect) +{ + if (mEffectCache.empty()) + { + // This cache ensures we only set each effect once (could be shared) + for (auto mit = meshes.cbegin(); mit != meshes.cend(); ++mit) + { + auto mesh = mit->get(); + assert(mesh != 0); + + for (auto it = mesh->meshParts.cbegin(); it != mesh->meshParts.cend(); ++it) + { + if ((*it)->effect != 0) + mEffectCache.insert((*it)->effect.get()); + } + } + } + + assert(setEffect != 0); + + for (auto it = mEffectCache.begin(); it != mEffectCache.end(); ++it) + { + setEffect(*it); + } +} diff --git a/DirectXTK/Src/ModelLoadCMO.cpp b/DirectXTK/Src/ModelLoadCMO.cpp new file mode 100644 index 0000000..76ee78e --- /dev/null +++ b/DirectXTK/Src/ModelLoadCMO.cpp @@ -0,0 +1,874 @@ +//-------------------------------------------------------------------------------------- +// File: ModelLoadCMO.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Model.h" + +#include "DDSTextureLoader.h" +#include "Effects.h" +#include "VertexTypes.h" + +#include "DirectXHelpers.h" +#include "PlatformHelpers.h" +#include "BinaryReader.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +//-------------------------------------------------------------------------------------- +// .CMO files are built by Visual Studio 2012 and an example renderer is provided +// in the VS Direct3D Starter Kit +// http://code.msdn.microsoft.com/Visual-Studio-3D-Starter-455a15f1 +//-------------------------------------------------------------------------------------- + +namespace VSD3DStarter +{ + // .CMO files + + // UINT - Mesh count + // { [Mesh count] + // UINT - Length of name + // wchar_t[] - Name of mesh (if length > 0) + // UINT - Material count + // { [Material count] + // UINT - Length of material name + // wchar_t[] - Name of material (if length > 0) + // Material structure + // UINT - Length of pixel shader name + // wchar_t[] - Name of pixel shader (if length > 0) + // { [8] + // UINT - Length of texture name + // wchar_t[] - Name of texture (if length > 0) + // } + // } + // BYTE - 1 if there is skeletal animation data present + // UINT - SubMesh count + // { [SubMesh count] + // SubMesh structure + // } + // UINT - IB Count + // { [IB Count] + // UINT - Number of USHORTs in IB + // USHORT[] - Array of indices + // } + // UINT - VB Count + // { [VB Count] + // UINT - Number of verts in VB + // Vertex[] - Array of vertices + // } + // UINT - Skinning VB Count + // { [Skinning VB Count] + // UINT - Number of verts in Skinning VB + // SkinningVertex[] - Array of skinning verts + // } + // MeshExtents structure + // [If skeleton animation data is not present, file ends here] + // UINT - Bone count + // { [Bone count] + // UINT - Length of bone name + // wchar_t[] - Bone name (if length > 0) + // Bone structure + // } + // UINT - Animation clip count + // { [Animation clip count] + // UINT - Length of clip name + // wchar_t[] - Clip name (if length > 0) + // float - Start time + // float - End time + // UINT - Keyframe count + // { [Keyframe count] + // Keyframe structure + // } + // } + // } + + #pragma pack(push,1) + + struct Material + { + DirectX::XMFLOAT4 Ambient; + DirectX::XMFLOAT4 Diffuse; + DirectX::XMFLOAT4 Specular; + float SpecularPower; + DirectX::XMFLOAT4 Emissive; + DirectX::XMFLOAT4X4 UVTransform; + }; + + const uint32_t MAX_TEXTURE = 8; + + struct SubMesh + { + UINT MaterialIndex; + UINT IndexBufferIndex; + UINT VertexBufferIndex; + UINT StartIndex; + UINT PrimCount; + }; + + const uint32_t NUM_BONE_INFLUENCES = 4; + + static_assert( sizeof(VertexPositionNormalTangentColorTexture) == 52, "mismatch with CMO vertex type" ); + + struct SkinningVertex + { + UINT boneIndex[NUM_BONE_INFLUENCES]; + float boneWeight[NUM_BONE_INFLUENCES]; + }; + + struct MeshExtents + { + float CenterX, CenterY, CenterZ; + float Radius; + + float MinX, MinY, MinZ; + float MaxX, MaxY, MaxZ; + }; + + struct Bone + { + INT ParentIndex; + DirectX::XMFLOAT4X4 InvBindPos; + DirectX::XMFLOAT4X4 BindPos; + DirectX::XMFLOAT4X4 LocalTransform; + }; + + struct Clip + { + float StartTime; + float EndTime; + UINT keys; + }; + + struct Keyframe + { + UINT BoneIndex; + float Time; + DirectX::XMFLOAT4X4 Transform; + }; + + #pragma pack(pop) + + const Material s_defMaterial = + { + { 0.2f, 0.2f, 0.2f, 1.f }, + { 0.8f, 0.8f, 0.8f, 1.f }, + { 0.0f, 0.0f, 0.0f, 1.f }, + 1.f, + { 0.0f, 0.0f, 0.0f, 1.0f }, + { 1.f, 0.f, 0.f, 0.f, + 0.f, 1.f, 0.f, 0.f, + 0.f, 0.f, 1.f, 0.f, + 0.f, 0.f, 0.f, 1.f }, + }; +}; // namespace + +static_assert( sizeof(VSD3DStarter::Material) == 132, "CMO Mesh structure size incorrect" ); +static_assert( sizeof(VSD3DStarter::SubMesh) == 20, "CMO Mesh structure size incorrect" ); +static_assert( sizeof(VSD3DStarter::SkinningVertex)== 32, "CMO Mesh structure size incorrect" ); +static_assert( sizeof(VSD3DStarter::MeshExtents)== 40, "CMO Mesh structure size incorrect" ); +static_assert( sizeof(VSD3DStarter::Bone) == 196, "CMO Mesh structure size incorrect" ); +static_assert( sizeof(VSD3DStarter::Clip) == 12, "CMO Mesh structure size incorrect" ); +static_assert( sizeof(VSD3DStarter::Keyframe)== 72, "CMO Mesh structure size incorrect" ); + +//-------------------------------------------------------------------------------------- +struct MaterialRecordCMO +{ + const VSD3DStarter::Material* pMaterial; + std::wstring name; + std::wstring pixelShader; + std::wstring texture[VSD3DStarter::MAX_TEXTURE]; + std::shared_ptr effect; + ComPtr il; +}; + +// Helper for creating a D3D input layout. +static void CreateInputLayout(_In_ ID3D11Device* device, IEffect* effect, _Out_ ID3D11InputLayout** pInputLayout, bool skinning ) +{ + void const* shaderByteCode; + size_t byteCodeLength; + + effect->GetVertexShaderBytecode(&shaderByteCode, &byteCodeLength); + + if ( skinning ) + { + ThrowIfFailed( + device->CreateInputLayout( VertexPositionNormalTangentColorTextureSkinning::InputElements, + VertexPositionNormalTangentColorTextureSkinning::InputElementCount, + shaderByteCode, byteCodeLength, + pInputLayout) + ); + } + else + { + ThrowIfFailed( + device->CreateInputLayout( VertexPositionNormalTangentColorTexture::InputElements, + VertexPositionNormalTangentColorTexture::InputElementCount, + shaderByteCode, byteCodeLength, + pInputLayout) + ); + } + + _Analysis_assume_(*pInputLayout != 0); + + SetDebugObjectName(*pInputLayout, "ModelCMO"); +} + +// Shared VB input element description +static INIT_ONCE g_InitOnce = INIT_ONCE_STATIC_INIT; +static std::shared_ptr> g_vbdecl; +static std::shared_ptr> g_vbdeclSkinning; + +static BOOL CALLBACK InitializeDecl( PINIT_ONCE initOnce, PVOID Parameter, PVOID *lpContext ) +{ + UNREFERENCED_PARAMETER( initOnce ); + UNREFERENCED_PARAMETER( Parameter ); + UNREFERENCED_PARAMETER( lpContext ); + + g_vbdecl = std::make_shared>( VertexPositionNormalTangentColorTexture::InputElements, + VertexPositionNormalTangentColorTexture::InputElements + VertexPositionNormalTangentColorTexture::InputElementCount ); + + g_vbdeclSkinning = std::make_shared>( VertexPositionNormalTangentColorTextureSkinning::InputElements, + VertexPositionNormalTangentColorTextureSkinning::InputElements + VertexPositionNormalTangentColorTextureSkinning::InputElementCount ); + return TRUE; +} + + +//====================================================================================== +// Model Loader +//====================================================================================== + +_Use_decl_annotations_ +std::unique_ptr DirectX::Model::CreateFromCMO( ID3D11Device* d3dDevice, const uint8_t* meshData, size_t dataSize, IEffectFactory& fxFactory, bool ccw, bool pmalpha ) +{ + if ( !InitOnceExecuteOnce( &g_InitOnce, InitializeDecl, nullptr, nullptr ) ) + throw std::exception("One-time initialization failed"); + + if ( !d3dDevice || !meshData ) + throw std::exception("Device and meshData cannot be null"); + + auto fxFactoryDGSL = dynamic_cast( &fxFactory ); + + // Meshes + auto nMesh = reinterpret_cast( meshData ); + size_t usedSize = sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !*nMesh ) + throw std::exception("No meshes found"); + + std::unique_ptr model(new Model()); + + for( UINT meshIndex = 0; meshIndex < *nMesh; ++meshIndex ) + { + // Mesh name + auto nName = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + auto meshName = reinterpret_cast( meshData + usedSize ); + + usedSize += sizeof(wchar_t)*(*nName); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + auto mesh = std::make_shared(); + mesh->name.assign( meshName, *nName ); + mesh->ccw = ccw; + mesh->pmalpha = pmalpha; + + // Materials + auto nMats = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + std::vector materials; + materials.reserve( *nMats ); + for( UINT j = 0; j < *nMats; ++j ) + { + MaterialRecordCMO m; + + // Material name + nName = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + auto matName = reinterpret_cast( meshData + usedSize ); + + usedSize += sizeof(wchar_t)*(*nName); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + m.name.assign( matName, *nName ); + + // Material settings + auto matSetting = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(VSD3DStarter::Material); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + m.pMaterial = matSetting; + + // Pixel shader name + nName = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + auto psName = reinterpret_cast( meshData + usedSize ); + + usedSize += sizeof(wchar_t)*(*nName); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + m.pixelShader.assign( psName, *nName ); + + for( UINT t = 0; t < VSD3DStarter::MAX_TEXTURE; ++t ) + { + nName = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + auto txtName = reinterpret_cast( meshData + usedSize ); + + usedSize += sizeof(wchar_t)*(*nName); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + m.texture[t].assign( txtName, *nName ); + } + + materials.emplace_back( m ); + } + + assert( materials.size() == *nMats ); + + if (materials.empty()) + { + // Add default material if none defined + MaterialRecordCMO m; + m.pMaterial = &VSD3DStarter::s_defMaterial; + m.name = L"Default"; + materials.emplace_back(m); + } + + // Skeletal data? + auto bSkeleton = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(BYTE); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + // Submeshes + auto nSubmesh = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !*nSubmesh ) + throw std::exception("No submeshes found\n"); + + auto subMesh = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(VSD3DStarter::SubMesh) * (*nSubmesh); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + // Index buffers + auto nIBs = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !*nIBs ) + throw std::exception("No index buffers found\n"); + + struct IBData + { + size_t nIndices; + const USHORT* ptr; + }; + + std::vector ibData; + ibData.reserve( *nIBs ); + + std::vector> ibs; + ibs.resize( *nIBs ); + + for( UINT j = 0; j < *nIBs; ++j ) + { + auto nIndexes = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !*nIndexes ) + throw std::exception("Empty index buffer found\n"); + + size_t ibBytes = sizeof(USHORT) * (*(nIndexes)); + + auto indexes = reinterpret_cast( meshData + usedSize ); + usedSize += ibBytes; + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + IBData ib; + ib.nIndices = *nIndexes; + ib.ptr = indexes; + ibData.emplace_back( ib ); + + D3D11_BUFFER_DESC desc = {}; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.ByteWidth = static_cast( ibBytes ); + desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = indexes; + + ThrowIfFailed( + d3dDevice->CreateBuffer( &desc, &initData, &ibs[j] ) + ); + + SetDebugObjectName( ibs[j].Get(), "ModelCMO" ); + } + + assert( ibData.size() == *nIBs ); + assert( ibs.size() == *nIBs ); + + // Vertex buffers + auto nVBs = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !*nVBs ) + throw std::exception("No vertex buffers found\n"); + + struct VBData + { + size_t nVerts; + const VertexPositionNormalTangentColorTexture* ptr; + const VSD3DStarter::SkinningVertex* skinPtr; + }; + + std::vector vbData; + vbData.reserve( *nVBs ); + for( UINT j = 0; j < *nVBs; ++j ) + { + auto nVerts = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !*nVerts ) + throw std::exception("Empty vertex buffer found\n"); + + size_t vbBytes = sizeof(VertexPositionNormalTangentColorTexture) * (*(nVerts)); + + auto verts = reinterpret_cast( meshData + usedSize ); + usedSize += vbBytes; + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + VBData vb; + vb.nVerts = *nVerts; + vb.ptr = verts; + vb.skinPtr = nullptr; + vbData.emplace_back( vb ); + } + + assert( vbData.size() == *nVBs ); + + // Skinning vertex buffers + auto nSkinVBs = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( *nSkinVBs ) + { + if ( *nSkinVBs != *nVBs ) + throw std::exception("Number of VBs not equal to number of skin VBs"); + + for( UINT j = 0; j < *nSkinVBs; ++j ) + { + auto nVerts = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !*nVerts ) + throw std::exception("Empty skinning vertex buffer found\n"); + + if ( vbData[ j ].nVerts != *nVerts ) + throw std::exception("Mismatched number of verts for skin VBs"); + + size_t vbBytes = sizeof(VSD3DStarter::SkinningVertex) * (*(nVerts)); + + auto verts = reinterpret_cast( meshData + usedSize ); + usedSize += vbBytes; + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + vbData[j].skinPtr = verts; + } + } + + // Extents + auto extents = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(VSD3DStarter::MeshExtents); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + mesh->boundingSphere.Center.x = extents->CenterX; + mesh->boundingSphere.Center.y = extents->CenterY; + mesh->boundingSphere.Center.z = extents->CenterZ; + mesh->boundingSphere.Radius = extents->Radius; + + XMVECTOR min = XMVectorSet( extents->MinX, extents->MinY, extents->MinZ, 0.f ); + XMVECTOR max = XMVectorSet( extents->MaxX, extents->MaxY, extents->MaxZ, 0.f ); + BoundingBox::CreateFromPoints( mesh->boundingBox, min, max ); + +#if 0 + // Animation data + if ( *bSkeleton ) + { + // Bones + auto nBones = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !*nBones ) + throw std::exception("Animation bone data is missing\n"); + + for( UINT j = 0; j < *nBones; ++j ) + { + // Bone name + nName = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + auto boneName = reinterpret_cast( meshData + usedSize ); + + usedSize += sizeof(wchar_t)*(*nName); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + // TODO - What to do with bone name? + boneName; + + // Bone settings + auto bones = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(VSD3DStarter::Bone); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + // TODO - What to do with bone data? + bones; + } + + // Animation Clips + auto nClips = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + for( UINT j = 0; j < *nClips; ++j ) + { + // Clip name + nName = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(UINT); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + auto clipName = reinterpret_cast( meshData + usedSize ); + + usedSize += sizeof(wchar_t)*(*nName); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + // TODO - What to do with clip name? + clipName; + + auto clip = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(VSD3DStarter::Clip); + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + if ( !clip->keys ) + throw std::exception("Keyframes missing in clip"); + + auto keys = reinterpret_cast( meshData + usedSize ); + usedSize += sizeof(VSD3DStarter::Keyframe) * clip->keys; + if ( dataSize < usedSize ) + throw std::exception("End of file"); + + // TODO - What to do with keys and clip->StartTime, clip->EndTime? + keys; + } + } +#else + UNREFERENCED_PARAMETER(bSkeleton); +#endif + + bool enableSkinning = ( *nSkinVBs ) != 0; + + // Build vertex buffers + std::vector> vbs; + vbs.resize( *nVBs ); + + const size_t stride = enableSkinning ? sizeof(VertexPositionNormalTangentColorTextureSkinning) + : sizeof(VertexPositionNormalTangentColorTexture); + + for( UINT j = 0; j < *nVBs; ++j ) + { + size_t nVerts = vbData[ j ].nVerts; + + size_t bytes = stride * nVerts; + + D3D11_BUFFER_DESC desc = {}; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.ByteWidth = static_cast( bytes ); + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + + if ( fxFactoryDGSL && !enableSkinning ) + { + // Can use CMO vertex data directly + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = vbData[j].ptr; + + ThrowIfFailed( + d3dDevice->CreateBuffer( &desc, &initData, &vbs[j] ) + ); + } + else + { + std::unique_ptr temp( new uint8_t[ bytes + ( sizeof(UINT) * nVerts ) ] ); + + auto visited = reinterpret_cast( temp.get() + bytes ); + memset( visited, 0xff, sizeof(UINT) * nVerts ); + + assert( vbData[j].ptr != 0 ); + + if ( enableSkinning ) + { + // Combine CMO multi-stream data into a single stream + auto skinptr = vbData[j].skinPtr; + assert( skinptr != 0 ); + + uint8_t* ptr = temp.get(); + + auto sptr = vbData[j].ptr; + + for( size_t v = 0; v < nVerts; ++v ) + { + *reinterpret_cast( ptr ) = *sptr; + ++sptr; + + auto skinv = reinterpret_cast( ptr ); + skinv->SetBlendIndices( *reinterpret_cast( skinptr->boneIndex ) ); + skinv->SetBlendWeights( *reinterpret_cast( skinptr->boneWeight ) ); + + ptr += stride; + } + } + else + { + memcpy( temp.get(), vbData[j].ptr, bytes ); + } + + if ( !fxFactoryDGSL ) + { + // Need to fix up VB tex coords for UV transform which is not supported by basic effects + for( UINT k = 0; k < *nSubmesh; ++k ) + { + auto& sm = subMesh[ k ]; + + if ( sm.VertexBufferIndex != j ) + continue; + + if ( (sm.IndexBufferIndex >= *nIBs) + || (sm.MaterialIndex >= materials.size()) ) + throw std::exception("Invalid submesh found\n"); + + XMMATRIX uvTransform = XMLoadFloat4x4( &materials[ sm.MaterialIndex ].pMaterial->UVTransform ); + + auto ib = ibData[ sm.IndexBufferIndex ].ptr; + + size_t count = ibData[ sm.IndexBufferIndex ].nIndices; + + for( size_t q = 0; q < count; ++q ) + { + size_t v = ib[ q ]; + + if ( v >= nVerts ) + throw std::exception("Invalid index found\n"); + + auto verts = reinterpret_cast( temp.get() + ( v * stride ) ); + if ( visited[v] == UINT(-1) ) + { + visited[v] = sm.MaterialIndex; + + XMVECTOR t = XMLoadFloat2( &verts->textureCoordinate ); + + t = XMVectorSelect( g_XMIdentityR3, t, g_XMSelect1110 ); + + t = XMVector4Transform( t, uvTransform ); + + XMStoreFloat2( &verts->textureCoordinate, t ); + } + else if ( visited[v] != sm.MaterialIndex ) + { +#ifdef _DEBUG + XMMATRIX uv2 = XMLoadFloat4x4( &materials[ visited[v] ].pMaterial->UVTransform ); + + if ( XMVector4NotEqual( uvTransform.r[0], uv2.r[0] ) + || XMVector4NotEqual( uvTransform.r[1], uv2.r[1] ) + || XMVector4NotEqual( uvTransform.r[2], uv2.r[2] ) + || XMVector4NotEqual( uvTransform.r[3], uv2.r[3] ) ) + { + DebugTrace( "WARNING: %ls - mismatched UV transforms for the same vertex; texture coordinates may not be correct\n", mesh->name.c_str() ); + } +#endif + } + } + } + } + + // Create vertex buffer from temporary buffer + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = temp.get(); + + ThrowIfFailed( + d3dDevice->CreateBuffer( &desc, &initData, &vbs[j] ) + ); + } + + SetDebugObjectName( vbs[j].Get(), "ModelCMO" ); + } + + assert( vbs.size() == *nVBs ); + + // Create Effects + for( size_t j = 0; j < materials.size(); ++j ) + { + auto& m = materials[ j ]; + + if ( fxFactoryDGSL ) + { + DGSLEffectFactory::DGSLEffectInfo info; + info.name = m.name.c_str(); + info.specularPower = m.pMaterial->SpecularPower; + info.perVertexColor = true; + info.enableSkinning = enableSkinning; + info.alpha = m.pMaterial->Diffuse.w; + info.ambientColor = XMFLOAT3( m.pMaterial->Ambient.x, m.pMaterial->Ambient.y, m.pMaterial->Ambient.z ); + info.diffuseColor = XMFLOAT3( m.pMaterial->Diffuse.x, m.pMaterial->Diffuse.y, m.pMaterial->Diffuse.z ); + info.specularColor = XMFLOAT3( m.pMaterial->Specular.x, m.pMaterial->Specular.y, m.pMaterial->Specular.z ); + info.emissiveColor = XMFLOAT3( m.pMaterial->Emissive.x, m.pMaterial->Emissive.y, m.pMaterial->Emissive.z ); + info.diffuseTexture = m.texture[0].empty() ? nullptr : m.texture[0].c_str(); + info.specularTexture = m.texture[1].empty() ? nullptr : m.texture[1].c_str(); + info.normalTexture = m.texture[2].empty() ? nullptr : m.texture[2].c_str(); + info.pixelShader = m.pixelShader.c_str(); + + const int offset = DGSLEffectFactory::DGSLEffectInfo::BaseTextureOffset; + for( int i = 0; i < (DGSLEffect::MaxTextures - offset); ++i ) + { + info.textures[i] = m.texture[ i + offset ].empty() ? nullptr : m.texture[ i + offset ].c_str(); + } + + m.effect = fxFactoryDGSL->CreateDGSLEffect( info, nullptr ); + + auto dgslEffect = static_cast( m.effect.get() ); + dgslEffect->SetUVTransform( XMLoadFloat4x4( &m.pMaterial->UVTransform ) ); + } + else + { + EffectFactory::EffectInfo info; + info.name = m.name.c_str(); + info.specularPower = m.pMaterial->SpecularPower; + info.perVertexColor = true; + info.enableSkinning = enableSkinning; + info.alpha = m.pMaterial->Diffuse.w; + info.ambientColor = XMFLOAT3( m.pMaterial->Ambient.x, m.pMaterial->Ambient.y, m.pMaterial->Ambient.z ); + info.diffuseColor = XMFLOAT3( m.pMaterial->Diffuse.x, m.pMaterial->Diffuse.y, m.pMaterial->Diffuse.z ); + info.specularColor = XMFLOAT3( m.pMaterial->Specular.x, m.pMaterial->Specular.y, m.pMaterial->Specular.z ); + info.emissiveColor = XMFLOAT3( m.pMaterial->Emissive.x, m.pMaterial->Emissive.y, m.pMaterial->Emissive.z ); + info.diffuseTexture = m.texture[0].c_str(); + + m.effect = fxFactory.CreateEffect( info, nullptr ); + } + + CreateInputLayout( d3dDevice, m.effect.get(), &m.il, enableSkinning ); + } + + // Build mesh parts + for( UINT j = 0; j < *nSubmesh; ++j ) + { + auto& sm = subMesh[j]; + + if ( (sm.IndexBufferIndex >= *nIBs) + || (sm.VertexBufferIndex >= *nVBs) + || (sm.MaterialIndex >= materials.size()) ) + throw std::exception("Invalid submesh found\n"); + + auto& mat = materials[ sm.MaterialIndex ]; + + auto part = new ModelMeshPart(); + + if ( mat.pMaterial->Diffuse.w < 1 ) + part->isAlpha = true; + + part->indexCount = sm.PrimCount * 3; + part->startIndex = sm.StartIndex; + part->vertexStride = static_cast( stride ); + part->inputLayout = mat.il; + part->indexBuffer = ibs[ sm.IndexBufferIndex ]; + part->vertexBuffer = vbs[ sm.VertexBufferIndex ]; + part->effect = mat.effect; + part->vbDecl = enableSkinning ? g_vbdeclSkinning : g_vbdecl; + + mesh->meshParts.emplace_back( part ); + } + + model->meshes.emplace_back( mesh ); + } + + return model; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +std::unique_ptr DirectX::Model::CreateFromCMO( ID3D11Device* d3dDevice, const wchar_t* szFileName, IEffectFactory& fxFactory, bool ccw, bool pmalpha ) +{ + size_t dataSize = 0; + std::unique_ptr data; + HRESULT hr = BinaryReader::ReadEntireFile( szFileName, data, &dataSize ); + if ( FAILED(hr) ) + { + DebugTrace( "CreateFromCMO failed (%08X) loading '%ls'\n", hr, szFileName ); + throw std::exception( "CreateFromCMO" ); + } + + auto model = CreateFromCMO( d3dDevice, data.get(), dataSize, fxFactory, ccw, pmalpha ); + + model->name = szFileName; + + return model; +} diff --git a/DirectXTK/Src/ModelLoadSDKMESH.cpp b/DirectXTK/Src/ModelLoadSDKMESH.cpp new file mode 100644 index 0000000..06b24ec --- /dev/null +++ b/DirectXTK/Src/ModelLoadSDKMESH.cpp @@ -0,0 +1,632 @@ +//-------------------------------------------------------------------------------------- +// File: ModelLoadSDKMESH.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Model.h" + +#include "Effects.h" +#include "VertexTypes.h" + +#include "DirectXHelpers.h" +#include "PlatformHelpers.h" +#include "BinaryReader.h" + +#include "SDKMesh.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + +namespace +{ + enum + { + PER_VERTEX_COLOR = 0x1, + SKINNING = 0x2, + DUAL_TEXTURE = 0x4, + NORMAL_MAPS = 0x8, + BIASED_VERTEX_NORMALS = 0x10, + }; + + struct MaterialRecordSDKMESH + { + std::shared_ptr effect; + bool alpha; + }; + + void LoadMaterial(const DXUT::SDKMESH_MATERIAL& mh, + unsigned int flags, + IEffectFactory& fxFactory, + MaterialRecordSDKMESH& m) + { + wchar_t matName[DXUT::MAX_MATERIAL_NAME]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, mh.Name, -1, matName, DXUT::MAX_MATERIAL_NAME); + + wchar_t diffuseName[DXUT::MAX_TEXTURE_NAME]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, mh.DiffuseTexture, -1, diffuseName, DXUT::MAX_TEXTURE_NAME); + + wchar_t specularName[DXUT::MAX_TEXTURE_NAME]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, mh.SpecularTexture, -1, specularName, DXUT::MAX_TEXTURE_NAME); + + wchar_t normalName[DXUT::MAX_TEXTURE_NAME]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, mh.NormalTexture, -1, normalName, DXUT::MAX_TEXTURE_NAME); + + if (flags & DUAL_TEXTURE && !mh.SpecularTexture[0]) + { + DebugTrace("WARNING: Material '%s' has multiple texture coords but not multiple textures\n", mh.Name); + flags &= ~DUAL_TEXTURE; + } + + if (flags & NORMAL_MAPS) + { + if (!mh.NormalTexture[0]) + { + flags &= ~NORMAL_MAPS; + *normalName = 0; + } + } + else if (mh.NormalTexture[0]) + { + DebugTrace("WARNING: Material '%s' has a normal map, but vertex buffer is missing tangents\n", mh.Name); + *normalName = 0; + } + + EffectFactory::EffectInfo info; + info.name = matName; + info.perVertexColor = (flags & PER_VERTEX_COLOR) != 0; + info.enableSkinning = (flags & SKINNING) != 0; + info.enableDualTexture = (flags & DUAL_TEXTURE) != 0; + info.enableNormalMaps = (flags & NORMAL_MAPS) != 0; + info.biasedVertexNormals = (flags & BIASED_VERTEX_NORMALS) != 0; + + if (mh.Ambient.x == 0 && mh.Ambient.y == 0 && mh.Ambient.z == 0 && mh.Ambient.w == 0 + && mh.Diffuse.x == 0 && mh.Diffuse.y == 0 && mh.Diffuse.z == 0 && mh.Diffuse.w == 0) + { + // SDKMESH material color block is uninitalized; assume defaults + info.diffuseColor = XMFLOAT3(1.f, 1.f, 1.f); + info.alpha = 1.f; + } + else + { + info.ambientColor = XMFLOAT3(mh.Ambient.x, mh.Ambient.y, mh.Ambient.z); + info.diffuseColor = XMFLOAT3(mh.Diffuse.x, mh.Diffuse.y, mh.Diffuse.z); + info.emissiveColor = XMFLOAT3(mh.Emissive.x, mh.Emissive.y, mh.Emissive.z); + + if (mh.Diffuse.w != 1.f && mh.Diffuse.w != 0.f) + { + info.alpha = mh.Diffuse.w; + } + else + info.alpha = 1.f; + + if (mh.Power) + { + info.specularPower = mh.Power; + info.specularColor = XMFLOAT3(mh.Specular.x, mh.Specular.y, mh.Specular.z); + } + } + + info.diffuseTexture = diffuseName; + info.specularTexture = specularName; + info.normalTexture = normalName; + + m.effect = fxFactory.CreateEffect(info, nullptr); + m.alpha = (info.alpha < 1.f); + } + + + //-------------------------------------------------------------------------------------- + // Direct3D 9 Vertex Declaration to Direct3D 11 Input Layout mapping + + unsigned int GetInputLayoutDesc( + _In_reads_(32) const DXUT::D3DVERTEXELEMENT9 decl[], + std::vector& inputDesc) + { + static const D3D11_INPUT_ELEMENT_DESC s_elements[] = + { + { "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_B8G8R8A8_UNORM, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "BINORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "BLENDINDICES", 0, DXGI_FORMAT_R8G8B8A8_UINT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "BLENDWEIGHT", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; + + using namespace DXUT; + + uint32_t offset = 0; + uint32_t texcoords = 0; + unsigned int flags = 0; + + bool posfound = false; + + for (uint32_t index = 0; index < DXUT::MAX_VERTEX_ELEMENTS; ++index) + { + if (decl[index].Usage == 0xFF) + break; + + if (decl[index].Type == D3DDECLTYPE_UNUSED) + break; + + if (decl[index].Offset != offset) + break; + + if (decl[index].Usage == D3DDECLUSAGE_POSITION) + { + if (decl[index].Type == D3DDECLTYPE_FLOAT3) + { + inputDesc.push_back(s_elements[0]); + offset += 12; + posfound = true; + } + else + break; + } + else if (decl[index].Usage == D3DDECLUSAGE_NORMAL + || decl[index].Usage == D3DDECLUSAGE_TANGENT + || decl[index].Usage == D3DDECLUSAGE_BINORMAL) + { + size_t base = 1; + if (decl[index].Usage == D3DDECLUSAGE_TANGENT) + base = 3; + else if (decl[index].Usage == D3DDECLUSAGE_BINORMAL) + base = 4; + + D3D11_INPUT_ELEMENT_DESC desc = s_elements[base]; + + bool unk = false; + switch (decl[index].Type) + { + case D3DDECLTYPE_FLOAT3: assert(desc.Format == DXGI_FORMAT_R32G32B32_FLOAT); offset += 12; break; + case D3DDECLTYPE_UBYTE4N: desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; flags |= BIASED_VERTEX_NORMALS; offset += 4; break; + case D3DDECLTYPE_SHORT4N: desc.Format = DXGI_FORMAT_R16G16B16A16_SNORM; offset += 8; break; + case D3DDECLTYPE_FLOAT16_4: desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; offset += 8; break; + case D3DDECLTYPE_DXGI_R10G10B10A2_UNORM: desc.Format = DXGI_FORMAT_R10G10B10A2_UNORM; flags |= BIASED_VERTEX_NORMALS; offset += 4; break; + case D3DDECLTYPE_DXGI_R11G11B10_FLOAT: desc.Format = DXGI_FORMAT_R11G11B10_FLOAT; flags |= BIASED_VERTEX_NORMALS; offset += 4; break; + case D3DDECLTYPE_DXGI_R8G8B8A8_SNORM: desc.Format = DXGI_FORMAT_R8G8B8A8_SNORM; offset += 4; break; + +#if defined(_XBOX_ONE) && defined(_TITLE) + case (32 + DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM): desc.Format = DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM; offset += 4; break; +#endif + + default: + unk = true; + break; + } + + if (unk) + break; + + if (decl[index].Usage == D3DDECLUSAGE_TANGENT) + { + flags |= NORMAL_MAPS; + } + + inputDesc.push_back(desc); + } + else if (decl[index].Usage == D3DDECLUSAGE_COLOR) + { + D3D11_INPUT_ELEMENT_DESC desc = s_elements[2]; + + bool unk = false; + switch (decl[index].Type) + { + case D3DDECLTYPE_FLOAT4: desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; offset += 16; break; + case D3DDECLTYPE_D3DCOLOR: assert(desc.Format == DXGI_FORMAT_B8G8R8A8_UNORM); offset += 4; break; + case D3DDECLTYPE_UBYTE4N: desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; offset += 4; break; + case D3DDECLTYPE_FLOAT16_4: desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; offset += 8; break; + case D3DDECLTYPE_DXGI_R10G10B10A2_UNORM: desc.Format = DXGI_FORMAT_R10G10B10A2_UNORM; offset += 4; break; + case D3DDECLTYPE_DXGI_R11G11B10_FLOAT: desc.Format = DXGI_FORMAT_R11G11B10_FLOAT; offset += 4; break; + + default: + unk = true; + break; + } + + if (unk) + break; + + flags |= PER_VERTEX_COLOR; + + inputDesc.push_back(desc); + } + else if (decl[index].Usage == D3DDECLUSAGE_TEXCOORD) + { + D3D11_INPUT_ELEMENT_DESC desc = s_elements[5]; + desc.SemanticIndex = decl[index].UsageIndex; + + bool unk = false; + switch (decl[index].Type) + { + case D3DDECLTYPE_FLOAT1: desc.Format = DXGI_FORMAT_R32_FLOAT; offset += 4; break; + case D3DDECLTYPE_FLOAT2: assert(desc.Format == DXGI_FORMAT_R32G32_FLOAT); offset += 8; break; + case D3DDECLTYPE_FLOAT3: desc.Format = DXGI_FORMAT_R32G32B32_FLOAT; offset += 12; break; + case D3DDECLTYPE_FLOAT4: desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; offset += 16; break; + case D3DDECLTYPE_FLOAT16_2: desc.Format = DXGI_FORMAT_R16G16_FLOAT; offset += 4; break; + case D3DDECLTYPE_FLOAT16_4: desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; offset += 8; break; + + default: + unk = true; + break; + } + + if (unk) + break; + + ++texcoords; + + inputDesc.push_back(desc); + } + else if (decl[index].Usage == D3DDECLUSAGE_BLENDINDICES) + { + if (decl[index].Type == D3DDECLTYPE_UBYTE4) + { + flags |= SKINNING; + inputDesc.push_back(s_elements[6]); + offset += 4; + } + else + break; + } + else if (decl[index].Usage == D3DDECLUSAGE_BLENDWEIGHT) + { + if (decl[index].Type == D3DDECLTYPE_UBYTE4N) + { + flags |= SKINNING; + inputDesc.push_back(s_elements[7]); + offset += 4; + } + else + break; + } + else + break; + } + + if (!posfound) + throw std::exception("SV_Position is required"); + + if (texcoords == 2) + { + flags |= DUAL_TEXTURE; + } + + return flags; + } + + // Helper for creating a D3D input layout. + void CreateInputLayout(_In_ ID3D11Device* device, _In_ IEffect* effect, std::vector& inputDesc, _Out_ ID3D11InputLayout** pInputLayout) + { + void const* shaderByteCode; + size_t byteCodeLength; + + effect->GetVertexShaderBytecode(&shaderByteCode, &byteCodeLength); + + ThrowIfFailed( + device->CreateInputLayout(inputDesc.data(), + static_cast(inputDesc.size()), + shaderByteCode, byteCodeLength, + pInputLayout) + ); + + _Analysis_assume_(*pInputLayout != 0); + + SetDebugObjectName(*pInputLayout, "ModelSDKMESH"); + } +} + + +//====================================================================================== +// Model Loader +//====================================================================================== + +_Use_decl_annotations_ +std::unique_ptr DirectX::Model::CreateFromSDKMESH( ID3D11Device* d3dDevice, const uint8_t* meshData, size_t dataSize, IEffectFactory& fxFactory, bool ccw, bool pmalpha ) +{ + if ( !d3dDevice || !meshData ) + throw std::exception("Device and meshData cannot be null"); + + // File Headers + if ( dataSize < sizeof(DXUT::SDKMESH_HEADER) ) + throw std::exception("End of file"); + auto header = reinterpret_cast( meshData ); + + size_t headerSize = sizeof( DXUT::SDKMESH_HEADER ) + + header->NumVertexBuffers * sizeof(DXUT::SDKMESH_VERTEX_BUFFER_HEADER) + + header->NumIndexBuffers * sizeof(DXUT::SDKMESH_INDEX_BUFFER_HEADER); + if ( header->HeaderSize != headerSize ) + throw std::exception("Not a valid SDKMESH file"); + + if ( dataSize < header->HeaderSize ) + throw std::exception("End of file"); + + if( header->Version != DXUT::SDKMESH_FILE_VERSION ) + throw std::exception("Not a supported SDKMESH version"); + + if ( header->IsBigEndian ) + throw std::exception("Loading BigEndian SDKMESH files not supported"); + + if ( !header->NumMeshes ) + throw std::exception("No meshes found"); + + if ( !header->NumVertexBuffers ) + throw std::exception("No vertex buffers found"); + + if ( !header->NumIndexBuffers ) + throw std::exception("No index buffers found"); + + if ( !header->NumTotalSubsets ) + throw std::exception("No subsets found"); + + if ( !header->NumMaterials ) + throw std::exception("No materials found"); + + // Sub-headers + if ( dataSize < header->VertexStreamHeadersOffset + || ( dataSize < (header->VertexStreamHeadersOffset + header->NumVertexBuffers * sizeof(DXUT::SDKMESH_VERTEX_BUFFER_HEADER) ) ) ) + throw std::exception("End of file"); + auto vbArray = reinterpret_cast( meshData + header->VertexStreamHeadersOffset ); + + if ( dataSize < header->IndexStreamHeadersOffset + || ( dataSize < (header->IndexStreamHeadersOffset + header->NumIndexBuffers * sizeof(DXUT::SDKMESH_INDEX_BUFFER_HEADER) ) ) ) + throw std::exception("End of file"); + auto ibArray = reinterpret_cast( meshData + header->IndexStreamHeadersOffset ); + + if ( dataSize < header->MeshDataOffset + || ( dataSize < (header->MeshDataOffset + header->NumMeshes * sizeof(DXUT::SDKMESH_MESH) ) ) ) + throw std::exception("End of file"); + auto meshArray = reinterpret_cast( meshData + header->MeshDataOffset ); + + if ( dataSize < header->SubsetDataOffset + || ( dataSize < (header->SubsetDataOffset + header->NumTotalSubsets * sizeof(DXUT::SDKMESH_SUBSET) ) ) ) + throw std::exception("End of file"); + auto subsetArray = reinterpret_cast( meshData + header->SubsetDataOffset ); + + if ( dataSize < header->FrameDataOffset + || (dataSize < (header->FrameDataOffset + header->NumFrames * sizeof(DXUT::SDKMESH_FRAME) ) ) ) + throw std::exception("End of file"); + // TODO - auto frameArray = reinterpret_cast( meshData + header->FrameDataOffset ); + + if ( dataSize < header->MaterialDataOffset + || (dataSize < (header->MaterialDataOffset + header->NumMaterials * sizeof(DXUT::SDKMESH_MATERIAL) ) ) ) + throw std::exception("End of file"); + auto materialArray = reinterpret_cast( meshData + header->MaterialDataOffset ); + + // Buffer data + uint64_t bufferDataOffset = header->HeaderSize + header->NonBufferDataSize; + if ( ( dataSize < bufferDataOffset ) + || ( dataSize < bufferDataOffset + header->BufferDataSize ) ) + throw std::exception("End of file"); + const uint8_t* bufferData = meshData + bufferDataOffset; + + // Create vertex buffers + std::vector> vbs; + vbs.resize( header->NumVertexBuffers ); + + std::vector>> vbDecls; + vbDecls.resize( header->NumVertexBuffers ); + + std::vector materialFlags; + materialFlags.resize( header->NumVertexBuffers ); + + for( UINT j=0; j < header->NumVertexBuffers; ++j ) + { + auto& vh = vbArray[j]; + + if ( dataSize < vh.DataOffset + || ( dataSize < vh.DataOffset + vh.SizeBytes ) ) + throw std::exception("End of file"); + + vbDecls[j] = std::make_shared>(); + unsigned int flags = GetInputLayoutDesc(vh.Decl, *vbDecls[j].get()); + + if (flags & SKINNING) + { + flags &= ~(DUAL_TEXTURE | NORMAL_MAPS); + } + if (flags & DUAL_TEXTURE) + { + flags &= ~NORMAL_MAPS; + } + + materialFlags[j] = flags; + + auto verts = reinterpret_cast( bufferData + (vh.DataOffset - bufferDataOffset) ); + + D3D11_BUFFER_DESC desc = {}; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.ByteWidth = static_cast( vh.SizeBytes ); + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = verts; + + ThrowIfFailed( + d3dDevice->CreateBuffer( &desc, &initData, &vbs[j] ) + ); + + SetDebugObjectName( vbs[j].Get(), "ModelSDKMESH" ); + } + + // Create index buffers + std::vector> ibs; + ibs.resize( header->NumIndexBuffers ); + + for( UINT j=0; j < header->NumIndexBuffers; ++j ) + { + auto& ih = ibArray[j]; + + if ( dataSize < ih.DataOffset + || ( dataSize < ih.DataOffset + ih.SizeBytes ) ) + throw std::exception("End of file"); + + if ( ih.IndexType != DXUT::IT_16BIT && ih.IndexType != DXUT::IT_32BIT ) + throw std::exception("Invalid index buffer type found"); + + auto indices = reinterpret_cast( bufferData + (ih.DataOffset - bufferDataOffset) ); + + D3D11_BUFFER_DESC desc = {}; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.ByteWidth = static_cast( ih.SizeBytes ); + desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = indices; + + ThrowIfFailed( + d3dDevice->CreateBuffer( &desc, &initData, &ibs[j] ) + ); + + SetDebugObjectName( ibs[j].Get(), "ModelSDKMESH" ); + } + + // Create meshes + std::vector materials; + materials.resize( header->NumMaterials ); + + std::unique_ptr model(new Model()); + model->meshes.reserve( header->NumMeshes ); + + for( UINT meshIndex = 0; meshIndex < header->NumMeshes; ++meshIndex ) + { + auto& mh = meshArray[ meshIndex ]; + + if ( !mh.NumSubsets + || !mh.NumVertexBuffers + || mh.IndexBuffer >= header->NumIndexBuffers + || mh.VertexBuffers[0] >= header->NumVertexBuffers ) + throw std::exception("Invalid mesh found"); + + // mh.NumVertexBuffers is sometimes not what you'd expect, so we skip validating it + + if ( dataSize < mh.SubsetOffset + || (dataSize < mh.SubsetOffset + mh.NumSubsets*sizeof(UINT) ) ) + throw std::exception("End of file"); + + auto subsets = reinterpret_cast( meshData + mh.SubsetOffset ); + + if ( mh.NumFrameInfluences > 0 ) + { + if ( dataSize < mh.FrameInfluenceOffset + || (dataSize < mh.FrameInfluenceOffset + mh.NumFrameInfluences*sizeof(UINT) ) ) + throw std::exception("End of file"); + + // TODO - auto influences = reinterpret_cast( meshData + mh.FrameInfluenceOffset ); + } + + auto mesh = std::make_shared(); + wchar_t meshName[ DXUT::MAX_MESH_NAME ]; + MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, mh.Name, -1, meshName, DXUT::MAX_MESH_NAME ); + mesh->name = meshName; + mesh->ccw = ccw; + mesh->pmalpha = pmalpha; + + // Extents + mesh->boundingBox.Center = mh.BoundingBoxCenter; + mesh->boundingBox.Extents = mh.BoundingBoxExtents; + BoundingSphere::CreateFromBoundingBox( mesh->boundingSphere, mesh->boundingBox ); + + // Create subsets + mesh->meshParts.reserve( mh.NumSubsets ); + for( UINT j = 0; j < mh.NumSubsets; ++j ) + { + auto sIndex = subsets[ j ]; + if ( sIndex >= header->NumTotalSubsets ) + throw std::exception("Invalid mesh found"); + + auto& subset = subsetArray[ sIndex ]; + + D3D11_PRIMITIVE_TOPOLOGY primType; + switch( subset.PrimitiveType ) + { + case DXUT::PT_TRIANGLE_LIST: primType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST; break; + case DXUT::PT_TRIANGLE_STRIP: primType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; break; + case DXUT::PT_LINE_LIST: primType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST; break; + case DXUT::PT_LINE_STRIP: primType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP; break; + case DXUT::PT_POINT_LIST: primType = D3D11_PRIMITIVE_TOPOLOGY_POINTLIST; break; + case DXUT::PT_TRIANGLE_LIST_ADJ: primType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ; break; + case DXUT::PT_TRIANGLE_STRIP_ADJ: primType = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ; break; + case DXUT::PT_LINE_LIST_ADJ: primType = D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ; break; + case DXUT::PT_LINE_STRIP_ADJ: primType = D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ; break; + + case DXUT::PT_QUAD_PATCH_LIST: + case DXUT::PT_TRIANGLE_PATCH_LIST: + throw std::exception("Direct3D9 era tessellation not supported"); + + default: + throw std::exception("Unknown primitive type"); + } + + if ( subset.MaterialID >= header->NumMaterials ) + throw std::exception("Invalid mesh found"); + + auto& mat = materials[ subset.MaterialID ]; + + if ( !mat.effect ) + { + size_t vi = mh.VertexBuffers[0]; + LoadMaterial( + materialArray[ subset.MaterialID ], + materialFlags[vi], + fxFactory, + mat ); + } + + ComPtr il; + CreateInputLayout( d3dDevice, mat.effect.get(), *vbDecls[ mh.VertexBuffers[0] ].get(), &il ); + + auto part = new ModelMeshPart(); + part->isAlpha = mat.alpha; + + part->indexCount = static_cast( subset.IndexCount ); + part->startIndex = static_cast( subset.IndexStart ); + part->vertexOffset = static_cast( subset.VertexStart ); + part->vertexStride = static_cast( vbArray[ mh.VertexBuffers[0] ].StrideBytes ); + part->indexFormat = ( ibArray[ mh.IndexBuffer ].IndexType == DXUT::IT_32BIT ) ? DXGI_FORMAT_R32_UINT : DXGI_FORMAT_R16_UINT; + part->primitiveType = primType; + part->inputLayout = il; + part->indexBuffer = ibs[ mh.IndexBuffer ]; + part->vertexBuffer = vbs[ mh.VertexBuffers[0] ]; + part->effect = mat.effect; + part->vbDecl = vbDecls[ mh.VertexBuffers[0] ]; + + mesh->meshParts.emplace_back( part ); + } + + model->meshes.emplace_back( mesh ); + } + + return model; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +std::unique_ptr DirectX::Model::CreateFromSDKMESH( ID3D11Device* d3dDevice, const wchar_t* szFileName, IEffectFactory& fxFactory, bool ccw, bool pmalpha ) +{ + size_t dataSize = 0; + std::unique_ptr data; + HRESULT hr = BinaryReader::ReadEntireFile( szFileName, data, &dataSize ); + if ( FAILED(hr) ) + { + DebugTrace( "CreateFromSDKMESH failed (%08X) loading '%ls'\n", hr, szFileName ); + throw std::exception( "CreateFromSDKMESH" ); + } + + auto model = CreateFromSDKMESH( d3dDevice, data.get(), dataSize, fxFactory, ccw, pmalpha ); + + model->name = szFileName; + + return model; +} diff --git a/DirectXTK/Src/ModelLoadVBO.cpp b/DirectXTK/Src/ModelLoadVBO.cpp new file mode 100644 index 0000000..2f0c289 --- /dev/null +++ b/DirectXTK/Src/ModelLoadVBO.cpp @@ -0,0 +1,188 @@ +//-------------------------------------------------------------------------------------- +// File: ModelLoadVBO.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Model.h" + +#include "Effects.h" +#include "VertexTypes.h" + +#include "DirectXHelpers.h" +#include "PlatformHelpers.h" +#include "BinaryReader.h" + +#include "vbo.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + +static_assert(sizeof(VertexPositionNormalTexture) == 32, "VBO vertex size mismatch"); + +namespace +{ + //-------------------------------------------------------------------------------------- + // Shared VB input element description + INIT_ONCE g_InitOnce = INIT_ONCE_STATIC_INIT; + std::shared_ptr> g_vbdecl; + + BOOL CALLBACK InitializeDecl(PINIT_ONCE initOnce, PVOID Parameter, PVOID *lpContext) + { + UNREFERENCED_PARAMETER(initOnce); + UNREFERENCED_PARAMETER(Parameter); + UNREFERENCED_PARAMETER(lpContext); + + g_vbdecl = std::make_shared>(VertexPositionNormalTexture::InputElements, + VertexPositionNormalTexture::InputElements + VertexPositionNormalTexture::InputElementCount); + + return TRUE; + } +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +std::unique_ptr DirectX::Model::CreateFromVBO(ID3D11Device* d3dDevice, const uint8_t* meshData, size_t dataSize, + std::shared_ptr ieffect, bool ccw, bool pmalpha) +{ + if (!InitOnceExecuteOnce(&g_InitOnce, InitializeDecl, nullptr, nullptr)) + throw std::exception("One-time initialization failed"); + + if ( !d3dDevice || !meshData ) + throw std::exception("Device and meshData cannot be null"); + + // File Header + if ( dataSize < sizeof(VBO::header_t) ) + throw std::exception("End of file"); + auto header = reinterpret_cast( meshData ); + + if ( !header->numVertices || !header->numIndices ) + throw std::exception("No vertices or indices found"); + + size_t vertSize = sizeof(VertexPositionNormalTexture) * header->numVertices; + + if (dataSize < (vertSize + sizeof(VBO::header_t))) + throw std::exception("End of file"); + auto verts = reinterpret_cast( meshData + sizeof(VBO::header_t) ); + + size_t indexSize = sizeof(uint16_t) * header->numIndices; + + if (dataSize < (sizeof(VBO::header_t) + vertSize + indexSize)) + throw std::exception("End of file"); + auto indices = reinterpret_cast( meshData + sizeof(VBO::header_t) + vertSize ); + + // Create vertex buffer + ComPtr vb; + { + D3D11_BUFFER_DESC desc = {}; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.ByteWidth = static_cast(vertSize); + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = verts; + + ThrowIfFailed( + d3dDevice->CreateBuffer(&desc, &initData, vb.GetAddressOf()) + ); + + SetDebugObjectName(vb.Get(), "ModelVBO"); + } + + // Create index buffer + ComPtr ib; + { + D3D11_BUFFER_DESC desc = {}; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.ByteWidth = static_cast(indexSize); + desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = indices; + + ThrowIfFailed( + d3dDevice->CreateBuffer(&desc, &initData, ib.GetAddressOf()) + ); + + SetDebugObjectName(ib.Get(), "ModelVBO"); + } + + // Create input layout and effect + if (!ieffect) + { + auto effect = std::make_shared(d3dDevice); + effect->EnableDefaultLighting(); + effect->SetLightingEnabled(true); + + ieffect = effect; + } + + ComPtr il; + { + void const* shaderByteCode; + size_t byteCodeLength; + + ieffect->GetVertexShaderBytecode(&shaderByteCode, &byteCodeLength); + + ThrowIfFailed( + d3dDevice->CreateInputLayout(VertexPositionNormalTexture::InputElements, + VertexPositionNormalTexture::InputElementCount, + shaderByteCode, byteCodeLength, + il.GetAddressOf())); + + SetDebugObjectName(il.Get(), "ModelVBO"); + } + + auto part = new ModelMeshPart(); + part->indexCount = header->numIndices; + part->startIndex = 0; + part->vertexStride = static_cast( sizeof(VertexPositionNormalTexture) ); + part->inputLayout = il; + part->indexBuffer = ib; + part->vertexBuffer = vb; + part->effect = ieffect; + part->vbDecl = g_vbdecl; + + auto mesh = std::make_shared(); + mesh->ccw = ccw; + mesh->pmalpha = pmalpha; + BoundingSphere::CreateFromPoints(mesh->boundingSphere, header->numVertices, &verts->position, sizeof(VertexPositionNormalTexture)); + BoundingBox::CreateFromPoints(mesh->boundingBox, header->numVertices, &verts->position, sizeof(VertexPositionNormalTexture)); + mesh->meshParts.emplace_back(part); + + std::unique_ptr model(new Model()); + model->meshes.emplace_back(mesh); + + return model; +} + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +std::unique_ptr DirectX::Model::CreateFromVBO(ID3D11Device* d3dDevice, const wchar_t* szFileName, + std::shared_ptr ieffect, bool ccw, bool pmalpha) +{ + size_t dataSize = 0; + std::unique_ptr data; + HRESULT hr = BinaryReader::ReadEntireFile( szFileName, data, &dataSize ); + if ( FAILED(hr) ) + { + DebugTrace( "CreateFromVBO failed (%08X) loading '%ls'\n", hr, szFileName ); + throw std::exception( "CreateFromVBO" ); + } + + auto model = CreateFromVBO( d3dDevice, data.get(), dataSize, ieffect, ccw, pmalpha ); + + model->name = szFileName; + + return model; +} diff --git a/DirectXTK/Src/Mouse.cpp b/DirectXTK/Src/Mouse.cpp new file mode 100644 index 0000000..65820f5 --- /dev/null +++ b/DirectXTK/Src/Mouse.cpp @@ -0,0 +1,1031 @@ +//-------------------------------------------------------------------------------------- +// File: Mouse.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "Mouse.h" + +#include "PlatformHelpers.h" + +using namespace DirectX; +using Microsoft::WRL::ComPtr; + + +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) + +//====================================================================================== +// Windows Store or Universal Windows Platform (UWP) app implementation +//====================================================================================== + +// +// For a Windows Store app or Universal Windows Platform (UWP) app, add the following to your existing +// application methods: +// +// void App::SetWindow(CoreWindow^ window ) +// { +// m_mouse->SetWindow(window); +// } +// +// void App::OnDpiChanged(DisplayInformation^ sender, Object^ args) +// { +// m_mouse->SetDpi(sender->LogicalDpi); +// } +// + +#include + +class Mouse::Impl +{ +public: + Impl(Mouse* owner) : + mOwner(owner), + mDPI(96.f), + mMode(MODE_ABSOLUTE) + { + mPointerPressedToken.value = 0; + mPointerReleasedToken.value = 0; + mPointerMovedToken.value = 0; + mPointerWheelToken.value = 0; + mPointerMouseMovedToken.value = 0; + + if ( s_mouse ) + { + throw std::exception( "Mouse is a singleton" ); + } + + s_mouse = this; + + memset( &mState, 0, sizeof(State) ); + + mScrollWheelValue.reset( CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_MODIFY_STATE | SYNCHRONIZE) ); + mRelativeRead.reset( CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_MODIFY_STATE | SYNCHRONIZE) ); + if ( !mScrollWheelValue + || !mRelativeRead ) + { + throw std::exception( "CreateEventEx" ); + } + } + + ~Impl() + { + s_mouse = nullptr; + + RemoveHandlers(); + } + + void GetState(State& state) const + { + memcpy( &state, &mState, sizeof(State) ); + + DWORD result = WaitForSingleObjectEx( mScrollWheelValue.get(), 0, FALSE ); + if ( result == WAIT_FAILED ) + throw std::exception( "WaitForSingleObjectEx" ); + + if ( result == WAIT_OBJECT_0 ) + { + state.scrollWheelValue = 0; + } + + if (mMode == MODE_RELATIVE) + { + result = WaitForSingleObjectEx( mRelativeRead.get(), 0, FALSE ); + + if (result == WAIT_FAILED) + throw std::exception("WaitForSingleObjectEx"); + + if (result == WAIT_OBJECT_0) + { + state.x = 0; + state.y = 0; + } + else + { + SetEvent(mRelativeRead.get()); + } + } + + state.positionMode = mMode; + } + + void ResetScrollWheelValue() + { + SetEvent(mScrollWheelValue.get()); + } + + void SetMode(Mode mode) + { + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::UI::Core; + using namespace ABI::Windows::Foundation; + + if (mMode == mode) + return; + + ComPtr statics; + HRESULT hr = GetActivationFactory( HStringReference(RuntimeClass_Windows_UI_Core_CoreWindow).Get(), statics.GetAddressOf() ); + ThrowIfFailed( hr ); + + ComPtr window; + hr = statics->GetForCurrentThread( window.GetAddressOf() ); + ThrowIfFailed( hr ); + + if (mode == MODE_RELATIVE) + { + hr = window->get_PointerCursor( mCursor.ReleaseAndGetAddressOf() ); + ThrowIfFailed(hr); + + hr = window->put_PointerCursor(nullptr); + ThrowIfFailed(hr); + + SetEvent(mRelativeRead.get()); + + mMode = MODE_RELATIVE; + } + else + { + if (!mCursor) + { + ComPtr factory; + hr = GetActivationFactory( HStringReference(RuntimeClass_Windows_UI_Core_CoreCursor).Get(), factory.GetAddressOf() ); + ThrowIfFailed( hr ); + + hr = factory->CreateCursor( CoreCursorType_Arrow, 0, mCursor.GetAddressOf() ); + ThrowIfFailed( hr ); + } + + hr = window->put_PointerCursor( mCursor.Get() ); + ThrowIfFailed(hr); + + mCursor.Reset(); + + mMode = MODE_ABSOLUTE; + } + } + + bool IsConnected() const + { + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::Devices::Input; + using namespace ABI::Windows::Foundation; + + ComPtr caps; + HRESULT hr = RoActivateInstance(HStringReference(RuntimeClass_Windows_Devices_Input_MouseCapabilities).Get(), &caps); + ThrowIfFailed(hr); + + INT32 value; + if (SUCCEEDED(caps->get_MousePresent(&value))) + { + return value != 0; + } + + return false; + } + + void SetWindow(ABI::Windows::UI::Core::ICoreWindow* window) + { + using namespace Microsoft::WRL; + using namespace Microsoft::WRL::Wrappers; + using namespace ABI::Windows::Foundation; + using namespace ABI::Windows::Devices::Input; + + if (mWindow.Get() == window) + return; + + RemoveHandlers(); + + mWindow = window; + + if (!window) + { + mCursor.Reset(); + mMouse.Reset(); + return; + } + + ComPtr mouseStatics; + HRESULT hr = GetActivationFactory( HStringReference(RuntimeClass_Windows_Devices_Input_MouseDevice).Get(), mouseStatics.GetAddressOf() ); + ThrowIfFailed( hr ); + + hr = mouseStatics->GetForCurrentView(mMouse.ReleaseAndGetAddressOf()); + ThrowIfFailed(hr); + + typedef __FITypedEventHandler_2_Windows__CDevices__CInput__CMouseDevice_Windows__CDevices__CInput__CMouseEventArgs MouseMovedHandler; + hr = mMouse->add_MouseMoved( Callback(MouseMovedEvent).Get(), &mPointerMouseMovedToken ); + ThrowIfFailed(hr); + + typedef __FITypedEventHandler_2_Windows__CUI__CCore__CCoreWindow_Windows__CUI__CCore__CPointerEventArgs PointerHandler; + auto cb = Callback(PointerEvent); + + hr = window->add_PointerPressed(cb.Get(), &mPointerPressedToken); + ThrowIfFailed(hr); + + hr = window->add_PointerReleased(cb.Get(), &mPointerReleasedToken); + ThrowIfFailed(hr); + + hr = window->add_PointerMoved(cb.Get(), &mPointerMovedToken); + ThrowIfFailed(hr); + + hr = window->add_PointerWheelChanged(Callback(PointerWheel).Get(), &mPointerWheelToken); + ThrowIfFailed(hr); + } + + State mState; + Mouse* mOwner; + float mDPI; + + static Mouse::Impl* s_mouse; + +private: + Mode mMode; + + ComPtr mWindow; + ComPtr mMouse; + ComPtr mCursor; + + ScopedHandle mScrollWheelValue; + ScopedHandle mRelativeRead; + + EventRegistrationToken mPointerPressedToken; + EventRegistrationToken mPointerReleasedToken; + EventRegistrationToken mPointerMovedToken; + EventRegistrationToken mPointerWheelToken; + EventRegistrationToken mPointerMouseMovedToken; + + void RemoveHandlers() + { + if (mWindow) + { + (void)mWindow->remove_PointerPressed(mPointerPressedToken); + mPointerPressedToken.value = 0; + + (void)mWindow->remove_PointerReleased(mPointerReleasedToken); + mPointerReleasedToken.value = 0; + + (void)mWindow->remove_PointerMoved(mPointerMovedToken); + mPointerMovedToken.value = 0; + + (void)mWindow->remove_PointerWheelChanged(mPointerWheelToken); + mPointerWheelToken.value = 0; + } + + if (mMouse) + { + (void)mMouse->remove_MouseMoved(mPointerMouseMovedToken); + mPointerMouseMovedToken.value = 0; + } + } + + static HRESULT PointerEvent( IInspectable *, ABI::Windows::UI::Core::IPointerEventArgs*args ) + { + using namespace ABI::Windows::Foundation; + using namespace ABI::Windows::UI::Input; + using namespace ABI::Windows::Devices::Input; + + if (!s_mouse) + return S_OK; + + ComPtr currentPoint; + HRESULT hr = args->get_CurrentPoint( currentPoint.GetAddressOf() ); + ThrowIfFailed(hr); + + ComPtr pointerDevice; + hr = currentPoint->get_PointerDevice( pointerDevice.GetAddressOf() ); + ThrowIfFailed(hr); + + PointerDeviceType devType; + hr = pointerDevice->get_PointerDeviceType( &devType ); + ThrowIfFailed(hr); + + if (devType == PointerDeviceType::PointerDeviceType_Mouse) + { + ComPtr props; + hr = currentPoint->get_Properties( props.GetAddressOf() ); + ThrowIfFailed(hr); + + boolean value; + hr = props->get_IsLeftButtonPressed(&value); + ThrowIfFailed(hr); + s_mouse->mState.leftButton = value != 0; + + hr = props->get_IsRightButtonPressed(&value); + ThrowIfFailed(hr); + s_mouse->mState.rightButton = value != 0; + + hr = props->get_IsMiddleButtonPressed(&value); + ThrowIfFailed(hr); + s_mouse->mState.middleButton = value != 0; + + hr = props->get_IsXButton1Pressed(&value); + ThrowIfFailed(hr); + s_mouse->mState.xButton1 = value != 0; + + hr = props->get_IsXButton2Pressed(&value); + ThrowIfFailed(hr); + s_mouse->mState.xButton2 = value != 0; + } + + if (s_mouse->mMode == MODE_ABSOLUTE) + { + Point pos; + hr = currentPoint->get_Position( &pos ); + ThrowIfFailed(hr); + + float dpi = s_mouse->mDPI; + + s_mouse->mState.x = static_cast( pos.X * dpi / 96.f + 0.5f ); + s_mouse->mState.y = static_cast( pos.Y * dpi / 96.f + 0.5f ); + } + + return S_OK; + } + + static HRESULT PointerWheel( IInspectable *, ABI::Windows::UI::Core::IPointerEventArgs*args ) + { + using namespace ABI::Windows::Foundation; + using namespace ABI::Windows::UI::Input; + using namespace ABI::Windows::Devices::Input; + + if (!s_mouse) + return S_OK; + + ComPtr currentPoint; + HRESULT hr = args->get_CurrentPoint( currentPoint.GetAddressOf() ); + ThrowIfFailed(hr); + + ComPtr pointerDevice; + hr = currentPoint->get_PointerDevice( pointerDevice.GetAddressOf() ); + ThrowIfFailed(hr); + + PointerDeviceType devType; + hr = pointerDevice->get_PointerDeviceType( &devType ); + ThrowIfFailed(hr); + + if (devType == PointerDeviceType::PointerDeviceType_Mouse) + { + ComPtr props; + hr = currentPoint->get_Properties( props.GetAddressOf() ); + ThrowIfFailed(hr); + + INT32 value; + hr = props->get_MouseWheelDelta(&value); + ThrowIfFailed(hr); + + HANDLE evt = s_mouse->mScrollWheelValue.get(); + if (WaitForSingleObjectEx(evt, 0, FALSE) == WAIT_OBJECT_0) + { + s_mouse->mState.scrollWheelValue = 0; + ResetEvent(evt); + } + + s_mouse->mState.scrollWheelValue += value; + + if (s_mouse->mMode == MODE_ABSOLUTE) + { + Point pos; + hr = currentPoint->get_Position( &pos ); + ThrowIfFailed(hr); + + float dpi = s_mouse->mDPI; + + s_mouse->mState.x = static_cast( pos.X * dpi / 96.f + 0.5f ); + s_mouse->mState.y = static_cast( pos.Y * dpi / 96.f + 0.5f ); + } + } + + return S_OK; + } + + static HRESULT MouseMovedEvent( IInspectable *, ABI::Windows::Devices::Input::IMouseEventArgs* args ) + { + using namespace ABI::Windows::Devices::Input; + + if (!s_mouse) + return S_OK; + + if (s_mouse->mMode == MODE_RELATIVE) + { + MouseDelta delta; + HRESULT hr = args->get_MouseDelta(&delta); + ThrowIfFailed(hr); + + s_mouse->mState.x = delta.X; + s_mouse->mState.y = delta.Y; + + ResetEvent( s_mouse->mRelativeRead.get() ); + } + + return S_OK; + } +}; + + +Mouse::Impl* Mouse::Impl::s_mouse = nullptr; + + +void Mouse::SetWindow(ABI::Windows::UI::Core::ICoreWindow* window) +{ + pImpl->SetWindow(window); +} + + +void Mouse::SetDpi(float dpi) +{ + auto pImpl = Impl::s_mouse; + + if (!pImpl) + return; + + pImpl->mDPI = dpi; +} + + +#elif defined(_XBOX_ONE) || ( defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) ) + +//====================================================================================== +// Null device for Windows Phone and Xbox One +//====================================================================================== + +class Mouse::Impl +{ +public: + Impl(Mouse* owner) : + mOwner(owner) + { + if ( s_mouse ) + { + throw std::exception( "Mouse is a singleton" ); + } + + s_mouse = this; + } + + ~Impl() + { + s_mouse = nullptr; + } + + void GetState(State& state) const + { + memset( &state, 0, sizeof(State) ); + } + + void ResetScrollWheelValue() + { + } + + void SetMode(Mode mode) + { + UNREFERENCED_PARAMETER(mode); + } + + bool IsConnected() const + { + return false; + } + + Mouse* mOwner; + + static Mouse::Impl* s_mouse; +}; + +Mouse::Impl* Mouse::Impl::s_mouse = nullptr; + +#else + +//====================================================================================== +// Win32 desktop implementation +//====================================================================================== + +// +// For a Win32 desktop application, in your window setup be sure to call this method: +// +// m_mouse->SetWindow(hwnd); +// +// And call this static function from your Window Message Procedure +// +// LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +// { +// switch (message) +// { +// case WM_ACTIVATEAPP: +// case WM_INPUT: +// case WM_MOUSEMOVE: +// case WM_LBUTTONDOWN: +// case WM_LBUTTONUP: +// case WM_RBUTTONDOWN: +// case WM_RBUTTONUP: +// case WM_MBUTTONDOWN: +// case WM_MBUTTONUP: +// case WM_MOUSEWHEEL: +// case WM_XBUTTONDOWN: +// case WM_XBUTTONUP: +// case WM_MOUSEHOVER: +// Mouse::ProcessMessage(message, wParam, lParam); +// break; +// +// } +// } +// + +class Mouse::Impl +{ +public: + Impl(Mouse* owner) : + mOwner(owner), + mWindow(nullptr), + mMode(MODE_ABSOLUTE), + mLastX(0), + mLastY(0), + mRelativeX(INT32_MAX), + mRelativeY(INT32_MAX), + mInFocus(true) + { + if ( s_mouse ) + { + throw std::exception( "Mouse is a singleton" ); + } + + s_mouse = this; + + memset( &mState, 0, sizeof(State) ); + + mScrollWheelValue.reset( CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_MODIFY_STATE | SYNCHRONIZE) ); + mRelativeRead.reset( CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_MODIFY_STATE | SYNCHRONIZE) ); + mAbsoluteMode.reset( CreateEventEx(nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE) ); + mRelativeMode.reset( CreateEventEx(nullptr, nullptr, 0, EVENT_MODIFY_STATE | SYNCHRONIZE) ); + if ( !mScrollWheelValue + || !mRelativeRead + || !mAbsoluteMode + || !mRelativeMode ) + { + throw std::exception( "CreateEventEx" ); + } + } + + ~Impl() + { + s_mouse = nullptr; + } + + void GetState(State& state) const + { + memcpy( &state, &mState, sizeof(State) ); + state.positionMode = mMode; + + DWORD result = WaitForSingleObjectEx( mScrollWheelValue.get(), 0, FALSE ); + if ( result == WAIT_FAILED ) + throw std::exception( "WaitForSingleObjectEx" ); + + if ( result == WAIT_OBJECT_0 ) + { + state.scrollWheelValue = 0; + } + + if (state.positionMode == MODE_RELATIVE) + { + result = WaitForSingleObjectEx( mRelativeRead.get(), 0, FALSE ); + + if (result == WAIT_FAILED) + throw std::exception("WaitForSingleObjectEx"); + + if (result == WAIT_OBJECT_0) + { + state.x = 0; + state.y = 0; + } + else + { + SetEvent(mRelativeRead.get()); + } + } + } + + void ResetScrollWheelValue() + { + SetEvent(mScrollWheelValue.get()); + } + + void SetMode(Mode mode) + { + if (mMode == mode) + return; + + SetEvent((mode == MODE_ABSOLUTE) ? mAbsoluteMode.get() : mRelativeMode.get()); + + assert(mWindow != 0); + + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_HOVER; + tme.hwndTrack = mWindow; + tme.dwHoverTime = 1; + if (!TrackMouseEvent(&tme)) + { + throw std::exception("TrackMouseEvent"); + } + } + + bool IsConnected() const + { + return GetSystemMetrics(SM_MOUSEPRESENT) != 0; + } + + void SetWindow(HWND window) + { + if (mWindow == window) + return; + + assert(window != 0); + + RAWINPUTDEVICE Rid; + Rid.usUsagePage = 0x1 /* HID_USAGE_PAGE_GENERIC */; + Rid.usUsage = 0x2 /* HID_USAGE_GENERIC_MOUSE */; + Rid.dwFlags = RIDEV_INPUTSINK; + Rid.hwndTarget = window; + if ( !RegisterRawInputDevices(&Rid, 1, sizeof(RAWINPUTDEVICE)) ) + { + throw std::exception("RegisterRawInputDevices"); + } + + mWindow = window; + } + + State mState; + + Mouse* mOwner; + + static Mouse::Impl* s_mouse; + +private: + HWND mWindow; + Mode mMode; + + ScopedHandle mScrollWheelValue; + ScopedHandle mRelativeRead; + ScopedHandle mAbsoluteMode; + ScopedHandle mRelativeMode; + + int mLastX; + int mLastY; + int mRelativeX; + int mRelativeY; + + bool mInFocus; + + friend void Mouse::ProcessMessage(UINT message, WPARAM wParam, LPARAM lParam); + + void ClipToWindow() + { + assert(mWindow != 0); + + RECT rect; + GetClientRect(mWindow, &rect); + + POINT ul; + ul.x = rect.left; + ul.y = rect.top; + + POINT lr; + lr.x = rect.right; + lr.y = rect.bottom; + + MapWindowPoints(mWindow, nullptr, &ul, 1); + MapWindowPoints(mWindow, nullptr, &lr, 1); + + rect.left = ul.x; + rect.top = ul.y; + + rect.right = lr.x; + rect.bottom = lr.y; + + ClipCursor(&rect); + } +}; + + +Mouse::Impl* Mouse::Impl::s_mouse = nullptr; + + +void Mouse::SetWindow( HWND window ) +{ + pImpl->SetWindow(window); +} + + +void Mouse::ProcessMessage(UINT message, WPARAM wParam, LPARAM lParam) +{ + auto pImpl = Impl::s_mouse; + + if (!pImpl) + return; + + HANDLE evts[3]; + evts[0] = pImpl->mScrollWheelValue.get(); + evts[1] = pImpl->mAbsoluteMode.get(); + evts[2] = pImpl->mRelativeMode.get(); + switch (WaitForMultipleObjectsEx(_countof(evts), evts, FALSE, 0, FALSE)) + { + case WAIT_OBJECT_0: + pImpl->mState.scrollWheelValue = 0; + ResetEvent(evts[0]); + break; + + case (WAIT_OBJECT_0 + 1) : + { + pImpl->mMode = MODE_ABSOLUTE; + ClipCursor(nullptr); + + POINT point; + point.x = pImpl->mLastX; + point.y = pImpl->mLastY; + if (MapWindowPoints(pImpl->mWindow, nullptr, &point, 1)) + { + SetCursorPos(point.x, point.y); + } + ShowCursor(TRUE); + pImpl->mState.x = pImpl->mLastX; + pImpl->mState.y = pImpl->mLastY; + } + break; + + case (WAIT_OBJECT_0 + 2) : + { + ResetEvent( pImpl->mRelativeRead.get() ); + + pImpl->mMode = MODE_RELATIVE; + pImpl->mState.x = pImpl->mState.y = 0; + pImpl->mRelativeX = INT32_MAX; + pImpl->mRelativeY = INT32_MAX; + + ShowCursor(FALSE); + + pImpl->ClipToWindow(); + } + break; + + case WAIT_FAILED: + throw std::exception("WaitForMultipleObjectsEx"); + } + + switch (message) + { + case WM_ACTIVATEAPP: + if (wParam) + { + pImpl->mInFocus = true; + + if (pImpl->mMode == MODE_RELATIVE) + { + pImpl->mState.x = pImpl->mState.y = 0; + + ShowCursor(FALSE); + + pImpl->ClipToWindow(); + } + } + else + { + int scrollWheel = pImpl->mState.scrollWheelValue; + memset(&pImpl->mState, 0, sizeof(State)); + pImpl->mState.scrollWheelValue = scrollWheel; + + pImpl->mInFocus = false; + } + return; + + case WM_INPUT: + if (pImpl->mInFocus && pImpl->mMode == MODE_RELATIVE) + { + RAWINPUT raw; + UINT rawSize = sizeof(raw); + + UINT resultData = GetRawInputData(reinterpret_cast(lParam), RID_INPUT, &raw, &rawSize, sizeof(RAWINPUTHEADER)); + if (resultData == UINT(-1)) + { + throw std::exception("GetRawInputData"); + } + + if (raw.header.dwType == RIM_TYPEMOUSE) + { + if (!(raw.data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE)) + { + pImpl->mState.x = raw.data.mouse.lLastX; + pImpl->mState.y = raw.data.mouse.lLastY; + + ResetEvent(pImpl->mRelativeRead.get()); + } + else if (raw.data.mouse.usFlags & MOUSE_VIRTUAL_DESKTOP) + { + // This is used to make Remote Desktop sessons work + const int width = GetSystemMetrics(SM_CXVIRTUALSCREEN); + const int height = GetSystemMetrics(SM_CYVIRTUALSCREEN); + + int x = static_cast((float(raw.data.mouse.lLastX) / 65535.0f) * width); + int y = static_cast((float(raw.data.mouse.lLastY) / 65535.0f) * height); + + if (pImpl->mRelativeX == INT32_MAX) + { + pImpl->mState.x = pImpl->mState.y = 0; + } + else + { + pImpl->mState.x = x - pImpl->mRelativeX; + pImpl->mState.y = y - pImpl->mRelativeY; + } + + pImpl->mRelativeX = x; + pImpl->mRelativeY = y; + + ResetEvent(pImpl->mRelativeRead.get()); + } + } + } + return; + + case WM_MOUSEMOVE: + break; + + case WM_LBUTTONDOWN: + pImpl->mState.leftButton = true; + break; + + case WM_LBUTTONUP: + pImpl->mState.leftButton = false; + break; + + case WM_RBUTTONDOWN: + pImpl->mState.rightButton = true; + break; + + case WM_RBUTTONUP: + pImpl->mState.rightButton = false; + break; + + case WM_MBUTTONDOWN: + pImpl->mState.middleButton = true; + break; + + case WM_MBUTTONUP: + pImpl->mState.middleButton = false; + break; + + case WM_MOUSEWHEEL: + pImpl->mState.scrollWheelValue += GET_WHEEL_DELTA_WPARAM(wParam); + return; + + case WM_XBUTTONDOWN: + switch (GET_XBUTTON_WPARAM(wParam)) + { + case XBUTTON1: + pImpl->mState.xButton1 = true; + break; + + case XBUTTON2: + pImpl->mState.xButton2 = true; + break; + } + break; + + case WM_XBUTTONUP: + switch (GET_XBUTTON_WPARAM(wParam)) + { + case XBUTTON1: + pImpl->mState.xButton1 = false; + break; + + case XBUTTON2: + pImpl->mState.xButton2 = false; + break; + } + break; + + case WM_MOUSEHOVER: + break; + + default: + // Not a mouse message, so exit + return; + } + + if (pImpl->mMode == MODE_ABSOLUTE) + { + // All mouse messages provide a new pointer position + int xPos = static_cast(LOWORD(lParam)); // GET_X_LPARAM(lParam); + int yPos = static_cast(HIWORD(lParam)); // GET_Y_LPARAM(lParam); + + pImpl->mState.x = pImpl->mLastX = xPos; + pImpl->mState.y = pImpl->mLastY = yPos; + } +} + +#endif + +#pragma warning( disable : 4355 ) + +// Public constructor. +Mouse::Mouse() + : pImpl( new Impl(this) ) +{ +} + + +// Move constructor. +Mouse::Mouse(Mouse&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ + pImpl->mOwner = this; +} + + +// Move assignment. +Mouse& Mouse::operator= (Mouse&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + pImpl->mOwner = this; + return *this; +} + + +// Public destructor. +Mouse::~Mouse() +{ +} + + +Mouse::State Mouse::GetState() const +{ + State state; + pImpl->GetState(state); + return state; +} + + +void Mouse::ResetScrollWheelValue() +{ + pImpl->ResetScrollWheelValue(); +} + + +void Mouse::SetMode(Mode mode) +{ + pImpl->SetMode(mode); +} + + +bool Mouse::IsConnected() const +{ + return pImpl->IsConnected(); +} + + +Mouse& Mouse::Get() +{ + if ( !Impl::s_mouse || !Impl::s_mouse->mOwner ) + throw std::exception( "Mouse is a singleton" ); + + return *Impl::s_mouse->mOwner; +} + + + +//====================================================================================== +// ButtonStateTracker +//====================================================================================== + +#define UPDATE_BUTTON_STATE(field) field = static_cast( ( !!state.field ) | ( ( !!state.field ^ !!lastState.field ) << 1 ) ); + +void Mouse::ButtonStateTracker::Update( const Mouse::State& state ) +{ + UPDATE_BUTTON_STATE(leftButton); + + assert( ( !state.leftButton && !lastState.leftButton ) == ( leftButton == UP ) ); + assert( ( state.leftButton && lastState.leftButton ) == ( leftButton == HELD ) ); + assert( ( !state.leftButton && lastState.leftButton ) == ( leftButton == RELEASED ) ); + assert( ( state.leftButton && !lastState.leftButton ) == ( leftButton == PRESSED ) ); + + UPDATE_BUTTON_STATE(middleButton); + UPDATE_BUTTON_STATE(rightButton); + UPDATE_BUTTON_STATE(xButton1); + UPDATE_BUTTON_STATE(xButton2); + + lastState = state; +} + +#undef UPDATE_BUTTON_STATE + + +void Mouse::ButtonStateTracker::Reset() +{ + memset( this, 0, sizeof(ButtonStateTracker) ); +} diff --git a/DirectXTK/Src/NormalMapEffect.cpp b/DirectXTK/Src/NormalMapEffect.cpp new file mode 100644 index 0000000..0758b1c --- /dev/null +++ b/DirectXTK/Src/NormalMapEffect.cpp @@ -0,0 +1,506 @@ +//-------------------------------------------------------------------------------------- +// File: NormalMapEffect.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "EffectCommon.h" + +using namespace DirectX; + + +// Constant buffer layout. Must match the shader! +struct NormalMapEffectConstants +{ + XMVECTOR diffuseColor; + XMVECTOR emissiveColor; + XMVECTOR specularColorAndPower; + + XMVECTOR lightDirection[IEffectLights::MaxDirectionalLights]; + XMVECTOR lightDiffuseColor[IEffectLights::MaxDirectionalLights]; + XMVECTOR lightSpecularColor[IEffectLights::MaxDirectionalLights]; + + XMVECTOR eyePosition; + + XMVECTOR fogColor; + XMVECTOR fogVector; + + XMMATRIX world; + XMVECTOR worldInverseTranspose[3]; + XMMATRIX worldViewProj; +}; + +static_assert( ( sizeof(NormalMapEffectConstants) % 16 ) == 0, "CB size not padded correctly" ); + + +// Traits type describes our characteristics to the EffectBase template. +struct NormalMapEffectTraits +{ + typedef NormalMapEffectConstants ConstantBufferType; + + static const int VertexShaderCount = 4; + static const int PixelShaderCount = 4; + static const int ShaderPermutationCount = 16; +}; + + +// Internal NormalMapEffect implementation class. +class NormalMapEffect::Impl : public EffectBase +{ +public: + Impl(_In_ ID3D11Device* device); + + Microsoft::WRL::ComPtr specularTexture; + Microsoft::WRL::ComPtr normalTexture; + + bool vertexColorEnabled; + bool biasedVertexNormals; + + EffectLights lights; + + int GetCurrentShaderPermutation() const; + + void Apply(_In_ ID3D11DeviceContext* deviceContext); +}; + + +// Include the precompiled shader code. +namespace +{ +#if defined(_XBOX_ONE) && defined(_TITLE) + #include "Shaders/Compiled/XboxOneNormalMapEffect_VSNormalPixelLightingTx.inc" + #include "Shaders/Compiled/XboxOneNormalMapEffect_VSNormalPixelLightingTxVc.inc" + + #include "Shaders/Compiled/XboxOneNormalMapEffect_VSNormalPixelLightingTxBn.inc" + #include "Shaders/Compiled/XboxOneNormalMapEffect_VSNormalPixelLightingTxVcBn.inc" + + #include "Shaders/Compiled/XboxOneNormalMapEffect_PSNormalPixelLightingTx.inc" + #include "Shaders/Compiled/XboxOneNormalMapEffect_PSNormalPixelLightingTxNoFog.inc" + #include "Shaders/Compiled/XboxOneNormalMapEffect_PSNormalPixelLightingTxNoSpec.inc" + #include "Shaders/Compiled/XboxOneNormalMapEffect_PSNormalPixelLightingTxNoFogSpec.inc" +#else + #include "Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTx.inc" + #include "Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxVc.inc" + + #include "Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxBn.inc" + #include "Shaders/Compiled/NormalMapEffect_VSNormalPixelLightingTxVcBn.inc" + + #include "Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTx.inc" + #include "Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoFog.inc" + #include "Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoSpec.inc" + #include "Shaders/Compiled/NormalMapEffect_PSNormalPixelLightingTxNoFogSpec.inc" +#endif +} + + +template<> +const ShaderBytecode EffectBase::VertexShaderBytecode[] = +{ + { NormalMapEffect_VSNormalPixelLightingTx, sizeof(NormalMapEffect_VSNormalPixelLightingTx) }, + { NormalMapEffect_VSNormalPixelLightingTxVc, sizeof(NormalMapEffect_VSNormalPixelLightingTxVc) }, + + { NormalMapEffect_VSNormalPixelLightingTxBn, sizeof(NormalMapEffect_VSNormalPixelLightingTxBn) }, + { NormalMapEffect_VSNormalPixelLightingTxVcBn, sizeof(NormalMapEffect_VSNormalPixelLightingTxVcBn) }, +}; + + +template<> +const int EffectBase::VertexShaderIndices[] = +{ + 0, // pixel lighting + texture + 0, // pixel lighting + texture, no fog + 1, // pixel lighting + texture + vertex color + 1, // pixel lighting + texture + vertex color, no fog + + 0, // pixel lighting + texture, no specular + 0, // pixel lighting + texture, no fog or specular + 1, // pixel lighting + texture + vertex color, no specular + 1, // pixel lighting + texture + vertex color, no fog or specular + + 2, // pixel lighting (biased vertex normal/tangent) + texture + 2, // pixel lighting (biased vertex normal/tangent) + texture, no fog + 3, // pixel lighting (biased vertex normal/tangent) + texture + vertex color + 3, // pixel lighting (biased vertex normal/tangent) + texture + vertex color, no fog + + 2, // pixel lighting (biased vertex normal/tangent) + texture, no specular + 2, // pixel lighting (biased vertex normal/tangent) + texture, no fog or specular + 3, // pixel lighting (biased vertex normal/tangent) + texture + vertex color, no specular + 3, // pixel lighting (biased vertex normal/tangent) + texture + vertex color, no fog or specular +}; + + +template<> +const ShaderBytecode EffectBase::PixelShaderBytecode[] = +{ + { NormalMapEffect_PSNormalPixelLightingTx, sizeof(NormalMapEffect_PSNormalPixelLightingTx) }, + { NormalMapEffect_PSNormalPixelLightingTxNoFog, sizeof(NormalMapEffect_PSNormalPixelLightingTxNoFog) }, + { NormalMapEffect_PSNormalPixelLightingTxNoSpec, sizeof(NormalMapEffect_PSNormalPixelLightingTxNoSpec) }, + { NormalMapEffect_PSNormalPixelLightingTxNoFogSpec, sizeof(NormalMapEffect_PSNormalPixelLightingTxNoFogSpec) }, +}; + + +template<> +const int EffectBase::PixelShaderIndices[] = +{ + 0, // pixel lighting + texture + 1, // pixel lighting + texture, no fog + 0, // pixel lighting + texture + vertex color + 1, // pixel lighting + texture + vertex color, no fog + + 2, // pixel lighting + texture, no specular + 3, // pixel lighting + texture, no fog or specular + 2, // pixel lighting + texture + vertex color, no specular + 3, // pixel lighting + texture + vertex color, no fog or specular + + 0, // pixel lighting (biased vertex normal/tangent) + texture + 1, // pixel lighting (biased vertex normal/tangent) + texture, no fog + 0, // pixel lighting (biased vertex normal/tangent) + texture + vertex color + 1, // pixel lighting (biased vertex normal/tangent) + texture + vertex color, no fog + + 2, // pixel lighting (biased vertex normal/tangent) + texture, no specular + 3, // pixel lighting (biased vertex normal/tangent) + texture, no fog or specular + 2, // pixel lighting (biased vertex normal/tangent) + texture + vertex color, no specular + 3, // pixel lighting (biased vertex normal/tangent) + texture + vertex color, no fog or specular +}; + + +// Global pool of per-device NormalMapEffect resources. +template<> +SharedResourcePool::DeviceResources> EffectBase::deviceResourcesPool; + + +// Constructor. +NormalMapEffect::Impl::Impl(_In_ ID3D11Device* device) + : EffectBase(device), + vertexColorEnabled(false), + biasedVertexNormals(false) +{ + static_assert( _countof(EffectBase::VertexShaderIndices) == NormalMapEffectTraits::ShaderPermutationCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::VertexShaderBytecode) == NormalMapEffectTraits::VertexShaderCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::PixelShaderBytecode) == NormalMapEffectTraits::PixelShaderCount, "array/max mismatch" ); + static_assert( _countof(EffectBase::PixelShaderIndices) == NormalMapEffectTraits::ShaderPermutationCount, "array/max mismatch" ); + + lights.InitializeConstants(constants.specularColorAndPower, constants.lightDirection, constants.lightDiffuseColor, constants.lightSpecularColor); +} + + +int NormalMapEffect::Impl::GetCurrentShaderPermutation() const +{ + int permutation = 0; + + // Use optimized shaders if fog is disabled. + if (!fog.enabled) + { + permutation += 1; + } + + // Support vertex coloring? + if (vertexColorEnabled) + { + permutation += 2; + } + + // Specular map? + if (!specularTexture) + { + permutation += 4; + } + + if (biasedVertexNormals) + { + // Compressed normals & tangents need to be scaled and biased in the vertex shader. + permutation += 8; + } + + return permutation; +} + + +// Sets our state onto the D3D device. +void NormalMapEffect::Impl::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + // Compute derived parameter values. + matrices.SetConstants(dirtyFlags, constants.worldViewProj); + + fog.SetConstants(dirtyFlags, matrices.worldView, constants.fogVector); + + lights.SetConstants(dirtyFlags, matrices, constants.world, constants.worldInverseTranspose, constants.eyePosition, constants.diffuseColor, constants.emissiveColor, true); + + // Set the textures + ID3D11ShaderResourceView* textures[] = { texture.Get(), specularTexture.Get(), normalTexture.Get()}; + deviceContext->PSSetShaderResources(0, _countof(textures), textures); + + // Set shaders and constant buffers. + ApplyShaders(deviceContext, GetCurrentShaderPermutation()); +} + + +// Public constructor. +NormalMapEffect::NormalMapEffect(_In_ ID3D11Device* device) + : pImpl(new Impl(device)) +{ +} + + +// Move constructor. +NormalMapEffect::NormalMapEffect(NormalMapEffect&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +NormalMapEffect& NormalMapEffect::operator= (NormalMapEffect&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +NormalMapEffect::~NormalMapEffect() +{ +} + + +// IEffect methods. +void NormalMapEffect::Apply(_In_ ID3D11DeviceContext* deviceContext) +{ + pImpl->Apply(deviceContext); +} + + +void NormalMapEffect::GetVertexShaderBytecode(_Out_ void const** pShaderByteCode, _Out_ size_t* pByteCodeLength) +{ + pImpl->GetVertexShaderBytecode(pImpl->GetCurrentShaderPermutation(), pShaderByteCode, pByteCodeLength); +} + + +// Camera settings. +void XM_CALLCONV NormalMapEffect::SetWorld(FXMMATRIX value) +{ + pImpl->matrices.world = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV NormalMapEffect::SetView(FXMMATRIX value) +{ + pImpl->matrices.view = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV NormalMapEffect::SetProjection(FXMMATRIX value) +{ + pImpl->matrices.projection = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj; +} + + +void XM_CALLCONV NormalMapEffect::SetMatrices(FXMMATRIX world, CXMMATRIX view, CXMMATRIX projection) +{ + pImpl->matrices.world = world; + pImpl->matrices.view = view; + pImpl->matrices.projection = projection; + + pImpl->dirtyFlags |= EffectDirtyFlags::WorldViewProj | EffectDirtyFlags::WorldInverseTranspose | EffectDirtyFlags::EyePosition | EffectDirtyFlags::FogVector; +} + + +// Material settings. +void XM_CALLCONV NormalMapEffect::SetDiffuseColor(FXMVECTOR value) +{ + pImpl->lights.diffuseColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV NormalMapEffect::SetEmissiveColor(FXMVECTOR value) +{ + pImpl->lights.emissiveColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV NormalMapEffect::SetSpecularColor(FXMVECTOR value) +{ + // Set xyz to new value, but preserve existing w (specular power). + pImpl->constants.specularColorAndPower = XMVectorSelect(pImpl->constants.specularColorAndPower, value, g_XMSelect1110); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void NormalMapEffect::SetSpecularPower(float value) +{ + // Set w to new value, but preserve existing xyz (specular color). + pImpl->constants.specularColorAndPower = XMVectorSetW(pImpl->constants.specularColorAndPower, value); + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void NormalMapEffect::DisableSpecular() +{ + // Set specular color to black, power to 1 + // Note: Don't use a power of 0 or the shader will generate strange highlights on non-specular materials + + pImpl->constants.specularColorAndPower = g_XMIdentityR3; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void NormalMapEffect::SetAlpha(float value) +{ + pImpl->lights.alpha = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void XM_CALLCONV NormalMapEffect::SetColorAndAlpha(FXMVECTOR value) +{ + pImpl->lights.diffuseColor = value; + pImpl->lights.alpha = XMVectorGetW(value); + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +// Light settings. +void NormalMapEffect::SetLightingEnabled(bool value) +{ + if (!value) + { + throw std::exception("NormalMapEffect does not support turning off lighting"); + } +} + + +void NormalMapEffect::SetPerPixelLighting(bool) +{ + // Unsupported interface method. +} + + +void XM_CALLCONV NormalMapEffect::SetAmbientLightColor(FXMVECTOR value) +{ + pImpl->lights.ambientLightColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::MaterialColor; +} + + +void NormalMapEffect::SetLightEnabled(int whichLight, bool value) +{ + pImpl->dirtyFlags |= pImpl->lights.SetLightEnabled(whichLight, value, pImpl->constants.lightDiffuseColor, pImpl->constants.lightSpecularColor); +} + + +void XM_CALLCONV NormalMapEffect::SetLightDirection(int whichLight, FXMVECTOR value) +{ + EffectLights::ValidateLightIndex(whichLight); + + pImpl->constants.lightDirection[whichLight] = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +void XM_CALLCONV NormalMapEffect::SetLightDiffuseColor(int whichLight, FXMVECTOR value) +{ + pImpl->dirtyFlags |= pImpl->lights.SetLightDiffuseColor(whichLight, value, pImpl->constants.lightDiffuseColor); +} + + +void XM_CALLCONV NormalMapEffect::SetLightSpecularColor(int whichLight, FXMVECTOR value) +{ + pImpl->dirtyFlags |= pImpl->lights.SetLightSpecularColor(whichLight, value, pImpl->constants.lightSpecularColor); +} + + +void NormalMapEffect::EnableDefaultLighting() +{ + EffectLights::EnableDefaultLighting(this); +} + + +// Fog settings. +void NormalMapEffect::SetFogEnabled(bool value) +{ + pImpl->fog.enabled = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogEnable; +} + + +void NormalMapEffect::SetFogStart(float value) +{ + pImpl->fog.start = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void NormalMapEffect::SetFogEnd(float value) +{ + pImpl->fog.end = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::FogVector; +} + + +void XM_CALLCONV NormalMapEffect::SetFogColor(FXMVECTOR value) +{ + pImpl->constants.fogColor = value; + + pImpl->dirtyFlags |= EffectDirtyFlags::ConstantBuffer; +} + + +// Vertex color setting. +void NormalMapEffect::SetVertexColorEnabled(bool value) +{ + pImpl->vertexColorEnabled = value; +} + + +// Texture settings. +void NormalMapEffect::SetTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->texture = value; +} + + +void NormalMapEffect::SetNormalTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->normalTexture = value; +} + + +void NormalMapEffect::SetSpecularTexture(_In_opt_ ID3D11ShaderResourceView* value) +{ + pImpl->specularTexture = value; +} + + +// Normal compression settings. +void NormalMapEffect::SetBiasedVertexNormalsAndTangents(bool value) +{ + pImpl->biasedVertexNormals = value; +} \ No newline at end of file diff --git a/DirectXTK/Src/PlatformHelpers.h b/DirectXTK/Src/PlatformHelpers.h new file mode 100644 index 0000000..95f704c --- /dev/null +++ b/DirectXTK/Src/PlatformHelpers.h @@ -0,0 +1,152 @@ +//-------------------------------------------------------------------------------------- +// File: PlatformHelpers.h +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + +#pragma warning(disable : 4324) + +#include +#include + + +namespace DirectX +{ + // Helper class for COM exceptions + class com_exception : public std::exception + { + public: + com_exception(HRESULT hr) : result(hr) {} + + virtual const char* what() const override + { + static char s_str[64] = {}; + sprintf_s(s_str, "Failure with HRESULT of %08X", static_cast(result)); + return s_str; + } + + private: + HRESULT result; + }; + + // Helper utility converts D3D API failures into exceptions. + inline void ThrowIfFailed(HRESULT hr) + { + if (FAILED(hr)) + { + throw com_exception(hr); + } + } + + + // Helper for output debug tracing + inline void DebugTrace( _In_z_ _Printf_format_string_ const char* format, ... ) + { +#ifdef _DEBUG + va_list args; + va_start( args, format ); + + char buff[1024] = {}; + vsprintf_s( buff, format, args ); + OutputDebugStringA( buff ); + va_end( args ); +#else + UNREFERENCED_PARAMETER( format ); +#endif + } + + + // Helper smart-pointers +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) || (defined(_XBOX_ONE) && defined(_TITLE)) || !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) + struct virtual_deleter { void operator()(void* p) { if (p) VirtualFree(p, 0, MEM_RELEASE); } }; +#endif + + struct aligned_deleter { void operator()(void* p) { _aligned_free(p); } }; + + struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } }; + + typedef std::unique_ptr ScopedHandle; + + inline HANDLE safe_handle( HANDLE h ) { return (h == INVALID_HANDLE_VALUE) ? 0 : h; } +} + + +#ifdef DIRECTX_EMULATE_MUTEX + +// Emulate the C++0x mutex and lock_guard types when building with Visual Studio CRT versions < 2012. +namespace std +{ + class mutex + { + public: + mutex() { InitializeCriticalSection(&mCriticalSection); } + ~mutex() { DeleteCriticalSection(&mCriticalSection); } + + void lock() { EnterCriticalSection(&mCriticalSection); } + void unlock() { LeaveCriticalSection(&mCriticalSection); } + bool try_lock() { return TryEnterCriticalSection(&mCriticalSection) != 0; } + + private: + CRITICAL_SECTION mCriticalSection; + + mutex(mutex const&); + mutex& operator= (mutex const&); + }; + + + template + class lock_guard + { + public: + typedef Mutex mutex_type; + + explicit lock_guard(mutex_type& mutex) + : mMutex(mutex) + { + mMutex.lock(); + } + + ~lock_guard() + { + mMutex.unlock(); + } + + private: + mutex_type& mMutex; + + lock_guard(lock_guard const&); + lock_guard& operator= (lock_guard const&); + }; +} + +#else + +#include + +#endif + + +#ifdef DIRECTX_EMULATE_MAKE_UNIQUE + +// Emulate make_unique when building with Visual Studio CRT versions < 2012. +namespace std +{ + + template + std::unique_ptr make_unique(Args&&... args) + { + return std::unique_ptr(new T(std::forward(args)...)); + } + +} + +#endif \ No newline at end of file diff --git a/DirectXTK/Src/PrimitiveBatch.cpp b/DirectXTK/Src/PrimitiveBatch.cpp new file mode 100644 index 0000000..1329f99 --- /dev/null +++ b/DirectXTK/Src/PrimitiveBatch.cpp @@ -0,0 +1,436 @@ +//-------------------------------------------------------------------------------------- +// File: PrimitiveBatch.cpp +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#include "pch.h" +#include "PrimitiveBatch.h" +#include "DirectXHelpers.h" +#include "GraphicsMemory.h" +#include "PlatformHelpers.h" + +using namespace DirectX; +using namespace DirectX::Internal; +using Microsoft::WRL::ComPtr; + + +// Internal PrimitiveBatch implementation class. +class PrimitiveBatchBase::Impl +{ +public: + Impl(_In_ ID3D11DeviceContext* deviceContext, size_t maxIndices, size_t maxVertices, size_t vertexSize); + + void Begin(); + void End(); + + void Draw(D3D11_PRIMITIVE_TOPOLOGY topology, bool isIndexed, _In_opt_count_(indexCount) uint16_t const* indices, size_t indexCount, size_t vertexCount, _Out_ void** pMappedVertices); + +private: + void FlushBatch(); + +#if defined(_XBOX_ONE) && defined(_TITLE) + ComPtr mDeviceContext; +#else + ComPtr mDeviceContext; +#endif + ComPtr mIndexBuffer; + ComPtr mVertexBuffer; + + size_t mMaxIndices; + size_t mMaxVertices; + size_t mVertexSize; + + D3D11_PRIMITIVE_TOPOLOGY mCurrentTopology; + bool mInBeginEndPair; + bool mCurrentlyIndexed; + + size_t mCurrentIndex; + size_t mCurrentVertex; + + size_t mBaseIndex; + size_t mBaseVertex; + +#if defined(_XBOX_ONE) && defined(_TITLE) + void *grfxMemoryIB; + void *grfxMemoryVB; +#else + D3D11_MAPPED_SUBRESOURCE mMappedIndices; + D3D11_MAPPED_SUBRESOURCE mMappedVertices; +#endif +}; + + +// Helper for creating a D3D vertex or index buffer. +#if defined(_XBOX_ONE) && defined(_TITLE) +static void CreateBuffer(_In_ ID3D11DeviceX* device, size_t bufferSize, D3D11_BIND_FLAG bindFlag, _Out_ ID3D11Buffer** pBuffer) +{ + D3D11_BUFFER_DESC desc = {}; + + desc.ByteWidth = (UINT)bufferSize; + desc.BindFlags = bindFlag; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + ThrowIfFailed( + device->CreatePlacementBuffer(&desc, nullptr, pBuffer) + ); + + SetDebugObjectName(*pBuffer, "DirectXTK:PrimitiveBatch"); +} +#else +static void CreateBuffer(_In_ ID3D11Device* device, size_t bufferSize, D3D11_BIND_FLAG bindFlag, _Out_ ID3D11Buffer** pBuffer) +{ + D3D11_BUFFER_DESC desc = {}; + + desc.ByteWidth = (UINT)bufferSize; + desc.BindFlags = bindFlag; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + ThrowIfFailed( + device->CreateBuffer(&desc, nullptr, pBuffer) + ); + + _Analysis_assume_(*pBuffer != 0); + + SetDebugObjectName(*pBuffer, "DirectXTK:PrimitiveBatch"); +} +#endif + + +// Constructor. +PrimitiveBatchBase::Impl::Impl(_In_ ID3D11DeviceContext* deviceContext, size_t maxIndices, size_t maxVertices, size_t vertexSize) + : mMaxIndices(maxIndices), + mMaxVertices(maxVertices), + mVertexSize(vertexSize), + mCurrentTopology(D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED), + mInBeginEndPair(false), + mCurrentlyIndexed(false), + mCurrentIndex(0), + mCurrentVertex(0), + mBaseIndex(0), + mBaseVertex(0) +{ + ComPtr device; + deviceContext->GetDevice(&device); + +#if defined(_XBOX_ONE) && defined(_TITLE) + ThrowIfFailed(deviceContext->QueryInterface(IID_GRAPHICS_PPV_ARGS(mDeviceContext.GetAddressOf()))); + + ComPtr deviceX; + ThrowIfFailed(device.As(&deviceX)); + + // If you only intend to draw non-indexed geometry, specify maxIndices = 0 to skip creating the index buffer. + if (maxIndices > 0) + { + CreateBuffer(deviceX.Get(), maxIndices * sizeof(uint16_t), D3D11_BIND_INDEX_BUFFER, &mIndexBuffer); + } + + // Create the vertex buffer. + CreateBuffer(deviceX.Get(), maxVertices * vertexSize, D3D11_BIND_VERTEX_BUFFER, &mVertexBuffer); + + grfxMemoryIB = grfxMemoryVB = nullptr; +#else + mDeviceContext = deviceContext; + + // If you only intend to draw non-indexed geometry, specify maxIndices = 0 to skip creating the index buffer. + if (maxIndices > 0) + { + CreateBuffer(device.Get(), maxIndices * sizeof(uint16_t), D3D11_BIND_INDEX_BUFFER, &mIndexBuffer); + } + + // Create the vertex buffer. + CreateBuffer(device.Get(), maxVertices * vertexSize, D3D11_BIND_VERTEX_BUFFER, &mVertexBuffer); +#endif +} + + +// Begins a batch of primitive drawing operations. +void PrimitiveBatchBase::Impl::Begin() +{ + if (mInBeginEndPair) + throw std::exception("Cannot nest Begin calls"); + +#if defined(_XBOX_ONE) && defined(_TITLE) + mDeviceContext->IASetIndexBuffer(nullptr, DXGI_FORMAT_UNKNOWN, 0); +#else + // Bind the index buffer. + if (mMaxIndices > 0) + { + mDeviceContext->IASetIndexBuffer(mIndexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0); + } + + // Bind the vertex buffer. + auto vertexBuffer = mVertexBuffer.Get(); + UINT vertexStride = (UINT)mVertexSize; + UINT vertexOffset = 0; + + mDeviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &vertexStride, &vertexOffset); +#endif + + // If this is a deferred D3D context, reset position so the first Map calls will use D3D11_MAP_WRITE_DISCARD. + if (mDeviceContext->GetType() == D3D11_DEVICE_CONTEXT_DEFERRED) + { + mCurrentIndex = 0; + mCurrentVertex = 0; + } + + mInBeginEndPair = true; +} + + +// Ends a batch of primitive drawing operations. +void PrimitiveBatchBase::Impl::End() +{ + if (!mInBeginEndPair) + throw std::exception("Begin must be called before End"); + + FlushBatch(); + + mInBeginEndPair = false; +} + + +// Can we combine adjacent primitives using this topology into a single draw call? +static bool CanBatchPrimitives(D3D11_PRIMITIVE_TOPOLOGY topology) +{ + switch (topology) + { + case D3D11_PRIMITIVE_TOPOLOGY_POINTLIST: + case D3D11_PRIMITIVE_TOPOLOGY_LINELIST: + case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST: + // Lists can easily be merged. + return true; + + default: + // Strips cannot. + return false; + } + + // We could also merge indexed strips by inserting degenerates, + // but that's not always a perf win, so let's keep things simple. +} + + +#if !defined(_XBOX_ONE) || !defined(_TITLE) +// Helper for locking a vertex or index buffer. +static void LockBuffer(_In_ ID3D11DeviceContext* deviceContext, _In_ ID3D11Buffer* buffer, size_t currentPosition, _Out_ size_t* basePosition, _Out_ D3D11_MAPPED_SUBRESOURCE* mappedResource) +{ + D3D11_MAP mapType = (currentPosition == 0) ? D3D11_MAP_WRITE_DISCARD : D3D11_MAP_WRITE_NO_OVERWRITE; + + ThrowIfFailed( + deviceContext->Map(buffer, 0, mapType, 0, mappedResource) + ); + + *basePosition = currentPosition; +} +#endif + + +// Adds new geometry to the batch. +_Use_decl_annotations_ +void PrimitiveBatchBase::Impl::Draw(D3D11_PRIMITIVE_TOPOLOGY topology, bool isIndexed, uint16_t const* indices, size_t indexCount, size_t vertexCount, void** pMappedVertices) +{ + if (isIndexed && !indices) + throw std::exception("Indices cannot be null"); + + if (indexCount >= mMaxIndices) + throw std::exception("Too many indices"); + + if (vertexCount >= mMaxVertices) + throw std::exception("Too many vertices"); + + if (!mInBeginEndPair) + throw std::exception("Begin must be called before Draw"); + + // Can we merge this primitive in with an existing batch, or must we flush first? + bool wrapIndexBuffer = (mCurrentIndex + indexCount > mMaxIndices); + bool wrapVertexBuffer = (mCurrentVertex + vertexCount > mMaxVertices); + + if ((topology != mCurrentTopology) || + (isIndexed != mCurrentlyIndexed) || + !CanBatchPrimitives(topology) || + wrapIndexBuffer || wrapVertexBuffer) + { + FlushBatch(); + } + +#if defined(_XBOX_ONE) && defined(_TITLE) + if (mCurrentTopology == D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED) + { + auto& grfxMem = GraphicsMemory::Get(); + + if (isIndexed) + { + grfxMemoryIB = grfxMem.Allocate(mDeviceContext.Get(), mMaxIndices * sizeof(uint16_t), 64); + } + + grfxMemoryVB = grfxMem.Allocate(mDeviceContext.Get(), mMaxVertices * mVertexSize, 64); + + mCurrentTopology = topology; + mCurrentlyIndexed = isIndexed; + mCurrentIndex = mCurrentVertex = 0; + } + + // Copy over the index data. + if (isIndexed) + { + assert(grfxMemoryIB != 0); + auto outputIndices = reinterpret_cast(grfxMemoryIB) + mCurrentIndex; + + for (size_t i = 0; i < indexCount; i++) + { + outputIndices[i] = (uint16_t)(indices[i] + mCurrentVertex); + } + + mCurrentIndex += indexCount; + } + + // Return the output vertex data location. + assert(grfxMemoryVB != 0); + *pMappedVertices = reinterpret_cast(grfxMemoryVB) + (mCurrentVertex * mVertexSize); + + mCurrentVertex += vertexCount; +#else + if (wrapIndexBuffer) + mCurrentIndex = 0; + + if (wrapVertexBuffer) + mCurrentVertex = 0; + + // If we are not already in a batch, lock the buffers. + if (mCurrentTopology == D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED) + { + if (isIndexed) + { + LockBuffer(mDeviceContext.Get(), mIndexBuffer.Get(), mCurrentIndex, &mBaseIndex, &mMappedIndices); + } + + LockBuffer(mDeviceContext.Get(), mVertexBuffer.Get(), mCurrentVertex, &mBaseVertex, &mMappedVertices); + + mCurrentTopology = topology; + mCurrentlyIndexed = isIndexed; + } + + // Copy over the index data. + if (isIndexed) + { + auto outputIndices = reinterpret_cast(mMappedIndices.pData) + mCurrentIndex; + + for (size_t i = 0; i < indexCount; i++) + { + outputIndices[i] = (uint16_t)(indices[i] + mCurrentVertex - mBaseVertex); + } + + mCurrentIndex += indexCount; + } + + // Return the output vertex data location. + *pMappedVertices = reinterpret_cast(mMappedVertices.pData) + (mCurrentVertex * mVertexSize); + + mCurrentVertex += vertexCount; +#endif +} + + +// Sends queued primitives to the graphics device. +void PrimitiveBatchBase::Impl::FlushBatch() +{ + // Early out if there is nothing to flush. + if (mCurrentTopology == D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED) + return; + + mDeviceContext->IASetPrimitiveTopology(mCurrentTopology); + +#if defined(_XBOX_ONE) && defined(_TITLE) + if (mCurrentlyIndexed) + { + // Draw indexed geometry. + mDeviceContext->IASetPlacementIndexBuffer(mIndexBuffer.Get(), grfxMemoryIB, DXGI_FORMAT_R16_UINT); + mDeviceContext->IASetPlacementVertexBuffer(0, mVertexBuffer.Get(), grfxMemoryVB, (UINT)mVertexSize); + + mDeviceContext->DrawIndexed((UINT)mCurrentIndex, 0, 0); + } + else + { + // Draw non-indexed geometry. + mDeviceContext->IASetPlacementVertexBuffer(0, mVertexBuffer.Get(), grfxMemoryVB, (UINT)mVertexSize); + + mDeviceContext->Draw((UINT)mCurrentVertex, 0); + } + + grfxMemoryIB = grfxMemoryVB = nullptr; +#else + mDeviceContext->Unmap(mVertexBuffer.Get(), 0); + + if (mCurrentlyIndexed) + { + // Draw indexed geometry. + mDeviceContext->Unmap(mIndexBuffer.Get(), 0); + + mDeviceContext->DrawIndexed((UINT)(mCurrentIndex - mBaseIndex), (UINT)mBaseIndex, (UINT)mBaseVertex); + } + else + { + // Draw non-indexed geometry. + mDeviceContext->Draw((UINT)(mCurrentVertex - mBaseVertex), (UINT)mBaseVertex); + } +#endif + + mCurrentTopology = D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED; +} + + +// Public constructor. +PrimitiveBatchBase::PrimitiveBatchBase(_In_ ID3D11DeviceContext* deviceContext, size_t maxIndices, size_t maxVertices, size_t vertexSize) + : pImpl(new Impl(deviceContext, maxIndices, maxVertices, vertexSize)) +{ +} + + +// Move constructor. +PrimitiveBatchBase::PrimitiveBatchBase(PrimitiveBatchBase&& moveFrom) + : pImpl(std::move(moveFrom.pImpl)) +{ +} + + +// Move assignment. +PrimitiveBatchBase& PrimitiveBatchBase::operator= (PrimitiveBatchBase&& moveFrom) +{ + pImpl = std::move(moveFrom.pImpl); + return *this; +} + + +// Public destructor. +PrimitiveBatchBase::~PrimitiveBatchBase() +{ +} + + +void PrimitiveBatchBase::Begin() +{ + pImpl->Begin(); +} + + +void PrimitiveBatchBase::End() +{ + pImpl->End(); +} + + +_Use_decl_annotations_ +void PrimitiveBatchBase::Draw(D3D11_PRIMITIVE_TOPOLOGY topology, bool isIndexed, uint16_t const* indices, size_t indexCount, size_t vertexCount, void** pMappedVertices) +{ + pImpl->Draw(topology, isIndexed, indices, indexCount, vertexCount, pMappedVertices); +} diff --git a/DirectXTK/Src/SDKMesh.h b/DirectXTK/Src/SDKMesh.h new file mode 100644 index 0000000..980e9d4 --- /dev/null +++ b/DirectXTK/Src/SDKMesh.h @@ -0,0 +1,345 @@ +//-------------------------------------------------------------------------------------- +// File: SDKMesh.h +// +// SDKMESH format is generated by the legacy DirectX SDK's Content Exporter and +// originally rendered by the DXUT helper class SDKMesh +// +// http://go.microsoft.com/fwlink/?LinkId=226208 +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +#pragma once + + +namespace DXUT +{ + // .SDKMESH files + + // SDKMESH_HEADER + // SDKMESH_VERTEX_BUFFER_HEADER header->VertexStreamHeadersOffset + // SDKMESH_INDEX_BUFFER_HEADER header->IndexStreamHeadersOffset + // SDKMESH_MESH header->MeshDataOffset + // SDKMESH_SUBSET header->SubsetDataOffset + // SDKMESH_FRAME header->FrameDataOffset + // SDKMESH_MATERIAL header->MaterialDataOffset + // [header->NonBufferDataSize] + // { [ header->NumVertexBuffers] + // VB data + // } + // { [ header->NumIndexBuffers] + // IB data + // } + + + // .SDDKANIM files + + // SDKANIMATION_FILE_HEADER + // uint8_t[] - Length of fileheader->AnimationDataSize + + // .SDKMESH uses Direct3D 9 decls, but only a subset of these is ever generated by the legacy DirectX SDK Content Exporter + + // D3DDECLUSAGE_POSITION / D3DDECLTYPE_FLOAT3 + // (D3DDECLUSAGE_BLENDWEIGHT / D3DDECLTYPE_UBYTE4N + // D3DDECLUSAGE_BLENDINDICES / D3DDECLTYPE_UBYTE4)? + // (D3DDECLUSAGE_NORMAL / D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT16_4, D3DDECLTYPE_SHORT4N, D3DDECLTYPE_UBYTE4N, or D3DDECLTYPE_DEC3N [not supported])? + // (D3DDECLUSAGE_COLOR / D3DDECLTYPE_D3DCOLOR)? + // (D3DDECLUSAGE_TEXCOORD / D3DDECLTYPE_FLOAT1, D3DDECLTYPE_FLOAT2 or D3DDECLTYPE_FLOAT16_2, D3DDECLTYPE_FLOAT3 or D3DDECLTYPE_FLOAT16_4, D3DDECLTYPE_FLOAT4 or D3DDECLTYPE_FLOAT16_4)* + // (D3DDECLUSAGE_TANGENT / same as D3DDECLUSAGE_NORMAL)? + // (D3DDECLUSAGE_BINORMAL / same as D3DDECLUSAGE_NORMAL)? + + enum D3DDECLUSAGE + { + D3DDECLUSAGE_POSITION = 0, + D3DDECLUSAGE_BLENDWEIGHT =1, + D3DDECLUSAGE_BLENDINDICES =2, + D3DDECLUSAGE_NORMAL =3, + D3DDECLUSAGE_TEXCOORD = 5, + D3DDECLUSAGE_TANGENT = 6, + D3DDECLUSAGE_BINORMAL = 7, + D3DDECLUSAGE_COLOR = 10, + }; + + enum D3DDECLTYPE + { + D3DDECLTYPE_FLOAT1 = 0, // 1D float expanded to (value, 0., 0., 1.) + D3DDECLTYPE_FLOAT2 = 1, // 2D float expanded to (value, value, 0., 1.) + D3DDECLTYPE_FLOAT3 = 2, // 3D float expanded to (value, value, value, 1.) + D3DDECLTYPE_FLOAT4 = 3, // 4D float + D3DDECLTYPE_D3DCOLOR = 4, // 4D packed unsigned bytes mapped to 0. to 1. range + // Input is in D3DCOLOR format (ARGB) expanded to (R, G, B, A) + D3DDECLTYPE_UBYTE4 = 5, // 4D unsigned uint8_t + D3DDECLTYPE_UBYTE4N = 8, // Each of 4 bytes is normalized by dividing to 255.0 + D3DDECLTYPE_SHORT4N = 10, // 4D signed short normalized (v[0]/32767.0,v[1]/32767.0,v[2]/32767.0,v[3]/32767.0) + // Note: There is no equivalent to D3DDECLTYPE_DEC3N (14) as a DXGI_FORMAT + D3DDECLTYPE_FLOAT16_2 = 15, // Two 16-bit floating point values, expanded to (value, value, 0, 1) + D3DDECLTYPE_FLOAT16_4 = 16, // Four 16-bit floating point values + + D3DDECLTYPE_UNUSED = 17, // When the type field in a decl is unused. + + // These are extensions for DXGI-based versions of Direct3D + D3DDECLTYPE_DXGI_R10G10B10A2_UNORM = 32 + DXGI_FORMAT_R10G10B10A2_UNORM, + D3DDECLTYPE_DXGI_R11G11B10_FLOAT = 32 + DXGI_FORMAT_R11G11B10_FLOAT, + D3DDECLTYPE_DXGI_R8G8B8A8_SNORM = 32 + DXGI_FORMAT_R8G8B8A8_SNORM, + }; + + #pragma pack(push,4) + + struct D3DVERTEXELEMENT9 + { + uint16_t Stream; // Stream index + uint16_t Offset; // Offset in the stream in bytes + uint8_t Type; // Data type + uint8_t Method; // Processing method + uint8_t Usage; // Semantics + uint8_t UsageIndex; // Semantic index + }; + + #pragma pack(pop) + + //-------------------------------------------------------------------------------------- + // Hard Defines for the various structures + //-------------------------------------------------------------------------------------- + const uint32_t SDKMESH_FILE_VERSION = 101; + const uint32_t MAX_VERTEX_ELEMENTS = 32; + const uint32_t MAX_VERTEX_STREAMS = 16; + const uint32_t MAX_FRAME_NAME = 100; + const uint32_t MAX_MESH_NAME = 100; + const uint32_t MAX_SUBSET_NAME = 100; + const uint32_t MAX_MATERIAL_NAME = 100; + const uint32_t MAX_TEXTURE_NAME = MAX_PATH; + const uint32_t MAX_MATERIAL_PATH = MAX_PATH; + const uint32_t INVALID_FRAME = uint32_t(-1); + const uint32_t INVALID_MESH = uint32_t(-1); + const uint32_t INVALID_MATERIAL = uint32_t(-1); + const uint32_t INVALID_SUBSET = uint32_t(-1); + const uint32_t INVALID_ANIMATION_DATA = uint32_t(-1); + const uint32_t INVALID_SAMPLER_SLOT = uint32_t(-1); + const uint32_t ERROR_RESOURCE_VALUE = 1; + + //-------------------------------------------------------------------------------------- + // Enumerated Types. + //-------------------------------------------------------------------------------------- + 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. + //-------------------------------------------------------------------------------------- + #pragma pack(push,8) + + struct SDKMESH_HEADER + { + //Basic Info and sizes + uint32_t Version; + uint8_t IsBigEndian; + uint64_t HeaderSize; + uint64_t NonBufferDataSize; + uint64_t BufferDataSize; + + //Stats + uint32_t NumVertexBuffers; + uint32_t NumIndexBuffers; + uint32_t NumMeshes; + uint32_t NumTotalSubsets; + uint32_t NumFrames; + uint32_t NumMaterials; + + //Offsets to Data + uint64_t VertexStreamHeadersOffset; + uint64_t IndexStreamHeadersOffset; + uint64_t MeshDataOffset; + uint64_t SubsetDataOffset; + uint64_t FrameDataOffset; + uint64_t MaterialDataOffset; + }; + + struct SDKMESH_VERTEX_BUFFER_HEADER + { + uint64_t NumVertices; + uint64_t SizeBytes; + uint64_t StrideBytes; + D3DVERTEXELEMENT9 Decl[MAX_VERTEX_ELEMENTS]; + union + { + uint64_t DataOffset; + }; + }; + + struct SDKMESH_INDEX_BUFFER_HEADER + { + uint64_t NumIndices; + uint64_t SizeBytes; + uint32_t IndexType; + union + { + uint64_t DataOffset; + }; + }; + + struct SDKMESH_MESH + { + char Name[MAX_MESH_NAME]; + uint8_t NumVertexBuffers; + uint32_t VertexBuffers[MAX_VERTEX_STREAMS]; + uint32_t IndexBuffer; + uint32_t NumSubsets; + uint32_t NumFrameInfluences; //aka bones + + DirectX::XMFLOAT3 BoundingBoxCenter; + DirectX::XMFLOAT3 BoundingBoxExtents; + + union + { + uint64_t SubsetOffset; + INT* pSubsets; + }; + union + { + uint64_t FrameInfluenceOffset; + uint32_t* pFrameInfluences; + }; + }; + + struct SDKMESH_SUBSET + { + char Name[MAX_SUBSET_NAME]; + uint32_t MaterialID; + uint32_t PrimitiveType; + uint64_t IndexStart; + uint64_t IndexCount; + uint64_t VertexStart; + uint64_t VertexCount; + }; + + struct SDKMESH_FRAME + { + char Name[MAX_FRAME_NAME]; + uint32_t Mesh; + uint32_t ParentFrame; + uint32_t ChildFrame; + uint32_t SiblingFrame; + DirectX::XMFLOAT4X4 Matrix; + uint32_t 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]; + + DirectX::XMFLOAT4 Diffuse; + DirectX::XMFLOAT4 Ambient; + DirectX::XMFLOAT4 Specular; + DirectX::XMFLOAT4 Emissive; + float Power; + + union + { + uint64_t Force64_1; //Force the union to 64bits + }; + union + { + uint64_t Force64_2; //Force the union to 64bits + }; + union + { + uint64_t Force64_3; //Force the union to 64bits + }; + + union + { + uint64_t Force64_4; //Force the union to 64bits + }; + union + { + uint64_t Force64_5; //Force the union to 64bits + }; + union + { + uint64_t Force64_6; //Force the union to 64bits + }; + }; + + struct SDKANIMATION_FILE_HEADER + { + uint32_t Version; + uint8_t IsBigEndian; + uint32_t FrameTransformType; + uint32_t NumFrames; + uint32_t NumAnimationKeys; + uint32_t AnimationFPS; + uint64_t AnimationDataSize; + uint64_t AnimationDataOffset; + }; + + struct SDKANIMATION_DATA + { + DirectX::XMFLOAT3 Translation; + DirectX::XMFLOAT4 Orientation; + DirectX::XMFLOAT3 Scaling; + }; + + struct SDKANIMATION_FRAME_DATA + { + char FrameName[MAX_FRAME_NAME]; + union + { + uint64_t DataOffset; + SDKANIMATION_DATA* pAnimationData; + }; + }; + + #pragma pack(pop) + +} // namespace + +static_assert( sizeof(DXUT::D3DVERTEXELEMENT9) == 8, "Direct3D9 Decl structure size incorrect" ); +static_assert( sizeof(DXUT::SDKMESH_HEADER)== 104, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKMESH_VERTEX_BUFFER_HEADER) == 288, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKMESH_INDEX_BUFFER_HEADER) == 32, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKMESH_MESH) == 224, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKMESH_SUBSET) == 144, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKMESH_FRAME) == 184, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKMESH_MATERIAL) == 1256, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKANIMATION_FILE_HEADER) == 40, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKANIMATION_DATA) == 40, "SDK Mesh structure size incorrect" ); +static_assert( sizeof(DXUT::SDKANIMATION_FRAME_DATA) == 112, "SDK Mesh structure size incorrect" ); diff --git a/DirectXTK/Src/ScreenGrab.cpp b/DirectXTK/Src/ScreenGrab.cpp new file mode 100644 index 0000000..69785f9 --- /dev/null +++ b/DirectXTK/Src/ScreenGrab.cpp @@ -0,0 +1,658 @@ +//-------------------------------------------------------------------------------------- +// File: ScreenGrab.cpp +// +// Function for capturing a 2D texture and saving it to a file (aka a 'screenshot' +// when used on a Direct3D Render Target). +// +// Note these functions are useful as a light-weight runtime screen grabber. For +// full-featured texture capture, DDS writer, and texture processing pipeline, +// see the 'Texconv' sample and the 'DirectXTex' library. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248926 +// http://go.microsoft.com/fwlink/?LinkId=248929 +//-------------------------------------------------------------------------------------- + +// Does not capture 1D textures or 3D textures (volume maps) + +// Does not capture mipmap chains, only the top-most texture level is saved + +// For 2D array textures and cubemaps, it captures only the first image in the array + +#include "pch.h" + +#include "ScreenGrab.h" +#include "DirectXHelpers.h" + +#include "dds.h" +#include "PlatformHelpers.h" +#include "LoaderHelpers.h" + +using Microsoft::WRL::ComPtr; +using namespace DirectX; +using namespace DirectX::LoaderHelpers; + +namespace +{ + //-------------------------------------------------------------------------------------- + HRESULT CaptureTexture(_In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + D3D11_TEXTURE2D_DESC& desc, + ComPtr& pStaging) + { + if (!pContext || !pSource) + return E_INVALIDARG; + + D3D11_RESOURCE_DIMENSION resType = D3D11_RESOURCE_DIMENSION_UNKNOWN; + pSource->GetType(&resType); + + if (resType != D3D11_RESOURCE_DIMENSION_TEXTURE2D) + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + + ComPtr pTexture; + HRESULT hr = pSource->QueryInterface(IID_GRAPHICS_PPV_ARGS(pTexture.GetAddressOf())); + if (FAILED(hr)) + return hr; + + assert(pTexture); + + pTexture->GetDesc(&desc); + + ComPtr d3dDevice; + pContext->GetDevice(d3dDevice.GetAddressOf()); + + if (desc.SampleDesc.Count > 1) + { + // MSAA content must be resolved before being copied to a staging texture + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + + ComPtr pTemp; + hr = d3dDevice->CreateTexture2D(&desc, 0, pTemp.GetAddressOf()); + if (FAILED(hr)) + return hr; + + assert(pTemp); + + DXGI_FORMAT fmt = EnsureNotTypeless(desc.Format); + + UINT support = 0; + hr = d3dDevice->CheckFormatSupport(fmt, &support); + if (FAILED(hr)) + return hr; + + if (!(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE)) + return E_FAIL; + + for (UINT item = 0; item < desc.ArraySize; ++item) + { + for (UINT level = 0; level < desc.MipLevels; ++level) + { + UINT index = D3D11CalcSubresource(level, item, desc.MipLevels); + pContext->ResolveSubresource(pTemp.Get(), index, pSource, index, fmt); + } + } + + desc.BindFlags = 0; + desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.Usage = D3D11_USAGE_STAGING; + + hr = d3dDevice->CreateTexture2D(&desc, 0, pStaging.ReleaseAndGetAddressOf()); + if (FAILED(hr)) + return hr; + + assert(pStaging); + + pContext->CopyResource(pStaging.Get(), pTemp.Get()); + } + else if ((desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) + { + // Handle case where the source is already a staging texture we can use directly + pStaging = pTexture; + } + else + { + // Otherwise, create a staging texture from the non-MSAA source + desc.BindFlags = 0; + desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.Usage = D3D11_USAGE_STAGING; + + hr = d3dDevice->CreateTexture2D(&desc, 0, pStaging.ReleaseAndGetAddressOf()); + if (FAILED(hr)) + return hr; + + assert(pStaging); + + pContext->CopyResource(pStaging.Get(), pSource); + } + +#if defined(_XBOX_ONE) && defined(_TITLE) + + if (d3dDevice->GetCreationFlags() & D3D11_CREATE_DEVICE_IMMEDIATE_CONTEXT_FAST_SEMANTICS) + { + ComPtr d3dDeviceX; + hr = d3dDevice.As(&d3dDeviceX); + if (FAILED(hr)) + return hr; + + ComPtr d3dContextX; + hr = pContext->QueryInterface(IID_GRAPHICS_PPV_ARGS(d3dContextX.GetAddressOf())); + if (FAILED(hr)) + return hr; + + UINT64 copyFence = d3dContextX->InsertFence(0); + + while (d3dDeviceX->IsFencePending(copyFence)) + { + SwitchToThread(); + } + } + +#endif + + return S_OK; + } +} // anonymous namespace + + +//-------------------------------------------------------------------------------------- +_Use_decl_annotations_ +HRESULT DirectX::SaveDDSTextureToFile( ID3D11DeviceContext* pContext, + ID3D11Resource* pSource, + const wchar_t* fileName ) +{ + if ( !fileName ) + return E_INVALIDARG; + + D3D11_TEXTURE2D_DESC desc = {}; + ComPtr pStaging; + HRESULT hr = CaptureTexture( pContext, pSource, desc, pStaging ); + if ( FAILED(hr) ) + return hr; + + // Create file +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + ScopedHandle hFile( safe_handle( CreateFile2( fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr ) ) ); +#else + ScopedHandle hFile( safe_handle( CreateFileW( fileName, GENERIC_WRITE | DELETE, 0, nullptr, CREATE_ALWAYS, 0, nullptr ) ) ); +#endif + if ( !hFile ) + return HRESULT_FROM_WIN32( GetLastError() ); + + auto_delete_file delonfail(hFile.get()); + + // Setup header + const size_t MAX_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10); + uint8_t fileHeader[ MAX_HEADER_SIZE ]; + + *reinterpret_cast(&fileHeader[0]) = DDS_MAGIC; + + auto header = reinterpret_cast( &fileHeader[0] + sizeof(uint32_t) ); + size_t headerSize = sizeof(uint32_t) + sizeof(DDS_HEADER); + memset( header, 0, sizeof(DDS_HEADER) ); + header->size = sizeof( DDS_HEADER ); + header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP; + header->height = desc.Height; + header->width = desc.Width; + header->mipMapCount = 1; + header->caps = DDS_SURFACE_FLAGS_TEXTURE; + + // Try to use a legacy .DDS pixel format for better tools support, otherwise fallback to 'DX10' header extension + DDS_HEADER_DXT10* extHeader = nullptr; + switch( desc.Format ) + { + case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R16G16_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8G8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R16_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC1_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC2_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC3_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC4_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC4_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC5_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_BC5_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_B5G6R5_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8G8_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_R16G16_SNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT) ); break; + case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.1 + case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.1 + case DXGI_FORMAT_YUY2: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.2 + case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT) ); break; // DXGI 1.2 + + // Legacy D3DX formats using D3DFMT enum value as FourCC + case DXGI_FORMAT_R32G32B32A32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; // D3DFMT_A32B32G32R32F + case DXGI_FORMAT_R16G16B16A16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 113; break; // D3DFMT_A16B16G16R16F + case DXGI_FORMAT_R16G16B16A16_UNORM: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 36; break; // D3DFMT_A16B16G16R16 + case DXGI_FORMAT_R16G16B16A16_SNORM: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 110; break; // D3DFMT_Q16W16V16U16 + case DXGI_FORMAT_R32G32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 115; break; // D3DFMT_G32R32F + case DXGI_FORMAT_R16G16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 112; break; // D3DFMT_G16R16F + case DXGI_FORMAT_R32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 114; break; // D3DFMT_R32F + case DXGI_FORMAT_R16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 111; break; // D3DFMT_R16F + + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + case DXGI_FORMAT_A8P8: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + + default: + memcpy_s( &header->ddspf, sizeof(header->ddspf), &DDSPF_DX10, sizeof(DDS_PIXELFORMAT) ); + + headerSize += sizeof(DDS_HEADER_DXT10); + extHeader = reinterpret_cast( reinterpret_cast(&fileHeader[0]) + sizeof(uint32_t) + sizeof(DDS_HEADER) ); + memset( extHeader, 0, sizeof(DDS_HEADER_DXT10) ); + extHeader->dxgiFormat = desc.Format; + extHeader->resourceDimension = D3D11_RESOURCE_DIMENSION_TEXTURE2D; + extHeader->arraySize = 1; + break; + } + + size_t rowPitch, slicePitch, rowCount; + GetSurfaceInfo( desc.Width, desc.Height, desc.Format, &slicePitch, &rowPitch, &rowCount ); + + if ( IsCompressed( desc.Format ) ) + { + header->flags |= DDS_HEADER_FLAGS_LINEARSIZE; + header->pitchOrLinearSize = static_cast( slicePitch ); + } + else + { + header->flags |= DDS_HEADER_FLAGS_PITCH; + header->pitchOrLinearSize = static_cast( rowPitch ); + } + + // Setup pixels + std::unique_ptr pixels( new (std::nothrow) uint8_t[ slicePitch ] ); + if (!pixels) + return E_OUTOFMEMORY; + + D3D11_MAPPED_SUBRESOURCE mapped; + hr = pContext->Map( pStaging.Get(), 0, D3D11_MAP_READ, 0, &mapped ); + if ( FAILED(hr) ) + return hr; + + auto sptr = reinterpret_cast( mapped.pData ); + if ( !sptr ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return E_POINTER; + } + + uint8_t* dptr = pixels.get(); + + size_t msize = std::min( rowPitch, mapped.RowPitch ); + for( size_t h = 0; h < rowCount; ++h ) + { + memcpy_s( dptr, rowPitch, sptr, msize ); + sptr += mapped.RowPitch; + dptr += rowPitch; + } + + pContext->Unmap( pStaging.Get(), 0 ); + + // Write header & pixels + DWORD bytesWritten; + if ( !WriteFile( hFile.get(), fileHeader, static_cast( headerSize ), &bytesWritten, nullptr ) ) + return HRESULT_FROM_WIN32( GetLastError() ); + + if ( bytesWritten != headerSize ) + return E_FAIL; + + if ( !WriteFile( hFile.get(), pixels.get(), static_cast( slicePitch ), &bytesWritten, nullptr ) ) + return HRESULT_FROM_WIN32( GetLastError() ); + + if ( bytesWritten != slicePitch ) + return E_FAIL; + + delonfail.clear(); + + return S_OK; +} + +//-------------------------------------------------------------------------------------- +namespace DirectX +{ +extern bool _IsWIC2(); +extern IWICImagingFactory* _GetWIC(); +} + +_Use_decl_annotations_ +HRESULT DirectX::SaveWICTextureToFile( ID3D11DeviceContext* pContext, + ID3D11Resource* pSource, + REFGUID guidContainerFormat, + const wchar_t* fileName, + const GUID* targetFormat, + std::function setCustomProps ) +{ + if ( !fileName ) + return E_INVALIDARG; + + D3D11_TEXTURE2D_DESC desc = {}; + ComPtr pStaging; + HRESULT hr = CaptureTexture( pContext, pSource, desc, pStaging ); + if ( FAILED(hr) ) + return hr; + + // Determine source format's WIC equivalent + WICPixelFormatGUID pfGuid; + bool sRGB = false; + switch ( desc.Format ) + { + case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break; + case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break; + case DXGI_FORMAT_R16G16B16A16_UNORM: pfGuid = GUID_WICPixelFormat64bppRGBA; break; + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102XR; break; // DXGI 1.1 + case DXGI_FORMAT_R10G10B10A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102; break; + case DXGI_FORMAT_B5G5R5A1_UNORM: pfGuid = GUID_WICPixelFormat16bppBGRA5551; break; + case DXGI_FORMAT_B5G6R5_UNORM: pfGuid = GUID_WICPixelFormat16bppBGR565; break; + case DXGI_FORMAT_R32_FLOAT: pfGuid = GUID_WICPixelFormat32bppGrayFloat; break; + case DXGI_FORMAT_R16_FLOAT: pfGuid = GUID_WICPixelFormat16bppGrayHalf; break; + case DXGI_FORMAT_R16_UNORM: pfGuid = GUID_WICPixelFormat16bppGray; break; + case DXGI_FORMAT_R8_UNORM: pfGuid = GUID_WICPixelFormat8bppGray; break; + case DXGI_FORMAT_A8_UNORM: pfGuid = GUID_WICPixelFormat8bppAlpha; break; + + case DXGI_FORMAT_R8G8B8A8_UNORM: + pfGuid = GUID_WICPixelFormat32bppRGBA; + break; + + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + pfGuid = GUID_WICPixelFormat32bppRGBA; + sRGB = true; + break; + + case DXGI_FORMAT_B8G8R8A8_UNORM: // DXGI 1.1 + pfGuid = GUID_WICPixelFormat32bppBGRA; + break; + + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: // DXGI 1.1 + pfGuid = GUID_WICPixelFormat32bppBGRA; + sRGB = true; + break; + + case DXGI_FORMAT_B8G8R8X8_UNORM: // DXGI 1.1 + pfGuid = GUID_WICPixelFormat32bppBGR; + break; + + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: // DXGI 1.1 + pfGuid = GUID_WICPixelFormat32bppBGR; + sRGB = true; + break; + + default: + return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); + } + + auto pWIC = _GetWIC(); + if ( !pWIC ) + return E_NOINTERFACE; + + ComPtr stream; + hr = pWIC->CreateStream( stream.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + hr = stream->InitializeFromFilename( fileName, GENERIC_WRITE ); + if ( FAILED(hr) ) + return hr; + + auto_delete_file_wic delonfail(stream, fileName); + + ComPtr encoder; + hr = pWIC->CreateEncoder( guidContainerFormat, 0, encoder.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + hr = encoder->Initialize( stream.Get(), WICBitmapEncoderNoCache ); + if ( FAILED(hr) ) + return hr; + + ComPtr frame; + ComPtr props; + hr = encoder->CreateNewFrame( frame.GetAddressOf(), props.GetAddressOf() ); + if ( FAILED(hr) ) + return hr; + + if ( targetFormat && memcmp( &guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID) ) == 0 && _IsWIC2() ) + { + // Opt-in to the WIC2 support for writing 32-bit Windows BMP files with an alpha channel + PROPBAG2 option = {}; + option.pstrName = const_cast(L"EnableV5Header32bppBGRA"); + + VARIANT varValue; + varValue.vt = VT_BOOL; + varValue.boolVal = VARIANT_TRUE; + (void)props->Write( 1, &option, &varValue ); + } + + if ( setCustomProps ) + { + setCustomProps( props.Get() ); + } + + hr = frame->Initialize( props.Get() ); + if ( FAILED(hr) ) + return hr; + + hr = frame->SetSize( desc.Width , desc.Height ); + if ( FAILED(hr) ) + return hr; + + hr = frame->SetResolution( 72, 72 ); + if ( FAILED(hr) ) + return hr; + + // Pick a target format + WICPixelFormatGUID targetGuid; + if ( targetFormat ) + { + targetGuid = *targetFormat; + } + else + { + // Screenshots dont typically include the alpha channel of the render target + switch ( desc.Format ) + { +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + if ( _IsWIC2() ) + { + targetGuid = GUID_WICPixelFormat96bppRGBFloat; + } + else + { + targetGuid = GUID_WICPixelFormat24bppBGR; + } + break; +#endif + + case DXGI_FORMAT_R16G16B16A16_UNORM: targetGuid = GUID_WICPixelFormat48bppBGR; break; + case DXGI_FORMAT_B5G5R5A1_UNORM: targetGuid = GUID_WICPixelFormat16bppBGR555; break; + case DXGI_FORMAT_B5G6R5_UNORM: targetGuid = GUID_WICPixelFormat16bppBGR565; break; + + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_A8_UNORM: + targetGuid = GUID_WICPixelFormat8bppGray; + break; + + default: + targetGuid = GUID_WICPixelFormat24bppBGR; + break; + } + } + + hr = frame->SetPixelFormat( &targetGuid ); + if ( FAILED(hr) ) + return hr; + + if ( targetFormat && memcmp( targetFormat, &targetGuid, sizeof(WICPixelFormatGUID) ) != 0 ) + { + // Requested output pixel format is not supported by the WIC codec + return E_FAIL; + } + + // Encode WIC metadata + ComPtr metawriter; + if ( SUCCEEDED( frame->GetMetadataQueryWriter( metawriter.GetAddressOf() ) ) ) + { + PROPVARIANT value; + PropVariantInit( &value ); + + value.vt = VT_LPSTR; + value.pszVal = const_cast("DirectXTK"); + + if ( memcmp( &guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID) ) == 0 ) + { + // Set Software name + (void)metawriter->SetMetadataByName( L"/tEXt/{str=Software}", &value ); + + // Set sRGB chunk + if (sRGB) + { + value.vt = VT_UI1; + value.bVal = 0; + (void)metawriter->SetMetadataByName(L"/sRGB/RenderingIntent", &value); + } + else + { + // add gAMA chunk with gamma 1.0 + value.vt = VT_UI4; + value.uintVal = 100000; // gama value * 100,000 -- i.e. gamma 1.0 + (void)metawriter->SetMetadataByName(L"/gAMA/ImageGamma", &value); + + // remove sRGB chunk which is added by default. + (void)metawriter->RemoveMetadataByName(L"/sRGB/RenderingIntent"); + } + } +#if defined(_XBOX_ONE) && defined(_TITLE) + else if ( memcmp( &guidContainerFormat, &GUID_ContainerFormatJpeg, sizeof(GUID) ) == 0 ) + { + // Set Software name + (void)metawriter->SetMetadataByName( L"/app1/ifd/{ushort=305}", &value ); + + if ( sRGB ) + { + // Set EXIF Colorspace of sRGB + value.vt = VT_UI2; + value.uiVal = 1; + (void)metawriter->SetMetadataByName( L"/app1/ifd/exif/{ushort=40961}", &value ); + } + } + else if ( memcmp( &guidContainerFormat, &GUID_ContainerFormatTiff, sizeof(GUID) ) == 0 ) + { + // Set Software name + (void)metawriter->SetMetadataByName( L"/ifd/{ushort=305}", &value ); + + if ( sRGB ) + { + // Set EXIF Colorspace of sRGB + value.vt = VT_UI2; + value.uiVal = 1; + (void)metawriter->SetMetadataByName( L"/ifd/exif/{ushort=40961}", &value ); + } + } +#else + else + { + // Set Software name + (void)metawriter->SetMetadataByName( L"System.ApplicationName", &value ); + + if ( sRGB ) + { + // Set EXIF Colorspace of sRGB + value.vt = VT_UI2; + value.uiVal = 1; + (void)metawriter->SetMetadataByName( L"System.Image.ColorSpace", &value ); + } + } +#endif + } + + D3D11_MAPPED_SUBRESOURCE mapped; + hr = pContext->Map( pStaging.Get(), 0, D3D11_MAP_READ, 0, &mapped ); + if ( FAILED(hr) ) + return hr; + + if ( memcmp( &targetGuid, &pfGuid, sizeof(WICPixelFormatGUID) ) != 0 ) + { + // Conversion required to write + ComPtr source; + hr = pWIC->CreateBitmapFromMemory( desc.Width, desc.Height, pfGuid, + mapped.RowPitch, mapped.RowPitch * desc.Height, + reinterpret_cast( mapped.pData ), source.GetAddressOf() ); + if ( FAILED(hr) ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return hr; + } + + ComPtr FC; + hr = pWIC->CreateFormatConverter( FC.GetAddressOf() ); + if ( FAILED(hr) ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return hr; + } + + BOOL canConvert = FALSE; + hr = FC->CanConvert( pfGuid, targetGuid, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + + hr = FC->Initialize( source.Get(), targetGuid, WICBitmapDitherTypeNone, nullptr, 0, WICBitmapPaletteTypeMedianCut ); + if ( FAILED(hr) ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return hr; + } + + WICRect rect = { 0, 0, static_cast( desc.Width ), static_cast( desc.Height ) }; + hr = frame->WriteSource( FC.Get(), &rect ); + if ( FAILED(hr) ) + { + pContext->Unmap( pStaging.Get(), 0 ); + return hr; + } + } + else + { + // No conversion required + hr = frame->WritePixels( desc.Height, mapped.RowPitch, mapped.RowPitch * desc.Height, reinterpret_cast( mapped.pData ) ); + if ( FAILED(hr) ) + return hr; + } + + pContext->Unmap( pStaging.Get(), 0 ); + + hr = frame->Commit(); + if ( FAILED(hr) ) + return hr; + + hr = encoder->Commit(); + if ( FAILED(hr) ) + return hr; + + delonfail.clear(); + + return S_OK; +} diff --git a/DirectXTK/Src/Shaders/AlphaTestEffect.fx b/DirectXTK/Src/Shaders/AlphaTestEffect.fx new file mode 100644 index 0000000..1b4c163 --- /dev/null +++ b/DirectXTK/Src/Shaders/AlphaTestEffect.fx @@ -0,0 +1,133 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +// http://create.msdn.com/en-US/education/catalog/sample/stock_effects + + +Texture2D Texture : register(t0); +sampler Sampler : register(s0); + + +cbuffer Parameters : register(b0) +{ + float4 DiffuseColor : packoffset(c0); + float4 AlphaTest : packoffset(c1); + float3 FogColor : packoffset(c2); + float4 FogVector : packoffset(c3); + float4x4 WorldViewProj : packoffset(c4); +}; + + +#include "Structures.fxh" +#include "Common.fxh" + + +// Vertex shader: basic. +VSOutputTx VSAlphaTest(VSInputTx vin) +{ + VSOutputTx vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + + return vout; +} + + +// Vertex shader: no fog. +VSOutputTxNoFog VSAlphaTestNoFog(VSInputTx vin) +{ + VSOutputTxNoFog vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParamsNoFog; + + vout.TexCoord = vin.TexCoord; + + return vout; +} + + +// Vertex shader: vertex color. +VSOutputTx VSAlphaTestVc(VSInputTxVc vin) +{ + VSOutputTx vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: vertex color, no fog. +VSOutputTxNoFog VSAlphaTestVcNoFog(VSInputTxVc vin) +{ + VSOutputTxNoFog vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParamsNoFog; + + vout.TexCoord = vin.TexCoord; + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Pixel shader: less/greater compare function. +float4 PSAlphaTestLtGt(PSInputTx pin) : SV_Target0 +{ + float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; + + clip((color.a < AlphaTest.x) ? AlphaTest.z : AlphaTest.w); + + ApplyFog(color, pin.Specular.w); + + return color; +} + + +// Pixel shader: less/greater compare function, no fog. +float4 PSAlphaTestLtGtNoFog(PSInputTxNoFog pin) : SV_Target0 +{ + float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; + + clip((color.a < AlphaTest.x) ? AlphaTest.z : AlphaTest.w); + + return color; +} + + +// Pixel shader: equal/notequal compare function. +float4 PSAlphaTestEqNe(PSInputTx pin) : SV_Target0 +{ + float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; + + clip((abs(color.a - AlphaTest.x) < AlphaTest.y) ? AlphaTest.z : AlphaTest.w); + + ApplyFog(color, pin.Specular.w); + + return color; +} + + +// Pixel shader: equal/notequal compare function, no fog. +float4 PSAlphaTestEqNeNoFog(PSInputTxNoFog pin) : SV_Target0 +{ + float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; + + clip((abs(color.a - AlphaTest.x) < AlphaTest.y) ? AlphaTest.z : AlphaTest.w); + + return color; +} diff --git a/DirectXTK/Src/Shaders/BasicEffect.fx b/DirectXTK/Src/Shaders/BasicEffect.fx new file mode 100644 index 0000000..8ff2591 --- /dev/null +++ b/DirectXTK/Src/Shaders/BasicEffect.fx @@ -0,0 +1,610 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +// http://create.msdn.com/en-US/education/catalog/sample/stock_effects + + +Texture2D Texture : register(t0); +sampler Sampler : register(s0); + + +cbuffer Parameters : register(b0) +{ + float4 DiffuseColor : packoffset(c0); + float3 EmissiveColor : packoffset(c1); + float3 SpecularColor : packoffset(c2); + float SpecularPower : packoffset(c2.w); + + float3 LightDirection[3] : packoffset(c3); + float3 LightDiffuseColor[3] : packoffset(c6); + float3 LightSpecularColor[3] : packoffset(c9); + + float3 EyePosition : packoffset(c12); + + float3 FogColor : packoffset(c13); + float4 FogVector : packoffset(c14); + + float4x4 World : packoffset(c15); + float3x3 WorldInverseTranspose : packoffset(c19); + float4x4 WorldViewProj : packoffset(c22); +}; + + +#include "Structures.fxh" +#include "Common.fxh" +#include "Lighting.fxh" + + +// Vertex shader: basic. +VSOutput VSBasic(VSInput vin) +{ + VSOutput vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParams; + + return vout; +} + + +// Vertex shader: no fog. +VSOutputNoFog VSBasicNoFog(VSInput vin) +{ + VSOutputNoFog vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParamsNoFog; + + return vout; +} + + +// Vertex shader: vertex color. +VSOutput VSBasicVc(VSInputVc vin) +{ + VSOutput vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParams; + + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: vertex color, no fog. +VSOutputNoFog VSBasicVcNoFog(VSInputVc vin) +{ + VSOutputNoFog vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParamsNoFog; + + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: texture. +VSOutputTx VSBasicTx(VSInputTx vin) +{ + VSOutputTx vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + + return vout; +} + + +// Vertex shader: texture, no fog. +VSOutputTxNoFog VSBasicTxNoFog(VSInputTx vin) +{ + VSOutputTxNoFog vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParamsNoFog; + + vout.TexCoord = vin.TexCoord; + + return vout; +} + + +// Vertex shader: texture + vertex color. +VSOutputTx VSBasicTxVc(VSInputTxVc vin) +{ + VSOutputTx vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: texture + vertex color, no fog. +VSOutputTxNoFog VSBasicTxVcNoFog(VSInputTxVc vin) +{ + VSOutputTxNoFog vout; + + CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); + SetCommonVSOutputParamsNoFog; + + vout.TexCoord = vin.TexCoord; + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: vertex lighting. +VSOutput VSBasicVertexLighting(VSInputNm vin) +{ + VSOutput vout; + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 3); + SetCommonVSOutputParams; + + return vout; +} + +VSOutput VSBasicVertexLightingBn(VSInputNm vin) +{ + VSOutput vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, normal, 3); + SetCommonVSOutputParams; + + return vout; +} + + +// Vertex shader: vertex lighting + vertex color. +VSOutput VSBasicVertexLightingVc(VSInputNmVc vin) +{ + VSOutput vout; + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 3); + SetCommonVSOutputParams; + + vout.Diffuse *= vin.Color; + + return vout; +} + +VSOutput VSBasicVertexLightingVcBn(VSInputNmVc vin) +{ + VSOutput vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, normal, 3); + SetCommonVSOutputParams; + + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: vertex lighting + texture. +VSOutputTx VSBasicVertexLightingTx(VSInputNmTx vin) +{ + VSOutputTx vout; + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 3); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + + return vout; +} + +VSOutputTx VSBasicVertexLightingTxBn(VSInputNmTx vin) +{ + VSOutputTx vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, normal, 3); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + + return vout; +} + + +// Vertex shader: vertex lighting + texture + vertex color. +VSOutputTx VSBasicVertexLightingTxVc(VSInputNmTxVc vin) +{ + VSOutputTx vout; + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 3); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + vout.Diffuse *= vin.Color; + + return vout; +} + +VSOutputTx VSBasicVertexLightingTxVcBn(VSInputNmTxVc vin) +{ + VSOutputTx vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, normal, 3); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: one light. +VSOutput VSBasicOneLight(VSInputNm vin) +{ + VSOutput vout; + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 1); + SetCommonVSOutputParams; + + return vout; +} + +VSOutput VSBasicOneLightBn(VSInputNm vin) +{ + VSOutput vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, normal, 1); + SetCommonVSOutputParams; + + return vout; +} + + +// Vertex shader: one light + vertex color. +VSOutput VSBasicOneLightVc(VSInputNmVc vin) +{ + VSOutput vout; + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 1); + SetCommonVSOutputParams; + + vout.Diffuse *= vin.Color; + + return vout; +} + +VSOutput VSBasicOneLightVcBn(VSInputNmVc vin) +{ + VSOutput vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, normal, 1); + SetCommonVSOutputParams; + + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: one light + texture. +VSOutputTx VSBasicOneLightTx(VSInputNmTx vin) +{ + VSOutputTx vout; + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 1); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + + return vout; +} + +VSOutputTx VSBasicOneLightTxBn(VSInputNmTx vin) +{ + VSOutputTx vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, normal, 1); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + + return vout; +} + + +// Vertex shader: one light + texture + vertex color. +VSOutputTx VSBasicOneLightTxVc(VSInputNmTxVc vin) +{ + VSOutputTx vout; + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 1); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + vout.Diffuse *= vin.Color; + + return vout; +} + +VSOutputTx VSBasicOneLightTxVcBn(VSInputNmTxVc vin) +{ + VSOutputTx vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, normal, 1); + SetCommonVSOutputParams; + + vout.TexCoord = vin.TexCoord; + vout.Diffuse *= vin.Color; + + return vout; +} + + +// Vertex shader: pixel lighting. +VSOutputPixelLighting VSBasicPixelLighting(VSInputNm vin) +{ + VSOutputPixelLighting vout; + + CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, vin.Normal); + SetCommonVSOutputParamsPixelLighting; + + vout.Diffuse = float4(1, 1, 1, DiffuseColor.a); + + return vout; +} + +VSOutputPixelLighting VSBasicPixelLightingBn(VSInputNm vin) +{ + VSOutputPixelLighting vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, normal); + SetCommonVSOutputParamsPixelLighting; + + vout.Diffuse = float4(1, 1, 1, DiffuseColor.a); + + return vout; +} + + +// Vertex shader: pixel lighting + vertex color. +VSOutputPixelLighting VSBasicPixelLightingVc(VSInputNmVc vin) +{ + VSOutputPixelLighting vout; + + CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, vin.Normal); + SetCommonVSOutputParamsPixelLighting; + + vout.Diffuse.rgb = vin.Color.rgb; + vout.Diffuse.a = vin.Color.a * DiffuseColor.a; + + return vout; +} + +VSOutputPixelLighting VSBasicPixelLightingVcBn(VSInputNmVc vin) +{ + VSOutputPixelLighting vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, normal); + SetCommonVSOutputParamsPixelLighting; + + vout.Diffuse.rgb = vin.Color.rgb; + vout.Diffuse.a = vin.Color.a * DiffuseColor.a; + + return vout; +} + + +// Vertex shader: pixel lighting + texture. +VSOutputPixelLightingTx VSBasicPixelLightingTx(VSInputNmTx vin) +{ + VSOutputPixelLightingTx vout; + + CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, vin.Normal); + SetCommonVSOutputParamsPixelLighting; + + vout.Diffuse = float4(1, 1, 1, DiffuseColor.a); + vout.TexCoord = vin.TexCoord; + + return vout; +} + +VSOutputPixelLightingTx VSBasicPixelLightingTxBn(VSInputNmTx vin) +{ + VSOutputPixelLightingTx vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, normal); + SetCommonVSOutputParamsPixelLighting; + + vout.Diffuse = float4(1, 1, 1, DiffuseColor.a); + vout.TexCoord = vin.TexCoord; + + return vout; +} + + +// Vertex shader: pixel lighting + texture + vertex color. +VSOutputPixelLightingTx VSBasicPixelLightingTxVc(VSInputNmTxVc vin) +{ + VSOutputPixelLightingTx vout; + + CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, vin.Normal); + SetCommonVSOutputParamsPixelLighting; + + vout.Diffuse.rgb = vin.Color.rgb; + vout.Diffuse.a = vin.Color.a * DiffuseColor.a; + vout.TexCoord = vin.TexCoord; + + return vout; +} + +VSOutputPixelLightingTx VSBasicPixelLightingTxVcBn(VSInputNmTxVc vin) +{ + VSOutputPixelLightingTx vout; + + float3 normal = BiasX2(vin.Normal); + + CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, normal); + SetCommonVSOutputParamsPixelLighting; + + vout.Diffuse.rgb = vin.Color.rgb; + vout.Diffuse.a = vin.Color.a * DiffuseColor.a; + vout.TexCoord = vin.TexCoord; + + return vout; +} + + +// Pixel shader: basic. +float4 PSBasic(PSInput pin) : SV_Target0 +{ + float4 color = pin.Diffuse; + + ApplyFog(color, pin.Specular.w); + + return color; +} + + +// Pixel shader: no fog. +float4 PSBasicNoFog(PSInputNoFog pin) : SV_Target0 +{ + return pin.Diffuse; +} + + +// Pixel shader: texture. +float4 PSBasicTx(PSInputTx pin) : SV_Target0 +{ + float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; + + ApplyFog(color, pin.Specular.w); + + return color; +} + + +// Pixel shader: texture, no fog. +float4 PSBasicTxNoFog(PSInputTxNoFog pin) : SV_Target0 +{ + return Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; +} + + +// Pixel shader: vertex lighting. +float4 PSBasicVertexLighting(PSInput pin) : SV_Target0 +{ + float4 color = pin.Diffuse; + + AddSpecular(color, pin.Specular.rgb); + ApplyFog(color, pin.Specular.w); + + return color; +} + + +// Pixel shader: vertex lighting, no fog. +float4 PSBasicVertexLightingNoFog(PSInput pin) : SV_Target0 +{ + float4 color = pin.Diffuse; + + AddSpecular(color, pin.Specular.rgb); + + return color; +} + + +// Pixel shader: vertex lighting + texture. +float4 PSBasicVertexLightingTx(PSInputTx pin) : SV_Target0 +{ + float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; + + AddSpecular(color, pin.Specular.rgb); + ApplyFog(color, pin.Specular.w); + + return color; +} + + +// Pixel shader: vertex lighting + texture, no fog. +float4 PSBasicVertexLightingTxNoFog(PSInputTx pin) : SV_Target0 +{ + float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; + + AddSpecular(color, pin.Specular.rgb); + + return color; +} + + +// Pixel shader: pixel lighting. +float4 PSBasicPixelLighting(PSInputPixelLighting pin) : SV_Target0 +{ + float4 color = pin.Diffuse; + + float3 eyeVector = normalize(EyePosition - pin.PositionWS.xyz); + float3 worldNormal = normalize(pin.NormalWS); + + ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3); + + color.rgb *= lightResult.Diffuse; + + AddSpecular(color, lightResult.Specular); + ApplyFog(color, pin.PositionWS.w); + + return color; +} + + +// Pixel shader: pixel lighting + texture. +float4 PSBasicPixelLightingTx(PSInputPixelLightingTx pin) : SV_Target0 +{ + float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse; + + float3 eyeVector = normalize(EyePosition - pin.PositionWS.xyz); + float3 worldNormal = normalize(pin.NormalWS); + + ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3); + + color.rgb *= lightResult.Diffuse; + + AddSpecular(color, lightResult.Specular); + ApplyFog(color, pin.PositionWS.w); + + return color; +} diff --git a/DirectXTK/Src/Shaders/Common.fxh b/DirectXTK/Src/Shaders/Common.fxh new file mode 100644 index 0000000..4ab0382 --- /dev/null +++ b/DirectXTK/Src/Shaders/Common.fxh @@ -0,0 +1,66 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// http://go.microsoft.com/fwlink/?LinkId=248929 +// http://create.msdn.com/en-US/education/catalog/sample/stock_effects + + +float ComputeFogFactor(float4 position) +{ + return saturate(dot(position, FogVector)); +} + + +void ApplyFog(inout float4 color, float fogFactor) +{ + color.rgb = lerp(color.rgb, FogColor * color.a, fogFactor); +} + + +void AddSpecular(inout float4 color, float3 specular) +{ + color.rgb += specular * color.a; +} + + +float3 BiasX2(float3 x) +{ + return 2.0f * x - 1.0f; +} + + +struct CommonVSOutput +{ + float4 Pos_ps; + float4 Diffuse; + float3 Specular; + float FogFactor; +}; + + +CommonVSOutput ComputeCommonVSOutput(float4 position) +{ + CommonVSOutput vout; + + vout.Pos_ps = mul(position, WorldViewProj); + vout.Diffuse = DiffuseColor; + vout.Specular = 0; + vout.FogFactor = ComputeFogFactor(position); + + return vout; +} + + +#define SetCommonVSOutputParams \ + vout.PositionPS = cout.Pos_ps; \ + vout.Diffuse = cout.Diffuse; \ + vout.Specular = float4(cout.Specular, cout.FogFactor); + + +#define SetCommonVSOutputParamsNoFog \ + vout.PositionPS = cout.Pos_ps; \ + vout.Diffuse = cout.Diffuse; diff --git a/DirectXTK/Src/Shaders/CompileShaders.cmd b/DirectXTK/Src/Shaders/CompileShaders.cmd new file mode 100644 index 0000000..5c51f79 --- /dev/null +++ b/DirectXTK/Src/Shaders/CompileShaders.cmd @@ -0,0 +1,267 @@ +@echo off +rem THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +rem ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +rem THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +rem PARTICULAR PURPOSE. +rem +rem Copyright (c) Microsoft Corporation. All rights reserved. + +setlocal +set error=0 + +if %1.==xbox. goto continuexbox +if %1.==. goto continue +echo usage: CompileShaders [xbox] +exit /b + +:continuexbox +set XBOXOPTS=/D__XBOX_DISABLE_SHADER_NAME_EMPLACEMENT +if NOT %2.==noprecompile. goto skipnoprecompile +set XBOXOPTS=%XBOXOPTS% /D__XBOX_DISABLE_PRECOMPILE=1 +:skipnoprecompile + +set XBOXFXC="%XboxOneXDKLatest%\xdk\FXC\amd64\FXC.exe" +if exist %XBOXFXC% goto continue +set XBOXFXC="%XboxOneXDKLatest%xdk\FXC\amd64\FXC.exe" +if exist %XBOXFXC% goto continue +set XBOXFXC="%XboxOneXDKBuild%xdk\FXC\amd64\FXC.exe" +if exist %XBOXFXC% goto continue +set XBOXFXC="%DurangoXDK%xdk\FXC\amd64\FXC.exe" +if not exist %XBOXFXC% goto needxdk + +:continue + +call :CompileShader%1 AlphaTestEffect vs VSAlphaTest +call :CompileShader%1 AlphaTestEffect vs VSAlphaTestNoFog +call :CompileShader%1 AlphaTestEffect vs VSAlphaTestVc +call :CompileShader%1 AlphaTestEffect vs VSAlphaTestVcNoFog + +call :CompileShader%1 AlphaTestEffect ps PSAlphaTestLtGt +call :CompileShader%1 AlphaTestEffect ps PSAlphaTestLtGtNoFog +call :CompileShader%1 AlphaTestEffect ps PSAlphaTestEqNe +call :CompileShader%1 AlphaTestEffect ps PSAlphaTestEqNeNoFog + +call :CompileShader%1 BasicEffect vs VSBasic +call :CompileShader%1 BasicEffect vs VSBasicNoFog +call :CompileShader%1 BasicEffect vs VSBasicVc +call :CompileShader%1 BasicEffect vs VSBasicVcNoFog +call :CompileShader%1 BasicEffect vs VSBasicTx +call :CompileShader%1 BasicEffect vs VSBasicTxNoFog +call :CompileShader%1 BasicEffect vs VSBasicTxVc +call :CompileShader%1 BasicEffect vs VSBasicTxVcNoFog + +call :CompileShader%1 BasicEffect vs VSBasicVertexLighting +call :CompileShader%1 BasicEffect vs VSBasicVertexLightingBn +call :CompileShader%1 BasicEffect vs VSBasicVertexLightingVc +call :CompileShader%1 BasicEffect vs VSBasicVertexLightingVcBn +call :CompileShader%1 BasicEffect vs VSBasicVertexLightingTx +call :CompileShader%1 BasicEffect vs VSBasicVertexLightingTxBn +call :CompileShader%1 BasicEffect vs VSBasicVertexLightingTxVc +call :CompileShader%1 BasicEffect vs VSBasicVertexLightingTxVcBn + +call :CompileShader%1 BasicEffect vs VSBasicOneLight +call :CompileShader%1 BasicEffect vs VSBasicOneLightBn +call :CompileShader%1 BasicEffect vs VSBasicOneLightVc +call :CompileShader%1 BasicEffect vs VSBasicOneLightVcBn +call :CompileShader%1 BasicEffect vs VSBasicOneLightTx +call :CompileShader%1 BasicEffect vs VSBasicOneLightTxBn +call :CompileShader%1 BasicEffect vs VSBasicOneLightTxVc +call :CompileShader%1 BasicEffect vs VSBasicOneLightTxVcBn + +call :CompileShader%1 BasicEffect vs VSBasicPixelLighting +call :CompileShader%1 BasicEffect vs VSBasicPixelLightingBn +call :CompileShader%1 BasicEffect vs VSBasicPixelLightingVc +call :CompileShader%1 BasicEffect vs VSBasicPixelLightingVcBn +call :CompileShader%1 BasicEffect vs VSBasicPixelLightingTx +call :CompileShader%1 BasicEffect vs VSBasicPixelLightingTxBn +call :CompileShader%1 BasicEffect vs VSBasicPixelLightingTxVc +call :CompileShader%1 BasicEffect vs VSBasicPixelLightingTxVcBn + +call :CompileShader%1 BasicEffect ps PSBasic +call :CompileShader%1 BasicEffect ps PSBasicNoFog +call :CompileShader%1 BasicEffect ps PSBasicTx +call :CompileShader%1 BasicEffect ps PSBasicTxNoFog + +call :CompileShader%1 BasicEffect ps PSBasicVertexLighting +call :CompileShader%1 BasicEffect ps PSBasicVertexLightingNoFog +call :CompileShader%1 BasicEffect ps PSBasicVertexLightingTx +call :CompileShader%1 BasicEffect ps PSBasicVertexLightingTxNoFog + +call :CompileShader%1 BasicEffect ps PSBasicPixelLighting +call :CompileShader%1 BasicEffect ps PSBasicPixelLightingTx + +call :CompileShader%1 DualTextureEffect vs VSDualTexture +call :CompileShader%1 DualTextureEffect vs VSDualTextureNoFog +call :CompileShader%1 DualTextureEffect vs VSDualTextureVc +call :CompileShader%1 DualTextureEffect vs VSDualTextureVcNoFog + +call :CompileShader%1 DualTextureEffect ps PSDualTexture +call :CompileShader%1 DualTextureEffect ps PSDualTextureNoFog + +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMap +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapBn +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapFresnel +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapFresnelBn +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapOneLight +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapOneLightBn +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapOneLightFresnel +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapOneLightFresnelBn +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapPixelLighting +call :CompileShader%1 EnvironmentMapEffect vs VSEnvMapPixelLightingBn + +call :CompileShader%1 EnvironmentMapEffect ps PSEnvMap +call :CompileShader%1 EnvironmentMapEffect ps PSEnvMapNoFog +call :CompileShader%1 EnvironmentMapEffect ps PSEnvMapSpecular +call :CompileShader%1 EnvironmentMapEffect ps PSEnvMapSpecularNoFog +call :CompileShader%1 EnvironmentMapEffect ps PSEnvMapPixelLighting +call :CompileShader%1 EnvironmentMapEffect ps PSEnvMapPixelLightingNoFog +call :CompileShader%1 EnvironmentMapEffect ps PSEnvMapPixelLightingFresnel +call :CompileShader%1 EnvironmentMapEffect ps PSEnvMapPixelLightingFresnelNoFog + +call :CompileShader%1 SkinnedEffect vs VSSkinnedVertexLightingOneBone +call :CompileShader%1 SkinnedEffect vs VSSkinnedVertexLightingOneBoneBn +call :CompileShader%1 SkinnedEffect vs VSSkinnedVertexLightingTwoBones +call :CompileShader%1 SkinnedEffect vs VSSkinnedVertexLightingTwoBonesBn +call :CompileShader%1 SkinnedEffect vs VSSkinnedVertexLightingFourBones +call :CompileShader%1 SkinnedEffect vs VSSkinnedVertexLightingFourBonesBn + +call :CompileShader%1 SkinnedEffect vs VSSkinnedOneLightOneBone +call :CompileShader%1 SkinnedEffect vs VSSkinnedOneLightOneBoneBn +call :CompileShader%1 SkinnedEffect vs VSSkinnedOneLightTwoBones +call :CompileShader%1 SkinnedEffect vs VSSkinnedOneLightTwoBonesBn +call :CompileShader%1 SkinnedEffect vs VSSkinnedOneLightFourBones +call :CompileShader%1 SkinnedEffect vs VSSkinnedOneLightFourBonesBn + +call :CompileShader%1 SkinnedEffect vs VSSkinnedPixelLightingOneBone +call :CompileShader%1 SkinnedEffect vs VSSkinnedPixelLightingOneBoneBn +call :CompileShader%1 SkinnedEffect vs VSSkinnedPixelLightingTwoBones +call :CompileShader%1 SkinnedEffect vs VSSkinnedPixelLightingTwoBonesBn +call :CompileShader%1 SkinnedEffect vs VSSkinnedPixelLightingFourBones +call :CompileShader%1 SkinnedEffect vs VSSkinnedPixelLightingFourBonesBn + +call :CompileShader%1 SkinnedEffect ps PSSkinnedVertexLighting +call :CompileShader%1 SkinnedEffect ps PSSkinnedVertexLightingNoFog +call :CompileShader%1 SkinnedEffect ps PSSkinnedPixelLighting + +call :CompileShader%1 NormalMapEffect vs VSNormalPixelLightingTx +call :CompileShader%1 NormalMapEffect vs VSNormalPixelLightingTxBn +call :CompileShader%1 NormalMapEffect vs VSNormalPixelLightingTxVc +call :CompileShader%1 NormalMapEffect vs VSNormalPixelLightingTxVcBn + +call :CompileShader%1 NormalMapEffect ps PSNormalPixelLightingTx +call :CompileShader%1 NormalMapEffect ps PSNormalPixelLightingTxNoFog +call :CompileShader%1 NormalMapEffect ps PSNormalPixelLightingTxNoSpec +call :CompileShader%1 NormalMapEffect ps PSNormalPixelLightingTxNoFogSpec + +call :CompileShader%1 SpriteEffect vs SpriteVertexShader +call :CompileShader%1 SpriteEffect ps SpritePixelShader + +call :CompileShader%1 DGSLEffect vs main +call :CompileShader%1 DGSLEffect vs mainVc +call :CompileShader%1 DGSLEffect vs main1Bones +call :CompileShader%1 DGSLEffect vs main1BonesVc +call :CompileShader%1 DGSLEffect vs main2Bones +call :CompileShader%1 DGSLEffect vs main2BonesVc +call :CompileShader%1 DGSLEffect vs main4Bones +call :CompileShader%1 DGSLEffect vs main4BonesVc + +call :CompileShaderHLSL%1 DGSLUnlit ps main +call :CompileShaderHLSL%1 DGSLLambert ps main +call :CompileShaderHLSL%1 DGSLPhong ps main + +call :CompileShaderHLSL%1 DGSLUnlit ps mainTk +call :CompileShaderHLSL%1 DGSLLambert ps mainTk +call :CompileShaderHLSL%1 DGSLPhong ps mainTk + +call :CompileShaderHLSL%1 DGSLUnlit ps mainTx +call :CompileShaderHLSL%1 DGSLLambert ps mainTx +call :CompileShaderHLSL%1 DGSLPhong ps mainTx + +call :CompileShaderHLSL%1 DGSLUnlit ps mainTxTk +call :CompileShaderHLSL%1 DGSLLambert ps mainTxTk +call :CompileShaderHLSL%1 DGSLPhong ps mainTxTk + +call :CompileShaderSM4%1 PostProcess vs VSQuad +call :CompileShaderSM4%1 PostProcess ps PSCopy +call :CompileShaderSM4%1 PostProcess ps PSMonochrome +call :CompileShaderSM4%1 PostProcess ps PSSepia +call :CompileShaderSM4%1 PostProcess ps PSDownScale2x2 +call :CompileShaderSM4%1 PostProcess ps PSDownScale4x4 +call :CompileShaderSM4%1 PostProcess ps PSGaussianBlur5x5 +call :CompileShaderSM4%1 PostProcess ps PSBloomExtract +call :CompileShaderSM4%1 PostProcess ps PSBloomBlur +call :CompileShaderSM4%1 PostProcess ps PSMerge +call :CompileShaderSM4%1 PostProcess ps PSBloomCombine + +call :CompileShaderSM4%1 ToneMap vs VSQuad +call :CompileShaderSM4%1 ToneMap ps PSCopy +call :CompileShaderSM4%1 ToneMap ps PSSaturate +call :CompileShaderSM4%1 ToneMap ps PSReinhard +call :CompileShaderSM4%1 ToneMap ps PSACESFilmic +call :CompileShaderSM4%1 ToneMap ps PS_SRGB +call :CompileShaderSM4%1 ToneMap ps PSSaturate_SRGB +call :CompileShaderSM4%1 ToneMap ps PSReinhard_SRGB +call :CompileShaderSM4%1 ToneMap ps PSACESFilmic_SRGB +call :CompileShaderSM4%1 ToneMap ps PSHDR10 + +if NOT %1.==xbox. goto skipxboxonly + +call :CompileShaderSM4xbox ToneMap ps PSHDR10_Saturate +call :CompileShaderSM4xbox ToneMap ps PSHDR10_Reinhard +call :CompileShaderSM4xbox ToneMap ps PSHDR10_ACESFilmic +call :CompileShaderSM4xbox ToneMap ps PSHDR10_Saturate_SRGB +call :CompileShaderSM4xbox ToneMap ps PSHDR10_Reinhard_SRGB +call :CompileShaderSM4xbox ToneMap ps PSHDR10_ACESFilmic_SRGB + +:skipxboxonly + +echo. + +if %error% == 0 ( + echo Shaders compiled ok +) else ( + echo There were shader compilation errors! +) + +endlocal +exit /b + +:CompileShader +set fxc=fxc /nologo %1.fx /T%2_4_0_level_9_1 /Zi /Zpc /Qstrip_reflect /Qstrip_debug /E%3 /FhCompiled\%1_%3.inc /FdCompiled\%1_%3.pdb /Vn%1_%3 +echo. +echo %fxc% +%fxc% || set error=1 +exit /b + +:CompileShaderSM4 +set fxc=fxc /nologo %1.fx /T%2_4_0 /Zi /Zpc /Qstrip_reflect /Qstrip_debug /E%3 /FhCompiled\%1_%3.inc /FdCompiled\%1_%3.pdb /Vn%1_%3 +echo. +echo %fxc% +%fxc% || set error=1 +exit /b + +:CompileShaderHLSL +set fxc=fxc /nologo %1.hlsl /T%2_4_0_level_9_1 /Zi /Zpc /Qstrip_reflect /Qstrip_debug /E%3 /FhCompiled\%1_%3.inc /FdCompiled\%1_%3.pdb /Vn%1_%3 +echo. +echo %fxc% +%fxc% || set error=1 +exit /b + +:CompileShaderxbox +:CompileShaderSM4xbox +set fxc=%XBOXFXC% /nologo %1.fx /T%2_5_0 /Zpc /Zi /Qstrip_reflect /Qstrip_debug %XBOXOPTS% /E%3 /FhCompiled\XboxOne%1_%3.inc /FdCompiled\XboxOne%1_%3.pdb /Vn%1_%3 +echo. +echo %fxc% +%fxc% || set error=1 +exit /b + +:CompileShaderHLSLxbox +set fxc=%XBOXFXC% /nologo %1.hlsl /T%2_5_0 /Zpc /Zi /Qstrip_reflect /Qstrip_debug %XBOXOPTS% /E%3 /FhCompiled\XboxOne%1_%3.inc /FdCompiled\XboxOne%1_%3.pdb /Vn%1_%3 +echo. +echo %fxc% +%fxc% || set error=1 +exit /b + +:needxdk +echo ERROR: CompileShaders xbox requires the Microsoft Xbox One XDK +echo (try re-running from the XDK Command Prompt) \ No newline at end of file diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNe.inc b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNe.inc new file mode 100644 index 0000000..d4d23c1 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNe.inc @@ -0,0 +1,350 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float w +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 1 2 ( FLT, FLT, FLT, FLT) +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 // pin<0,1,2,3> + dcl t1 // pin<4,5,6,7> + dcl t2.xy // pin<8,9> + dcl_2d s0 + +#line 115 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + texld r0, t2, s0 + mad r1.w, r0.w, t0.w, -c0.x + mul r0, r0, t0 // ::color<0,1,2,3> + abs r1.x, r1.w + add r1.x, r1.x, -c0.y + cmp r1, r1.x, c0.w, c0.z + texkill r1 + +#line 20 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r1.xyz, c1, r0.w, -r0 + mad r0.xyz, t1.w, r1, r0 // ApplyFog::color<0,1,2> + mov oC0, r0 // ::PSAlphaTestEqNe<0,1,2,3> + +// approximately 10 instruction slots used (1 texture, 9 arithmetic) +ps_4_0 +dcl_constantbuffer CB0[3], immediateIndexed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.w +dcl_input_ps linear v2.xy +dcl_output o0.xyzw +dcl_temps 2 +sample r0.xyzw, v2.xyxx, t0.xyzw, s0 +mad r1.x, r0.w, v0.w, -cb0[1].x +mul r0.xyzw, r0.xyzw, v0.xyzw +lt r1.x, |r1.x|, cb0[1].y +movc r1.x, r1.x, cb0[1].z, cb0[1].w +lt r1.x, r1.x, l(0.000000) +discard_nz r1.x +mad r1.xyz, cb0[2].xyzx, r0.wwww, -r0.xyzx +mad o0.xyz, v1.wwww, r1.xyzx, r0.xyzx +mov o0.w, r0.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE AlphaTestEffect_PSAlphaTestEqNe[] = +{ + 68, 88, 66, 67, 227, 144, + 105, 35, 78, 36, 70, 238, + 99, 102, 182, 28, 112, 61, + 242, 103, 1, 0, 0, 0, + 56, 6, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 220, 3, 0, 0, 156, 5, + 0, 0, 4, 6, 0, 0, + 65, 111, 110, 57, 164, 3, + 0, 0, 164, 3, 0, 0, + 0, 2, 255, 255, 112, 3, + 0, 0, 52, 0, 0, 0, + 1, 0, 40, 0, 0, 0, + 52, 0, 0, 0, 52, 0, + 1, 0, 36, 0, 0, 0, + 52, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 165, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 104, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 192, 0, + 0, 0, 14, 0, 0, 0, + 200, 0, 0, 0, 4, 0, + 0, 0, 24, 2, 0, 0, + 56, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 65, + 108, 112, 104, 97, 84, 101, + 115, 116, 69, 102, 102, 101, + 99, 116, 46, 102, 120, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 40, 0, 0, 0, 120, 0, + 0, 0, 0, 0, 255, 255, + 156, 2, 0, 0, 0, 0, + 255, 255, 168, 2, 0, 0, + 0, 0, 255, 255, 180, 2, + 0, 0, 0, 0, 255, 255, + 192, 2, 0, 0, 115, 0, + 0, 0, 204, 2, 0, 0, + 117, 0, 0, 0, 220, 2, + 0, 0, 115, 0, 0, 0, + 240, 2, 0, 0, 117, 0, + 0, 0, 0, 3, 0, 0, + 117, 0, 0, 0, 12, 3, + 0, 0, 117, 0, 0, 0, + 28, 3, 0, 0, 117, 0, + 0, 0, 48, 3, 0, 0, + 20, 0, 1, 0, 56, 3, + 0, 0, 20, 0, 1, 0, + 76, 3, 0, 0, 20, 0, + 1, 0, 96, 3, 0, 0, + 80, 83, 65, 108, 112, 104, + 97, 84, 101, 115, 116, 69, + 113, 78, 101, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 65, 112, 112, 108, + 121, 70, 111, 103, 0, 99, + 111, 108, 111, 114, 0, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 6, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 112, 105, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 160, 1, + 0, 0, 116, 1, 0, 0, + 168, 1, 0, 0, 116, 1, + 0, 0, 177, 1, 0, 0, + 188, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 10, 0, + 1, 0, 3, 0, 204, 1, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 1, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 2, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 56, 1, 0, 0, 72, 1, + 0, 0, 1, 0, 0, 0, + 88, 1, 0, 0, 100, 1, + 0, 0, 109, 1, 0, 0, + 116, 1, 0, 0, 1, 0, + 0, 0, 132, 1, 0, 0, + 0, 0, 0, 0, 109, 1, + 0, 0, 116, 1, 0, 0, + 1, 0, 0, 0, 144, 1, + 0, 0, 56, 1, 0, 0, + 156, 1, 0, 0, 228, 1, + 0, 0, 3, 0, 0, 0, + 244, 1, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 1, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 2, 0, + 3, 176, 31, 0, 0, 2, + 0, 0, 0, 144, 0, 8, + 15, 160, 66, 0, 0, 3, + 0, 0, 15, 128, 2, 0, + 228, 176, 0, 8, 228, 160, + 4, 0, 0, 4, 1, 0, + 8, 128, 0, 0, 255, 128, + 0, 0, 255, 176, 0, 0, + 0, 161, 5, 0, 0, 3, + 0, 0, 15, 128, 0, 0, + 228, 128, 0, 0, 228, 176, + 35, 0, 0, 2, 1, 0, + 1, 128, 1, 0, 255, 128, + 2, 0, 0, 3, 1, 0, + 1, 128, 1, 0, 0, 128, + 0, 0, 85, 161, 88, 0, + 0, 4, 1, 0, 15, 128, + 1, 0, 0, 128, 0, 0, + 255, 160, 0, 0, 170, 160, + 65, 0, 0, 1, 1, 0, + 15, 128, 4, 0, 0, 4, + 1, 0, 7, 128, 1, 0, + 228, 160, 0, 0, 255, 128, + 0, 0, 228, 129, 4, 0, + 0, 4, 0, 0, 7, 128, + 1, 0, 255, 176, 1, 0, + 228, 128, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 8, + 15, 128, 0, 0, 228, 128, + 255, 255, 0, 0, 83, 72, + 68, 82, 184, 1, 0, 0, + 64, 0, 0, 0, 110, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 90, 0, 0, 3, 0, 96, + 16, 0, 0, 0, 0, 0, + 88, 24, 0, 4, 0, 112, + 16, 0, 0, 0, 0, 0, + 85, 85, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 98, 16, + 0, 3, 130, 16, 16, 0, + 1, 0, 0, 0, 98, 16, + 0, 3, 50, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 104, 0, + 0, 2, 2, 0, 0, 0, + 69, 0, 0, 9, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 16, 16, 0, 2, 0, + 0, 0, 70, 126, 16, 0, + 0, 0, 0, 0, 0, 96, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 18, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 0, 0, 0, 0, 10, 128, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 56, 0, 0, 7, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 49, 0, 0, 9, 18, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 128, 129, 0, + 0, 0, 1, 0, 0, 0, + 26, 128, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 55, 0, 0, 11, 18, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 42, 128, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 49, 0, 0, 7, + 18, 0, 16, 0, 1, 0, + 0, 0, 10, 0, 16, 0, + 1, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 13, 0, 4, 3, 10, 0, + 16, 0, 1, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 9, + 114, 32, 16, 0, 0, 0, + 0, 0, 246, 31, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 96, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 80, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 8, 0, 0, + 86, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNe.pdb b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNe.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2604cec8c0479db7881e08e19910f597439cf53e GIT binary patch literal 34304 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 UVTvPv7>==rp%FnF)-8em2RP;bLI3~& literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNeNoFog.inc b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNeNoFog.inc new file mode 100644 index 0000000..4f6a542 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNeNoFog.inc @@ -0,0 +1,286 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 1 1 ( FLT, FLT, FLT, FLT) +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 // pin<0,1,2,3> + dcl t1.xy // pin<4,5> + dcl_2d s0 + +#line 128 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + texld r0, t1, s0 + mad r1.w, r0.w, t0.w, -c0.x + mul r0, r0, t0 // ::color<0,1,2,3> + mov oC0, r0 // ::PSAlphaTestEqNeNoFog<0,1,2,3> + abs r0.x, r1.w + add r0.x, r0.x, -c0.y + cmp r0, r0.x, c0.w, c0.z + texkill r0 + +// approximately 8 instruction slots used (1 texture, 7 arithmetic) +ps_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xy +dcl_output o0.xyzw +dcl_temps 2 +sample r0.xyzw, v1.xyxx, t0.xyzw, s0 +mad r1.x, r0.w, v0.w, -cb0[1].x +mul r0.xyzw, r0.xyzw, v0.xyzw +mov o0.xyzw, r0.xyzw +lt r0.x, |r1.x|, cb0[1].y +movc r0.x, r0.x, cb0[1].z, cb0[1].w +lt r0.x, r0.x, l(0.000000) +discard_nz r0.x +ret +// Approximately 0 instruction slots used +#endif + +const BYTE AlphaTestEffect_PSAlphaTestEqNeNoFog[] = +{ + 68, 88, 66, 67, 68, 196, + 239, 137, 188, 228, 35, 233, + 220, 12, 98, 97, 32, 106, + 149, 255, 1, 0, 0, 0, + 240, 4, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 8, 3, 0, 0, 108, 4, + 0, 0, 188, 4, 0, 0, + 65, 111, 110, 57, 208, 2, + 0, 0, 208, 2, 0, 0, + 0, 2, 255, 255, 156, 2, + 0, 0, 52, 0, 0, 0, + 1, 0, 40, 0, 0, 0, + 52, 0, 0, 0, 52, 0, + 1, 0, 36, 0, 0, 0, + 52, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 125, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 200, 1, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 120, 0, + 0, 0, 11, 0, 0, 0, + 124, 0, 0, 0, 3, 0, + 0, 0, 140, 1, 0, 0, + 212, 0, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 65, + 108, 112, 104, 97, 84, 101, + 115, 116, 69, 102, 102, 101, + 99, 116, 46, 102, 120, 0, + 40, 0, 0, 0, 0, 0, + 255, 255, 252, 1, 0, 0, + 0, 0, 255, 255, 8, 2, + 0, 0, 0, 0, 255, 255, + 20, 2, 0, 0, 128, 0, + 0, 0, 32, 2, 0, 0, + 130, 0, 0, 0, 48, 2, + 0, 0, 128, 0, 0, 0, + 68, 2, 0, 0, 128, 0, + 0, 0, 84, 2, 0, 0, + 130, 0, 0, 0, 96, 2, + 0, 0, 130, 0, 0, 0, + 108, 2, 0, 0, 130, 0, + 0, 0, 124, 2, 0, 0, + 130, 0, 0, 0, 144, 2, + 0, 0, 80, 83, 65, 108, + 112, 104, 97, 84, 101, 115, + 116, 69, 113, 78, 101, 78, + 111, 70, 111, 103, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 99, 111, 108, 111, 114, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 112, 105, 110, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 84, 101, 120, 67, 111, 111, + 114, 100, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 48, 1, + 0, 0, 16, 1, 0, 0, + 56, 1, 0, 0, 68, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 84, 1, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 1, 0, 0, 0, 4, 0, + 5, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 212, 0, + 0, 0, 236, 0, 0, 0, + 1, 0, 0, 0, 252, 0, + 0, 0, 0, 0, 0, 0, + 8, 1, 0, 0, 16, 1, + 0, 0, 1, 0, 0, 0, + 32, 1, 0, 0, 212, 0, + 0, 0, 44, 1, 0, 0, + 100, 1, 0, 0, 2, 0, + 0, 0, 116, 1, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 15, 176, 31, 0, + 0, 2, 0, 0, 0, 128, + 1, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 66, 0, + 0, 3, 0, 0, 15, 128, + 1, 0, 228, 176, 0, 8, + 228, 160, 4, 0, 0, 4, + 1, 0, 8, 128, 0, 0, + 255, 128, 0, 0, 255, 176, + 0, 0, 0, 161, 5, 0, + 0, 3, 0, 0, 15, 128, + 0, 0, 228, 128, 0, 0, + 228, 176, 1, 0, 0, 2, + 0, 8, 15, 128, 0, 0, + 228, 128, 35, 0, 0, 2, + 0, 0, 1, 128, 1, 0, + 255, 128, 2, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 0, 128, 0, 0, 85, 161, + 88, 0, 0, 4, 0, 0, + 15, 128, 0, 0, 0, 128, + 0, 0, 255, 160, 0, 0, + 170, 160, 65, 0, 0, 1, + 0, 0, 15, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 92, 1, 0, 0, 64, 0, + 0, 0, 87, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 90, 0, + 0, 3, 0, 96, 16, 0, + 0, 0, 0, 0, 88, 24, + 0, 4, 0, 112, 16, 0, + 0, 0, 0, 0, 85, 85, + 0, 0, 98, 16, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 98, 16, 0, 3, + 50, 16, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 104, 0, 0, 2, + 2, 0, 0, 0, 69, 0, + 0, 9, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 16, + 16, 0, 1, 0, 0, 0, + 70, 126, 16, 0, 0, 0, + 0, 0, 0, 96, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 18, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 58, 16, 16, 0, 0, 0, + 0, 0, 10, 128, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, + 49, 0, 0, 9, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 128, 129, 0, + 0, 0, 1, 0, 0, 0, + 26, 128, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 55, 0, 0, 11, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 42, 128, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 49, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 13, 0, 4, 3, 10, 0, + 16, 0, 0, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 72, 0, 0, 0, + 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 62, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 3, 3, + 0, 0, 67, 79, 76, 79, + 82, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 171, + 79, 83, 71, 78, 44, 0, + 0, 0, 1, 0, 0, 0, + 8, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 83, 86, + 95, 84, 97, 114, 103, 101, + 116, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNeNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestEqNeNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..5287a6ceea1d5905f6f118ada324a10855fd485a GIT binary patch literal 34304 zcmeHQU2GiJb-qhUHbsdtM#I4@G}bAV7e)O$;;%3?v2oV6;Kez9g0V`(Rl8 z&i$FWGo0C7{z)b^S2~=Td(WJE?z!ild*{wMv)9VSM$N7*Hu-pB{Dl|zwcG@MF+MQR z+w)W^$B??je>RTOmtvH`SW+IMzxzM}-@F&4hgkwIDINakVHUze-1bB0e-5~y^ngS` zr;h-rEK2)Z0tfbY^P<+Zk-+cA2V6vscmrn7i8J@W|J()?PFq0jhyphUeukgztlAX%)$;`D(9$5J)K?nD0Y+Xkt zokK1BT6$*uDymFg&P--daWb1qfb>KrpG7@<0_RCVVmdjK&y3%gOwRD>8#B{WxpbWJ zMcH_*{(7UlwA|$V#WVbx`%F`7)N74Gvs|mjd9qUB0?FnL%eES8R>`HX+-%lI6N#l- zd_~_KFVg~kEN&L-}#)d{-dU@z&QK!12*suysE52fvs^SK#dj3W(VU<>k zqS^!wg-UHHVHZ~F6)RykYsK3O*5aa7Y}&m&^e=C%H&+|hQ0l^BrB-N;yvkJ$9|faJ zWxHuL`kMo1Ug_fFNh&4D#YNj{_7{Z-QiesMCoA>kLf*2Ql@WTLjDDO0|e`j7{mm;w4M?5N;m1NyKReSL(_)f$!3Y}vXq-KhPlpZW-)zX_m! z&y=gh%4*5tr*h54YLU#d9ba5uK4lh-*H%_AugGk=3u9^4YBa5NZZ8)~R%4XkD%j;B zCYjmX)M~T7+RU%>*_5J%su0^TB8KYL_=RXNDT|psB*>Fn^ImITVAd4 z#oCgm>De0k%WS{MXfFhL-~Et;sL5&RPKskq>P3-;jYlY^JZ6ioFlLJ+{!hG4kXi~k zDZ9YWO0^NA*pXz1I%5jy9PdPfW{W-@3K!caRExGJ!0Gb3RdK9M#j@?hl30&6U>#QK zg@(l!SF1&_{_X9N%S%4(TA<11m1h66V}_WcKShAXU3-E?vp+`WJ%>I~O zpvL7ov|lYp&v6iNEXEmrR$MF1aFn4~DcAe^%;zXVp?!aHQe zBs0l+z4AJ2i6kOx&DE{qYNgPK8+c0XL{+%iwN;xCo1urn;*$#K$WW@;9uZ`R0sSh5{RDv)Z6d9uv6q;X7e&VK5*N8MxiNEUSeS>9xnV-xPB;*^Sr*I=~2wD-kWEO z9p6q188t(S#UEXdVq0NyY9@quetq-AhiK^`pHD`4K7Dh1YHB7m5L&@j_z$gO^DWG- zY`%rVJX>q56e>b|S=x%33~63=Wh>1KroWZ8ZKeO()E+APAmz-iQox}^{vQbcX$z-1d}v2%GD)*59tn=qizmtydE9E5Efb)6`#7a?FL;@rxNsV?eF%@ z3Chzp58oke8}bf?-ELdpbag+QILs9b)W@zG4DYfSFuC~Ev8|}v*sV^a=Hd*Qt@S9z zR!02LZVma}VmMu0yH=<_h%OlBs9Qe$Y^MvGH=^H9l6b_zCv5&Um~v)sS7D6N>@G9Zqp^3ZcT+;yR0SSO?yp8q3mzNo zX={j$_6^ry!x1EE4?BLj8x1oR)5DN!8$3*V7z$y!qlu*hruX!W5!AkxQ$d>%pht+O z1I&(eXEaYgx+pE5gq&g0&b|k+>DCddPA*DkY_zf3L0pV*XWHD9xo`}MVXs|bYCE{o zJGon<7w!M!Kjaar_w5OE1ySsx1OT z_a%txiA3Z(3XB5qMovslmQ%H^OR}gshHfXZNU1zivKGr#i-)*3@p*6agi912r^lcc z@OM(((f0iK@@nz++N^yfa@?1WUsu5Ugv0B|&h#d3)XlLFqha z&lkusqzT_a=`BqJx5Z%2eN6_Rz3uTPEr50l+#X+YT#_H*_IN5f{)nveSv~UVe7LY?~CiWQ{$MgWw)f{T6}iT1y*Jn_y42qYXu-gQ+* zI6BSXMB|?R+{D1|9+k8Rm&(la6I^KA3v<7c`O-C8OWTo@Fjr?vS|EQ4< zRd(?EjC=~6(R5B2`6rP7i{Skb5WdPT1howTLDK!YP+7HJ1%9hUb##Tajq-!qM)^T) zqkMnc;^39yfV!DjV7FpLlo3BNs`wy#7dbH|qtA6d@gwtp2WL`7girkFd@XCrCw_GP zQQ&vM68#sBR|Rc^D8;@t^35Or^}@wR7vpm;E`0gwpGtet7yFAZzxUf`-|7BC{_Jo=GE7Cso#oj%A?EOnW>H5d_);@l2E&KK@#y$kC{{T>m;om%s6QsuhKL&gO@D~27 zBl}HUe+Ad-$o@=~tE1o-Wp5GRg!2J_@YRtW1bwe3Y)saoAYjtE4xJmTX5mLFr zPC%}QU=<%@DO9FHrw&W^AlQQpI*#PJZDHjWbSf56v403~#>NYCQ$CBVG6ivH{e z2^{&(U`&icbn-DkH}vT!yLXTJ{@%R64dmB)mQ*pMcnZet1{s zcOk!9<_}T+S$5#@-jkpwlu12Nu@CQ3UJQACOgnb5yU(*jC+Yq!fr}HQCoxZ`U>Wg@ zL^Lr=Jq~sm+4>&#!`ucybwk_hjy#%nUL_0uwS>f4O@w=Ojb`+B% zhNm0I6c)xLcRJKgj%32OLA6uyZK5WzgGMbCTTj~7U=wINL2hQiQWVuCwkS91j431| zyg^4QDwiK`9Gp*wqNuJYs>>O`%2bI*4tEn6dT07GjN%PMi(oiI5A|-nHz-ajpm)hZ z(QJDmJg!3lwTVQ6J=-XnD5^^vIj^#{k!4GDb2dHPa5*_Q-bZ!Y{iv?acci25Og!-K zO!z19mfm4eoYB_8P+SKVpSKyUQkCfy?^5Yn`Jd2yCniGm23pBJiZh}JcL>H2opvM> zqI06CoZ?W~2TONr9lTW@94?JGj&}W@Uk~(cbA9fhK?v*DFOxSRsuAtvEIhHII3v9a zwZR8l%a-I6B5FhJ!p6Ld($cNX`EpDYXXHvOK&DZgk^1tGSW^03l(e6Vu#!RU(pslG zjXv@F1v?&3WYgNXSUL!y4yghCs~=HZCmH|X^I7yM^&O_I$ivVyVGM)f1YL{Usmwf% z)&3sR9pG`9)?QSi@p_h_7!*T59wBzn4Z5N&aqaK+%?ZlWHV@w+ZR^M#oHTBW+TrPu zkeT&abL*7+|oehj?RZOk*7=1;yW%nDTgYNYkIK!YCcN!)~yMgLS zFRTmPumI|S;Hq0Pt}F2LpV7zdEAUu5zwC7%du+6)t`HmTX|N$KM=8VF>tV+)ccWpZ zVtN>IZG(qt4?`hLcQmmCb&`+iz-O`h$@_L@jG*>KaYpzeX3GaM=T$))tG$!v!m&4o zy>`dDwu75+29CB~ANba*Sh8*mhfpiodKBU#zMx7$Mp1~*Ms4tUP$=&TvJ>7I7z8H4 z^&txJv2+yBo(}O5j?z9?pX<0L-#GHSCx86!0LY*I8vyc^|KT(EgEW6k9_eq}U?CSZ zI@>1_KxkL)YHG&uYYu7_mu}8MMN!@!mjM0V*HecRchSe}1iV>)8Aq}kNp+-ig6Gr` zhdrAfn6s{Sq~C_*-g54RI0E!8S(%zN8DfXOLKD>=4#6n`Ro?_RJABNgJ z3cqmrbwK(H4_f+F3`S)~QTB+)m8I%)@a!`v>qQyG4fLsUCrWtlifmtT-pZO#KhxZ> zuNoXR#v=iA@i8?tsk?uxkNx@Ak0U~C8CV=}4)A{fou0tS&*}?xr1b$MijCvGwPF`& zeNRoid6dhDB7rXc1O+*=YOQLyDACz2N`N~3&f&or_2FZz$LW8H@#BC8+5hMNCVrRr zq7w$WaSZ3k7m%_4}Wvfu9gRd{|wqu|yTWCTOz+KGBg_w&?e*ZdLGGhB9LjvEX*1 zxWk|O5OwVUY2Vj6c8aX=!43KZ0&Sm=gnymHi$v=xQqMO5hXIu6Czam=5H11TcM3pD zBue-FXH_YVnFD?goL>SwhOtAjo|O8|GWH`J>6;Ant%VQ3{Y!Y3xkQCX{eTqk$wvGd zfJWCv0BtQ%Z2B00o)10^poV@1K+loS15N|ze){YTs$nkxh|YOH9FPDE00sd=fMEcA zU*hKhzW{g<@L2!}j)Y6XJOTi#h+m|bPqJq++>|`% sC3_n1a{vzb9Dq88I*{b?GGG*N0f2DveUmQjo0dcki6jt7V6zhVe^kiSLjV8( literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGt.inc b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGt.inc new file mode 100644 index 0000000..91f040a --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGt.inc @@ -0,0 +1,331 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float w +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 1 2 ( FLT, FLT, FLT, FLT) +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 // pin<0,1,2,3> + dcl t1 // pin<4,5,6,7> + dcl t2.xy // pin<8,9> + dcl_2d s0 + +#line 91 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + texld r0, t2, s0 + mad r1.w, r0.w, t0.w, -c0.x + mul r0, r0, t0 // ::color<0,1,2,3> + cmp r1, r1.w, c0.w, c0.z + texkill r1 + +#line 20 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r1.xyz, c1, r0.w, -r0 + mad r0.xyz, t1.w, r1, r0 // ApplyFog::color<0,1,2> + mov oC0, r0 // ::PSAlphaTestLtGt<0,1,2,3> + +// approximately 8 instruction slots used (1 texture, 7 arithmetic) +ps_4_0 +dcl_constantbuffer CB0[3], immediateIndexed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.w +dcl_input_ps linear v2.xy +dcl_output o0.xyzw +dcl_temps 2 +sample r0.xyzw, v2.xyxx, t0.xyzw, s0 +mul r0.xyzw, r0.xyzw, v0.xyzw +lt r1.x, r0.w, cb0[1].x +movc r1.x, r1.x, cb0[1].z, cb0[1].w +lt r1.x, r1.x, l(0.000000) +discard_nz r1.x +mad r1.xyz, cb0[2].xyzx, r0.wwww, -r0.xyzx +mad o0.xyz, v1.wwww, r1.xyzx, r0.xyzx +mov o0.w, r0.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE AlphaTestEffect_PSAlphaTestLtGt[] = +{ + 68, 88, 66, 67, 3, 69, + 176, 46, 18, 126, 71, 88, + 168, 156, 30, 41, 255, 175, + 92, 82, 1, 0, 0, 0, + 220, 5, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 176, 3, 0, 0, 64, 5, + 0, 0, 168, 5, 0, 0, + 65, 111, 110, 57, 120, 3, + 0, 0, 120, 3, 0, 0, + 0, 2, 255, 255, 68, 3, + 0, 0, 52, 0, 0, 0, + 1, 0, 40, 0, 0, 0, + 52, 0, 0, 0, 52, 0, + 1, 0, 36, 0, 0, 0, + 52, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 161, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 88, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 192, 0, + 0, 0, 12, 0, 0, 0, + 200, 0, 0, 0, 4, 0, + 0, 0, 8, 2, 0, 0, + 40, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 65, + 108, 112, 104, 97, 84, 101, + 115, 116, 69, 102, 102, 101, + 99, 116, 46, 102, 120, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 40, 0, 0, 0, 120, 0, + 0, 0, 0, 0, 255, 255, + 140, 2, 0, 0, 0, 0, + 255, 255, 152, 2, 0, 0, + 0, 0, 255, 255, 164, 2, + 0, 0, 0, 0, 255, 255, + 176, 2, 0, 0, 91, 0, + 0, 0, 188, 2, 0, 0, + 93, 0, 0, 0, 204, 2, + 0, 0, 91, 0, 0, 0, + 224, 2, 0, 0, 93, 0, + 0, 0, 240, 2, 0, 0, + 93, 0, 0, 0, 4, 3, + 0, 0, 20, 0, 1, 0, + 12, 3, 0, 0, 20, 0, + 1, 0, 32, 3, 0, 0, + 20, 0, 1, 0, 52, 3, + 0, 0, 80, 83, 65, 108, + 112, 104, 97, 84, 101, 115, + 116, 76, 116, 71, 116, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 65, 112, + 112, 108, 121, 70, 111, 103, + 0, 99, 111, 108, 111, 114, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 6, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 112, 105, 110, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 84, 101, 120, + 67, 111, 111, 114, 100, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 144, 1, 0, 0, 100, 1, + 0, 0, 152, 1, 0, 0, + 100, 1, 0, 0, 161, 1, + 0, 0, 172, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 10, 0, 1, 0, 3, 0, + 188, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 1, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 7, 0, 2, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 40, 1, 0, 0, + 56, 1, 0, 0, 1, 0, + 0, 0, 72, 1, 0, 0, + 84, 1, 0, 0, 93, 1, + 0, 0, 100, 1, 0, 0, + 1, 0, 0, 0, 116, 1, + 0, 0, 0, 0, 0, 0, + 93, 1, 0, 0, 100, 1, + 0, 0, 1, 0, 0, 0, + 128, 1, 0, 0, 40, 1, + 0, 0, 140, 1, 0, 0, + 212, 1, 0, 0, 3, 0, + 0, 0, 228, 1, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 15, 176, 31, 0, + 0, 2, 0, 0, 0, 128, + 1, 0, 15, 176, 31, 0, + 0, 2, 0, 0, 0, 128, + 2, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 66, 0, + 0, 3, 0, 0, 15, 128, + 2, 0, 228, 176, 0, 8, + 228, 160, 4, 0, 0, 4, + 1, 0, 8, 128, 0, 0, + 255, 128, 0, 0, 255, 176, + 0, 0, 0, 161, 5, 0, + 0, 3, 0, 0, 15, 128, + 0, 0, 228, 128, 0, 0, + 228, 176, 88, 0, 0, 4, + 1, 0, 15, 128, 1, 0, + 255, 128, 0, 0, 255, 160, + 0, 0, 170, 160, 65, 0, + 0, 1, 1, 0, 15, 128, + 4, 0, 0, 4, 1, 0, + 7, 128, 1, 0, 228, 160, + 0, 0, 255, 128, 0, 0, + 228, 129, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 255, 176, 1, 0, 228, 128, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 8, 15, 128, + 0, 0, 228, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 136, 1, 0, 0, 64, 0, + 0, 0, 98, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 90, 0, + 0, 3, 0, 96, 16, 0, + 0, 0, 0, 0, 88, 24, + 0, 4, 0, 112, 16, 0, + 0, 0, 0, 0, 85, 85, + 0, 0, 98, 16, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 98, 16, 0, 3, + 130, 16, 16, 0, 1, 0, + 0, 0, 98, 16, 0, 3, + 50, 16, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 104, 0, 0, 2, + 2, 0, 0, 0, 69, 0, + 0, 9, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 16, + 16, 0, 2, 0, 0, 0, + 70, 126, 16, 0, 0, 0, + 0, 0, 0, 96, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 49, 0, 0, 8, + 18, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 10, 128, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 55, 0, + 0, 11, 18, 0, 16, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 42, 128, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 49, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 13, 0, + 4, 3, 10, 0, 16, 0, + 1, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 50, 0, 0, 9, 114, 32, + 16, 0, 0, 0, 0, 0, + 246, 31, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 54, 0, 0, 5, 130, 32, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 96, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 80, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 8, 0, 0, 86, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 3, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 171, 79, 83, 71, 78, + 44, 0, 0, 0, 1, 0, + 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 83, 86, 95, 84, 97, 114, + 103, 101, 116, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGt.pdb b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGt.pdb new file mode 100644 index 0000000000000000000000000000000000000000..6f5a925f40845d7912aa38bd8c463d903057ef3c GIT binary patch literal 34304 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 + dcl t1.xy // pin<4,5> + dcl_2d s0 + +#line 104 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + texld r0, t1, s0 + mad r1.w, r0.w, t0.w, -c0.x + mul r0, r0, t0 // ::color<0,1,2,3> + mov oC0, r0 // ::PSAlphaTestLtGtNoFog<0,1,2,3> + cmp r0, r1.w, c0.w, c0.z + texkill r0 + +// approximately 6 instruction slots used (1 texture, 5 arithmetic) +ps_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xy +dcl_output o0.xyzw +dcl_temps 2 +sample r0.xyzw, v1.xyxx, t0.xyzw, s0 +mul r0.xyzw, r0.xyzw, v0.xyzw +lt r1.x, r0.w, cb0[1].x +mov o0.xyzw, r0.xyzw +movc r0.x, r1.x, cb0[1].z, cb0[1].w +lt r0.x, r0.x, l(0.000000) +discard_nz r0.x +ret +// Approximately 0 instruction slots used +#endif + +const BYTE AlphaTestEffect_PSAlphaTestLtGtNoFog[] = +{ + 68, 88, 66, 67, 125, 5, + 186, 50, 61, 255, 179, 75, + 244, 88, 246, 174, 40, 196, + 165, 195, 1, 0, 0, 0, + 148, 4, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 220, 2, 0, 0, 16, 4, + 0, 0, 96, 4, 0, 0, + 65, 111, 110, 57, 164, 2, + 0, 0, 164, 2, 0, 0, + 0, 2, 255, 255, 112, 2, + 0, 0, 52, 0, 0, 0, + 1, 0, 40, 0, 0, 0, + 52, 0, 0, 0, 52, 0, + 1, 0, 36, 0, 0, 0, + 52, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 121, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 184, 1, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 120, 0, + 0, 0, 9, 0, 0, 0, + 124, 0, 0, 0, 3, 0, + 0, 0, 124, 1, 0, 0, + 196, 0, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 65, + 108, 112, 104, 97, 84, 101, + 115, 116, 69, 102, 102, 101, + 99, 116, 46, 102, 120, 0, + 40, 0, 0, 0, 0, 0, + 255, 255, 236, 1, 0, 0, + 0, 0, 255, 255, 248, 1, + 0, 0, 0, 0, 255, 255, + 4, 2, 0, 0, 104, 0, + 0, 0, 16, 2, 0, 0, + 106, 0, 0, 0, 32, 2, + 0, 0, 104, 0, 0, 0, + 52, 2, 0, 0, 104, 0, + 0, 0, 68, 2, 0, 0, + 106, 0, 0, 0, 80, 2, + 0, 0, 106, 0, 0, 0, + 100, 2, 0, 0, 80, 83, + 65, 108, 112, 104, 97, 84, + 101, 115, 116, 76, 116, 71, + 116, 78, 111, 70, 111, 103, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 99, 111, 108, 111, + 114, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 112, 105, 110, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 84, 101, 120, 67, + 111, 111, 114, 100, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 32, 1, 0, 0, 0, 1, + 0, 0, 40, 1, 0, 0, + 52, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 6, 0, + 1, 0, 2, 0, 68, 1, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 1, 0, 0, 0, + 4, 0, 5, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 196, 0, 0, 0, 220, 0, + 0, 0, 1, 0, 0, 0, + 236, 0, 0, 0, 0, 0, + 0, 0, 248, 0, 0, 0, + 0, 1, 0, 0, 1, 0, + 0, 0, 16, 1, 0, 0, + 196, 0, 0, 0, 28, 1, + 0, 0, 84, 1, 0, 0, + 2, 0, 0, 0, 100, 1, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 31, 0, 0, 2, 0, 0, + 0, 128, 0, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 1, 0, 3, 176, + 31, 0, 0, 2, 0, 0, + 0, 144, 0, 8, 15, 160, + 66, 0, 0, 3, 0, 0, + 15, 128, 1, 0, 228, 176, + 0, 8, 228, 160, 4, 0, + 0, 4, 1, 0, 8, 128, + 0, 0, 255, 128, 0, 0, + 255, 176, 0, 0, 0, 161, + 5, 0, 0, 3, 0, 0, + 15, 128, 0, 0, 228, 128, + 0, 0, 228, 176, 1, 0, + 0, 2, 0, 8, 15, 128, + 0, 0, 228, 128, 88, 0, + 0, 4, 0, 0, 15, 128, + 1, 0, 255, 128, 0, 0, + 255, 160, 0, 0, 170, 160, + 65, 0, 0, 1, 0, 0, + 15, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 44, 1, + 0, 0, 64, 0, 0, 0, + 75, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 90, 0, 0, 3, + 0, 96, 16, 0, 0, 0, + 0, 0, 88, 24, 0, 4, + 0, 112, 16, 0, 0, 0, + 0, 0, 85, 85, 0, 0, + 98, 16, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 98, 16, 0, 3, 50, 16, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 104, 0, 0, 2, 2, 0, + 0, 0, 69, 0, 0, 9, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 16, 16, 0, + 1, 0, 0, 0, 70, 126, + 16, 0, 0, 0, 0, 0, + 0, 96, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 49, 0, 0, 8, 18, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 10, 128, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 5, + 242, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 55, 0, + 0, 11, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 42, 128, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 49, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 13, 0, + 4, 3, 10, 0, 16, 0, + 0, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 72, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 62, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 3, 3, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGtNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_PSAlphaTestLtGtNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..1010b5f5d2c01446be61f39f94cf618ed5c48f65 GIT binary patch literal 34304 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 + dcl_texcoord1 v1 // vin<4,5> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c5 // ::VSAlphaTest<12> + +#line 14 + dp4 r0.x, v0, c2 + max r0.x, r0.x, c7.x + min oT1.w, r0.x, c7.y // ::VSAlphaTest<7> + +#line 49 + dp4 r0.x, v0, c3 // ::vout<0> + dp4 r0.y, v0, c4 // ::vout<1> + dp4 r0.z, v0, c6 // ::vout<3> + +#line 31 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSAlphaTest<10,11> + mov oPos.w, r0.z // ::VSAlphaTest<13> + +#line 50 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT0, c1 // ::VSAlphaTest<0,1,2,3> + mov oT1.xyz, c7.x // ::VSAlphaTest<4,5,6> + +#line 38 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mov oT2.xy, v1 // ::VSAlphaTest<8,9> + +// approximately 12 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[8], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +mov o0.xyzw, cb0[0].xyzw +dp4_sat o1.w, v0.xyzw, cb0[3].xyzw +mov o1.xyz, l(0,0,0,0) +mov o2.xy, v1.xyxx +dp4 o3.x, v0.xyzw, cb0[4].xyzw +dp4 o3.y, v0.xyzw, cb0[5].xyzw +dp4 o3.z, v0.xyzw, cb0[6].xyzw +dp4 o3.w, v0.xyzw, cb0[7].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE AlphaTestEffect_VSAlphaTest[] = +{ + 68, 88, 66, 67, 149, 237, + 230, 158, 255, 251, 158, 37, + 226, 181, 230, 53, 161, 36, + 45, 210, 1, 0, 0, 0, + 252, 6, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 188, 4, 0, 0, 24, 6, + 0, 0, 112, 6, 0, 0, + 65, 111, 110, 57, 132, 4, + 0, 0, 132, 4, 0, 0, + 0, 2, 254, 255, 68, 4, + 0, 0, 64, 0, 0, 0, + 2, 0, 36, 0, 0, 0, + 60, 0, 0, 0, 60, 0, + 0, 0, 36, 0, 1, 0, + 60, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 5, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 213, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 40, 3, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 192, 0, + 0, 0, 15, 0, 0, 0, + 200, 0, 0, 0, 3, 0, + 0, 0, 236, 2, 0, 0, + 64, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 65, + 108, 112, 104, 97, 84, 101, + 115, 116, 69, 102, 102, 101, + 99, 116, 46, 102, 120, 0, + 40, 0, 0, 0, 112, 0, + 0, 0, 0, 0, 255, 255, + 92, 3, 0, 0, 0, 0, + 255, 255, 116, 3, 0, 0, + 0, 0, 255, 255, 128, 3, + 0, 0, 49, 0, 0, 0, + 140, 3, 0, 0, 14, 0, + 0, 0, 156, 3, 0, 0, + 14, 0, 0, 0, 172, 3, + 0, 0, 14, 0, 0, 0, + 188, 3, 0, 0, 49, 0, + 0, 0, 204, 3, 0, 0, + 49, 0, 0, 0, 220, 3, + 0, 0, 49, 0, 0, 0, + 236, 3, 0, 0, 31, 0, + 1, 0, 252, 3, 0, 0, + 31, 0, 1, 0, 16, 4, + 0, 0, 50, 0, 0, 0, + 28, 4, 0, 0, 51, 0, + 0, 0, 40, 4, 0, 0, + 38, 0, 1, 0, 52, 4, + 0, 0, 86, 83, 65, 108, + 112, 104, 97, 84, 101, 115, + 116, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 84, + 101, 120, 67, 111, 111, 114, + 100, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 80, 83, + 0, 171, 76, 1, 0, 0, + 84, 1, 0, 0, 100, 1, + 0, 0, 84, 1, 0, 0, + 109, 1, 0, 0, 120, 1, + 0, 0, 136, 1, 0, 0, + 84, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 14, 0, + 1, 0, 4, 0, 148, 1, + 0, 0, 3, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 6, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 10, 0, 0, 0, + 10, 0, 11, 0, 255, 255, + 255, 255, 11, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 13, 0, 12, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 13, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 14, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171, 171, 171, + 28, 2, 0, 0, 84, 1, + 0, 0, 109, 1, 0, 0, + 120, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 6, 0, + 1, 0, 2, 0, 40, 2, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 255, 255, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 101, 2, + 0, 0, 84, 1, 0, 0, + 76, 1, 0, 0, 84, 1, + 0, 0, 100, 1, 0, 0, + 108, 2, 0, 0, 124, 2, + 0, 0, 136, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 152, 2, 0, 0, 7, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 8, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 9, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 64, 1, 0, 0, + 180, 1, 0, 0, 7, 0, + 0, 0, 196, 1, 0, 0, + 64, 1, 0, 0, 24, 2, + 0, 0, 56, 2, 0, 0, + 2, 0, 0, 0, 72, 2, + 0, 0, 0, 0, 0, 0, + 96, 2, 0, 0, 184, 2, + 0, 0, 3, 0, 0, 0, + 200, 2, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 7, 0, 15, 160, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 5, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 7, 0, + 0, 160, 10, 0, 0, 3, + 1, 0, 8, 224, 0, 0, + 0, 128, 7, 0, 85, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 4, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 6, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 15, 224, 1, 0, + 228, 160, 1, 0, 0, 2, + 1, 0, 7, 224, 7, 0, + 0, 160, 1, 0, 0, 2, + 2, 0, 3, 224, 1, 0, + 228, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 84, 1, + 0, 0, 64, 0, 1, 0, + 85, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 8, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 50, 16, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 2, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 6, 242, 32, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 54, 0, 0, 8, + 114, 32, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 50, 32, 16, 0, + 2, 0, 0, 0, 70, 16, + 16, 0, 1, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 7, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 80, 0, + 0, 0, 2, 0, 0, 0, + 8, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 3, 3, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 171, 171, 171, 79, 83, + 71, 78, 132, 0, 0, 0, + 4, 0, 0, 0, 8, 0, + 0, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 104, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 12, + 0, 0, 119, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 15, 0, + 0, 0, 67, 79, 76, 79, + 82, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 83, + 86, 95, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTest.pdb b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTest.pdb new file mode 100644 index 0000000000000000000000000000000000000000..31efe8394e3e05ec550ed45192e398e3c5ef22b8 GIT binary patch literal 36352 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 sL3|c41i-5o*d+kHlw%mM+tbzE-T|L~Ujn`ad + dcl_texcoord1 v1 // vin<4,5> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c4 // ::VSAlphaTestNoFog<8> + dp4 r0.x, v0, c2 // ::vout<0> + dp4 r0.y, v0, c3 // ::vout<1> + dp4 r0.z, v0, c5 // ::vout<3> + +#line 45 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSAlphaTestNoFog<6,7> + mov oPos.w, r0.z // ::VSAlphaTestNoFog<9> + +#line 50 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT0, c1 // ::VSAlphaTestNoFog<0,1,2,3> + +#line 52 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mov oT1.xy, v1 // ::VSAlphaTestNoFog<4,5> + +// approximately 8 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[8], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_output o0.xyzw +dcl_output o1.xy +dcl_output_siv o2.xyzw, position +mov o0.xyzw, cb0[0].xyzw +mov o1.xy, v1.xyxx +dp4 o2.x, v0.xyzw, cb0[4].xyzw +dp4 o2.y, v0.xyzw, cb0[5].xyzw +dp4 o2.z, v0.xyzw, cb0[6].xyzw +dp4 o2.w, v0.xyzw, cb0[7].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE AlphaTestEffect_VSAlphaTestNoFog[] = +{ + 68, 88, 66, 67, 186, 231, + 94, 126, 212, 151, 1, 66, + 13, 251, 222, 21, 253, 183, + 92, 106, 1, 0, 0, 0, + 8, 6, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 44, 4, 0, 0, 60, 5, + 0, 0, 148, 5, 0, 0, + 65, 111, 110, 57, 244, 3, + 0, 0, 244, 3, 0, 0, + 0, 2, 254, 255, 180, 3, + 0, 0, 64, 0, 0, 0, + 2, 0, 36, 0, 0, 0, + 60, 0, 0, 0, 60, 0, + 0, 0, 36, 0, 1, 0, + 60, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 198, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 236, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 192, 0, + 0, 0, 10, 0, 0, 0, + 200, 0, 0, 0, 3, 0, + 0, 0, 176, 2, 0, 0, + 24, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 65, + 108, 112, 104, 97, 84, 101, + 115, 116, 69, 102, 102, 101, + 99, 116, 46, 102, 120, 0, + 40, 0, 0, 0, 112, 0, + 0, 0, 0, 0, 255, 255, + 32, 3, 0, 0, 0, 0, + 255, 255, 44, 3, 0, 0, + 49, 0, 0, 0, 56, 3, + 0, 0, 49, 0, 0, 0, + 72, 3, 0, 0, 49, 0, + 0, 0, 88, 3, 0, 0, + 49, 0, 0, 0, 104, 3, + 0, 0, 45, 0, 1, 0, + 120, 3, 0, 0, 45, 0, + 1, 0, 140, 3, 0, 0, + 50, 0, 0, 0, 152, 3, + 0, 0, 52, 0, 1, 0, + 164, 3, 0, 0, 86, 83, + 65, 108, 112, 104, 97, 84, + 101, 115, 116, 78, 111, 70, + 111, 103, 0, 68, 105, 102, + 102, 117, 115, 101, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 67, 111, 111, + 114, 100, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 41, 1, + 0, 0, 52, 1, 0, 0, + 68, 1, 0, 0, 80, 1, + 0, 0, 96, 1, 0, 0, + 52, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 10, 0, + 1, 0, 3, 0, 108, 1, + 0, 0, 2, 0, 0, 0, + 255, 255, 255, 255, 8, 0, + 255, 255, 6, 0, 0, 0, + 6, 0, 7, 0, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 9, 0, 8, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 9, 0, 0, 0, + 4, 0, 5, 0, 255, 255, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171, 171, 171, + 212, 1, 0, 0, 52, 1, + 0, 0, 68, 1, 0, 0, + 80, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 6, 0, + 1, 0, 2, 0, 224, 1, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 1, 0, 0, 0, + 4, 0, 5, 0, 255, 255, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 29, 2, + 0, 0, 52, 1, 0, 0, + 41, 1, 0, 0, 52, 1, + 0, 0, 36, 2, 0, 0, + 48, 2, 0, 0, 64, 2, + 0, 0, 76, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 92, 2, 0, 0, 3, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 4, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 5, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 24, 1, 0, 0, + 132, 1, 0, 0, 5, 0, + 0, 0, 148, 1, 0, 0, + 24, 1, 0, 0, 208, 1, + 0, 0, 240, 1, 0, 0, + 2, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, + 24, 2, 0, 0, 124, 2, + 0, 0, 3, 0, 0, 0, + 140, 2, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 4, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 5, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 15, 224, 1, 0, + 228, 160, 1, 0, 0, 2, + 1, 0, 3, 224, 1, 0, + 228, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 8, 1, + 0, 0, 64, 0, 1, 0, + 66, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 8, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 50, 16, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 1, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 6, 242, 32, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 1, 0, 0, 0, + 70, 16, 16, 0, 1, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 80, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 3, 3, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 171, 171, + 79, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 86, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 3, 12, 0, 0, 95, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..907e92ff6e3428c3aa163f7d07d7479dc507881d GIT binary patch literal 36352 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 WAml$pAVeTUAVeTUAVi>L1pXgQ(GJM~ literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVc.inc b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVc.inc new file mode 100644 index 0000000..9c7b832 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVc.inc @@ -0,0 +1,413 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// COLOR 0 xyzw 2 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c2 cb0 3 5 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c7, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5> + dcl_texcoord2 v2 // vin<6,7,8,9> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c5 // ::VSAlphaTestVc<12> + +#line 14 + dp4 r0.x, v0, c2 + max r0.x, r0.x, c7.x + min oT1.w, r0.x, c7.y // ::VSAlphaTestVc<7> + +#line 67 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mul oT0, v2, c1 // ::VSAlphaTestVc<0,1,2,3> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c3 // ::vout<0> + dp4 r0.y, v0, c4 // ::vout<1> + dp4 r0.z, v0, c6 // ::vout<3> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSAlphaTestVc<10,11> + mov oPos.w, r0.z // ::VSAlphaTestVc<13> + +#line 51 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT1.xyz, c7.x // ::VSAlphaTestVc<4,5,6> + +#line 66 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mov oT2.xy, v1 // ::VSAlphaTestVc<8,9> + +// approximately 12 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[8], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +mul o0.xyzw, v2.xyzw, cb0[0].xyzw +dp4_sat o1.w, v0.xyzw, cb0[3].xyzw +mov o1.xyz, l(0,0,0,0) +mov o2.xy, v1.xyxx +dp4 o3.x, v0.xyzw, cb0[4].xyzw +dp4 o3.y, v0.xyzw, cb0[5].xyzw +dp4 o3.z, v0.xyzw, cb0[6].xyzw +dp4 o3.w, v0.xyzw, cb0[7].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE AlphaTestEffect_VSAlphaTestVc[] = +{ + 68, 88, 66, 67, 248, 163, + 203, 249, 0, 143, 149, 224, + 15, 104, 144, 45, 227, 103, + 73, 30, 1, 0, 0, 0, + 96, 7, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 240, 4, 0, 0, 96, 6, + 0, 0, 212, 6, 0, 0, + 65, 111, 110, 57, 184, 4, + 0, 0, 184, 4, 0, 0, + 0, 2, 254, 255, 120, 4, + 0, 0, 64, 0, 0, 0, + 2, 0, 36, 0, 0, 0, + 60, 0, 0, 0, 60, 0, + 0, 0, 36, 0, 1, 0, + 60, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 5, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 222, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 76, 3, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 192, 0, + 0, 0, 16, 0, 0, 0, + 200, 0, 0, 0, 3, 0, + 0, 0, 16, 3, 0, 0, + 72, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 65, + 108, 112, 104, 97, 84, 101, + 115, 116, 69, 102, 102, 101, + 99, 116, 46, 102, 120, 0, + 40, 0, 0, 0, 112, 0, + 0, 0, 0, 0, 255, 255, + 128, 3, 0, 0, 0, 0, + 255, 255, 152, 3, 0, 0, + 0, 0, 255, 255, 164, 3, + 0, 0, 0, 0, 255, 255, + 176, 3, 0, 0, 49, 0, + 0, 0, 188, 3, 0, 0, + 14, 0, 0, 0, 204, 3, + 0, 0, 14, 0, 0, 0, + 220, 3, 0, 0, 14, 0, + 0, 0, 236, 3, 0, 0, + 67, 0, 1, 0, 252, 3, + 0, 0, 49, 0, 0, 0, + 12, 4, 0, 0, 49, 0, + 0, 0, 28, 4, 0, 0, + 49, 0, 0, 0, 44, 4, + 0, 0, 59, 0, 1, 0, + 60, 4, 0, 0, 59, 0, + 1, 0, 80, 4, 0, 0, + 51, 0, 0, 0, 92, 4, + 0, 0, 66, 0, 1, 0, + 104, 4, 0, 0, 86, 83, + 65, 108, 112, 104, 97, 84, + 101, 115, 116, 86, 99, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 84, + 101, 120, 67, 111, 111, 114, + 100, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 80, 83, + 0, 171, 86, 1, 0, 0, + 96, 1, 0, 0, 112, 1, + 0, 0, 96, 1, 0, 0, + 121, 1, 0, 0, 132, 1, + 0, 0, 148, 1, 0, 0, + 96, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 14, 0, + 1, 0, 4, 0, 160, 1, + 0, 0, 4, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 7, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 8, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 12, 0, 0, 0, + 10, 0, 11, 0, 255, 255, + 255, 255, 13, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 13, 0, 14, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 15, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 67, 111, 108, + 111, 114, 0, 171, 40, 2, + 0, 0, 96, 1, 0, 0, + 121, 1, 0, 0, 132, 1, + 0, 0, 49, 2, 0, 0, + 96, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 10, 0, + 1, 0, 3, 0, 56, 2, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 255, 255, + 255, 255, 3, 0, 0, 0, + 6, 0, 7, 0, 8, 0, + 9, 0, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 137, 2, + 0, 0, 96, 1, 0, 0, + 86, 1, 0, 0, 96, 1, + 0, 0, 112, 1, 0, 0, + 144, 2, 0, 0, 160, 2, + 0, 0, 172, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 188, 2, 0, 0, 9, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 10, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 11, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 72, 1, 0, 0, + 192, 1, 0, 0, 7, 0, + 0, 0, 208, 1, 0, 0, + 72, 1, 0, 0, 36, 2, + 0, 0, 80, 2, 0, 0, + 3, 0, 0, 0, 96, 2, + 0, 0, 0, 0, 0, 0, + 132, 2, 0, 0, 220, 2, + 0, 0, 3, 0, 0, 0, + 236, 2, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 7, 0, 15, 160, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 5, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 7, 0, + 0, 160, 10, 0, 0, 3, + 1, 0, 8, 224, 0, 0, + 0, 128, 7, 0, 85, 160, + 5, 0, 0, 3, 0, 0, + 15, 224, 2, 0, 228, 144, + 1, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 4, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 6, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 1, 0, + 7, 224, 7, 0, 0, 160, + 1, 0, 0, 2, 2, 0, + 3, 224, 1, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 104, 1, 0, 0, + 64, 0, 1, 0, 90, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 8, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 2, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 8, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 54, 0, 0, 8, + 114, 32, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 50, 32, 16, 0, + 2, 0, 0, 0, 70, 16, + 16, 0, 1, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 7, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 3, 3, 0, 0, 101, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 15, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 67, 79, 76, 79, 82, + 0, 171, 79, 83, 71, 78, + 132, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 104, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 12, 0, 0, + 119, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVc.pdb b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d25f60fd65ddc1aad5012c1daf73f4b2c0cb289c GIT binary patch literal 36352 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 + dcl_texcoord1 v1 // vin<4,5> + dcl_texcoord2 v2 // vin<6,7,8,9> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c4 // ::VSAlphaTestVcNoFog<8> + +#line 82 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mul oT0, v2, c1 // ::VSAlphaTestVcNoFog<0,1,2,3> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 // ::vout<0> + dp4 r0.y, v0, c3 // ::vout<1> + dp4 r0.z, v0, c5 // ::vout<3> + +#line 74 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\AlphaTestEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSAlphaTestVcNoFog<6,7> + mov oPos.w, r0.z // ::VSAlphaTestVcNoFog<9> + +#line 81 + mov oT1.xy, v1 // ::VSAlphaTestVcNoFog<4,5> + +// approximately 8 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[8], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xy +dcl_output_siv o2.xyzw, position +mul o0.xyzw, v2.xyzw, cb0[0].xyzw +mov o1.xy, v1.xyxx +dp4 o2.x, v0.xyzw, cb0[4].xyzw +dp4 o2.y, v0.xyzw, cb0[5].xyzw +dp4 o2.z, v0.xyzw, cb0[6].xyzw +dp4 o2.w, v0.xyzw, cb0[7].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE AlphaTestEffect_VSAlphaTestVcNoFog[] = +{ + 68, 88, 66, 67, 99, 59, + 33, 25, 194, 141, 79, 92, + 27, 175, 10, 183, 59, 213, + 206, 32, 1, 0, 0, 0, + 104, 6, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 92, 4, 0, 0, 128, 5, + 0, 0, 244, 5, 0, 0, + 65, 111, 110, 57, 36, 4, + 0, 0, 36, 4, 0, 0, + 0, 2, 254, 255, 228, 3, + 0, 0, 64, 0, 0, 0, + 2, 0, 36, 0, 0, 0, + 60, 0, 0, 0, 60, 0, + 0, 0, 36, 0, 1, 0, + 60, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 206, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 12, 3, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 192, 0, + 0, 0, 11, 0, 0, 0, + 200, 0, 0, 0, 3, 0, + 0, 0, 208, 2, 0, 0, + 32, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 65, + 108, 112, 104, 97, 84, 101, + 115, 116, 69, 102, 102, 101, + 99, 116, 46, 102, 120, 0, + 40, 0, 0, 0, 112, 0, + 0, 0, 0, 0, 255, 255, + 64, 3, 0, 0, 0, 0, + 255, 255, 76, 3, 0, 0, + 0, 0, 255, 255, 88, 3, + 0, 0, 49, 0, 0, 0, + 100, 3, 0, 0, 82, 0, + 1, 0, 116, 3, 0, 0, + 49, 0, 0, 0, 132, 3, + 0, 0, 49, 0, 0, 0, + 148, 3, 0, 0, 49, 0, + 0, 0, 164, 3, 0, 0, + 74, 0, 1, 0, 180, 3, + 0, 0, 74, 0, 1, 0, + 200, 3, 0, 0, 81, 0, + 1, 0, 212, 3, 0, 0, + 86, 83, 65, 108, 112, 104, + 97, 84, 101, 115, 116, 86, + 99, 78, 111, 70, 111, 103, + 0, 68, 105, 102, 102, 117, + 115, 101, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 84, 101, 120, 67, + 111, 111, 114, 100, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 51, 1, 0, 0, 60, 1, + 0, 0, 76, 1, 0, 0, + 88, 1, 0, 0, 104, 1, + 0, 0, 60, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 10, 0, 1, 0, 3, 0, + 116, 1, 0, 0, 3, 0, + 0, 0, 255, 255, 255, 255, + 8, 0, 255, 255, 4, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 8, 0, + 0, 0, 6, 0, 7, 0, + 255, 255, 255, 255, 9, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 9, 0, 10, 0, + 0, 0, 4, 0, 5, 0, + 255, 255, 255, 255, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 67, + 111, 108, 111, 114, 0, 171, + 220, 1, 0, 0, 60, 1, + 0, 0, 76, 1, 0, 0, + 88, 1, 0, 0, 229, 1, + 0, 0, 60, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 10, 0, 1, 0, 3, 0, + 236, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 1, 0, + 0, 0, 4, 0, 5, 0, + 255, 255, 255, 255, 2, 0, + 0, 0, 6, 0, 7, 0, + 8, 0, 9, 0, 118, 111, + 117, 116, 0, 80, 111, 115, + 95, 112, 115, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 70, 111, 103, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 61, 2, 0, 0, 60, 1, + 0, 0, 51, 1, 0, 0, + 60, 1, 0, 0, 68, 2, + 0, 0, 80, 2, 0, 0, + 96, 2, 0, 0, 108, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 4, 0, 124, 2, 0, 0, + 5, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 6, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 7, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 0, 0, 0, 0, 32, 1, + 0, 0, 140, 1, 0, 0, + 5, 0, 0, 0, 156, 1, + 0, 0, 32, 1, 0, 0, + 216, 1, 0, 0, 4, 2, + 0, 0, 3, 0, 0, 0, + 20, 2, 0, 0, 0, 0, + 0, 0, 56, 2, 0, 0, + 156, 2, 0, 0, 3, 0, + 0, 0, 172, 2, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 4, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 15, 224, 2, 0, + 228, 144, 1, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 5, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 1, 0, 3, 224, 1, 0, + 228, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 28, 1, + 0, 0, 64, 0, 1, 0, + 71, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 8, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 50, 16, 16, 0, 1, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 1, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 56, 0, 0, 8, 242, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 50, 32, 16, 0, 1, 0, + 0, 0, 70, 16, 16, 0, + 1, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 5, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 7, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 108, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 3, 3, + 0, 0, 101, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 15, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 67, + 79, 76, 79, 82, 0, 171, + 79, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 86, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 3, 12, 0, 0, 95, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVcNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/AlphaTestEffect_VSAlphaTestVcNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ec0827c127b73037df26329ca1bdf0222ae293de GIT binary patch literal 36352 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasic.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasic.inc new file mode 100644 index 0000000..d0d2e8a --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasic.inc @@ -0,0 +1,219 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float w +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 13 1 ( FLT, FLT, FLT, FLT) +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 // pin<0,1,2,3> + dcl t1 // pin<4,5,6,7> + +#line 20 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, c0, t0.w, -t0 + mov r1.xyz, t0 // pin<0,1,2> + mad r0.xyz, t1.w, r0, r1 // ApplyFog::color<0,1,2> + mov r0.w, t0.w + mov oC0, r0 // ::PSBasic<0,1,2,3> + +// approximately 5 instruction slots used +ps_4_0 +dcl_constantbuffer CB0[14], immediateIndexed +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.w +dcl_output o0.xyzw +dcl_temps 1 +mad r0.xyz, cb0[13].xyzx, v0.wwww, -v0.xyzx +mad o0.xyz, v1.wwww, r0.xyzx, v0.xyzx +mov o0.w, v0.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasic[] = +{ + 68, 88, 66, 67, 145, 72, + 125, 168, 185, 197, 217, 65, + 137, 65, 247, 206, 159, 131, + 15, 237, 1, 0, 0, 0, + 200, 3, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 152, 2, 0, 0, 76, 3, + 0, 0, 148, 3, 0, 0, + 65, 111, 110, 57, 96, 2, + 0, 0, 96, 2, 0, 0, + 0, 2, 255, 255, 48, 2, + 0, 0, 48, 0, 0, 0, + 1, 0, 36, 0, 0, 0, + 48, 0, 0, 0, 48, 0, + 0, 0, 36, 0, 0, 0, + 48, 0, 0, 0, 13, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 255, 255, + 254, 255, 112, 0, 68, 66, + 85, 71, 40, 0, 0, 0, + 148, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 112, 0, 0, 0, 7, 0, + 0, 0, 116, 0, 0, 0, + 3, 0, 0, 0, 88, 1, + 0, 0, 172, 0, 0, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 40, 0, 0, 0, 0, 0, + 255, 255, 200, 1, 0, 0, + 0, 0, 255, 255, 212, 1, + 0, 0, 20, 0, 0, 0, + 224, 1, 0, 0, 20, 0, + 0, 0, 244, 1, 0, 0, + 20, 0, 0, 0, 0, 2, + 0, 0, 20, 0, 0, 0, + 20, 2, 0, 0, 20, 0, + 0, 0, 32, 2, 0, 0, + 80, 83, 66, 97, 115, 105, + 99, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 65, 112, 112, 108, 121, 70, + 111, 103, 0, 99, 111, 108, + 111, 114, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 112, 105, 110, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 0, 1, 0, 0, + 224, 0, 0, 0, 8, 1, + 0, 0, 224, 0, 0, 0, + 5, 0, 0, 0, 1, 0, + 8, 0, 1, 0, 2, 0, + 20, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 1, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 7, 0, 3, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 0, 0, + 0, 0, 172, 0, 0, 0, + 180, 0, 0, 0, 1, 0, + 0, 0, 196, 0, 0, 0, + 208, 0, 0, 0, 217, 0, + 0, 0, 224, 0, 0, 0, + 1, 0, 0, 0, 240, 0, + 0, 0, 172, 0, 0, 0, + 252, 0, 0, 0, 36, 1, + 0, 0, 3, 0, 0, 0, + 52, 1, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 1, 0, + 15, 176, 4, 0, 0, 4, + 0, 0, 7, 128, 0, 0, + 228, 160, 0, 0, 255, 176, + 0, 0, 228, 177, 1, 0, + 0, 2, 1, 0, 7, 128, + 0, 0, 228, 176, 4, 0, + 0, 4, 0, 0, 7, 128, + 1, 0, 255, 176, 0, 0, + 228, 128, 1, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 128, 0, 0, 255, 176, + 1, 0, 0, 2, 0, 8, + 15, 128, 0, 0, 228, 128, + 255, 255, 0, 0, 83, 72, + 68, 82, 172, 0, 0, 0, + 64, 0, 0, 0, 43, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 98, 16, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 98, 16, 0, 3, 130, 16, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 104, 0, 0, 2, 1, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 13, 0, + 0, 0, 246, 31, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 50, 0, + 0, 9, 114, 32, 16, 0, + 0, 0, 0, 0, 246, 31, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 130, 32, 16, 0, + 0, 0, 0, 0, 58, 16, + 16, 0, 0, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 64, 0, 0, 0, + 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 56, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 8, + 0, 0, 67, 79, 76, 79, + 82, 0, 171, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasic.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasic.pdb new file mode 100644 index 0000000000000000000000000000000000000000..cb7d01c33431365ff02ee5e6bd286f33b76c0a0d GIT binary patch literal 62976 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicNoFog.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicNoFog.inc new file mode 100644 index 0000000..9dbc9ab --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicNoFog.inc @@ -0,0 +1,143 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 // pin<0,1,2,3> + +#line 507 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mov oC0, t0 // ::PSBasicNoFog<0,1,2,3> + +// approximately 1 instruction slot used +ps_4_0 +dcl_input_ps linear v0.xyzw +dcl_output o0.xyzw +mov o0.xyzw, v0.xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicNoFog[] = +{ + 68, 88, 66, 67, 181, 141, + 52, 249, 104, 203, 93, 96, + 195, 252, 22, 12, 12, 108, + 165, 17, 1, 0, 0, 0, + 108, 2, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 200, 1, 0, 0, 8, 2, + 0, 0, 56, 2, 0, 0, + 65, 111, 110, 57, 144, 1, + 0, 0, 144, 1, 0, 0, + 0, 2, 255, 255, 108, 1, + 0, 0, 36, 0, 0, 0, + 0, 0, 36, 0, 0, 0, + 36, 0, 0, 0, 36, 0, + 0, 0, 36, 0, 0, 0, + 36, 0, 0, 2, 255, 255, + 254, 255, 82, 0, 68, 66, + 85, 71, 40, 0, 0, 0, + 28, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 116, 0, 0, 0, 2, 0, + 0, 0, 120, 0, 0, 0, + 2, 0, 0, 0, 244, 0, + 0, 0, 136, 0, 0, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 40, 0, + 0, 0, 0, 0, 255, 255, + 80, 1, 0, 0, 251, 1, + 0, 0, 92, 1, 0, 0, + 80, 83, 66, 97, 115, 105, + 99, 78, 111, 70, 111, 103, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 112, 105, 110, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 192, 0, + 0, 0, 5, 0, 0, 0, + 1, 0, 4, 0, 1, 0, + 1, 0, 208, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 0, 0, 0, 0, 136, 0, + 0, 0, 152, 0, 0, 0, + 1, 0, 0, 0, 168, 0, + 0, 0, 136, 0, 0, 0, + 180, 0, 0, 0, 216, 0, + 0, 0, 1, 0, 0, 0, + 232, 0, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 15, 176, 1, 0, 0, 2, + 0, 8, 15, 128, 0, 0, + 228, 176, 255, 255, 0, 0, + 83, 72, 68, 82, 56, 0, + 0, 0, 64, 0, 0, 0, + 14, 0, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 40, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 67, 79, 76, 79, + 82, 0, 171, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..b5128d74b25ccbf814628f1e2b405fb101b4b6f0 GIT binary patch literal 62976 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 aNa6MIz`!mHv-R;9YB + dcl t1.xyz // pin<4,5,6> + dcl t2 // pin<7,8,9,10> + +#line 580 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + add r0.xyz, -t0, c12 + dp3 r0.w, r0, r0 + rsq r0.w, r0.w + +#line 33 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mad r1.xyz, r0, r0.w, -c3 + nrm r2.xyz, r1 // ::halfVectors<0,1,2> + +#line 581 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + nrm r1.xyz, t1 // ::worldNormal<0,1,2> + +#line 37 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r2.x, r2, r1 // ::dotH<0> + +#line 33 + mad r3.xyz, r0, r0.w, -c4 + mad r0.xyz, r0, r0.w, -c5 + nrm r4.xyz, r0 // ::halfVectors<6,7,8> + +#line 37 + dp3 r2.z, r4, r1 // ::dotH<2> + +#line 33 + nrm r0.xyz, r3 // ::halfVectors<3,4,5> + +#line 37 + dp3 r2.y, r0, r1 // ::dotH<1> + dp3 r0.x, -c3, r1 // ::dotL<0> + dp3 r0.y, -c4, r1 // ::dotL<1> + dp3 r0.z, -c5, r1 // ::dotL<2> + +#line 39 + cmp r1.xyz, r0, c14.x, c14.y // ::zeroL<0,1,2> + +#line 42 + mul r3.xyz, r1, r2 + cmp r2.xyz, r2, r3, c14.y + mul r1.xyz, r0, r1 // ::diffuse<0,1,2> + log r3.x, r2.x + log r3.y, r2.y + log r3.z, r2.z + mul r2.xyz, r3, c2.w + exp r3.x, r2.x + exp r3.y, r2.y + exp r3.z, r2.z + mul r0.xyz, r0, r3 // ::specular<0,1,2> + +#line 47 + mul r2.xyz, r0.y, c10 + mad r2.xyz, r0.x, c9, r2 + mad r0.xyz, r0.z, c11, r2 + mul r0.xyz, r0, c2 // ::result<3,4,5> + +#line 26 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mul r0.xyz, r0, t2.w + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mul r2.xyz, r1.y, c7 + mad r2.xyz, r1.x, c6, r2 + mad r1.xyz, r1.z, c8, r2 + mov r2.xyz, c0 // Parameters::DiffuseColor<0,1,2> + mad r1.xyz, r1, r2, c1 // ::result<0,1,2> + +#line 26 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, t2, r1, r0 // AddSpecular::color<0,1,2> + +#line 20 + mad r1.xyz, c13, t2.w, -r0 + mad r0.xyz, t0.w, r1, r0 // ApplyFog::color<0,1,2> + mov r0.w, t2.w + mov oC0, r0 // ::PSBasicPixelLighting<0,1,2,3> + +// approximately 51 instruction slots used +ps_4_0 +dcl_constantbuffer CB0[14], immediateIndexed +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xyz +dcl_input_ps linear v2.xyzw +dcl_output o0.xyzw +dcl_temps 4 +add r0.xyz, -v0.xyzx, cb0[12].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mad r1.xyz, r0.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r1.xyzx, r1.xyzx +rsq r1.w, r1.w +mul r1.xyz, r1.wwww, r1.xyzx +dp3 r1.w, v1.xyzx, v1.xyzx +rsq r1.w, r1.w +mul r2.xyz, r1.wwww, v1.xyzx +dp3 r1.x, r1.xyzx, r2.xyzx +mad r3.xyz, r0.xyzx, r0.wwww, -cb0[4].xyzx +mad r0.xyz, r0.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r1.y, r3.xyzx, r2.xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r1.z, r0.xyzx, r2.xyzx +max r0.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +dp3 r1.x, -cb0[3].xyzx, r2.xyzx +dp3 r1.y, -cb0[4].xyzx, r2.xyzx +dp3 r1.z, -cb0[5].xyzx, r2.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r0.xyz, r0.xyzx, r2.xyzx +mul r2.xyz, r1.xyzx, r2.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul r0.xyz, r0.xyzx, cb0[2].xyzx +mul r0.xyz, r0.xyzx, v2.wwww +mul r1.xyz, r2.yyyy, cb0[7].xyzx +mad r1.xyz, r2.xxxx, cb0[6].xyzx, r1.xyzx +mad r1.xyz, r2.zzzz, cb0[8].xyzx, r1.xyzx +mad r1.xyz, r1.xyzx, cb0[0].xyzx, cb0[1].xyzx +mad r0.xyz, v2.xyzx, r1.xyzx, r0.xyzx +mad r1.xyz, cb0[13].xyzx, v2.wwww, -r0.xyzx +mad o0.xyz, v0.wwww, r1.xyzx, r0.xyzx +mov o0.w, v2.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicPixelLighting[] = +{ + 68, 88, 66, 67, 246, 112, + 115, 104, 215, 10, 161, 255, + 46, 116, 127, 82, 111, 129, + 151, 195, 1, 0, 0, 0, + 28, 16, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 120, 9, 0, 0, 128, 15, + 0, 0, 232, 15, 0, 0, + 65, 111, 110, 57, 64, 9, + 0, 0, 64, 9, 0, 0, + 0, 2, 255, 255, 16, 9, + 0, 0, 48, 0, 0, 0, + 1, 0, 36, 0, 0, 0, + 48, 0, 0, 0, 48, 0, + 0, 0, 36, 0, 0, 0, + 48, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 255, 255, + 254, 255, 135, 1, 68, 66, + 85, 71, 40, 0, 0, 0, + 240, 5, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 8, 1, 0, 0, 47, 0, + 0, 0, 20, 1, 0, 0, + 13, 0, 0, 0, 236, 4, + 0, 0, 192, 2, 0, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 171, 171, 40, 0, 0, 0, + 116, 0, 0, 0, 190, 0, + 0, 0, 0, 0, 255, 255, + 36, 6, 0, 0, 0, 0, + 255, 255, 60, 6, 0, 0, + 0, 0, 255, 255, 72, 6, + 0, 0, 0, 0, 255, 255, + 84, 6, 0, 0, 68, 2, + 0, 0, 96, 6, 0, 0, + 68, 2, 0, 0, 112, 6, + 0, 0, 68, 2, 0, 0, + 128, 6, 0, 0, 33, 0, + 1, 0, 140, 6, 0, 0, + 33, 0, 1, 0, 160, 6, + 0, 0, 69, 2, 0, 0, + 172, 6, 0, 0, 37, 0, + 1, 0, 184, 6, 0, 0, + 33, 0, 1, 0, 200, 6, + 0, 0, 33, 0, 1, 0, + 220, 6, 0, 0, 33, 0, + 1, 0, 240, 6, 0, 0, + 37, 0, 1, 0, 252, 6, + 0, 0, 33, 0, 1, 0, + 12, 7, 0, 0, 37, 0, + 1, 0, 24, 7, 0, 0, + 36, 0, 1, 0, 40, 7, + 0, 0, 36, 0, 1, 0, + 56, 7, 0, 0, 36, 0, + 1, 0, 72, 7, 0, 0, + 39, 0, 1, 0, 88, 7, + 0, 0, 42, 0, 1, 0, + 108, 7, 0, 0, 42, 0, + 1, 0, 124, 7, 0, 0, + 41, 0, 1, 0, 144, 7, + 0, 0, 42, 0, 1, 0, + 160, 7, 0, 0, 42, 0, + 1, 0, 172, 7, 0, 0, + 42, 0, 1, 0, 184, 7, + 0, 0, 42, 0, 1, 0, + 196, 7, 0, 0, 42, 0, + 1, 0, 212, 7, 0, 0, + 42, 0, 1, 0, 224, 7, + 0, 0, 42, 0, 1, 0, + 236, 7, 0, 0, 42, 0, + 1, 0, 248, 7, 0, 0, + 47, 0, 1, 0, 8, 8, + 0, 0, 47, 0, 1, 0, + 24, 8, 0, 0, 47, 0, + 1, 0, 44, 8, 0, 0, + 47, 0, 1, 0, 64, 8, + 0, 0, 26, 0, 2, 0, + 80, 8, 0, 0, 46, 0, + 1, 0, 96, 8, 0, 0, + 46, 0, 1, 0, 112, 8, + 0, 0, 46, 0, 1, 0, + 132, 8, 0, 0, 46, 0, + 1, 0, 152, 8, 0, 0, + 46, 0, 1, 0, 164, 8, + 0, 0, 26, 0, 2, 0, + 184, 8, 0, 0, 20, 0, + 2, 0, 204, 8, 0, 0, + 20, 0, 2, 0, 224, 8, + 0, 0, 20, 0, 2, 0, + 244, 8, 0, 0, 20, 0, + 2, 0, 0, 9, 0, 0, + 80, 97, 114, 97, 109, 101, + 116, 101, 114, 115, 0, 68, + 105, 102, 102, 117, 115, 101, + 67, 111, 108, 111, 114, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 40, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 80, 83, + 66, 97, 115, 105, 99, 80, + 105, 120, 101, 108, 76, 105, + 103, 104, 116, 105, 110, 103, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 46, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 65, 112, 112, 108, + 121, 70, 111, 103, 0, 99, + 111, 108, 111, 114, 0, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 44, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 65, 100, + 100, 83, 112, 101, 99, 117, + 108, 97, 114, 0, 42, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 10, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 14, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 16, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 100, 111, 116, 76, 0, 171, + 171, 171, 17, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 18, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 19, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 13, 0, 0, 0, 6, 0, + 7, 0, 8, 0, 255, 255, + 15, 0, 0, 0, 3, 0, + 4, 0, 5, 0, 255, 255, + 112, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 87, 83, 0, 78, 111, 114, + 109, 97, 108, 87, 83, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 248, 3, 0, 0, + 4, 3, 0, 0, 3, 4, + 0, 0, 64, 3, 0, 0, + 12, 4, 0, 0, 4, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 11, 0, 1, 0, + 3, 0, 20, 4, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 9, 0, 10, 0, + 114, 101, 115, 117, 108, 116, + 0, 83, 112, 101, 99, 117, + 108, 97, 114, 0, 12, 4, + 0, 0, 64, 3, 0, 0, + 103, 4, 0, 0, 64, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 112, 4, 0, 0, + 35, 0, 0, 0, 3, 0, + 4, 0, 5, 0, 255, 255, + 41, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 115, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 31, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 97, 108, 0, + 9, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 122, 101, 114, 111, 76, 0, + 171, 171, 20, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 140, 2, 0, 0, + 151, 2, 0, 0, 164, 2, + 0, 0, 1, 0, 0, 0, + 180, 2, 0, 0, 0, 0, + 0, 0, 192, 2, 0, 0, + 216, 2, 0, 0, 1, 0, + 0, 0, 232, 2, 0, 0, + 244, 2, 0, 0, 253, 2, + 0, 0, 4, 3, 0, 0, + 1, 0, 0, 0, 20, 3, + 0, 0, 32, 3, 0, 0, + 253, 2, 0, 0, 4, 3, + 0, 0, 1, 0, 0, 0, + 44, 3, 0, 0, 0, 0, + 0, 0, 56, 3, 0, 0, + 64, 3, 0, 0, 1, 0, + 0, 0, 80, 3, 0, 0, + 0, 0, 0, 0, 92, 3, + 0, 0, 64, 3, 0, 0, + 3, 0, 0, 0, 100, 3, + 0, 0, 0, 0, 0, 0, + 136, 3, 0, 0, 64, 3, + 0, 0, 3, 0, 0, 0, + 144, 3, 0, 0, 0, 0, + 0, 0, 180, 3, 0, 0, + 192, 3, 0, 0, 3, 0, + 0, 0, 208, 3, 0, 0, + 192, 2, 0, 0, 244, 3, + 0, 0, 44, 4, 0, 0, + 3, 0, 0, 0, 60, 4, + 0, 0, 0, 0, 0, 0, + 96, 4, 0, 0, 128, 4, + 0, 0, 2, 0, 0, 0, + 144, 4, 0, 0, 0, 0, + 0, 0, 168, 4, 0, 0, + 64, 3, 0, 0, 1, 0, + 0, 0, 180, 4, 0, 0, + 0, 0, 0, 0, 192, 4, + 0, 0, 64, 3, 0, 0, + 1, 0, 0, 0, 204, 4, + 0, 0, 0, 0, 0, 0, + 216, 4, 0, 0, 64, 3, + 0, 0, 1, 0, 0, 0, + 224, 4, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 14, 0, 15, 160, 0, 0, + 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 1, 0, + 7, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 2, 0, + 15, 176, 2, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 228, 177, 12, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 8, 128, 0, 0, 228, 128, + 0, 0, 228, 128, 7, 0, + 0, 2, 0, 0, 8, 128, + 0, 0, 255, 128, 4, 0, + 0, 4, 1, 0, 7, 128, + 0, 0, 228, 128, 0, 0, + 255, 128, 3, 0, 228, 161, + 36, 0, 0, 2, 2, 0, + 7, 128, 1, 0, 228, 128, + 36, 0, 0, 2, 1, 0, + 7, 128, 1, 0, 228, 176, + 8, 0, 0, 3, 2, 0, + 1, 128, 2, 0, 228, 128, + 1, 0, 228, 128, 4, 0, + 0, 4, 3, 0, 7, 128, + 0, 0, 228, 128, 0, 0, + 255, 128, 4, 0, 228, 161, + 4, 0, 0, 4, 0, 0, + 7, 128, 0, 0, 228, 128, + 0, 0, 255, 128, 5, 0, + 228, 161, 36, 0, 0, 2, + 4, 0, 7, 128, 0, 0, + 228, 128, 8, 0, 0, 3, + 2, 0, 4, 128, 4, 0, + 228, 128, 1, 0, 228, 128, + 36, 0, 0, 2, 0, 0, + 7, 128, 3, 0, 228, 128, + 8, 0, 0, 3, 2, 0, + 2, 128, 0, 0, 228, 128, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 1, 128, + 3, 0, 228, 161, 1, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 2, 128, 4, 0, + 228, 161, 1, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 4, 128, 5, 0, 228, 161, + 1, 0, 228, 128, 88, 0, + 0, 4, 1, 0, 7, 128, + 0, 0, 228, 128, 14, 0, + 0, 160, 14, 0, 85, 160, + 5, 0, 0, 3, 3, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 88, 0, + 0, 4, 2, 0, 7, 128, + 2, 0, 228, 128, 3, 0, + 228, 128, 14, 0, 85, 160, + 5, 0, 0, 3, 1, 0, + 7, 128, 0, 0, 228, 128, + 1, 0, 228, 128, 15, 0, + 0, 2, 3, 0, 1, 128, + 2, 0, 0, 128, 15, 0, + 0, 2, 3, 0, 2, 128, + 2, 0, 85, 128, 15, 0, + 0, 2, 3, 0, 4, 128, + 2, 0, 170, 128, 5, 0, + 0, 3, 2, 0, 7, 128, + 3, 0, 228, 128, 2, 0, + 255, 160, 14, 0, 0, 2, + 3, 0, 1, 128, 2, 0, + 0, 128, 14, 0, 0, 2, + 3, 0, 2, 128, 2, 0, + 85, 128, 14, 0, 0, 2, + 3, 0, 4, 128, 2, 0, + 170, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 228, 128, 3, 0, 228, 128, + 5, 0, 0, 3, 2, 0, + 7, 128, 0, 0, 85, 128, + 10, 0, 228, 160, 4, 0, + 0, 4, 2, 0, 7, 128, + 0, 0, 0, 128, 9, 0, + 228, 160, 2, 0, 228, 128, + 4, 0, 0, 4, 0, 0, + 7, 128, 0, 0, 170, 128, + 11, 0, 228, 160, 2, 0, + 228, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 228, 128, 2, 0, 228, 160, + 5, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 228, 128, + 2, 0, 255, 176, 5, 0, + 0, 3, 2, 0, 7, 128, + 1, 0, 85, 128, 7, 0, + 228, 160, 4, 0, 0, 4, + 2, 0, 7, 128, 1, 0, + 0, 128, 6, 0, 228, 160, + 2, 0, 228, 128, 4, 0, + 0, 4, 1, 0, 7, 128, + 1, 0, 170, 128, 8, 0, + 228, 160, 2, 0, 228, 128, + 1, 0, 0, 2, 2, 0, + 7, 128, 0, 0, 228, 160, + 4, 0, 0, 4, 1, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 1, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 128, 2, 0, + 228, 176, 1, 0, 228, 128, + 0, 0, 228, 128, 4, 0, + 0, 4, 1, 0, 7, 128, + 13, 0, 228, 160, 2, 0, + 255, 176, 0, 0, 228, 129, + 4, 0, 0, 4, 0, 0, + 7, 128, 0, 0, 255, 176, + 1, 0, 228, 128, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 128, 2, 0, + 255, 176, 1, 0, 0, 2, + 0, 8, 15, 128, 0, 0, + 228, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 0, 6, + 0, 0, 64, 0, 0, 0, + 128, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 98, 16, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 98, 16, 0, 3, + 114, 16, 16, 0, 1, 0, + 0, 0, 98, 16, 0, 3, + 242, 16, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 104, 0, 0, 2, + 4, 0, 0, 0, 0, 0, + 0, 9, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 1, 0, 0, 0, + 246, 15, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 1, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 2, 0, 0, 0, 246, 15, + 16, 0, 1, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 7, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 52, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 18, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 9, 34, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 9, 66, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 29, 0, 0, 10, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 10, 114, 0, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 47, 0, + 0, 5, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 246, 143, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 25, 0, 0, 5, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 1, 0, + 0, 0, 86, 5, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 50, 0, + 0, 10, 178, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 136, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 70, 8, 16, 0, 1, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 166, 10, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 70, 3, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 246, 31, + 16, 0, 2, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 1, 0, 0, 0, + 86, 5, 16, 0, 2, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 7, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 1, 0, + 0, 0, 6, 0, 16, 0, + 2, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 50, 0, 0, 10, 114, 0, + 16, 0, 1, 0, 0, 0, + 166, 10, 16, 0, 2, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 8, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 50, 0, 0, 9, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 13, 0, 0, 0, + 246, 31, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 9, + 114, 32, 16, 0, 0, 0, + 0, 0, 246, 31, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 2, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 96, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 80, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 89, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 15, 0, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 67, 79, 76, + 79, 82, 0, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLighting.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLighting.pdb new file mode 100644 index 0000000000000000000000000000000000000000..9fb39a07bcbc16488bf61c303ff5147a5cd93aae GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLightingTx.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLightingTx.inc new file mode 100644 index 0000000..47d5413 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLightingTx.inc @@ -0,0 +1,922 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// TEXCOORD 0 xy 0 NONE float xy +// TEXCOORD 1 xyzw 1 NONE float xyzw +// TEXCOORD 2 xyz 2 NONE float xyz +// COLOR 0 xyzw 3 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 0 14 ( FLT, FLT, FLT, FLT) +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_0 + def c14, 1, 0, 0, 0 + dcl t0.xyz // pin<0,1> + dcl t1 // pin<2,3,4,5> + dcl t2.xyz // pin<6,7,8> + dcl t3 // pin<9,10,11,12> + dcl_2d s0 + +#line 597 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + texld r0, t0, s0 + add r1.xyz, -t1, c12 + dp3 r1.w, r1, r1 + rsq r1.w, r1.w + +#line 33 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mad r2.xyz, r1, r1.w, -c3 + nrm r3.xyz, r2 // ::halfVectors<0,1,2> + +#line 600 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + nrm r2.xyz, t2 // ::worldNormal<0,1,2> + +#line 37 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r3.x, r3, r2 // ::dotH<0> + +#line 33 + mad r4.xyz, r1, r1.w, -c4 + mad r1.xyz, r1, r1.w, -c5 + nrm r5.xyz, r1 // ::halfVectors<6,7,8> + +#line 37 + dp3 r3.z, r5, r2 // ::dotH<2> + +#line 33 + nrm r1.xyz, r4 // ::halfVectors<3,4,5> + +#line 37 + dp3 r3.y, r1, r2 // ::dotH<1> + dp3 r1.x, -c3, r2 // ::dotL<0> + dp3 r1.y, -c4, r2 // ::dotL<1> + dp3 r1.z, -c5, r2 // ::dotL<2> + +#line 39 + cmp r2.xyz, r1, c14.x, c14.y // ::zeroL<0,1,2> + +#line 42 + mul r4.xyz, r2, r3 + cmp r3.xyz, r3, r4, c14.y + mul r2.xyz, r1, r2 // ::diffuse<0,1,2> + log r4.x, r3.x + log r4.y, r3.y + log r4.z, r3.z + mul r3.xyz, r4, c2.w + exp r4.x, r3.x + exp r4.y, r3.y + exp r4.z, r3.z + mul r1.xyz, r1, r4 // ::specular<0,1,2> + +#line 47 + mul r3.xyz, r1.y, c10 + mad r3.xyz, r1.x, c9, r3 + mad r1.xyz, r1.z, c11, r3 + mul r1.xyz, r1, c2 // ::result<3,4,5> + +#line 597 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul r0, r0, t3 // ::color<0,1,2,3> + +#line 26 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mul r1.xyz, r0.w, r1 + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mul r3.xyz, r2.y, c7 + mad r3.xyz, r2.x, c6, r3 + mad r2.xyz, r2.z, c8, r3 + mov r3.xyz, c0 // Parameters::DiffuseColor<0,1,2> + mad r2.xyz, r2, r3, c1 // ::result<0,1,2> + +#line 26 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r1.xyz, r0, r2, r1 // AddSpecular::color<0,1,2> + +#line 20 + mad r2.xyz, c13, r0.w, -r1 + mad r0.xyz, t1.w, r2, r1 // ApplyFog::color<0,1,2> + mov oC0, r0 // ::PSBasicPixelLightingTx<0,1,2,3> + +// approximately 52 instruction slots used (1 texture, 51 arithmetic) +ps_4_0 +dcl_constantbuffer CB0[14], immediateIndexed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xy +dcl_input_ps linear v1.xyzw +dcl_input_ps linear v2.xyz +dcl_input_ps linear v3.xyzw +dcl_output o0.xyzw +dcl_temps 4 +add r0.xyz, -v1.xyzx, cb0[12].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mad r1.xyz, r0.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r1.xyzx, r1.xyzx +rsq r1.w, r1.w +mul r1.xyz, r1.wwww, r1.xyzx +dp3 r1.w, v2.xyzx, v2.xyzx +rsq r1.w, r1.w +mul r2.xyz, r1.wwww, v2.xyzx +dp3 r1.x, r1.xyzx, r2.xyzx +mad r3.xyz, r0.xyzx, r0.wwww, -cb0[4].xyzx +mad r0.xyz, r0.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r1.y, r3.xyzx, r2.xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r1.z, r0.xyzx, r2.xyzx +max r0.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +dp3 r1.x, -cb0[3].xyzx, r2.xyzx +dp3 r1.y, -cb0[4].xyzx, r2.xyzx +dp3 r1.z, -cb0[5].xyzx, r2.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r0.xyz, r0.xyzx, r2.xyzx +mul r2.xyz, r1.xyzx, r2.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul r0.xyz, r0.xyzx, cb0[2].xyzx +sample r1.xyzw, v0.xyxx, t0.xyzw, s0 +mul r1.xyzw, r1.xyzw, v3.xyzw +mul r0.xyz, r0.xyzx, r1.wwww +mul r3.xyz, r2.yyyy, cb0[7].xyzx +mad r2.xyw, r2.xxxx, cb0[6].xyxz, r3.xyxz +mad r2.xyz, r2.zzzz, cb0[8].xyzx, r2.xywx +mad r2.xyz, r2.xyzx, cb0[0].xyzx, cb0[1].xyzx +mad r0.xyz, r1.xyzx, r2.xyzx, r0.xyzx +mad r1.xyz, cb0[13].xyzx, r1.wwww, -r0.xyzx +mad o0.xyz, v1.wwww, r1.xyzx, r0.xyzx +mov o0.w, r1.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicPixelLightingTx[] = +{ + 68, 88, 66, 67, 28, 31, + 63, 118, 174, 186, 222, 46, + 17, 25, 144, 155, 31, 175, + 202, 30, 1, 0, 0, 0, + 52, 17, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 16, 10, 0, 0, 128, 16, + 0, 0, 0, 17, 0, 0, + 65, 111, 110, 57, 216, 9, + 0, 0, 216, 9, 0, 0, + 0, 2, 255, 255, 164, 9, + 0, 0, 52, 0, 0, 0, + 1, 0, 40, 0, 0, 0, + 52, 0, 0, 0, 52, 0, + 1, 0, 36, 0, 0, 0, + 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 161, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 88, 6, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 50, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 64, 5, 0, 0, + 216, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 67, 58, 92, 85, + 115, 101, 114, 115, 92, 67, + 104, 117, 99, 107, 87, 92, + 68, 101, 115, 107, 116, 111, + 112, 92, 68, 51, 68, 49, + 49, 32, 80, 114, 111, 106, + 101, 99, 116, 115, 92, 68, + 105, 114, 101, 99, 116, 88, + 84, 75, 92, 83, 114, 99, + 92, 83, 104, 97, 100, 101, + 114, 115, 92, 76, 105, 103, + 104, 116, 105, 110, 103, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 171, 171, + 40, 0, 0, 0, 116, 0, + 0, 0, 190, 0, 0, 0, + 0, 0, 255, 255, 140, 6, + 0, 0, 0, 0, 255, 255, + 164, 6, 0, 0, 0, 0, + 255, 255, 176, 6, 0, 0, + 0, 0, 255, 255, 188, 6, + 0, 0, 0, 0, 255, 255, + 200, 6, 0, 0, 0, 0, + 255, 255, 212, 6, 0, 0, + 85, 2, 0, 0, 224, 6, + 0, 0, 87, 2, 0, 0, + 240, 6, 0, 0, 87, 2, + 0, 0, 0, 7, 0, 0, + 87, 2, 0, 0, 16, 7, + 0, 0, 33, 0, 1, 0, + 28, 7, 0, 0, 33, 0, + 1, 0, 48, 7, 0, 0, + 88, 2, 0, 0, 60, 7, + 0, 0, 37, 0, 1, 0, + 72, 7, 0, 0, 33, 0, + 1, 0, 88, 7, 0, 0, + 33, 0, 1, 0, 108, 7, + 0, 0, 33, 0, 1, 0, + 128, 7, 0, 0, 37, 0, + 1, 0, 140, 7, 0, 0, + 33, 0, 1, 0, 156, 7, + 0, 0, 37, 0, 1, 0, + 168, 7, 0, 0, 36, 0, + 1, 0, 184, 7, 0, 0, + 36, 0, 1, 0, 200, 7, + 0, 0, 36, 0, 1, 0, + 216, 7, 0, 0, 39, 0, + 1, 0, 232, 7, 0, 0, + 42, 0, 1, 0, 252, 7, + 0, 0, 42, 0, 1, 0, + 12, 8, 0, 0, 41, 0, + 1, 0, 32, 8, 0, 0, + 42, 0, 1, 0, 48, 8, + 0, 0, 42, 0, 1, 0, + 60, 8, 0, 0, 42, 0, + 1, 0, 72, 8, 0, 0, + 42, 0, 1, 0, 84, 8, + 0, 0, 42, 0, 1, 0, + 100, 8, 0, 0, 42, 0, + 1, 0, 112, 8, 0, 0, + 42, 0, 1, 0, 124, 8, + 0, 0, 42, 0, 1, 0, + 136, 8, 0, 0, 47, 0, + 1, 0, 152, 8, 0, 0, + 47, 0, 1, 0, 168, 8, + 0, 0, 47, 0, 1, 0, + 188, 8, 0, 0, 47, 0, + 1, 0, 208, 8, 0, 0, + 85, 2, 0, 0, 224, 8, + 0, 0, 26, 0, 2, 0, + 240, 8, 0, 0, 46, 0, + 1, 0, 0, 9, 0, 0, + 46, 0, 1, 0, 16, 9, + 0, 0, 46, 0, 1, 0, + 36, 9, 0, 0, 46, 0, + 1, 0, 56, 9, 0, 0, + 46, 0, 1, 0, 68, 9, + 0, 0, 26, 0, 2, 0, + 88, 9, 0, 0, 20, 0, + 2, 0, 108, 9, 0, 0, + 20, 0, 2, 0, 128, 9, + 0, 0, 20, 0, 2, 0, + 148, 9, 0, 0, 80, 97, + 114, 97, 109, 101, 116, 101, + 114, 115, 0, 68, 105, 102, + 102, 117, 115, 101, 67, 111, + 108, 111, 114, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 44, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 80, 83, 66, 97, + 115, 105, 99, 80, 105, 120, + 101, 108, 76, 105, 103, 104, + 116, 105, 110, 103, 84, 120, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 49, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 65, 112, 112, 108, 121, 70, + 111, 103, 0, 99, 111, 108, + 111, 114, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 48, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 65, 100, 100, 83, + 112, 101, 99, 117, 108, 97, + 114, 0, 46, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 39, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 100, 111, 116, 72, + 0, 171, 171, 171, 13, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 17, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 19, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 100, 111, + 116, 76, 0, 171, 171, 171, + 20, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 21, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 22, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 104, 97, 108, 102, 86, 101, + 99, 116, 111, 114, 115, 0, + 3, 0, 3, 0, 3, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 16, 0, + 0, 0, 6, 0, 7, 0, + 8, 0, 255, 255, 18, 0, + 0, 0, 3, 0, 4, 0, + 5, 0, 255, 255, 112, 105, + 110, 0, 84, 101, 120, 67, + 111, 111, 114, 100, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 87, 83, 0, 78, + 111, 114, 109, 97, 108, 87, + 83, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 28, 4, + 0, 0, 40, 4, 0, 0, + 56, 4, 0, 0, 28, 3, + 0, 0, 67, 4, 0, 0, + 100, 3, 0, 0, 76, 4, + 0, 0, 28, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 13, 0, 1, 0, 4, 0, + 84, 4, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, + 255, 255, 255, 255, 2, 0, + 0, 0, 2, 0, 3, 0, + 4, 0, 5, 0, 3, 0, + 0, 0, 6, 0, 7, 0, + 8, 0, 255, 255, 4, 0, + 0, 0, 9, 0, 10, 0, + 11, 0, 12, 0, 114, 101, + 115, 117, 108, 116, 0, 83, + 112, 101, 99, 117, 108, 97, + 114, 0, 76, 4, 0, 0, + 100, 3, 0, 0, 187, 4, + 0, 0, 100, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 6, 0, 1, 0, 2, 0, + 196, 4, 0, 0, 38, 0, + 0, 0, 3, 0, 4, 0, + 5, 0, 255, 255, 45, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 115, 112, + 101, 99, 117, 108, 97, 114, + 0, 171, 171, 171, 34, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 97, 108, 0, 12, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 122, 101, + 114, 111, 76, 0, 171, 171, + 23, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 164, 2, 0, 0, 175, 2, + 0, 0, 188, 2, 0, 0, + 1, 0, 0, 0, 204, 2, + 0, 0, 0, 0, 0, 0, + 216, 2, 0, 0, 240, 2, + 0, 0, 1, 0, 0, 0, + 0, 3, 0, 0, 12, 3, + 0, 0, 21, 3, 0, 0, + 28, 3, 0, 0, 1, 0, + 0, 0, 44, 3, 0, 0, + 56, 3, 0, 0, 21, 3, + 0, 0, 28, 3, 0, 0, + 1, 0, 0, 0, 68, 3, + 0, 0, 0, 0, 0, 0, + 21, 3, 0, 0, 28, 3, + 0, 0, 1, 0, 0, 0, + 80, 3, 0, 0, 0, 0, + 0, 0, 92, 3, 0, 0, + 100, 3, 0, 0, 1, 0, + 0, 0, 116, 3, 0, 0, + 0, 0, 0, 0, 128, 3, + 0, 0, 100, 3, 0, 0, + 3, 0, 0, 0, 136, 3, + 0, 0, 0, 0, 0, 0, + 172, 3, 0, 0, 100, 3, + 0, 0, 3, 0, 0, 0, + 180, 3, 0, 0, 0, 0, + 0, 0, 216, 3, 0, 0, + 228, 3, 0, 0, 3, 0, + 0, 0, 244, 3, 0, 0, + 216, 2, 0, 0, 24, 4, + 0, 0, 116, 4, 0, 0, + 4, 0, 0, 0, 132, 4, + 0, 0, 0, 0, 0, 0, + 180, 4, 0, 0, 212, 4, + 0, 0, 2, 0, 0, 0, + 228, 4, 0, 0, 0, 0, + 0, 0, 252, 4, 0, 0, + 100, 3, 0, 0, 1, 0, + 0, 0, 8, 5, 0, 0, + 0, 0, 0, 0, 20, 5, + 0, 0, 100, 3, 0, 0, + 1, 0, 0, 0, 32, 5, + 0, 0, 0, 0, 0, 0, + 44, 5, 0, 0, 100, 3, + 0, 0, 1, 0, 0, 0, + 52, 5, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 14, 0, 15, 160, 0, 0, + 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 7, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 1, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 2, 0, + 7, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 3, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 144, 0, 8, + 15, 160, 66, 0, 0, 3, + 0, 0, 15, 128, 0, 0, + 228, 176, 0, 8, 228, 160, + 2, 0, 0, 3, 1, 0, + 7, 128, 1, 0, 228, 177, + 12, 0, 228, 160, 8, 0, + 0, 3, 1, 0, 8, 128, + 1, 0, 228, 128, 1, 0, + 228, 128, 7, 0, 0, 2, + 1, 0, 8, 128, 1, 0, + 255, 128, 4, 0, 0, 4, + 2, 0, 7, 128, 1, 0, + 228, 128, 1, 0, 255, 128, + 3, 0, 228, 161, 36, 0, + 0, 2, 3, 0, 7, 128, + 2, 0, 228, 128, 36, 0, + 0, 2, 2, 0, 7, 128, + 2, 0, 228, 176, 8, 0, + 0, 3, 3, 0, 1, 128, + 3, 0, 228, 128, 2, 0, + 228, 128, 4, 0, 0, 4, + 4, 0, 7, 128, 1, 0, + 228, 128, 1, 0, 255, 128, + 4, 0, 228, 161, 4, 0, + 0, 4, 1, 0, 7, 128, + 1, 0, 228, 128, 1, 0, + 255, 128, 5, 0, 228, 161, + 36, 0, 0, 2, 5, 0, + 7, 128, 1, 0, 228, 128, + 8, 0, 0, 3, 3, 0, + 4, 128, 5, 0, 228, 128, + 2, 0, 228, 128, 36, 0, + 0, 2, 1, 0, 7, 128, + 4, 0, 228, 128, 8, 0, + 0, 3, 3, 0, 2, 128, + 1, 0, 228, 128, 2, 0, + 228, 128, 8, 0, 0, 3, + 1, 0, 1, 128, 3, 0, + 228, 161, 2, 0, 228, 128, + 8, 0, 0, 3, 1, 0, + 2, 128, 4, 0, 228, 161, + 2, 0, 228, 128, 8, 0, + 0, 3, 1, 0, 4, 128, + 5, 0, 228, 161, 2, 0, + 228, 128, 88, 0, 0, 4, + 2, 0, 7, 128, 1, 0, + 228, 128, 14, 0, 0, 160, + 14, 0, 85, 160, 5, 0, + 0, 3, 4, 0, 7, 128, + 2, 0, 228, 128, 3, 0, + 228, 128, 88, 0, 0, 4, + 3, 0, 7, 128, 3, 0, + 228, 128, 4, 0, 228, 128, + 14, 0, 85, 160, 5, 0, + 0, 3, 2, 0, 7, 128, + 1, 0, 228, 128, 2, 0, + 228, 128, 15, 0, 0, 2, + 4, 0, 1, 128, 3, 0, + 0, 128, 15, 0, 0, 2, + 4, 0, 2, 128, 3, 0, + 85, 128, 15, 0, 0, 2, + 4, 0, 4, 128, 3, 0, + 170, 128, 5, 0, 0, 3, + 3, 0, 7, 128, 4, 0, + 228, 128, 2, 0, 255, 160, + 14, 0, 0, 2, 4, 0, + 1, 128, 3, 0, 0, 128, + 14, 0, 0, 2, 4, 0, + 2, 128, 3, 0, 85, 128, + 14, 0, 0, 2, 4, 0, + 4, 128, 3, 0, 170, 128, + 5, 0, 0, 3, 1, 0, + 7, 128, 1, 0, 228, 128, + 4, 0, 228, 128, 5, 0, + 0, 3, 3, 0, 7, 128, + 1, 0, 85, 128, 10, 0, + 228, 160, 4, 0, 0, 4, + 3, 0, 7, 128, 1, 0, + 0, 128, 9, 0, 228, 160, + 3, 0, 228, 128, 4, 0, + 0, 4, 1, 0, 7, 128, + 1, 0, 170, 128, 11, 0, + 228, 160, 3, 0, 228, 128, + 5, 0, 0, 3, 1, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 160, 5, 0, + 0, 3, 0, 0, 15, 128, + 0, 0, 228, 128, 3, 0, + 228, 176, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 255, 128, 1, 0, 228, 128, + 5, 0, 0, 3, 3, 0, + 7, 128, 2, 0, 85, 128, + 7, 0, 228, 160, 4, 0, + 0, 4, 3, 0, 7, 128, + 2, 0, 0, 128, 6, 0, + 228, 160, 3, 0, 228, 128, + 4, 0, 0, 4, 2, 0, + 7, 128, 2, 0, 170, 128, + 8, 0, 228, 160, 3, 0, + 228, 128, 1, 0, 0, 2, + 3, 0, 7, 128, 0, 0, + 228, 160, 4, 0, 0, 4, + 2, 0, 7, 128, 2, 0, + 228, 128, 3, 0, 228, 128, + 1, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 7, 128, + 0, 0, 228, 128, 2, 0, + 228, 128, 1, 0, 228, 128, + 4, 0, 0, 4, 2, 0, + 7, 128, 13, 0, 228, 160, + 0, 0, 255, 128, 1, 0, + 228, 129, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 255, 176, 2, 0, 228, 128, + 1, 0, 228, 128, 1, 0, + 0, 2, 0, 8, 15, 128, + 0, 0, 228, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 104, 6, 0, 0, 64, 0, + 0, 0, 154, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 90, 0, + 0, 3, 0, 96, 16, 0, + 0, 0, 0, 0, 88, 24, + 0, 4, 0, 112, 16, 0, + 0, 0, 0, 0, 85, 85, + 0, 0, 98, 16, 0, 3, + 50, 16, 16, 0, 0, 0, + 0, 0, 98, 16, 0, 3, + 242, 16, 16, 0, 1, 0, + 0, 0, 98, 16, 0, 3, + 114, 16, 16, 0, 2, 0, + 0, 0, 98, 16, 0, 3, + 242, 16, 16, 0, 3, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 104, 0, 0, 2, + 4, 0, 0, 0, 0, 0, + 0, 9, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 128, 65, 0, 0, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 1, 0, 0, 0, + 246, 15, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 1, 0, 0, 0, 70, 18, + 16, 0, 2, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 2, 0, 0, 0, 246, 15, + 16, 0, 1, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 7, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 52, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 18, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 9, 34, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 9, 66, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 29, 0, 0, 10, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 10, 114, 0, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 47, 0, + 0, 5, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 246, 143, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 25, 0, 0, 5, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 1, 0, + 0, 0, 86, 5, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 50, 0, + 0, 10, 178, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 136, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 70, 8, 16, 0, 1, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 166, 10, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 70, 3, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 69, 0, 0, 9, + 242, 0, 16, 0, 1, 0, + 0, 0, 70, 16, 16, 0, + 0, 0, 0, 0, 70, 126, + 16, 0, 0, 0, 0, 0, + 0, 96, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 242, 0, 16, 0, 1, 0, + 0, 0, 70, 14, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 3, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 246, 15, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 3, 0, 0, 0, 86, 5, + 16, 0, 2, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 7, 0, 0, 0, + 50, 0, 0, 10, 178, 0, + 16, 0, 2, 0, 0, 0, + 6, 0, 16, 0, 2, 0, + 0, 0, 70, 136, 32, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 70, 8, 16, 0, + 3, 0, 0, 0, 50, 0, + 0, 10, 114, 0, 16, 0, + 2, 0, 0, 0, 166, 10, + 16, 0, 2, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 8, 0, 0, 0, + 70, 3, 16, 0, 2, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 50, 0, + 0, 9, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 246, 15, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 50, 0, 0, 9, 114, 32, + 16, 0, 0, 0, 0, 0, + 246, 31, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 54, 0, 0, 5, 130, 32, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 1, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 120, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 15, 0, 0, 104, 0, + 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 7, 7, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 15, 0, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 67, 79, 76, 79, 82, + 0, 171, 79, 83, 71, 78, + 44, 0, 0, 0, 1, 0, + 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 83, 86, 95, 84, 97, 114, + 103, 101, 116, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLightingTx.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicPixelLightingTx.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d2d85651b5e37ac85201871bc94a2ff89db450b8 GIT binary patch literal 67072 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 + dcl t1 // pin<4,5,6,7> + dcl t2.xy // pin<8,9> + dcl_2d s0 + +#line 514 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + texld r0, t2, s0 + mul r0, r0, t0 // ::color<0,1,2,3> + +#line 20 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r1.xyz, c0, r0.w, -r0 + mad r0.xyz, t1.w, r1, r0 // ApplyFog::color<0,1,2> + mov oC0, r0 // ::PSBasicTx<0,1,2,3> + +// approximately 5 instruction slots used (1 texture, 4 arithmetic) +ps_4_0 +dcl_constantbuffer CB0[14], immediateIndexed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.w +dcl_input_ps linear v2.xy +dcl_output o0.xyzw +dcl_temps 2 +sample r0.xyzw, v2.xyxx, t0.xyzw, s0 +mul r0.xyzw, r0.xyzw, v0.xyzw +mad r1.xyz, cb0[13].xyzx, r0.wwww, -r0.xyzx +mad o0.xyz, v1.wwww, r1.xyzx, r0.xyzx +mov o0.w, r0.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicTx[] = +{ + 68, 88, 66, 67, 249, 1, + 249, 65, 121, 225, 61, 207, + 49, 20, 67, 92, 169, 182, + 37, 234, 1, 0, 0, 0, + 24, 5, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 96, 3, 0, 0, 124, 4, + 0, 0, 228, 4, 0, 0, + 65, 111, 110, 57, 40, 3, + 0, 0, 40, 3, 0, 0, + 0, 2, 255, 255, 244, 2, + 0, 0, 52, 0, 0, 0, + 1, 0, 40, 0, 0, 0, + 52, 0, 0, 0, 52, 0, + 1, 0, 36, 0, 0, 0, + 52, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 153, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 56, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 9, 0, 0, 0, + 196, 0, 0, 0, 4, 0, + 0, 0, 232, 1, 0, 0, + 12, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 67, 58, 92, 85, + 115, 101, 114, 115, 92, 67, + 104, 117, 99, 107, 87, 92, + 68, 101, 115, 107, 116, 111, + 112, 92, 68, 51, 68, 49, + 49, 32, 80, 114, 111, 106, + 101, 99, 116, 115, 92, 68, + 105, 114, 101, 99, 116, 88, + 84, 75, 92, 83, 114, 99, + 92, 83, 104, 97, 100, 101, + 114, 115, 92, 67, 111, 109, + 109, 111, 110, 46, 102, 120, + 104, 0, 40, 0, 0, 0, + 116, 0, 0, 0, 0, 0, + 255, 255, 108, 2, 0, 0, + 0, 0, 255, 255, 120, 2, + 0, 0, 0, 0, 255, 255, + 132, 2, 0, 0, 0, 0, + 255, 255, 144, 2, 0, 0, + 2, 2, 0, 0, 156, 2, + 0, 0, 2, 2, 0, 0, + 172, 2, 0, 0, 20, 0, + 1, 0, 188, 2, 0, 0, + 20, 0, 1, 0, 208, 2, + 0, 0, 20, 0, 1, 0, + 228, 2, 0, 0, 80, 83, + 66, 97, 115, 105, 99, 84, + 120, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 65, 112, 112, 108, + 121, 70, 111, 103, 0, 99, + 111, 108, 111, 114, 0, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 5, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 112, 105, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 1, + 0, 0, 68, 1, 0, 0, + 120, 1, 0, 0, 68, 1, + 0, 0, 129, 1, 0, 0, + 140, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 10, 0, + 1, 0, 3, 0, 156, 1, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 1, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 2, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 0, 0, 0, 0, + 12, 1, 0, 0, 24, 1, + 0, 0, 1, 0, 0, 0, + 40, 1, 0, 0, 52, 1, + 0, 0, 61, 1, 0, 0, + 68, 1, 0, 0, 1, 0, + 0, 0, 84, 1, 0, 0, + 0, 0, 0, 0, 61, 1, + 0, 0, 68, 1, 0, 0, + 1, 0, 0, 0, 96, 1, + 0, 0, 12, 1, 0, 0, + 108, 1, 0, 0, 180, 1, + 0, 0, 3, 0, 0, 0, + 196, 1, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 1, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 2, 0, + 3, 176, 31, 0, 0, 2, + 0, 0, 0, 144, 0, 8, + 15, 160, 66, 0, 0, 3, + 0, 0, 15, 128, 2, 0, + 228, 176, 0, 8, 228, 160, + 5, 0, 0, 3, 0, 0, + 15, 128, 0, 0, 228, 128, + 0, 0, 228, 176, 4, 0, + 0, 4, 1, 0, 7, 128, + 0, 0, 228, 160, 0, 0, + 255, 128, 0, 0, 228, 129, + 4, 0, 0, 4, 0, 0, + 7, 128, 1, 0, 255, 176, + 1, 0, 228, 128, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 8, 15, 128, 0, 0, + 228, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 20, 1, + 0, 0, 64, 0, 0, 0, + 69, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 90, 0, 0, 3, + 0, 96, 16, 0, 0, 0, + 0, 0, 88, 24, 0, 4, + 0, 112, 16, 0, 0, 0, + 0, 0, 85, 85, 0, 0, + 98, 16, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 98, 16, 0, 3, 130, 16, + 16, 0, 1, 0, 0, 0, + 98, 16, 0, 3, 50, 16, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 104, 0, 0, 2, 2, 0, + 0, 0, 69, 0, 0, 9, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 16, 16, 0, + 2, 0, 0, 0, 70, 126, + 16, 0, 0, 0, 0, 0, + 0, 96, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 13, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 9, + 114, 32, 16, 0, 0, 0, + 0, 0, 246, 31, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 96, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 80, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 8, 0, 0, + 86, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTx.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTx.pdb new file mode 100644 index 0000000000000000000000000000000000000000..7ce4a7721bf06bc98853c33b2cff1bfdcc9d8701 GIT binary patch literal 65024 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTxNoFog.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTxNoFog.inc new file mode 100644 index 0000000..84b9106 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTxNoFog.inc @@ -0,0 +1,206 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 // pin<0,1,2,3> + dcl t1.xy // pin<4,5> + dcl_2d s0 + +#line 525 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + texld r0, t1, s0 + mul r0, r0, t0 // ::PSBasicTxNoFog<0,1,2,3> + mov oC0, r0 // ::PSBasicTxNoFog<0,1,2,3> + +// approximately 3 instruction slots used (1 texture, 2 arithmetic) +ps_4_0 +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xy +dcl_output o0.xyzw +dcl_temps 1 +sample r0.xyzw, v1.xyxx, t0.xyzw, s0 +mul o0.xyzw, r0.xyzw, v0.xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicTxNoFog[] = +{ + 68, 88, 66, 67, 77, 0, + 71, 176, 20, 96, 134, 84, + 154, 61, 13, 233, 166, 152, + 82, 114, 1, 0, 0, 0, + 128, 3, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 96, 2, 0, 0, 252, 2, + 0, 0, 76, 3, 0, 0, + 65, 111, 110, 57, 40, 2, + 0, 0, 40, 2, 0, 0, + 0, 2, 255, 255, 0, 2, + 0, 0, 40, 0, 0, 0, + 0, 0, 40, 0, 0, 0, + 40, 0, 0, 0, 40, 0, + 1, 0, 36, 0, 0, 0, + 40, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 105, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 120, 1, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 6, 0, 0, 0, + 120, 0, 0, 0, 2, 0, + 0, 0, 80, 1, 0, 0, + 168, 0, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 0, 0, 255, 255, 172, 1, + 0, 0, 0, 0, 255, 255, + 184, 1, 0, 0, 0, 0, + 255, 255, 196, 1, 0, 0, + 13, 2, 0, 0, 208, 1, + 0, 0, 13, 2, 0, 0, + 224, 1, 0, 0, 13, 2, + 0, 0, 240, 1, 0, 0, + 80, 83, 66, 97, 115, 105, + 99, 84, 120, 78, 111, 70, + 111, 103, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 5, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 112, 105, 110, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 67, 111, 111, + 114, 100, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 228, 0, + 0, 0, 236, 0, 0, 0, + 252, 0, 0, 0, 8, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 24, 1, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 1, 0, 0, 0, 4, 0, + 5, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 168, 0, + 0, 0, 184, 0, 0, 0, + 2, 0, 0, 0, 200, 0, + 0, 0, 168, 0, 0, 0, + 224, 0, 0, 0, 40, 1, + 0, 0, 2, 0, 0, 0, + 56, 1, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 31, 0, 0, 2, + 0, 0, 0, 128, 0, 0, + 15, 176, 31, 0, 0, 2, + 0, 0, 0, 128, 1, 0, + 3, 176, 31, 0, 0, 2, + 0, 0, 0, 144, 0, 8, + 15, 160, 66, 0, 0, 3, + 0, 0, 15, 128, 1, 0, + 228, 176, 0, 8, 228, 160, + 5, 0, 0, 3, 0, 0, + 15, 128, 0, 0, 228, 128, + 0, 0, 228, 176, 1, 0, + 0, 2, 0, 8, 15, 128, + 0, 0, 228, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 148, 0, 0, 0, 64, 0, + 0, 0, 37, 0, 0, 0, + 90, 0, 0, 3, 0, 96, + 16, 0, 0, 0, 0, 0, + 88, 24, 0, 4, 0, 112, + 16, 0, 0, 0, 0, 0, + 85, 85, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 98, 16, + 0, 3, 50, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 69, 0, 0, 9, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 16, 16, 0, 1, 0, + 0, 0, 70, 126, 16, 0, + 0, 0, 0, 0, 0, 96, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 242, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 72, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 62, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 3, 3, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTxNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicTxNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..4d9eb17bf5c07265ff41aed24b45a20760d18bb4 GIT binary patch literal 62976 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 p_(#wBBqtT5D$;KuIY_bh4kFwl$0qRHx + dcl t1 // pin<4,5,6,7> + +#line 26 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov r0, t0 // pin<0,1,2,3> + mad r0.xyz, t1, r0.w, r0 // AddSpecular::color<0,1,2> + +#line 20 + mad r1.xyz, c0, t0.w, -r0 + mad r0.xyz, t1.w, r1, r0 // ApplyFog::color<0,1,2> + mov r0.w, t0.w + mov oC0, r0 // ::PSBasicVertexLighting<0,1,2,3> + +// approximately 6 instruction slots used +ps_4_0 +dcl_constantbuffer CB0[14], immediateIndexed +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xyzw +dcl_output o0.xyzw +dcl_temps 2 +mad r0.xyz, v1.xyzx, v0.wwww, v0.xyzx +mad r1.xyz, cb0[13].xyzx, v0.wwww, -r0.xyzx +mad o0.xyz, v1.wwww, r1.xyzx, r0.xyzx +mov o0.w, v0.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicVertexLighting[] = +{ + 68, 88, 66, 67, 87, 2, + 149, 25, 198, 64, 161, 184, + 94, 133, 3, 23, 104, 88, + 205, 215, 1, 0, 0, 0, + 68, 4, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 240, 2, 0, 0, 200, 3, + 0, 0, 16, 4, 0, 0, + 65, 111, 110, 57, 184, 2, + 0, 0, 184, 2, 0, 0, + 0, 2, 255, 255, 136, 2, + 0, 0, 48, 0, 0, 0, + 1, 0, 36, 0, 0, 0, + 48, 0, 0, 0, 48, 0, + 0, 0, 36, 0, 0, 0, + 48, 0, 0, 0, 13, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 255, 255, + 254, 255, 129, 0, 68, 66, + 85, 71, 40, 0, 0, 0, + 216, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 112, 0, 0, 0, 8, 0, + 0, 0, 116, 0, 0, 0, + 4, 0, 0, 0, 136, 1, + 0, 0, 180, 0, 0, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 40, 0, 0, 0, 0, 0, + 255, 255, 12, 2, 0, 0, + 0, 0, 255, 255, 24, 2, + 0, 0, 26, 0, 0, 0, + 36, 2, 0, 0, 26, 0, + 0, 0, 48, 2, 0, 0, + 20, 0, 0, 0, 68, 2, + 0, 0, 20, 0, 0, 0, + 88, 2, 0, 0, 20, 0, + 0, 0, 108, 2, 0, 0, + 20, 0, 0, 0, 120, 2, + 0, 0, 80, 83, 66, 97, + 115, 105, 99, 86, 101, 114, + 116, 101, 120, 76, 105, 103, + 104, 116, 105, 110, 103, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 65, 112, 112, 108, 121, 70, + 111, 103, 0, 99, 111, 108, + 111, 114, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 65, 100, 100, 83, + 112, 101, 99, 117, 108, 97, + 114, 0, 3, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 112, 105, 110, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 48, 1, 0, 0, + 248, 0, 0, 0, 56, 1, + 0, 0, 248, 0, 0, 0, + 5, 0, 0, 0, 1, 0, + 8, 0, 1, 0, 2, 0, + 68, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 1, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 7, 0, 2, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 0, 0, + 0, 0, 180, 0, 0, 0, + 204, 0, 0, 0, 1, 0, + 0, 0, 220, 0, 0, 0, + 232, 0, 0, 0, 241, 0, + 0, 0, 248, 0, 0, 0, + 1, 0, 0, 0, 8, 1, + 0, 0, 20, 1, 0, 0, + 241, 0, 0, 0, 248, 0, + 0, 0, 1, 0, 0, 0, + 32, 1, 0, 0, 180, 0, + 0, 0, 44, 1, 0, 0, + 84, 1, 0, 0, 3, 0, + 0, 0, 100, 1, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 15, 176, 31, 0, + 0, 2, 0, 0, 0, 128, + 1, 0, 15, 176, 1, 0, + 0, 2, 0, 0, 15, 128, + 0, 0, 228, 176, 4, 0, + 0, 4, 0, 0, 7, 128, + 1, 0, 228, 176, 0, 0, + 255, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 1, 0, + 7, 128, 0, 0, 228, 160, + 0, 0, 255, 176, 0, 0, + 228, 129, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 255, 176, 1, 0, 228, 128, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 128, + 0, 0, 255, 176, 1, 0, + 0, 2, 0, 8, 15, 128, + 0, 0, 228, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 208, 0, 0, 0, 64, 0, + 0, 0, 52, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 104, 0, + 0, 2, 2, 0, 0, 0, + 50, 0, 0, 9, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 246, 31, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 13, 0, 0, 0, + 246, 31, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 50, 0, 0, 9, + 114, 32, 16, 0, 0, 0, + 0, 0, 246, 31, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 0, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 64, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 56, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 15, 0, 0, + 67, 79, 76, 79, 82, 0, + 171, 171, 79, 83, 71, 78, + 44, 0, 0, 0, 1, 0, + 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 83, 86, 95, 84, 97, 114, + 103, 101, 116, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLighting.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLighting.pdb new file mode 100644 index 0000000000000000000000000000000000000000..45c108dcc127144e94024a32259357a5a8caf63e GIT binary patch literal 65024 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 + dcl t1 // pin<4,5,6,7> + +#line 26 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov r0, t0 // pin<0,1,2,3> + mad r0.xyz, t1, r0.w, r0 // AddSpecular::color<0,1,2> + mov r0.w, t0.w + mov oC0, r0 // ::PSBasicVertexLightingNoFog<0,1,2,3> + +// approximately 4 instruction slots used +ps_4_0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xyz +dcl_output o0.xyzw +mad o0.xyz, v1.xyzx, v0.wwww, v0.xyzx +mov o0.w, v0.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicVertexLightingNoFog[] = +{ + 68, 88, 66, 67, 130, 92, + 190, 251, 92, 163, 242, 235, + 36, 95, 152, 62, 166, 5, + 73, 116, 1, 0, 0, 0, + 116, 3, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 136, 2, 0, 0, 248, 2, + 0, 0, 64, 3, 0, 0, + 65, 111, 110, 57, 80, 2, + 0, 0, 80, 2, 0, 0, + 0, 2, 255, 255, 44, 2, + 0, 0, 36, 0, 0, 0, + 0, 0, 36, 0, 0, 0, + 36, 0, 0, 0, 36, 0, + 0, 0, 36, 0, 0, 0, + 36, 0, 0, 2, 255, 255, + 254, 255, 116, 0, 68, 66, + 85, 71, 40, 0, 0, 0, + 164, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 112, 0, 0, 0, 6, 0, + 0, 0, 116, 0, 0, 0, + 3, 0, 0, 0, 104, 1, + 0, 0, 164, 0, 0, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 40, 0, 0, 0, 0, 0, + 255, 255, 216, 1, 0, 0, + 0, 0, 255, 255, 228, 1, + 0, 0, 26, 0, 0, 0, + 240, 1, 0, 0, 26, 0, + 0, 0, 252, 1, 0, 0, + 26, 0, 0, 0, 16, 2, + 0, 0, 26, 0, 0, 0, + 28, 2, 0, 0, 80, 83, + 66, 97, 115, 105, 99, 86, + 101, 114, 116, 101, 120, 76, + 105, 103, 104, 116, 105, 110, + 103, 78, 111, 70, 111, 103, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 65, 100, 100, 83, 112, 101, + 99, 117, 108, 97, 114, 0, + 99, 111, 108, 111, 114, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 112, 105, 110, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 16, 1, 0, 0, 240, 0, + 0, 0, 24, 1, 0, 0, + 240, 0, 0, 0, 5, 0, + 0, 0, 1, 0, 8, 0, + 1, 0, 2, 0, 36, 1, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 1, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 2, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 0, 0, 0, 0, + 164, 0, 0, 0, 192, 0, + 0, 0, 1, 0, 0, 0, + 208, 0, 0, 0, 220, 0, + 0, 0, 232, 0, 0, 0, + 240, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, + 164, 0, 0, 0, 12, 1, + 0, 0, 52, 1, 0, 0, + 3, 0, 0, 0, 68, 1, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 31, 0, 0, 2, 0, 0, + 0, 128, 0, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 1, 0, 15, 176, + 1, 0, 0, 2, 0, 0, + 15, 128, 0, 0, 228, 176, + 4, 0, 0, 4, 0, 0, + 7, 128, 1, 0, 228, 176, + 0, 0, 255, 128, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 128, 0, 0, + 255, 176, 1, 0, 0, 2, + 0, 8, 15, 128, 0, 0, + 228, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 104, 0, + 0, 0, 64, 0, 0, 0, + 26, 0, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 98, 16, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 9, 114, 32, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 246, 31, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 130, 32, 16, 0, + 0, 0, 0, 0, 58, 16, + 16, 0, 0, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 64, 0, 0, 0, + 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 56, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 7, + 0, 0, 67, 79, 76, 79, + 82, 0, 171, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ec2c864f88793741752c264052c2232f07ea3e9e GIT binary patch literal 62976 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 JuRD_h{|^o(adQ9w literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTx.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTx.inc new file mode 100644 index 0000000..cb474fd --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTx.inc @@ -0,0 +1,316 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 13 1 ( FLT, FLT, FLT, FLT) +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 // pin<0,1,2,3> + dcl t1 // pin<4,5,6,7> + dcl t2.xy // pin<8,9> + dcl_2d s0 + +#line 555 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + texld r0, t2, s0 + mul r0, r0, t0 // ::color<0,1,2,3> + +#line 26 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r1.xyz, t1, r0.w, r0 // AddSpecular::color<0,1,2> + +#line 20 + mad r2.xyz, c0, r0.w, -r1 + mad r0.xyz, t1.w, r2, r1 // ApplyFog::color<0,1,2> + mov oC0, r0 // ::PSBasicVertexLightingTx<0,1,2,3> + +// approximately 6 instruction slots used (1 texture, 5 arithmetic) +ps_4_0 +dcl_constantbuffer CB0[14], immediateIndexed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xyzw +dcl_input_ps linear v2.xy +dcl_output o0.xyzw +dcl_temps 2 +sample r0.xyzw, v2.xyxx, t0.xyzw, s0 +mul r0.xyzw, r0.xyzw, v0.xyzw +mad r0.xyz, v1.xyzx, r0.wwww, r0.xyzx +mad r1.xyz, cb0[13].xyzx, r0.wwww, -r0.xyzx +mov o0.w, r0.w +mad o0.xyz, v1.wwww, r1.xyzx, r0.xyzx +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicVertexLightingTx[] = +{ + 68, 88, 66, 67, 144, 91, + 71, 86, 138, 73, 249, 111, + 252, 41, 40, 95, 152, 204, + 81, 168, 1, 0, 0, 0, + 144, 5, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 180, 3, 0, 0, 244, 4, + 0, 0, 92, 5, 0, 0, + 65, 111, 110, 57, 124, 3, + 0, 0, 124, 3, 0, 0, + 0, 2, 255, 255, 72, 3, + 0, 0, 52, 0, 0, 0, + 1, 0, 40, 0, 0, 0, + 52, 0, 0, 0, 52, 0, + 1, 0, 36, 0, 0, 0, + 52, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 169, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 120, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 10, 0, 0, 0, + 196, 0, 0, 0, 5, 0, + 0, 0, 20, 2, 0, 0, + 20, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 67, 58, 92, 85, + 115, 101, 114, 115, 92, 67, + 104, 117, 99, 107, 87, 92, + 68, 101, 115, 107, 116, 111, + 112, 92, 68, 51, 68, 49, + 49, 32, 80, 114, 111, 106, + 101, 99, 116, 115, 92, 68, + 105, 114, 101, 99, 116, 88, + 84, 75, 92, 83, 114, 99, + 92, 83, 104, 97, 100, 101, + 114, 115, 92, 67, 111, 109, + 109, 111, 110, 46, 102, 120, + 104, 0, 40, 0, 0, 0, + 116, 0, 0, 0, 0, 0, + 255, 255, 172, 2, 0, 0, + 0, 0, 255, 255, 184, 2, + 0, 0, 0, 0, 255, 255, + 196, 2, 0, 0, 0, 0, + 255, 255, 208, 2, 0, 0, + 43, 2, 0, 0, 220, 2, + 0, 0, 43, 2, 0, 0, + 236, 2, 0, 0, 26, 0, + 1, 0, 252, 2, 0, 0, + 20, 0, 1, 0, 16, 3, + 0, 0, 20, 0, 1, 0, + 36, 3, 0, 0, 20, 0, + 1, 0, 56, 3, 0, 0, + 80, 83, 66, 97, 115, 105, + 99, 86, 101, 114, 116, 101, + 120, 76, 105, 103, 104, 116, + 105, 110, 103, 84, 120, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 65, 112, + 112, 108, 121, 70, 111, 103, + 0, 99, 111, 108, 111, 114, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 65, 100, 100, 83, 112, 101, + 99, 117, 108, 97, 114, 0, + 6, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 5, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 112, 105, 110, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 84, 101, 120, + 67, 111, 111, 114, 100, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 156, 1, 0, 0, 88, 1, + 0, 0, 164, 1, 0, 0, + 88, 1, 0, 0, 173, 1, + 0, 0, 184, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 10, 0, 1, 0, 3, 0, + 200, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 1, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 7, 0, 2, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 0, 0, + 0, 0, 20, 1, 0, 0, + 44, 1, 0, 0, 1, 0, + 0, 0, 60, 1, 0, 0, + 72, 1, 0, 0, 81, 1, + 0, 0, 88, 1, 0, 0, + 1, 0, 0, 0, 104, 1, + 0, 0, 116, 1, 0, 0, + 81, 1, 0, 0, 88, 1, + 0, 0, 1, 0, 0, 0, + 128, 1, 0, 0, 0, 0, + 0, 0, 81, 1, 0, 0, + 88, 1, 0, 0, 1, 0, + 0, 0, 140, 1, 0, 0, + 20, 1, 0, 0, 152, 1, + 0, 0, 224, 1, 0, 0, + 3, 0, 0, 0, 240, 1, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 31, 0, 0, 2, 0, 0, + 0, 128, 0, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 1, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 2, 0, 3, 176, + 31, 0, 0, 2, 0, 0, + 0, 144, 0, 8, 15, 160, + 66, 0, 0, 3, 0, 0, + 15, 128, 2, 0, 228, 176, + 0, 8, 228, 160, 5, 0, + 0, 3, 0, 0, 15, 128, + 0, 0, 228, 128, 0, 0, + 228, 176, 4, 0, 0, 4, + 1, 0, 7, 128, 1, 0, + 228, 176, 0, 0, 255, 128, + 0, 0, 228, 128, 4, 0, + 0, 4, 2, 0, 7, 128, + 0, 0, 228, 160, 0, 0, + 255, 128, 1, 0, 228, 129, + 4, 0, 0, 4, 0, 0, + 7, 128, 1, 0, 255, 176, + 2, 0, 228, 128, 1, 0, + 228, 128, 1, 0, 0, 2, + 0, 8, 15, 128, 0, 0, + 228, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 56, 1, + 0, 0, 64, 0, 0, 0, + 78, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 90, 0, 0, 3, + 0, 96, 16, 0, 0, 0, + 0, 0, 88, 24, 0, 4, + 0, 112, 16, 0, 0, 0, + 0, 0, 85, 85, 0, 0, + 98, 16, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 98, 16, 0, 3, 242, 16, + 16, 0, 1, 0, 0, 0, + 98, 16, 0, 3, 50, 16, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 104, 0, 0, 2, 2, 0, + 0, 0, 69, 0, 0, 9, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 16, 16, 0, + 2, 0, 0, 0, 70, 126, + 16, 0, 0, 0, 0, 0, + 0, 96, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 9, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 13, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 9, 114, 32, 16, 0, + 0, 0, 0, 0, 246, 31, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 96, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 80, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 15, 0, 0, + 86, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTx.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTx.pdb new file mode 100644 index 0000000000000000000000000000000000000000..cfccde15f0b003152d970ce0956635b02a23af81 GIT binary patch literal 65024 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 + dcl t1 // pin<4,5,6,7> + dcl t2.xy // pin<8,9> + dcl_2d s0 + +#line 567 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + texld r0, t2, s0 + mul r0, r0, t0 // ::color<0,1,2,3> + +#line 26 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, t1, r0.w, r0 // AddSpecular::color<0,1,2> + mov oC0, r0 // ::PSBasicVertexLightingTxNoFog<0,1,2,3> + +// approximately 4 instruction slots used (1 texture, 3 arithmetic) +ps_4_0 +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v0.xyzw +dcl_input_ps linear v1.xyz +dcl_input_ps linear v2.xy +dcl_output o0.xyzw +dcl_temps 1 +sample r0.xyzw, v2.xyxx, t0.xyzw, s0 +mul r0.xyzw, r0.xyzw, v0.xyzw +mad o0.xyz, v1.xyzx, r0.wwww, r0.xyzx +mov o0.w, r0.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_PSBasicVertexLightingTxNoFog[] = +{ + 68, 88, 66, 67, 144, 52, + 8, 138, 36, 226, 252, 120, + 221, 28, 14, 241, 161, 5, + 36, 235, 1, 0, 0, 0, + 204, 4, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 80, 3, 0, 0, 48, 4, + 0, 0, 152, 4, 0, 0, + 65, 111, 110, 57, 24, 3, + 0, 0, 24, 3, 0, 0, + 0, 2, 255, 255, 240, 2, + 0, 0, 40, 0, 0, 0, + 0, 0, 40, 0, 0, 0, + 40, 0, 0, 0, 40, 0, + 1, 0, 36, 0, 0, 0, + 40, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 157, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 72, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 8, 0, 0, 0, + 196, 0, 0, 0, 4, 0, + 0, 0, 248, 1, 0, 0, + 4, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 67, 58, 92, 85, + 115, 101, 114, 115, 92, 67, + 104, 117, 99, 107, 87, 92, + 68, 101, 115, 107, 116, 111, + 112, 92, 68, 51, 68, 49, + 49, 32, 80, 114, 111, 106, + 101, 99, 116, 115, 92, 68, + 105, 114, 101, 99, 116, 88, + 84, 75, 92, 83, 114, 99, + 92, 83, 104, 97, 100, 101, + 114, 115, 92, 67, 111, 109, + 109, 111, 110, 46, 102, 120, + 104, 0, 40, 0, 0, 0, + 116, 0, 0, 0, 0, 0, + 255, 255, 124, 2, 0, 0, + 0, 0, 255, 255, 136, 2, + 0, 0, 0, 0, 255, 255, + 148, 2, 0, 0, 0, 0, + 255, 255, 160, 2, 0, 0, + 55, 2, 0, 0, 172, 2, + 0, 0, 55, 2, 0, 0, + 188, 2, 0, 0, 26, 0, + 1, 0, 204, 2, 0, 0, + 26, 0, 1, 0, 224, 2, + 0, 0, 80, 83, 66, 97, + 115, 105, 99, 86, 101, 114, + 116, 101, 120, 76, 105, 103, + 104, 116, 105, 110, 103, 84, + 120, 78, 111, 70, 111, 103, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 65, 100, 100, 83, + 112, 101, 99, 117, 108, 97, + 114, 0, 99, 111, 108, 111, + 114, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 5, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 112, 105, 110, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 84, + 101, 120, 67, 111, 111, 114, + 100, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 128, 1, 0, 0, + 84, 1, 0, 0, 136, 1, + 0, 0, 84, 1, 0, 0, + 145, 1, 0, 0, 156, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 10, 0, 1, 0, + 3, 0, 172, 1, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 1, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 7, 0, + 2, 0, 0, 0, 8, 0, + 9, 0, 255, 255, 255, 255, + 0, 0, 0, 0, 4, 1, + 0, 0, 36, 1, 0, 0, + 1, 0, 0, 0, 52, 1, + 0, 0, 64, 1, 0, 0, + 76, 1, 0, 0, 84, 1, + 0, 0, 1, 0, 0, 0, + 100, 1, 0, 0, 0, 0, + 0, 0, 76, 1, 0, 0, + 84, 1, 0, 0, 1, 0, + 0, 0, 112, 1, 0, 0, + 4, 1, 0, 0, 124, 1, + 0, 0, 196, 1, 0, 0, + 3, 0, 0, 0, 212, 1, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 31, 0, 0, 2, 0, 0, + 0, 128, 0, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 1, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 2, 0, 3, 176, + 31, 0, 0, 2, 0, 0, + 0, 144, 0, 8, 15, 160, + 66, 0, 0, 3, 0, 0, + 15, 128, 2, 0, 228, 176, + 0, 8, 228, 160, 5, 0, + 0, 3, 0, 0, 15, 128, + 0, 0, 228, 128, 0, 0, + 228, 176, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 176, 0, 0, 255, 128, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 8, 15, 128, + 0, 0, 228, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 216, 0, 0, 0, 64, 0, + 0, 0, 54, 0, 0, 0, + 90, 0, 0, 3, 0, 96, + 16, 0, 0, 0, 0, 0, + 88, 24, 0, 4, 0, 112, + 16, 0, 0, 0, 0, 0, + 85, 85, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 98, 16, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 98, 16, + 0, 3, 50, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 69, 0, 0, 9, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 16, 16, 0, 2, 0, + 0, 0, 70, 126, 16, 0, + 0, 0, 0, 0, 0, 96, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 9, 114, 32, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 130, 32, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 96, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 80, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 7, + 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 3, + 0, 0, 67, 79, 76, 79, + 82, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 171, + 79, 83, 71, 78, 44, 0, + 0, 0, 1, 0, 0, 0, + 8, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 83, 86, + 95, 84, 97, 114, 103, 101, + 116, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTxNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_PSBasicVertexLightingTxNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..30fda112efe570c6990bb9adbfa6d47d230097ba GIT binary patch literal 65024 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 C4#4dI literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasic.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasic.inc new file mode 100644 index 0000000..9d56ee2 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasic.inc @@ -0,0 +1,347 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// SV_Position 0 xyzw 2 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c2 cb0 14 1 ( FLT, FLT, FLT, FLT) +// c3 cb0 22 4 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c7, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c5 // ::VSBasic<10> + +#line 14 + dp4 r0.x, v0, c2 + max r0.x, r0.x, c7.x + min oT1.w, r0.x, c7.y // ::VSBasic<7> + +#line 49 + dp4 r0.x, v0, c3 // ::vout<0> + dp4 r0.y, v0, c4 // ::vout<1> + dp4 r0.z, v0, c6 // ::vout<3> + +#line 44 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasic<8,9> + mov oPos.w, r0.z // ::VSBasic<11> + +#line 50 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT0, c1 // ::VSBasic<0,1,2,3> + mov oT1.xyz, c7.x // ::VSBasic<4,5,6> + +// approximately 11 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +mov o0.xyzw, cb0[0].xyzw +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o1.xyz, l(0,0,0,0) +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasic[] = +{ + 68, 88, 66, 67, 187, 46, + 150, 222, 6, 93, 199, 6, + 161, 69, 70, 59, 161, 222, + 52, 92, 1, 0, 0, 0, + 36, 6, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 84, 4, 0, 0, 132, 5, + 0, 0, 184, 5, 0, 0, + 65, 111, 110, 57, 28, 4, + 0, 0, 28, 4, 0, 0, + 0, 2, 254, 255, 208, 3, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 4, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 190, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 204, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 13, 0, 0, 0, + 196, 0, 0, 0, 3, 0, + 0, 0, 144, 2, 0, 0, + 44, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 112, 0, 0, 0, 0, 0, + 255, 255, 0, 3, 0, 0, + 0, 0, 255, 255, 24, 3, + 0, 0, 49, 0, 0, 0, + 36, 3, 0, 0, 14, 0, + 0, 0, 52, 3, 0, 0, + 14, 0, 0, 0, 68, 3, + 0, 0, 14, 0, 0, 0, + 84, 3, 0, 0, 49, 0, + 0, 0, 100, 3, 0, 0, + 49, 0, 0, 0, 116, 3, + 0, 0, 49, 0, 0, 0, + 132, 3, 0, 0, 44, 0, + 1, 0, 148, 3, 0, 0, + 44, 0, 1, 0, 168, 3, + 0, 0, 50, 0, 0, 0, + 180, 3, 0, 0, 51, 0, + 0, 0, 192, 3, 0, 0, + 86, 83, 66, 97, 115, 105, + 99, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 80, + 111, 115, 105, 116, 105, 111, + 110, 80, 83, 0, 52, 1, + 0, 0, 60, 1, 0, 0, + 76, 1, 0, 0, 60, 1, + 0, 0, 85, 1, 0, 0, + 60, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 3, 0, 96, 1, + 0, 0, 2, 0, 0, 0, + 255, 255, 255, 255, 10, 0, + 255, 255, 5, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 9, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 10, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 11, 0, 11, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 12, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171, 171, 171, + 212, 1, 0, 0, 60, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 4, 0, 1, 0, + 1, 0, 224, 1, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 9, 2, 0, 0, + 60, 1, 0, 0, 52, 1, + 0, 0, 60, 1, 0, 0, + 76, 1, 0, 0, 16, 2, + 0, 0, 32, 2, 0, 0, + 44, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 60, 2, + 0, 0, 6, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 8, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 0, 0, 0, 0, + 44, 1, 0, 0, 120, 1, + 0, 0, 6, 0, 0, 0, + 136, 1, 0, 0, 44, 1, + 0, 0, 208, 1, 0, 0, + 232, 1, 0, 0, 1, 0, + 0, 0, 248, 1, 0, 0, + 0, 0, 0, 0, 4, 2, + 0, 0, 92, 2, 0, 0, + 3, 0, 0, 0, 108, 2, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 7, 0, + 15, 160, 0, 0, 0, 0, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 5, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 2, 0, + 228, 160, 11, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 0, 128, 7, 0, 0, 160, + 10, 0, 0, 3, 1, 0, + 8, 224, 0, 0, 0, 128, + 7, 0, 85, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 4, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 6, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 0, 0, + 15, 224, 1, 0, 228, 160, + 1, 0, 0, 2, 1, 0, + 7, 224, 7, 0, 0, 160, + 255, 255, 0, 0, 83, 72, + 68, 82, 40, 1, 0, 0, + 64, 0, 1, 0, 74, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 54, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 44, 0, 0, 0, 1, 0, + 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 79, 83, 71, 78, 100, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 80, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 86, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasic.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasic.pdb new file mode 100644 index 0000000000000000000000000000000000000000..7299a46c2fd29b2719b2787a8dca269511481d96 GIT binary patch literal 65024 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 tI62A71fUA20qTG?z$zd-?pzAIjIO + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c4 // ::VSBasicNoFog<6> + dp4 r0.x, v0, c2 // ::vout<0> + dp4 r0.y, v0, c3 // ::vout<1> + dp4 r0.z, v0, c5 // ::vout<3> + +#line 56 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicNoFog<4,5> + mov oPos.w, r0.z // ::VSBasicNoFog<7> + +#line 50 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT0, c1 // ::VSBasicNoFog<0,1,2,3> + +// approximately 7 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_output o0.xyzw +dcl_output_siv o1.xyzw, position +mov o0.xyzw, cb0[0].xyzw +dp4 o1.x, v0.xyzw, cb0[22].xyzw +dp4 o1.y, v0.xyzw, cb0[23].xyzw +dp4 o1.z, v0.xyzw, cb0[24].xyzw +dp4 o1.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicNoFog[] = +{ + 68, 88, 66, 67, 138, 195, + 138, 85, 139, 196, 214, 225, + 41, 15, 112, 116, 182, 5, + 180, 159, 1, 0, 0, 0, + 36, 5, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 184, 3, 0, 0, 156, 4, + 0, 0, 208, 4, 0, 0, + 65, 111, 110, 57, 128, 3, + 0, 0, 128, 3, 0, 0, + 0, 2, 254, 255, 64, 3, + 0, 0, 64, 0, 0, 0, + 2, 0, 36, 0, 0, 0, + 60, 0, 0, 0, 60, 0, + 0, 0, 36, 0, 1, 0, + 60, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 175, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 144, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 8, 0, 0, 0, + 196, 0, 0, 0, 3, 0, + 0, 0, 84, 2, 0, 0, + 4, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 112, 0, 0, 0, 0, 0, + 255, 255, 196, 2, 0, 0, + 49, 0, 0, 0, 208, 2, + 0, 0, 49, 0, 0, 0, + 224, 2, 0, 0, 49, 0, + 0, 0, 240, 2, 0, 0, + 49, 0, 0, 0, 0, 3, + 0, 0, 56, 0, 1, 0, + 16, 3, 0, 0, 56, 0, + 1, 0, 36, 3, 0, 0, + 50, 0, 0, 0, 48, 3, + 0, 0, 86, 83, 66, 97, + 115, 105, 99, 78, 111, 70, + 111, 103, 0, 68, 105, 102, + 102, 117, 115, 101, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 17, 1, 0, 0, 28, 1, + 0, 0, 44, 1, 0, 0, + 28, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 8, 0, + 1, 0, 2, 0, 56, 1, + 0, 0, 1, 0, 0, 0, + 255, 255, 255, 255, 6, 0, + 255, 255, 5, 0, 0, 0, + 4, 0, 5, 0, 255, 255, + 255, 255, 6, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 7, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171, 171, 171, + 140, 1, 0, 0, 28, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 4, 0, 1, 0, + 1, 0, 152, 1, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 193, 1, 0, 0, + 28, 1, 0, 0, 17, 1, + 0, 0, 28, 1, 0, 0, + 200, 1, 0, 0, 212, 1, + 0, 0, 228, 1, 0, 0, + 240, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 0, 2, + 0, 0, 2, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 4, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 0, 0, 0, 0, + 4, 1, 0, 0, 72, 1, + 0, 0, 4, 0, 0, 0, + 88, 1, 0, 0, 4, 1, + 0, 0, 136, 1, 0, 0, + 160, 1, 0, 0, 1, 0, + 0, 0, 176, 1, 0, 0, + 0, 0, 0, 0, 188, 1, + 0, 0, 32, 2, 0, 0, + 3, 0, 0, 0, 48, 2, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 2, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 5, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 0, 0, + 15, 224, 1, 0, 228, 160, + 255, 255, 0, 0, 83, 72, + 68, 82, 220, 0, 0, 0, + 64, 0, 1, 0, 55, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 79, 83, 71, 78, + 76, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 62, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..68a741fef0bc6f754c02f81abec7e2dc0f754523 GIT binary patch literal 65024 zcmeHQTWlQHd7hPQMWRiIa$?u99rswigpz39lgP5ThdcyE0OzG>Uy_#wy`c|H9-6`_+N4O4JfuNTpg{rzah*1KwEO+% zGIP%C%PCh%iyo_7@%iETfJ-@iYE6Y-4TZ=ha zS#BhU%F3#;9ItG?79IH;!1}dHASx`a702_GrTT=(mnqD{myMbH6`oz4=#=pB_MbbQA>!23Y!PGR4Mc zCMMa~^aM*zUzwS^HkMA#Of#g<&dtmxCnhJ@sj(EUPqBq$`s&Q}G+P*(n;V->f0E5y z>Fz=;W7D5x&nBlQ`q(6LOwO^%8?$qhsT7LN%(3LP*{S3tZYHP4r>;*Vr=MY$QOWd7 znoT9ICDX{2p5gVNtjew0NKU5E3cEHrH+~gOj$KYpCDAaj9YEDrlIdx*!+$+};FKwpRtB8RdbwZ^IMq^i?WVASPInjmrR{C9W5W{{ zmJ6j!b@XW_Q`mVRx{`OQcBQvEc>1aCE>TH^rFdl(J%htDP<`2@4Vc&po6S@*>oy8I zdcLK>)7@RKbaycvqCGZ|UtWe$A1@V36-suG^Q@f7u9cRT9lP3_Euc%`&b zLrq@PSJLd^C_}k<4D3Fxqol9gs1MiC?NPQ+suXf2o^<6a`B9TN+asb}vbYJcw9}PL z(J7Z4yQUnc4%H__RJAvsx3|b)p*!L*+Z*Pz`79TJ?yg7j#cW|CXR}kLvv5kk<&D=y zGG~6ixIzOtZqOgh;k;d`+S^R{Gv^uiXJA9-Q!^XY@3TC?^t8>* zwOQJzx-u%-ckg9!k6mO)MR}+eITPw;FRJTTBBBVJva4n;uJ(>wf5nDzDKgpSXT!Qu zEV1R%iq@Cu5~M?Qh+ow2mB_yzUE?h^+ds$~aV|?XPV1%W;Cxo~Za#Y$xJGpBmv)(* zxkxDWa~0oBzx!ByF3)ETK8I1_pg7$&nm`a}z}3Vcy{!Zxy{!ZRX@TlX>HDd`yxZ^y z#!ID24yJ)bL0vX04YKC}f{@-8Y?T&FUN)x1feM2nLwl&g&ax0Ip^JxSDbm|v8gj@) zghtACE02#@Q6$P|Uh0wWkV;is2`Oc*K+Y*S8nteO@HUhuqI7Y3J=iX_Y?T)B)m66< z-NoqRwr09iSY;BhDqMp;?2XP1l3^-Vs16ggth{mc1`b7Po$M*>;TT{T@J z4FBQYRUI;jmUc&iApg-P0zRE;C=s41nqChxMTbTzS~5WOG`&uvS z#Vp*Mg_B!1Y4se0!)4aODcQ2e&{#4}>ld9^9WR|N(=^CPmWnpxE|_K%m6tM8w7Fl@ zoOjY5mqRy$?hI-hJTKKJ-L3_jcT>dqaS>mvMkH(31P0tW9mt zbvcRF_rotKEs>~^EYjFnX%pskCD@OnWoQlHF&XRRN~IR8$-%P`PQ;`sE>(%`WyECj5j?M@N!NK#YQ`U z6x0Pc*o8CeXpbD5b+$@wF{5_Cq;4$H;fB{FgM4dZBkXmXN=V*{TWw-cBKmDvv3R4ZrQAx96Vrk*bk;eQkq(4*r1c=wfK^~ zK_SdH^cCnRoq;NFIUB7vFt{2NK7ff8#MZ};mdJf;D9xU8r5TNhIN*fxR3CK0 zeg95YqBh#N{Zln_d}@&~w}!eM68>?ePUr7BQnGn}bOTZ%Y>9-2#O$wDAR4Vi|LiMnBJn{85ls9It4Lv8)>yD zeIeDqz4Nj%3$l_e`cgnF>45F`sv)Bzk{43ml-M|}(4NiYD`Hx4&UQ8m+KPBSr|9&$ zi1jh8dbvVN5Sl9__cpM8n!n-|b=8i|wd~WgD$abR(nEUV;Btn zdUnB=9G&s4jZuQSv4E^rr98D$K-%<`Vf_7{-2JE%zW?)oSH$xC+ac|vWcp}FT;fFl z|FX#c?4b;hctBBC^aQ~lLCnJQ*~rD|5m}Br+%VJid3;tnH8U4dd3w9~%7^KRKz!eD zo~0*mjL*!>O$>%M&GkG&IKt!rNaUNQPjRP0x<^ZS+f{!neQSk(!M$@^ z52byOaMF6yJ)l4+4lb6X_~=f409#+e3Bz=zxMCNpd%!4JGs#JMZ2FnW=`;kzMKZJ- z;iNotsJfkrO!4&ga44l~ES_7vMk^wwW>x~S3~O12LR1rI)RD|RLd3;YqZXQ~XM#yU z7i{{j1YelHqDjvvQzJt-vaRYe;kl77R!1327IWCcLv)1K82`s9{jDF%I48#Xr1@Z0`QtM4e$xFnnp73INs8At>)Tou`7Q#FM1 zDW1T9&qXwiMzgKdn(E#5R96}FG*D+eA&N>3`B>g0J@y6{<6+5Bnrf1PYg!(m<$19 zTtiYfuv<~6=H(gIdus?rD;huCiV5_PF|^CD)?S|WB0O2#yp}2ZEy8}V06VD^H^tM> zZdf44OKvLUJFU7;l5&zXw8ssGN_m?E#TWwhw@+bpYgGr8^&7ZRwPuLO!yO+(B1YZ4 zVbpCydOd;BwAphr7#}P!$uo@4YAQihc$8;1PdayfsUW< zTE}$3G!XJ^gMqYxPzchI29^j&cl3x6)W5nzL68J$8qi1ud^+IzxE`aJ@AYQg<0(Y0y#Ph!$H2=%zSJjSB zSR-;JLtAq7%4yfK+!D;&M@qg{axz#$fvx9ybERsp%GKxX>2;c3Sjhzio27h?xi7Br zMLb5UX-t7PlNG*)o7z)Nz2EeG${;;p&S%*dp2L0ixX6@4z|-9xqBY<~yO_C2ZquqQfudv# z6(_O?syvdjm-F~IH{_dFwrF;bZ<~k5>5F`i585S-*kt5VzP!vLFU>q!uY~?V+_4jv zO70W2yB(r_&|d>&xld`}0{mLXxbY|x+y4%-|E}GU3m;6AGol`Tr1D9#rX-RSMhYQU zQND6Q>YZFGAxmgWCS;1Sa$=*HU&aa#JTg{UabsPSb#12@A4af$BVQWfZl*~#MXA52 z)yu*+&J4Y;IuMj$HB(p?>rV9gg~C6-QLK~-g%`vXP-eY^a-P?N(*+Ovr&#{%S#*Jn z;Va@qKYcxTKK}yB^8UKrLYgGER)F`1a^r9dXuE^fmQj5ag=86($k}B!@QujjSbeO4 z`kOV^dKq5zH@8Ck44-6qVyp}Iq_zhxmX=`@-*TE*Qbw#33(We0H=5;6v7oFc6DBgk(48m|v8PkjI=X2aA7Zj`Y z$c;7xrFdCh$fX>}Nq=yZpTQR9MV4WOQZ`d??O~O+rWOtnoQq<$gdA0|=mXE7nXJuL zc)6t==4@1!DM4_8Wr{hKQ!dkonA0ZAOQLZhb#SDpJ(1)Jo~%lwE~NbF?u#i;G^NhS zwsmpv)#Wq4sxJX0yjD!TT*6a3Edd4}D7v8IT3T7x>8D7x7)XjhBBi1*5O$6&S4!)O zIFEazp}YcnxQx}MBC35w-R)zlFBHAYU- z3WL;WN@7YFhyyiy3s8d^oConS3h#1;Zf}cg0bHik{-V2%lEOz8xh1*< zip3EoD86PVtT2@ez2gWIMm&pKIKspO|23Gn4FRBLN4B5+-rxLtqS>Hcx4}G7tUxOF zerc*+#zilFQ{BH>zxR7TMp_a=+g%8n&>MBy`^kQ1xtBw_ZdY}ilNLr~Uz1UU9+b)!m-3#EThOaGvjexH_ppO*fhmj0lY zZfWUAcIywK0ks=M14{SP;Bo8P$*-WkKPDam@%LFLZtosAcI?hqU%l_Rb>aiv{fQg+ zjnLB5Cy&5-{2#Kt2p|#cNxZRkv?icm4FzZ;t%ik2c?VY;*c+OG3|k5-)xEH=nyY`lEBV|M$0- zpZ(^sZ&}uFQU6~8=t$u2r{X8@7xHxp=TBJHtMY8!!1V=O%d>@`cKlkNt*^;zdA9ym zUdyxf6I@e$^2|9(T)o|T+IqmcSm#W6daU20Jn@&COwe%Vj7xAIYt^AF^)0hvYcH)9D^%k>4m;zkM4c z&fRpM?0COXhnz)49#wCTTkmX&+B}82NpNq|>Sm~0TVc&*{C3Y1;6yVDWrxx|oJ>4Vpe|;qX*G-IyM#LXEO$1=dK`EY{ko7> z9fOuRg+y(Te%^sR3imtln{YplGuBh1AS=4g7$G(CI;1LoS~l&^Wy*c4OE7>2CC;4`RHzjA_&Hf6Z{w;VnOR^Q=lcz>`5RKeaJ zAyz^c4{r~@@QvaQnTXIZ&~D}N5lhy4F@g`nH@3 zh;Sl?X!VLn(JhWJ=YOjjN0^Hv%tfWZ;g_AZS!$nwF}AMqjI?s`O=IJ^L2-mRIbjx^ z5FH|8;p3dKM1$lJ&Zu14So`D{DrPy55v##UoIc@cdZyjU}uGbicQy9xJ8h&aNW8)eXVcd0%b zIABsYmgsQ9Ylwkzn~X%=42OA6MuCnJ@-_yF37u_-ZcI#T-U78-b}>v2wrYLES2Vj; zhy7qmB&Dg!5Hj6efjsoQ7K40I++$yXj?x*d>)>)0N0>9>&mOSS>^WDO(U^z>PN)Lu zgHE{b-^ohUMjPioShVou)|_24$EOw<6OU2eb{;%5?QZzTm6Gd$y9912=C zp6G#F0>gF15$3S>IA47SdkcNTmpOKS9AS>fXOhp2#!EI+G=1;bYJ}8$jn*cS)pmsA zjPu1sj3dk$4=$WU(OGEB7z?jZ#k4e;38&cI)-$>d+LeYK7RGxt(w3Lir}rGizqQ4G&HUh>;jwR)WSW>1#yV21t8}9!HpKAzZAG*Cc+Bx*q!?g? zxiPoCmN8zDLr2OWVgxp*hN4o?z}nCD<_Kl<&A?lYpuWCE3gJT%r{)&CZSVc2**D(L z@JNonzR8^_P1fvZ7vtD)2+V8jj>T%F?Ba1oyT z3~S_0_SPS&f<{$OB7H7VPy>dwGmV_5W`>P!+xXKEox?b=L_oTuM~tBU1w8I}zGILC zYT?e5T{R52CZRqNb;oTlOWh|SS4|q(_aHRAHgw;~kZ&(bG&BxhY`A#pwS%T!xy!1y zNpiP$^T!PEc4C)bhs9yp_y$OEST;Q_hFU~QCRI#4^Do5ks27K2Q^VJ-5SA@A@Ev5} z-3T^u+%<~Xg(w_ah%c<6Q_hz#SaIC79b3eti{q}vao5E3r1B2UZ77ZJ?d8O0IgYzV zb5P{}jFW%J!&GXa%3yBfhNOHmGN;#F7iPp7#40^EG^KpW+#YvIuqlqamMO$>*Gfeh zJTQ*ChP51+Z*)H@;~~`Op=Ha7gvRt8w)20TZZsFG5>=o)A?!d z;<*3Bz}xqsD?PAxV>pw|Q}AK=8>hA%m)cg-;jd`#`brwP{|DKBl9l+lH7Ibu^%#%0 z_Z4&}Vd)_@EbEl@+{yQ2e5Y}rqCwFi=ivFHIi*sbyJemi6C#fhzML|}$DySFSQmN_ zH)(7L%@E({cnahZfxCJm{p?~YEE2S3z4O*PZz+Gkcpwt$PXE7Ong{y*qE3_}cw+d1 ze9jt0CH_&%usB6*h^iNkfA2X3h+$hNh7!cz9;@riC#`RP{ch_H9_NoCtq(9kH|0SO zeIHU6@~m!CJWVD-dAd1T;r|nV-~V>~I*%ZxC>;qdcJzzdJ}%{q`b24TPH>46Qb#ci zzXtd@VEp{zb;qtai{q;s*|mkm3ENq#mdcBG9vT{Avz5|I&x>D83MwWJnT)@{cca4Ok>RXdZjD@%n^c1-L9@JqOL_}mFjX9`IaZPOH|%Y8>$uWZe9AetJ-XdR&8)nx2sD2 zk|SSS;gynn-vuDP`~wBp#<2r90eA$7ci{X3K$irW1#x37iyS&Ce+nRcH|WQ6BUDw* z@d2bTz^`$ap8rySMVV_V3ww=pipfo}wttSwDUS9(BRD3-0i|bwUcfn&Av=)+P~6OI z0OH;v%B^K>0X6|;0O9x~08?!IIrB2kwqGl1VHFvPFLau(Vuuhw4gaa;u*z3C%=mLa5sQxOmTccLc|xP*q!1TitOn9 zfCm5%0_a)$A;2F37~o;RDZnFuM*)uk9tV5`Ky*J1I0HBfAo@Q6=m!h{1_48WVZaDr z6!1~N#{gibbq;U=a1lVVatZJmKn36cHUL#XeB9a;Ae-{?t=+}AcQFNG3d9tMDG*a2 JrhtzE{|{J0z{vmr literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLight.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLight.inc new file mode 100644 index 0000000..0966321 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLight.inc @@ -0,0 +1,783 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// SV_Position 0 xyzw 2 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 4 ( FLT, FLT, FLT, FLT) +// c5 cb0 6 1 ( FLT, FLT, FLT, FLT) +// c6 cb0 9 1 ( FLT, FLT, FLT, FLT) +// c7 cb0 12 1 ( FLT, FLT, FLT, FLT) +// c8 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c12 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c19, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r0.x, v1, c12 + dp3 r0.y, v1, c13 + dp3 r0.z, v1, c14 + nrm r1.xyz, r0 // ::worldNormal<0,1,2> + +#line 36 + dp3 r0.x, -c4, r1 // ::dotL<0> + +#line 39 + sge r0.y, r0.x, c19.x // ::zeroL<0> + mul r0.z, r0.x, r0.y // ::diffuse<0> + +#line 46 + mul r2.xyz, r0.z, c5 + mov r3.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad oT0.xyz, r2, r3, c2 // ::VSBasicOneLight<0,1,2> + +#line 57 + dp4 r2.x, v0, c9 // ::pos_ws<0> + dp4 r2.y, v0, c10 // ::pos_ws<1> + dp4 r2.z, v0, c11 // ::pos_ws<2> + add r2.xyz, -r2, c7 + nrm r3.xyz, r2 // ::eyeVector<0,1,2> + +#line 33 + add r2.xyz, r3, -c4 + nrm r3.xyz, r2 // ::halfVectors<0,1,2> + +#line 37 + dp3 r0.z, r3, r1 // ::dotH<0> + +#line 42 + max r0.z, r0.z, c19.x + mul r0.y, r0.y, r0.z + pow r1.x, r0.y, c3.w + mul r0.x, r0.x, r1.x // ::specular<0> + +#line 47 + mul r0.xyz, r0.x, c6 + mul oT1.xyz, r0, c3 // ::VSBasicOneLight<4,5,6> + +#line 63 + dp4 oPos.z, v0, c17 // ::VSBasicOneLight<10> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c8 + max r0.x, r0.x, c19.x + min oT1.w, r0.x, c19.y // ::VSBasicOneLight<7> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::vout<0> + dp4 r0.y, v0, c16 // ::vout<1> + dp4 r0.z, v0, c18 // ::vout<3> + +#line 264 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicOneLight<8,9> + mov oPos.w, r0.z // ::VSBasicOneLight<11> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mov oT0.w, c1.w // ::VSBasicOneLight<3> + +// approximately 42 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +dcl_temps 3 +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r0.w, -cb0[3].xyzx, r0.xyzx +ge r1.x, r0.w, l(0.000000) +and r1.x, r1.x, l(0x3f800000) +mul r1.y, r0.w, r1.x +mul r1.yzw, r1.yyyy, cb0[6].xxyz +mad o0.xyz, r1.yzwy, cb0[0].xyzx, cb0[1].xyzx +mov o0.w, cb0[0].w +dp4 r2.x, v0.xyzw, cb0[15].xyzw +dp4 r2.y, v0.xyzw, cb0[16].xyzw +dp4 r2.z, v0.xyzw, cb0[17].xyzw +add r1.yzw, -r2.xxyz, cb0[12].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mad r1.yzw, r1.yyzw, r2.xxxx, -cb0[3].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mul r1.yzw, r1.yyzw, r2.xxxx +dp3 r0.x, r1.yzwy, r0.xyzx +max r0.x, r0.x, l(0.000000) +mul r0.x, r1.x, r0.x +log r0.x, r0.x +mul r0.x, r0.x, cb0[2].w +exp r0.x, r0.x +mul r0.x, r0.w, r0.x +mul r0.xyz, r0.xxxx, cb0[9].xyzx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicOneLight[] = +{ + 68, 88, 66, 67, 14, 155, + 50, 151, 63, 65, 101, 24, + 40, 206, 57, 215, 220, 59, + 7, 90, 1, 0, 0, 0, + 136, 14, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 16, 9, 0, 0, 200, 13, + 0, 0, 28, 14, 0, 0, + 65, 111, 110, 57, 216, 8, + 0, 0, 216, 8, 0, 0, + 0, 2, 254, 255, 104, 8, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 1, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 1, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 135, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 240, 5, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 37, 0, 0, 0, + 20, 1, 0, 0, 13, 0, + 0, 0, 236, 4, 0, 0, + 112, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 36, 6, + 0, 0, 0, 0, 255, 255, + 60, 6, 0, 0, 0, 0, + 255, 255, 72, 6, 0, 0, + 59, 0, 0, 0, 84, 6, + 0, 0, 59, 0, 0, 0, + 100, 6, 0, 0, 59, 0, + 0, 0, 116, 6, 0, 0, + 59, 0, 0, 0, 132, 6, + 0, 0, 36, 0, 0, 0, + 144, 6, 0, 0, 39, 0, + 0, 0, 160, 6, 0, 0, + 41, 0, 0, 0, 176, 6, + 0, 0, 46, 0, 0, 0, + 192, 6, 0, 0, 46, 0, + 0, 0, 208, 6, 0, 0, + 46, 0, 0, 0, 220, 6, + 0, 0, 57, 0, 0, 0, + 240, 6, 0, 0, 57, 0, + 0, 0, 0, 7, 0, 0, + 57, 0, 0, 0, 16, 7, + 0, 0, 58, 0, 0, 0, + 32, 7, 0, 0, 58, 0, + 0, 0, 48, 7, 0, 0, + 33, 0, 0, 0, 60, 7, + 0, 0, 33, 0, 0, 0, + 76, 7, 0, 0, 37, 0, + 0, 0, 88, 7, 0, 0, + 42, 0, 0, 0, 104, 7, + 0, 0, 42, 0, 0, 0, + 120, 7, 0, 0, 42, 0, + 0, 0, 136, 7, 0, 0, + 42, 0, 0, 0, 152, 7, + 0, 0, 47, 0, 0, 0, + 168, 7, 0, 0, 47, 0, + 0, 0, 184, 7, 0, 0, + 63, 0, 0, 0, 200, 7, + 0, 0, 14, 0, 1, 0, + 216, 7, 0, 0, 14, 0, + 1, 0, 232, 7, 0, 0, + 14, 0, 1, 0, 248, 7, + 0, 0, 63, 0, 0, 0, + 8, 8, 0, 0, 63, 0, + 0, 0, 24, 8, 0, 0, + 63, 0, 0, 0, 40, 8, + 0, 0, 8, 1, 2, 0, + 56, 8, 0, 0, 8, 1, + 2, 0, 76, 8, 0, 0, + 46, 0, 0, 0, 88, 8, + 0, 0, 80, 97, 114, 97, + 109, 101, 116, 101, 114, 115, + 0, 68, 105, 102, 102, 117, + 115, 101, 67, 111, 108, 111, + 114, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 86, 83, 66, 97, 115, 105, + 99, 79, 110, 101, 76, 105, + 103, 104, 116, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 80, 111, 115, 105, 116, + 105, 111, 110, 80, 83, 0, + 128, 2, 0, 0, 136, 2, + 0, 0, 152, 2, 0, 0, + 136, 2, 0, 0, 161, 2, + 0, 0, 136, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 3, 0, + 172, 2, 0, 0, 12, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 26, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 27, 0, + 0, 0, 255, 255, 255, 255, + 10, 0, 255, 255, 30, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 34, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 35, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 11, 0, 36, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 20, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 255, 255, + 100, 111, 116, 76, 0, 171, + 171, 171, 7, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 101, 121, 101, 86, + 101, 99, 116, 111, 114, 0, + 171, 171, 17, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 112, 111, 115, 95, 119, 115, + 0, 171, 13, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 14, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 15, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 115, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 24, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 252, 3, + 0, 0, 136, 2, 0, 0, + 5, 4, 0, 0, 48, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 7, 0, 1, 0, + 2, 0, 12, 4, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 73, 4, + 0, 0, 136, 2, 0, 0, + 128, 2, 0, 0, 136, 2, + 0, 0, 152, 2, 0, 0, + 48, 3, 0, 0, 80, 4, + 0, 0, 92, 4, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 108, 4, 0, 0, 31, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 32, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 33, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 97, 108, 0, 6, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 122, 101, + 114, 111, 76, 0, 171, 171, + 8, 0, 0, 0, 255, 255, + 0, 0, 255, 255, 255, 255, + 60, 2, 0, 0, 71, 2, + 0, 0, 84, 2, 0, 0, + 1, 0, 0, 0, 100, 2, + 0, 0, 0, 0, 0, 0, + 112, 2, 0, 0, 196, 2, + 0, 0, 7, 0, 0, 0, + 212, 2, 0, 0, 0, 0, + 0, 0, 40, 3, 0, 0, + 48, 3, 0, 0, 1, 0, + 0, 0, 64, 3, 0, 0, + 0, 0, 0, 0, 76, 3, + 0, 0, 48, 3, 0, 0, + 1, 0, 0, 0, 84, 3, + 0, 0, 0, 0, 0, 0, + 96, 3, 0, 0, 48, 3, + 0, 0, 1, 0, 0, 0, + 104, 3, 0, 0, 0, 0, + 0, 0, 116, 3, 0, 0, + 48, 3, 0, 0, 1, 0, + 0, 0, 128, 3, 0, 0, + 0, 0, 0, 0, 140, 3, + 0, 0, 152, 3, 0, 0, + 1, 0, 0, 0, 168, 3, + 0, 0, 0, 0, 0, 0, + 180, 3, 0, 0, 136, 2, + 0, 0, 3, 0, 0, 0, + 188, 3, 0, 0, 0, 0, + 0, 0, 224, 3, 0, 0, + 48, 3, 0, 0, 1, 0, + 0, 0, 236, 3, 0, 0, + 112, 2, 0, 0, 248, 3, + 0, 0, 28, 4, 0, 0, + 2, 0, 0, 0, 44, 4, + 0, 0, 0, 0, 0, 0, + 68, 4, 0, 0, 140, 4, + 0, 0, 3, 0, 0, 0, + 156, 4, 0, 0, 0, 0, + 0, 0, 192, 4, 0, 0, + 48, 3, 0, 0, 1, 0, + 0, 0, 204, 4, 0, 0, + 0, 0, 0, 0, 216, 4, + 0, 0, 48, 3, 0, 0, + 1, 0, 0, 0, 224, 4, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 19, 0, + 15, 160, 0, 0, 0, 0, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 8, 0, 0, 3, 0, 0, + 1, 128, 1, 0, 228, 144, + 12, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 2, 128, + 1, 0, 228, 144, 13, 0, + 228, 160, 8, 0, 0, 3, + 0, 0, 4, 128, 1, 0, + 228, 144, 14, 0, 228, 160, + 36, 0, 0, 2, 1, 0, + 7, 128, 0, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 1, 128, 4, 0, 228, 161, + 1, 0, 228, 128, 13, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 0, 128, 19, 0, + 0, 160, 5, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 0, 128, 0, 0, 85, 128, + 5, 0, 0, 3, 2, 0, + 7, 128, 0, 0, 170, 128, + 5, 0, 228, 160, 1, 0, + 0, 2, 3, 0, 7, 128, + 1, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 7, 224, + 2, 0, 228, 128, 3, 0, + 228, 128, 2, 0, 228, 160, + 9, 0, 0, 3, 2, 0, + 1, 128, 0, 0, 228, 144, + 9, 0, 228, 160, 9, 0, + 0, 3, 2, 0, 2, 128, + 0, 0, 228, 144, 10, 0, + 228, 160, 9, 0, 0, 3, + 2, 0, 4, 128, 0, 0, + 228, 144, 11, 0, 228, 160, + 2, 0, 0, 3, 2, 0, + 7, 128, 2, 0, 228, 129, + 7, 0, 228, 160, 36, 0, + 0, 2, 3, 0, 7, 128, + 2, 0, 228, 128, 2, 0, + 0, 3, 2, 0, 7, 128, + 3, 0, 228, 128, 4, 0, + 228, 161, 36, 0, 0, 2, + 3, 0, 7, 128, 2, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 4, 128, 3, 0, + 228, 128, 1, 0, 228, 128, + 11, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 170, 128, + 19, 0, 0, 160, 5, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 85, 128, 0, 0, + 170, 128, 32, 0, 0, 3, + 1, 0, 1, 128, 0, 0, + 85, 128, 3, 0, 255, 160, + 5, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 1, 0, 0, 128, 5, 0, + 0, 3, 0, 0, 7, 128, + 0, 0, 0, 128, 6, 0, + 228, 160, 5, 0, 0, 3, + 1, 0, 7, 224, 0, 0, + 228, 128, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 17, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 8, 0, + 228, 160, 11, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 0, 128, 19, 0, 0, 160, + 10, 0, 0, 3, 1, 0, + 8, 224, 0, 0, 0, 128, + 19, 0, 85, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 15, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 16, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 18, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 0, 0, + 8, 224, 1, 0, 255, 160, + 255, 255, 0, 0, 83, 72, + 68, 82, 176, 4, 0, 0, + 64, 0, 1, 0, 44, 1, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 3, 0, 0, 0, + 16, 0, 0, 8, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 19, 0, + 0, 0, 16, 0, 0, 8, + 34, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 16, 0, + 0, 8, 66, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 21, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 9, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 29, 0, + 0, 7, 18, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 7, + 18, 0, 16, 0, 1, 0, + 0, 0, 10, 0, 16, 0, + 1, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 128, 63, + 56, 0, 0, 7, 34, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 8, 226, 0, 16, 0, + 1, 0, 0, 0, 86, 5, + 16, 0, 1, 0, 0, 0, + 6, 137, 32, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 50, 0, 0, 11, 114, 32, + 16, 0, 0, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 6, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 17, 0, + 0, 8, 34, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 17, 0, 0, 8, 66, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 0, 0, 0, 9, + 226, 0, 16, 0, 1, 0, + 0, 0, 6, 9, 16, 128, + 65, 0, 0, 0, 2, 0, + 0, 0, 6, 137, 32, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 2, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 2, 0, 0, 0, + 10, 0, 16, 0, 2, 0, + 0, 0, 50, 0, 0, 11, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 14, 16, 0, + 1, 0, 0, 0, 6, 0, + 16, 0, 2, 0, 0, 0, + 6, 137, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 2, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 2, 0, + 0, 0, 10, 0, 16, 0, + 2, 0, 0, 0, 56, 0, + 0, 7, 226, 0, 16, 0, + 1, 0, 0, 0, 86, 14, + 16, 0, 1, 0, 0, 0, + 6, 0, 16, 0, 2, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 52, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 47, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 25, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 9, 0, + 0, 0, 56, 0, 0, 8, + 114, 32, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 76, 0, + 0, 0, 2, 0, 0, 0, + 8, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 171, + 79, 83, 71, 78, 100, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 80, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 86, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLight.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLight.pdb new file mode 100644 index 0000000000000000000000000000000000000000..246c2909e001eb5b3368bae7ef58f44920f44de0 GIT binary patch literal 67072 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 + dcl_texcoord1 v1 // vin<4,5,6> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c19.x, c19.y // ::BiasX2<0,1,2> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r1.x, r0, c12 + dp3 r1.y, r0, c13 + dp3 r1.z, r0, c14 + nrm r0.xyz, r1 // ::worldNormal<0,1,2> + +#line 36 + dp3 r0.w, -c4, r0 // ::dotL<0> + +#line 39 + sge r1.x, r0.w, c19.z // ::zeroL<0> + mul r1.y, r0.w, r1.x // ::diffuse<0> + +#line 46 + mul r1.yzw, r1.y, c5.xxyz + mov r2.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad oT0.xyz, r1.yzww, r2, c2 // ::VSBasicOneLightBn<0,1,2> + +#line 57 + dp4 r2.x, v0, c9 // ::pos_ws<0> + dp4 r2.y, v0, c10 // ::pos_ws<1> + dp4 r2.z, v0, c11 // ::pos_ws<2> + add r1.yzw, -r2.xxyz, c7.xxyz + nrm r2.xyz, r1.yzww // ::eyeVector<0,1,2> + +#line 33 + add r1.yzw, r2.xxyz, -c4.xxyz + nrm r2.xyz, r1.yzww // ::halfVectors<0,1,2> + +#line 37 + dp3 r0.x, r2, r0 // ::dotH<0> + +#line 42 + max r0.x, r0.x, c19.z + mul r0.x, r1.x, r0.x + pow r1.x, r0.x, c3.w + mul r0.x, r0.w, r1.x // ::specular<0> + +#line 47 + mul r0.xyz, r0.x, c6 + mul oT1.xyz, r0, c3 // ::VSBasicOneLightBn<4,5,6> + +#line 63 + dp4 oPos.z, v0, c17 // ::VSBasicOneLightBn<10> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c8 + max r0.x, r0.x, c19.z + min oT1.w, r0.x, c19.w // ::VSBasicOneLightBn<7> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::vout<0> + dp4 r0.y, v0, c16 // ::vout<1> + dp4 r0.z, v0, c18 // ::vout<3> + +#line 274 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicOneLightBn<8,9> + mov oPos.w, r0.z // ::VSBasicOneLightBn<11> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mov oT0.w, c1.w // ::VSBasicOneLightBn<3> + +// approximately 43 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +dcl_temps 3 +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, r1.xyzx +dp3 r0.w, -cb0[3].xyzx, r0.xyzx +ge r1.x, r0.w, l(0.000000) +and r1.x, r1.x, l(0x3f800000) +mul r1.y, r0.w, r1.x +mul r1.yzw, r1.yyyy, cb0[6].xxyz +mad o0.xyz, r1.yzwy, cb0[0].xyzx, cb0[1].xyzx +mov o0.w, cb0[0].w +dp4 r2.x, v0.xyzw, cb0[15].xyzw +dp4 r2.y, v0.xyzw, cb0[16].xyzw +dp4 r2.z, v0.xyzw, cb0[17].xyzw +add r1.yzw, -r2.xxyz, cb0[12].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mad r1.yzw, r1.yyzw, r2.xxxx, -cb0[3].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mul r1.yzw, r1.yyzw, r2.xxxx +dp3 r0.x, r1.yzwy, r0.xyzx +max r0.x, r0.x, l(0.000000) +mul r0.x, r1.x, r0.x +log r0.x, r0.x +mul r0.x, r0.x, cb0[2].w +exp r0.x, r0.x +mul r0.x, r0.w, r0.x +mul r0.xyz, r0.xxxx, cb0[9].xyzx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicOneLightBn[] = +{ + 68, 88, 66, 67, 236, 183, + 174, 209, 146, 179, 157, 149, + 172, 229, 14, 116, 132, 71, + 139, 175, 1, 0, 0, 0, + 28, 15, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 104, 9, 0, 0, 92, 14, + 0, 0, 176, 14, 0, 0, + 65, 111, 110, 57, 48, 9, + 0, 0, 48, 9, 0, 0, + 0, 2, 254, 255, 192, 8, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 1, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 1, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 152, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 52, 6, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 38, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 28, 5, 0, 0, + 156, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 112, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 104, 6, + 0, 0, 0, 0, 255, 255, + 128, 6, 0, 0, 0, 0, + 255, 255, 140, 6, 0, 0, + 32, 0, 0, 0, 152, 6, + 0, 0, 59, 0, 1, 0, + 172, 6, 0, 0, 59, 0, + 1, 0, 188, 6, 0, 0, + 59, 0, 1, 0, 204, 6, + 0, 0, 59, 0, 1, 0, + 220, 6, 0, 0, 36, 0, + 1, 0, 232, 6, 0, 0, + 39, 0, 1, 0, 248, 6, + 0, 0, 41, 0, 1, 0, + 8, 7, 0, 0, 46, 0, + 1, 0, 24, 7, 0, 0, + 46, 0, 1, 0, 40, 7, + 0, 0, 46, 0, 1, 0, + 52, 7, 0, 0, 57, 0, + 1, 0, 72, 7, 0, 0, + 57, 0, 1, 0, 88, 7, + 0, 0, 57, 0, 1, 0, + 104, 7, 0, 0, 58, 0, + 1, 0, 120, 7, 0, 0, + 58, 0, 1, 0, 136, 7, + 0, 0, 33, 0, 1, 0, + 148, 7, 0, 0, 33, 0, + 1, 0, 164, 7, 0, 0, + 37, 0, 1, 0, 176, 7, + 0, 0, 42, 0, 1, 0, + 192, 7, 0, 0, 42, 0, + 1, 0, 208, 7, 0, 0, + 42, 0, 1, 0, 224, 7, + 0, 0, 42, 0, 1, 0, + 240, 7, 0, 0, 47, 0, + 1, 0, 0, 8, 0, 0, + 47, 0, 1, 0, 16, 8, + 0, 0, 63, 0, 1, 0, + 32, 8, 0, 0, 14, 0, + 0, 0, 48, 8, 0, 0, + 14, 0, 0, 0, 64, 8, + 0, 0, 14, 0, 0, 0, + 80, 8, 0, 0, 63, 0, + 1, 0, 96, 8, 0, 0, + 63, 0, 1, 0, 112, 8, + 0, 0, 63, 0, 1, 0, + 128, 8, 0, 0, 18, 1, + 2, 0, 144, 8, 0, 0, + 18, 1, 2, 0, 164, 8, + 0, 0, 46, 0, 1, 0, + 176, 8, 0, 0, 66, 105, + 97, 115, 88, 50, 0, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 80, 97, + 114, 97, 109, 101, 116, 101, + 114, 115, 0, 68, 105, 102, + 102, 117, 115, 101, 67, 111, + 108, 111, 114, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 86, 83, 66, 97, + 115, 105, 99, 79, 110, 101, + 76, 105, 103, 104, 116, 66, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 80, 111, 115, 105, 116, + 105, 111, 110, 80, 83, 0, + 174, 2, 0, 0, 184, 2, + 0, 0, 200, 2, 0, 0, + 184, 2, 0, 0, 209, 2, + 0, 0, 184, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 3, 0, + 220, 2, 0, 0, 13, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 27, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 28, 0, + 0, 0, 255, 255, 255, 255, + 10, 0, 255, 255, 31, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 35, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 36, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 11, 0, 37, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 10, 0, + 0, 0, 255, 255, 0, 0, + 255, 255, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 21, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 100, 111, 116, 76, 0, 171, + 171, 171, 8, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 0, 0, 101, 121, 101, 86, + 101, 99, 116, 111, 114, 0, + 171, 171, 18, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 112, 111, 115, 95, 119, 115, + 0, 171, 14, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 15, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 16, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 115, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 25, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 44, 4, + 0, 0, 184, 2, 0, 0, + 53, 4, 0, 0, 96, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 7, 0, 1, 0, + 2, 0, 60, 4, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 121, 4, + 0, 0, 184, 2, 0, 0, + 174, 2, 0, 0, 184, 2, + 0, 0, 200, 2, 0, 0, + 96, 3, 0, 0, 128, 4, + 0, 0, 140, 4, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 156, 4, 0, 0, 32, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 33, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 34, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 97, 108, 0, 7, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 122, 101, + 114, 111, 76, 0, 171, 171, + 9, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 0, 0, 0, 0, 68, 2, + 0, 0, 76, 2, 0, 0, + 1, 0, 0, 0, 92, 2, + 0, 0, 104, 2, 0, 0, + 115, 2, 0, 0, 128, 2, + 0, 0, 1, 0, 0, 0, + 144, 2, 0, 0, 0, 0, + 0, 0, 156, 2, 0, 0, + 244, 2, 0, 0, 7, 0, + 0, 0, 4, 3, 0, 0, + 0, 0, 0, 0, 88, 3, + 0, 0, 96, 3, 0, 0, + 1, 0, 0, 0, 112, 3, + 0, 0, 0, 0, 0, 0, + 124, 3, 0, 0, 96, 3, + 0, 0, 1, 0, 0, 0, + 132, 3, 0, 0, 0, 0, + 0, 0, 144, 3, 0, 0, + 96, 3, 0, 0, 1, 0, + 0, 0, 152, 3, 0, 0, + 0, 0, 0, 0, 164, 3, + 0, 0, 96, 3, 0, 0, + 1, 0, 0, 0, 176, 3, + 0, 0, 0, 0, 0, 0, + 188, 3, 0, 0, 200, 3, + 0, 0, 1, 0, 0, 0, + 216, 3, 0, 0, 0, 0, + 0, 0, 228, 3, 0, 0, + 184, 2, 0, 0, 3, 0, + 0, 0, 236, 3, 0, 0, + 0, 0, 0, 0, 16, 4, + 0, 0, 96, 3, 0, 0, + 1, 0, 0, 0, 28, 4, + 0, 0, 156, 2, 0, 0, + 40, 4, 0, 0, 76, 4, + 0, 0, 2, 0, 0, 0, + 92, 4, 0, 0, 0, 0, + 0, 0, 116, 4, 0, 0, + 188, 4, 0, 0, 3, 0, + 0, 0, 204, 4, 0, 0, + 0, 0, 0, 0, 240, 4, + 0, 0, 96, 3, 0, 0, + 1, 0, 0, 0, 252, 4, + 0, 0, 0, 0, 0, 0, + 8, 5, 0, 0, 96, 3, + 0, 0, 1, 0, 0, 0, + 16, 5, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 19, 0, 15, 160, 0, 0, + 0, 64, 0, 0, 128, 191, + 0, 0, 0, 0, 0, 0, + 128, 63, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 144, 19, 0, 0, 160, + 19, 0, 85, 160, 8, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 228, 128, 12, 0, + 228, 160, 8, 0, 0, 3, + 1, 0, 2, 128, 0, 0, + 228, 128, 13, 0, 228, 160, + 8, 0, 0, 3, 1, 0, + 4, 128, 0, 0, 228, 128, + 14, 0, 228, 160, 36, 0, + 0, 2, 0, 0, 7, 128, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 8, 128, + 4, 0, 228, 161, 0, 0, + 228, 128, 13, 0, 0, 3, + 1, 0, 1, 128, 0, 0, + 255, 128, 19, 0, 170, 160, + 5, 0, 0, 3, 1, 0, + 2, 128, 0, 0, 255, 128, + 1, 0, 0, 128, 5, 0, + 0, 3, 1, 0, 14, 128, + 1, 0, 85, 128, 5, 0, + 144, 160, 1, 0, 0, 2, + 2, 0, 7, 128, 1, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 224, 1, 0, + 249, 128, 2, 0, 228, 128, + 2, 0, 228, 160, 9, 0, + 0, 3, 2, 0, 1, 128, + 0, 0, 228, 144, 9, 0, + 228, 160, 9, 0, 0, 3, + 2, 0, 2, 128, 0, 0, + 228, 144, 10, 0, 228, 160, + 9, 0, 0, 3, 2, 0, + 4, 128, 0, 0, 228, 144, + 11, 0, 228, 160, 2, 0, + 0, 3, 1, 0, 14, 128, + 2, 0, 144, 129, 7, 0, + 144, 160, 36, 0, 0, 2, + 2, 0, 7, 128, 1, 0, + 249, 128, 2, 0, 0, 3, + 1, 0, 14, 128, 2, 0, + 144, 128, 4, 0, 144, 161, + 36, 0, 0, 2, 2, 0, + 7, 128, 1, 0, 249, 128, + 8, 0, 0, 3, 0, 0, + 1, 128, 2, 0, 228, 128, + 0, 0, 228, 128, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 19, 0, + 170, 160, 5, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 0, 128, 0, 0, 0, 128, + 32, 0, 0, 3, 1, 0, + 1, 128, 0, 0, 0, 128, + 3, 0, 255, 160, 5, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 255, 128, 1, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 0, 128, 6, 0, 228, 160, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 17, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 8, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 19, 0, 170, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 19, 0, + 255, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 15, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 16, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 18, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 8, 224, + 1, 0, 255, 160, 255, 255, + 0, 0, 83, 72, 68, 82, + 236, 4, 0, 0, 64, 0, + 1, 0, 59, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 3, 0, 0, 0, 50, 0, + 0, 15, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 191, 0, 0, + 128, 191, 0, 0, 128, 191, + 0, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 0, 0, 9, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 29, 0, 0, 7, + 18, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 128, 63, 56, 0, + 0, 7, 34, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 8, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 5, 16, 0, + 1, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 50, 0, + 0, 11, 114, 32, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 6, 130, 32, + 16, 0, 0, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 0, 0, 0, 9, 226, 0, + 16, 0, 1, 0, 0, 0, + 6, 9, 16, 128, 65, 0, + 0, 0, 2, 0, 0, 0, + 6, 137, 32, 0, 0, 0, + 0, 0, 12, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 2, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 2, 0, 0, 0, 10, 0, + 16, 0, 2, 0, 0, 0, + 50, 0, 0, 11, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 14, 16, 0, 1, 0, + 0, 0, 6, 0, 16, 0, + 2, 0, 0, 0, 6, 137, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 2, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 2, 0, 0, 0, + 10, 0, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 7, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 14, 16, 0, + 1, 0, 0, 0, 6, 0, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 52, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 47, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 25, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 56, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 76, 0, 0, 0, + 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 171, 79, 83, + 71, 78, 100, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 80, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 0, + 0, 0, 67, 79, 76, 79, + 82, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..71d42fd696d04552aa471a63b304c9436c0609e7 GIT binary patch literal 67072 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

>V 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 S^dz7_K!Jb)0R_sW!2bhd@S0u# literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTx.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTx.inc new file mode 100644 index 0000000..9545c12 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTx.inc @@ -0,0 +1,829 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 4 ( FLT, FLT, FLT, FLT) +// c5 cb0 6 1 ( FLT, FLT, FLT, FLT) +// c6 cb0 9 1 ( FLT, FLT, FLT, FLT) +// c7 cb0 12 1 ( FLT, FLT, FLT, FLT) +// c8 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c12 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c19, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r0.x, v1, c12 + dp3 r0.y, v1, c13 + dp3 r0.z, v1, c14 + nrm r1.xyz, r0 // ::worldNormal<0,1,2> + +#line 36 + dp3 r0.x, -c4, r1 // ::dotL<0> + +#line 39 + sge r0.y, r0.x, c19.x // ::zeroL<0> + mul r0.z, r0.x, r0.y // ::diffuse<0> + +#line 46 + mul r2.xyz, r0.z, c5 + mov r3.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad oT0.xyz, r2, r3, c2 // ::VSBasicOneLightTx<0,1,2> + +#line 57 + dp4 r2.x, v0, c9 // ::pos_ws<0> + dp4 r2.y, v0, c10 // ::pos_ws<1> + dp4 r2.z, v0, c11 // ::pos_ws<2> + add r2.xyz, -r2, c7 + nrm r3.xyz, r2 // ::eyeVector<0,1,2> + +#line 33 + add r2.xyz, r3, -c4 + nrm r3.xyz, r2 // ::halfVectors<0,1,2> + +#line 37 + dp3 r0.z, r3, r1 // ::dotH<0> + +#line 42 + max r0.z, r0.z, c19.x + mul r0.y, r0.y, r0.z + pow r1.x, r0.y, c3.w + mul r0.x, r0.x, r1.x // ::specular<0> + +#line 47 + mul r0.xyz, r0.x, c6 + mul oT1.xyz, r0, c3 // ::VSBasicOneLightTx<4,5,6> + +#line 63 + dp4 oPos.z, v0, c17 // ::VSBasicOneLightTx<12> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c8 + max r0.x, r0.x, c19.x + min oT1.w, r0.x, c19.y // ::VSBasicOneLightTx<7> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::vout<0> + dp4 r0.y, v0, c16 // ::vout<1> + dp4 r0.z, v0, c18 // ::vout<3> + +#line 316 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicOneLightTx<10,11> + mov oPos.w, r0.z // ::VSBasicOneLightTx<13> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mov oT0.w, c1.w // ::VSBasicOneLightTx<3> + +#line 323 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mov oT2.xy, v2 // ::VSBasicOneLightTx<8,9> + +// approximately 43 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +dcl_temps 3 +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r0.w, -cb0[3].xyzx, r0.xyzx +ge r1.x, r0.w, l(0.000000) +and r1.x, r1.x, l(0x3f800000) +mul r1.y, r0.w, r1.x +mul r1.yzw, r1.yyyy, cb0[6].xxyz +mad o0.xyz, r1.yzwy, cb0[0].xyzx, cb0[1].xyzx +mov o0.w, cb0[0].w +dp4 r2.x, v0.xyzw, cb0[15].xyzw +dp4 r2.y, v0.xyzw, cb0[16].xyzw +dp4 r2.z, v0.xyzw, cb0[17].xyzw +add r1.yzw, -r2.xxyz, cb0[12].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mad r1.yzw, r1.yyzw, r2.xxxx, -cb0[3].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mul r1.yzw, r1.yyzw, r2.xxxx +dp3 r0.x, r1.yzwy, r0.xyzx +max r0.x, r0.x, l(0.000000) +mul r0.x, r1.x, r0.x +log r0.x, r0.x +mul r0.x, r0.x, cb0[2].w +exp r0.x, r0.x +mul r0.x, r0.w, r0.x +mul r0.xyz, r0.xxxx, cb0[9].xyzx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o2.xy, v2.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicOneLightTx[] = +{ + 68, 88, 66, 67, 252, 165, + 51, 240, 77, 192, 21, 37, + 57, 51, 159, 232, 160, 80, + 247, 196, 1, 0, 0, 0, + 100, 15, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 128, 9, 0, 0, 100, 14, + 0, 0, 216, 14, 0, 0, + 65, 111, 110, 57, 72, 9, + 0, 0, 72, 9, 0, 0, + 0, 2, 254, 255, 216, 8, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 1, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 1, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 157, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 72, 6, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 39, 0, 0, 0, + 20, 1, 0, 0, 13, 0, + 0, 0, 68, 5, 0, 0, + 128, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 124, 6, + 0, 0, 0, 0, 255, 255, + 148, 6, 0, 0, 0, 0, + 255, 255, 160, 6, 0, 0, + 0, 0, 255, 255, 172, 6, + 0, 0, 59, 0, 0, 0, + 184, 6, 0, 0, 59, 0, + 0, 0, 200, 6, 0, 0, + 59, 0, 0, 0, 216, 6, + 0, 0, 59, 0, 0, 0, + 232, 6, 0, 0, 36, 0, + 0, 0, 244, 6, 0, 0, + 39, 0, 0, 0, 4, 7, + 0, 0, 41, 0, 0, 0, + 20, 7, 0, 0, 46, 0, + 0, 0, 36, 7, 0, 0, + 46, 0, 0, 0, 52, 7, + 0, 0, 46, 0, 0, 0, + 64, 7, 0, 0, 57, 0, + 0, 0, 84, 7, 0, 0, + 57, 0, 0, 0, 100, 7, + 0, 0, 57, 0, 0, 0, + 116, 7, 0, 0, 58, 0, + 0, 0, 132, 7, 0, 0, + 58, 0, 0, 0, 148, 7, + 0, 0, 33, 0, 0, 0, + 160, 7, 0, 0, 33, 0, + 0, 0, 176, 7, 0, 0, + 37, 0, 0, 0, 188, 7, + 0, 0, 42, 0, 0, 0, + 204, 7, 0, 0, 42, 0, + 0, 0, 220, 7, 0, 0, + 42, 0, 0, 0, 236, 7, + 0, 0, 42, 0, 0, 0, + 252, 7, 0, 0, 47, 0, + 0, 0, 12, 8, 0, 0, + 47, 0, 0, 0, 28, 8, + 0, 0, 63, 0, 0, 0, + 44, 8, 0, 0, 14, 0, + 1, 0, 60, 8, 0, 0, + 14, 0, 1, 0, 76, 8, + 0, 0, 14, 0, 1, 0, + 92, 8, 0, 0, 63, 0, + 0, 0, 108, 8, 0, 0, + 63, 0, 0, 0, 124, 8, + 0, 0, 63, 0, 0, 0, + 140, 8, 0, 0, 60, 1, + 2, 0, 156, 8, 0, 0, + 60, 1, 2, 0, 176, 8, + 0, 0, 46, 0, 0, 0, + 188, 8, 0, 0, 67, 1, + 2, 0, 200, 8, 0, 0, + 80, 97, 114, 97, 109, 101, + 116, 101, 114, 115, 0, 68, + 105, 102, 102, 117, 115, 101, + 67, 111, 108, 111, 114, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 86, 83, + 66, 97, 115, 105, 99, 79, + 110, 101, 76, 105, 103, 104, + 116, 84, 120, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 84, 101, 120, + 67, 111, 111, 114, 100, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 146, 2, 0, 0, 156, 2, + 0, 0, 172, 2, 0, 0, + 156, 2, 0, 0, 181, 2, + 0, 0, 192, 2, 0, 0, + 208, 2, 0, 0, 156, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 14, 0, 1, 0, + 4, 0, 220, 2, 0, 0, + 13, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 27, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 28, 0, 0, 0, 255, 255, + 255, 255, 12, 0, 255, 255, + 31, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 7, 0, + 35, 0, 0, 0, 10, 0, + 11, 0, 255, 255, 255, 255, + 36, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 13, 0, + 37, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 3, 0, + 38, 0, 0, 0, 8, 0, + 9, 0, 255, 255, 255, 255, + 100, 105, 102, 102, 117, 115, + 101, 0, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 255, 255, + 100, 111, 116, 72, 0, 171, + 171, 171, 21, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 255, 255, 100, 111, 116, 76, + 0, 171, 171, 171, 8, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 101, 121, + 101, 86, 101, 99, 116, 111, + 114, 0, 171, 171, 18, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 104, 97, + 108, 102, 86, 101, 99, 116, + 111, 114, 115, 0, 3, 0, + 3, 0, 3, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 112, 111, 115, 95, + 119, 115, 0, 171, 14, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 15, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 16, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 115, 112, + 101, 99, 117, 108, 97, 114, + 0, 171, 171, 171, 25, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 78, + 111, 114, 109, 97, 108, 0, + 64, 4, 0, 0, 156, 2, + 0, 0, 73, 4, 0, 0, + 116, 3, 0, 0, 181, 2, + 0, 0, 192, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 9, 0, 1, 0, 3, 0, + 80, 4, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 3, 0, + 0, 0, 7, 0, 8, 0, + 255, 255, 255, 255, 118, 111, + 117, 116, 0, 80, 111, 115, + 95, 112, 115, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 161, 4, 0, 0, + 156, 2, 0, 0, 146, 2, + 0, 0, 156, 2, 0, 0, + 172, 2, 0, 0, 116, 3, + 0, 0, 168, 4, 0, 0, + 180, 4, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 196, 4, + 0, 0, 32, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 33, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 34, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 119, 111, 114, 108, + 100, 78, 111, 114, 109, 97, + 108, 0, 7, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 122, 101, 114, 111, + 76, 0, 171, 171, 9, 0, + 0, 0, 255, 255, 0, 0, + 255, 255, 255, 255, 76, 2, + 0, 0, 87, 2, 0, 0, + 100, 2, 0, 0, 1, 0, + 0, 0, 116, 2, 0, 0, + 0, 0, 0, 0, 128, 2, + 0, 0, 252, 2, 0, 0, + 8, 0, 0, 0, 12, 3, + 0, 0, 0, 0, 0, 0, + 108, 3, 0, 0, 116, 3, + 0, 0, 1, 0, 0, 0, + 132, 3, 0, 0, 0, 0, + 0, 0, 144, 3, 0, 0, + 116, 3, 0, 0, 1, 0, + 0, 0, 152, 3, 0, 0, + 0, 0, 0, 0, 164, 3, + 0, 0, 116, 3, 0, 0, + 1, 0, 0, 0, 172, 3, + 0, 0, 0, 0, 0, 0, + 184, 3, 0, 0, 116, 3, + 0, 0, 1, 0, 0, 0, + 196, 3, 0, 0, 0, 0, + 0, 0, 208, 3, 0, 0, + 220, 3, 0, 0, 1, 0, + 0, 0, 236, 3, 0, 0, + 0, 0, 0, 0, 248, 3, + 0, 0, 156, 2, 0, 0, + 3, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, + 36, 4, 0, 0, 116, 3, + 0, 0, 1, 0, 0, 0, + 48, 4, 0, 0, 128, 2, + 0, 0, 60, 4, 0, 0, + 104, 4, 0, 0, 3, 0, + 0, 0, 120, 4, 0, 0, + 0, 0, 0, 0, 156, 4, + 0, 0, 228, 4, 0, 0, + 3, 0, 0, 0, 244, 4, + 0, 0, 0, 0, 0, 0, + 24, 5, 0, 0, 116, 3, + 0, 0, 1, 0, 0, 0, + 36, 5, 0, 0, 0, 0, + 0, 0, 48, 5, 0, 0, + 116, 3, 0, 0, 1, 0, + 0, 0, 56, 5, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 19, 0, 15, 160, + 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 144, 12, 0, + 228, 160, 8, 0, 0, 3, + 0, 0, 2, 128, 1, 0, + 228, 144, 13, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 4, 128, 1, 0, 228, 144, + 14, 0, 228, 160, 36, 0, + 0, 2, 1, 0, 7, 128, + 0, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 1, 128, + 4, 0, 228, 161, 1, 0, + 228, 128, 13, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 0, 128, 19, 0, 0, 160, + 5, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 0, 128, + 0, 0, 85, 128, 5, 0, + 0, 3, 2, 0, 7, 128, + 0, 0, 170, 128, 5, 0, + 228, 160, 1, 0, 0, 2, + 3, 0, 7, 128, 1, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 224, 2, 0, + 228, 128, 3, 0, 228, 128, + 2, 0, 228, 160, 9, 0, + 0, 3, 2, 0, 1, 128, + 0, 0, 228, 144, 9, 0, + 228, 160, 9, 0, 0, 3, + 2, 0, 2, 128, 0, 0, + 228, 144, 10, 0, 228, 160, + 9, 0, 0, 3, 2, 0, + 4, 128, 0, 0, 228, 144, + 11, 0, 228, 160, 2, 0, + 0, 3, 2, 0, 7, 128, + 2, 0, 228, 129, 7, 0, + 228, 160, 36, 0, 0, 2, + 3, 0, 7, 128, 2, 0, + 228, 128, 2, 0, 0, 3, + 2, 0, 7, 128, 3, 0, + 228, 128, 4, 0, 228, 161, + 36, 0, 0, 2, 3, 0, + 7, 128, 2, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 4, 128, 3, 0, 228, 128, + 1, 0, 228, 128, 11, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 170, 128, 19, 0, + 0, 160, 5, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 85, 128, 0, 0, 170, 128, + 32, 0, 0, 3, 1, 0, + 1, 128, 0, 0, 85, 128, + 3, 0, 255, 160, 5, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 1, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 0, 128, 6, 0, 228, 160, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 17, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 8, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 19, 0, 0, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 19, 0, + 85, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 15, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 16, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 18, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 8, 224, + 1, 0, 255, 160, 1, 0, + 0, 2, 2, 0, 3, 224, + 2, 0, 228, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 220, 4, 0, 0, 64, 0, + 1, 0, 55, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 3, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 29, 0, 0, 7, + 18, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 128, 63, 56, 0, + 0, 7, 34, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 8, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 5, 16, 0, + 1, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 50, 0, + 0, 11, 114, 32, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 6, 130, 32, + 16, 0, 0, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 0, 0, 0, 9, 226, 0, + 16, 0, 1, 0, 0, 0, + 6, 9, 16, 128, 65, 0, + 0, 0, 2, 0, 0, 0, + 6, 137, 32, 0, 0, 0, + 0, 0, 12, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 2, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 2, 0, 0, 0, 10, 0, + 16, 0, 2, 0, 0, 0, + 50, 0, 0, 11, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 14, 16, 0, 1, 0, + 0, 0, 6, 0, 16, 0, + 2, 0, 0, 0, 6, 137, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 2, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 2, 0, 0, 0, + 10, 0, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 7, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 14, 16, 0, + 1, 0, 0, 0, 6, 0, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 52, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 47, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 25, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 56, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 54, 0, + 0, 5, 50, 32, 16, 0, + 2, 0, 0, 0, 70, 16, + 16, 0, 2, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 99, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 3, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 84, + 69, 88, 67, 79, 79, 82, + 68, 0, 79, 83, 71, 78, + 132, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 104, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 12, 0, 0, + 119, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTx.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTx.pdb new file mode 100644 index 0000000000000000000000000000000000000000..05296246db30ac85567ab23f397b7823c1303b65 GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxBn.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxBn.inc new file mode 100644 index 0000000..75002dc --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxBn.inc @@ -0,0 +1,857 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 4 ( FLT, FLT, FLT, FLT) +// c5 cb0 6 1 ( FLT, FLT, FLT, FLT) +// c6 cb0 9 1 ( FLT, FLT, FLT, FLT) +// c7 cb0 12 1 ( FLT, FLT, FLT, FLT) +// c8 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c12 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c19, 2, -1, 0, 1 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c19.x, c19.y // ::BiasX2<0,1,2> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r1.x, r0, c12 + dp3 r1.y, r0, c13 + dp3 r1.z, r0, c14 + nrm r0.xyz, r1 // ::worldNormal<0,1,2> + +#line 36 + dp3 r0.w, -c4, r0 // ::dotL<0> + +#line 39 + sge r1.x, r0.w, c19.z // ::zeroL<0> + mul r1.y, r0.w, r1.x // ::diffuse<0> + +#line 46 + mul r1.yzw, r1.y, c5.xxyz + mov r2.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad oT0.xyz, r1.yzww, r2, c2 // ::VSBasicOneLightTxBn<0,1,2> + +#line 57 + dp4 r2.x, v0, c9 // ::pos_ws<0> + dp4 r2.y, v0, c10 // ::pos_ws<1> + dp4 r2.z, v0, c11 // ::pos_ws<2> + add r1.yzw, -r2.xxyz, c7.xxyz + nrm r2.xyz, r1.yzww // ::eyeVector<0,1,2> + +#line 33 + add r1.yzw, r2.xxyz, -c4.xxyz + nrm r2.xyz, r1.yzww // ::halfVectors<0,1,2> + +#line 37 + dp3 r0.x, r2, r0 // ::dotH<0> + +#line 42 + max r0.x, r0.x, c19.z + mul r0.x, r1.x, r0.x + pow r1.x, r0.x, c3.w + mul r0.x, r0.w, r1.x // ::specular<0> + +#line 47 + mul r0.xyz, r0.x, c6 + mul oT1.xyz, r0, c3 // ::VSBasicOneLightTxBn<4,5,6> + +#line 63 + dp4 oPos.z, v0, c17 // ::VSBasicOneLightTxBn<12> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c8 + max r0.x, r0.x, c19.z + min oT1.w, r0.x, c19.w // ::VSBasicOneLightTxBn<7> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::vout<0> + dp4 r0.y, v0, c16 // ::vout<1> + dp4 r0.z, v0, c18 // ::vout<3> + +#line 328 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicOneLightTxBn<10,11> + mov oPos.w, r0.z // ::VSBasicOneLightTxBn<13> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mov oT0.w, c1.w // ::VSBasicOneLightTxBn<3> + +#line 337 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mov oT2.xy, v2 // ::VSBasicOneLightTxBn<8,9> + +// approximately 44 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +dcl_temps 3 +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, r1.xyzx +dp3 r0.w, -cb0[3].xyzx, r0.xyzx +ge r1.x, r0.w, l(0.000000) +and r1.x, r1.x, l(0x3f800000) +mul r1.y, r0.w, r1.x +mul r1.yzw, r1.yyyy, cb0[6].xxyz +mad o0.xyz, r1.yzwy, cb0[0].xyzx, cb0[1].xyzx +mov o0.w, cb0[0].w +dp4 r2.x, v0.xyzw, cb0[15].xyzw +dp4 r2.y, v0.xyzw, cb0[16].xyzw +dp4 r2.z, v0.xyzw, cb0[17].xyzw +add r1.yzw, -r2.xxyz, cb0[12].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mad r1.yzw, r1.yyzw, r2.xxxx, -cb0[3].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mul r1.yzw, r1.yyzw, r2.xxxx +dp3 r0.x, r1.yzwy, r0.xyzx +max r0.x, r0.x, l(0.000000) +mul r0.x, r1.x, r0.x +log r0.x, r0.x +mul r0.x, r0.x, cb0[2].w +exp r0.x, r0.x +mul r0.x, r0.w, r0.x +mul r0.xyz, r0.xxxx, cb0[9].xyzx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o2.xy, v2.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicOneLightTxBn[] = +{ + 68, 88, 66, 67, 122, 36, + 25, 216, 196, 97, 107, 225, + 67, 69, 38, 146, 109, 220, + 106, 182, 1, 0, 0, 0, + 244, 15, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 212, 9, 0, 0, 244, 14, + 0, 0, 104, 15, 0, 0, + 65, 111, 110, 57, 156, 9, + 0, 0, 156, 9, 0, 0, + 0, 2, 254, 255, 44, 9, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 1, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 1, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 173, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 136, 6, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 40, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 112, 5, 0, 0, + 172, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 112, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 188, 6, + 0, 0, 0, 0, 255, 255, + 212, 6, 0, 0, 0, 0, + 255, 255, 224, 6, 0, 0, + 0, 0, 255, 255, 236, 6, + 0, 0, 32, 0, 0, 0, + 248, 6, 0, 0, 59, 0, + 1, 0, 12, 7, 0, 0, + 59, 0, 1, 0, 28, 7, + 0, 0, 59, 0, 1, 0, + 44, 7, 0, 0, 59, 0, + 1, 0, 60, 7, 0, 0, + 36, 0, 1, 0, 72, 7, + 0, 0, 39, 0, 1, 0, + 88, 7, 0, 0, 41, 0, + 1, 0, 104, 7, 0, 0, + 46, 0, 1, 0, 120, 7, + 0, 0, 46, 0, 1, 0, + 136, 7, 0, 0, 46, 0, + 1, 0, 148, 7, 0, 0, + 57, 0, 1, 0, 168, 7, + 0, 0, 57, 0, 1, 0, + 184, 7, 0, 0, 57, 0, + 1, 0, 200, 7, 0, 0, + 58, 0, 1, 0, 216, 7, + 0, 0, 58, 0, 1, 0, + 232, 7, 0, 0, 33, 0, + 1, 0, 244, 7, 0, 0, + 33, 0, 1, 0, 4, 8, + 0, 0, 37, 0, 1, 0, + 16, 8, 0, 0, 42, 0, + 1, 0, 32, 8, 0, 0, + 42, 0, 1, 0, 48, 8, + 0, 0, 42, 0, 1, 0, + 64, 8, 0, 0, 42, 0, + 1, 0, 80, 8, 0, 0, + 47, 0, 1, 0, 96, 8, + 0, 0, 47, 0, 1, 0, + 112, 8, 0, 0, 63, 0, + 1, 0, 128, 8, 0, 0, + 14, 0, 0, 0, 144, 8, + 0, 0, 14, 0, 0, 0, + 160, 8, 0, 0, 14, 0, + 0, 0, 176, 8, 0, 0, + 63, 0, 1, 0, 192, 8, + 0, 0, 63, 0, 1, 0, + 208, 8, 0, 0, 63, 0, + 1, 0, 224, 8, 0, 0, + 72, 1, 2, 0, 240, 8, + 0, 0, 72, 1, 2, 0, + 4, 9, 0, 0, 46, 0, + 1, 0, 16, 9, 0, 0, + 81, 1, 2, 0, 28, 9, + 0, 0, 66, 105, 97, 115, + 88, 50, 0, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 80, 97, 114, 97, + 109, 101, 116, 101, 114, 115, + 0, 68, 105, 102, 102, 117, + 115, 101, 67, 111, 108, 111, + 114, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 86, 83, 66, 97, 115, 105, + 99, 79, 110, 101, 76, 105, + 103, 104, 116, 84, 120, 66, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 84, + 101, 120, 67, 111, 111, 114, + 100, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 80, 83, + 0, 171, 192, 2, 0, 0, + 200, 2, 0, 0, 216, 2, + 0, 0, 200, 2, 0, 0, + 225, 2, 0, 0, 236, 2, + 0, 0, 252, 2, 0, 0, + 200, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 14, 0, + 1, 0, 4, 0, 8, 3, + 0, 0, 14, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 28, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 29, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 32, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 36, 0, 0, 0, + 10, 0, 11, 0, 255, 255, + 255, 255, 37, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 13, 0, 38, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 39, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 100, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, + 255, 255, 0, 0, 255, 255, + 255, 255, 100, 111, 116, 72, + 0, 171, 171, 171, 22, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 100, 111, + 116, 76, 0, 171, 171, 171, + 9, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 0, 0, + 101, 121, 101, 86, 101, 99, + 116, 111, 114, 0, 171, 171, + 19, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 104, 97, 108, 102, 86, 101, + 99, 116, 111, 114, 115, 0, + 3, 0, 3, 0, 3, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 112, 111, + 115, 95, 119, 115, 0, 171, + 15, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 16, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 17, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 115, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 26, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 78, 111, 114, 109, 97, + 108, 0, 108, 4, 0, 0, + 200, 2, 0, 0, 117, 4, + 0, 0, 160, 3, 0, 0, + 225, 2, 0, 0, 236, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 9, 0, 1, 0, + 3, 0, 124, 4, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 255, 255, 255, 255, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 205, 4, + 0, 0, 200, 2, 0, 0, + 192, 2, 0, 0, 200, 2, + 0, 0, 216, 2, 0, 0, + 160, 3, 0, 0, 212, 4, + 0, 0, 224, 4, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 240, 4, 0, 0, 33, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 34, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 35, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 97, 108, 0, 8, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 122, 101, + 114, 111, 76, 0, 171, 171, + 10, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 0, 0, 0, 0, 84, 2, + 0, 0, 92, 2, 0, 0, + 1, 0, 0, 0, 108, 2, + 0, 0, 120, 2, 0, 0, + 131, 2, 0, 0, 144, 2, + 0, 0, 1, 0, 0, 0, + 160, 2, 0, 0, 0, 0, + 0, 0, 172, 2, 0, 0, + 40, 3, 0, 0, 8, 0, + 0, 0, 56, 3, 0, 0, + 0, 0, 0, 0, 152, 3, + 0, 0, 160, 3, 0, 0, + 1, 0, 0, 0, 176, 3, + 0, 0, 0, 0, 0, 0, + 188, 3, 0, 0, 160, 3, + 0, 0, 1, 0, 0, 0, + 196, 3, 0, 0, 0, 0, + 0, 0, 208, 3, 0, 0, + 160, 3, 0, 0, 1, 0, + 0, 0, 216, 3, 0, 0, + 0, 0, 0, 0, 228, 3, + 0, 0, 160, 3, 0, 0, + 1, 0, 0, 0, 240, 3, + 0, 0, 0, 0, 0, 0, + 252, 3, 0, 0, 8, 4, + 0, 0, 1, 0, 0, 0, + 24, 4, 0, 0, 0, 0, + 0, 0, 36, 4, 0, 0, + 200, 2, 0, 0, 3, 0, + 0, 0, 44, 4, 0, 0, + 0, 0, 0, 0, 80, 4, + 0, 0, 160, 3, 0, 0, + 1, 0, 0, 0, 92, 4, + 0, 0, 172, 2, 0, 0, + 104, 4, 0, 0, 148, 4, + 0, 0, 3, 0, 0, 0, + 164, 4, 0, 0, 0, 0, + 0, 0, 200, 4, 0, 0, + 16, 5, 0, 0, 3, 0, + 0, 0, 32, 5, 0, 0, + 0, 0, 0, 0, 68, 5, + 0, 0, 160, 3, 0, 0, + 1, 0, 0, 0, 80, 5, + 0, 0, 0, 0, 0, 0, + 92, 5, 0, 0, 160, 3, + 0, 0, 1, 0, 0, 0, + 100, 5, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 19, 0, 15, 160, 0, 0, + 0, 64, 0, 0, 128, 191, + 0, 0, 0, 0, 0, 0, + 128, 63, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 144, 19, 0, 0, 160, + 19, 0, 85, 160, 8, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 228, 128, 12, 0, + 228, 160, 8, 0, 0, 3, + 1, 0, 2, 128, 0, 0, + 228, 128, 13, 0, 228, 160, + 8, 0, 0, 3, 1, 0, + 4, 128, 0, 0, 228, 128, + 14, 0, 228, 160, 36, 0, + 0, 2, 0, 0, 7, 128, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 8, 128, + 4, 0, 228, 161, 0, 0, + 228, 128, 13, 0, 0, 3, + 1, 0, 1, 128, 0, 0, + 255, 128, 19, 0, 170, 160, + 5, 0, 0, 3, 1, 0, + 2, 128, 0, 0, 255, 128, + 1, 0, 0, 128, 5, 0, + 0, 3, 1, 0, 14, 128, + 1, 0, 85, 128, 5, 0, + 144, 160, 1, 0, 0, 2, + 2, 0, 7, 128, 1, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 224, 1, 0, + 249, 128, 2, 0, 228, 128, + 2, 0, 228, 160, 9, 0, + 0, 3, 2, 0, 1, 128, + 0, 0, 228, 144, 9, 0, + 228, 160, 9, 0, 0, 3, + 2, 0, 2, 128, 0, 0, + 228, 144, 10, 0, 228, 160, + 9, 0, 0, 3, 2, 0, + 4, 128, 0, 0, 228, 144, + 11, 0, 228, 160, 2, 0, + 0, 3, 1, 0, 14, 128, + 2, 0, 144, 129, 7, 0, + 144, 160, 36, 0, 0, 2, + 2, 0, 7, 128, 1, 0, + 249, 128, 2, 0, 0, 3, + 1, 0, 14, 128, 2, 0, + 144, 128, 4, 0, 144, 161, + 36, 0, 0, 2, 2, 0, + 7, 128, 1, 0, 249, 128, + 8, 0, 0, 3, 0, 0, + 1, 128, 2, 0, 228, 128, + 0, 0, 228, 128, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 19, 0, + 170, 160, 5, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 0, 128, 0, 0, 0, 128, + 32, 0, 0, 3, 1, 0, + 1, 128, 0, 0, 0, 128, + 3, 0, 255, 160, 5, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 255, 128, 1, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 0, 128, 6, 0, 228, 160, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 17, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 8, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 19, 0, 170, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 19, 0, + 255, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 15, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 16, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 18, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 8, 224, + 1, 0, 255, 160, 1, 0, + 0, 2, 2, 0, 3, 224, + 2, 0, 228, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 24, 5, 0, 0, 64, 0, + 1, 0, 70, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 3, 0, 0, 0, 50, 0, + 0, 15, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 191, 0, 0, + 128, 191, 0, 0, 128, 191, + 0, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 0, 0, 9, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 29, 0, 0, 7, + 18, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 128, 63, 56, 0, + 0, 7, 34, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 8, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 5, 16, 0, + 1, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 50, 0, + 0, 11, 114, 32, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 6, 130, 32, + 16, 0, 0, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 0, 0, 0, 9, 226, 0, + 16, 0, 1, 0, 0, 0, + 6, 9, 16, 128, 65, 0, + 0, 0, 2, 0, 0, 0, + 6, 137, 32, 0, 0, 0, + 0, 0, 12, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 2, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 2, 0, 0, 0, 10, 0, + 16, 0, 2, 0, 0, 0, + 50, 0, 0, 11, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 14, 16, 0, 1, 0, + 0, 0, 6, 0, 16, 0, + 2, 0, 0, 0, 6, 137, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 2, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 2, 0, 0, 0, + 10, 0, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 7, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 14, 16, 0, + 1, 0, 0, 0, 6, 0, + 16, 0, 2, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 52, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 47, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 25, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 56, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 54, 0, + 0, 5, 50, 32, 16, 0, + 2, 0, 0, 0, 70, 16, + 16, 0, 2, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 99, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 3, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 84, + 69, 88, 67, 79, 79, 82, + 68, 0, 79, 83, 71, 78, + 132, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 104, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 12, 0, 0, + 119, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..c8249775a8e2713ed333e7ad288a03defee99f6d GIT binary patch literal 67072 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 Ha^U{~*>lvO literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVc.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVc.inc new file mode 100644 index 0000000..39e855c --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVc.inc @@ -0,0 +1,876 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TEXCOORD 0 xy 2 NONE float xy +// COLOR 0 xyzw 3 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 4 ( FLT, FLT, FLT, FLT) +// c5 cb0 6 1 ( FLT, FLT, FLT, FLT) +// c6 cb0 9 1 ( FLT, FLT, FLT, FLT) +// c7 cb0 12 1 ( FLT, FLT, FLT, FLT) +// c8 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c12 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c19, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + dcl_texcoord3 v3 // vin<9,10,11,12> + +#line 57 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::pos_ws<0> + dp4 r0.y, v0, c10 // ::pos_ws<1> + dp4 r0.z, v0, c11 // ::pos_ws<2> + add r0.xyz, -r0, c7 + nrm r1.xyz, r0 // ::eyeVector<0,1,2> + +#line 33 + add r0.xyz, r1, -c4 + nrm r1.xyz, r0 // ::halfVectors<0,1,2> + +#line 59 + dp3 r0.x, v1, c12 + dp3 r0.y, v1, c13 + dp3 r0.z, v1, c14 + nrm r2.xyz, r0 // ::worldNormal<0,1,2> + +#line 37 + dp3 r0.x, r1, r2 // ::dotH<0> + dp3 r0.y, -c4, r2 // ::dotL<0> + +#line 42 + max r0.x, r0.x, c19.x + +#line 39 + sge r0.z, r0.y, c19.x // ::zeroL<0> + +#line 42 + mul r0.x, r0.z, r0.x + mul r0.z, r0.y, r0.z // ::diffuse<0> + +#line 46 + mul r1.xyz, r0.z, c5 + mov r2.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad r1.xyz, r1, r2, c2 // ::result<0,1,2> + +#line 352 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.xyz, r1, v3 // ::VSBasicOneLightTxVc<0,1,2> + +#line 42 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + pow r1.x, r0.x, c3.w + mul r0.x, r0.y, r1.x // ::specular<0> + +#line 47 + mul r0.xyz, r0.x, c6 + mul oT1.xyz, r0, c3 // ::VSBasicOneLightTxVc<4,5,6> + +#line 63 + dp4 oPos.z, v0, c17 // ::VSBasicOneLightTxVc<12> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c8 + max r0.x, r0.x, c19.x + min oT1.w, r0.x, c19.y // ::VSBasicOneLightTxVc<7> + +#line 352 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.w, v3.w, c1.w // ::VSBasicOneLightTxVc<3> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::vout<0> + dp4 r0.y, v0, c16 // ::vout<1> + dp4 r0.z, v0, c18 // ::vout<3> + +#line 344 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicOneLightTxVc<10,11> + mov oPos.w, r0.z // ::VSBasicOneLightTxVc<13> + +#line 351 + mov oT2.xy, v2 // ::VSBasicOneLightTxVc<8,9> + +// approximately 44 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_input v3.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +dcl_temps 3 +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r0.w, -cb0[3].xyzx, r0.xyzx +ge r1.x, r0.w, l(0.000000) +and r1.x, r1.x, l(0x3f800000) +mul r1.y, r0.w, r1.x +mul r1.yzw, r1.yyyy, cb0[6].xxyz +mad r1.yzw, r1.yyzw, cb0[0].xxyz, cb0[1].xxyz +mul o0.xyz, r1.yzwy, v3.xyzx +mul o0.w, v3.w, cb0[0].w +dp4 r2.x, v0.xyzw, cb0[15].xyzw +dp4 r2.y, v0.xyzw, cb0[16].xyzw +dp4 r2.z, v0.xyzw, cb0[17].xyzw +add r1.yzw, -r2.xxyz, cb0[12].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mad r1.yzw, r1.yyzw, r2.xxxx, -cb0[3].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mul r1.yzw, r1.yyzw, r2.xxxx +dp3 r0.x, r1.yzwy, r0.xyzx +max r0.x, r0.x, l(0.000000) +mul r0.x, r1.x, r0.x +log r0.x, r0.x +mul r0.x, r0.x, cb0[2].w +exp r0.x, r0.x +mul r0.x, r0.w, r0.x +mul r0.xyz, r0.xxxx, cb0[9].xyzx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o2.xy, v2.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicOneLightTxVc[] = +{ + 68, 88, 66, 67, 142, 185, + 48, 27, 238, 227, 226, 19, + 201, 80, 120, 76, 141, 169, + 217, 114, 1, 0, 0, 0, + 72, 16, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 20, 10, 0, 0, 40, 15, + 0, 0, 188, 15, 0, 0, + 65, 111, 110, 57, 220, 9, + 0, 0, 220, 9, 0, 0, + 0, 2, 254, 255, 108, 9, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 1, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 1, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 186, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 188, 6, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 41, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 164, 5, 0, 0, + 144, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 190, 0, 0, 0, + 0, 0, 255, 255, 240, 6, + 0, 0, 0, 0, 255, 255, + 8, 7, 0, 0, 0, 0, + 255, 255, 20, 7, 0, 0, + 0, 0, 255, 255, 32, 7, + 0, 0, 0, 0, 255, 255, + 44, 7, 0, 0, 57, 0, + 0, 0, 56, 7, 0, 0, + 57, 0, 0, 0, 72, 7, + 0, 0, 57, 0, 0, 0, + 88, 7, 0, 0, 58, 0, + 0, 0, 104, 7, 0, 0, + 58, 0, 0, 0, 120, 7, + 0, 0, 33, 0, 0, 0, + 132, 7, 0, 0, 33, 0, + 0, 0, 148, 7, 0, 0, + 59, 0, 0, 0, 160, 7, + 0, 0, 59, 0, 0, 0, + 176, 7, 0, 0, 59, 0, + 0, 0, 192, 7, 0, 0, + 59, 0, 0, 0, 208, 7, + 0, 0, 37, 0, 0, 0, + 220, 7, 0, 0, 36, 0, + 0, 0, 236, 7, 0, 0, + 42, 0, 0, 0, 252, 7, + 0, 0, 39, 0, 0, 0, + 12, 8, 0, 0, 42, 0, + 0, 0, 28, 8, 0, 0, + 41, 0, 0, 0, 44, 8, + 0, 0, 46, 0, 0, 0, + 60, 8, 0, 0, 46, 0, + 0, 0, 76, 8, 0, 0, + 46, 0, 0, 0, 88, 8, + 0, 0, 96, 1, 1, 0, + 108, 8, 0, 0, 42, 0, + 0, 0, 124, 8, 0, 0, + 42, 0, 0, 0, 140, 8, + 0, 0, 47, 0, 0, 0, + 156, 8, 0, 0, 47, 0, + 0, 0, 172, 8, 0, 0, + 63, 0, 0, 0, 188, 8, + 0, 0, 14, 0, 2, 0, + 204, 8, 0, 0, 14, 0, + 2, 0, 220, 8, 0, 0, + 14, 0, 2, 0, 236, 8, + 0, 0, 96, 1, 1, 0, + 252, 8, 0, 0, 63, 0, + 0, 0, 12, 9, 0, 0, + 63, 0, 0, 0, 28, 9, + 0, 0, 63, 0, 0, 0, + 44, 9, 0, 0, 88, 1, + 1, 0, 60, 9, 0, 0, + 88, 1, 1, 0, 80, 9, + 0, 0, 95, 1, 1, 0, + 92, 9, 0, 0, 80, 97, + 114, 97, 109, 101, 116, 101, + 114, 115, 0, 68, 105, 102, + 102, 117, 115, 101, 67, 111, + 108, 111, 114, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 86, 83, 66, 97, + 115, 105, 99, 79, 110, 101, + 76, 105, 103, 104, 116, 84, + 120, 86, 99, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 164, 2, + 0, 0, 172, 2, 0, 0, + 188, 2, 0, 0, 172, 2, + 0, 0, 197, 2, 0, 0, + 208, 2, 0, 0, 224, 2, + 0, 0, 172, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 14, 0, 1, 0, 4, 0, + 236, 2, 0, 0, 25, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 29, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 30, 0, + 0, 0, 255, 255, 255, 255, + 12, 0, 255, 255, 33, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 34, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 38, 0, + 0, 0, 10, 0, 11, 0, + 255, 255, 255, 255, 39, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 13, 0, 40, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 16, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 100, 111, 116, 76, 0, 171, + 171, 171, 17, 0, 0, 0, + 255, 255, 0, 0, 255, 255, + 255, 255, 101, 121, 101, 86, + 101, 99, 116, 111, 114, 0, + 171, 171, 9, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 112, 111, 115, 95, 119, 115, + 0, 171, 5, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 6, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 114, 101, 115, 117, + 108, 116, 0, 171, 164, 2, + 0, 0, 132, 3, 0, 0, + 188, 2, 0, 0, 132, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 60, 4, 0, 0, + 24, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 115, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 27, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 78, 111, 114, 109, 97, + 108, 0, 67, 111, 108, 111, + 114, 0, 171, 171, 132, 4, + 0, 0, 172, 2, 0, 0, + 141, 4, 0, 0, 132, 3, + 0, 0, 197, 2, 0, 0, + 208, 2, 0, 0, 148, 4, + 0, 0, 172, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 13, 0, 1, 0, 4, 0, + 156, 4, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 3, 0, + 0, 0, 7, 0, 8, 0, + 255, 255, 255, 255, 4, 0, + 0, 0, 9, 0, 10, 0, + 11, 0, 12, 0, 118, 111, + 117, 116, 0, 80, 111, 115, + 95, 112, 115, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 1, 5, 0, 0, + 172, 2, 0, 0, 164, 2, + 0, 0, 172, 2, 0, 0, + 188, 2, 0, 0, 132, 3, + 0, 0, 8, 5, 0, 0, + 20, 5, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 36, 5, + 0, 0, 35, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 36, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 37, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 119, 111, 114, 108, + 100, 78, 111, 114, 109, 97, + 108, 0, 15, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 122, 101, 114, 111, + 76, 0, 171, 171, 19, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 255, 255, 92, 2, + 0, 0, 103, 2, 0, 0, + 116, 2, 0, 0, 1, 0, + 0, 0, 132, 2, 0, 0, + 0, 0, 0, 0, 144, 2, + 0, 0, 12, 3, 0, 0, + 8, 0, 0, 0, 28, 3, + 0, 0, 0, 0, 0, 0, + 124, 3, 0, 0, 132, 3, + 0, 0, 1, 0, 0, 0, + 148, 3, 0, 0, 0, 0, + 0, 0, 160, 3, 0, 0, + 132, 3, 0, 0, 1, 0, + 0, 0, 168, 3, 0, 0, + 0, 0, 0, 0, 180, 3, + 0, 0, 132, 3, 0, 0, + 1, 0, 0, 0, 188, 3, + 0, 0, 0, 0, 0, 0, + 200, 3, 0, 0, 132, 3, + 0, 0, 1, 0, 0, 0, + 212, 3, 0, 0, 0, 0, + 0, 0, 224, 3, 0, 0, + 236, 3, 0, 0, 1, 0, + 0, 0, 252, 3, 0, 0, + 0, 0, 0, 0, 8, 4, + 0, 0, 172, 2, 0, 0, + 3, 0, 0, 0, 16, 4, + 0, 0, 0, 0, 0, 0, + 52, 4, 0, 0, 76, 4, + 0, 0, 1, 0, 0, 0, + 92, 4, 0, 0, 0, 0, + 0, 0, 104, 4, 0, 0, + 132, 3, 0, 0, 1, 0, + 0, 0, 116, 4, 0, 0, + 144, 2, 0, 0, 128, 4, + 0, 0, 188, 4, 0, 0, + 4, 0, 0, 0, 204, 4, + 0, 0, 0, 0, 0, 0, + 252, 4, 0, 0, 68, 5, + 0, 0, 3, 0, 0, 0, + 84, 5, 0, 0, 0, 0, + 0, 0, 120, 5, 0, 0, + 132, 3, 0, 0, 1, 0, + 0, 0, 132, 5, 0, 0, + 0, 0, 0, 0, 144, 5, + 0, 0, 132, 3, 0, 0, + 1, 0, 0, 0, 152, 5, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 19, 0, + 15, 160, 0, 0, 0, 0, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 3, 128, 3, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 9, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 10, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 11, 0, 228, 160, + 2, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 228, 129, + 7, 0, 228, 160, 36, 0, + 0, 2, 1, 0, 7, 128, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 7, 128, + 1, 0, 228, 128, 4, 0, + 228, 161, 36, 0, 0, 2, + 1, 0, 7, 128, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 144, 12, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 2, 128, 1, 0, 228, 144, + 13, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 4, 128, + 1, 0, 228, 144, 14, 0, + 228, 160, 36, 0, 0, 2, + 2, 0, 7, 128, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 128, 2, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 2, 128, 4, 0, 228, 161, + 2, 0, 228, 128, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 19, 0, + 0, 160, 13, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 85, 128, 19, 0, 0, 160, + 5, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 170, 128, + 0, 0, 0, 128, 5, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 85, 128, 0, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 170, 128, 5, 0, 228, 160, + 1, 0, 0, 2, 2, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 1, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 2, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 7, 224, 1, 0, + 228, 128, 3, 0, 228, 144, + 32, 0, 0, 3, 1, 0, + 1, 128, 0, 0, 0, 128, + 3, 0, 255, 160, 5, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 85, 128, 1, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 0, 128, 6, 0, 228, 160, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 17, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 8, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 19, 0, 0, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 19, 0, + 85, 160, 5, 0, 0, 3, + 0, 0, 8, 224, 3, 0, + 255, 144, 1, 0, 255, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 15, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 16, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 18, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 2, 0, 3, 224, 2, 0, + 228, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 12, 5, + 0, 0, 64, 0, 1, 0, + 67, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 26, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 114, 16, 16, 0, 1, 0, + 0, 0, 95, 0, 0, 3, + 50, 16, 16, 0, 2, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 3, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 2, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 104, 0, 0, 2, 3, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 29, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 7, 18, 0, 16, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 128, 63, 56, 0, 0, 7, + 34, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 8, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 5, 16, 0, 1, 0, + 0, 0, 6, 137, 32, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 50, 0, 0, 11, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 14, 16, 0, + 1, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 18, 16, 0, 3, 0, + 0, 0, 56, 0, 0, 8, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 3, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 16, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, + 0, 9, 226, 0, 16, 0, + 1, 0, 0, 0, 6, 9, + 16, 128, 65, 0, 0, 0, + 2, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 2, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 2, 0, + 0, 0, 10, 0, 16, 0, + 2, 0, 0, 0, 50, 0, + 0, 11, 226, 0, 16, 0, + 1, 0, 0, 0, 86, 14, + 16, 0, 1, 0, 0, 0, + 6, 0, 16, 0, 2, 0, + 0, 0, 6, 137, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 2, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 2, 0, 0, 0, 10, 0, + 16, 0, 2, 0, 0, 0, + 56, 0, 0, 7, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 14, 16, 0, 1, 0, + 0, 0, 6, 0, 16, 0, + 2, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 52, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 47, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 25, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 56, 0, + 0, 8, 114, 32, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 54, 0, 0, 5, + 50, 32, 16, 0, 2, 0, + 0, 0, 70, 16, 16, 0, + 2, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 140, 0, 0, 0, + 4, 0, 0, 0, 8, 0, + 0, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 123, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 3, + 0, 0, 132, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 15, 15, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 67, 79, 76, 79, 82, 0, + 171, 171, 79, 83, 71, 78, + 132, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 104, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 12, 0, 0, + 119, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVc.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..4c565d79b6d9224286f6c6694f507f434c10c415 GIT binary patch literal 67072 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 TC+tZ`fsg_r1wsmxNrC?dNR`K8 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVcBn.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVcBn.inc new file mode 100644 index 0000000..3f41f80 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVcBn.inc @@ -0,0 +1,905 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TEXCOORD 0 xy 2 NONE float xy +// COLOR 0 xyzw 3 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 4 ( FLT, FLT, FLT, FLT) +// c5 cb0 6 1 ( FLT, FLT, FLT, FLT) +// c6 cb0 9 1 ( FLT, FLT, FLT, FLT) +// c7 cb0 12 1 ( FLT, FLT, FLT, FLT) +// c8 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c12 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c19, 2, -1, 0, 1 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + dcl_texcoord3 v3 // vin<9,10,11,12> + +#line 57 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::pos_ws<0> + dp4 r0.y, v0, c10 // ::pos_ws<1> + dp4 r0.z, v0, c11 // ::pos_ws<2> + add r0.xyz, -r0, c7 + nrm r1.xyz, r0 // ::eyeVector<0,1,2> + +#line 33 + add r0.xyz, r1, -c4 + nrm r1.xyz, r0 // ::halfVectors<0,1,2> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c19.x, c19.y // ::BiasX2<0,1,2> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r2.x, r0, c12 + dp3 r2.y, r0, c13 + dp3 r2.z, r0, c14 + nrm r0.xyz, r2 // ::worldNormal<0,1,2> + +#line 37 + dp3 r0.w, r1, r0 // ::dotH<0> + dp3 r0.x, -c4, r0 // ::dotL<0> + +#line 42 + max r0.y, r0.w, c19.z + +#line 39 + sge r0.z, r0.x, c19.z // ::zeroL<0> + +#line 42 + mul r0.y, r0.z, r0.y + mul r0.z, r0.x, r0.z // ::diffuse<0> + +#line 46 + mul r1.xyz, r0.z, c5 + mov r2.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad r1.xyz, r1, r2, c2 // ::result<0,1,2> + +#line 367 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.xyz, r1, v3 // ::VSBasicOneLightTxVcBn<0,1,2> + +#line 42 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + pow r1.x, r0.y, c3.w + mul r0.x, r0.x, r1.x // ::specular<0> + +#line 47 + mul r0.xyz, r0.x, c6 + mul oT1.xyz, r0, c3 // ::VSBasicOneLightTxVcBn<4,5,6> + +#line 63 + dp4 oPos.z, v0, c17 // ::VSBasicOneLightTxVcBn<12> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c8 + max r0.x, r0.x, c19.z + min oT1.w, r0.x, c19.w // ::VSBasicOneLightTxVcBn<7> + +#line 367 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.w, v3.w, c1.w // ::VSBasicOneLightTxVcBn<3> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::vout<0> + dp4 r0.y, v0, c16 // ::vout<1> + dp4 r0.z, v0, c18 // ::vout<3> + +#line 357 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicOneLightTxVcBn<10,11> + mov oPos.w, r0.z // ::VSBasicOneLightTxVcBn<13> + +#line 366 + mov oT2.xy, v2 // ::VSBasicOneLightTxVcBn<8,9> + +// approximately 45 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_input v3.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +dcl_temps 3 +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, r1.xyzx +dp3 r0.w, -cb0[3].xyzx, r0.xyzx +ge r1.x, r0.w, l(0.000000) +and r1.x, r1.x, l(0x3f800000) +mul r1.y, r0.w, r1.x +mul r1.yzw, r1.yyyy, cb0[6].xxyz +mad r1.yzw, r1.yyzw, cb0[0].xxyz, cb0[1].xxyz +mul o0.xyz, r1.yzwy, v3.xyzx +mul o0.w, v3.w, cb0[0].w +dp4 r2.x, v0.xyzw, cb0[15].xyzw +dp4 r2.y, v0.xyzw, cb0[16].xyzw +dp4 r2.z, v0.xyzw, cb0[17].xyzw +add r1.yzw, -r2.xxyz, cb0[12].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mad r1.yzw, r1.yyzw, r2.xxxx, -cb0[3].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mul r1.yzw, r1.yyzw, r2.xxxx +dp3 r0.x, r1.yzwy, r0.xyzx +max r0.x, r0.x, l(0.000000) +mul r0.x, r1.x, r0.x +log r0.x, r0.x +mul r0.x, r0.x, cb0[2].w +exp r0.x, r0.x +mul r0.x, r0.w, r0.x +mul r0.xyz, r0.xxxx, cb0[9].xyzx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o2.xy, v2.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicOneLightTxVcBn[] = +{ + 68, 88, 66, 67, 184, 199, + 115, 14, 219, 27, 227, 201, + 185, 136, 146, 98, 114, 141, + 170, 146, 1, 0, 0, 0, + 220, 16, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 108, 10, 0, 0, 188, 15, + 0, 0, 80, 16, 0, 0, + 65, 111, 110, 57, 52, 10, + 0, 0, 52, 10, 0, 0, + 0, 2, 254, 255, 196, 9, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 1, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 1, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 203, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 0, 7, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 42, 0, 0, 0, + 20, 1, 0, 0, 15, 0, + 0, 0, 212, 5, 0, 0, + 188, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 52, 7, + 0, 0, 0, 0, 255, 255, + 76, 7, 0, 0, 0, 0, + 255, 255, 88, 7, 0, 0, + 0, 0, 255, 255, 100, 7, + 0, 0, 0, 0, 255, 255, + 112, 7, 0, 0, 57, 0, + 0, 0, 124, 7, 0, 0, + 57, 0, 0, 0, 140, 7, + 0, 0, 57, 0, 0, 0, + 156, 7, 0, 0, 58, 0, + 0, 0, 172, 7, 0, 0, + 58, 0, 0, 0, 188, 7, + 0, 0, 33, 0, 0, 0, + 200, 7, 0, 0, 33, 0, + 0, 0, 216, 7, 0, 0, + 32, 0, 1, 0, 228, 7, + 0, 0, 59, 0, 0, 0, + 248, 7, 0, 0, 59, 0, + 0, 0, 8, 8, 0, 0, + 59, 0, 0, 0, 24, 8, + 0, 0, 59, 0, 0, 0, + 40, 8, 0, 0, 37, 0, + 0, 0, 52, 8, 0, 0, + 36, 0, 0, 0, 68, 8, + 0, 0, 42, 0, 0, 0, + 84, 8, 0, 0, 39, 0, + 0, 0, 100, 8, 0, 0, + 42, 0, 0, 0, 116, 8, + 0, 0, 41, 0, 0, 0, + 132, 8, 0, 0, 46, 0, + 0, 0, 148, 8, 0, 0, + 46, 0, 0, 0, 164, 8, + 0, 0, 46, 0, 0, 0, + 176, 8, 0, 0, 111, 1, + 2, 0, 196, 8, 0, 0, + 42, 0, 0, 0, 212, 8, + 0, 0, 42, 0, 0, 0, + 228, 8, 0, 0, 47, 0, + 0, 0, 244, 8, 0, 0, + 47, 0, 0, 0, 4, 9, + 0, 0, 63, 0, 0, 0, + 20, 9, 0, 0, 14, 0, + 1, 0, 36, 9, 0, 0, + 14, 0, 1, 0, 52, 9, + 0, 0, 14, 0, 1, 0, + 68, 9, 0, 0, 111, 1, + 2, 0, 84, 9, 0, 0, + 63, 0, 0, 0, 100, 9, + 0, 0, 63, 0, 0, 0, + 116, 9, 0, 0, 63, 0, + 0, 0, 132, 9, 0, 0, + 101, 1, 2, 0, 148, 9, + 0, 0, 101, 1, 2, 0, + 168, 9, 0, 0, 110, 1, + 2, 0, 180, 9, 0, 0, + 66, 105, 97, 115, 88, 50, + 0, 171, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 80, 97, 114, 97, 109, 101, + 116, 101, 114, 115, 0, 68, + 105, 102, 102, 117, 115, 101, + 67, 111, 108, 111, 114, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 86, 83, + 66, 97, 115, 105, 99, 79, + 110, 101, 76, 105, 103, 104, + 116, 84, 120, 86, 99, 66, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 210, 2, + 0, 0, 220, 2, 0, 0, + 236, 2, 0, 0, 220, 2, + 0, 0, 245, 2, 0, 0, + 0, 3, 0, 0, 16, 3, + 0, 0, 220, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 14, 0, 1, 0, 4, 0, + 28, 3, 0, 0, 26, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 30, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 31, 0, + 0, 0, 255, 255, 255, 255, + 12, 0, 255, 255, 34, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 35, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 39, 0, + 0, 0, 10, 0, 11, 0, + 255, 255, 255, 255, 40, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 13, 0, 41, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 17, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 0, 0, + 100, 111, 116, 76, 0, 171, + 171, 171, 18, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 101, 121, 101, 86, + 101, 99, 116, 111, 114, 0, + 171, 171, 9, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 112, 111, 115, 95, 119, 115, + 0, 171, 5, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 6, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 114, 101, 115, 117, + 108, 116, 0, 171, 210, 2, + 0, 0, 180, 3, 0, 0, + 236, 2, 0, 0, 180, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 108, 4, 0, 0, + 25, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 115, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 28, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 78, 111, 114, 109, 97, + 108, 0, 67, 111, 108, 111, + 114, 0, 171, 171, 180, 4, + 0, 0, 220, 2, 0, 0, + 189, 4, 0, 0, 180, 3, + 0, 0, 245, 2, 0, 0, + 0, 3, 0, 0, 196, 4, + 0, 0, 220, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 13, 0, 1, 0, 4, 0, + 204, 4, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 3, 0, + 0, 0, 7, 0, 8, 0, + 255, 255, 255, 255, 4, 0, + 0, 0, 9, 0, 10, 0, + 11, 0, 12, 0, 118, 111, + 117, 116, 0, 80, 111, 115, + 95, 112, 115, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 49, 5, 0, 0, + 220, 2, 0, 0, 210, 2, + 0, 0, 220, 2, 0, 0, + 236, 2, 0, 0, 180, 3, + 0, 0, 56, 5, 0, 0, + 68, 5, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 84, 5, + 0, 0, 36, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 37, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 38, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 119, 111, 114, 108, + 100, 78, 111, 114, 109, 97, + 108, 0, 16, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 122, 101, 114, 111, + 76, 0, 171, 171, 20, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 255, 255, 0, 0, + 0, 0, 100, 2, 0, 0, + 108, 2, 0, 0, 1, 0, + 0, 0, 124, 2, 0, 0, + 136, 2, 0, 0, 147, 2, + 0, 0, 160, 2, 0, 0, + 1, 0, 0, 0, 176, 2, + 0, 0, 0, 0, 0, 0, + 188, 2, 0, 0, 60, 3, + 0, 0, 8, 0, 0, 0, + 76, 3, 0, 0, 0, 0, + 0, 0, 172, 3, 0, 0, + 180, 3, 0, 0, 1, 0, + 0, 0, 196, 3, 0, 0, + 0, 0, 0, 0, 208, 3, + 0, 0, 180, 3, 0, 0, + 1, 0, 0, 0, 216, 3, + 0, 0, 0, 0, 0, 0, + 228, 3, 0, 0, 180, 3, + 0, 0, 1, 0, 0, 0, + 236, 3, 0, 0, 0, 0, + 0, 0, 248, 3, 0, 0, + 180, 3, 0, 0, 1, 0, + 0, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 16, 4, + 0, 0, 28, 4, 0, 0, + 1, 0, 0, 0, 44, 4, + 0, 0, 0, 0, 0, 0, + 56, 4, 0, 0, 220, 2, + 0, 0, 3, 0, 0, 0, + 64, 4, 0, 0, 0, 0, + 0, 0, 100, 4, 0, 0, + 124, 4, 0, 0, 1, 0, + 0, 0, 140, 4, 0, 0, + 0, 0, 0, 0, 152, 4, + 0, 0, 180, 3, 0, 0, + 1, 0, 0, 0, 164, 4, + 0, 0, 188, 2, 0, 0, + 176, 4, 0, 0, 236, 4, + 0, 0, 4, 0, 0, 0, + 252, 4, 0, 0, 0, 0, + 0, 0, 44, 5, 0, 0, + 116, 5, 0, 0, 3, 0, + 0, 0, 132, 5, 0, 0, + 0, 0, 0, 0, 168, 5, + 0, 0, 180, 3, 0, 0, + 1, 0, 0, 0, 180, 5, + 0, 0, 0, 0, 0, 0, + 192, 5, 0, 0, 180, 3, + 0, 0, 1, 0, 0, 0, + 200, 5, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 19, 0, 15, 160, 0, 0, + 0, 64, 0, 0, 128, 191, + 0, 0, 0, 0, 0, 0, + 128, 63, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 3, 128, 3, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 9, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 10, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 11, 0, + 228, 160, 2, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 228, 129, 7, 0, 228, 160, + 36, 0, 0, 2, 1, 0, + 7, 128, 0, 0, 228, 128, + 2, 0, 0, 3, 0, 0, + 7, 128, 1, 0, 228, 128, + 4, 0, 228, 161, 36, 0, + 0, 2, 1, 0, 7, 128, + 0, 0, 228, 128, 4, 0, + 0, 4, 0, 0, 7, 128, + 1, 0, 228, 144, 19, 0, + 0, 160, 19, 0, 85, 160, + 8, 0, 0, 3, 2, 0, + 1, 128, 0, 0, 228, 128, + 12, 0, 228, 160, 8, 0, + 0, 3, 2, 0, 2, 128, + 0, 0, 228, 128, 13, 0, + 228, 160, 8, 0, 0, 3, + 2, 0, 4, 128, 0, 0, + 228, 128, 14, 0, 228, 160, + 36, 0, 0, 2, 0, 0, + 7, 128, 2, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 8, 128, 1, 0, 228, 128, + 0, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 1, 128, + 4, 0, 228, 161, 0, 0, + 228, 128, 11, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 255, 128, 19, 0, 170, 160, + 13, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 0, 128, + 19, 0, 170, 160, 5, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 170, 128, 0, 0, + 85, 128, 5, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 0, 128, 0, 0, 170, 128, + 5, 0, 0, 3, 1, 0, + 7, 128, 0, 0, 170, 128, + 5, 0, 228, 160, 1, 0, + 0, 2, 2, 0, 7, 128, + 1, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 7, 128, + 1, 0, 228, 128, 2, 0, + 228, 128, 2, 0, 228, 160, + 5, 0, 0, 3, 0, 0, + 7, 224, 1, 0, 228, 128, + 3, 0, 228, 144, 32, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 85, 128, 3, 0, + 255, 160, 5, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 0, 128, 1, 0, 0, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 0, 128, + 6, 0, 228, 160, 5, 0, + 0, 3, 1, 0, 7, 224, + 0, 0, 228, 128, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 17, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 8, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 19, 0, + 170, 160, 10, 0, 0, 3, + 1, 0, 8, 224, 0, 0, + 0, 128, 19, 0, 255, 160, + 5, 0, 0, 3, 0, 0, + 8, 224, 3, 0, 255, 144, + 1, 0, 255, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 15, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 16, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 18, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 2, 0, + 3, 224, 2, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 72, 5, 0, 0, + 64, 0, 1, 0, 82, 1, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 3, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 2, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 3, 0, 0, 0, + 50, 0, 0, 15, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 64, 0, 0, + 0, 64, 0, 0, 0, 64, + 0, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 191, + 0, 0, 128, 191, 0, 0, + 128, 191, 0, 0, 0, 0, + 16, 0, 0, 8, 18, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 19, 0, + 0, 0, 16, 0, 0, 8, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 16, 0, + 0, 8, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 21, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 9, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 29, 0, + 0, 7, 18, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 7, + 18, 0, 16, 0, 1, 0, + 0, 0, 10, 0, 16, 0, + 1, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 128, 63, + 56, 0, 0, 7, 34, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 8, 226, 0, 16, 0, + 1, 0, 0, 0, 86, 5, + 16, 0, 1, 0, 0, 0, + 6, 137, 32, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 50, 0, 0, 11, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 14, 16, 0, 1, 0, + 0, 0, 6, 137, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 6, 137, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 56, 0, 0, 7, + 114, 32, 16, 0, 0, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 70, 18, + 16, 0, 3, 0, 0, 0, + 56, 0, 0, 8, 130, 32, + 16, 0, 0, 0, 0, 0, + 58, 16, 16, 0, 3, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 17, 0, + 0, 8, 34, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 17, 0, 0, 8, 66, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 0, 0, 0, 9, + 226, 0, 16, 0, 1, 0, + 0, 0, 6, 9, 16, 128, + 65, 0, 0, 0, 2, 0, + 0, 0, 6, 137, 32, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 2, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 2, 0, 0, 0, + 10, 0, 16, 0, 2, 0, + 0, 0, 50, 0, 0, 11, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 14, 16, 0, + 1, 0, 0, 0, 6, 0, + 16, 0, 2, 0, 0, 0, + 6, 137, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 2, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 2, 0, + 0, 0, 10, 0, 16, 0, + 2, 0, 0, 0, 56, 0, + 0, 7, 226, 0, 16, 0, + 1, 0, 0, 0, 86, 14, + 16, 0, 1, 0, 0, 0, + 6, 0, 16, 0, 2, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 52, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 47, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 25, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 9, 0, + 0, 0, 56, 0, 0, 8, + 114, 32, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 2, 0, 0, 0, + 70, 16, 16, 0, 2, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 140, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 123, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 132, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 15, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 67, 79, + 76, 79, 82, 0, 171, 171, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 110, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVcBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightTxVcBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..660439be11e9d6770cfe15699f7de055fba51792 GIT binary patch literal 67072 zcmeHQeQX@Zb)O?;T9kRVBwPNFWqTsaG9}Ucjw8#GB8sF;#uQ1D6sg2?q|@<8o^`yt z+#M;(P8zvUkQ6ZtwMc{1FyI7D(f;8CDeAUykpe~#G({4iY2g$x;1ouh8a80WA8q$W{1eTs zttpedc1O@7b?B{rKnQ$ z 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVc.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVc.inc new file mode 100644 index 0000000..4530ff2 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVc.inc @@ -0,0 +1,831 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// COLOR 0 xyzw 2 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// SV_Position 0 xyzw 2 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 4 ( FLT, FLT, FLT, FLT) +// c5 cb0 6 1 ( FLT, FLT, FLT, FLT) +// c6 cb0 9 1 ( FLT, FLT, FLT, FLT) +// c7 cb0 12 1 ( FLT, FLT, FLT, FLT) +// c8 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c12 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c19, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8,9,10> + +#line 57 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::pos_ws<0> + dp4 r0.y, v0, c10 // ::pos_ws<1> + dp4 r0.z, v0, c11 // ::pos_ws<2> + add r0.xyz, -r0, c7 + nrm r1.xyz, r0 // ::eyeVector<0,1,2> + +#line 33 + add r0.xyz, r1, -c4 + nrm r1.xyz, r0 // ::halfVectors<0,1,2> + +#line 59 + dp3 r0.x, v1, c12 + dp3 r0.y, v1, c13 + dp3 r0.z, v1, c14 + nrm r2.xyz, r0 // ::worldNormal<0,1,2> + +#line 37 + dp3 r0.x, r1, r2 // ::dotH<0> + dp3 r0.y, -c4, r2 // ::dotL<0> + +#line 42 + max r0.x, r0.x, c19.x + +#line 39 + sge r0.z, r0.y, c19.x // ::zeroL<0> + +#line 42 + mul r0.x, r0.z, r0.x + mul r0.z, r0.y, r0.z // ::diffuse<0> + +#line 46 + mul r1.xyz, r0.z, c5 + mov r2.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad r1.xyz, r1, r2, c2 // ::result<0,1,2> + +#line 295 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.xyz, r1, v2 // ::VSBasicOneLightVc<0,1,2> + +#line 42 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + pow r1.x, r0.x, c3.w + mul r0.x, r0.y, r1.x // ::specular<0> + +#line 47 + mul r0.xyz, r0.x, c6 + mul oT1.xyz, r0, c3 // ::VSBasicOneLightVc<4,5,6> + +#line 63 + dp4 oPos.z, v0, c17 // ::VSBasicOneLightVc<10> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c8 + max r0.x, r0.x, c19.x + min oT1.w, r0.x, c19.y // ::VSBasicOneLightVc<7> + +#line 295 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.w, v2.w, c1.w // ::VSBasicOneLightVc<3> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::vout<0> + dp4 r0.y, v0, c16 // ::vout<1> + dp4 r0.z, v0, c18 // ::vout<3> + +#line 288 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicOneLightVc<8,9> + mov oPos.w, r0.z // ::VSBasicOneLightVc<11> + +// approximately 43 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +dcl_temps 3 +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r0.w, -cb0[3].xyzx, r0.xyzx +ge r1.x, r0.w, l(0.000000) +and r1.x, r1.x, l(0x3f800000) +mul r1.y, r0.w, r1.x +mul r1.yzw, r1.yyyy, cb0[6].xxyz +mad r1.yzw, r1.yyzw, cb0[0].xxyz, cb0[1].xxyz +mul o0.xyz, r1.yzwy, v2.xyzx +mul o0.w, v2.w, cb0[0].w +dp4 r2.x, v0.xyzw, cb0[15].xyzw +dp4 r2.y, v0.xyzw, cb0[16].xyzw +dp4 r2.z, v0.xyzw, cb0[17].xyzw +add r1.yzw, -r2.xxyz, cb0[12].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mad r1.yzw, r1.yyzw, r2.xxxx, -cb0[3].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mul r1.yzw, r1.yyzw, r2.xxxx +dp3 r0.x, r1.yzwy, r0.xyzx +max r0.x, r0.x, l(0.000000) +mul r0.x, r1.x, r0.x +log r0.x, r0.x +mul r0.x, r0.x, cb0[2].w +exp r0.x, r0.x +mul r0.x, r0.w, r0.x +mul r0.xyz, r0.xxxx, cb0[9].xyzx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicOneLightVc[] = +{ + 68, 88, 66, 67, 70, 215, + 141, 216, 72, 191, 225, 237, + 12, 52, 127, 198, 67, 99, + 28, 86, 1, 0, 0, 0, + 112, 15, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 168, 9, 0, 0, 144, 14, + 0, 0, 4, 15, 0, 0, + 65, 111, 110, 57, 112, 9, + 0, 0, 112, 9, 0, 0, + 0, 2, 254, 255, 0, 9, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 1, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 1, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 165, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 104, 6, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 39, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 80, 5, 0, 0, + 128, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 190, 0, 0, 0, + 0, 0, 255, 255, 156, 6, + 0, 0, 0, 0, 255, 255, + 180, 6, 0, 0, 0, 0, + 255, 255, 192, 6, 0, 0, + 0, 0, 255, 255, 204, 6, + 0, 0, 57, 0, 0, 0, + 216, 6, 0, 0, 57, 0, + 0, 0, 232, 6, 0, 0, + 57, 0, 0, 0, 248, 6, + 0, 0, 58, 0, 0, 0, + 8, 7, 0, 0, 58, 0, + 0, 0, 24, 7, 0, 0, + 33, 0, 0, 0, 36, 7, + 0, 0, 33, 0, 0, 0, + 52, 7, 0, 0, 59, 0, + 0, 0, 64, 7, 0, 0, + 59, 0, 0, 0, 80, 7, + 0, 0, 59, 0, 0, 0, + 96, 7, 0, 0, 59, 0, + 0, 0, 112, 7, 0, 0, + 37, 0, 0, 0, 124, 7, + 0, 0, 36, 0, 0, 0, + 140, 7, 0, 0, 42, 0, + 0, 0, 156, 7, 0, 0, + 39, 0, 0, 0, 172, 7, + 0, 0, 42, 0, 0, 0, + 188, 7, 0, 0, 41, 0, + 0, 0, 204, 7, 0, 0, + 46, 0, 0, 0, 220, 7, + 0, 0, 46, 0, 0, 0, + 236, 7, 0, 0, 46, 0, + 0, 0, 248, 7, 0, 0, + 39, 1, 1, 0, 12, 8, + 0, 0, 42, 0, 0, 0, + 28, 8, 0, 0, 42, 0, + 0, 0, 44, 8, 0, 0, + 47, 0, 0, 0, 60, 8, + 0, 0, 47, 0, 0, 0, + 76, 8, 0, 0, 63, 0, + 0, 0, 92, 8, 0, 0, + 14, 0, 2, 0, 108, 8, + 0, 0, 14, 0, 2, 0, + 124, 8, 0, 0, 14, 0, + 2, 0, 140, 8, 0, 0, + 39, 1, 1, 0, 156, 8, + 0, 0, 63, 0, 0, 0, + 172, 8, 0, 0, 63, 0, + 0, 0, 188, 8, 0, 0, + 63, 0, 0, 0, 204, 8, + 0, 0, 32, 1, 1, 0, + 220, 8, 0, 0, 32, 1, + 1, 0, 240, 8, 0, 0, + 80, 97, 114, 97, 109, 101, + 116, 101, 114, 115, 0, 68, + 105, 102, 102, 117, 115, 101, + 67, 111, 108, 111, 114, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 86, 83, + 66, 97, 115, 105, 99, 79, + 110, 101, 76, 105, 103, 104, + 116, 86, 99, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 80, 111, 115, + 105, 116, 105, 111, 110, 80, + 83, 0, 146, 2, 0, 0, + 156, 2, 0, 0, 172, 2, + 0, 0, 156, 2, 0, 0, + 181, 2, 0, 0, 156, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 3, 0, 192, 2, 0, 0, + 24, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 28, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 29, 0, 0, 0, 255, 255, + 255, 255, 10, 0, 255, 255, + 32, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 7, 0, + 33, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 3, 0, + 37, 0, 0, 0, 8, 0, + 9, 0, 255, 255, 255, 255, + 38, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 11, 0, + 100, 105, 102, 102, 117, 115, + 101, 0, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 255, 255, + 100, 111, 116, 72, 0, 171, + 171, 171, 15, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 100, 111, 116, 76, + 0, 171, 171, 171, 16, 0, + 0, 0, 255, 255, 0, 0, + 255, 255, 255, 255, 101, 121, + 101, 86, 101, 99, 116, 111, + 114, 0, 171, 171, 8, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 104, 97, + 108, 102, 86, 101, 99, 116, + 111, 114, 115, 0, 3, 0, + 3, 0, 3, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 112, 111, 115, 95, + 119, 115, 0, 171, 4, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 5, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 6, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 114, 101, + 115, 117, 108, 116, 0, 171, + 146, 2, 0, 0, 68, 3, + 0, 0, 172, 2, 0, 0, + 68, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 6, 0, + 1, 0, 2, 0, 252, 3, + 0, 0, 23, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 115, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 26, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 67, 111, + 108, 111, 114, 0, 171, 171, + 68, 4, 0, 0, 156, 2, + 0, 0, 77, 4, 0, 0, + 68, 3, 0, 0, 84, 4, + 0, 0, 156, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 11, 0, 1, 0, 3, 0, + 92, 4, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 3, 0, + 0, 0, 7, 0, 8, 0, + 9, 0, 10, 0, 118, 111, + 117, 116, 0, 80, 111, 115, + 95, 112, 115, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 173, 4, 0, 0, + 156, 2, 0, 0, 146, 2, + 0, 0, 156, 2, 0, 0, + 172, 2, 0, 0, 68, 3, + 0, 0, 180, 4, 0, 0, + 192, 4, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 208, 4, + 0, 0, 34, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 35, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 36, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 119, 111, 114, 108, + 100, 78, 111, 114, 109, 97, + 108, 0, 14, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 122, 101, 114, 111, + 76, 0, 171, 171, 18, 0, + 0, 0, 255, 255, 255, 255, + 0, 0, 255, 255, 76, 2, + 0, 0, 87, 2, 0, 0, + 100, 2, 0, 0, 1, 0, + 0, 0, 116, 2, 0, 0, + 0, 0, 0, 0, 128, 2, + 0, 0, 216, 2, 0, 0, + 7, 0, 0, 0, 232, 2, + 0, 0, 0, 0, 0, 0, + 60, 3, 0, 0, 68, 3, + 0, 0, 1, 0, 0, 0, + 84, 3, 0, 0, 0, 0, + 0, 0, 96, 3, 0, 0, + 68, 3, 0, 0, 1, 0, + 0, 0, 104, 3, 0, 0, + 0, 0, 0, 0, 116, 3, + 0, 0, 68, 3, 0, 0, + 1, 0, 0, 0, 124, 3, + 0, 0, 0, 0, 0, 0, + 136, 3, 0, 0, 68, 3, + 0, 0, 1, 0, 0, 0, + 148, 3, 0, 0, 0, 0, + 0, 0, 160, 3, 0, 0, + 172, 3, 0, 0, 1, 0, + 0, 0, 188, 3, 0, 0, + 0, 0, 0, 0, 200, 3, + 0, 0, 156, 2, 0, 0, + 3, 0, 0, 0, 208, 3, + 0, 0, 0, 0, 0, 0, + 244, 3, 0, 0, 12, 4, + 0, 0, 1, 0, 0, 0, + 28, 4, 0, 0, 0, 0, + 0, 0, 40, 4, 0, 0, + 68, 3, 0, 0, 1, 0, + 0, 0, 52, 4, 0, 0, + 128, 2, 0, 0, 64, 4, + 0, 0, 116, 4, 0, 0, + 3, 0, 0, 0, 132, 4, + 0, 0, 0, 0, 0, 0, + 168, 4, 0, 0, 240, 4, + 0, 0, 3, 0, 0, 0, + 0, 5, 0, 0, 0, 0, + 0, 0, 36, 5, 0, 0, + 68, 3, 0, 0, 1, 0, + 0, 0, 48, 5, 0, 0, + 0, 0, 0, 0, 60, 5, + 0, 0, 68, 3, 0, 0, + 1, 0, 0, 0, 68, 5, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 19, 0, + 15, 160, 0, 0, 0, 0, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 9, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 10, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 11, 0, 228, 160, + 2, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 228, 129, + 7, 0, 228, 160, 36, 0, + 0, 2, 1, 0, 7, 128, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 7, 128, + 1, 0, 228, 128, 4, 0, + 228, 161, 36, 0, 0, 2, + 1, 0, 7, 128, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 144, 12, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 2, 128, 1, 0, 228, 144, + 13, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 4, 128, + 1, 0, 228, 144, 14, 0, + 228, 160, 36, 0, 0, 2, + 2, 0, 7, 128, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 128, 2, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 2, 128, 4, 0, 228, 161, + 2, 0, 228, 128, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 19, 0, + 0, 160, 13, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 85, 128, 19, 0, 0, 160, + 5, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 170, 128, + 0, 0, 0, 128, 5, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 85, 128, 0, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 170, 128, 5, 0, 228, 160, + 1, 0, 0, 2, 2, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 1, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 2, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 7, 224, 1, 0, + 228, 128, 2, 0, 228, 144, + 32, 0, 0, 3, 1, 0, + 1, 128, 0, 0, 0, 128, + 3, 0, 255, 160, 5, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 85, 128, 1, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 0, 128, 6, 0, 228, 160, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 17, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 8, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 19, 0, 0, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 19, 0, + 85, 160, 5, 0, 0, 3, + 0, 0, 8, 224, 2, 0, + 255, 144, 1, 0, 255, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 15, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 16, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 18, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 224, 4, + 0, 0, 64, 0, 1, 0, + 56, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 26, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 114, 16, 16, 0, 1, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 104, 0, 0, 2, 3, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 29, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 7, 18, 0, 16, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 128, 63, 56, 0, 0, 7, + 34, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 8, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 5, 16, 0, 1, 0, + 0, 0, 6, 137, 32, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 50, 0, 0, 11, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 14, 16, 0, + 1, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 8, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 2, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 16, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, + 0, 9, 226, 0, 16, 0, + 1, 0, 0, 0, 6, 9, + 16, 128, 65, 0, 0, 0, + 2, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 2, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 2, 0, + 0, 0, 10, 0, 16, 0, + 2, 0, 0, 0, 50, 0, + 0, 11, 226, 0, 16, 0, + 1, 0, 0, 0, 86, 14, + 16, 0, 1, 0, 0, 0, + 6, 0, 16, 0, 2, 0, + 0, 0, 6, 137, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 2, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 2, 0, 0, 0, 10, 0, + 16, 0, 2, 0, 0, 0, + 56, 0, 0, 7, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 14, 16, 0, 1, 0, + 0, 0, 6, 0, 16, 0, + 2, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 52, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 47, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 25, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 56, 0, + 0, 8, 114, 32, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 108, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 99, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 15, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 67, 79, 76, 79, 82, + 0, 171, 171, 171, 79, 83, + 71, 78, 100, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 80, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 0, + 0, 0, 67, 79, 76, 79, + 82, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVc.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e3999ea4ed6c51f038213ef064b3c4d52b872ccc GIT binary patch literal 67072 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 Yu6*gr=}y>_kOCnELJEWwsE`8x4@6&@z5oCK literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVcBn.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVcBn.inc new file mode 100644 index 0000000..f5b751b --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVcBn.inc @@ -0,0 +1,859 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// COLOR 0 xyzw 2 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// SV_Position 0 xyzw 2 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 4 ( FLT, FLT, FLT, FLT) +// c5 cb0 6 1 ( FLT, FLT, FLT, FLT) +// c6 cb0 9 1 ( FLT, FLT, FLT, FLT) +// c7 cb0 12 1 ( FLT, FLT, FLT, FLT) +// c8 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c12 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c19, 2, -1, 0, 1 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8,9,10> + +#line 57 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::pos_ws<0> + dp4 r0.y, v0, c10 // ::pos_ws<1> + dp4 r0.z, v0, c11 // ::pos_ws<2> + add r0.xyz, -r0, c7 + nrm r1.xyz, r0 // ::eyeVector<0,1,2> + +#line 33 + add r0.xyz, r1, -c4 + nrm r1.xyz, r0 // ::halfVectors<0,1,2> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c19.x, c19.y // ::BiasX2<0,1,2> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r2.x, r0, c12 + dp3 r2.y, r0, c13 + dp3 r2.z, r0, c14 + nrm r0.xyz, r2 // ::worldNormal<0,1,2> + +#line 37 + dp3 r0.w, r1, r0 // ::dotH<0> + dp3 r0.x, -c4, r0 // ::dotL<0> + +#line 42 + max r0.y, r0.w, c19.z + +#line 39 + sge r0.z, r0.x, c19.z // ::zeroL<0> + +#line 42 + mul r0.y, r0.z, r0.y + mul r0.z, r0.x, r0.z // ::diffuse<0> + +#line 46 + mul r1.xyz, r0.z, c5 + mov r2.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad r1.xyz, r1, r2, c2 // ::result<0,1,2> + +#line 309 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.xyz, r1, v2 // ::VSBasicOneLightVcBn<0,1,2> + +#line 42 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + pow r1.x, r0.y, c3.w + mul r0.x, r0.x, r1.x // ::specular<0> + +#line 47 + mul r0.xyz, r0.x, c6 + mul oT1.xyz, r0, c3 // ::VSBasicOneLightVcBn<4,5,6> + +#line 63 + dp4 oPos.z, v0, c17 // ::VSBasicOneLightVcBn<10> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c8 + max r0.x, r0.x, c19.z + min oT1.w, r0.x, c19.w // ::VSBasicOneLightVcBn<7> + +#line 309 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.w, v2.w, c1.w // ::VSBasicOneLightVcBn<3> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::vout<0> + dp4 r0.y, v0, c16 // ::vout<1> + dp4 r0.z, v0, c18 // ::vout<3> + +#line 300 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicOneLightVcBn<8,9> + mov oPos.w, r0.z // ::VSBasicOneLightVcBn<11> + +// approximately 44 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +dcl_temps 3 +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, r1.xyzx +dp3 r0.w, -cb0[3].xyzx, r0.xyzx +ge r1.x, r0.w, l(0.000000) +and r1.x, r1.x, l(0x3f800000) +mul r1.y, r0.w, r1.x +mul r1.yzw, r1.yyyy, cb0[6].xxyz +mad r1.yzw, r1.yyzw, cb0[0].xxyz, cb0[1].xxyz +mul o0.xyz, r1.yzwy, v2.xyzx +mul o0.w, v2.w, cb0[0].w +dp4 r2.x, v0.xyzw, cb0[15].xyzw +dp4 r2.y, v0.xyzw, cb0[16].xyzw +dp4 r2.z, v0.xyzw, cb0[17].xyzw +add r1.yzw, -r2.xxyz, cb0[12].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mad r1.yzw, r1.yyzw, r2.xxxx, -cb0[3].xxyz +dp3 r2.x, r1.yzwy, r1.yzwy +rsq r2.x, r2.x +mul r1.yzw, r1.yyzw, r2.xxxx +dp3 r0.x, r1.yzwy, r0.xyzx +max r0.x, r0.x, l(0.000000) +mul r0.x, r1.x, r0.x +log r0.x, r0.x +mul r0.x, r0.x, cb0[2].w +exp r0.x, r0.x +mul r0.x, r0.w, r0.x +mul r0.xyz, r0.xxxx, cb0[9].xyzx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicOneLightVcBn[] = +{ + 68, 88, 66, 67, 151, 158, + 14, 24, 197, 9, 98, 149, + 231, 196, 217, 79, 30, 239, + 12, 251, 1, 0, 0, 0, + 0, 16, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 252, 9, 0, 0, 32, 15, + 0, 0, 148, 15, 0, 0, + 65, 111, 110, 57, 196, 9, + 0, 0, 196, 9, 0, 0, + 0, 2, 254, 255, 84, 9, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 0, 0, 0, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 1, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 1, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 1, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 181, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 168, 6, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 40, 0, 0, 0, + 20, 1, 0, 0, 15, 0, + 0, 0, 124, 5, 0, 0, + 172, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 220, 6, + 0, 0, 0, 0, 255, 255, + 244, 6, 0, 0, 0, 0, + 255, 255, 0, 7, 0, 0, + 0, 0, 255, 255, 12, 7, + 0, 0, 57, 0, 0, 0, + 24, 7, 0, 0, 57, 0, + 0, 0, 40, 7, 0, 0, + 57, 0, 0, 0, 56, 7, + 0, 0, 58, 0, 0, 0, + 72, 7, 0, 0, 58, 0, + 0, 0, 88, 7, 0, 0, + 33, 0, 0, 0, 100, 7, + 0, 0, 33, 0, 0, 0, + 116, 7, 0, 0, 32, 0, + 1, 0, 128, 7, 0, 0, + 59, 0, 0, 0, 148, 7, + 0, 0, 59, 0, 0, 0, + 164, 7, 0, 0, 59, 0, + 0, 0, 180, 7, 0, 0, + 59, 0, 0, 0, 196, 7, + 0, 0, 37, 0, 0, 0, + 208, 7, 0, 0, 36, 0, + 0, 0, 224, 7, 0, 0, + 42, 0, 0, 0, 240, 7, + 0, 0, 39, 0, 0, 0, + 0, 8, 0, 0, 42, 0, + 0, 0, 16, 8, 0, 0, + 41, 0, 0, 0, 32, 8, + 0, 0, 46, 0, 0, 0, + 48, 8, 0, 0, 46, 0, + 0, 0, 64, 8, 0, 0, + 46, 0, 0, 0, 76, 8, + 0, 0, 53, 1, 2, 0, + 96, 8, 0, 0, 42, 0, + 0, 0, 112, 8, 0, 0, + 42, 0, 0, 0, 128, 8, + 0, 0, 47, 0, 0, 0, + 144, 8, 0, 0, 47, 0, + 0, 0, 160, 8, 0, 0, + 63, 0, 0, 0, 176, 8, + 0, 0, 14, 0, 1, 0, + 192, 8, 0, 0, 14, 0, + 1, 0, 208, 8, 0, 0, + 14, 0, 1, 0, 224, 8, + 0, 0, 53, 1, 2, 0, + 240, 8, 0, 0, 63, 0, + 0, 0, 0, 9, 0, 0, + 63, 0, 0, 0, 16, 9, + 0, 0, 63, 0, 0, 0, + 32, 9, 0, 0, 44, 1, + 2, 0, 48, 9, 0, 0, + 44, 1, 2, 0, 68, 9, + 0, 0, 66, 105, 97, 115, + 88, 50, 0, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 80, 97, 114, 97, + 109, 101, 116, 101, 114, 115, + 0, 68, 105, 102, 102, 117, + 115, 101, 67, 111, 108, 111, + 114, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 86, 83, 66, 97, 115, 105, + 99, 79, 110, 101, 76, 105, + 103, 104, 116, 86, 99, 66, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 80, + 111, 115, 105, 116, 105, 111, + 110, 80, 83, 0, 192, 2, + 0, 0, 200, 2, 0, 0, + 216, 2, 0, 0, 200, 2, + 0, 0, 225, 2, 0, 0, + 200, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 3, 0, 236, 2, + 0, 0, 25, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 29, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 30, 0, 0, 0, + 255, 255, 255, 255, 10, 0, + 255, 255, 33, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 34, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 38, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 39, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 11, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 0, 0, + 255, 255, 255, 255, 0, 0, + 255, 255, 100, 111, 116, 72, + 0, 171, 171, 171, 16, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 100, 111, + 116, 76, 0, 171, 171, 171, + 17, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 101, 121, 101, 86, 101, 99, + 116, 111, 114, 0, 171, 171, + 8, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 104, 97, 108, 102, 86, 101, + 99, 116, 111, 114, 115, 0, + 3, 0, 3, 0, 3, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 112, 111, + 115, 95, 119, 115, 0, 171, + 4, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 5, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 6, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 114, 101, 115, 117, 108, 116, + 0, 171, 192, 2, 0, 0, + 112, 3, 0, 0, 216, 2, + 0, 0, 112, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 6, 0, 1, 0, 2, 0, + 40, 4, 0, 0, 24, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 115, 112, + 101, 99, 117, 108, 97, 114, + 0, 171, 171, 171, 27, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 78, + 111, 114, 109, 97, 108, 0, + 67, 111, 108, 111, 114, 0, + 171, 171, 112, 4, 0, 0, + 200, 2, 0, 0, 121, 4, + 0, 0, 112, 3, 0, 0, + 128, 4, 0, 0, 200, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 11, 0, 1, 0, + 3, 0, 136, 4, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 9, 0, 10, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 217, 4, + 0, 0, 200, 2, 0, 0, + 192, 2, 0, 0, 200, 2, + 0, 0, 216, 2, 0, 0, + 112, 3, 0, 0, 224, 4, + 0, 0, 236, 4, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 252, 4, 0, 0, 35, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 36, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 37, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 97, 108, 0, 15, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 122, 101, + 114, 111, 76, 0, 171, 171, + 19, 0, 0, 0, 255, 255, + 255, 255, 0, 0, 255, 255, + 0, 0, 0, 0, 84, 2, + 0, 0, 92, 2, 0, 0, + 1, 0, 0, 0, 108, 2, + 0, 0, 120, 2, 0, 0, + 131, 2, 0, 0, 144, 2, + 0, 0, 1, 0, 0, 0, + 160, 2, 0, 0, 0, 0, + 0, 0, 172, 2, 0, 0, + 4, 3, 0, 0, 7, 0, + 0, 0, 20, 3, 0, 0, + 0, 0, 0, 0, 104, 3, + 0, 0, 112, 3, 0, 0, + 1, 0, 0, 0, 128, 3, + 0, 0, 0, 0, 0, 0, + 140, 3, 0, 0, 112, 3, + 0, 0, 1, 0, 0, 0, + 148, 3, 0, 0, 0, 0, + 0, 0, 160, 3, 0, 0, + 112, 3, 0, 0, 1, 0, + 0, 0, 168, 3, 0, 0, + 0, 0, 0, 0, 180, 3, + 0, 0, 112, 3, 0, 0, + 1, 0, 0, 0, 192, 3, + 0, 0, 0, 0, 0, 0, + 204, 3, 0, 0, 216, 3, + 0, 0, 1, 0, 0, 0, + 232, 3, 0, 0, 0, 0, + 0, 0, 244, 3, 0, 0, + 200, 2, 0, 0, 3, 0, + 0, 0, 252, 3, 0, 0, + 0, 0, 0, 0, 32, 4, + 0, 0, 56, 4, 0, 0, + 1, 0, 0, 0, 72, 4, + 0, 0, 0, 0, 0, 0, + 84, 4, 0, 0, 112, 3, + 0, 0, 1, 0, 0, 0, + 96, 4, 0, 0, 172, 2, + 0, 0, 108, 4, 0, 0, + 160, 4, 0, 0, 3, 0, + 0, 0, 176, 4, 0, 0, + 0, 0, 0, 0, 212, 4, + 0, 0, 28, 5, 0, 0, + 3, 0, 0, 0, 44, 5, + 0, 0, 0, 0, 0, 0, + 80, 5, 0, 0, 112, 3, + 0, 0, 1, 0, 0, 0, + 92, 5, 0, 0, 0, 0, + 0, 0, 104, 5, 0, 0, + 112, 3, 0, 0, 1, 0, + 0, 0, 112, 5, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 19, 0, 15, 160, + 0, 0, 0, 64, 0, 0, + 128, 191, 0, 0, 0, 0, + 0, 0, 128, 63, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 9, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 10, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 11, 0, 228, 160, 2, 0, + 0, 3, 0, 0, 7, 128, + 0, 0, 228, 129, 7, 0, + 228, 160, 36, 0, 0, 2, + 1, 0, 7, 128, 0, 0, + 228, 128, 2, 0, 0, 3, + 0, 0, 7, 128, 1, 0, + 228, 128, 4, 0, 228, 161, + 36, 0, 0, 2, 1, 0, + 7, 128, 0, 0, 228, 128, + 4, 0, 0, 4, 0, 0, + 7, 128, 1, 0, 228, 144, + 19, 0, 0, 160, 19, 0, + 85, 160, 8, 0, 0, 3, + 2, 0, 1, 128, 0, 0, + 228, 128, 12, 0, 228, 160, + 8, 0, 0, 3, 2, 0, + 2, 128, 0, 0, 228, 128, + 13, 0, 228, 160, 8, 0, + 0, 3, 2, 0, 4, 128, + 0, 0, 228, 128, 14, 0, + 228, 160, 36, 0, 0, 2, + 0, 0, 7, 128, 2, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 8, 128, 1, 0, + 228, 128, 0, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 1, 128, 4, 0, 228, 161, + 0, 0, 228, 128, 11, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 255, 128, 19, 0, + 170, 160, 13, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 0, 128, 19, 0, 170, 160, + 5, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 170, 128, + 0, 0, 85, 128, 5, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 0, 128, 0, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 170, 128, 5, 0, 228, 160, + 1, 0, 0, 2, 2, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 1, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 2, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 7, 224, 1, 0, + 228, 128, 2, 0, 228, 144, + 32, 0, 0, 3, 1, 0, + 1, 128, 0, 0, 85, 128, + 3, 0, 255, 160, 5, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 1, 0, + 0, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 0, 128, 6, 0, 228, 160, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 17, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 8, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 19, 0, 170, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 19, 0, + 255, 160, 5, 0, 0, 3, + 0, 0, 8, 224, 2, 0, + 255, 144, 1, 0, 255, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 15, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 16, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 18, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 28, 5, + 0, 0, 64, 0, 1, 0, + 71, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 26, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 114, 16, 16, 0, 1, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 104, 0, 0, 2, 3, 0, + 0, 0, 50, 0, 0, 15, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0, + 0, 64, 0, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 191, 0, 0, 128, 191, + 0, 0, 128, 191, 0, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 0, 0, 9, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 29, 0, 0, 7, 18, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 7, 18, 0, 16, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 128, 63, 56, 0, 0, 7, + 34, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 8, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 5, 16, 0, 1, 0, + 0, 0, 6, 137, 32, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 50, 0, 0, 11, + 226, 0, 16, 0, 1, 0, + 0, 0, 86, 14, 16, 0, + 1, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 8, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 2, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 16, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, + 0, 9, 226, 0, 16, 0, + 1, 0, 0, 0, 6, 9, + 16, 128, 65, 0, 0, 0, + 2, 0, 0, 0, 6, 137, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 2, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 2, 0, + 0, 0, 10, 0, 16, 0, + 2, 0, 0, 0, 50, 0, + 0, 11, 226, 0, 16, 0, + 1, 0, 0, 0, 86, 14, + 16, 0, 1, 0, 0, 0, + 6, 0, 16, 0, 2, 0, + 0, 0, 6, 137, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 2, 0, 0, 0, + 150, 7, 16, 0, 1, 0, + 0, 0, 150, 7, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 2, 0, 0, 0, 10, 0, + 16, 0, 2, 0, 0, 0, + 56, 0, 0, 7, 226, 0, + 16, 0, 1, 0, 0, 0, + 86, 14, 16, 0, 1, 0, + 0, 0, 6, 0, 16, 0, + 2, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 150, 7, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 52, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 1, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 47, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 25, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 56, 0, + 0, 8, 114, 32, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 108, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 99, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 15, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 67, 79, 76, 79, 82, + 0, 171, 171, 171, 79, 83, + 71, 78, 100, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 80, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 0, + 0, 0, 67, 79, 76, 79, + 82, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVcBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicOneLightVcBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ddd64aecd691456dbe12d47cefae9ca6739533c7 GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLighting.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLighting.inc new file mode 100644 index 0000000..0397f48 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLighting.inc @@ -0,0 +1,504 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// TEXCOORD 0 xyzw 0 NONE float xyzw +// TEXCOORD 1 xyz 1 NONE float xyz +// COLOR 0 xyzw 2 NONE float xyzw +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c2 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c6 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c13, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 oPos.z, v0, c11 // ::VSBasicPixelLighting<13> + dp4 oT0.x, v0, c3 // ::VSBasicPixelLighting<0> + dp4 oT0.y, v0, c4 // ::VSBasicPixelLighting<1> + dp4 oT0.z, v0, c5 // ::VSBasicPixelLighting<2> + dp3 r0.x, v1, c6 + dp3 r0.y, v1, c7 + dp3 r0.z, v1, c8 + dp3 r0.w, r0, r0 + rsq r0.w, r0.w + mul oT1.xyz, r0.w, r0 // ::VSBasicPixelLighting<4,5,6> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 + max r0.x, r0.x, c13.x + min oT0.w, r0.x, c13.y // ::VSBasicPixelLighting<3> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::vout<0> + dp4 r0.y, v0, c10 // ::vout<1> + dp4 r0.z, v0, c12 // ::vout<3> + +#line 374 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicPixelLighting<11,12> + mov oPos.w, r0.z // ::VSBasicPixelLighting<14> + +#line 381 + mov r0.xy, c13 + mad oT2, c1.w, r0.xxxy, r0.yyyx // ::VSBasicPixelLighting<7,8,9,10> + +// approximately 20 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_output o0.xyzw +dcl_output o1.xyz +dcl_output o2.xyzw +dcl_output_siv o3.xyzw, position +dcl_temps 1 +dp4 o0.x, v0.xyzw, cb0[15].xyzw +dp4 o0.y, v0.xyzw, cb0[16].xyzw +dp4 o0.z, v0.xyzw, cb0[17].xyzw +dp4_sat o0.w, v0.xyzw, cb0[14].xyzw +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul o1.xyz, r0.wwww, r0.xyzx +mov o2.xyz, l(1.000000,1.000000,1.000000,0) +mov o2.w, cb0[0].w +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicPixelLighting[] = +{ + 68, 88, 66, 67, 246, 92, + 82, 186, 93, 45, 228, 15, + 126, 213, 228, 175, 247, 61, + 185, 98, 1, 0, 0, 0, + 64, 9, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 4, 6, 0, 0, 96, 8, + 0, 0, 180, 8, 0, 0, + 65, 111, 110, 57, 204, 5, + 0, 0, 204, 5, 0, 0, + 0, 2, 254, 255, 128, 5, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 2, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 220, 3, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 23, 0, 0, 0, + 20, 1, 0, 0, 3, 0, + 0, 0, 160, 3, 0, 0, + 204, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 16, 4, + 0, 0, 0, 0, 255, 255, + 40, 4, 0, 0, 0, 0, + 255, 255, 52, 4, 0, 0, + 85, 0, 0, 0, 64, 4, + 0, 0, 86, 0, 0, 0, + 80, 4, 0, 0, 86, 0, + 0, 0, 96, 4, 0, 0, + 86, 0, 0, 0, 112, 4, + 0, 0, 87, 0, 0, 0, + 128, 4, 0, 0, 87, 0, + 0, 0, 144, 4, 0, 0, + 87, 0, 0, 0, 160, 4, + 0, 0, 87, 0, 0, 0, + 176, 4, 0, 0, 87, 0, + 0, 0, 192, 4, 0, 0, + 87, 0, 0, 0, 204, 4, + 0, 0, 14, 0, 1, 0, + 220, 4, 0, 0, 14, 0, + 1, 0, 236, 4, 0, 0, + 14, 0, 1, 0, 252, 4, + 0, 0, 85, 0, 0, 0, + 12, 5, 0, 0, 85, 0, + 0, 0, 28, 5, 0, 0, + 85, 0, 0, 0, 44, 5, + 0, 0, 118, 1, 2, 0, + 60, 5, 0, 0, 118, 1, + 2, 0, 80, 5, 0, 0, + 125, 1, 2, 0, 92, 5, + 0, 0, 125, 1, 2, 0, + 104, 5, 0, 0, 86, 83, + 66, 97, 115, 105, 99, 80, + 105, 120, 101, 108, 76, 105, + 103, 104, 116, 105, 110, 103, + 0, 80, 111, 115, 105, 116, + 105, 111, 110, 87, 83, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 78, 111, + 114, 109, 97, 108, 87, 83, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 225, 1, + 0, 0, 236, 1, 0, 0, + 252, 1, 0, 0, 8, 2, + 0, 0, 24, 2, 0, 0, + 236, 1, 0, 0, 32, 2, + 0, 0, 236, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 15, 0, 1, 0, 4, 0, + 44, 2, 0, 0, 3, 0, + 0, 0, 255, 255, 255, 255, + 13, 0, 255, 255, 4, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 5, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 6, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 12, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 15, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 19, 0, + 0, 0, 11, 0, 12, 0, + 255, 255, 255, 255, 20, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 14, 0, 22, 0, + 0, 0, 7, 0, 8, 0, + 9, 0, 10, 0, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 78, + 111, 114, 109, 97, 108, 0, + 204, 2, 0, 0, 236, 1, + 0, 0, 213, 2, 0, 0, + 8, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 7, 0, + 1, 0, 2, 0, 220, 2, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 80, 111, 115, 95, + 119, 115, 0, 78, 111, 114, + 109, 97, 108, 95, 119, 115, + 0, 70, 111, 103, 70, 97, + 99, 116, 111, 114, 0, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 25, 3, + 0, 0, 236, 1, 0, 0, + 32, 3, 0, 0, 8, 2, + 0, 0, 39, 3, 0, 0, + 8, 2, 0, 0, 49, 3, + 0, 0, 60, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 11, 0, 1, 0, 4, 0, + 76, 3, 0, 0, 16, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 17, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 18, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 204, 1, 0, 0, + 76, 2, 0, 0, 9, 0, + 0, 0, 92, 2, 0, 0, + 204, 1, 0, 0, 200, 2, + 0, 0, 236, 2, 0, 0, + 2, 0, 0, 0, 252, 2, + 0, 0, 0, 0, 0, 0, + 20, 3, 0, 0, 108, 3, + 0, 0, 3, 0, 0, 0, + 124, 3, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 13, 0, 15, 160, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 11, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 224, 0, 0, 228, 144, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 224, + 0, 0, 228, 144, 4, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 224, 0, 0, + 228, 144, 5, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 1, 128, 1, 0, 228, 144, + 6, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 2, 128, + 1, 0, 228, 144, 7, 0, + 228, 160, 8, 0, 0, 3, + 0, 0, 4, 128, 1, 0, + 228, 144, 8, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 8, 128, 0, 0, 228, 128, + 0, 0, 228, 128, 7, 0, + 0, 2, 0, 0, 8, 128, + 0, 0, 255, 128, 5, 0, + 0, 3, 1, 0, 7, 224, + 0, 0, 255, 128, 0, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 2, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 13, 0, 0, 160, 10, 0, + 0, 3, 0, 0, 8, 224, + 0, 0, 0, 128, 13, 0, + 85, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 9, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 10, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 12, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 3, 128, + 13, 0, 228, 160, 4, 0, + 0, 4, 2, 0, 15, 224, + 1, 0, 255, 160, 0, 0, + 64, 128, 0, 0, 21, 128, + 255, 255, 0, 0, 83, 72, + 68, 82, 84, 2, 0, 0, + 64, 0, 1, 0, 149, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 114, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 2, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 32, 16, 0, 1, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 54, 0, 0, 8, 114, 32, + 16, 0, 2, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 0, 0, 54, 0, 0, 6, + 130, 32, 16, 0, 2, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 76, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 171, 79, 83, 71, 78, + 132, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 104, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 8, 0, 0, + 113, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 0, 0, 0, + 119, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 0, 0, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 67, 79, 76, + 79, 82, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLighting.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLighting.pdb new file mode 100644 index 0000000000000000000000000000000000000000..498a4fe913d46aa08e20eb02d02914be2b972b7d GIT binary patch literal 65024 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingBn.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingBn.inc new file mode 100644 index 0000000..133f017 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingBn.inc @@ -0,0 +1,535 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// TEXCOORD 0 xyzw 0 NONE float xyzw +// TEXCOORD 1 xyz 1 NONE float xyz +// COLOR 0 xyzw 2 NONE float xyzw +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c2 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c6 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c13, 2, -1, 0, 1 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 oPos.z, v0, c11 // ::VSBasicPixelLightingBn<13> + dp4 oT0.x, v0, c3 // ::VSBasicPixelLightingBn<0> + dp4 oT0.y, v0, c4 // ::VSBasicPixelLightingBn<1> + dp4 oT0.z, v0, c5 // ::VSBasicPixelLightingBn<2> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c13.x, c13.y // ::BiasX2<0,1,2> + +#line 87 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r1.x, r0, c6 + dp3 r1.y, r0, c7 + dp3 r1.z, r0, c8 + dp3 r0.x, r1, r1 + rsq r0.x, r0.x + mul oT1.xyz, r0.x, r1 // ::VSBasicPixelLightingBn<4,5,6> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 + max r0.x, r0.x, c13.z + min oT0.w, r0.x, c13.w // ::VSBasicPixelLightingBn<3> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::vout<0> + dp4 r0.y, v0, c10 // ::vout<1> + dp4 r0.z, v0, c12 // ::vout<3> + +#line 386 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicPixelLightingBn<11,12> + mov oPos.w, r0.z // ::VSBasicPixelLightingBn<14> + +#line 395 + mov r0.zw, c13 + mad oT2, c1.w, r0.zzzw, r0.wwwz // ::VSBasicPixelLightingBn<7,8,9,10> + +// approximately 21 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_output o0.xyzw +dcl_output o1.xyz +dcl_output o2.xyzw +dcl_output_siv o3.xyzw, position +dcl_temps 2 +dp4 o0.x, v0.xyzw, cb0[15].xyzw +dp4 o0.y, v0.xyzw, cb0[16].xyzw +dp4 o0.z, v0.xyzw, cb0[17].xyzw +dp4_sat o0.w, v0.xyzw, cb0[14].xyzw +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul o1.xyz, r0.xxxx, r1.xyzx +mov o2.xyz, l(1.000000,1.000000,1.000000,0) +mov o2.w, cb0[0].w +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicPixelLightingBn[] = +{ + 68, 88, 66, 67, 67, 122, + 222, 110, 95, 58, 223, 198, + 204, 173, 215, 114, 202, 24, + 43, 84, 1, 0, 0, 0, + 212, 9, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 92, 6, 0, 0, 244, 8, + 0, 0, 72, 9, 0, 0, + 65, 111, 110, 57, 36, 6, + 0, 0, 36, 6, 0, 0, + 0, 2, 254, 255, 216, 5, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 19, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 32, 4, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 24, 0, 0, 0, + 20, 1, 0, 0, 4, 0, + 0, 0, 208, 3, 0, 0, + 248, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 84, 4, + 0, 0, 0, 0, 255, 255, + 108, 4, 0, 0, 0, 0, + 255, 255, 120, 4, 0, 0, + 85, 0, 0, 0, 132, 4, + 0, 0, 86, 0, 0, 0, + 148, 4, 0, 0, 86, 0, + 0, 0, 164, 4, 0, 0, + 86, 0, 0, 0, 180, 4, + 0, 0, 32, 0, 1, 0, + 196, 4, 0, 0, 87, 0, + 0, 0, 216, 4, 0, 0, + 87, 0, 0, 0, 232, 4, + 0, 0, 87, 0, 0, 0, + 248, 4, 0, 0, 87, 0, + 0, 0, 8, 5, 0, 0, + 87, 0, 0, 0, 24, 5, + 0, 0, 87, 0, 0, 0, + 36, 5, 0, 0, 14, 0, + 1, 0, 52, 5, 0, 0, + 14, 0, 1, 0, 68, 5, + 0, 0, 14, 0, 1, 0, + 84, 5, 0, 0, 85, 0, + 0, 0, 100, 5, 0, 0, + 85, 0, 0, 0, 116, 5, + 0, 0, 85, 0, 0, 0, + 132, 5, 0, 0, 130, 1, + 2, 0, 148, 5, 0, 0, + 130, 1, 2, 0, 168, 5, + 0, 0, 139, 1, 2, 0, + 180, 5, 0, 0, 139, 1, + 2, 0, 192, 5, 0, 0, + 66, 105, 97, 115, 88, 50, + 0, 171, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 86, 83, 66, 97, 115, 105, + 99, 80, 105, 120, 101, 108, + 76, 105, 103, 104, 116, 105, + 110, 103, 66, 110, 0, 80, + 111, 115, 105, 116, 105, 111, + 110, 87, 83, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 78, 111, + 114, 109, 97, 108, 87, 83, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 15, 2, + 0, 0, 28, 2, 0, 0, + 44, 2, 0, 0, 56, 2, + 0, 0, 72, 2, 0, 0, + 28, 2, 0, 0, 80, 2, + 0, 0, 28, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 15, 0, 1, 0, 4, 0, + 92, 2, 0, 0, 3, 0, + 0, 0, 255, 255, 255, 255, + 13, 0, 255, 255, 4, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 5, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 6, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 13, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 16, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 20, 0, + 0, 0, 11, 0, 12, 0, + 255, 255, 255, 255, 21, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 14, 0, 23, 0, + 0, 0, 7, 0, 8, 0, + 9, 0, 10, 0, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 78, + 111, 114, 109, 97, 108, 0, + 252, 2, 0, 0, 28, 2, + 0, 0, 5, 3, 0, 0, + 56, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 7, 0, + 1, 0, 2, 0, 12, 3, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 80, 111, 115, 95, + 119, 115, 0, 78, 111, 114, + 109, 97, 108, 95, 119, 115, + 0, 70, 111, 103, 70, 97, + 99, 116, 111, 114, 0, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 73, 3, + 0, 0, 28, 2, 0, 0, + 80, 3, 0, 0, 56, 2, + 0, 0, 87, 3, 0, 0, + 56, 2, 0, 0, 97, 3, + 0, 0, 108, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 11, 0, 1, 0, 4, 0, + 124, 3, 0, 0, 17, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 18, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 19, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 212, 1, 0, 0, + 220, 1, 0, 0, 1, 0, + 0, 0, 236, 1, 0, 0, + 0, 0, 0, 0, 248, 1, + 0, 0, 124, 2, 0, 0, + 9, 0, 0, 0, 140, 2, + 0, 0, 248, 1, 0, 0, + 248, 2, 0, 0, 28, 3, + 0, 0, 2, 0, 0, 0, + 44, 3, 0, 0, 0, 0, + 0, 0, 68, 3, 0, 0, + 156, 3, 0, 0, 3, 0, + 0, 0, 172, 3, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 13, 0, 15, 160, + 0, 0, 0, 64, 0, 0, + 128, 191, 0, 0, 0, 0, + 0, 0, 128, 63, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 11, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 224, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 224, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 224, + 0, 0, 228, 144, 5, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 144, 13, 0, 0, 160, + 13, 0, 85, 160, 8, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 228, 128, 6, 0, + 228, 160, 8, 0, 0, 3, + 1, 0, 2, 128, 0, 0, + 228, 128, 7, 0, 228, 160, + 8, 0, 0, 3, 1, 0, + 4, 128, 0, 0, 228, 128, + 8, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 128, 1, 0, + 228, 128, 7, 0, 0, 2, + 0, 0, 1, 128, 0, 0, + 0, 128, 5, 0, 0, 3, + 1, 0, 7, 224, 0, 0, + 0, 128, 1, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 13, 0, + 170, 160, 10, 0, 0, 3, + 0, 0, 8, 224, 0, 0, + 0, 128, 13, 0, 255, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 9, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 10, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 12, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 12, 128, 13, 0, + 228, 160, 4, 0, 0, 4, + 2, 0, 15, 224, 1, 0, + 255, 160, 0, 0, 234, 128, + 0, 0, 191, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 144, 2, 0, 0, 64, 0, + 1, 0, 164, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 2, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 2, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 16, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 50, 0, 0, 15, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 64, 0, 0, + 0, 64, 0, 0, 0, 64, + 0, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 191, + 0, 0, 128, 191, 0, 0, + 128, 191, 0, 0, 0, 0, + 16, 0, 0, 8, 18, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 19, 0, + 0, 0, 16, 0, 0, 8, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 16, 0, + 0, 8, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 21, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 32, + 16, 0, 1, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 54, 0, + 0, 8, 114, 32, 16, 0, + 2, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 0, 0, + 54, 0, 0, 6, 130, 32, + 16, 0, 2, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 76, 0, + 0, 0, 2, 0, 0, 0, + 8, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 171, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 8, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 0, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 67, 79, 76, 79, 82, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..4204ecd0c26ccea35878ff71ea6022f389b1753b GIT binary patch literal 65024 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 + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 oPos.z, v0, c11 // ::VSBasicPixelLightingTx<15> + dp4 oT1.x, v0, c3 // ::VSBasicPixelLightingTx<2> + dp4 oT1.y, v0, c4 // ::VSBasicPixelLightingTx<3> + dp4 oT1.z, v0, c5 // ::VSBasicPixelLightingTx<4> + dp3 r0.x, v1, c6 + dp3 r0.y, v1, c7 + dp3 r0.z, v1, c8 + dp3 r0.w, r0, r0 + rsq r0.w, r0.w + mul oT2.xyz, r0.w, r0 // ::VSBasicPixelLightingTx<6,7,8> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 + max r0.x, r0.x, c13.x + min oT1.w, r0.x, c13.y // ::VSBasicPixelLightingTx<5> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::vout<0> + dp4 r0.y, v0, c10 // ::vout<1> + dp4 r0.z, v0, c12 // ::vout<3> + +#line 432 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicPixelLightingTx<13,14> + mov oPos.w, r0.z // ::VSBasicPixelLightingTx<16> + +#line 440 + mov oT0.xy, v2 // ::VSBasicPixelLightingTx<0,1> + mov r0.xy, c13 + mad oT3, c1.w, r0.xxxy, r0.yyyx // ::VSBasicPixelLightingTx<9,10,11,12> + +// approximately 21 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_output o0.xy +dcl_output o1.xyzw +dcl_output o2.xyz +dcl_output o3.xyzw +dcl_output_siv o4.xyzw, position +dcl_temps 1 +mov o0.xy, v2.xyxx +dp4 o1.x, v0.xyzw, cb0[15].xyzw +dp4 o1.y, v0.xyzw, cb0[16].xyzw +dp4 o1.z, v0.xyzw, cb0[17].xyzw +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul o2.xyz, r0.wwww, r0.xyzx +mov o3.xyz, l(1.000000,1.000000,1.000000,0) +mov o3.w, cb0[0].w +dp4 o4.x, v0.xyzw, cb0[22].xyzw +dp4 o4.y, v0.xyzw, cb0[23].xyzw +dp4 o4.z, v0.xyzw, cb0[24].xyzw +dp4 o4.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicPixelLightingTx[] = +{ + 68, 88, 66, 67, 246, 251, + 36, 213, 0, 32, 152, 112, + 139, 110, 81, 249, 155, 84, + 182, 239, 1, 0, 0, 0, + 16, 10, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 112, 6, 0, 0, 248, 8, + 0, 0, 108, 9, 0, 0, + 65, 111, 110, 57, 56, 6, + 0, 0, 56, 6, 0, 0, + 0, 2, 254, 255, 236, 5, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 23, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 48, 4, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 25, 0, 0, 0, + 20, 1, 0, 0, 3, 0, + 0, 0, 244, 3, 0, 0, + 220, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 100, 4, + 0, 0, 0, 0, 255, 255, + 124, 4, 0, 0, 0, 0, + 255, 255, 136, 4, 0, 0, + 0, 0, 255, 255, 148, 4, + 0, 0, 85, 0, 0, 0, + 160, 4, 0, 0, 86, 0, + 0, 0, 176, 4, 0, 0, + 86, 0, 0, 0, 192, 4, + 0, 0, 86, 0, 0, 0, + 208, 4, 0, 0, 87, 0, + 0, 0, 224, 4, 0, 0, + 87, 0, 0, 0, 240, 4, + 0, 0, 87, 0, 0, 0, + 0, 5, 0, 0, 87, 0, + 0, 0, 16, 5, 0, 0, + 87, 0, 0, 0, 32, 5, + 0, 0, 87, 0, 0, 0, + 44, 5, 0, 0, 14, 0, + 1, 0, 60, 5, 0, 0, + 14, 0, 1, 0, 76, 5, + 0, 0, 14, 0, 1, 0, + 92, 5, 0, 0, 85, 0, + 0, 0, 108, 5, 0, 0, + 85, 0, 0, 0, 124, 5, + 0, 0, 85, 0, 0, 0, + 140, 5, 0, 0, 176, 1, + 2, 0, 156, 5, 0, 0, + 176, 1, 2, 0, 176, 5, + 0, 0, 184, 1, 2, 0, + 188, 5, 0, 0, 183, 1, + 2, 0, 200, 5, 0, 0, + 183, 1, 2, 0, 212, 5, + 0, 0, 86, 83, 66, 97, + 115, 105, 99, 80, 105, 120, + 101, 108, 76, 105, 103, 104, + 116, 105, 110, 103, 84, 120, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 0, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 87, 83, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 78, 111, 114, 109, 97, 108, + 87, 83, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 243, 1, 0, 0, 252, 1, + 0, 0, 12, 2, 0, 0, + 24, 2, 0, 0, 40, 2, + 0, 0, 52, 2, 0, 0, + 68, 2, 0, 0, 24, 2, + 0, 0, 76, 2, 0, 0, + 24, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 17, 0, + 1, 0, 5, 0, 88, 2, + 0, 0, 4, 0, 0, 0, + 255, 255, 255, 255, 15, 0, + 255, 255, 5, 0, 0, 0, + 2, 0, 255, 255, 255, 255, + 255, 255, 6, 0, 0, 0, + 255, 255, 3, 0, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 255, 255, 4, 0, + 255, 255, 13, 0, 0, 0, + 6, 0, 7, 0, 8, 0, + 255, 255, 16, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 5, 0, 20, 0, 0, 0, + 13, 0, 14, 0, 255, 255, + 255, 255, 21, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 16, 0, 22, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 24, 0, 0, 0, + 9, 0, 10, 0, 11, 0, + 12, 0, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 12, 3, + 0, 0, 24, 2, 0, 0, + 21, 3, 0, 0, 52, 2, + 0, 0, 243, 1, 0, 0, + 252, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 9, 0, + 1, 0, 3, 0, 28, 3, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 255, 255, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 80, 111, 115, 95, + 119, 115, 0, 78, 111, 114, + 109, 97, 108, 95, 119, 115, + 0, 70, 111, 103, 70, 97, + 99, 116, 111, 114, 0, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 109, 3, + 0, 0, 24, 2, 0, 0, + 116, 3, 0, 0, 52, 2, + 0, 0, 123, 3, 0, 0, + 52, 2, 0, 0, 133, 3, + 0, 0, 144, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 11, 0, 1, 0, 4, 0, + 160, 3, 0, 0, 17, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 18, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 19, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 220, 1, 0, 0, + 128, 2, 0, 0, 10, 0, + 0, 0, 144, 2, 0, 0, + 220, 1, 0, 0, 8, 3, + 0, 0, 52, 3, 0, 0, + 3, 0, 0, 0, 68, 3, + 0, 0, 0, 0, 0, 0, + 104, 3, 0, 0, 192, 3, + 0, 0, 3, 0, 0, 0, + 208, 3, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 13, 0, 15, 160, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 11, 0, 228, 160, + 9, 0, 0, 3, 1, 0, + 1, 224, 0, 0, 228, 144, + 3, 0, 228, 160, 9, 0, + 0, 3, 1, 0, 2, 224, + 0, 0, 228, 144, 4, 0, + 228, 160, 9, 0, 0, 3, + 1, 0, 4, 224, 0, 0, + 228, 144, 5, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 1, 128, 1, 0, 228, 144, + 6, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 2, 128, + 1, 0, 228, 144, 7, 0, + 228, 160, 8, 0, 0, 3, + 0, 0, 4, 128, 1, 0, + 228, 144, 8, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 8, 128, 0, 0, 228, 128, + 0, 0, 228, 128, 7, 0, + 0, 2, 0, 0, 8, 128, + 0, 0, 255, 128, 5, 0, + 0, 3, 2, 0, 7, 224, + 0, 0, 255, 128, 0, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 2, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 13, 0, 0, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 13, 0, + 85, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 9, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 10, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 12, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 3, 224, + 2, 0, 228, 144, 1, 0, + 0, 2, 0, 0, 3, 128, + 13, 0, 228, 160, 4, 0, + 0, 4, 3, 0, 15, 224, + 1, 0, 255, 160, 0, 0, + 64, 128, 0, 0, 21, 128, + 255, 255, 0, 0, 83, 72, + 68, 82, 128, 2, 0, 0, + 64, 0, 1, 0, 160, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 114, 32, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 3, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 4, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 0, 0, 0, 0, + 70, 16, 16, 0, 2, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 2, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 8, + 114, 32, 16, 0, 3, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 0, 0, 54, 0, + 0, 6, 130, 32, 16, 0, + 3, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 4, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 4, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 4, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 4, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 108, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 3, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 79, 83, 71, 78, 156, 0, + 0, 0, 5, 0, 0, 0, + 8, 0, 0, 0, 128, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 3, 12, 0, 0, 128, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 128, 0, + 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 7, 8, 0, 0, 137, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 143, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 4, 0, 0, 0, + 15, 0, 0, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 67, 79, 76, 79, 82, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTx.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTx.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e2d1a16805c423acb705e87d8adf6385360019e8 GIT binary patch literal 65024 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 + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 oPos.z, v0, c11 // ::VSBasicPixelLightingTxBn<15> + dp4 oT1.x, v0, c3 // ::VSBasicPixelLightingTxBn<2> + dp4 oT1.y, v0, c4 // ::VSBasicPixelLightingTxBn<3> + dp4 oT1.z, v0, c5 // ::VSBasicPixelLightingTxBn<4> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c13.x, c13.y // ::BiasX2<0,1,2> + +#line 87 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r1.x, r0, c6 + dp3 r1.y, r0, c7 + dp3 r1.z, r0, c8 + dp3 r0.x, r1, r1 + rsq r0.x, r0.x + mul oT2.xyz, r0.x, r1 // ::VSBasicPixelLightingTxBn<6,7,8> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 + max r0.x, r0.x, c13.z + min oT1.w, r0.x, c13.w // ::VSBasicPixelLightingTxBn<5> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::vout<0> + dp4 r0.y, v0, c10 // ::vout<1> + dp4 r0.z, v0, c12 // ::vout<3> + +#line 445 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicPixelLightingTxBn<13,14> + mov oPos.w, r0.z // ::VSBasicPixelLightingTxBn<16> + +#line 455 + mov oT0.xy, v2 // ::VSBasicPixelLightingTxBn<0,1> + mov r0.zw, c13 + mad oT3, c1.w, r0.zzzw, r0.wwwz // ::VSBasicPixelLightingTxBn<9,10,11,12> + +// approximately 22 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_output o0.xy +dcl_output o1.xyzw +dcl_output o2.xyz +dcl_output o3.xyzw +dcl_output_siv o4.xyzw, position +dcl_temps 2 +mov o0.xy, v2.xyxx +dp4 o1.x, v0.xyzw, cb0[15].xyzw +dp4 o1.y, v0.xyzw, cb0[16].xyzw +dp4 o1.z, v0.xyzw, cb0[17].xyzw +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul o2.xyz, r0.xxxx, r1.xyzx +mov o3.xyz, l(1.000000,1.000000,1.000000,0) +mov o3.w, cb0[0].w +dp4 o4.x, v0.xyzw, cb0[22].xyzw +dp4 o4.y, v0.xyzw, cb0[23].xyzw +dp4 o4.z, v0.xyzw, cb0[24].xyzw +dp4 o4.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicPixelLightingTxBn[] = +{ + 68, 88, 66, 67, 54, 63, + 115, 191, 124, 219, 53, 156, + 228, 83, 50, 33, 206, 11, + 140, 106, 1, 0, 0, 0, + 164, 10, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 200, 6, 0, 0, 140, 9, + 0, 0, 0, 10, 0, 0, + 65, 111, 110, 57, 144, 6, + 0, 0, 144, 6, 0, 0, + 0, 2, 254, 255, 68, 6, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 40, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 116, 4, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 26, 0, 0, 0, + 20, 1, 0, 0, 4, 0, + 0, 0, 36, 4, 0, 0, + 8, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 168, 4, + 0, 0, 0, 0, 255, 255, + 192, 4, 0, 0, 0, 0, + 255, 255, 204, 4, 0, 0, + 0, 0, 255, 255, 216, 4, + 0, 0, 85, 0, 0, 0, + 228, 4, 0, 0, 86, 0, + 0, 0, 244, 4, 0, 0, + 86, 0, 0, 0, 4, 5, + 0, 0, 86, 0, 0, 0, + 20, 5, 0, 0, 32, 0, + 1, 0, 36, 5, 0, 0, + 87, 0, 0, 0, 56, 5, + 0, 0, 87, 0, 0, 0, + 72, 5, 0, 0, 87, 0, + 0, 0, 88, 5, 0, 0, + 87, 0, 0, 0, 104, 5, + 0, 0, 87, 0, 0, 0, + 120, 5, 0, 0, 87, 0, + 0, 0, 132, 5, 0, 0, + 14, 0, 1, 0, 148, 5, + 0, 0, 14, 0, 1, 0, + 164, 5, 0, 0, 14, 0, + 1, 0, 180, 5, 0, 0, + 85, 0, 0, 0, 196, 5, + 0, 0, 85, 0, 0, 0, + 212, 5, 0, 0, 85, 0, + 0, 0, 228, 5, 0, 0, + 189, 1, 2, 0, 244, 5, + 0, 0, 189, 1, 2, 0, + 8, 6, 0, 0, 199, 1, + 2, 0, 20, 6, 0, 0, + 198, 1, 2, 0, 32, 6, + 0, 0, 198, 1, 2, 0, + 44, 6, 0, 0, 66, 105, + 97, 115, 88, 50, 0, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 8, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 86, 83, + 66, 97, 115, 105, 99, 80, + 105, 120, 101, 108, 76, 105, + 103, 104, 116, 105, 110, 103, + 84, 120, 66, 110, 0, 84, + 101, 120, 67, 111, 111, 114, + 100, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 87, 83, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 78, 111, 114, 109, 97, 108, + 87, 83, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 33, 2, 0, 0, 44, 2, + 0, 0, 60, 2, 0, 0, + 72, 2, 0, 0, 88, 2, + 0, 0, 100, 2, 0, 0, + 116, 2, 0, 0, 72, 2, + 0, 0, 124, 2, 0, 0, + 72, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 17, 0, + 1, 0, 5, 0, 136, 2, + 0, 0, 4, 0, 0, 0, + 255, 255, 255, 255, 15, 0, + 255, 255, 5, 0, 0, 0, + 2, 0, 255, 255, 255, 255, + 255, 255, 6, 0, 0, 0, + 255, 255, 3, 0, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 255, 255, 4, 0, + 255, 255, 14, 0, 0, 0, + 6, 0, 7, 0, 8, 0, + 255, 255, 17, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 5, 0, 21, 0, 0, 0, + 13, 0, 14, 0, 255, 255, + 255, 255, 22, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 16, 0, 23, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 25, 0, 0, 0, + 9, 0, 10, 0, 11, 0, + 12, 0, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 60, 3, + 0, 0, 72, 2, 0, 0, + 69, 3, 0, 0, 100, 2, + 0, 0, 33, 2, 0, 0, + 44, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 9, 0, + 1, 0, 3, 0, 76, 3, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 255, 255, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 80, 111, 115, 95, + 119, 115, 0, 78, 111, 114, + 109, 97, 108, 95, 119, 115, + 0, 70, 111, 103, 70, 97, + 99, 116, 111, 114, 0, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 157, 3, + 0, 0, 72, 2, 0, 0, + 164, 3, 0, 0, 100, 2, + 0, 0, 171, 3, 0, 0, + 100, 2, 0, 0, 181, 3, + 0, 0, 192, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 11, 0, 1, 0, 4, 0, + 208, 3, 0, 0, 18, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 19, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 20, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 228, 1, 0, 0, + 236, 1, 0, 0, 1, 0, + 0, 0, 252, 1, 0, 0, + 0, 0, 0, 0, 8, 2, + 0, 0, 176, 2, 0, 0, + 10, 0, 0, 0, 192, 2, + 0, 0, 8, 2, 0, 0, + 56, 3, 0, 0, 100, 3, + 0, 0, 3, 0, 0, 0, + 116, 3, 0, 0, 0, 0, + 0, 0, 152, 3, 0, 0, + 240, 3, 0, 0, 3, 0, + 0, 0, 0, 4, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 13, 0, 15, 160, + 0, 0, 0, 64, 0, 0, + 128, 191, 0, 0, 0, 0, + 0, 0, 128, 63, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 11, 0, + 228, 160, 9, 0, 0, 3, + 1, 0, 1, 224, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 1, 0, + 2, 224, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 1, 0, 4, 224, + 0, 0, 228, 144, 5, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 144, 13, 0, 0, 160, + 13, 0, 85, 160, 8, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 228, 128, 6, 0, + 228, 160, 8, 0, 0, 3, + 1, 0, 2, 128, 0, 0, + 228, 128, 7, 0, 228, 160, + 8, 0, 0, 3, 1, 0, + 4, 128, 0, 0, 228, 128, + 8, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 128, 1, 0, + 228, 128, 7, 0, 0, 2, + 0, 0, 1, 128, 0, 0, + 0, 128, 5, 0, 0, 3, + 2, 0, 7, 224, 0, 0, + 0, 128, 1, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 13, 0, + 170, 160, 10, 0, 0, 3, + 1, 0, 8, 224, 0, 0, + 0, 128, 13, 0, 255, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 9, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 10, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 12, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 3, 224, 2, 0, + 228, 144, 1, 0, 0, 2, + 0, 0, 12, 128, 13, 0, + 228, 160, 4, 0, 0, 4, + 3, 0, 15, 224, 1, 0, + 255, 160, 0, 0, 234, 128, + 0, 0, 191, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 188, 2, 0, 0, 64, 0, + 1, 0, 175, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 3, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 4, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 2, 0, 0, 0, 54, 0, + 0, 5, 50, 32, 16, 0, + 0, 0, 0, 0, 70, 16, + 16, 0, 2, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 50, 0, 0, 15, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0, + 0, 64, 0, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 191, 0, 0, 128, 191, + 0, 0, 128, 191, 0, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 32, 16, 0, 2, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 54, 0, 0, 8, 114, 32, + 16, 0, 3, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 0, 0, 54, 0, 0, 6, + 130, 32, 16, 0, 3, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 4, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 4, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 4, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 4, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 108, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 99, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 79, 83, + 71, 78, 156, 0, 0, 0, + 5, 0, 0, 0, 8, 0, + 0, 0, 128, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 12, + 0, 0, 128, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 128, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 7, 8, + 0, 0, 137, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 15, 0, + 0, 0, 143, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 15, 0, + 0, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 67, + 79, 76, 79, 82, 0, 83, + 86, 95, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..90a99bd84a504a64cc5cbc8aa0cab56d2b5a5451 GIT binary patch literal 65024 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 + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + dcl_texcoord3 v3 // vin<9,10,11,12> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 oPos.z, v0, c11 // ::VSBasicPixelLightingTxVc<15> + dp4 oT1.x, v0, c3 // ::VSBasicPixelLightingTxVc<2> + dp4 oT1.y, v0, c4 // ::VSBasicPixelLightingTxVc<3> + dp4 oT1.z, v0, c5 // ::VSBasicPixelLightingTxVc<4> + dp3 r0.x, v1, c6 + dp3 r0.y, v1, c7 + dp3 r0.z, v1, c8 + dp3 r0.w, r0, r0 + rsq r0.w, r0.w + mul oT2.xyz, r0.w, r0 // ::VSBasicPixelLightingTxVc<6,7,8> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 + max r0.x, r0.x, c13.x + min oT1.w, r0.x, c13.y // ::VSBasicPixelLightingTxVc<5> + +#line 470 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT3.w, v3.w, c1.w // ::VSBasicPixelLightingTxVc<12> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::vout<0> + dp4 r0.y, v0, c10 // ::vout<1> + dp4 r0.z, v0, c12 // ::vout<3> + +#line 462 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicPixelLightingTxVc<13,14> + mov oPos.w, r0.z // ::VSBasicPixelLightingTxVc<16> + +#line 471 + mov oT0.xy, v2 // ::VSBasicPixelLightingTxVc<0,1> + mov oT3.xyz, v3 // ::VSBasicPixelLightingTxVc<9,10,11> + +// approximately 21 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_input v3.xyzw +dcl_output o0.xy +dcl_output o1.xyzw +dcl_output o2.xyz +dcl_output o3.xyzw +dcl_output_siv o4.xyzw, position +dcl_temps 1 +mov o0.xy, v2.xyxx +dp4 o1.x, v0.xyzw, cb0[15].xyzw +dp4 o1.y, v0.xyzw, cb0[16].xyzw +dp4 o1.z, v0.xyzw, cb0[17].xyzw +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul o2.xyz, r0.wwww, r0.xyzx +mul o3.w, v3.w, cb0[0].w +mov o3.xyz, v3.xyzx +dp4 o4.x, v0.xyzw, cb0[22].xyzw +dp4 o4.y, v0.xyzw, cb0[23].xyzw +dp4 o4.z, v0.xyzw, cb0[24].xyzw +dp4 o4.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicPixelLightingTxVc[] = +{ + 68, 88, 66, 67, 107, 77, + 65, 39, 223, 27, 184, 188, + 214, 181, 6, 255, 136, 142, + 152, 12, 1, 0, 0, 0, + 116, 10, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 172, 6, 0, 0, 60, 9, + 0, 0, 208, 9, 0, 0, + 65, 111, 110, 57, 116, 6, + 0, 0, 116, 6, 0, 0, + 0, 2, 254, 255, 40, 6, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 36, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 100, 4, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 26, 0, 0, 0, + 20, 1, 0, 0, 3, 0, + 0, 0, 40, 4, 0, 0, + 228, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 152, 4, + 0, 0, 0, 0, 255, 255, + 176, 4, 0, 0, 0, 0, + 255, 255, 188, 4, 0, 0, + 0, 0, 255, 255, 200, 4, + 0, 0, 0, 0, 255, 255, + 212, 4, 0, 0, 85, 0, + 0, 0, 224, 4, 0, 0, + 86, 0, 0, 0, 240, 4, + 0, 0, 86, 0, 0, 0, + 0, 5, 0, 0, 86, 0, + 0, 0, 16, 5, 0, 0, + 87, 0, 0, 0, 32, 5, + 0, 0, 87, 0, 0, 0, + 48, 5, 0, 0, 87, 0, + 0, 0, 64, 5, 0, 0, + 87, 0, 0, 0, 80, 5, + 0, 0, 87, 0, 0, 0, + 96, 5, 0, 0, 87, 0, + 0, 0, 108, 5, 0, 0, + 14, 0, 1, 0, 124, 5, + 0, 0, 14, 0, 1, 0, + 140, 5, 0, 0, 14, 0, + 1, 0, 156, 5, 0, 0, + 214, 1, 2, 0, 172, 5, + 0, 0, 85, 0, 0, 0, + 188, 5, 0, 0, 85, 0, + 0, 0, 204, 5, 0, 0, + 85, 0, 0, 0, 220, 5, + 0, 0, 206, 1, 2, 0, + 236, 5, 0, 0, 206, 1, + 2, 0, 0, 6, 0, 0, + 215, 1, 2, 0, 12, 6, + 0, 0, 213, 1, 2, 0, + 24, 6, 0, 0, 86, 83, + 66, 97, 115, 105, 99, 80, + 105, 120, 101, 108, 76, 105, + 103, 104, 116, 105, 110, 103, + 84, 120, 86, 99, 0, 84, + 101, 120, 67, 111, 111, 114, + 100, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 87, 83, + 0, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 78, 111, 114, 109, 97, 108, + 87, 83, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 253, 1, 0, 0, 8, 2, + 0, 0, 24, 2, 0, 0, + 36, 2, 0, 0, 52, 2, + 0, 0, 64, 2, 0, 0, + 80, 2, 0, 0, 36, 2, + 0, 0, 88, 2, 0, 0, + 36, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 17, 0, + 1, 0, 5, 0, 100, 2, + 0, 0, 5, 0, 0, 0, + 255, 255, 255, 255, 15, 0, + 255, 255, 6, 0, 0, 0, + 2, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 3, 0, 255, 255, + 255, 255, 8, 0, 0, 0, + 255, 255, 255, 255, 4, 0, + 255, 255, 14, 0, 0, 0, + 6, 0, 7, 0, 8, 0, + 255, 255, 17, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 5, 0, 18, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 12, 0, 22, 0, 0, 0, + 13, 0, 14, 0, 255, 255, + 255, 255, 23, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 16, 0, 24, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 25, 0, 0, 0, + 9, 0, 10, 0, 11, 0, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 67, 111, + 108, 111, 114, 0, 171, 171, + 36, 3, 0, 0, 36, 2, + 0, 0, 45, 3, 0, 0, + 64, 2, 0, 0, 253, 1, + 0, 0, 8, 2, 0, 0, + 52, 3, 0, 0, 36, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 13, 0, 1, 0, + 4, 0, 60, 3, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 255, 255, 255, 255, + 4, 0, 0, 0, 9, 0, + 10, 0, 11, 0, 12, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 80, 111, 115, 95, 119, 115, + 0, 78, 111, 114, 109, 97, + 108, 95, 119, 115, 0, 70, + 111, 103, 70, 97, 99, 116, + 111, 114, 0, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 161, 3, 0, 0, + 36, 2, 0, 0, 168, 3, + 0, 0, 64, 2, 0, 0, + 175, 3, 0, 0, 64, 2, + 0, 0, 185, 3, 0, 0, + 196, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 11, 0, + 1, 0, 4, 0, 212, 3, + 0, 0, 19, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 20, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 21, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 0, 0, 0, 0, + 228, 1, 0, 0, 140, 2, + 0, 0, 11, 0, 0, 0, + 156, 2, 0, 0, 228, 1, + 0, 0, 32, 3, 0, 0, + 92, 3, 0, 0, 4, 0, + 0, 0, 108, 3, 0, 0, + 0, 0, 0, 0, 156, 3, + 0, 0, 244, 3, 0, 0, + 3, 0, 0, 0, 4, 4, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 13, 0, + 15, 160, 0, 0, 0, 0, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 3, 128, 3, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 11, 0, 228, 160, 9, 0, + 0, 3, 1, 0, 1, 224, + 0, 0, 228, 144, 3, 0, + 228, 160, 9, 0, 0, 3, + 1, 0, 2, 224, 0, 0, + 228, 144, 4, 0, 228, 160, + 9, 0, 0, 3, 1, 0, + 4, 224, 0, 0, 228, 144, + 5, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 144, 6, 0, + 228, 160, 8, 0, 0, 3, + 0, 0, 2, 128, 1, 0, + 228, 144, 7, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 4, 128, 1, 0, 228, 144, + 8, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 8, 128, + 0, 0, 228, 128, 0, 0, + 228, 128, 7, 0, 0, 2, + 0, 0, 8, 128, 0, 0, + 255, 128, 5, 0, 0, 3, + 2, 0, 7, 224, 0, 0, + 255, 128, 0, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 13, 0, + 0, 160, 10, 0, 0, 3, + 1, 0, 8, 224, 0, 0, + 0, 128, 13, 0, 85, 160, + 5, 0, 0, 3, 3, 0, + 8, 224, 3, 0, 255, 144, + 1, 0, 255, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 9, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 10, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 12, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 0, 0, + 3, 224, 2, 0, 228, 144, + 1, 0, 0, 2, 3, 0, + 7, 224, 3, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 136, 2, 0, 0, + 64, 0, 1, 0, 162, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 3, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 114, 32, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 3, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 4, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 0, 0, 0, 0, + 70, 16, 16, 0, 2, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 2, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 130, 32, 16, 0, 3, 0, + 0, 0, 58, 16, 16, 0, + 3, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 114, 32, 16, 0, + 3, 0, 0, 0, 70, 18, + 16, 0, 3, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 4, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 4, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 4, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 4, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 140, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 116, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 123, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 3, 0, 0, 132, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 15, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 84, + 69, 88, 67, 79, 79, 82, + 68, 0, 67, 79, 76, 79, + 82, 0, 171, 171, 79, 83, + 71, 78, 156, 0, 0, 0, + 5, 0, 0, 0, 8, 0, + 0, 0, 128, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 12, + 0, 0, 128, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 128, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 7, 8, + 0, 0, 137, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 15, 0, + 0, 0, 143, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 15, 0, + 0, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 67, + 79, 76, 79, 82, 0, 83, + 86, 95, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVc.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..237559ef91bd09f94f6070dd1a2750b634d981d4 GIT binary patch literal 65024 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 AJpcdz literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVcBn.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVcBn.inc new file mode 100644 index 0000000..cca2a3d --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVcBn.inc @@ -0,0 +1,597 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TEXCOORD 0 xy 2 NONE float xy +// COLOR 0 xyzw 3 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// TEXCOORD 0 xy 0 NONE float xy +// TEXCOORD 1 xyzw 1 NONE float xyzw +// TEXCOORD 2 xyz 2 NONE float xyz +// COLOR 0 xyzw 3 NONE float xyzw +// SV_Position 0 xyzw 4 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c2 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c6 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c13, 2, -1, 0, 1 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + dcl_texcoord3 v3 // vin<9,10,11,12> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 oPos.z, v0, c11 // ::VSBasicPixelLightingTxVcBn<15> + dp4 oT1.x, v0, c3 // ::VSBasicPixelLightingTxVcBn<2> + dp4 oT1.y, v0, c4 // ::VSBasicPixelLightingTxVcBn<3> + dp4 oT1.z, v0, c5 // ::VSBasicPixelLightingTxVcBn<4> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c13.x, c13.y // ::BiasX2<0,1,2> + +#line 87 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r1.x, r0, c6 + dp3 r1.y, r0, c7 + dp3 r1.z, r0, c8 + dp3 r0.x, r1, r1 + rsq r0.x, r0.x + mul oT2.xyz, r0.x, r1 // ::VSBasicPixelLightingTxVcBn<6,7,8> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 + max r0.x, r0.x, c13.z + min oT1.w, r0.x, c13.w // ::VSBasicPixelLightingTxVcBn<5> + +#line 486 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT3.w, v3.w, c1.w // ::VSBasicPixelLightingTxVcBn<12> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::vout<0> + dp4 r0.y, v0, c10 // ::vout<1> + dp4 r0.z, v0, c12 // ::vout<3> + +#line 476 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicPixelLightingTxVcBn<13,14> + mov oPos.w, r0.z // ::VSBasicPixelLightingTxVcBn<16> + +#line 487 + mov oT0.xy, v2 // ::VSBasicPixelLightingTxVcBn<0,1> + mov oT3.xyz, v3 // ::VSBasicPixelLightingTxVcBn<9,10,11> + +// approximately 22 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_input v3.xyzw +dcl_output o0.xy +dcl_output o1.xyzw +dcl_output o2.xyz +dcl_output o3.xyzw +dcl_output_siv o4.xyzw, position +dcl_temps 2 +mov o0.xy, v2.xyxx +dp4 o1.x, v0.xyzw, cb0[15].xyzw +dp4 o1.y, v0.xyzw, cb0[16].xyzw +dp4 o1.z, v0.xyzw, cb0[17].xyzw +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul o2.xyz, r0.xxxx, r1.xyzx +mul o3.w, v3.w, cb0[0].w +mov o3.xyz, v3.xyzx +dp4 o4.x, v0.xyzw, cb0[22].xyzw +dp4 o4.y, v0.xyzw, cb0[23].xyzw +dp4 o4.z, v0.xyzw, cb0[24].xyzw +dp4 o4.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicPixelLightingTxVcBn[] = +{ + 68, 88, 66, 67, 238, 40, + 187, 180, 178, 155, 55, 149, + 87, 211, 57, 53, 14, 230, + 186, 142, 1, 0, 0, 0, + 4, 11, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 0, 7, 0, 0, 204, 9, + 0, 0, 96, 10, 0, 0, + 65, 111, 110, 57, 200, 6, + 0, 0, 200, 6, 0, 0, + 0, 2, 254, 255, 124, 6, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 52, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 164, 4, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 27, 0, 0, 0, + 20, 1, 0, 0, 4, 0, + 0, 0, 84, 4, 0, 0, + 16, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 216, 4, + 0, 0, 0, 0, 255, 255, + 240, 4, 0, 0, 0, 0, + 255, 255, 252, 4, 0, 0, + 0, 0, 255, 255, 8, 5, + 0, 0, 0, 0, 255, 255, + 20, 5, 0, 0, 85, 0, + 0, 0, 32, 5, 0, 0, + 86, 0, 0, 0, 48, 5, + 0, 0, 86, 0, 0, 0, + 64, 5, 0, 0, 86, 0, + 0, 0, 80, 5, 0, 0, + 32, 0, 1, 0, 96, 5, + 0, 0, 87, 0, 0, 0, + 116, 5, 0, 0, 87, 0, + 0, 0, 132, 5, 0, 0, + 87, 0, 0, 0, 148, 5, + 0, 0, 87, 0, 0, 0, + 164, 5, 0, 0, 87, 0, + 0, 0, 180, 5, 0, 0, + 87, 0, 0, 0, 192, 5, + 0, 0, 14, 0, 1, 0, + 208, 5, 0, 0, 14, 0, + 1, 0, 224, 5, 0, 0, + 14, 0, 1, 0, 240, 5, + 0, 0, 230, 1, 2, 0, + 0, 6, 0, 0, 85, 0, + 0, 0, 16, 6, 0, 0, + 85, 0, 0, 0, 32, 6, + 0, 0, 85, 0, 0, 0, + 48, 6, 0, 0, 220, 1, + 2, 0, 64, 6, 0, 0, + 220, 1, 2, 0, 84, 6, + 0, 0, 231, 1, 2, 0, + 96, 6, 0, 0, 229, 1, + 2, 0, 108, 6, 0, 0, + 66, 105, 97, 115, 88, 50, + 0, 171, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 86, 83, 66, 97, 115, 105, + 99, 80, 105, 120, 101, 108, + 76, 105, 103, 104, 116, 105, + 110, 103, 84, 120, 86, 99, + 66, 110, 0, 84, 101, 120, + 67, 111, 111, 114, 100, 0, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 87, 83, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 78, 111, 114, 109, + 97, 108, 87, 83, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 80, 83, + 0, 171, 43, 2, 0, 0, + 52, 2, 0, 0, 68, 2, + 0, 0, 80, 2, 0, 0, + 96, 2, 0, 0, 108, 2, + 0, 0, 124, 2, 0, 0, + 80, 2, 0, 0, 132, 2, + 0, 0, 80, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 17, 0, 1, 0, 5, 0, + 144, 2, 0, 0, 5, 0, + 0, 0, 255, 255, 255, 255, + 15, 0, 255, 255, 6, 0, + 0, 0, 2, 0, 255, 255, + 255, 255, 255, 255, 7, 0, + 0, 0, 255, 255, 3, 0, + 255, 255, 255, 255, 8, 0, + 0, 0, 255, 255, 255, 255, + 4, 0, 255, 255, 15, 0, + 0, 0, 6, 0, 7, 0, + 8, 0, 255, 255, 18, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 5, 0, 19, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 12, 0, 23, 0, + 0, 0, 13, 0, 14, 0, + 255, 255, 255, 255, 24, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 16, 0, 25, 0, + 0, 0, 0, 0, 1, 0, + 255, 255, 255, 255, 26, 0, + 0, 0, 9, 0, 10, 0, + 11, 0, 255, 255, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 78, + 111, 114, 109, 97, 108, 0, + 67, 111, 108, 111, 114, 0, + 171, 171, 80, 3, 0, 0, + 80, 2, 0, 0, 89, 3, + 0, 0, 108, 2, 0, 0, + 43, 2, 0, 0, 52, 2, + 0, 0, 96, 3, 0, 0, + 80, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 13, 0, + 1, 0, 4, 0, 104, 3, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 255, 255, + 255, 255, 4, 0, 0, 0, + 9, 0, 10, 0, 11, 0, + 12, 0, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 80, 111, 115, 95, + 119, 115, 0, 78, 111, 114, + 109, 97, 108, 95, 119, 115, + 0, 70, 111, 103, 70, 97, + 99, 116, 111, 114, 0, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 205, 3, + 0, 0, 80, 2, 0, 0, + 212, 3, 0, 0, 108, 2, + 0, 0, 219, 3, 0, 0, + 108, 2, 0, 0, 229, 3, + 0, 0, 240, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 11, 0, 1, 0, 4, 0, + 0, 4, 0, 0, 20, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 21, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 22, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 236, 1, 0, 0, + 244, 1, 0, 0, 1, 0, + 0, 0, 4, 2, 0, 0, + 0, 0, 0, 0, 16, 2, + 0, 0, 184, 2, 0, 0, + 11, 0, 0, 0, 200, 2, + 0, 0, 16, 2, 0, 0, + 76, 3, 0, 0, 136, 3, + 0, 0, 4, 0, 0, 0, + 152, 3, 0, 0, 0, 0, + 0, 0, 200, 3, 0, 0, + 32, 4, 0, 0, 3, 0, + 0, 0, 48, 4, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 13, 0, 15, 160, + 0, 0, 0, 64, 0, 0, + 128, 191, 0, 0, 0, 0, + 0, 0, 128, 63, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 3, 128, + 3, 0, 15, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 11, 0, + 228, 160, 9, 0, 0, 3, + 1, 0, 1, 224, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 1, 0, + 2, 224, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 1, 0, 4, 224, + 0, 0, 228, 144, 5, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 144, 13, 0, 0, 160, + 13, 0, 85, 160, 8, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 228, 128, 6, 0, + 228, 160, 8, 0, 0, 3, + 1, 0, 2, 128, 0, 0, + 228, 128, 7, 0, 228, 160, + 8, 0, 0, 3, 1, 0, + 4, 128, 0, 0, 228, 128, + 8, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 128, 1, 0, + 228, 128, 7, 0, 0, 2, + 0, 0, 1, 128, 0, 0, + 0, 128, 5, 0, 0, 3, + 2, 0, 7, 224, 0, 0, + 0, 128, 1, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 13, 0, + 170, 160, 10, 0, 0, 3, + 1, 0, 8, 224, 0, 0, + 0, 128, 13, 0, 255, 160, + 5, 0, 0, 3, 3, 0, + 8, 224, 3, 0, 255, 144, + 1, 0, 255, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 9, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 10, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 12, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 0, 0, + 3, 224, 2, 0, 228, 144, + 1, 0, 0, 2, 3, 0, + 7, 224, 3, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 196, 2, 0, 0, + 64, 0, 1, 0, 177, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 3, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 114, 32, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 3, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 4, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 2, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 0, 0, 0, 0, + 70, 16, 16, 0, 2, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 50, 0, + 0, 15, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 191, 0, 0, + 128, 191, 0, 0, 128, 191, + 0, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 2, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 8, + 130, 32, 16, 0, 3, 0, + 0, 0, 58, 16, 16, 0, + 3, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 114, 32, 16, 0, + 3, 0, 0, 0, 70, 18, + 16, 0, 3, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 4, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 4, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 4, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 4, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 140, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 116, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 123, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 3, 0, 0, 132, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 15, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 84, + 69, 88, 67, 79, 79, 82, + 68, 0, 67, 79, 76, 79, + 82, 0, 171, 171, 79, 83, + 71, 78, 156, 0, 0, 0, + 5, 0, 0, 0, 8, 0, + 0, 0, 128, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 12, + 0, 0, 128, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 128, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 7, 8, + 0, 0, 137, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 15, 0, + 0, 0, 143, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 15, 0, + 0, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 67, + 79, 76, 79, 82, 0, 83, + 86, 95, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVcBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingTxVcBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..0346be90ea19a8bae71775a42ef61213e78c0226 GIT binary patch literal 65024 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 + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8,9,10> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 oPos.z, v0, c11 // ::VSBasicPixelLightingVc<13> + dp4 oT0.x, v0, c3 // ::VSBasicPixelLightingVc<0> + dp4 oT0.y, v0, c4 // ::VSBasicPixelLightingVc<1> + dp4 oT0.z, v0, c5 // ::VSBasicPixelLightingVc<2> + dp3 r0.x, v1, c6 + dp3 r0.y, v1, c7 + dp3 r0.z, v1, c8 + dp3 r0.w, r0, r0 + rsq r0.w, r0.w + mul oT1.xyz, r0.w, r0 // ::VSBasicPixelLightingVc<4,5,6> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 + max r0.x, r0.x, c13.x + min oT0.w, r0.x, c13.y // ::VSBasicPixelLightingVc<3> + +#line 410 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT2.w, v2.w, c1.w // ::VSBasicPixelLightingVc<10> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::vout<0> + dp4 r0.y, v0, c10 // ::vout<1> + dp4 r0.z, v0, c12 // ::vout<3> + +#line 402 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicPixelLightingVc<11,12> + mov oPos.w, r0.z // ::VSBasicPixelLightingVc<14> + +#line 409 + mov oT2.xyz, v2 // ::VSBasicPixelLightingVc<7,8,9> + +// approximately 20 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xyz +dcl_output o2.xyzw +dcl_output_siv o3.xyzw, position +dcl_temps 1 +dp4 o0.x, v0.xyzw, cb0[15].xyzw +dp4 o0.y, v0.xyzw, cb0[16].xyzw +dp4 o0.z, v0.xyzw, cb0[17].xyzw +dp4_sat o0.w, v0.xyzw, cb0[14].xyzw +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul o1.xyz, r0.wwww, r0.xyzx +mul o2.w, v2.w, cb0[0].w +mov o2.xyz, v2.xyzx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicPixelLightingVc[] = +{ + 68, 88, 66, 67, 14, 96, + 161, 196, 40, 31, 31, 41, + 175, 59, 48, 152, 146, 56, + 87, 212, 1, 0, 0, 0, + 164, 9, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 64, 6, 0, 0, 164, 8, + 0, 0, 24, 9, 0, 0, + 65, 111, 110, 57, 8, 6, + 0, 0, 8, 6, 0, 0, + 0, 2, 254, 255, 188, 5, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 15, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 16, 4, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 24, 0, 0, 0, + 20, 1, 0, 0, 3, 0, + 0, 0, 212, 3, 0, 0, + 212, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 68, 4, + 0, 0, 0, 0, 255, 255, + 92, 4, 0, 0, 0, 0, + 255, 255, 104, 4, 0, 0, + 0, 0, 255, 255, 116, 4, + 0, 0, 85, 0, 0, 0, + 128, 4, 0, 0, 86, 0, + 0, 0, 144, 4, 0, 0, + 86, 0, 0, 0, 160, 4, + 0, 0, 86, 0, 0, 0, + 176, 4, 0, 0, 87, 0, + 0, 0, 192, 4, 0, 0, + 87, 0, 0, 0, 208, 4, + 0, 0, 87, 0, 0, 0, + 224, 4, 0, 0, 87, 0, + 0, 0, 240, 4, 0, 0, + 87, 0, 0, 0, 0, 5, + 0, 0, 87, 0, 0, 0, + 12, 5, 0, 0, 14, 0, + 1, 0, 28, 5, 0, 0, + 14, 0, 1, 0, 44, 5, + 0, 0, 14, 0, 1, 0, + 60, 5, 0, 0, 154, 1, + 2, 0, 76, 5, 0, 0, + 85, 0, 0, 0, 92, 5, + 0, 0, 85, 0, 0, 0, + 108, 5, 0, 0, 85, 0, + 0, 0, 124, 5, 0, 0, + 146, 1, 2, 0, 140, 5, + 0, 0, 146, 1, 2, 0, + 160, 5, 0, 0, 153, 1, + 2, 0, 172, 5, 0, 0, + 86, 83, 66, 97, 115, 105, + 99, 80, 105, 120, 101, 108, + 76, 105, 103, 104, 116, 105, + 110, 103, 86, 99, 0, 80, + 111, 115, 105, 116, 105, 111, + 110, 87, 83, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 78, 111, + 114, 109, 97, 108, 87, 83, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 235, 1, + 0, 0, 248, 1, 0, 0, + 8, 2, 0, 0, 20, 2, + 0, 0, 36, 2, 0, 0, + 248, 1, 0, 0, 44, 2, + 0, 0, 248, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 15, 0, 1, 0, 4, 0, + 56, 2, 0, 0, 4, 0, + 0, 0, 255, 255, 255, 255, + 13, 0, 255, 255, 5, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 6, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 7, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 13, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 16, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 17, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 10, 0, 21, 0, + 0, 0, 11, 0, 12, 0, + 255, 255, 255, 255, 22, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 14, 0, 23, 0, + 0, 0, 7, 0, 8, 0, + 9, 0, 255, 255, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 78, + 111, 114, 109, 97, 108, 0, + 67, 111, 108, 111, 114, 0, + 171, 171, 228, 2, 0, 0, + 248, 1, 0, 0, 237, 2, + 0, 0, 20, 2, 0, 0, + 244, 2, 0, 0, 248, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 11, 0, 1, 0, + 3, 0, 252, 2, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 9, 0, 10, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 80, 111, 115, 95, 119, 115, + 0, 78, 111, 114, 109, 97, + 108, 95, 119, 115, 0, 70, + 111, 103, 70, 97, 99, 116, + 111, 114, 0, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 77, 3, 0, 0, + 248, 1, 0, 0, 84, 3, + 0, 0, 20, 2, 0, 0, + 91, 3, 0, 0, 20, 2, + 0, 0, 101, 3, 0, 0, + 112, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 11, 0, + 1, 0, 4, 0, 128, 3, + 0, 0, 18, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 19, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 20, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 0, 0, 0, 0, + 212, 1, 0, 0, 88, 2, + 0, 0, 10, 0, 0, 0, + 104, 2, 0, 0, 212, 1, + 0, 0, 224, 2, 0, 0, + 20, 3, 0, 0, 3, 0, + 0, 0, 36, 3, 0, 0, + 0, 0, 0, 0, 72, 3, + 0, 0, 160, 3, 0, 0, + 3, 0, 0, 0, 176, 3, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 13, 0, + 15, 160, 0, 0, 0, 0, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 11, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 224, + 0, 0, 228, 144, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 224, 0, 0, + 228, 144, 4, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 224, 0, 0, 228, 144, + 5, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 144, 6, 0, + 228, 160, 8, 0, 0, 3, + 0, 0, 2, 128, 1, 0, + 228, 144, 7, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 4, 128, 1, 0, 228, 144, + 8, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 8, 128, + 0, 0, 228, 128, 0, 0, + 228, 128, 7, 0, 0, 2, + 0, 0, 8, 128, 0, 0, + 255, 128, 5, 0, 0, 3, + 1, 0, 7, 224, 0, 0, + 255, 128, 0, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 13, 0, + 0, 160, 10, 0, 0, 3, + 0, 0, 8, 224, 0, 0, + 0, 128, 13, 0, 85, 160, + 5, 0, 0, 3, 2, 0, + 8, 224, 2, 0, 255, 144, + 1, 0, 255, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 9, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 10, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 12, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 2, 0, + 7, 224, 2, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 92, 2, 0, 0, + 64, 0, 1, 0, 151, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 114, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 2, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 32, 16, 0, 1, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 130, 32, + 16, 0, 2, 0, 0, 0, + 58, 16, 16, 0, 2, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 2, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 108, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 15, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 67, 79, 76, + 79, 82, 0, 171, 171, 171, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 8, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 0, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 67, 79, 76, 79, 82, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVc.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..447bd2c0d57cd2b5b1012eac210781b0a00fe158 GIT binary patch literal 65024 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 z zDR7v*L&Vsm*nu(TAM%lUagaT+?{J!^Bo91@ z3p6$aW{7TVdkPev&8DlBxshBM=kv+O=Mq5?;TgO7+SS*bao-%2rMlAJ+mu?b?u!vSJJ_C&?qgs0^zG~xHiv5t=mLxw zyrze~y8z~)Z&Tb=EQH72mh-3_1bmsK%84TVnXcb7vZo=IXzkk>5Qm*xGSY^ z48J}Jcoi^wV(wf81I*m;;!1jHc5WnFS*jLGb9gT5>*G`9n)-2?cIgILUCpy3J)#Fcp|IjzaKlq^szC3mH5w8DvMNCWln5)l68nF+G#Ktpf^tfUR1fp($E;Bf9c(rH`@<=LFH*obbS+zQ5;b69XbJ|b7Uu822h;N z=Kw>1M*)QM8h{)`!to&hrr6jpU<5D{S?MmE z?*_aba1Y>D0QUlZ6~F=a0S*H02OI*t18^Ad0D$Oz1aK5^3_$dM5YP?i0rUd;0R4ag zz#!nAfOi4FPIeq{5^xGYQQY4HAelK0r~s;f6~HCHDj+&;ObR@YZoU7;>{`^ThyoD> I>QLbS0Xz4yKmY&$ literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVcBn.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVcBn.inc new file mode 100644 index 0000000..7e1317a --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVcBn.inc @@ -0,0 +1,556 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// COLOR 0 xyzw 2 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// TEXCOORD 0 xyzw 0 NONE float xyzw +// TEXCOORD 1 xyz 1 NONE float xyz +// COLOR 0 xyzw 2 NONE float xyzw +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c2 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c6 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c13, 2, -1, 0, 1 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8,9,10> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 oPos.z, v0, c11 // ::VSBasicPixelLightingVcBn<13> + dp4 oT0.x, v0, c3 // ::VSBasicPixelLightingVcBn<0> + dp4 oT0.y, v0, c4 // ::VSBasicPixelLightingVcBn<1> + dp4 oT0.z, v0, c5 // ::VSBasicPixelLightingVcBn<2> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c13.x, c13.y // ::BiasX2<0,1,2> + +#line 87 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r1.x, r0, c6 + dp3 r1.y, r0, c7 + dp3 r1.z, r0, c8 + dp3 r0.x, r1, r1 + rsq r0.x, r0.x + mul oT1.xyz, r0.x, r1 // ::VSBasicPixelLightingVcBn<4,5,6> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 + max r0.x, r0.x, c13.z + min oT0.w, r0.x, c13.w // ::VSBasicPixelLightingVcBn<3> + +#line 425 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT2.w, v2.w, c1.w // ::VSBasicPixelLightingVcBn<10> + +#line 85 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c9 // ::vout<0> + dp4 r0.y, v0, c10 // ::vout<1> + dp4 r0.z, v0, c12 // ::vout<3> + +#line 415 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicPixelLightingVcBn<11,12> + mov oPos.w, r0.z // ::VSBasicPixelLightingVcBn<14> + +#line 424 + mov oT2.xyz, v2 // ::VSBasicPixelLightingVcBn<7,8,9> + +// approximately 21 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xyz +dcl_output o2.xyzw +dcl_output_siv o3.xyzw, position +dcl_temps 2 +dp4 o0.x, v0.xyzw, cb0[15].xyzw +dp4 o0.y, v0.xyzw, cb0[16].xyzw +dp4 o0.z, v0.xyzw, cb0[17].xyzw +dp4_sat o0.w, v0.xyzw, cb0[14].xyzw +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul o1.xyz, r0.xxxx, r1.xyzx +mul o2.w, v2.w, cb0[0].w +mov o2.xyz, v2.xyzx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicPixelLightingVcBn[] = +{ + 68, 88, 66, 67, 13, 215, + 201, 115, 232, 134, 173, 41, + 164, 62, 220, 120, 214, 16, + 121, 12, 1, 0, 0, 0, + 52, 10, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 148, 6, 0, 0, 52, 9, + 0, 0, 168, 9, 0, 0, + 65, 111, 110, 57, 92, 6, + 0, 0, 92, 6, 0, 0, + 0, 2, 254, 255, 16, 6, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 31, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 80, 4, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 25, 0, 0, 0, + 20, 1, 0, 0, 4, 0, + 0, 0, 0, 4, 0, 0, + 0, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 132, 4, + 0, 0, 0, 0, 255, 255, + 156, 4, 0, 0, 0, 0, + 255, 255, 168, 4, 0, 0, + 0, 0, 255, 255, 180, 4, + 0, 0, 85, 0, 0, 0, + 192, 4, 0, 0, 86, 0, + 0, 0, 208, 4, 0, 0, + 86, 0, 0, 0, 224, 4, + 0, 0, 86, 0, 0, 0, + 240, 4, 0, 0, 32, 0, + 1, 0, 0, 5, 0, 0, + 87, 0, 0, 0, 20, 5, + 0, 0, 87, 0, 0, 0, + 36, 5, 0, 0, 87, 0, + 0, 0, 52, 5, 0, 0, + 87, 0, 0, 0, 68, 5, + 0, 0, 87, 0, 0, 0, + 84, 5, 0, 0, 87, 0, + 0, 0, 96, 5, 0, 0, + 14, 0, 1, 0, 112, 5, + 0, 0, 14, 0, 1, 0, + 128, 5, 0, 0, 14, 0, + 1, 0, 144, 5, 0, 0, + 169, 1, 2, 0, 160, 5, + 0, 0, 85, 0, 0, 0, + 176, 5, 0, 0, 85, 0, + 0, 0, 192, 5, 0, 0, + 85, 0, 0, 0, 208, 5, + 0, 0, 159, 1, 2, 0, + 224, 5, 0, 0, 159, 1, + 2, 0, 244, 5, 0, 0, + 168, 1, 2, 0, 0, 6, + 0, 0, 66, 105, 97, 115, + 88, 50, 0, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 86, 83, 66, 97, + 115, 105, 99, 80, 105, 120, + 101, 108, 76, 105, 103, 104, + 116, 105, 110, 103, 86, 99, + 66, 110, 0, 80, 111, 115, + 105, 116, 105, 111, 110, 87, + 83, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 78, 111, 114, 109, 97, 108, + 87, 83, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 25, 2, 0, 0, 36, 2, + 0, 0, 52, 2, 0, 0, + 64, 2, 0, 0, 80, 2, + 0, 0, 36, 2, 0, 0, + 88, 2, 0, 0, 36, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 15, 0, 1, 0, + 4, 0, 100, 2, 0, 0, + 4, 0, 0, 0, 255, 255, + 255, 255, 13, 0, 255, 255, + 5, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 6, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 7, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 14, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 17, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 3, 0, + 18, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 10, 0, + 22, 0, 0, 0, 11, 0, + 12, 0, 255, 255, 255, 255, + 23, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 14, 0, + 24, 0, 0, 0, 7, 0, + 8, 0, 9, 0, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 78, 111, 114, 109, 97, + 108, 0, 67, 111, 108, 111, + 114, 0, 171, 171, 16, 3, + 0, 0, 36, 2, 0, 0, + 25, 3, 0, 0, 64, 2, + 0, 0, 32, 3, 0, 0, + 36, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 11, 0, + 1, 0, 3, 0, 40, 3, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 9, 0, + 10, 0, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 80, 111, 115, 95, + 119, 115, 0, 78, 111, 114, + 109, 97, 108, 95, 119, 115, + 0, 70, 111, 103, 70, 97, + 99, 116, 111, 114, 0, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 121, 3, + 0, 0, 36, 2, 0, 0, + 128, 3, 0, 0, 64, 2, + 0, 0, 135, 3, 0, 0, + 64, 2, 0, 0, 145, 3, + 0, 0, 156, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 11, 0, 1, 0, 4, 0, + 172, 3, 0, 0, 19, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 20, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 21, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 220, 1, 0, 0, + 228, 1, 0, 0, 1, 0, + 0, 0, 244, 1, 0, 0, + 0, 0, 0, 0, 0, 2, + 0, 0, 132, 2, 0, 0, + 10, 0, 0, 0, 148, 2, + 0, 0, 0, 2, 0, 0, + 12, 3, 0, 0, 64, 3, + 0, 0, 3, 0, 0, 0, + 80, 3, 0, 0, 0, 0, + 0, 0, 116, 3, 0, 0, + 204, 3, 0, 0, 3, 0, + 0, 0, 220, 3, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 13, 0, 15, 160, + 0, 0, 0, 64, 0, 0, + 128, 191, 0, 0, 0, 0, + 0, 0, 128, 63, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 11, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 224, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 224, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 224, + 0, 0, 228, 144, 5, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 144, 13, 0, 0, 160, + 13, 0, 85, 160, 8, 0, + 0, 3, 1, 0, 1, 128, + 0, 0, 228, 128, 6, 0, + 228, 160, 8, 0, 0, 3, + 1, 0, 2, 128, 0, 0, + 228, 128, 7, 0, 228, 160, + 8, 0, 0, 3, 1, 0, + 4, 128, 0, 0, 228, 128, + 8, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 128, 1, 0, + 228, 128, 7, 0, 0, 2, + 0, 0, 1, 128, 0, 0, + 0, 128, 5, 0, 0, 3, + 1, 0, 7, 224, 0, 0, + 0, 128, 1, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 13, 0, + 170, 160, 10, 0, 0, 3, + 0, 0, 8, 224, 0, 0, + 0, 128, 13, 0, 255, 160, + 5, 0, 0, 3, 2, 0, + 8, 224, 2, 0, 255, 144, + 1, 0, 255, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 9, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 10, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 12, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 2, 0, + 7, 224, 2, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 152, 2, 0, 0, + 64, 0, 1, 0, 166, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 114, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 2, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 2, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 50, 0, 0, 15, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0, + 0, 64, 0, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 191, 0, 0, 128, 191, + 0, 0, 128, 191, 0, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 32, 16, 0, 1, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 8, 130, 32, + 16, 0, 2, 0, 0, 0, + 58, 16, 16, 0, 2, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 2, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 108, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 15, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 67, 79, 76, + 79, 82, 0, 171, 171, 171, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 8, 0, 0, 113, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 0, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 67, 79, 76, 79, 82, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVcBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicPixelLightingVcBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8b90eaf448c0a139e18b5fdb206288825ba6c137 GIT binary patch literal 65024 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTx.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTx.inc new file mode 100644 index 0000000..662073c --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTx.inc @@ -0,0 +1,394 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// TEXCOORD 0 xy 1 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c2 cb0 14 1 ( FLT, FLT, FLT, FLT) +// c3 cb0 22 4 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c7, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c5 // ::VSBasicTx<12> + +#line 14 + dp4 r0.x, v0, c2 + max r0.x, r0.x, c7.x + min oT1.w, r0.x, c7.y // ::VSBasicTx<7> + +#line 49 + dp4 r0.x, v0, c3 // ::vout<0> + dp4 r0.y, v0, c4 // ::vout<1> + dp4 r0.z, v0, c6 // ::vout<3> + +#line 96 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicTx<10,11> + mov oPos.w, r0.z // ::VSBasicTx<13> + +#line 50 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT0, c1 // ::VSBasicTx<0,1,2,3> + mov oT1.xyz, c7.x // ::VSBasicTx<4,5,6> + +#line 103 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mov oT2.xy, v1 // ::VSBasicTx<8,9> + +// approximately 12 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +mov o0.xyzw, cb0[0].xyzw +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o1.xyz, l(0,0,0,0) +mov o2.xy, v1.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicTx[] = +{ + 68, 88, 66, 67, 1, 60, + 97, 224, 32, 210, 12, 33, + 12, 125, 188, 124, 64, 50, + 39, 211, 1, 0, 0, 0, + 4, 7, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 196, 4, 0, 0, 32, 6, + 0, 0, 120, 6, 0, 0, + 65, 111, 110, 57, 140, 4, + 0, 0, 140, 4, 0, 0, + 0, 2, 254, 255, 64, 4, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 4, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 212, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 36, 3, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 15, 0, 0, 0, + 196, 0, 0, 0, 3, 0, + 0, 0, 232, 2, 0, 0, + 60, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 112, 0, 0, 0, 0, 0, + 255, 255, 88, 3, 0, 0, + 0, 0, 255, 255, 112, 3, + 0, 0, 0, 0, 255, 255, + 124, 3, 0, 0, 49, 0, + 0, 0, 136, 3, 0, 0, + 14, 0, 0, 0, 152, 3, + 0, 0, 14, 0, 0, 0, + 168, 3, 0, 0, 14, 0, + 0, 0, 184, 3, 0, 0, + 49, 0, 0, 0, 200, 3, + 0, 0, 49, 0, 0, 0, + 216, 3, 0, 0, 49, 0, + 0, 0, 232, 3, 0, 0, + 96, 0, 1, 0, 248, 3, + 0, 0, 96, 0, 1, 0, + 12, 4, 0, 0, 50, 0, + 0, 0, 24, 4, 0, 0, + 51, 0, 0, 0, 36, 4, + 0, 0, 103, 0, 1, 0, + 48, 4, 0, 0, 86, 83, + 66, 97, 115, 105, 99, 84, + 120, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 70, 1, + 0, 0, 80, 1, 0, 0, + 96, 1, 0, 0, 80, 1, + 0, 0, 105, 1, 0, 0, + 116, 1, 0, 0, 132, 1, + 0, 0, 80, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 14, 0, 1, 0, 4, 0, + 144, 1, 0, 0, 3, 0, + 0, 0, 255, 255, 255, 255, + 12, 0, 255, 255, 6, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 10, 0, + 0, 0, 10, 0, 11, 0, + 255, 255, 255, 255, 11, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 13, 0, 12, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 13, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 14, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 171, + 171, 171, 24, 2, 0, 0, + 80, 1, 0, 0, 105, 1, + 0, 0, 116, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 6, 0, 1, 0, 2, 0, + 36, 2, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 255, 255, 255, 255, 118, 111, + 117, 116, 0, 80, 111, 115, + 95, 112, 115, 0, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 70, 111, 103, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 97, 2, 0, 0, 80, 1, + 0, 0, 70, 1, 0, 0, + 80, 1, 0, 0, 96, 1, + 0, 0, 104, 2, 0, 0, + 120, 2, 0, 0, 132, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 4, 0, 148, 2, 0, 0, + 7, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 8, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 9, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 0, 0, 0, 0, 60, 1, + 0, 0, 176, 1, 0, 0, + 7, 0, 0, 0, 192, 1, + 0, 0, 60, 1, 0, 0, + 20, 2, 0, 0, 52, 2, + 0, 0, 2, 0, 0, 0, + 68, 2, 0, 0, 0, 0, + 0, 0, 92, 2, 0, 0, + 180, 2, 0, 0, 3, 0, + 0, 0, 196, 2, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 7, 0, 15, 160, + 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 5, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 2, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 7, 0, 0, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 7, 0, + 85, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 6, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 15, 224, + 1, 0, 228, 160, 1, 0, + 0, 2, 1, 0, 7, 224, + 7, 0, 0, 160, 1, 0, + 0, 2, 2, 0, 3, 224, + 1, 0, 228, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 84, 1, 0, 0, 64, 0, + 1, 0, 85, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 6, + 242, 32, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 54, 0, + 0, 8, 114, 32, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 2, 0, 0, 0, + 70, 16, 16, 0, 1, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 80, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 3, 3, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 171, 171, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 110, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTx.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTx.pdb new file mode 100644 index 0000000000000000000000000000000000000000..43da69cd32e140e9f33b482b99cd63202e69eb90 GIT binary patch literal 65024 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 + dcl_texcoord1 v1 // vin<4,5> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c4 // ::VSBasicTxNoFog<8> + dp4 r0.x, v0, c2 // ::vout<0> + dp4 r0.y, v0, c3 // ::vout<1> + dp4 r0.z, v0, c5 // ::vout<3> + +#line 110 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicTxNoFog<6,7> + mov oPos.w, r0.z // ::VSBasicTxNoFog<9> + +#line 50 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT0, c1 // ::VSBasicTxNoFog<0,1,2,3> + +#line 117 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mov oT1.xy, v1 // ::VSBasicTxNoFog<4,5> + +// approximately 8 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_output o0.xyzw +dcl_output o1.xy +dcl_output_siv o2.xyzw, position +mov o0.xyzw, cb0[0].xyzw +mov o1.xy, v1.xyxx +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicTxNoFog[] = +{ + 68, 88, 66, 67, 155, 230, + 236, 115, 57, 73, 191, 132, + 39, 177, 138, 199, 129, 139, + 94, 95, 1, 0, 0, 0, + 0, 6, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 36, 4, 0, 0, 52, 5, + 0, 0, 140, 5, 0, 0, + 65, 111, 110, 57, 236, 3, + 0, 0, 236, 3, 0, 0, + 0, 2, 254, 255, 172, 3, + 0, 0, 64, 0, 0, 0, + 2, 0, 36, 0, 0, 0, + 60, 0, 0, 0, 60, 0, + 0, 0, 36, 0, 1, 0, + 60, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 196, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 228, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 10, 0, 0, 0, + 196, 0, 0, 0, 3, 0, + 0, 0, 168, 2, 0, 0, + 20, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 112, 0, 0, 0, 0, 0, + 255, 255, 24, 3, 0, 0, + 0, 0, 255, 255, 36, 3, + 0, 0, 49, 0, 0, 0, + 48, 3, 0, 0, 49, 0, + 0, 0, 64, 3, 0, 0, + 49, 0, 0, 0, 80, 3, + 0, 0, 49, 0, 0, 0, + 96, 3, 0, 0, 110, 0, + 1, 0, 112, 3, 0, 0, + 110, 0, 1, 0, 132, 3, + 0, 0, 50, 0, 0, 0, + 144, 3, 0, 0, 117, 0, + 1, 0, 156, 3, 0, 0, + 86, 83, 66, 97, 115, 105, + 99, 84, 120, 78, 111, 70, + 111, 103, 0, 68, 105, 102, + 102, 117, 115, 101, 0, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 84, 101, + 120, 67, 111, 111, 114, 100, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 80, 83, + 0, 171, 35, 1, 0, 0, + 44, 1, 0, 0, 60, 1, + 0, 0, 72, 1, 0, 0, + 88, 1, 0, 0, 44, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 10, 0, 1, 0, + 3, 0, 100, 1, 0, 0, + 2, 0, 0, 0, 255, 255, + 255, 255, 8, 0, 255, 255, + 6, 0, 0, 0, 6, 0, + 7, 0, 255, 255, 255, 255, + 7, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 9, 0, + 8, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 9, 0, 0, 0, 4, 0, + 5, 0, 255, 255, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171, 171, 171, 204, 1, + 0, 0, 44, 1, 0, 0, + 60, 1, 0, 0, 72, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 216, 1, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 1, 0, 0, 0, 4, 0, + 5, 0, 255, 255, 255, 255, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 21, 2, 0, 0, + 44, 1, 0, 0, 35, 1, + 0, 0, 44, 1, 0, 0, + 28, 2, 0, 0, 40, 2, + 0, 0, 56, 2, 0, 0, + 68, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 84, 2, + 0, 0, 3, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 4, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 5, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 0, 0, 0, 0, + 20, 1, 0, 0, 124, 1, + 0, 0, 5, 0, 0, 0, + 140, 1, 0, 0, 20, 1, + 0, 0, 200, 1, 0, 0, + 232, 1, 0, 0, 2, 0, + 0, 0, 248, 1, 0, 0, + 0, 0, 0, 0, 16, 2, + 0, 0, 116, 2, 0, 0, + 3, 0, 0, 0, 132, 2, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 2, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 5, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 0, 0, + 15, 224, 1, 0, 228, 160, + 1, 0, 0, 2, 1, 0, + 3, 224, 1, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 8, 1, 0, 0, + 64, 0, 1, 0, 66, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 1, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 54, 0, + 0, 6, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 50, 32, 16, 0, + 1, 0, 0, 0, 70, 16, + 16, 0, 1, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 80, 0, + 0, 0, 2, 0, 0, 0, + 8, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 3, 3, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 171, 171, 171, 79, 83, + 71, 78, 108, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 3, 12, + 0, 0, 95, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 0, + 0, 0, 67, 79, 76, 79, + 82, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 83, + 86, 95, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8f9da9a8a43a4e166626c6b81b5f0a745bc3c02b GIT binary patch literal 65024 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 u07Vric^LzcL+=2pfK9*#AU + dcl_texcoord1 v1 // vin<4,5> + dcl_texcoord2 v2 // vin<6,7,8,9> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c5 // ::VSBasicTxVc<12> + +#line 14 + dp4 r0.x, v0, c2 + max r0.x, r0.x, c7.x + min oT1.w, r0.x, c7.y // ::VSBasicTxVc<7> + +#line 132 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0, v2, c1 // ::VSBasicTxVc<0,1,2,3> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c3 // ::vout<0> + dp4 r0.y, v0, c4 // ::vout<1> + dp4 r0.z, v0, c6 // ::vout<3> + +#line 124 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicTxVc<10,11> + mov oPos.w, r0.z // ::VSBasicTxVc<13> + +#line 51 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT1.xyz, c7.x // ::VSBasicTxVc<4,5,6> + +#line 131 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mov oT2.xy, v1 // ::VSBasicTxVc<8,9> + +// approximately 12 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +mul o0.xyzw, v2.xyzw, cb0[0].xyzw +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o1.xyz, l(0,0,0,0) +mov o2.xy, v1.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicTxVc[] = +{ + 68, 88, 66, 67, 71, 59, + 130, 218, 99, 178, 102, 122, + 227, 175, 16, 69, 74, 53, + 72, 2, 1, 0, 0, 0, + 100, 7, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 244, 4, 0, 0, 100, 6, + 0, 0, 216, 6, 0, 0, + 65, 111, 110, 57, 188, 4, + 0, 0, 188, 4, 0, 0, + 0, 2, 254, 255, 112, 4, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 4, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 220, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 68, 3, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 16, 0, 0, 0, + 196, 0, 0, 0, 3, 0, + 0, 0, 8, 3, 0, 0, + 68, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 112, 0, 0, 0, 0, 0, + 255, 255, 120, 3, 0, 0, + 0, 0, 255, 255, 144, 3, + 0, 0, 0, 0, 255, 255, + 156, 3, 0, 0, 0, 0, + 255, 255, 168, 3, 0, 0, + 49, 0, 0, 0, 180, 3, + 0, 0, 14, 0, 0, 0, + 196, 3, 0, 0, 14, 0, + 0, 0, 212, 3, 0, 0, + 14, 0, 0, 0, 228, 3, + 0, 0, 132, 0, 1, 0, + 244, 3, 0, 0, 49, 0, + 0, 0, 4, 4, 0, 0, + 49, 0, 0, 0, 20, 4, + 0, 0, 49, 0, 0, 0, + 36, 4, 0, 0, 124, 0, + 1, 0, 52, 4, 0, 0, + 124, 0, 1, 0, 72, 4, + 0, 0, 51, 0, 0, 0, + 84, 4, 0, 0, 131, 0, + 1, 0, 96, 4, 0, 0, + 86, 83, 66, 97, 115, 105, + 99, 84, 120, 86, 99, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 84, 101, 120, + 67, 111, 111, 114, 100, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 80, 1, 0, 0, 88, 1, + 0, 0, 104, 1, 0, 0, + 88, 1, 0, 0, 113, 1, + 0, 0, 124, 1, 0, 0, + 140, 1, 0, 0, 88, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 14, 0, 1, 0, + 4, 0, 152, 1, 0, 0, + 4, 0, 0, 0, 255, 255, + 255, 255, 12, 0, 255, 255, + 7, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 7, 0, + 8, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 12, 0, 0, 0, 10, 0, + 11, 0, 255, 255, 255, 255, + 13, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 13, 0, + 14, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 15, 0, 0, 0, 8, 0, + 9, 0, 255, 255, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 67, 111, 108, 111, 114, + 0, 171, 32, 2, 0, 0, + 88, 1, 0, 0, 113, 1, + 0, 0, 124, 1, 0, 0, + 41, 2, 0, 0, 88, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 10, 0, 1, 0, + 3, 0, 48, 2, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 255, 255, 255, 255, + 3, 0, 0, 0, 6, 0, + 7, 0, 8, 0, 9, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 129, 2, 0, 0, + 88, 1, 0, 0, 80, 1, + 0, 0, 88, 1, 0, 0, + 104, 1, 0, 0, 136, 2, + 0, 0, 152, 2, 0, 0, + 164, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 180, 2, + 0, 0, 9, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 10, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 11, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 0, 0, 0, 0, + 68, 1, 0, 0, 184, 1, + 0, 0, 7, 0, 0, 0, + 200, 1, 0, 0, 68, 1, + 0, 0, 28, 2, 0, 0, + 72, 2, 0, 0, 3, 0, + 0, 0, 88, 2, 0, 0, + 0, 0, 0, 0, 124, 2, + 0, 0, 212, 2, 0, 0, + 3, 0, 0, 0, 228, 2, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 7, 0, + 15, 160, 0, 0, 0, 0, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 5, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 2, 0, + 228, 160, 11, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 0, 128, 7, 0, 0, 160, + 10, 0, 0, 3, 1, 0, + 8, 224, 0, 0, 0, 128, + 7, 0, 85, 160, 5, 0, + 0, 3, 0, 0, 15, 224, + 2, 0, 228, 144, 1, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 6, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 1, 0, 7, 224, + 7, 0, 0, 160, 1, 0, + 0, 2, 2, 0, 3, 224, + 1, 0, 228, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 104, 1, 0, 0, 64, 0, + 1, 0, 90, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 56, 0, 0, 8, + 242, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 54, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 50, 32, 16, 0, 2, 0, + 0, 0, 70, 16, 16, 0, + 1, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 108, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 3, 3, + 0, 0, 101, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 15, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 67, + 79, 76, 79, 82, 0, 171, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 110, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxVc.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..183940654fa1bfc10ab80ba76013dec08898efc8 GIT binary patch literal 65024 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 + dcl_texcoord1 v1 // vin<4,5> + dcl_texcoord2 v2 // vin<6,7,8,9> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c4 // ::VSBasicTxVcNoFog<8> + +#line 147 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0, v2, c1 // ::VSBasicTxVcNoFog<0,1,2,3> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 // ::vout<0> + dp4 r0.y, v0, c3 // ::vout<1> + dp4 r0.z, v0, c5 // ::vout<3> + +#line 139 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicTxVcNoFog<6,7> + mov oPos.w, r0.z // ::VSBasicTxVcNoFog<9> + +#line 146 + mov oT1.xy, v1 // ::VSBasicTxVcNoFog<4,5> + +// approximately 8 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xy +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xy +dcl_output_siv o2.xyzw, position +mul o0.xyzw, v2.xyzw, cb0[0].xyzw +mov o1.xy, v1.xyxx +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicTxVcNoFog[] = +{ + 68, 88, 66, 67, 42, 91, + 90, 219, 83, 241, 224, 245, + 249, 57, 243, 195, 237, 152, + 218, 159, 1, 0, 0, 0, + 100, 6, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 88, 4, 0, 0, 124, 5, + 0, 0, 240, 5, 0, 0, + 65, 111, 110, 57, 32, 4, + 0, 0, 32, 4, 0, 0, + 0, 2, 254, 255, 224, 3, + 0, 0, 64, 0, 0, 0, + 2, 0, 36, 0, 0, 0, + 60, 0, 0, 0, 60, 0, + 0, 0, 36, 0, 1, 0, + 60, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 205, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 8, 3, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 11, 0, 0, 0, + 196, 0, 0, 0, 3, 0, + 0, 0, 204, 2, 0, 0, + 28, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 112, 0, 0, 0, 0, 0, + 255, 255, 60, 3, 0, 0, + 0, 0, 255, 255, 72, 3, + 0, 0, 0, 0, 255, 255, + 84, 3, 0, 0, 49, 0, + 0, 0, 96, 3, 0, 0, + 147, 0, 1, 0, 112, 3, + 0, 0, 49, 0, 0, 0, + 128, 3, 0, 0, 49, 0, + 0, 0, 144, 3, 0, 0, + 49, 0, 0, 0, 160, 3, + 0, 0, 139, 0, 1, 0, + 176, 3, 0, 0, 139, 0, + 1, 0, 196, 3, 0, 0, + 146, 0, 1, 0, 208, 3, + 0, 0, 86, 83, 66, 97, + 115, 105, 99, 84, 120, 86, + 99, 78, 111, 70, 111, 103, + 0, 68, 105, 102, 102, 117, + 115, 101, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 84, 101, + 120, 67, 111, 111, 114, 100, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 80, 83, + 0, 171, 45, 1, 0, 0, + 56, 1, 0, 0, 72, 1, + 0, 0, 84, 1, 0, 0, + 100, 1, 0, 0, 56, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 10, 0, 1, 0, + 3, 0, 112, 1, 0, 0, + 3, 0, 0, 0, 255, 255, + 255, 255, 8, 0, 255, 255, + 4, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 8, 0, 0, 0, 6, 0, + 7, 0, 255, 255, 255, 255, + 9, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 9, 0, + 10, 0, 0, 0, 4, 0, + 5, 0, 255, 255, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 67, 111, 108, 111, 114, + 0, 171, 216, 1, 0, 0, + 56, 1, 0, 0, 72, 1, + 0, 0, 84, 1, 0, 0, + 225, 1, 0, 0, 56, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 10, 0, 1, 0, + 3, 0, 232, 1, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 1, 0, 0, 0, 4, 0, + 5, 0, 255, 255, 255, 255, + 2, 0, 0, 0, 6, 0, + 7, 0, 8, 0, 9, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 57, 2, 0, 0, + 56, 1, 0, 0, 45, 1, + 0, 0, 56, 1, 0, 0, + 64, 2, 0, 0, 76, 2, + 0, 0, 92, 2, 0, 0, + 104, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 120, 2, + 0, 0, 5, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 6, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 7, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 0, 0, 0, 0, + 28, 1, 0, 0, 136, 1, + 0, 0, 5, 0, 0, 0, + 152, 1, 0, 0, 28, 1, + 0, 0, 212, 1, 0, 0, + 0, 2, 0, 0, 3, 0, + 0, 0, 16, 2, 0, 0, + 0, 0, 0, 0, 52, 2, + 0, 0, 152, 2, 0, 0, + 3, 0, 0, 0, 168, 2, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 4, 0, 228, 160, 5, 0, + 0, 3, 0, 0, 15, 224, + 2, 0, 228, 144, 1, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 2, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 5, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 1, 0, 3, 224, + 1, 0, 228, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 28, 1, 0, 0, 64, 0, + 1, 0, 71, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 1, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 56, 0, 0, 8, + 242, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 50, 32, 16, 0, + 1, 0, 0, 0, 70, 16, + 16, 0, 1, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 3, 3, 0, 0, 101, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 15, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 67, 79, 76, 79, 82, + 0, 171, 79, 83, 71, 78, + 108, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 86, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 3, 12, 0, 0, + 95, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxVcNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicTxVcNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..53c768955314f6f0746f468772d4309d1199d967 GIT binary patch literal 65024 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 + dcl_texcoord1 v1 // vin<4,5,6,7> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c5 // ::VSBasicVc<10> + +#line 14 + dp4 r0.x, v0, c2 + max r0.x, r0.x, c7.x + min oT1.w, r0.x, c7.y // ::VSBasicVc<7> + +#line 75 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0, v1, c1 // ::VSBasicVc<0,1,2,3> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c3 // ::vout<0> + dp4 r0.y, v0, c4 // ::vout<1> + dp4 r0.z, v0, c6 // ::vout<3> + +#line 68 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVc<8,9> + mov oPos.w, r0.z // ::VSBasicVc<11> + +#line 51 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mov oT1.xyz, c7.x // ::VSBasicVc<4,5,6> + +// approximately 11 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +mul o0.xyzw, v1.xyzw, cb0[0].xyzw +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o1.xyz, l(0,0,0,0) +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVc[] = +{ + 68, 88, 66, 67, 159, 202, + 195, 27, 79, 36, 98, 126, + 77, 63, 5, 194, 69, 201, + 147, 49, 1, 0, 0, 0, + 140, 6, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 136, 4, 0, 0, 204, 5, + 0, 0, 32, 6, 0, 0, + 65, 111, 110, 57, 80, 4, + 0, 0, 80, 4, 0, 0, + 0, 2, 254, 255, 4, 4, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 1, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 4, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 199, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 240, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 14, 0, 0, 0, + 196, 0, 0, 0, 3, 0, + 0, 0, 180, 2, 0, 0, + 52, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 112, 0, 0, 0, 0, 0, + 255, 255, 36, 3, 0, 0, + 0, 0, 255, 255, 60, 3, + 0, 0, 0, 0, 255, 255, + 72, 3, 0, 0, 49, 0, + 0, 0, 84, 3, 0, 0, + 14, 0, 0, 0, 100, 3, + 0, 0, 14, 0, 0, 0, + 116, 3, 0, 0, 14, 0, + 0, 0, 132, 3, 0, 0, + 75, 0, 1, 0, 148, 3, + 0, 0, 49, 0, 0, 0, + 164, 3, 0, 0, 49, 0, + 0, 0, 180, 3, 0, 0, + 49, 0, 0, 0, 196, 3, + 0, 0, 68, 0, 1, 0, + 212, 3, 0, 0, 68, 0, + 1, 0, 232, 3, 0, 0, + 51, 0, 0, 0, 244, 3, + 0, 0, 86, 83, 66, 97, + 115, 105, 99, 86, 99, 0, + 68, 105, 102, 102, 117, 115, + 101, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 80, + 111, 115, 105, 116, 105, 111, + 110, 80, 83, 0, 62, 1, + 0, 0, 72, 1, 0, 0, + 88, 1, 0, 0, 72, 1, + 0, 0, 97, 1, 0, 0, + 72, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 3, 0, 108, 1, + 0, 0, 3, 0, 0, 0, + 255, 255, 255, 255, 10, 0, + 255, 255, 6, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 7, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 11, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 12, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 11, 0, 13, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 67, 111, 108, + 111, 114, 0, 171, 224, 1, + 0, 0, 72, 1, 0, 0, + 233, 1, 0, 0, 72, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 8, 0, 1, 0, + 2, 0, 240, 1, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 7, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 45, 2, 0, 0, + 72, 1, 0, 0, 62, 1, + 0, 0, 72, 1, 0, 0, + 88, 1, 0, 0, 52, 2, + 0, 0, 68, 2, 0, 0, + 80, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 96, 2, + 0, 0, 8, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 9, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 10, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 0, 0, 0, 0, + 52, 1, 0, 0, 132, 1, + 0, 0, 6, 0, 0, 0, + 148, 1, 0, 0, 52, 1, + 0, 0, 220, 1, 0, 0, + 0, 2, 0, 0, 2, 0, + 0, 0, 16, 2, 0, 0, + 0, 0, 0, 0, 40, 2, + 0, 0, 128, 2, 0, 0, + 3, 0, 0, 0, 144, 2, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 7, 0, + 15, 160, 0, 0, 0, 0, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 5, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 2, 0, + 228, 160, 11, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 0, 128, 7, 0, 0, 160, + 10, 0, 0, 3, 1, 0, + 8, 224, 0, 0, 0, 128, + 7, 0, 85, 160, 5, 0, + 0, 3, 0, 0, 15, 224, + 1, 0, 228, 144, 1, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 4, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 6, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 1, 0, 7, 224, + 7, 0, 0, 160, 255, 255, + 0, 0, 83, 72, 68, 82, + 60, 1, 0, 0, 64, 0, + 1, 0, 79, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 56, 0, 0, 8, + 242, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 1, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 54, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 76, 0, 0, 0, 2, 0, + 0, 0, 8, 0, 0, 0, + 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 15, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 67, 79, 76, 79, 82, 0, + 171, 171, 79, 83, 71, 78, + 100, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 80, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 86, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVc.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..089c4247f23fc364e1e65f91123b54eff5c1bbe7 GIT binary patch literal 65024 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVcNoFog.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVcNoFog.inc new file mode 100644 index 0000000..7236379 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVcNoFog.inc @@ -0,0 +1,312 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// COLOR 0 xyzw 1 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// SV_Position 0 xyzw 1 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c2 cb0 22 4 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6,7> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 oPos.z, v0, c4 // ::VSBasicVcNoFog<6> + +#line 89 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0, v1, c1 // ::VSBasicVcNoFog<0,1,2,3> + +#line 49 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c2 // ::vout<0> + dp4 r0.y, v0, c3 // ::vout<1> + dp4 r0.z, v0, c5 // ::vout<3> + +#line 82 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVcNoFog<4,5> + mov oPos.w, r0.z // ::VSBasicVcNoFog<7> + +// approximately 7 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyzw +dcl_output o0.xyzw +dcl_output_siv o1.xyzw, position +mul o0.xyzw, v1.xyzw, cb0[0].xyzw +dp4 o1.x, v0.xyzw, cb0[22].xyzw +dp4 o1.y, v0.xyzw, cb0[23].xyzw +dp4 o1.z, v0.xyzw, cb0[24].xyzw +dp4 o1.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVcNoFog[] = +{ + 68, 88, 66, 67, 163, 112, + 185, 31, 9, 2, 197, 31, + 153, 9, 141, 132, 98, 44, + 242, 35, 1, 0, 0, 0, + 136, 5, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 232, 3, 0, 0, 224, 4, + 0, 0, 52, 5, 0, 0, + 65, 111, 110, 57, 176, 3, + 0, 0, 176, 3, 0, 0, + 0, 2, 254, 255, 112, 3, + 0, 0, 64, 0, 0, 0, + 2, 0, 36, 0, 0, 0, + 60, 0, 0, 0, 60, 0, + 0, 0, 36, 0, 1, 0, + 60, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 22, 0, + 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 183, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 176, 2, + 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 188, 0, + 0, 0, 9, 0, 0, 0, + 196, 0, 0, 0, 3, 0, + 0, 0, 116, 2, 0, 0, + 12, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 66, + 97, 115, 105, 99, 69, 102, + 102, 101, 99, 116, 46, 102, + 120, 0, 40, 0, 0, 0, + 112, 0, 0, 0, 0, 0, + 255, 255, 228, 2, 0, 0, + 0, 0, 255, 255, 240, 2, + 0, 0, 49, 0, 0, 0, + 252, 2, 0, 0, 89, 0, + 1, 0, 12, 3, 0, 0, + 49, 0, 0, 0, 28, 3, + 0, 0, 49, 0, 0, 0, + 44, 3, 0, 0, 49, 0, + 0, 0, 60, 3, 0, 0, + 82, 0, 1, 0, 76, 3, + 0, 0, 82, 0, 1, 0, + 96, 3, 0, 0, 86, 83, + 66, 97, 115, 105, 99, 86, + 99, 78, 111, 70, 111, 103, + 0, 68, 105, 102, 102, 117, + 115, 101, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 80, 83, + 0, 171, 27, 1, 0, 0, + 36, 1, 0, 0, 52, 1, + 0, 0, 36, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 8, 0, 1, 0, 2, 0, + 64, 1, 0, 0, 2, 0, + 0, 0, 255, 255, 255, 255, + 6, 0, 255, 255, 3, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 7, 0, + 0, 0, 4, 0, 5, 0, + 255, 255, 255, 255, 8, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 67, + 111, 108, 111, 114, 0, 171, + 148, 1, 0, 0, 36, 1, + 0, 0, 157, 1, 0, 0, + 36, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 8, 0, + 1, 0, 2, 0, 164, 1, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 1, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 225, 1, + 0, 0, 36, 1, 0, 0, + 27, 1, 0, 0, 36, 1, + 0, 0, 232, 1, 0, 0, + 244, 1, 0, 0, 4, 2, + 0, 0, 16, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 32, 2, 0, 0, 4, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 5, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 6, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 0, 0, + 0, 0, 12, 1, 0, 0, + 80, 1, 0, 0, 4, 0, + 0, 0, 96, 1, 0, 0, + 12, 1, 0, 0, 144, 1, + 0, 0, 180, 1, 0, 0, + 2, 0, 0, 0, 196, 1, + 0, 0, 0, 0, 0, 0, + 220, 1, 0, 0, 64, 2, + 0, 0, 3, 0, 0, 0, + 80, 2, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 4, 0, 228, 160, + 5, 0, 0, 3, 0, 0, + 15, 224, 1, 0, 228, 144, + 1, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 2, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 5, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 255, 255, 0, 0, 83, 72, + 68, 82, 240, 0, 0, 0, + 64, 0, 1, 0, 60, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 8, 242, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 1, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 76, 0, + 0, 0, 2, 0, 0, 0, + 8, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 68, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 15, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 67, 79, + 76, 79, 82, 0, 171, 171, + 79, 83, 71, 78, 76, 0, + 0, 0, 2, 0, 0, 0, + 8, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 62, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVcNoFog.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVcNoFog.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ea6ef883ddd0c675d11e451de4d6ae6d75db8263 GIT binary patch literal 65024 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 MKum#{0wEOme+T;38UO$Q literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLighting.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLighting.inc new file mode 100644 index 0000000..061f43d --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLighting.inc @@ -0,0 +1,993 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// SV_Position 0 xyzw 2 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 13 ( FLT, FLT, FLT, FLT) +// c14 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c18 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c25, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r0.x, v1, c18 + dp3 r0.y, v1, c19 + dp3 r0.z, v1, c20 + nrm r1.xyz, r0 // ::worldNormal<0,1,2> + +#line 36 + dp3 r0.x, -c4, r1 // ::dotL<0> + dp3 r0.y, -c5, r1 // ::dotL<1> + dp3 r0.z, -c6, r1 // ::dotL<2> + +#line 39 + sge r2.xyz, r0, c25.x // ::zeroL<0,1,2> + mul r3.xyz, r0, r2 // ::diffuse<0,1,2> + +#line 46 + mul r4.xyz, r3.y, c8 + mad r3.xyw, r3.x, c7.xyzz, r4.xyzz + mad r3.xyz, r3.z, c9, r3.xyww + mov r4.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad oT0.xyz, r3, r4, c2 // ::VSBasicVertexLighting<0,1,2> + +#line 57 + dp4 r3.x, v0, c15 // ::pos_ws<0> + dp4 r3.y, v0, c16 // ::pos_ws<1> + dp4 r3.z, v0, c17 // ::pos_ws<2> + add r3.xyz, -r3, c13 + nrm r4.xyz, r3 // ::eyeVector<0,1,2> + +#line 33 + add r3.xyz, r4, -c4 + nrm r5.xyz, r3 // ::halfVectors<0,1,2> + +#line 37 + dp3 r3.x, r5, r1 // ::dotH<0> + +#line 33 + add r5.xyz, r4, -c5 + add r4.xyz, r4, -c6 + nrm r6.xyz, r4 // ::halfVectors<6,7,8> + +#line 37 + dp3 r3.z, r6, r1 // ::dotH<2> + +#line 33 + nrm r4.xyz, r5 // ::halfVectors<3,4,5> + +#line 37 + dp3 r3.y, r4, r1 // ::dotH<1> + +#line 42 + max r1.xyz, r3, c25.x + mul r1.xyz, r2, r1 + log r2.x, r1.x + log r2.y, r1.y + log r2.z, r1.z + mul r1.xyz, r2, c3.w + exp r2.x, r1.x + exp r2.y, r1.y + exp r2.z, r1.z + mul r0.xyz, r0, r2 // ::specular<0,1,2> + +#line 47 + mul r1.xyz, r0.y, c11 + mad r0.xyw, r0.x, c10.xyzz, r1.xyzz + mad r0.xyz, r0.z, c12, r0.xyww + mul oT1.xyz, r0, c3 // ::VSBasicVertexLighting<4,5,6> + +#line 63 + dp4 oPos.z, v0, c23 // ::VSBasicVertexLighting<10> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c14 + max r0.x, r0.x, c25.x + min oT1.w, r0.x, c25.y // ::VSBasicVertexLighting<7> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c21 // ::vout<0> + dp4 r0.y, v0, c22 // ::vout<1> + dp4 r0.z, v0, c24 // ::vout<3> + +#line 154 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVertexLighting<8,9> + mov oPos.w, r0.z // ::VSBasicVertexLighting<11> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mov oT0.w, c1.w // ::VSBasicVertexLighting<3> + +// approximately 62 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +dcl_temps 6 +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r1.x, -cb0[3].xyzx, r0.xyzx +dp3 r1.y, -cb0[4].xyzx, r0.xyzx +dp3 r1.z, -cb0[5].xyzx, r0.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r3.xyz, r1.xyzx, r2.xyzx +mul r4.xyz, r3.yyyy, cb0[7].xyzx +mad r3.xyw, r3.xxxx, cb0[6].xyxz, r4.xyxz +mad r3.xyz, r3.zzzz, cb0[8].xyzx, r3.xywx +mad o0.xyz, r3.xyzx, cb0[0].xyzx, cb0[1].xyzx +mov o0.w, cb0[0].w +dp4 r3.x, v0.xyzw, cb0[15].xyzw +dp4 r3.y, v0.xyzw, cb0[16].xyzw +dp4 r3.z, v0.xyzw, cb0[17].xyzw +add r3.xyz, -r3.xyzx, cb0[12].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mad r4.xyz, r3.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r4.xyzx, r4.xyzx +rsq r1.w, r1.w +mul r4.xyz, r1.wwww, r4.xyzx +dp3 r4.x, r4.xyzx, r0.xyzx +mad r5.xyz, r3.xyzx, r0.wwww, -cb0[4].xyzx +mad r3.xyz, r3.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r5.xyzx, r5.xyzx +rsq r0.w, r0.w +mul r5.xyz, r0.wwww, r5.xyzx +dp3 r4.y, r5.xyzx, r0.xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r4.z, r3.xyzx, r0.xyzx +max r0.xyz, r4.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +mul r0.xyz, r2.xyzx, r0.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVertexLighting[] = +{ + 68, 88, 66, 67, 27, 190, + 76, 10, 142, 103, 75, 138, + 168, 104, 159, 220, 220, 207, + 38, 53, 1, 0, 0, 0, + 136, 18, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 220, 10, 0, 0, 200, 17, + 0, 0, 28, 18, 0, 0, + 65, 111, 110, 57, 164, 10, + 0, 0, 164, 10, 0, 0, + 0, 2, 254, 255, 88, 10, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 13, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 191, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 208, 6, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 55, 0, 0, 0, + 20, 1, 0, 0, 13, 0, + 0, 0, 204, 5, 0, 0, + 0, 3, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 4, 7, + 0, 0, 0, 0, 255, 255, + 28, 7, 0, 0, 0, 0, + 255, 255, 40, 7, 0, 0, + 59, 0, 0, 0, 52, 7, + 0, 0, 59, 0, 0, 0, + 68, 7, 0, 0, 59, 0, + 0, 0, 84, 7, 0, 0, + 59, 0, 0, 0, 100, 7, + 0, 0, 36, 0, 0, 0, + 112, 7, 0, 0, 36, 0, + 0, 0, 128, 7, 0, 0, + 36, 0, 0, 0, 144, 7, + 0, 0, 39, 0, 0, 0, + 160, 7, 0, 0, 41, 0, + 0, 0, 176, 7, 0, 0, + 46, 0, 0, 0, 192, 7, + 0, 0, 46, 0, 0, 0, + 208, 7, 0, 0, 46, 0, + 0, 0, 228, 7, 0, 0, + 46, 0, 0, 0, 248, 7, + 0, 0, 46, 0, 0, 0, + 4, 8, 0, 0, 57, 0, + 0, 0, 24, 8, 0, 0, + 57, 0, 0, 0, 40, 8, + 0, 0, 57, 0, 0, 0, + 56, 8, 0, 0, 58, 0, + 0, 0, 72, 8, 0, 0, + 58, 0, 0, 0, 88, 8, + 0, 0, 33, 0, 0, 0, + 100, 8, 0, 0, 33, 0, + 0, 0, 116, 8, 0, 0, + 37, 0, 0, 0, 128, 8, + 0, 0, 33, 0, 0, 0, + 144, 8, 0, 0, 33, 0, + 0, 0, 160, 8, 0, 0, + 33, 0, 0, 0, 176, 8, + 0, 0, 37, 0, 0, 0, + 188, 8, 0, 0, 33, 0, + 0, 0, 204, 8, 0, 0, + 37, 0, 0, 0, 216, 8, + 0, 0, 42, 0, 0, 0, + 232, 8, 0, 0, 42, 0, + 0, 0, 248, 8, 0, 0, + 42, 0, 0, 0, 8, 9, + 0, 0, 42, 0, 0, 0, + 20, 9, 0, 0, 42, 0, + 0, 0, 32, 9, 0, 0, + 42, 0, 0, 0, 44, 9, + 0, 0, 42, 0, 0, 0, + 60, 9, 0, 0, 42, 0, + 0, 0, 72, 9, 0, 0, + 42, 0, 0, 0, 84, 9, + 0, 0, 42, 0, 0, 0, + 96, 9, 0, 0, 47, 0, + 0, 0, 112, 9, 0, 0, + 47, 0, 0, 0, 128, 9, + 0, 0, 47, 0, 0, 0, + 148, 9, 0, 0, 47, 0, + 0, 0, 168, 9, 0, 0, + 63, 0, 0, 0, 184, 9, + 0, 0, 14, 0, 1, 0, + 200, 9, 0, 0, 14, 0, + 1, 0, 216, 9, 0, 0, + 14, 0, 1, 0, 232, 9, + 0, 0, 63, 0, 0, 0, + 248, 9, 0, 0, 63, 0, + 0, 0, 8, 10, 0, 0, + 63, 0, 0, 0, 24, 10, + 0, 0, 154, 0, 2, 0, + 40, 10, 0, 0, 154, 0, + 2, 0, 60, 10, 0, 0, + 46, 0, 0, 0, 72, 10, + 0, 0, 80, 97, 114, 97, + 109, 101, 116, 101, 114, 115, + 0, 68, 105, 102, 102, 117, + 115, 101, 67, 111, 108, 111, + 114, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 86, 83, 66, 97, 115, 105, + 99, 86, 101, 114, 116, 101, + 120, 76, 105, 103, 104, 116, + 105, 110, 103, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 80, 111, 115, + 105, 116, 105, 111, 110, 80, + 83, 0, 22, 3, 0, 0, + 32, 3, 0, 0, 48, 3, + 0, 0, 32, 3, 0, 0, + 57, 3, 0, 0, 32, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 3, 0, 68, 3, 0, 0, + 16, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 44, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 45, 0, 0, 0, 255, 255, + 255, 255, 10, 0, 255, 255, + 48, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 7, 0, + 52, 0, 0, 0, 8, 0, + 9, 0, 255, 255, 255, 255, + 53, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 11, 0, + 54, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 3, 0, + 100, 105, 102, 102, 117, 115, + 101, 0, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 100, 111, 116, 72, 0, 171, + 171, 171, 24, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 28, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 30, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 100, 111, 116, 76, + 0, 171, 171, 171, 7, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 8, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 9, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 101, 121, + 101, 86, 101, 99, 116, 111, + 114, 0, 171, 171, 21, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 104, 97, + 108, 102, 86, 101, 99, 116, + 111, 114, 115, 0, 3, 0, + 3, 0, 3, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 27, 0, 0, 0, + 6, 0, 7, 0, 8, 0, + 255, 255, 29, 0, 0, 0, + 3, 0, 4, 0, 5, 0, + 255, 255, 112, 111, 115, 95, + 119, 115, 0, 171, 17, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 18, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 19, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 115, 112, + 101, 99, 117, 108, 97, 114, + 0, 171, 171, 171, 40, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 78, + 111, 114, 109, 97, 108, 0, + 220, 4, 0, 0, 32, 3, + 0, 0, 229, 4, 0, 0, + 200, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 7, 0, + 1, 0, 2, 0, 236, 4, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 70, 111, 103, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 41, 5, 0, 0, 32, 3, + 0, 0, 22, 3, 0, 0, + 32, 3, 0, 0, 48, 3, + 0, 0, 200, 3, 0, 0, + 48, 5, 0, 0, 60, 5, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 4, 0, 76, 5, 0, 0, + 49, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 50, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 51, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 97, 108, 0, + 6, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 122, 101, 114, 111, 76, 0, + 171, 171, 10, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 204, 2, 0, 0, + 215, 2, 0, 0, 228, 2, + 0, 0, 1, 0, 0, 0, + 244, 2, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, + 92, 3, 0, 0, 7, 0, + 0, 0, 108, 3, 0, 0, + 0, 0, 0, 0, 192, 3, + 0, 0, 200, 3, 0, 0, + 1, 0, 0, 0, 216, 3, + 0, 0, 0, 0, 0, 0, + 228, 3, 0, 0, 200, 3, + 0, 0, 3, 0, 0, 0, + 236, 3, 0, 0, 0, 0, + 0, 0, 16, 4, 0, 0, + 200, 3, 0, 0, 3, 0, + 0, 0, 24, 4, 0, 0, + 0, 0, 0, 0, 60, 4, + 0, 0, 200, 3, 0, 0, + 1, 0, 0, 0, 72, 4, + 0, 0, 0, 0, 0, 0, + 84, 4, 0, 0, 96, 4, + 0, 0, 3, 0, 0, 0, + 112, 4, 0, 0, 0, 0, + 0, 0, 148, 4, 0, 0, + 32, 3, 0, 0, 3, 0, + 0, 0, 156, 4, 0, 0, + 0, 0, 0, 0, 192, 4, + 0, 0, 200, 3, 0, 0, + 1, 0, 0, 0, 204, 4, + 0, 0, 0, 3, 0, 0, + 216, 4, 0, 0, 252, 4, + 0, 0, 2, 0, 0, 0, + 12, 5, 0, 0, 0, 0, + 0, 0, 36, 5, 0, 0, + 108, 5, 0, 0, 3, 0, + 0, 0, 124, 5, 0, 0, + 0, 0, 0, 0, 160, 5, + 0, 0, 200, 3, 0, 0, + 1, 0, 0, 0, 172, 5, + 0, 0, 0, 0, 0, 0, + 184, 5, 0, 0, 200, 3, + 0, 0, 1, 0, 0, 0, + 192, 5, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 25, 0, 15, 160, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 144, 18, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 2, 128, 1, 0, 228, 144, + 19, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 4, 128, + 1, 0, 228, 144, 20, 0, + 228, 160, 36, 0, 0, 2, + 1, 0, 7, 128, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 4, 0, + 228, 161, 1, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 2, 128, 5, 0, 228, 161, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 4, 128, + 6, 0, 228, 161, 1, 0, + 228, 128, 13, 0, 0, 3, + 2, 0, 7, 128, 0, 0, + 228, 128, 25, 0, 0, 160, + 5, 0, 0, 3, 3, 0, + 7, 128, 0, 0, 228, 128, + 2, 0, 228, 128, 5, 0, + 0, 3, 4, 0, 7, 128, + 3, 0, 85, 128, 8, 0, + 228, 160, 4, 0, 0, 4, + 3, 0, 11, 128, 3, 0, + 0, 128, 7, 0, 164, 160, + 4, 0, 164, 128, 4, 0, + 0, 4, 3, 0, 7, 128, + 3, 0, 170, 128, 9, 0, + 228, 160, 3, 0, 244, 128, + 1, 0, 0, 2, 4, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 7, 224, 3, 0, 228, 128, + 4, 0, 228, 128, 2, 0, + 228, 160, 9, 0, 0, 3, + 3, 0, 1, 128, 0, 0, + 228, 144, 15, 0, 228, 160, + 9, 0, 0, 3, 3, 0, + 2, 128, 0, 0, 228, 144, + 16, 0, 228, 160, 9, 0, + 0, 3, 3, 0, 4, 128, + 0, 0, 228, 144, 17, 0, + 228, 160, 2, 0, 0, 3, + 3, 0, 7, 128, 3, 0, + 228, 129, 13, 0, 228, 160, + 36, 0, 0, 2, 4, 0, + 7, 128, 3, 0, 228, 128, + 2, 0, 0, 3, 3, 0, + 7, 128, 4, 0, 228, 128, + 4, 0, 228, 161, 36, 0, + 0, 2, 5, 0, 7, 128, + 3, 0, 228, 128, 8, 0, + 0, 3, 3, 0, 1, 128, + 5, 0, 228, 128, 1, 0, + 228, 128, 2, 0, 0, 3, + 5, 0, 7, 128, 4, 0, + 228, 128, 5, 0, 228, 161, + 2, 0, 0, 3, 4, 0, + 7, 128, 4, 0, 228, 128, + 6, 0, 228, 161, 36, 0, + 0, 2, 6, 0, 7, 128, + 4, 0, 228, 128, 8, 0, + 0, 3, 3, 0, 4, 128, + 6, 0, 228, 128, 1, 0, + 228, 128, 36, 0, 0, 2, + 4, 0, 7, 128, 5, 0, + 228, 128, 8, 0, 0, 3, + 3, 0, 2, 128, 4, 0, + 228, 128, 1, 0, 228, 128, + 11, 0, 0, 3, 1, 0, + 7, 128, 3, 0, 228, 128, + 25, 0, 0, 160, 5, 0, + 0, 3, 1, 0, 7, 128, + 2, 0, 228, 128, 1, 0, + 228, 128, 15, 0, 0, 2, + 2, 0, 1, 128, 1, 0, + 0, 128, 15, 0, 0, 2, + 2, 0, 2, 128, 1, 0, + 85, 128, 15, 0, 0, 2, + 2, 0, 4, 128, 1, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 2, 0, + 228, 128, 3, 0, 255, 160, + 14, 0, 0, 2, 2, 0, + 1, 128, 1, 0, 0, 128, + 14, 0, 0, 2, 2, 0, + 2, 128, 1, 0, 85, 128, + 14, 0, 0, 2, 2, 0, + 4, 128, 1, 0, 170, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 228, 128, + 2, 0, 228, 128, 5, 0, + 0, 3, 1, 0, 7, 128, + 0, 0, 85, 128, 11, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 11, 128, 0, 0, + 0, 128, 10, 0, 164, 160, + 1, 0, 164, 128, 4, 0, + 0, 4, 0, 0, 7, 128, + 0, 0, 170, 128, 12, 0, + 228, 160, 0, 0, 244, 128, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 23, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 14, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 25, 0, 0, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 25, 0, + 85, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 21, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 22, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 24, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 8, 224, + 1, 0, 255, 160, 255, 255, + 0, 0, 83, 72, 68, 82, + 228, 6, 0, 0, 64, 0, + 1, 0, 185, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 6, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 66, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 29, 0, 0, 10, + 114, 0, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 10, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 4, 0, + 0, 0, 86, 5, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 50, 0, + 0, 10, 178, 0, 16, 0, + 3, 0, 0, 0, 6, 0, + 16, 0, 3, 0, 0, 0, + 70, 136, 32, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 70, 8, 16, 0, 4, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 3, 0, + 0, 0, 166, 10, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 70, 3, + 16, 0, 3, 0, 0, 0, + 50, 0, 0, 11, 114, 32, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 6, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 0, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 17, 0, + 0, 8, 34, 0, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 17, 0, 0, 8, 66, 0, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 0, 0, 0, 9, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 4, 0, 0, 0, 246, 15, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 5, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 16, 0, 0, 7, + 34, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 66, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 52, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 47, 0, + 0, 5, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 246, 143, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 25, 0, 0, 5, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 1, 0, + 0, 0, 86, 5, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 50, 0, + 0, 10, 178, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 136, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 70, 8, 16, 0, 1, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 166, 10, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 70, 3, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 76, 0, 0, 0, + 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 171, 79, 83, + 71, 78, 100, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 80, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 0, + 0, 0, 67, 79, 76, 79, + 82, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLighting.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLighting.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d6ecc2edeccebc4a512914a0e7ba177413a6acb4 GIT binary patch literal 67072 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 + dcl_texcoord1 v1 // vin<4,5,6> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c25.x, c25.y // ::BiasX2<0,1,2> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r1.x, r0, c18 + dp3 r1.y, r0, c19 + dp3 r1.z, r0, c20 + nrm r0.xyz, r1 // ::worldNormal<0,1,2> + +#line 36 + dp3 r1.x, -c4, r0 // ::dotL<0> + dp3 r1.y, -c5, r0 // ::dotL<1> + dp3 r1.z, -c6, r0 // ::dotL<2> + +#line 39 + sge r2.xyz, r1, c25.z // ::zeroL<0,1,2> + mul r3.xyz, r1, r2 // ::diffuse<0,1,2> + +#line 46 + mul r4.xyz, r3.y, c8 + mad r3.xyw, r3.x, c7.xyzz, r4.xyzz + mad r3.xyz, r3.z, c9, r3.xyww + mov r4.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad oT0.xyz, r3, r4, c2 // ::VSBasicVertexLightingBn<0,1,2> + +#line 57 + dp4 r3.x, v0, c15 // ::pos_ws<0> + dp4 r3.y, v0, c16 // ::pos_ws<1> + dp4 r3.z, v0, c17 // ::pos_ws<2> + add r3.xyz, -r3, c13 + nrm r4.xyz, r3 // ::eyeVector<0,1,2> + +#line 33 + add r3.xyz, r4, -c4 + nrm r5.xyz, r3 // ::halfVectors<0,1,2> + +#line 37 + dp3 r3.x, r5, r0 // ::dotH<0> + +#line 33 + add r5.xyz, r4, -c5 + add r4.xyz, r4, -c6 + nrm r6.xyz, r4 // ::halfVectors<6,7,8> + +#line 37 + dp3 r3.z, r6, r0 // ::dotH<2> + +#line 33 + nrm r4.xyz, r5 // ::halfVectors<3,4,5> + +#line 37 + dp3 r3.y, r4, r0 // ::dotH<1> + +#line 42 + max r0.xyz, r3, c25.z + mul r0.xyz, r2, r0 + log r2.x, r0.x + log r2.y, r0.y + log r2.z, r0.z + mul r0.xyz, r2, c3.w + exp r2.x, r0.x + exp r2.y, r0.y + exp r2.z, r0.z + mul r0.xyz, r1, r2 // ::specular<0,1,2> + +#line 47 + mul r1.xyz, r0.y, c11 + mad r0.xyw, r0.x, c10.xyzz, r1.xyzz + mad r0.xyz, r0.z, c12, r0.xyww + mul oT1.xyz, r0, c3 // ::VSBasicVertexLightingBn<4,5,6> + +#line 63 + dp4 oPos.z, v0, c23 // ::VSBasicVertexLightingBn<10> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c14 + max r0.x, r0.x, c25.z + min oT1.w, r0.x, c25.w // ::VSBasicVertexLightingBn<7> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c21 // ::vout<0> + dp4 r0.y, v0, c22 // ::vout<1> + dp4 r0.z, v0, c24 // ::vout<3> + +#line 164 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVertexLightingBn<8,9> + mov oPos.w, r0.z // ::VSBasicVertexLightingBn<11> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mov oT0.w, c1.w // ::VSBasicVertexLightingBn<3> + +// approximately 63 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +dcl_temps 6 +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, r1.xyzx +dp3 r1.x, -cb0[3].xyzx, r0.xyzx +dp3 r1.y, -cb0[4].xyzx, r0.xyzx +dp3 r1.z, -cb0[5].xyzx, r0.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r3.xyz, r1.xyzx, r2.xyzx +mul r4.xyz, r3.yyyy, cb0[7].xyzx +mad r3.xyw, r3.xxxx, cb0[6].xyxz, r4.xyxz +mad r3.xyz, r3.zzzz, cb0[8].xyzx, r3.xywx +mad o0.xyz, r3.xyzx, cb0[0].xyzx, cb0[1].xyzx +mov o0.w, cb0[0].w +dp4 r3.x, v0.xyzw, cb0[15].xyzw +dp4 r3.y, v0.xyzw, cb0[16].xyzw +dp4 r3.z, v0.xyzw, cb0[17].xyzw +add r3.xyz, -r3.xyzx, cb0[12].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mad r4.xyz, r3.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r4.xyzx, r4.xyzx +rsq r1.w, r1.w +mul r4.xyz, r1.wwww, r4.xyzx +dp3 r4.x, r4.xyzx, r0.xyzx +mad r5.xyz, r3.xyzx, r0.wwww, -cb0[4].xyzx +mad r3.xyz, r3.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r5.xyzx, r5.xyzx +rsq r0.w, r0.w +mul r5.xyz, r0.wwww, r5.xyzx +dp3 r4.y, r5.xyzx, r0.xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r4.z, r3.xyzx, r0.xyzx +max r0.xyz, r4.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +mul r0.xyz, r2.xyzx, r0.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVertexLightingBn[] = +{ + 68, 88, 66, 67, 85, 142, + 255, 244, 47, 164, 199, 240, + 141, 146, 144, 133, 65, 146, + 136, 213, 1, 0, 0, 0, + 24, 19, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 48, 11, 0, 0, 88, 18, + 0, 0, 172, 18, 0, 0, + 65, 111, 110, 57, 248, 10, + 0, 0, 248, 10, 0, 0, + 0, 2, 254, 255, 172, 10, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 13, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 207, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 16, 7, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 56, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 248, 5, 0, 0, + 44, 3, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 112, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 68, 7, + 0, 0, 0, 0, 255, 255, + 92, 7, 0, 0, 0, 0, + 255, 255, 104, 7, 0, 0, + 32, 0, 0, 0, 116, 7, + 0, 0, 59, 0, 1, 0, + 136, 7, 0, 0, 59, 0, + 1, 0, 152, 7, 0, 0, + 59, 0, 1, 0, 168, 7, + 0, 0, 59, 0, 1, 0, + 184, 7, 0, 0, 36, 0, + 1, 0, 196, 7, 0, 0, + 36, 0, 1, 0, 212, 7, + 0, 0, 36, 0, 1, 0, + 228, 7, 0, 0, 39, 0, + 1, 0, 244, 7, 0, 0, + 41, 0, 1, 0, 4, 8, + 0, 0, 46, 0, 1, 0, + 20, 8, 0, 0, 46, 0, + 1, 0, 36, 8, 0, 0, + 46, 0, 1, 0, 56, 8, + 0, 0, 46, 0, 1, 0, + 76, 8, 0, 0, 46, 0, + 1, 0, 88, 8, 0, 0, + 57, 0, 1, 0, 108, 8, + 0, 0, 57, 0, 1, 0, + 124, 8, 0, 0, 57, 0, + 1, 0, 140, 8, 0, 0, + 58, 0, 1, 0, 156, 8, + 0, 0, 58, 0, 1, 0, + 172, 8, 0, 0, 33, 0, + 1, 0, 184, 8, 0, 0, + 33, 0, 1, 0, 200, 8, + 0, 0, 37, 0, 1, 0, + 212, 8, 0, 0, 33, 0, + 1, 0, 228, 8, 0, 0, + 33, 0, 1, 0, 244, 8, + 0, 0, 33, 0, 1, 0, + 4, 9, 0, 0, 37, 0, + 1, 0, 16, 9, 0, 0, + 33, 0, 1, 0, 32, 9, + 0, 0, 37, 0, 1, 0, + 44, 9, 0, 0, 42, 0, + 1, 0, 60, 9, 0, 0, + 42, 0, 1, 0, 76, 9, + 0, 0, 42, 0, 1, 0, + 92, 9, 0, 0, 42, 0, + 1, 0, 104, 9, 0, 0, + 42, 0, 1, 0, 116, 9, + 0, 0, 42, 0, 1, 0, + 128, 9, 0, 0, 42, 0, + 1, 0, 144, 9, 0, 0, + 42, 0, 1, 0, 156, 9, + 0, 0, 42, 0, 1, 0, + 168, 9, 0, 0, 42, 0, + 1, 0, 180, 9, 0, 0, + 47, 0, 1, 0, 196, 9, + 0, 0, 47, 0, 1, 0, + 212, 9, 0, 0, 47, 0, + 1, 0, 232, 9, 0, 0, + 47, 0, 1, 0, 252, 9, + 0, 0, 63, 0, 1, 0, + 12, 10, 0, 0, 14, 0, + 0, 0, 28, 10, 0, 0, + 14, 0, 0, 0, 44, 10, + 0, 0, 14, 0, 0, 0, + 60, 10, 0, 0, 63, 0, + 1, 0, 76, 10, 0, 0, + 63, 0, 1, 0, 92, 10, + 0, 0, 63, 0, 1, 0, + 108, 10, 0, 0, 164, 0, + 2, 0, 124, 10, 0, 0, + 164, 0, 2, 0, 144, 10, + 0, 0, 46, 0, 1, 0, + 156, 10, 0, 0, 66, 105, + 97, 115, 88, 50, 0, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 80, 97, + 114, 97, 109, 101, 116, 101, + 114, 115, 0, 68, 105, 102, + 102, 117, 115, 101, 67, 111, + 108, 111, 114, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 86, 83, 66, 97, + 115, 105, 99, 86, 101, 114, + 116, 101, 120, 76, 105, 103, + 104, 116, 105, 110, 103, 66, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 80, + 111, 115, 105, 116, 105, 111, + 110, 80, 83, 0, 68, 3, + 0, 0, 76, 3, 0, 0, + 92, 3, 0, 0, 76, 3, + 0, 0, 101, 3, 0, 0, + 76, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 3, 0, 112, 3, + 0, 0, 17, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 45, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 46, 0, 0, 0, + 255, 255, 255, 255, 10, 0, + 255, 255, 49, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 53, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 54, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 11, 0, 55, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 100, 111, 116, 72, + 0, 171, 171, 171, 25, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 29, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 31, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 100, 111, + 116, 76, 0, 171, 171, 171, + 8, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 9, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 10, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 101, 121, 101, 86, 101, 99, + 116, 111, 114, 0, 171, 171, + 22, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 104, 97, 108, 102, 86, 101, + 99, 116, 111, 114, 115, 0, + 3, 0, 3, 0, 3, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 28, 0, + 0, 0, 6, 0, 7, 0, + 8, 0, 255, 255, 30, 0, + 0, 0, 3, 0, 4, 0, + 5, 0, 255, 255, 112, 111, + 115, 95, 119, 115, 0, 171, + 18, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 19, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 20, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 115, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 41, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 78, 111, 114, 109, 97, + 108, 0, 8, 5, 0, 0, + 76, 3, 0, 0, 17, 5, + 0, 0, 244, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 7, 0, 1, 0, 2, 0, + 24, 5, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 118, 111, + 117, 116, 0, 80, 111, 115, + 95, 112, 115, 0, 70, 111, + 103, 70, 97, 99, 116, 111, + 114, 0, 171, 171, 0, 0, + 3, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 85, 5, 0, 0, + 76, 3, 0, 0, 68, 3, + 0, 0, 76, 3, 0, 0, + 92, 3, 0, 0, 244, 3, + 0, 0, 92, 5, 0, 0, + 104, 5, 0, 0, 5, 0, + 0, 0, 1, 0, 12, 0, + 1, 0, 4, 0, 120, 5, + 0, 0, 50, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 51, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 52, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 119, 111, 114, 108, + 100, 78, 111, 114, 109, 97, + 108, 0, 7, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 122, 101, 114, 111, + 76, 0, 171, 171, 11, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 0, 0, + 0, 0, 212, 2, 0, 0, + 220, 2, 0, 0, 1, 0, + 0, 0, 236, 2, 0, 0, + 248, 2, 0, 0, 3, 3, + 0, 0, 16, 3, 0, 0, + 1, 0, 0, 0, 32, 3, + 0, 0, 0, 0, 0, 0, + 44, 3, 0, 0, 136, 3, + 0, 0, 7, 0, 0, 0, + 152, 3, 0, 0, 0, 0, + 0, 0, 236, 3, 0, 0, + 244, 3, 0, 0, 1, 0, + 0, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 16, 4, + 0, 0, 244, 3, 0, 0, + 3, 0, 0, 0, 24, 4, + 0, 0, 0, 0, 0, 0, + 60, 4, 0, 0, 244, 3, + 0, 0, 3, 0, 0, 0, + 68, 4, 0, 0, 0, 0, + 0, 0, 104, 4, 0, 0, + 244, 3, 0, 0, 1, 0, + 0, 0, 116, 4, 0, 0, + 0, 0, 0, 0, 128, 4, + 0, 0, 140, 4, 0, 0, + 3, 0, 0, 0, 156, 4, + 0, 0, 0, 0, 0, 0, + 192, 4, 0, 0, 76, 3, + 0, 0, 3, 0, 0, 0, + 200, 4, 0, 0, 0, 0, + 0, 0, 236, 4, 0, 0, + 244, 3, 0, 0, 1, 0, + 0, 0, 248, 4, 0, 0, + 44, 3, 0, 0, 4, 5, + 0, 0, 40, 5, 0, 0, + 2, 0, 0, 0, 56, 5, + 0, 0, 0, 0, 0, 0, + 80, 5, 0, 0, 152, 5, + 0, 0, 3, 0, 0, 0, + 168, 5, 0, 0, 0, 0, + 0, 0, 204, 5, 0, 0, + 244, 3, 0, 0, 1, 0, + 0, 0, 216, 5, 0, 0, + 0, 0, 0, 0, 228, 5, + 0, 0, 244, 3, 0, 0, + 1, 0, 0, 0, 236, 5, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 25, 0, + 15, 160, 0, 0, 0, 64, + 0, 0, 128, 191, 0, 0, + 0, 0, 0, 0, 128, 63, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 4, 0, 0, 4, 0, 0, + 7, 128, 1, 0, 228, 144, + 25, 0, 0, 160, 25, 0, + 85, 160, 8, 0, 0, 3, + 1, 0, 1, 128, 0, 0, + 228, 128, 18, 0, 228, 160, + 8, 0, 0, 3, 1, 0, + 2, 128, 0, 0, 228, 128, + 19, 0, 228, 160, 8, 0, + 0, 3, 1, 0, 4, 128, + 0, 0, 228, 128, 20, 0, + 228, 160, 36, 0, 0, 2, + 0, 0, 7, 128, 1, 0, + 228, 128, 8, 0, 0, 3, + 1, 0, 1, 128, 4, 0, + 228, 161, 0, 0, 228, 128, + 8, 0, 0, 3, 1, 0, + 2, 128, 5, 0, 228, 161, + 0, 0, 228, 128, 8, 0, + 0, 3, 1, 0, 4, 128, + 6, 0, 228, 161, 0, 0, + 228, 128, 13, 0, 0, 3, + 2, 0, 7, 128, 1, 0, + 228, 128, 25, 0, 170, 160, + 5, 0, 0, 3, 3, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 5, 0, + 0, 3, 4, 0, 7, 128, + 3, 0, 85, 128, 8, 0, + 228, 160, 4, 0, 0, 4, + 3, 0, 11, 128, 3, 0, + 0, 128, 7, 0, 164, 160, + 4, 0, 164, 128, 4, 0, + 0, 4, 3, 0, 7, 128, + 3, 0, 170, 128, 9, 0, + 228, 160, 3, 0, 244, 128, + 1, 0, 0, 2, 4, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 7, 224, 3, 0, 228, 128, + 4, 0, 228, 128, 2, 0, + 228, 160, 9, 0, 0, 3, + 3, 0, 1, 128, 0, 0, + 228, 144, 15, 0, 228, 160, + 9, 0, 0, 3, 3, 0, + 2, 128, 0, 0, 228, 144, + 16, 0, 228, 160, 9, 0, + 0, 3, 3, 0, 4, 128, + 0, 0, 228, 144, 17, 0, + 228, 160, 2, 0, 0, 3, + 3, 0, 7, 128, 3, 0, + 228, 129, 13, 0, 228, 160, + 36, 0, 0, 2, 4, 0, + 7, 128, 3, 0, 228, 128, + 2, 0, 0, 3, 3, 0, + 7, 128, 4, 0, 228, 128, + 4, 0, 228, 161, 36, 0, + 0, 2, 5, 0, 7, 128, + 3, 0, 228, 128, 8, 0, + 0, 3, 3, 0, 1, 128, + 5, 0, 228, 128, 0, 0, + 228, 128, 2, 0, 0, 3, + 5, 0, 7, 128, 4, 0, + 228, 128, 5, 0, 228, 161, + 2, 0, 0, 3, 4, 0, + 7, 128, 4, 0, 228, 128, + 6, 0, 228, 161, 36, 0, + 0, 2, 6, 0, 7, 128, + 4, 0, 228, 128, 8, 0, + 0, 3, 3, 0, 4, 128, + 6, 0, 228, 128, 0, 0, + 228, 128, 36, 0, 0, 2, + 4, 0, 7, 128, 5, 0, + 228, 128, 8, 0, 0, 3, + 3, 0, 2, 128, 4, 0, + 228, 128, 0, 0, 228, 128, + 11, 0, 0, 3, 0, 0, + 7, 128, 3, 0, 228, 128, + 25, 0, 170, 160, 5, 0, + 0, 3, 0, 0, 7, 128, + 2, 0, 228, 128, 0, 0, + 228, 128, 15, 0, 0, 2, + 2, 0, 1, 128, 0, 0, + 0, 128, 15, 0, 0, 2, + 2, 0, 2, 128, 0, 0, + 85, 128, 15, 0, 0, 2, + 2, 0, 4, 128, 0, 0, + 170, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 2, 0, + 228, 128, 3, 0, 255, 160, + 14, 0, 0, 2, 2, 0, + 1, 128, 0, 0, 0, 128, + 14, 0, 0, 2, 2, 0, + 2, 128, 0, 0, 85, 128, + 14, 0, 0, 2, 2, 0, + 4, 128, 0, 0, 170, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 5, 0, + 0, 3, 1, 0, 7, 128, + 0, 0, 85, 128, 11, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 11, 128, 0, 0, + 0, 128, 10, 0, 164, 160, + 1, 0, 164, 128, 4, 0, + 0, 4, 0, 0, 7, 128, + 0, 0, 170, 128, 12, 0, + 228, 160, 0, 0, 244, 128, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 23, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 14, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 25, 0, 170, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 25, 0, + 255, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 21, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 22, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 24, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 8, 224, + 1, 0, 255, 160, 255, 255, + 0, 0, 83, 72, 68, 82, + 32, 7, 0, 0, 64, 0, + 1, 0, 200, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 6, 0, 0, 0, 50, 0, + 0, 15, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 191, 0, 0, + 128, 191, 0, 0, 128, 191, + 0, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 68, 0, 0, 5, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 0, 0, 9, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 66, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 29, 0, 0, 10, + 114, 0, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 10, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 4, 0, + 0, 0, 86, 5, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 50, 0, + 0, 10, 178, 0, 16, 0, + 3, 0, 0, 0, 6, 0, + 16, 0, 3, 0, 0, 0, + 70, 136, 32, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 70, 8, 16, 0, 4, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 3, 0, + 0, 0, 166, 10, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 70, 3, + 16, 0, 3, 0, 0, 0, + 50, 0, 0, 11, 114, 32, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 6, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 0, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 17, 0, + 0, 8, 34, 0, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 17, 0, 0, 8, 66, 0, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 0, 0, 0, 9, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 4, 0, 0, 0, 246, 15, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 5, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 16, 0, 0, 7, + 34, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 66, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 52, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 47, 0, + 0, 5, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 246, 143, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 25, 0, 0, 5, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 1, 0, + 0, 0, 86, 5, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 50, 0, + 0, 10, 178, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 136, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 70, 8, 16, 0, 1, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 166, 10, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 70, 3, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 76, 0, 0, 0, + 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 171, 79, 83, + 71, 78, 100, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 80, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 0, + 0, 0, 67, 79, 76, 79, + 82, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e61595fc28318f816c2f52ecd7364f45204ff93d GIT binary patch literal 67072 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 Qbm8gs-;G)iDx|>w15wX5UjP6A literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTx.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTx.inc new file mode 100644 index 0000000..28cab8b --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTx.inc @@ -0,0 +1,1038 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TEXCOORD 0 xy 2 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 13 ( FLT, FLT, FLT, FLT) +// c14 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c18 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c25, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r0.x, v1, c18 + dp3 r0.y, v1, c19 + dp3 r0.z, v1, c20 + nrm r1.xyz, r0 // ::worldNormal<0,1,2> + +#line 36 + dp3 r0.x, -c4, r1 // ::dotL<0> + dp3 r0.y, -c5, r1 // ::dotL<1> + dp3 r0.z, -c6, r1 // ::dotL<2> + +#line 39 + sge r2.xyz, r0, c25.x // ::zeroL<0,1,2> + mul r3.xyz, r0, r2 // ::diffuse<0,1,2> + +#line 46 + mul r4.xyz, r3.y, c8 + mad r3.xyw, r3.x, c7.xyzz, r4.xyzz + mad r3.xyz, r3.z, c9, r3.xyww + mov r4.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad oT0.xyz, r3, r4, c2 // ::VSBasicVertexLightingTx<0,1,2> + +#line 57 + dp4 r3.x, v0, c15 // ::pos_ws<0> + dp4 r3.y, v0, c16 // ::pos_ws<1> + dp4 r3.z, v0, c17 // ::pos_ws<2> + add r3.xyz, -r3, c13 + nrm r4.xyz, r3 // ::eyeVector<0,1,2> + +#line 33 + add r3.xyz, r4, -c4 + nrm r5.xyz, r3 // ::halfVectors<0,1,2> + +#line 37 + dp3 r3.x, r5, r1 // ::dotH<0> + +#line 33 + add r5.xyz, r4, -c5 + add r4.xyz, r4, -c6 + nrm r6.xyz, r4 // ::halfVectors<6,7,8> + +#line 37 + dp3 r3.z, r6, r1 // ::dotH<2> + +#line 33 + nrm r4.xyz, r5 // ::halfVectors<3,4,5> + +#line 37 + dp3 r3.y, r4, r1 // ::dotH<1> + +#line 42 + max r1.xyz, r3, c25.x + mul r1.xyz, r2, r1 + log r2.x, r1.x + log r2.y, r1.y + log r2.z, r1.z + mul r1.xyz, r2, c3.w + exp r2.x, r1.x + exp r2.y, r1.y + exp r2.z, r1.z + mul r0.xyz, r0, r2 // ::specular<0,1,2> + +#line 47 + mul r1.xyz, r0.y, c11 + mad r0.xyw, r0.x, c10.xyzz, r1.xyzz + mad r0.xyz, r0.z, c12, r0.xyww + mul oT1.xyz, r0, c3 // ::VSBasicVertexLightingTx<4,5,6> + +#line 63 + dp4 oPos.z, v0, c23 // ::VSBasicVertexLightingTx<12> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c14 + max r0.x, r0.x, c25.x + min oT1.w, r0.x, c25.y // ::VSBasicVertexLightingTx<7> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c21 // ::vout<0> + dp4 r0.y, v0, c22 // ::vout<1> + dp4 r0.z, v0, c24 // ::vout<3> + +#line 206 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVertexLightingTx<10,11> + mov oPos.w, r0.z // ::VSBasicVertexLightingTx<13> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mov oT0.w, c1.w // ::VSBasicVertexLightingTx<3> + +#line 213 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mov oT2.xy, v2 // ::VSBasicVertexLightingTx<8,9> + +// approximately 63 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +dcl_temps 6 +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r1.x, -cb0[3].xyzx, r0.xyzx +dp3 r1.y, -cb0[4].xyzx, r0.xyzx +dp3 r1.z, -cb0[5].xyzx, r0.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r3.xyz, r1.xyzx, r2.xyzx +mul r4.xyz, r3.yyyy, cb0[7].xyzx +mad r3.xyw, r3.xxxx, cb0[6].xyxz, r4.xyxz +mad r3.xyz, r3.zzzz, cb0[8].xyzx, r3.xywx +mad o0.xyz, r3.xyzx, cb0[0].xyzx, cb0[1].xyzx +mov o0.w, cb0[0].w +dp4 r3.x, v0.xyzw, cb0[15].xyzw +dp4 r3.y, v0.xyzw, cb0[16].xyzw +dp4 r3.z, v0.xyzw, cb0[17].xyzw +add r3.xyz, -r3.xyzx, cb0[12].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mad r4.xyz, r3.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r4.xyzx, r4.xyzx +rsq r1.w, r1.w +mul r4.xyz, r1.wwww, r4.xyzx +dp3 r4.x, r4.xyzx, r0.xyzx +mad r5.xyz, r3.xyzx, r0.wwww, -cb0[4].xyzx +mad r3.xyz, r3.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r5.xyzx, r5.xyzx +rsq r0.w, r0.w +mul r5.xyz, r0.wwww, r5.xyzx +dp3 r4.y, r5.xyzx, r0.xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r4.z, r3.xyzx, r0.xyzx +max r0.xyz, r4.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +mul r0.xyz, r2.xyzx, r0.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o2.xy, v2.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVertexLightingTx[] = +{ + 68, 88, 66, 67, 72, 193, + 227, 223, 218, 137, 232, 216, + 68, 166, 62, 78, 169, 91, + 131, 167, 1, 0, 0, 0, + 96, 19, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 72, 11, 0, 0, 96, 18, + 0, 0, 212, 18, 0, 0, + 65, 111, 110, 57, 16, 11, + 0, 0, 16, 11, 0, 0, + 0, 2, 254, 255, 196, 10, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 13, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 212, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 36, 7, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 57, 0, 0, 0, + 20, 1, 0, 0, 13, 0, + 0, 0, 32, 6, 0, 0, + 16, 3, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 88, 7, + 0, 0, 0, 0, 255, 255, + 112, 7, 0, 0, 0, 0, + 255, 255, 124, 7, 0, 0, + 0, 0, 255, 255, 136, 7, + 0, 0, 59, 0, 0, 0, + 148, 7, 0, 0, 59, 0, + 0, 0, 164, 7, 0, 0, + 59, 0, 0, 0, 180, 7, + 0, 0, 59, 0, 0, 0, + 196, 7, 0, 0, 36, 0, + 0, 0, 208, 7, 0, 0, + 36, 0, 0, 0, 224, 7, + 0, 0, 36, 0, 0, 0, + 240, 7, 0, 0, 39, 0, + 0, 0, 0, 8, 0, 0, + 41, 0, 0, 0, 16, 8, + 0, 0, 46, 0, 0, 0, + 32, 8, 0, 0, 46, 0, + 0, 0, 48, 8, 0, 0, + 46, 0, 0, 0, 68, 8, + 0, 0, 46, 0, 0, 0, + 88, 8, 0, 0, 46, 0, + 0, 0, 100, 8, 0, 0, + 57, 0, 0, 0, 120, 8, + 0, 0, 57, 0, 0, 0, + 136, 8, 0, 0, 57, 0, + 0, 0, 152, 8, 0, 0, + 58, 0, 0, 0, 168, 8, + 0, 0, 58, 0, 0, 0, + 184, 8, 0, 0, 33, 0, + 0, 0, 196, 8, 0, 0, + 33, 0, 0, 0, 212, 8, + 0, 0, 37, 0, 0, 0, + 224, 8, 0, 0, 33, 0, + 0, 0, 240, 8, 0, 0, + 33, 0, 0, 0, 0, 9, + 0, 0, 33, 0, 0, 0, + 16, 9, 0, 0, 37, 0, + 0, 0, 28, 9, 0, 0, + 33, 0, 0, 0, 44, 9, + 0, 0, 37, 0, 0, 0, + 56, 9, 0, 0, 42, 0, + 0, 0, 72, 9, 0, 0, + 42, 0, 0, 0, 88, 9, + 0, 0, 42, 0, 0, 0, + 104, 9, 0, 0, 42, 0, + 0, 0, 116, 9, 0, 0, + 42, 0, 0, 0, 128, 9, + 0, 0, 42, 0, 0, 0, + 140, 9, 0, 0, 42, 0, + 0, 0, 156, 9, 0, 0, + 42, 0, 0, 0, 168, 9, + 0, 0, 42, 0, 0, 0, + 180, 9, 0, 0, 42, 0, + 0, 0, 192, 9, 0, 0, + 47, 0, 0, 0, 208, 9, + 0, 0, 47, 0, 0, 0, + 224, 9, 0, 0, 47, 0, + 0, 0, 244, 9, 0, 0, + 47, 0, 0, 0, 8, 10, + 0, 0, 63, 0, 0, 0, + 24, 10, 0, 0, 14, 0, + 1, 0, 40, 10, 0, 0, + 14, 0, 1, 0, 56, 10, + 0, 0, 14, 0, 1, 0, + 72, 10, 0, 0, 63, 0, + 0, 0, 88, 10, 0, 0, + 63, 0, 0, 0, 104, 10, + 0, 0, 63, 0, 0, 0, + 120, 10, 0, 0, 206, 0, + 2, 0, 136, 10, 0, 0, + 206, 0, 2, 0, 156, 10, + 0, 0, 46, 0, 0, 0, + 168, 10, 0, 0, 213, 0, + 2, 0, 180, 10, 0, 0, + 80, 97, 114, 97, 109, 101, + 116, 101, 114, 115, 0, 68, + 105, 102, 102, 117, 115, 101, + 67, 111, 108, 111, 114, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 16, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 86, 83, + 66, 97, 115, 105, 99, 86, + 101, 114, 116, 101, 120, 76, + 105, 103, 104, 116, 105, 110, + 103, 84, 120, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 40, 3, + 0, 0, 48, 3, 0, 0, + 64, 3, 0, 0, 48, 3, + 0, 0, 73, 3, 0, 0, + 84, 3, 0, 0, 100, 3, + 0, 0, 48, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 14, 0, 1, 0, 4, 0, + 112, 3, 0, 0, 17, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 45, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 46, 0, + 0, 0, 255, 255, 255, 255, + 12, 0, 255, 255, 49, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 53, 0, + 0, 0, 10, 0, 11, 0, + 255, 255, 255, 255, 54, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 13, 0, 55, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 56, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 25, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 29, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 31, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 100, 111, 116, 76, 0, 171, + 171, 171, 8, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 9, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 10, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 101, 121, 101, 86, + 101, 99, 116, 111, 114, 0, + 171, 171, 22, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 28, 0, 0, 0, 6, 0, + 7, 0, 8, 0, 255, 255, + 30, 0, 0, 0, 3, 0, + 4, 0, 5, 0, 255, 255, + 112, 111, 115, 95, 119, 115, + 0, 171, 18, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 19, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 20, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 115, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 41, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 28, 5, + 0, 0, 48, 3, 0, 0, + 37, 5, 0, 0, 8, 4, + 0, 0, 73, 3, 0, 0, + 84, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 9, 0, + 1, 0, 3, 0, 44, 5, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 255, 255, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 70, 111, 103, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 125, 5, 0, 0, 48, 3, + 0, 0, 40, 3, 0, 0, + 48, 3, 0, 0, 64, 3, + 0, 0, 8, 4, 0, 0, + 132, 5, 0, 0, 144, 5, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 4, 0, 160, 5, 0, 0, + 50, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 51, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 52, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 97, 108, 0, + 7, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 122, 101, 114, 111, 76, 0, + 171, 171, 11, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 220, 2, 0, 0, + 231, 2, 0, 0, 244, 2, + 0, 0, 1, 0, 0, 0, + 4, 3, 0, 0, 0, 0, + 0, 0, 16, 3, 0, 0, + 144, 3, 0, 0, 8, 0, + 0, 0, 160, 3, 0, 0, + 0, 0, 0, 0, 0, 4, + 0, 0, 8, 4, 0, 0, + 1, 0, 0, 0, 24, 4, + 0, 0, 0, 0, 0, 0, + 36, 4, 0, 0, 8, 4, + 0, 0, 3, 0, 0, 0, + 44, 4, 0, 0, 0, 0, + 0, 0, 80, 4, 0, 0, + 8, 4, 0, 0, 3, 0, + 0, 0, 88, 4, 0, 0, + 0, 0, 0, 0, 124, 4, + 0, 0, 8, 4, 0, 0, + 1, 0, 0, 0, 136, 4, + 0, 0, 0, 0, 0, 0, + 148, 4, 0, 0, 160, 4, + 0, 0, 3, 0, 0, 0, + 176, 4, 0, 0, 0, 0, + 0, 0, 212, 4, 0, 0, + 48, 3, 0, 0, 3, 0, + 0, 0, 220, 4, 0, 0, + 0, 0, 0, 0, 0, 5, + 0, 0, 8, 4, 0, 0, + 1, 0, 0, 0, 12, 5, + 0, 0, 16, 3, 0, 0, + 24, 5, 0, 0, 68, 5, + 0, 0, 3, 0, 0, 0, + 84, 5, 0, 0, 0, 0, + 0, 0, 120, 5, 0, 0, + 192, 5, 0, 0, 3, 0, + 0, 0, 208, 5, 0, 0, + 0, 0, 0, 0, 244, 5, + 0, 0, 8, 4, 0, 0, + 1, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, + 12, 6, 0, 0, 8, 4, + 0, 0, 1, 0, 0, 0, + 20, 6, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 25, 0, 15, 160, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 144, 18, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 2, 128, 1, 0, 228, 144, + 19, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 4, 128, + 1, 0, 228, 144, 20, 0, + 228, 160, 36, 0, 0, 2, + 1, 0, 7, 128, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 4, 0, + 228, 161, 1, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 2, 128, 5, 0, 228, 161, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 4, 128, + 6, 0, 228, 161, 1, 0, + 228, 128, 13, 0, 0, 3, + 2, 0, 7, 128, 0, 0, + 228, 128, 25, 0, 0, 160, + 5, 0, 0, 3, 3, 0, + 7, 128, 0, 0, 228, 128, + 2, 0, 228, 128, 5, 0, + 0, 3, 4, 0, 7, 128, + 3, 0, 85, 128, 8, 0, + 228, 160, 4, 0, 0, 4, + 3, 0, 11, 128, 3, 0, + 0, 128, 7, 0, 164, 160, + 4, 0, 164, 128, 4, 0, + 0, 4, 3, 0, 7, 128, + 3, 0, 170, 128, 9, 0, + 228, 160, 3, 0, 244, 128, + 1, 0, 0, 2, 4, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 7, 224, 3, 0, 228, 128, + 4, 0, 228, 128, 2, 0, + 228, 160, 9, 0, 0, 3, + 3, 0, 1, 128, 0, 0, + 228, 144, 15, 0, 228, 160, + 9, 0, 0, 3, 3, 0, + 2, 128, 0, 0, 228, 144, + 16, 0, 228, 160, 9, 0, + 0, 3, 3, 0, 4, 128, + 0, 0, 228, 144, 17, 0, + 228, 160, 2, 0, 0, 3, + 3, 0, 7, 128, 3, 0, + 228, 129, 13, 0, 228, 160, + 36, 0, 0, 2, 4, 0, + 7, 128, 3, 0, 228, 128, + 2, 0, 0, 3, 3, 0, + 7, 128, 4, 0, 228, 128, + 4, 0, 228, 161, 36, 0, + 0, 2, 5, 0, 7, 128, + 3, 0, 228, 128, 8, 0, + 0, 3, 3, 0, 1, 128, + 5, 0, 228, 128, 1, 0, + 228, 128, 2, 0, 0, 3, + 5, 0, 7, 128, 4, 0, + 228, 128, 5, 0, 228, 161, + 2, 0, 0, 3, 4, 0, + 7, 128, 4, 0, 228, 128, + 6, 0, 228, 161, 36, 0, + 0, 2, 6, 0, 7, 128, + 4, 0, 228, 128, 8, 0, + 0, 3, 3, 0, 4, 128, + 6, 0, 228, 128, 1, 0, + 228, 128, 36, 0, 0, 2, + 4, 0, 7, 128, 5, 0, + 228, 128, 8, 0, 0, 3, + 3, 0, 2, 128, 4, 0, + 228, 128, 1, 0, 228, 128, + 11, 0, 0, 3, 1, 0, + 7, 128, 3, 0, 228, 128, + 25, 0, 0, 160, 5, 0, + 0, 3, 1, 0, 7, 128, + 2, 0, 228, 128, 1, 0, + 228, 128, 15, 0, 0, 2, + 2, 0, 1, 128, 1, 0, + 0, 128, 15, 0, 0, 2, + 2, 0, 2, 128, 1, 0, + 85, 128, 15, 0, 0, 2, + 2, 0, 4, 128, 1, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 2, 0, + 228, 128, 3, 0, 255, 160, + 14, 0, 0, 2, 2, 0, + 1, 128, 1, 0, 0, 128, + 14, 0, 0, 2, 2, 0, + 2, 128, 1, 0, 85, 128, + 14, 0, 0, 2, 2, 0, + 4, 128, 1, 0, 170, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 228, 128, + 2, 0, 228, 128, 5, 0, + 0, 3, 1, 0, 7, 128, + 0, 0, 85, 128, 11, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 11, 128, 0, 0, + 0, 128, 10, 0, 164, 160, + 1, 0, 164, 128, 4, 0, + 0, 4, 0, 0, 7, 128, + 0, 0, 170, 128, 12, 0, + 228, 160, 0, 0, 244, 128, + 5, 0, 0, 3, 1, 0, + 7, 224, 0, 0, 228, 128, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 192, + 0, 0, 228, 144, 23, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 14, 0, 228, 160, + 11, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 0, 128, + 25, 0, 0, 160, 10, 0, + 0, 3, 1, 0, 8, 224, + 0, 0, 0, 128, 25, 0, + 85, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 21, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 22, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 24, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 0, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 0, 0, 8, 224, + 1, 0, 255, 160, 1, 0, + 0, 2, 2, 0, 3, 224, + 2, 0, 228, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 16, 7, 0, 0, 64, 0, + 1, 0, 196, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 26, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 104, 0, 0, 2, + 6, 0, 0, 0, 16, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 19, 0, 0, 0, + 16, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 20, 0, + 0, 0, 16, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 9, + 66, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 29, 0, 0, 10, + 114, 0, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 10, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 4, 0, + 0, 0, 86, 5, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 50, 0, + 0, 10, 178, 0, 16, 0, + 3, 0, 0, 0, 6, 0, + 16, 0, 3, 0, 0, 0, + 70, 136, 32, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 70, 8, 16, 0, 4, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 3, 0, + 0, 0, 166, 10, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 70, 3, + 16, 0, 3, 0, 0, 0, + 50, 0, 0, 11, 114, 32, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 6, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 128, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 0, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 17, 0, + 0, 8, 34, 0, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 16, 0, 0, 0, + 17, 0, 0, 8, 66, 0, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 17, 0, + 0, 0, 0, 0, 0, 9, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 12, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 4, 0, 0, 0, 246, 15, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 5, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 16, 0, 0, 7, + 34, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 66, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 52, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 47, 0, + 0, 5, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 246, 143, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 25, 0, 0, 5, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 1, 0, + 0, 0, 86, 5, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 50, 0, + 0, 10, 178, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 136, 32, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 70, 8, 16, 0, 1, 0, + 0, 0, 50, 0, 0, 10, + 114, 0, 16, 0, 0, 0, + 0, 0, 166, 10, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 70, 3, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 32, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 17, 32, 0, 8, + 130, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 54, 0, + 0, 5, 50, 32, 16, 0, + 2, 0, 0, 0, 70, 16, + 16, 0, 2, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 99, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 3, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 84, + 69, 88, 67, 79, 79, 82, + 68, 0, 79, 83, 71, 78, + 132, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 104, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 12, 0, 0, + 119, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 83, 86, 95, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTx.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTx.pdb new file mode 100644 index 0000000000000000000000000000000000000000..14856cac1e8bdfa87f68935a162ef62cb15e10d3 GIT binary patch literal 67072 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 + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c25.x, c25.y // ::BiasX2<0,1,2> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r1.x, r0, c18 + dp3 r1.y, r0, c19 + dp3 r1.z, r0, c20 + nrm r0.xyz, r1 // ::worldNormal<0,1,2> + +#line 36 + dp3 r1.x, -c4, r0 // ::dotL<0> + dp3 r1.y, -c5, r0 // ::dotL<1> + dp3 r1.z, -c6, r0 // ::dotL<2> + +#line 39 + sge r2.xyz, r1, c25.z // ::zeroL<0,1,2> + mul r3.xyz, r1, r2 // ::diffuse<0,1,2> + +#line 46 + mul r4.xyz, r3.y, c8 + mad r3.xyw, r3.x, c7.xyzz, r4.xyzz + mad r3.xyz, r3.z, c9, r3.xyww + mov r4.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad oT0.xyz, r3, r4, c2 // ::VSBasicVertexLightingTxBn<0,1,2> + +#line 57 + dp4 r3.x, v0, c15 // ::pos_ws<0> + dp4 r3.y, v0, c16 // ::pos_ws<1> + dp4 r3.z, v0, c17 // ::pos_ws<2> + add r3.xyz, -r3, c13 + nrm r4.xyz, r3 // ::eyeVector<0,1,2> + +#line 33 + add r3.xyz, r4, -c4 + nrm r5.xyz, r3 // ::halfVectors<0,1,2> + +#line 37 + dp3 r3.x, r5, r0 // ::dotH<0> + +#line 33 + add r5.xyz, r4, -c5 + add r4.xyz, r4, -c6 + nrm r6.xyz, r4 // ::halfVectors<6,7,8> + +#line 37 + dp3 r3.z, r6, r0 // ::dotH<2> + +#line 33 + nrm r4.xyz, r5 // ::halfVectors<3,4,5> + +#line 37 + dp3 r3.y, r4, r0 // ::dotH<1> + +#line 42 + max r0.xyz, r3, c25.z + mul r0.xyz, r2, r0 + log r2.x, r0.x + log r2.y, r0.y + log r2.z, r0.z + mul r0.xyz, r2, c3.w + exp r2.x, r0.x + exp r2.y, r0.y + exp r2.z, r0.z + mul r0.xyz, r1, r2 // ::specular<0,1,2> + +#line 47 + mul r1.xyz, r0.y, c11 + mad r0.xyw, r0.x, c10.xyzz, r1.xyzz + mad r0.xyz, r0.z, c12, r0.xyww + mul oT1.xyz, r0, c3 // ::VSBasicVertexLightingTxBn<4,5,6> + +#line 63 + dp4 oPos.z, v0, c23 // ::VSBasicVertexLightingTxBn<12> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c14 + max r0.x, r0.x, c25.z + min oT1.w, r0.x, c25.w // ::VSBasicVertexLightingTxBn<7> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c21 // ::vout<0> + dp4 r0.y, v0, c22 // ::vout<1> + dp4 r0.z, v0, c24 // ::vout<3> + +#line 218 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVertexLightingTxBn<10,11> + mov oPos.w, r0.z // ::VSBasicVertexLightingTxBn<13> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mov oT0.w, c1.w // ::VSBasicVertexLightingTxBn<3> + +#line 227 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mov oT2.xy, v2 // ::VSBasicVertexLightingTxBn<8,9> + +// approximately 64 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +dcl_temps 6 +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, r1.xyzx +dp3 r1.x, -cb0[3].xyzx, r0.xyzx +dp3 r1.y, -cb0[4].xyzx, r0.xyzx +dp3 r1.z, -cb0[5].xyzx, r0.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r3.xyz, r1.xyzx, r2.xyzx +mul r4.xyz, r3.yyyy, cb0[7].xyzx +mad r3.xyw, r3.xxxx, cb0[6].xyxz, r4.xyxz +mad r3.xyz, r3.zzzz, cb0[8].xyzx, r3.xywx +mad o0.xyz, r3.xyzx, cb0[0].xyzx, cb0[1].xyzx +mov o0.w, cb0[0].w +dp4 r3.x, v0.xyzw, cb0[15].xyzw +dp4 r3.y, v0.xyzw, cb0[16].xyzw +dp4 r3.z, v0.xyzw, cb0[17].xyzw +add r3.xyz, -r3.xyzx, cb0[12].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mad r4.xyz, r3.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r4.xyzx, r4.xyzx +rsq r1.w, r1.w +mul r4.xyz, r1.wwww, r4.xyzx +dp3 r4.x, r4.xyzx, r0.xyzx +mad r5.xyz, r3.xyzx, r0.wwww, -cb0[4].xyzx +mad r3.xyz, r3.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r5.xyzx, r5.xyzx +rsq r0.w, r0.w +mul r5.xyz, r0.wwww, r5.xyzx +dp3 r4.y, r5.xyzx, r0.xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r4.z, r3.xyzx, r0.xyzx +max r0.xyz, r4.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +mul r0.xyz, r2.xyzx, r0.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o2.xy, v2.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVertexLightingTxBn[] = +{ + 68, 88, 66, 67, 148, 60, + 38, 254, 97, 140, 49, 238, + 16, 144, 66, 55, 175, 12, + 124, 35, 1, 0, 0, 0, + 244, 19, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 160, 11, 0, 0, 244, 18, + 0, 0, 104, 19, 0, 0, + 65, 111, 110, 57, 104, 11, + 0, 0, 104, 11, 0, 0, + 0, 2, 254, 255, 28, 11, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 13, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 229, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 104, 7, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 58, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 80, 6, 0, 0, + 60, 3, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 67, + 111, 109, 109, 111, 110, 46, + 102, 120, 104, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 112, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 156, 7, + 0, 0, 0, 0, 255, 255, + 180, 7, 0, 0, 0, 0, + 255, 255, 192, 7, 0, 0, + 0, 0, 255, 255, 204, 7, + 0, 0, 32, 0, 0, 0, + 216, 7, 0, 0, 59, 0, + 1, 0, 236, 7, 0, 0, + 59, 0, 1, 0, 252, 7, + 0, 0, 59, 0, 1, 0, + 12, 8, 0, 0, 59, 0, + 1, 0, 28, 8, 0, 0, + 36, 0, 1, 0, 40, 8, + 0, 0, 36, 0, 1, 0, + 56, 8, 0, 0, 36, 0, + 1, 0, 72, 8, 0, 0, + 39, 0, 1, 0, 88, 8, + 0, 0, 41, 0, 1, 0, + 104, 8, 0, 0, 46, 0, + 1, 0, 120, 8, 0, 0, + 46, 0, 1, 0, 136, 8, + 0, 0, 46, 0, 1, 0, + 156, 8, 0, 0, 46, 0, + 1, 0, 176, 8, 0, 0, + 46, 0, 1, 0, 188, 8, + 0, 0, 57, 0, 1, 0, + 208, 8, 0, 0, 57, 0, + 1, 0, 224, 8, 0, 0, + 57, 0, 1, 0, 240, 8, + 0, 0, 58, 0, 1, 0, + 0, 9, 0, 0, 58, 0, + 1, 0, 16, 9, 0, 0, + 33, 0, 1, 0, 28, 9, + 0, 0, 33, 0, 1, 0, + 44, 9, 0, 0, 37, 0, + 1, 0, 56, 9, 0, 0, + 33, 0, 1, 0, 72, 9, + 0, 0, 33, 0, 1, 0, + 88, 9, 0, 0, 33, 0, + 1, 0, 104, 9, 0, 0, + 37, 0, 1, 0, 116, 9, + 0, 0, 33, 0, 1, 0, + 132, 9, 0, 0, 37, 0, + 1, 0, 144, 9, 0, 0, + 42, 0, 1, 0, 160, 9, + 0, 0, 42, 0, 1, 0, + 176, 9, 0, 0, 42, 0, + 1, 0, 192, 9, 0, 0, + 42, 0, 1, 0, 204, 9, + 0, 0, 42, 0, 1, 0, + 216, 9, 0, 0, 42, 0, + 1, 0, 228, 9, 0, 0, + 42, 0, 1, 0, 244, 9, + 0, 0, 42, 0, 1, 0, + 0, 10, 0, 0, 42, 0, + 1, 0, 12, 10, 0, 0, + 42, 0, 1, 0, 24, 10, + 0, 0, 47, 0, 1, 0, + 40, 10, 0, 0, 47, 0, + 1, 0, 56, 10, 0, 0, + 47, 0, 1, 0, 76, 10, + 0, 0, 47, 0, 1, 0, + 96, 10, 0, 0, 63, 0, + 1, 0, 112, 10, 0, 0, + 14, 0, 0, 0, 128, 10, + 0, 0, 14, 0, 0, 0, + 144, 10, 0, 0, 14, 0, + 0, 0, 160, 10, 0, 0, + 63, 0, 1, 0, 176, 10, + 0, 0, 63, 0, 1, 0, + 192, 10, 0, 0, 63, 0, + 1, 0, 208, 10, 0, 0, + 218, 0, 2, 0, 224, 10, + 0, 0, 218, 0, 2, 0, + 244, 10, 0, 0, 46, 0, + 1, 0, 0, 11, 0, 0, + 227, 0, 2, 0, 12, 11, + 0, 0, 66, 105, 97, 115, + 88, 50, 0, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 80, 97, 114, 97, + 109, 101, 116, 101, 114, 115, + 0, 68, 105, 102, 102, 117, + 115, 101, 67, 111, 108, 111, + 114, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 86, 83, 66, 97, 115, 105, + 99, 86, 101, 114, 116, 101, + 120, 76, 105, 103, 104, 116, + 105, 110, 103, 84, 120, 66, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 84, 101, 120, 67, 111, + 111, 114, 100, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 80, 83, 0, 171, 86, 3, + 0, 0, 96, 3, 0, 0, + 112, 3, 0, 0, 96, 3, + 0, 0, 121, 3, 0, 0, + 132, 3, 0, 0, 148, 3, + 0, 0, 96, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 14, 0, 1, 0, 4, 0, + 160, 3, 0, 0, 18, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 46, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 47, 0, + 0, 0, 255, 255, 255, 255, + 12, 0, 255, 255, 50, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 54, 0, + 0, 0, 10, 0, 11, 0, + 255, 255, 255, 255, 55, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 13, 0, 56, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 57, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 26, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 30, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 32, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 100, 111, 116, 76, 0, 171, + 171, 171, 9, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 10, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 11, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 101, 121, 101, 86, + 101, 99, 116, 111, 114, 0, + 171, 171, 23, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 29, 0, 0, 0, 6, 0, + 7, 0, 8, 0, 255, 255, + 31, 0, 0, 0, 3, 0, + 4, 0, 5, 0, 255, 255, + 112, 111, 115, 95, 119, 115, + 0, 171, 19, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 20, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 21, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 115, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 42, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 76, 5, + 0, 0, 96, 3, 0, 0, + 85, 5, 0, 0, 56, 4, + 0, 0, 121, 3, 0, 0, + 132, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 9, 0, + 1, 0, 3, 0, 92, 5, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 255, 255, + 255, 255, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 70, 111, 103, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 173, 5, 0, 0, 96, 3, + 0, 0, 86, 3, 0, 0, + 96, 3, 0, 0, 112, 3, + 0, 0, 56, 4, 0, 0, + 180, 5, 0, 0, 192, 5, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 4, 0, 208, 5, 0, 0, + 51, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 52, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 53, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 97, 108, 0, + 8, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 122, 101, 114, 111, 76, 0, + 171, 171, 12, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 0, 0, 0, 0, + 228, 2, 0, 0, 236, 2, + 0, 0, 1, 0, 0, 0, + 252, 2, 0, 0, 8, 3, + 0, 0, 19, 3, 0, 0, + 32, 3, 0, 0, 1, 0, + 0, 0, 48, 3, 0, 0, + 0, 0, 0, 0, 60, 3, + 0, 0, 192, 3, 0, 0, + 8, 0, 0, 0, 208, 3, + 0, 0, 0, 0, 0, 0, + 48, 4, 0, 0, 56, 4, + 0, 0, 1, 0, 0, 0, + 72, 4, 0, 0, 0, 0, + 0, 0, 84, 4, 0, 0, + 56, 4, 0, 0, 3, 0, + 0, 0, 92, 4, 0, 0, + 0, 0, 0, 0, 128, 4, + 0, 0, 56, 4, 0, 0, + 3, 0, 0, 0, 136, 4, + 0, 0, 0, 0, 0, 0, + 172, 4, 0, 0, 56, 4, + 0, 0, 1, 0, 0, 0, + 184, 4, 0, 0, 0, 0, + 0, 0, 196, 4, 0, 0, + 208, 4, 0, 0, 3, 0, + 0, 0, 224, 4, 0, 0, + 0, 0, 0, 0, 4, 5, + 0, 0, 96, 3, 0, 0, + 3, 0, 0, 0, 12, 5, + 0, 0, 0, 0, 0, 0, + 48, 5, 0, 0, 56, 4, + 0, 0, 1, 0, 0, 0, + 60, 5, 0, 0, 60, 3, + 0, 0, 72, 5, 0, 0, + 116, 5, 0, 0, 3, 0, + 0, 0, 132, 5, 0, 0, + 0, 0, 0, 0, 168, 5, + 0, 0, 240, 5, 0, 0, + 3, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, + 36, 6, 0, 0, 56, 4, + 0, 0, 1, 0, 0, 0, + 48, 6, 0, 0, 0, 0, + 0, 0, 60, 6, 0, 0, + 56, 4, 0, 0, 1, 0, + 0, 0, 68, 6, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 25, 0, 15, 160, + 0, 0, 0, 64, 0, 0, + 128, 191, 0, 0, 0, 0, + 0, 0, 128, 63, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 4, 0, + 0, 4, 0, 0, 7, 128, + 1, 0, 228, 144, 25, 0, + 0, 160, 25, 0, 85, 160, + 8, 0, 0, 3, 1, 0, + 1, 128, 0, 0, 228, 128, + 18, 0, 228, 160, 8, 0, + 0, 3, 1, 0, 2, 128, + 0, 0, 228, 128, 19, 0, + 228, 160, 8, 0, 0, 3, + 1, 0, 4, 128, 0, 0, + 228, 128, 20, 0, 228, 160, + 36, 0, 0, 2, 0, 0, + 7, 128, 1, 0, 228, 128, + 8, 0, 0, 3, 1, 0, + 1, 128, 4, 0, 228, 161, + 0, 0, 228, 128, 8, 0, + 0, 3, 1, 0, 2, 128, + 5, 0, 228, 161, 0, 0, + 228, 128, 8, 0, 0, 3, + 1, 0, 4, 128, 6, 0, + 228, 161, 0, 0, 228, 128, + 13, 0, 0, 3, 2, 0, + 7, 128, 1, 0, 228, 128, + 25, 0, 170, 160, 5, 0, + 0, 3, 3, 0, 7, 128, + 1, 0, 228, 128, 2, 0, + 228, 128, 5, 0, 0, 3, + 4, 0, 7, 128, 3, 0, + 85, 128, 8, 0, 228, 160, + 4, 0, 0, 4, 3, 0, + 11, 128, 3, 0, 0, 128, + 7, 0, 164, 160, 4, 0, + 164, 128, 4, 0, 0, 4, + 3, 0, 7, 128, 3, 0, + 170, 128, 9, 0, 228, 160, + 3, 0, 244, 128, 1, 0, + 0, 2, 4, 0, 7, 128, + 1, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 7, 224, + 3, 0, 228, 128, 4, 0, + 228, 128, 2, 0, 228, 160, + 9, 0, 0, 3, 3, 0, + 1, 128, 0, 0, 228, 144, + 15, 0, 228, 160, 9, 0, + 0, 3, 3, 0, 2, 128, + 0, 0, 228, 144, 16, 0, + 228, 160, 9, 0, 0, 3, + 3, 0, 4, 128, 0, 0, + 228, 144, 17, 0, 228, 160, + 2, 0, 0, 3, 3, 0, + 7, 128, 3, 0, 228, 129, + 13, 0, 228, 160, 36, 0, + 0, 2, 4, 0, 7, 128, + 3, 0, 228, 128, 2, 0, + 0, 3, 3, 0, 7, 128, + 4, 0, 228, 128, 4, 0, + 228, 161, 36, 0, 0, 2, + 5, 0, 7, 128, 3, 0, + 228, 128, 8, 0, 0, 3, + 3, 0, 1, 128, 5, 0, + 228, 128, 0, 0, 228, 128, + 2, 0, 0, 3, 5, 0, + 7, 128, 4, 0, 228, 128, + 5, 0, 228, 161, 2, 0, + 0, 3, 4, 0, 7, 128, + 4, 0, 228, 128, 6, 0, + 228, 161, 36, 0, 0, 2, + 6, 0, 7, 128, 4, 0, + 228, 128, 8, 0, 0, 3, + 3, 0, 4, 128, 6, 0, + 228, 128, 0, 0, 228, 128, + 36, 0, 0, 2, 4, 0, + 7, 128, 5, 0, 228, 128, + 8, 0, 0, 3, 3, 0, + 2, 128, 4, 0, 228, 128, + 0, 0, 228, 128, 11, 0, + 0, 3, 0, 0, 7, 128, + 3, 0, 228, 128, 25, 0, + 170, 160, 5, 0, 0, 3, + 0, 0, 7, 128, 2, 0, + 228, 128, 0, 0, 228, 128, + 15, 0, 0, 2, 2, 0, + 1, 128, 0, 0, 0, 128, + 15, 0, 0, 2, 2, 0, + 2, 128, 0, 0, 85, 128, + 15, 0, 0, 2, 2, 0, + 4, 128, 0, 0, 170, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 2, 0, 228, 128, + 3, 0, 255, 160, 14, 0, + 0, 2, 2, 0, 1, 128, + 0, 0, 0, 128, 14, 0, + 0, 2, 2, 0, 2, 128, + 0, 0, 85, 128, 14, 0, + 0, 2, 2, 0, 4, 128, + 0, 0, 170, 128, 5, 0, + 0, 3, 0, 0, 7, 128, + 1, 0, 228, 128, 2, 0, + 228, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 85, 128, 11, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 11, 128, 0, 0, 0, 128, + 10, 0, 164, 160, 1, 0, + 164, 128, 4, 0, 0, 4, + 0, 0, 7, 128, 0, 0, + 170, 128, 12, 0, 228, 160, + 0, 0, 244, 128, 5, 0, + 0, 3, 1, 0, 7, 224, + 0, 0, 228, 128, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 23, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 14, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 25, 0, + 170, 160, 10, 0, 0, 3, + 1, 0, 8, 224, 0, 0, + 0, 128, 25, 0, 255, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 21, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 22, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 24, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 8, 224, 1, 0, + 255, 160, 1, 0, 0, 2, + 2, 0, 3, 224, 2, 0, + 228, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 76, 7, + 0, 0, 64, 0, 1, 0, + 211, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 26, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 114, 16, 16, 0, 1, 0, + 0, 0, 95, 0, 0, 3, + 50, 16, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 2, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 104, 0, 0, 2, 6, 0, + 0, 0, 50, 0, 0, 15, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 0, 64, + 0, 0, 0, 64, 0, 0, + 0, 64, 0, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 191, 0, 0, 128, 191, + 0, 0, 128, 191, 0, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 0, 0, 9, 18, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 34, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 66, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 29, 0, 0, 10, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 10, 114, 0, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 4, 0, 0, 0, + 86, 5, 16, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 7, 0, + 0, 0, 50, 0, 0, 10, + 178, 0, 16, 0, 3, 0, + 0, 0, 6, 0, 16, 0, + 3, 0, 0, 0, 70, 136, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 70, 8, + 16, 0, 4, 0, 0, 0, + 50, 0, 0, 10, 114, 0, + 16, 0, 3, 0, 0, 0, + 166, 10, 16, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 8, 0, + 0, 0, 70, 3, 16, 0, + 3, 0, 0, 0, 50, 0, + 0, 11, 114, 32, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 6, 130, 32, + 16, 0, 0, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 0, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 0, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 0, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 0, 0, 0, 9, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 12, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 4, 0, + 0, 0, 246, 15, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 5, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 5, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 16, 0, 0, 7, 34, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 66, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 52, 0, 0, 10, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 47, 0, 0, 5, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 246, 143, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 25, 0, 0, 5, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 1, 0, 0, 0, + 86, 5, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 10, 0, + 0, 0, 50, 0, 0, 10, + 178, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 136, + 32, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 70, 8, + 16, 0, 1, 0, 0, 0, + 50, 0, 0, 10, 114, 0, + 16, 0, 0, 0, 0, 0, + 166, 10, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 11, 0, + 0, 0, 70, 3, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 32, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 54, 0, 0, 5, + 50, 32, 16, 0, 2, 0, + 0, 0, 70, 16, 16, 0, + 2, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 22, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 23, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 24, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 25, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 108, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 3, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 110, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..76fbccd64bd4b85582db3f524a7e55315e4457de GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVc.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVc.inc new file mode 100644 index 0000000..920cf3a --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVc.inc @@ -0,0 +1,1084 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TEXCOORD 0 xy 2 NONE float xy +// COLOR 0 xyzw 3 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 13 ( FLT, FLT, FLT, FLT) +// c14 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c18 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c25, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + dcl_texcoord3 v3 // vin<9,10,11,12> + +#line 57 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::pos_ws<0> + dp4 r0.y, v0, c16 // ::pos_ws<1> + dp4 r0.z, v0, c17 // ::pos_ws<2> + add r0.xyz, -r0, c13 + nrm r1.xyz, r0 // ::eyeVector<0,1,2> + +#line 33 + add r0.xyz, r1, -c4 + nrm r2.xyz, r0 // ::halfVectors<0,1,2> + +#line 59 + dp3 r0.x, v1, c18 + dp3 r0.y, v1, c19 + dp3 r0.z, v1, c20 + nrm r3.xyz, r0 // ::worldNormal<0,1,2> + +#line 37 + dp3 r0.x, r2, r3 // ::dotH<0> + +#line 33 + add r2.xyz, r1, -c5 + add r1.xyz, r1, -c6 + nrm r4.xyz, r1 // ::halfVectors<6,7,8> + +#line 37 + dp3 r0.z, r4, r3 // ::dotH<2> + +#line 33 + nrm r1.xyz, r2 // ::halfVectors<3,4,5> + +#line 37 + dp3 r0.y, r1, r3 // ::dotH<1> + +#line 42 + max r0.xyz, r0, c25.x + +#line 36 + dp3 r1.x, -c4, r3 // ::dotL<0> + dp3 r1.y, -c5, r3 // ::dotL<1> + dp3 r1.z, -c6, r3 // ::dotL<2> + +#line 39 + sge r2.xyz, r1, c25.x // ::zeroL<0,1,2> + +#line 42 + mul r0.xyz, r0, r2 + mul r2.xyz, r1, r2 // ::diffuse<0,1,2> + log r3.x, r0.x + log r3.y, r0.y + log r3.z, r0.z + mul r0.xyz, r3, c3.w + exp r3.x, r0.x + exp r3.y, r0.y + exp r3.z, r0.z + mul r0.xyz, r1, r3 // ::specular<0,1,2> + +#line 47 + mul r1.xyz, r0.y, c11 + mad r0.xyw, r0.x, c10.xyzz, r1.xyzz + mad r0.xyz, r0.z, c12, r0.xyww + mul oT1.xyz, r0, c3 // ::VSBasicVertexLightingTxVc<4,5,6> + +#line 63 + dp4 oPos.z, v0, c23 // ::VSBasicVertexLightingTxVc<12> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c14 + max r0.x, r0.x, c25.x + min oT1.w, r0.x, c25.y // ::VSBasicVertexLightingTxVc<7> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mul r0.xyz, r2.y, c8 + mad r0.xyz, r2.x, c7, r0 + mad r0.xyz, r2.z, c9, r0 + mov r1.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad r0.xyz, r0, r1, c2 // ::result<0,1,2> + +#line 242 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.xyz, r0, v3 // ::VSBasicVertexLightingTxVc<0,1,2> + mul oT0.w, v3.w, c1.w // ::VSBasicVertexLightingTxVc<3> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c21 // ::vout<0> + dp4 r0.y, v0, c22 // ::vout<1> + dp4 r0.z, v0, c24 // ::vout<3> + +#line 234 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVertexLightingTxVc<10,11> + mov oPos.w, r0.z // ::VSBasicVertexLightingTxVc<13> + +#line 241 + mov oT2.xy, v2 // ::VSBasicVertexLightingTxVc<8,9> + +// approximately 64 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_input v3.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +dcl_temps 6 +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r1.x, -cb0[3].xyzx, r0.xyzx +dp3 r1.y, -cb0[4].xyzx, r0.xyzx +dp3 r1.z, -cb0[5].xyzx, r0.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r3.xyz, r1.xyzx, r2.xyzx +mul r4.xyz, r3.yyyy, cb0[7].xyzx +mad r3.xyw, r3.xxxx, cb0[6].xyxz, r4.xyxz +mad r3.xyz, r3.zzzz, cb0[8].xyzx, r3.xywx +mad r3.xyz, r3.xyzx, cb0[0].xyzx, cb0[1].xyzx +mul o0.xyz, r3.xyzx, v3.xyzx +mul o0.w, v3.w, cb0[0].w +dp4 r3.x, v0.xyzw, cb0[15].xyzw +dp4 r3.y, v0.xyzw, cb0[16].xyzw +dp4 r3.z, v0.xyzw, cb0[17].xyzw +add r3.xyz, -r3.xyzx, cb0[12].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mad r4.xyz, r3.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r4.xyzx, r4.xyzx +rsq r1.w, r1.w +mul r4.xyz, r1.wwww, r4.xyzx +dp3 r4.x, r4.xyzx, r0.xyzx +mad r5.xyz, r3.xyzx, r0.wwww, -cb0[4].xyzx +mad r3.xyz, r3.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r5.xyzx, r5.xyzx +rsq r0.w, r0.w +mul r5.xyz, r0.wwww, r5.xyzx +dp3 r4.y, r5.xyzx, r0.xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r4.z, r3.xyzx, r0.xyzx +max r0.xyz, r4.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +mul r0.xyz, r2.xyzx, r0.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o2.xy, v2.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVertexLightingTxVc[] = +{ + 68, 88, 66, 67, 179, 171, + 230, 242, 22, 98, 195, 8, + 90, 72, 30, 185, 112, 178, + 91, 108, 1, 0, 0, 0, + 72, 20, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 224, 11, 0, 0, 40, 19, + 0, 0, 188, 19, 0, 0, + 65, 111, 110, 57, 168, 11, + 0, 0, 168, 11, 0, 0, + 0, 2, 254, 255, 92, 11, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 13, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 242, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 156, 7, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 59, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 132, 6, 0, 0, + 32, 3, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 208, 7, + 0, 0, 0, 0, 255, 255, + 232, 7, 0, 0, 0, 0, + 255, 255, 244, 7, 0, 0, + 0, 0, 255, 255, 0, 8, + 0, 0, 0, 0, 255, 255, + 12, 8, 0, 0, 57, 0, + 0, 0, 24, 8, 0, 0, + 57, 0, 0, 0, 40, 8, + 0, 0, 57, 0, 0, 0, + 56, 8, 0, 0, 58, 0, + 0, 0, 72, 8, 0, 0, + 58, 0, 0, 0, 88, 8, + 0, 0, 33, 0, 0, 0, + 100, 8, 0, 0, 33, 0, + 0, 0, 116, 8, 0, 0, + 59, 0, 0, 0, 128, 8, + 0, 0, 59, 0, 0, 0, + 144, 8, 0, 0, 59, 0, + 0, 0, 160, 8, 0, 0, + 59, 0, 0, 0, 176, 8, + 0, 0, 37, 0, 0, 0, + 188, 8, 0, 0, 33, 0, + 0, 0, 204, 8, 0, 0, + 33, 0, 0, 0, 220, 8, + 0, 0, 33, 0, 0, 0, + 236, 8, 0, 0, 37, 0, + 0, 0, 248, 8, 0, 0, + 33, 0, 0, 0, 8, 9, + 0, 0, 37, 0, 0, 0, + 20, 9, 0, 0, 42, 0, + 0, 0, 36, 9, 0, 0, + 36, 0, 0, 0, 52, 9, + 0, 0, 36, 0, 0, 0, + 68, 9, 0, 0, 36, 0, + 0, 0, 84, 9, 0, 0, + 39, 0, 0, 0, 100, 9, + 0, 0, 42, 0, 0, 0, + 116, 9, 0, 0, 41, 0, + 0, 0, 132, 9, 0, 0, + 42, 0, 0, 0, 148, 9, + 0, 0, 42, 0, 0, 0, + 160, 9, 0, 0, 42, 0, + 0, 0, 172, 9, 0, 0, + 42, 0, 0, 0, 184, 9, + 0, 0, 42, 0, 0, 0, + 200, 9, 0, 0, 42, 0, + 0, 0, 212, 9, 0, 0, + 42, 0, 0, 0, 224, 9, + 0, 0, 42, 0, 0, 0, + 236, 9, 0, 0, 47, 0, + 0, 0, 252, 9, 0, 0, + 47, 0, 0, 0, 12, 10, + 0, 0, 47, 0, 0, 0, + 32, 10, 0, 0, 47, 0, + 0, 0, 52, 10, 0, 0, + 63, 0, 0, 0, 68, 10, + 0, 0, 14, 0, 1, 0, + 84, 10, 0, 0, 14, 0, + 1, 0, 100, 10, 0, 0, + 14, 0, 1, 0, 116, 10, + 0, 0, 46, 0, 0, 0, + 132, 10, 0, 0, 46, 0, + 0, 0, 148, 10, 0, 0, + 46, 0, 0, 0, 168, 10, + 0, 0, 46, 0, 0, 0, + 188, 10, 0, 0, 46, 0, + 0, 0, 200, 10, 0, 0, + 242, 0, 2, 0, 220, 10, + 0, 0, 242, 0, 2, 0, + 236, 10, 0, 0, 63, 0, + 0, 0, 252, 10, 0, 0, + 63, 0, 0, 0, 12, 11, + 0, 0, 63, 0, 0, 0, + 28, 11, 0, 0, 234, 0, + 2, 0, 44, 11, 0, 0, + 234, 0, 2, 0, 64, 11, + 0, 0, 241, 0, 2, 0, + 76, 11, 0, 0, 80, 97, + 114, 97, 109, 101, 116, 101, + 114, 115, 0, 68, 105, 102, + 102, 117, 115, 101, 67, 111, + 108, 111, 114, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 49, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 86, 83, 66, 97, + 115, 105, 99, 86, 101, 114, + 116, 101, 120, 76, 105, 103, + 104, 116, 105, 110, 103, 84, + 120, 86, 99, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 83, 112, 101, 99, 117, 108, + 97, 114, 0, 84, 101, 120, + 67, 111, 111, 114, 100, 0, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 80, 83, 0, 171, + 58, 3, 0, 0, 68, 3, + 0, 0, 84, 3, 0, 0, + 68, 3, 0, 0, 93, 3, + 0, 0, 104, 3, 0, 0, + 120, 3, 0, 0, 68, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 14, 0, 1, 0, + 4, 0, 132, 3, 0, 0, + 41, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 42, 0, 0, 0, 255, 255, + 255, 255, 12, 0, 255, 255, + 45, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 7, 0, + 51, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 52, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 3, 0, + 56, 0, 0, 0, 10, 0, + 11, 0, 255, 255, 255, 255, + 57, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 13, 0, + 58, 0, 0, 0, 8, 0, + 9, 0, 255, 255, 255, 255, + 100, 105, 102, 102, 117, 115, + 101, 0, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 100, 111, 116, 72, 0, 171, + 171, 171, 16, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 20, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 22, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 100, 111, 116, 76, + 0, 171, 171, 171, 24, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 25, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 26, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 101, 121, + 101, 86, 101, 99, 116, 111, + 114, 0, 171, 171, 9, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 104, 97, + 108, 102, 86, 101, 99, 116, + 111, 114, 115, 0, 3, 0, + 3, 0, 3, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 19, 0, 0, 0, + 6, 0, 7, 0, 8, 0, + 255, 255, 21, 0, 0, 0, + 3, 0, 4, 0, 5, 0, + 255, 255, 112, 111, 115, 95, + 119, 115, 0, 171, 5, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 6, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 7, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 114, 101, + 115, 117, 108, 116, 0, 171, + 58, 3, 0, 0, 28, 4, + 0, 0, 84, 3, 0, 0, + 28, 4, 0, 0, 5, 0, + 0, 0, 1, 0, 6, 0, + 1, 0, 2, 0, 28, 5, + 0, 0, 50, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 115, 112, 101, 99, + 117, 108, 97, 114, 0, 171, + 171, 171, 37, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 118, 105, 110, 0, + 80, 111, 115, 105, 116, 105, + 111, 110, 0, 78, 111, 114, + 109, 97, 108, 0, 67, 111, + 108, 111, 114, 0, 171, 171, + 100, 5, 0, 0, 68, 3, + 0, 0, 109, 5, 0, 0, + 28, 4, 0, 0, 93, 3, + 0, 0, 104, 3, 0, 0, + 116, 5, 0, 0, 68, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 13, 0, 1, 0, + 4, 0, 124, 5, 0, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 255, 255, 255, 255, + 4, 0, 0, 0, 9, 0, + 10, 0, 11, 0, 12, 0, + 118, 111, 117, 116, 0, 80, + 111, 115, 95, 112, 115, 0, + 70, 111, 103, 70, 97, 99, + 116, 111, 114, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 225, 5, + 0, 0, 68, 3, 0, 0, + 58, 3, 0, 0, 68, 3, + 0, 0, 84, 3, 0, 0, + 28, 4, 0, 0, 232, 5, + 0, 0, 244, 5, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 4, 0, + 4, 6, 0, 0, 53, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 54, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 55, 0, + 0, 0, 255, 255, 255, 255, + 3, 0, 255, 255, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 97, 108, 0, 15, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 122, 101, + 114, 111, 76, 0, 171, 171, + 27, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 236, 2, 0, 0, 247, 2, + 0, 0, 4, 3, 0, 0, + 1, 0, 0, 0, 20, 3, + 0, 0, 0, 0, 0, 0, + 32, 3, 0, 0, 164, 3, + 0, 0, 8, 0, 0, 0, + 180, 3, 0, 0, 0, 0, + 0, 0, 20, 4, 0, 0, + 28, 4, 0, 0, 1, 0, + 0, 0, 44, 4, 0, 0, + 0, 0, 0, 0, 56, 4, + 0, 0, 28, 4, 0, 0, + 3, 0, 0, 0, 64, 4, + 0, 0, 0, 0, 0, 0, + 100, 4, 0, 0, 28, 4, + 0, 0, 3, 0, 0, 0, + 108, 4, 0, 0, 0, 0, + 0, 0, 144, 4, 0, 0, + 28, 4, 0, 0, 1, 0, + 0, 0, 156, 4, 0, 0, + 0, 0, 0, 0, 168, 4, + 0, 0, 180, 4, 0, 0, + 3, 0, 0, 0, 196, 4, + 0, 0, 0, 0, 0, 0, + 232, 4, 0, 0, 68, 3, + 0, 0, 3, 0, 0, 0, + 240, 4, 0, 0, 0, 0, + 0, 0, 20, 5, 0, 0, + 44, 5, 0, 0, 1, 0, + 0, 0, 60, 5, 0, 0, + 0, 0, 0, 0, 72, 5, + 0, 0, 28, 4, 0, 0, + 1, 0, 0, 0, 84, 5, + 0, 0, 32, 3, 0, 0, + 96, 5, 0, 0, 156, 5, + 0, 0, 4, 0, 0, 0, + 172, 5, 0, 0, 0, 0, + 0, 0, 220, 5, 0, 0, + 36, 6, 0, 0, 3, 0, + 0, 0, 52, 6, 0, 0, + 0, 0, 0, 0, 88, 6, + 0, 0, 28, 4, 0, 0, + 1, 0, 0, 0, 100, 6, + 0, 0, 0, 0, 0, 0, + 112, 6, 0, 0, 28, 4, + 0, 0, 1, 0, 0, 0, + 120, 6, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 25, 0, 15, 160, 0, 0, + 0, 0, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 3, 128, 3, 0, + 15, 144, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 15, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 16, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 17, 0, + 228, 160, 2, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 228, 129, 13, 0, 228, 160, + 36, 0, 0, 2, 1, 0, + 7, 128, 0, 0, 228, 128, + 2, 0, 0, 3, 0, 0, + 7, 128, 1, 0, 228, 128, + 4, 0, 228, 161, 36, 0, + 0, 2, 2, 0, 7, 128, + 0, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 144, 18, 0, + 228, 160, 8, 0, 0, 3, + 0, 0, 2, 128, 1, 0, + 228, 144, 19, 0, 228, 160, + 8, 0, 0, 3, 0, 0, + 4, 128, 1, 0, 228, 144, + 20, 0, 228, 160, 36, 0, + 0, 2, 3, 0, 7, 128, + 0, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 1, 128, + 2, 0, 228, 128, 3, 0, + 228, 128, 2, 0, 0, 3, + 2, 0, 7, 128, 1, 0, + 228, 128, 5, 0, 228, 161, + 2, 0, 0, 3, 1, 0, + 7, 128, 1, 0, 228, 128, + 6, 0, 228, 161, 36, 0, + 0, 2, 4, 0, 7, 128, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 4, 128, + 4, 0, 228, 128, 3, 0, + 228, 128, 36, 0, 0, 2, + 1, 0, 7, 128, 2, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 2, 128, 1, 0, + 228, 128, 3, 0, 228, 128, + 11, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 228, 128, + 25, 0, 0, 160, 8, 0, + 0, 3, 1, 0, 1, 128, + 4, 0, 228, 161, 3, 0, + 228, 128, 8, 0, 0, 3, + 1, 0, 2, 128, 5, 0, + 228, 161, 3, 0, 228, 128, + 8, 0, 0, 3, 1, 0, + 4, 128, 6, 0, 228, 161, + 3, 0, 228, 128, 13, 0, + 0, 3, 2, 0, 7, 128, + 1, 0, 228, 128, 25, 0, + 0, 160, 5, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 228, 128, 2, 0, 228, 128, + 5, 0, 0, 3, 2, 0, + 7, 128, 1, 0, 228, 128, + 2, 0, 228, 128, 15, 0, + 0, 2, 3, 0, 1, 128, + 0, 0, 0, 128, 15, 0, + 0, 2, 3, 0, 2, 128, + 0, 0, 85, 128, 15, 0, + 0, 2, 3, 0, 4, 128, + 0, 0, 170, 128, 5, 0, + 0, 3, 0, 0, 7, 128, + 3, 0, 228, 128, 3, 0, + 255, 160, 14, 0, 0, 2, + 3, 0, 1, 128, 0, 0, + 0, 128, 14, 0, 0, 2, + 3, 0, 2, 128, 0, 0, + 85, 128, 14, 0, 0, 2, + 3, 0, 4, 128, 0, 0, + 170, 128, 5, 0, 0, 3, + 0, 0, 7, 128, 1, 0, + 228, 128, 3, 0, 228, 128, + 5, 0, 0, 3, 1, 0, + 7, 128, 0, 0, 85, 128, + 11, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 11, 128, + 0, 0, 0, 128, 10, 0, + 164, 160, 1, 0, 164, 128, + 4, 0, 0, 4, 0, 0, + 7, 128, 0, 0, 170, 128, + 12, 0, 228, 160, 0, 0, + 244, 128, 5, 0, 0, 3, + 1, 0, 7, 224, 0, 0, + 228, 128, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 23, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 14, 0, + 228, 160, 11, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 0, 128, 25, 0, 0, 160, + 10, 0, 0, 3, 1, 0, + 8, 224, 0, 0, 0, 128, + 25, 0, 85, 160, 5, 0, + 0, 3, 0, 0, 7, 128, + 2, 0, 85, 128, 8, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 128, 2, 0, + 0, 128, 7, 0, 228, 160, + 0, 0, 228, 128, 4, 0, + 0, 4, 0, 0, 7, 128, + 2, 0, 170, 128, 9, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 1, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 7, 128, 0, 0, 228, 128, + 1, 0, 228, 128, 2, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 7, 224, 0, 0, + 228, 128, 3, 0, 228, 144, + 5, 0, 0, 3, 0, 0, + 8, 224, 3, 0, 255, 144, + 1, 0, 255, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 21, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 22, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 24, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 2, 0, + 3, 224, 2, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 64, 7, 0, 0, + 64, 0, 1, 0, 208, 1, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 3, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 2, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 6, 0, 0, 0, + 16, 0, 0, 8, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 19, 0, + 0, 0, 16, 0, 0, 8, + 34, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 16, 0, + 0, 8, 66, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 21, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 9, 18, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 9, 34, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 9, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 29, 0, + 0, 10, 114, 0, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 10, + 114, 0, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 4, 0, 0, 0, 86, 5, + 16, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 7, 0, 0, 0, + 50, 0, 0, 10, 178, 0, + 16, 0, 3, 0, 0, 0, + 6, 0, 16, 0, 3, 0, + 0, 0, 70, 136, 32, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 70, 8, 16, 0, + 4, 0, 0, 0, 50, 0, + 0, 10, 114, 0, 16, 0, + 3, 0, 0, 0, 166, 10, + 16, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 8, 0, 0, 0, + 70, 3, 16, 0, 3, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 18, 16, 0, 3, 0, + 0, 0, 56, 0, 0, 8, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 3, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 16, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, + 0, 9, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 128, 65, 0, 0, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 4, 0, 0, 0, + 246, 15, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 5, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 16, 0, + 0, 7, 34, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 66, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 52, 0, + 0, 10, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 47, 0, 0, 5, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 246, 143, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 25, 0, + 0, 5, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 1, 0, 0, 0, 86, 5, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 10, 0, 0, 0, + 50, 0, 0, 10, 178, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 136, 32, 0, + 0, 0, 0, 0, 9, 0, + 0, 0, 70, 8, 16, 0, + 1, 0, 0, 0, 50, 0, + 0, 10, 114, 0, 16, 0, + 0, 0, 0, 0, 166, 10, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 11, 0, 0, 0, + 70, 3, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 32, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 2, 0, 0, 0, + 70, 16, 16, 0, 2, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 140, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 123, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 132, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 15, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 67, 79, + 76, 79, 82, 0, 171, 171, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 110, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVc.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e4de4303a605437dec42a5ff7a6793382aa8fdf1 GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVcBn.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVcBn.inc new file mode 100644 index 0000000..561cf92 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVcBn.inc @@ -0,0 +1,1112 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TEXCOORD 0 xy 2 NONE float xy +// COLOR 0 xyzw 3 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// SV_Position 0 xyzw 3 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 13 ( FLT, FLT, FLT, FLT) +// c14 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c18 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c25, 2, -1, 0, 1 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8> + dcl_texcoord3 v3 // vin<9,10,11,12> + +#line 57 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::pos_ws<0> + dp4 r0.y, v0, c16 // ::pos_ws<1> + dp4 r0.z, v0, c17 // ::pos_ws<2> + add r0.xyz, -r0, c13 + nrm r1.xyz, r0 // ::eyeVector<0,1,2> + +#line 33 + add r0.xyz, r1, -c4 + nrm r2.xyz, r0 // ::halfVectors<0,1,2> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c25.x, c25.y // ::BiasX2<0,1,2> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r3.x, r0, c18 + dp3 r3.y, r0, c19 + dp3 r3.z, r0, c20 + nrm r0.xyz, r3 // ::worldNormal<0,1,2> + +#line 37 + dp3 r2.x, r2, r0 // ::dotH<0> + +#line 33 + add r3.xyz, r1, -c5 + add r1.xyz, r1, -c6 + nrm r4.xyz, r1 // ::halfVectors<6,7,8> + +#line 37 + dp3 r2.z, r4, r0 // ::dotH<2> + +#line 33 + nrm r1.xyz, r3 // ::halfVectors<3,4,5> + +#line 37 + dp3 r2.y, r1, r0 // ::dotH<1> + +#line 42 + max r1.xyz, r2, c25.z + +#line 36 + dp3 r2.x, -c4, r0 // ::dotL<0> + dp3 r2.y, -c5, r0 // ::dotL<1> + dp3 r2.z, -c6, r0 // ::dotL<2> + +#line 39 + sge r0.xyz, r2, c25.z // ::zeroL<0,1,2> + +#line 42 + mul r1.xyz, r0, r1 + mul r0.xyz, r2, r0 // ::diffuse<0,1,2> + log r3.x, r1.x + log r3.y, r1.y + log r3.z, r1.z + mul r1.xyz, r3, c3.w + exp r3.x, r1.x + exp r3.y, r1.y + exp r3.z, r1.z + mul r1.xyz, r2, r3 // ::specular<0,1,2> + +#line 47 + mul r2.xyz, r1.y, c11 + mad r1.xyw, r1.x, c10.xyzz, r2.xyzz + mad r1.xyz, r1.z, c12, r1.xyww + mul oT1.xyz, r1, c3 // ::VSBasicVertexLightingTxVcBn<4,5,6> + +#line 63 + dp4 oPos.z, v0, c23 // ::VSBasicVertexLightingTxVcBn<12> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.w, v0, c14 + max r0.w, r0.w, c25.z + min oT1.w, r0.w, c25.w // ::VSBasicVertexLightingTxVcBn<7> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mul r1.xyz, r0.y, c8 + mad r0.xyw, r0.x, c7.xyzz, r1.xyzz + mad r0.xyz, r0.z, c9, r0.xyww + mov r1.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad r0.xyz, r0, r1, c2 // ::result<0,1,2> + +#line 257 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.xyz, r0, v3 // ::VSBasicVertexLightingTxVcBn<0,1,2> + mul oT0.w, v3.w, c1.w // ::VSBasicVertexLightingTxVcBn<3> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c21 // ::vout<0> + dp4 r0.y, v0, c22 // ::vout<1> + dp4 r0.z, v0, c24 // ::vout<3> + +#line 247 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVertexLightingTxVcBn<10,11> + mov oPos.w, r0.z // ::VSBasicVertexLightingTxVcBn<13> + +#line 256 + mov oT2.xy, v2 // ::VSBasicVertexLightingTxVcBn<8,9> + +// approximately 65 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xy +dcl_input v3.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output_siv o3.xyzw, position +dcl_temps 6 +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, r1.xyzx +dp3 r1.x, -cb0[3].xyzx, r0.xyzx +dp3 r1.y, -cb0[4].xyzx, r0.xyzx +dp3 r1.z, -cb0[5].xyzx, r0.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r3.xyz, r1.xyzx, r2.xyzx +mul r4.xyz, r3.yyyy, cb0[7].xyzx +mad r3.xyw, r3.xxxx, cb0[6].xyxz, r4.xyxz +mad r3.xyz, r3.zzzz, cb0[8].xyzx, r3.xywx +mad r3.xyz, r3.xyzx, cb0[0].xyzx, cb0[1].xyzx +mul o0.xyz, r3.xyzx, v3.xyzx +mul o0.w, v3.w, cb0[0].w +dp4 r3.x, v0.xyzw, cb0[15].xyzw +dp4 r3.y, v0.xyzw, cb0[16].xyzw +dp4 r3.z, v0.xyzw, cb0[17].xyzw +add r3.xyz, -r3.xyzx, cb0[12].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mad r4.xyz, r3.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r4.xyzx, r4.xyzx +rsq r1.w, r1.w +mul r4.xyz, r1.wwww, r4.xyzx +dp3 r4.x, r4.xyzx, r0.xyzx +mad r5.xyz, r3.xyzx, r0.wwww, -cb0[4].xyzx +mad r3.xyz, r3.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r5.xyzx, r5.xyzx +rsq r0.w, r0.w +mul r5.xyz, r0.wwww, r5.xyzx +dp3 r4.y, r5.xyzx, r0.xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r4.z, r3.xyzx, r0.xyzx +max r0.xyz, r4.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +mul r0.xyz, r2.xyzx, r0.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +mov o2.xy, v2.xyxx +dp4 o3.x, v0.xyzw, cb0[22].xyzw +dp4 o3.y, v0.xyzw, cb0[23].xyzw +dp4 o3.z, v0.xyzw, cb0[24].xyzw +dp4 o3.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVertexLightingTxVcBn[] = +{ + 68, 88, 66, 67, 244, 64, + 111, 42, 134, 132, 115, 134, + 16, 144, 41, 127, 203, 129, + 202, 123, 1, 0, 0, 0, + 216, 20, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 52, 12, 0, 0, 184, 19, + 0, 0, 76, 20, 0, 0, + 65, 111, 110, 57, 252, 11, + 0, 0, 252, 11, 0, 0, + 0, 2, 254, 255, 176, 11, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 13, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 2, 2, 68, 66, 85, 71, + 40, 0, 0, 0, 220, 7, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 60, 0, 0, 0, + 20, 1, 0, 0, 15, 0, + 0, 0, 176, 6, 0, 0, + 76, 3, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 16, 8, + 0, 0, 0, 0, 255, 255, + 40, 8, 0, 0, 0, 0, + 255, 255, 52, 8, 0, 0, + 0, 0, 255, 255, 64, 8, + 0, 0, 0, 0, 255, 255, + 76, 8, 0, 0, 57, 0, + 0, 0, 88, 8, 0, 0, + 57, 0, 0, 0, 104, 8, + 0, 0, 57, 0, 0, 0, + 120, 8, 0, 0, 58, 0, + 0, 0, 136, 8, 0, 0, + 58, 0, 0, 0, 152, 8, + 0, 0, 33, 0, 0, 0, + 164, 8, 0, 0, 33, 0, + 0, 0, 180, 8, 0, 0, + 32, 0, 1, 0, 192, 8, + 0, 0, 59, 0, 0, 0, + 212, 8, 0, 0, 59, 0, + 0, 0, 228, 8, 0, 0, + 59, 0, 0, 0, 244, 8, + 0, 0, 59, 0, 0, 0, + 4, 9, 0, 0, 37, 0, + 0, 0, 16, 9, 0, 0, + 33, 0, 0, 0, 32, 9, + 0, 0, 33, 0, 0, 0, + 48, 9, 0, 0, 33, 0, + 0, 0, 64, 9, 0, 0, + 37, 0, 0, 0, 76, 9, + 0, 0, 33, 0, 0, 0, + 92, 9, 0, 0, 37, 0, + 0, 0, 104, 9, 0, 0, + 42, 0, 0, 0, 120, 9, + 0, 0, 36, 0, 0, 0, + 136, 9, 0, 0, 36, 0, + 0, 0, 152, 9, 0, 0, + 36, 0, 0, 0, 168, 9, + 0, 0, 39, 0, 0, 0, + 184, 9, 0, 0, 42, 0, + 0, 0, 200, 9, 0, 0, + 41, 0, 0, 0, 216, 9, + 0, 0, 42, 0, 0, 0, + 232, 9, 0, 0, 42, 0, + 0, 0, 244, 9, 0, 0, + 42, 0, 0, 0, 0, 10, + 0, 0, 42, 0, 0, 0, + 12, 10, 0, 0, 42, 0, + 0, 0, 28, 10, 0, 0, + 42, 0, 0, 0, 40, 10, + 0, 0, 42, 0, 0, 0, + 52, 10, 0, 0, 42, 0, + 0, 0, 64, 10, 0, 0, + 47, 0, 0, 0, 80, 10, + 0, 0, 47, 0, 0, 0, + 96, 10, 0, 0, 47, 0, + 0, 0, 116, 10, 0, 0, + 47, 0, 0, 0, 136, 10, + 0, 0, 63, 0, 0, 0, + 152, 10, 0, 0, 14, 0, + 1, 0, 168, 10, 0, 0, + 14, 0, 1, 0, 184, 10, + 0, 0, 14, 0, 1, 0, + 200, 10, 0, 0, 46, 0, + 0, 0, 216, 10, 0, 0, + 46, 0, 0, 0, 232, 10, + 0, 0, 46, 0, 0, 0, + 252, 10, 0, 0, 46, 0, + 0, 0, 16, 11, 0, 0, + 46, 0, 0, 0, 28, 11, + 0, 0, 1, 1, 2, 0, + 48, 11, 0, 0, 1, 1, + 2, 0, 64, 11, 0, 0, + 63, 0, 0, 0, 80, 11, + 0, 0, 63, 0, 0, 0, + 96, 11, 0, 0, 63, 0, + 0, 0, 112, 11, 0, 0, + 247, 0, 2, 0, 128, 11, + 0, 0, 247, 0, 2, 0, + 148, 11, 0, 0, 0, 1, + 2, 0, 160, 11, 0, 0, + 66, 105, 97, 115, 88, 50, + 0, 171, 1, 0, 3, 0, + 1, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 80, 97, 114, 97, 109, 101, + 116, 101, 114, 115, 0, 68, + 105, 102, 102, 117, 115, 101, + 67, 111, 108, 111, 114, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 50, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 86, 83, + 66, 97, 115, 105, 99, 86, + 101, 114, 116, 101, 120, 76, + 105, 103, 104, 116, 105, 110, + 103, 84, 120, 86, 99, 66, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 112, 101, 99, + 117, 108, 97, 114, 0, 84, + 101, 120, 67, 111, 111, 114, + 100, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 80, 83, + 0, 171, 104, 3, 0, 0, + 112, 3, 0, 0, 128, 3, + 0, 0, 112, 3, 0, 0, + 137, 3, 0, 0, 148, 3, + 0, 0, 164, 3, 0, 0, + 112, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 14, 0, + 1, 0, 4, 0, 176, 3, + 0, 0, 42, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 43, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 46, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 7, 0, 52, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 53, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 57, 0, 0, 0, + 10, 0, 11, 0, 255, 255, + 255, 255, 58, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 13, 0, 59, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 100, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 100, 111, 116, 72, + 0, 171, 171, 171, 17, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 21, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 23, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 100, 111, + 116, 76, 0, 171, 171, 171, + 25, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 26, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 27, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 101, 121, 101, 86, 101, 99, + 116, 111, 114, 0, 171, 171, + 9, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 104, 97, 108, 102, 86, 101, + 99, 116, 111, 114, 115, 0, + 3, 0, 3, 0, 3, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 20, 0, + 0, 0, 6, 0, 7, 0, + 8, 0, 255, 255, 22, 0, + 0, 0, 3, 0, 4, 0, + 5, 0, 255, 255, 112, 111, + 115, 95, 119, 115, 0, 171, + 5, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 6, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 7, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 114, 101, 115, 117, 108, 116, + 0, 171, 104, 3, 0, 0, + 72, 4, 0, 0, 128, 3, + 0, 0, 72, 4, 0, 0, + 5, 0, 0, 0, 1, 0, + 6, 0, 1, 0, 2, 0, + 72, 5, 0, 0, 51, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 115, 112, + 101, 99, 117, 108, 97, 114, + 0, 171, 171, 171, 38, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 118, 105, + 110, 0, 80, 111, 115, 105, + 116, 105, 111, 110, 0, 78, + 111, 114, 109, 97, 108, 0, + 67, 111, 108, 111, 114, 0, + 171, 171, 144, 5, 0, 0, + 112, 3, 0, 0, 153, 5, + 0, 0, 72, 4, 0, 0, + 137, 3, 0, 0, 148, 3, + 0, 0, 160, 5, 0, 0, + 112, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 13, 0, + 1, 0, 4, 0, 168, 5, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 255, 255, + 255, 255, 4, 0, 0, 0, + 9, 0, 10, 0, 11, 0, + 12, 0, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 70, 111, 103, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 13, 6, 0, 0, 112, 3, + 0, 0, 104, 3, 0, 0, + 112, 3, 0, 0, 128, 3, + 0, 0, 72, 4, 0, 0, + 20, 6, 0, 0, 32, 6, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 4, 0, 48, 6, 0, 0, + 54, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 55, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 56, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 97, 108, 0, + 16, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 122, 101, 114, 111, 76, 0, + 171, 171, 28, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 0, 0, 0, 0, + 244, 2, 0, 0, 252, 2, + 0, 0, 1, 0, 0, 0, + 12, 3, 0, 0, 24, 3, + 0, 0, 35, 3, 0, 0, + 48, 3, 0, 0, 1, 0, + 0, 0, 64, 3, 0, 0, + 0, 0, 0, 0, 76, 3, + 0, 0, 208, 3, 0, 0, + 8, 0, 0, 0, 224, 3, + 0, 0, 0, 0, 0, 0, + 64, 4, 0, 0, 72, 4, + 0, 0, 1, 0, 0, 0, + 88, 4, 0, 0, 0, 0, + 0, 0, 100, 4, 0, 0, + 72, 4, 0, 0, 3, 0, + 0, 0, 108, 4, 0, 0, + 0, 0, 0, 0, 144, 4, + 0, 0, 72, 4, 0, 0, + 3, 0, 0, 0, 152, 4, + 0, 0, 0, 0, 0, 0, + 188, 4, 0, 0, 72, 4, + 0, 0, 1, 0, 0, 0, + 200, 4, 0, 0, 0, 0, + 0, 0, 212, 4, 0, 0, + 224, 4, 0, 0, 3, 0, + 0, 0, 240, 4, 0, 0, + 0, 0, 0, 0, 20, 5, + 0, 0, 112, 3, 0, 0, + 3, 0, 0, 0, 28, 5, + 0, 0, 0, 0, 0, 0, + 64, 5, 0, 0, 88, 5, + 0, 0, 1, 0, 0, 0, + 104, 5, 0, 0, 0, 0, + 0, 0, 116, 5, 0, 0, + 72, 4, 0, 0, 1, 0, + 0, 0, 128, 5, 0, 0, + 76, 3, 0, 0, 140, 5, + 0, 0, 200, 5, 0, 0, + 4, 0, 0, 0, 216, 5, + 0, 0, 0, 0, 0, 0, + 8, 6, 0, 0, 80, 6, + 0, 0, 3, 0, 0, 0, + 96, 6, 0, 0, 0, 0, + 0, 0, 132, 6, 0, 0, + 72, 4, 0, 0, 1, 0, + 0, 0, 144, 6, 0, 0, + 0, 0, 0, 0, 156, 6, + 0, 0, 72, 4, 0, 0, + 1, 0, 0, 0, 164, 6, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 25, 0, + 15, 160, 0, 0, 0, 64, + 0, 0, 128, 191, 0, 0, + 0, 0, 0, 0, 128, 63, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 3, 128, 3, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 15, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 16, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 17, 0, 228, 160, + 2, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 228, 129, + 13, 0, 228, 160, 36, 0, + 0, 2, 1, 0, 7, 128, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 7, 128, + 1, 0, 228, 128, 4, 0, + 228, 161, 36, 0, 0, 2, + 2, 0, 7, 128, 0, 0, + 228, 128, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 144, 25, 0, 0, 160, + 25, 0, 85, 160, 8, 0, + 0, 3, 3, 0, 1, 128, + 0, 0, 228, 128, 18, 0, + 228, 160, 8, 0, 0, 3, + 3, 0, 2, 128, 0, 0, + 228, 128, 19, 0, 228, 160, + 8, 0, 0, 3, 3, 0, + 4, 128, 0, 0, 228, 128, + 20, 0, 228, 160, 36, 0, + 0, 2, 0, 0, 7, 128, + 3, 0, 228, 128, 8, 0, + 0, 3, 2, 0, 1, 128, + 2, 0, 228, 128, 0, 0, + 228, 128, 2, 0, 0, 3, + 3, 0, 7, 128, 1, 0, + 228, 128, 5, 0, 228, 161, + 2, 0, 0, 3, 1, 0, + 7, 128, 1, 0, 228, 128, + 6, 0, 228, 161, 36, 0, + 0, 2, 4, 0, 7, 128, + 1, 0, 228, 128, 8, 0, + 0, 3, 2, 0, 4, 128, + 4, 0, 228, 128, 0, 0, + 228, 128, 36, 0, 0, 2, + 1, 0, 7, 128, 3, 0, + 228, 128, 8, 0, 0, 3, + 2, 0, 2, 128, 1, 0, + 228, 128, 0, 0, 228, 128, + 11, 0, 0, 3, 1, 0, + 7, 128, 2, 0, 228, 128, + 25, 0, 170, 160, 8, 0, + 0, 3, 2, 0, 1, 128, + 4, 0, 228, 161, 0, 0, + 228, 128, 8, 0, 0, 3, + 2, 0, 2, 128, 5, 0, + 228, 161, 0, 0, 228, 128, + 8, 0, 0, 3, 2, 0, + 4, 128, 6, 0, 228, 161, + 0, 0, 228, 128, 13, 0, + 0, 3, 0, 0, 7, 128, + 2, 0, 228, 128, 25, 0, + 170, 160, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 228, 128, 1, 0, 228, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 2, 0, 228, 128, + 0, 0, 228, 128, 15, 0, + 0, 2, 3, 0, 1, 128, + 1, 0, 0, 128, 15, 0, + 0, 2, 3, 0, 2, 128, + 1, 0, 85, 128, 15, 0, + 0, 2, 3, 0, 4, 128, + 1, 0, 170, 128, 5, 0, + 0, 3, 1, 0, 7, 128, + 3, 0, 228, 128, 3, 0, + 255, 160, 14, 0, 0, 2, + 3, 0, 1, 128, 1, 0, + 0, 128, 14, 0, 0, 2, + 3, 0, 2, 128, 1, 0, + 85, 128, 14, 0, 0, 2, + 3, 0, 4, 128, 1, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 2, 0, + 228, 128, 3, 0, 228, 128, + 5, 0, 0, 3, 2, 0, + 7, 128, 1, 0, 85, 128, + 11, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 11, 128, + 1, 0, 0, 128, 10, 0, + 164, 160, 2, 0, 164, 128, + 4, 0, 0, 4, 1, 0, + 7, 128, 1, 0, 170, 128, + 12, 0, 228, 160, 1, 0, + 244, 128, 5, 0, 0, 3, + 1, 0, 7, 224, 1, 0, + 228, 128, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 23, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 8, 128, + 0, 0, 228, 144, 14, 0, + 228, 160, 11, 0, 0, 3, + 0, 0, 8, 128, 0, 0, + 255, 128, 25, 0, 170, 160, + 10, 0, 0, 3, 1, 0, + 8, 224, 0, 0, 255, 128, + 25, 0, 255, 160, 5, 0, + 0, 3, 1, 0, 7, 128, + 0, 0, 85, 128, 8, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 11, 128, 0, 0, + 0, 128, 7, 0, 164, 160, + 1, 0, 164, 128, 4, 0, + 0, 4, 0, 0, 7, 128, + 0, 0, 170, 128, 9, 0, + 228, 160, 0, 0, 244, 128, + 1, 0, 0, 2, 1, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 7, 128, 0, 0, 228, 128, + 1, 0, 228, 128, 2, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 7, 224, 0, 0, + 228, 128, 3, 0, 228, 144, + 5, 0, 0, 3, 0, 0, + 8, 224, 3, 0, 255, 144, + 1, 0, 255, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 21, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 22, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 24, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 2, 0, + 3, 224, 2, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 124, 7, 0, 0, + 64, 0, 1, 0, 223, 1, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 3, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 101, 0, 0, 3, 50, 32, + 16, 0, 2, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 6, 0, 0, 0, + 50, 0, 0, 15, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 64, 0, 0, + 0, 64, 0, 0, 0, 64, + 0, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 191, + 0, 0, 128, 191, 0, 0, + 128, 191, 0, 0, 0, 0, + 16, 0, 0, 8, 18, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 19, 0, + 0, 0, 16, 0, 0, 8, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 16, 0, + 0, 8, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 21, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 9, 18, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 9, 34, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 9, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 29, 0, + 0, 10, 114, 0, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 10, + 114, 0, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 4, 0, 0, 0, 86, 5, + 16, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 7, 0, 0, 0, + 50, 0, 0, 10, 178, 0, + 16, 0, 3, 0, 0, 0, + 6, 0, 16, 0, 3, 0, + 0, 0, 70, 136, 32, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 70, 8, 16, 0, + 4, 0, 0, 0, 50, 0, + 0, 10, 114, 0, 16, 0, + 3, 0, 0, 0, 166, 10, + 16, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 8, 0, 0, 0, + 70, 3, 16, 0, 3, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 18, 16, 0, 3, 0, + 0, 0, 56, 0, 0, 8, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 3, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 16, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, + 0, 9, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 128, 65, 0, 0, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 4, 0, 0, 0, + 246, 15, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 5, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 16, 0, + 0, 7, 34, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 66, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 52, 0, + 0, 10, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 47, 0, 0, 5, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 246, 143, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 25, 0, + 0, 5, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 1, 0, 0, 0, 86, 5, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 10, 0, 0, 0, + 50, 0, 0, 10, 178, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 136, 32, 0, + 0, 0, 0, 0, 9, 0, + 0, 0, 70, 8, 16, 0, + 1, 0, 0, 0, 50, 0, + 0, 10, 114, 0, 16, 0, + 0, 0, 0, 0, 166, 10, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 11, 0, 0, 0, + 70, 3, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 32, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 54, 0, 0, 5, 50, 32, + 16, 0, 2, 0, 0, 0, + 70, 16, 16, 0, 2, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 140, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 123, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 132, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 15, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 67, 79, + 76, 79, 82, 0, 171, 171, + 79, 83, 71, 78, 132, 0, + 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 104, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 110, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 119, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 0, 0, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 83, 86, 95, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVcBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingTxVcBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d0cb2556d463b5e444f4504d37d2fde41b835624 GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVc.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVc.inc new file mode 100644 index 0000000..f343ea0 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVc.inc @@ -0,0 +1,1038 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// COLOR 0 xyzw 2 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// SV_Position 0 xyzw 2 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 13 ( FLT, FLT, FLT, FLT) +// c14 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c18 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c25, 0, 1, 0, 0 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8,9,10> + +#line 57 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::pos_ws<0> + dp4 r0.y, v0, c16 // ::pos_ws<1> + dp4 r0.z, v0, c17 // ::pos_ws<2> + add r0.xyz, -r0, c13 + nrm r1.xyz, r0 // ::eyeVector<0,1,2> + +#line 33 + add r0.xyz, r1, -c4 + nrm r2.xyz, r0 // ::halfVectors<0,1,2> + +#line 59 + dp3 r0.x, v1, c18 + dp3 r0.y, v1, c19 + dp3 r0.z, v1, c20 + nrm r3.xyz, r0 // ::worldNormal<0,1,2> + +#line 37 + dp3 r0.x, r2, r3 // ::dotH<0> + +#line 33 + add r2.xyz, r1, -c5 + add r1.xyz, r1, -c6 + nrm r4.xyz, r1 // ::halfVectors<6,7,8> + +#line 37 + dp3 r0.z, r4, r3 // ::dotH<2> + +#line 33 + nrm r1.xyz, r2 // ::halfVectors<3,4,5> + +#line 37 + dp3 r0.y, r1, r3 // ::dotH<1> + +#line 42 + max r0.xyz, r0, c25.x + +#line 36 + dp3 r1.x, -c4, r3 // ::dotL<0> + dp3 r1.y, -c5, r3 // ::dotL<1> + dp3 r1.z, -c6, r3 // ::dotL<2> + +#line 39 + sge r2.xyz, r1, c25.x // ::zeroL<0,1,2> + +#line 42 + mul r0.xyz, r0, r2 + mul r2.xyz, r1, r2 // ::diffuse<0,1,2> + log r3.x, r0.x + log r3.y, r0.y + log r3.z, r0.z + mul r0.xyz, r3, c3.w + exp r3.x, r0.x + exp r3.y, r0.y + exp r3.z, r0.z + mul r0.xyz, r1, r3 // ::specular<0,1,2> + +#line 47 + mul r1.xyz, r0.y, c11 + mad r0.xyw, r0.x, c10.xyzz, r1.xyzz + mad r0.xyz, r0.z, c12, r0.xyww + mul oT1.xyz, r0, c3 // ::VSBasicVertexLightingVc<4,5,6> + +#line 63 + dp4 oPos.z, v0, c23 // ::VSBasicVertexLightingVc<10> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.x, v0, c14 + max r0.x, r0.x, c25.x + min oT1.w, r0.x, c25.y // ::VSBasicVertexLightingVc<7> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mul r0.xyz, r2.y, c8 + mad r0.xyz, r2.x, c7, r0 + mad r0.xyz, r2.z, c9, r0 + mov r1.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad r0.xyz, r0, r1, c2 // ::result<0,1,2> + +#line 185 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.xyz, r0, v2 // ::VSBasicVertexLightingVc<0,1,2> + mul oT0.w, v2.w, c1.w // ::VSBasicVertexLightingVc<3> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c21 // ::vout<0> + dp4 r0.y, v0, c22 // ::vout<1> + dp4 r0.z, v0, c24 // ::vout<3> + +#line 178 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVertexLightingVc<8,9> + mov oPos.w, r0.z // ::VSBasicVertexLightingVc<11> + +// approximately 63 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +dcl_temps 6 +dp3 r0.x, v1.xyzx, cb0[19].xyzx +dp3 r0.y, v1.xyzx, cb0[20].xyzx +dp3 r0.z, v1.xyzx, cb0[21].xyzx +dp3 r0.w, r0.xyzx, r0.xyzx +rsq r0.w, r0.w +mul r0.xyz, r0.wwww, r0.xyzx +dp3 r1.x, -cb0[3].xyzx, r0.xyzx +dp3 r1.y, -cb0[4].xyzx, r0.xyzx +dp3 r1.z, -cb0[5].xyzx, r0.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r3.xyz, r1.xyzx, r2.xyzx +mul r4.xyz, r3.yyyy, cb0[7].xyzx +mad r3.xyw, r3.xxxx, cb0[6].xyxz, r4.xyxz +mad r3.xyz, r3.zzzz, cb0[8].xyzx, r3.xywx +mad r3.xyz, r3.xyzx, cb0[0].xyzx, cb0[1].xyzx +mul o0.xyz, r3.xyzx, v2.xyzx +mul o0.w, v2.w, cb0[0].w +dp4 r3.x, v0.xyzw, cb0[15].xyzw +dp4 r3.y, v0.xyzw, cb0[16].xyzw +dp4 r3.z, v0.xyzw, cb0[17].xyzw +add r3.xyz, -r3.xyzx, cb0[12].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mad r4.xyz, r3.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r4.xyzx, r4.xyzx +rsq r1.w, r1.w +mul r4.xyz, r1.wwww, r4.xyzx +dp3 r4.x, r4.xyzx, r0.xyzx +mad r5.xyz, r3.xyzx, r0.wwww, -cb0[4].xyzx +mad r3.xyz, r3.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r5.xyzx, r5.xyzx +rsq r0.w, r0.w +mul r5.xyz, r0.wwww, r5.xyzx +dp3 r4.y, r5.xyzx, r0.xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r4.z, r3.xyzx, r0.xyzx +max r0.xyz, r4.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +mul r0.xyz, r2.xyzx, r0.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVertexLightingVc[] = +{ + 68, 88, 66, 67, 106, 127, + 31, 5, 161, 155, 197, 64, + 71, 191, 91, 75, 206, 81, + 194, 93, 1, 0, 0, 0, + 108, 19, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 112, 11, 0, 0, 140, 18, + 0, 0, 0, 19, 0, 0, + 65, 111, 110, 57, 56, 11, + 0, 0, 56, 11, 0, 0, + 0, 2, 254, 255, 236, 10, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 13, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 220, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 68, 7, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 57, 0, 0, 0, + 20, 1, 0, 0, 14, 0, + 0, 0, 44, 6, 0, 0, + 16, 3, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 120, 7, + 0, 0, 0, 0, 255, 255, + 144, 7, 0, 0, 0, 0, + 255, 255, 156, 7, 0, 0, + 0, 0, 255, 255, 168, 7, + 0, 0, 57, 0, 0, 0, + 180, 7, 0, 0, 57, 0, + 0, 0, 196, 7, 0, 0, + 57, 0, 0, 0, 212, 7, + 0, 0, 58, 0, 0, 0, + 228, 7, 0, 0, 58, 0, + 0, 0, 244, 7, 0, 0, + 33, 0, 0, 0, 0, 8, + 0, 0, 33, 0, 0, 0, + 16, 8, 0, 0, 59, 0, + 0, 0, 28, 8, 0, 0, + 59, 0, 0, 0, 44, 8, + 0, 0, 59, 0, 0, 0, + 60, 8, 0, 0, 59, 0, + 0, 0, 76, 8, 0, 0, + 37, 0, 0, 0, 88, 8, + 0, 0, 33, 0, 0, 0, + 104, 8, 0, 0, 33, 0, + 0, 0, 120, 8, 0, 0, + 33, 0, 0, 0, 136, 8, + 0, 0, 37, 0, 0, 0, + 148, 8, 0, 0, 33, 0, + 0, 0, 164, 8, 0, 0, + 37, 0, 0, 0, 176, 8, + 0, 0, 42, 0, 0, 0, + 192, 8, 0, 0, 36, 0, + 0, 0, 208, 8, 0, 0, + 36, 0, 0, 0, 224, 8, + 0, 0, 36, 0, 0, 0, + 240, 8, 0, 0, 39, 0, + 0, 0, 0, 9, 0, 0, + 42, 0, 0, 0, 16, 9, + 0, 0, 41, 0, 0, 0, + 32, 9, 0, 0, 42, 0, + 0, 0, 48, 9, 0, 0, + 42, 0, 0, 0, 60, 9, + 0, 0, 42, 0, 0, 0, + 72, 9, 0, 0, 42, 0, + 0, 0, 84, 9, 0, 0, + 42, 0, 0, 0, 100, 9, + 0, 0, 42, 0, 0, 0, + 112, 9, 0, 0, 42, 0, + 0, 0, 124, 9, 0, 0, + 42, 0, 0, 0, 136, 9, + 0, 0, 47, 0, 0, 0, + 152, 9, 0, 0, 47, 0, + 0, 0, 168, 9, 0, 0, + 47, 0, 0, 0, 188, 9, + 0, 0, 47, 0, 0, 0, + 208, 9, 0, 0, 63, 0, + 0, 0, 224, 9, 0, 0, + 14, 0, 1, 0, 240, 9, + 0, 0, 14, 0, 1, 0, + 0, 10, 0, 0, 14, 0, + 1, 0, 16, 10, 0, 0, + 46, 0, 0, 0, 32, 10, + 0, 0, 46, 0, 0, 0, + 48, 10, 0, 0, 46, 0, + 0, 0, 68, 10, 0, 0, + 46, 0, 0, 0, 88, 10, + 0, 0, 46, 0, 0, 0, + 100, 10, 0, 0, 185, 0, + 2, 0, 120, 10, 0, 0, + 185, 0, 2, 0, 136, 10, + 0, 0, 63, 0, 0, 0, + 152, 10, 0, 0, 63, 0, + 0, 0, 168, 10, 0, 0, + 63, 0, 0, 0, 184, 10, + 0, 0, 178, 0, 2, 0, + 200, 10, 0, 0, 178, 0, + 2, 0, 220, 10, 0, 0, + 80, 97, 114, 97, 109, 101, + 116, 101, 114, 115, 0, 68, + 105, 102, 102, 117, 115, 101, + 67, 111, 108, 111, 114, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 86, 83, + 66, 97, 115, 105, 99, 86, + 101, 114, 116, 101, 120, 76, + 105, 103, 104, 116, 105, 110, + 103, 86, 99, 0, 68, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 80, 111, 115, 105, 116, + 105, 111, 110, 80, 83, 0, + 40, 3, 0, 0, 48, 3, + 0, 0, 64, 3, 0, 0, + 48, 3, 0, 0, 73, 3, + 0, 0, 48, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 3, 0, + 84, 3, 0, 0, 40, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 41, 0, + 0, 0, 255, 255, 255, 255, + 10, 0, 255, 255, 44, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 50, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 51, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 55, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 56, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 11, 0, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 28, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 15, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 19, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 21, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 100, 111, 116, 76, 0, 171, + 171, 171, 23, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 24, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 25, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 101, 121, 101, 86, + 101, 99, 116, 111, 114, 0, + 171, 171, 8, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 18, 0, 0, 0, 6, 0, + 7, 0, 8, 0, 255, 255, + 20, 0, 0, 0, 3, 0, + 4, 0, 5, 0, 255, 255, + 112, 111, 115, 95, 119, 115, + 0, 171, 4, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 5, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 6, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 114, 101, 115, 117, + 108, 116, 0, 171, 40, 3, + 0, 0, 216, 3, 0, 0, + 64, 3, 0, 0, 216, 3, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 216, 4, 0, 0, + 49, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 115, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 36, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 78, 111, 114, 109, 97, + 108, 0, 67, 111, 108, 111, + 114, 0, 171, 171, 32, 5, + 0, 0, 48, 3, 0, 0, + 41, 5, 0, 0, 216, 3, + 0, 0, 48, 5, 0, 0, + 48, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 11, 0, + 1, 0, 3, 0, 56, 5, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 9, 0, + 10, 0, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 70, 111, 103, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 137, 5, 0, 0, 48, 3, + 0, 0, 40, 3, 0, 0, + 48, 3, 0, 0, 64, 3, + 0, 0, 216, 3, 0, 0, + 144, 5, 0, 0, 156, 5, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 4, 0, 172, 5, 0, 0, + 52, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 53, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 54, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 97, 108, 0, + 14, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 122, 101, 114, 111, 76, 0, + 171, 171, 26, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 220, 2, 0, 0, + 231, 2, 0, 0, 244, 2, + 0, 0, 1, 0, 0, 0, + 4, 3, 0, 0, 0, 0, + 0, 0, 16, 3, 0, 0, + 108, 3, 0, 0, 7, 0, + 0, 0, 124, 3, 0, 0, + 0, 0, 0, 0, 208, 3, + 0, 0, 216, 3, 0, 0, + 1, 0, 0, 0, 232, 3, + 0, 0, 0, 0, 0, 0, + 244, 3, 0, 0, 216, 3, + 0, 0, 3, 0, 0, 0, + 252, 3, 0, 0, 0, 0, + 0, 0, 32, 4, 0, 0, + 216, 3, 0, 0, 3, 0, + 0, 0, 40, 4, 0, 0, + 0, 0, 0, 0, 76, 4, + 0, 0, 216, 3, 0, 0, + 1, 0, 0, 0, 88, 4, + 0, 0, 0, 0, 0, 0, + 100, 4, 0, 0, 112, 4, + 0, 0, 3, 0, 0, 0, + 128, 4, 0, 0, 0, 0, + 0, 0, 164, 4, 0, 0, + 48, 3, 0, 0, 3, 0, + 0, 0, 172, 4, 0, 0, + 0, 0, 0, 0, 208, 4, + 0, 0, 232, 4, 0, 0, + 1, 0, 0, 0, 248, 4, + 0, 0, 0, 0, 0, 0, + 4, 5, 0, 0, 216, 3, + 0, 0, 1, 0, 0, 0, + 16, 5, 0, 0, 16, 3, + 0, 0, 28, 5, 0, 0, + 80, 5, 0, 0, 3, 0, + 0, 0, 96, 5, 0, 0, + 0, 0, 0, 0, 132, 5, + 0, 0, 204, 5, 0, 0, + 3, 0, 0, 0, 220, 5, + 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 216, 3, + 0, 0, 1, 0, 0, 0, + 12, 6, 0, 0, 0, 0, + 0, 0, 24, 6, 0, 0, + 216, 3, 0, 0, 1, 0, + 0, 0, 32, 6, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 81, 0, + 0, 5, 25, 0, 15, 160, + 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, + 0, 2, 5, 0, 0, 128, + 0, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 1, 128, + 1, 0, 15, 144, 31, 0, + 0, 2, 5, 0, 2, 128, + 2, 0, 15, 144, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 15, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 16, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 17, 0, 228, 160, 2, 0, + 0, 3, 0, 0, 7, 128, + 0, 0, 228, 129, 13, 0, + 228, 160, 36, 0, 0, 2, + 1, 0, 7, 128, 0, 0, + 228, 128, 2, 0, 0, 3, + 0, 0, 7, 128, 1, 0, + 228, 128, 4, 0, 228, 161, + 36, 0, 0, 2, 2, 0, + 7, 128, 0, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 1, 128, 1, 0, 228, 144, + 18, 0, 228, 160, 8, 0, + 0, 3, 0, 0, 2, 128, + 1, 0, 228, 144, 19, 0, + 228, 160, 8, 0, 0, 3, + 0, 0, 4, 128, 1, 0, + 228, 144, 20, 0, 228, 160, + 36, 0, 0, 2, 3, 0, + 7, 128, 0, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 1, 128, 2, 0, 228, 128, + 3, 0, 228, 128, 2, 0, + 0, 3, 2, 0, 7, 128, + 1, 0, 228, 128, 5, 0, + 228, 161, 2, 0, 0, 3, + 1, 0, 7, 128, 1, 0, + 228, 128, 6, 0, 228, 161, + 36, 0, 0, 2, 4, 0, + 7, 128, 1, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 4, 128, 4, 0, 228, 128, + 3, 0, 228, 128, 36, 0, + 0, 2, 1, 0, 7, 128, + 2, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 2, 128, + 1, 0, 228, 128, 3, 0, + 228, 128, 11, 0, 0, 3, + 0, 0, 7, 128, 0, 0, + 228, 128, 25, 0, 0, 160, + 8, 0, 0, 3, 1, 0, + 1, 128, 4, 0, 228, 161, + 3, 0, 228, 128, 8, 0, + 0, 3, 1, 0, 2, 128, + 5, 0, 228, 161, 3, 0, + 228, 128, 8, 0, 0, 3, + 1, 0, 4, 128, 6, 0, + 228, 161, 3, 0, 228, 128, + 13, 0, 0, 3, 2, 0, + 7, 128, 1, 0, 228, 128, + 25, 0, 0, 160, 5, 0, + 0, 3, 0, 0, 7, 128, + 0, 0, 228, 128, 2, 0, + 228, 128, 5, 0, 0, 3, + 2, 0, 7, 128, 1, 0, + 228, 128, 2, 0, 228, 128, + 15, 0, 0, 2, 3, 0, + 1, 128, 0, 0, 0, 128, + 15, 0, 0, 2, 3, 0, + 2, 128, 0, 0, 85, 128, + 15, 0, 0, 2, 3, 0, + 4, 128, 0, 0, 170, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 3, 0, 228, 128, + 3, 0, 255, 160, 14, 0, + 0, 2, 3, 0, 1, 128, + 0, 0, 0, 128, 14, 0, + 0, 2, 3, 0, 2, 128, + 0, 0, 85, 128, 14, 0, + 0, 2, 3, 0, 4, 128, + 0, 0, 170, 128, 5, 0, + 0, 3, 0, 0, 7, 128, + 1, 0, 228, 128, 3, 0, + 228, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 85, 128, 11, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 11, 128, 0, 0, 0, 128, + 10, 0, 164, 160, 1, 0, + 164, 128, 4, 0, 0, 4, + 0, 0, 7, 128, 0, 0, + 170, 128, 12, 0, 228, 160, + 0, 0, 244, 128, 5, 0, + 0, 3, 1, 0, 7, 224, + 0, 0, 228, 128, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 192, 0, 0, + 228, 144, 23, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 14, 0, 228, 160, 11, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 0, 128, 25, 0, + 0, 160, 10, 0, 0, 3, + 1, 0, 8, 224, 0, 0, + 0, 128, 25, 0, 85, 160, + 5, 0, 0, 3, 0, 0, + 7, 128, 2, 0, 85, 128, + 8, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 7, 128, + 2, 0, 0, 128, 7, 0, + 228, 160, 0, 0, 228, 128, + 4, 0, 0, 4, 0, 0, + 7, 128, 2, 0, 170, 128, + 9, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 1, 0, 7, 128, 1, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 128, 0, 0, + 228, 128, 1, 0, 228, 128, + 2, 0, 228, 160, 5, 0, + 0, 3, 0, 0, 7, 224, + 0, 0, 228, 128, 2, 0, + 228, 144, 5, 0, 0, 3, + 0, 0, 8, 224, 2, 0, + 255, 144, 1, 0, 255, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 21, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 22, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 24, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 20, 7, + 0, 0, 64, 0, 1, 0, + 197, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 26, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 0, 0, + 0, 0, 95, 0, 0, 3, + 114, 16, 16, 0, 1, 0, + 0, 0, 95, 0, 0, 3, + 242, 16, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 103, 0, 0, 4, + 242, 32, 16, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 104, 0, 0, 2, 6, 0, + 0, 0, 16, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 16, 0, + 0, 8, 34, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 20, 0, 0, 0, + 16, 0, 0, 8, 66, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 21, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 18, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 34, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 9, 66, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 29, 0, 0, 10, 114, 0, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 10, 114, 0, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 128, 63, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 4, 0, 0, 0, + 86, 5, 16, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 7, 0, + 0, 0, 50, 0, 0, 10, + 178, 0, 16, 0, 3, 0, + 0, 0, 6, 0, 16, 0, + 3, 0, 0, 0, 70, 136, + 32, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 70, 8, + 16, 0, 4, 0, 0, 0, + 50, 0, 0, 10, 114, 0, + 16, 0, 3, 0, 0, 0, + 166, 10, 16, 0, 3, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 8, 0, + 0, 0, 70, 3, 16, 0, + 3, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 114, 32, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 56, 0, + 0, 8, 130, 32, 16, 0, + 0, 0, 0, 0, 58, 16, + 16, 0, 2, 0, 0, 0, + 58, 128, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 0, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 17, 0, 0, 8, + 34, 0, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 17, 0, + 0, 8, 66, 0, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 17, 0, 0, 0, + 0, 0, 0, 9, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 12, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 1, 0, 0, 0, + 58, 0, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 4, 0, + 0, 0, 246, 15, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 5, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 5, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 16, 0, 0, 7, 34, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 66, 0, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 52, 0, 0, 10, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 47, 0, 0, 5, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 246, 143, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 25, 0, 0, 5, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 1, 0, 0, 0, + 86, 5, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 10, 0, + 0, 0, 50, 0, 0, 10, + 178, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 136, + 32, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 70, 8, + 16, 0, 1, 0, 0, 0, + 50, 0, 0, 10, 114, 0, + 16, 0, 0, 0, 0, 0, + 166, 10, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 11, 0, + 0, 0, 70, 3, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 32, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 17, 32, 0, 8, 130, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 14, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 23, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 24, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 108, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 92, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 99, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 15, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 67, 79, 76, 79, 82, + 0, 171, 171, 171, 79, 83, + 71, 78, 100, 0, 0, 0, + 3, 0, 0, 0, 8, 0, + 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 80, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 86, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 0, + 0, 0, 67, 79, 76, 79, + 82, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVc.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..ef9b570b6d6ae1bcd95f1463238448e6cbf40ec1 GIT binary patch literal 67072 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 Y@Hj&4TK^PSL>Hc1|J|tdph61#KWkV&4gdfE literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVcBn.inc b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVcBn.inc new file mode 100644 index 0000000..f9b0bf4 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVcBn.inc @@ -0,0 +1,1067 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// COLOR 0 xyzw 2 NONE float xyzw +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// COLOR 0 xyzw 0 NONE float xyzw +// COLOR 1 xyzw 1 NONE float xyzw +// SV_Position 0 xyzw 2 POS float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 0 13 ( FLT, FLT, FLT, FLT) +// c14 cb0 14 4 ( FLT, FLT, FLT, FLT) +// c18 cb0 19 7 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c25, 2, -1, 0, 1 + dcl_texcoord v0 // vin<0,1,2,3> + dcl_texcoord1 v1 // vin<4,5,6> + dcl_texcoord2 v2 // vin<7,8,9,10> + +#line 57 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c15 // ::pos_ws<0> + dp4 r0.y, v0, c16 // ::pos_ws<1> + dp4 r0.z, v0, c17 // ::pos_ws<2> + add r0.xyz, -r0, c13 + nrm r1.xyz, r0 // ::eyeVector<0,1,2> + +#line 33 + add r0.xyz, r1, -c4 + nrm r2.xyz, r0 // ::halfVectors<0,1,2> + +#line 32 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + mad r0.xyz, v1, c25.x, c25.y // ::BiasX2<0,1,2> + +#line 59 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp3 r3.x, r0, c18 + dp3 r3.y, r0, c19 + dp3 r3.z, r0, c20 + nrm r0.xyz, r3 // ::worldNormal<0,1,2> + +#line 37 + dp3 r2.x, r2, r0 // ::dotH<0> + +#line 33 + add r3.xyz, r1, -c5 + add r1.xyz, r1, -c6 + nrm r4.xyz, r1 // ::halfVectors<6,7,8> + +#line 37 + dp3 r2.z, r4, r0 // ::dotH<2> + +#line 33 + nrm r1.xyz, r3 // ::halfVectors<3,4,5> + +#line 37 + dp3 r2.y, r1, r0 // ::dotH<1> + +#line 42 + max r1.xyz, r2, c25.z + +#line 36 + dp3 r2.x, -c4, r0 // ::dotL<0> + dp3 r2.y, -c5, r0 // ::dotL<1> + dp3 r2.z, -c6, r0 // ::dotL<2> + +#line 39 + sge r0.xyz, r2, c25.z // ::zeroL<0,1,2> + +#line 42 + mul r1.xyz, r0, r1 + mul r0.xyz, r2, r0 // ::diffuse<0,1,2> + log r3.x, r1.x + log r3.y, r1.y + log r3.z, r1.z + mul r1.xyz, r3, c3.w + exp r3.x, r1.x + exp r3.y, r1.y + exp r3.z, r1.z + mul r1.xyz, r2, r3 // ::specular<0,1,2> + +#line 47 + mul r2.xyz, r1.y, c11 + mad r1.xyw, r1.x, c10.xyzz, r2.xyzz + mad r1.xyz, r1.z, c12, r1.xyww + mul oT1.xyz, r1, c3 // ::VSBasicVertexLightingVcBn<4,5,6> + +#line 63 + dp4 oPos.z, v0, c23 // ::VSBasicVertexLightingVcBn<10> + +#line 14 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Common.fxh" + dp4 r0.w, v0, c14 + max r0.w, r0.w, c25.z + min oT1.w, r0.w, c25.w // ::VSBasicVertexLightingVcBn<7> + +#line 46 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + mul r1.xyz, r0.y, c8 + mad r0.xyw, r0.x, c7.xyzz, r1.xyzz + mad r0.xyz, r0.z, c9, r0.xyww + mov r1.xyz, c1 // Parameters::DiffuseColor<0,1,2> + mad r0.xyz, r0, r1, c2 // ::result<0,1,2> + +#line 199 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mul oT0.xyz, r0, v2 // ::VSBasicVertexLightingVcBn<0,1,2> + mul oT0.w, v2.w, c1.w // ::VSBasicVertexLightingVcBn<3> + +#line 63 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\Lighting.fxh" + dp4 r0.x, v0, c21 // ::vout<0> + dp4 r0.y, v0, c22 // ::vout<1> + dp4 r0.z, v0, c24 // ::vout<3> + +#line 190 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\BasicEffect.fx" + mad oPos.xy, r0.z, c0, r0 // ::VSBasicVertexLightingVcBn<8,9> + mov oPos.w, r0.z // ::VSBasicVertexLightingVcBn<11> + +// approximately 64 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[26], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_output o0.xyzw +dcl_output o1.xyzw +dcl_output_siv o2.xyzw, position +dcl_temps 6 +mad r0.xyz, v1.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000) +dp3 r1.x, r0.xyzx, cb0[19].xyzx +dp3 r1.y, r0.xyzx, cb0[20].xyzx +dp3 r1.z, r0.xyzx, cb0[21].xyzx +dp3 r0.x, r1.xyzx, r1.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, r1.xyzx +dp3 r1.x, -cb0[3].xyzx, r0.xyzx +dp3 r1.y, -cb0[4].xyzx, r0.xyzx +dp3 r1.z, -cb0[5].xyzx, r0.xyzx +ge r2.xyz, r1.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +and r2.xyz, r2.xyzx, l(0x3f800000, 0x3f800000, 0x3f800000, 0) +mul r3.xyz, r1.xyzx, r2.xyzx +mul r4.xyz, r3.yyyy, cb0[7].xyzx +mad r3.xyw, r3.xxxx, cb0[6].xyxz, r4.xyxz +mad r3.xyz, r3.zzzz, cb0[8].xyzx, r3.xywx +mad r3.xyz, r3.xyzx, cb0[0].xyzx, cb0[1].xyzx +mul o0.xyz, r3.xyzx, v2.xyzx +mul o0.w, v2.w, cb0[0].w +dp4 r3.x, v0.xyzw, cb0[15].xyzw +dp4 r3.y, v0.xyzw, cb0[16].xyzw +dp4 r3.z, v0.xyzw, cb0[17].xyzw +add r3.xyz, -r3.xyzx, cb0[12].xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mad r4.xyz, r3.xyzx, r0.wwww, -cb0[3].xyzx +dp3 r1.w, r4.xyzx, r4.xyzx +rsq r1.w, r1.w +mul r4.xyz, r1.wwww, r4.xyzx +dp3 r4.x, r4.xyzx, r0.xyzx +mad r5.xyz, r3.xyzx, r0.wwww, -cb0[4].xyzx +mad r3.xyz, r3.xyzx, r0.wwww, -cb0[5].xyzx +dp3 r0.w, r5.xyzx, r5.xyzx +rsq r0.w, r0.w +mul r5.xyz, r0.wwww, r5.xyzx +dp3 r4.y, r5.xyzx, r0.xyzx +dp3 r0.w, r3.xyzx, r3.xyzx +rsq r0.w, r0.w +mul r3.xyz, r0.wwww, r3.xyzx +dp3 r4.z, r3.xyzx, r0.xyzx +max r0.xyz, r4.xyzx, l(0.000000, 0.000000, 0.000000, 0.000000) +mul r0.xyz, r2.xyzx, r0.xyzx +log r0.xyz, r0.xyzx +mul r0.xyz, r0.xyzx, cb0[2].wwww +exp r0.xyz, r0.xyzx +mul r0.xyz, r1.xyzx, r0.xyzx +mul r1.xyz, r0.yyyy, cb0[10].xyzx +mad r0.xyw, r0.xxxx, cb0[9].xyxz, r1.xyxz +mad r0.xyz, r0.zzzz, cb0[11].xyzx, r0.xywx +mul o1.xyz, r0.xyzx, cb0[2].xyzx +dp4_sat o1.w, v0.xyzw, cb0[14].xyzw +dp4 o2.x, v0.xyzw, cb0[22].xyzw +dp4 o2.y, v0.xyzw, cb0[23].xyzw +dp4 o2.z, v0.xyzw, cb0[24].xyzw +dp4 o2.w, v0.xyzw, cb0[25].xyzw +ret +// Approximately 0 instruction slots used +#endif + +const BYTE BasicEffect_VSBasicVertexLightingVcBn[] = +{ + 68, 88, 66, 67, 182, 159, + 114, 18, 152, 35, 80, 246, + 224, 144, 246, 9, 48, 77, + 87, 7, 1, 0, 0, 0, + 0, 20, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 200, 11, 0, 0, 32, 19, + 0, 0, 148, 19, 0, 0, + 65, 111, 110, 57, 144, 11, + 0, 0, 144, 11, 0, 0, + 0, 2, 254, 255, 68, 11, + 0, 0, 76, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 1, 0, + 72, 0, 0, 0, 0, 0, + 13, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 14, 0, + 4, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 19, 0, + 7, 0, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 237, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 136, 7, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 8, 1, + 0, 0, 58, 0, 0, 0, + 20, 1, 0, 0, 15, 0, + 0, 0, 92, 6, 0, 0, + 60, 3, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 76, + 105, 103, 104, 116, 105, 110, + 103, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 67, 111, 109, 109, 111, + 110, 46, 102, 120, 104, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 66, 97, 115, 105, 99, + 69, 102, 102, 101, 99, 116, + 46, 102, 120, 0, 171, 171, + 40, 0, 0, 0, 114, 0, + 0, 0, 186, 0, 0, 0, + 0, 0, 255, 255, 188, 7, + 0, 0, 0, 0, 255, 255, + 212, 7, 0, 0, 0, 0, + 255, 255, 224, 7, 0, 0, + 0, 0, 255, 255, 236, 7, + 0, 0, 57, 0, 0, 0, + 248, 7, 0, 0, 57, 0, + 0, 0, 8, 8, 0, 0, + 57, 0, 0, 0, 24, 8, + 0, 0, 58, 0, 0, 0, + 40, 8, 0, 0, 58, 0, + 0, 0, 56, 8, 0, 0, + 33, 0, 0, 0, 68, 8, + 0, 0, 33, 0, 0, 0, + 84, 8, 0, 0, 32, 0, + 1, 0, 96, 8, 0, 0, + 59, 0, 0, 0, 116, 8, + 0, 0, 59, 0, 0, 0, + 132, 8, 0, 0, 59, 0, + 0, 0, 148, 8, 0, 0, + 59, 0, 0, 0, 164, 8, + 0, 0, 37, 0, 0, 0, + 176, 8, 0, 0, 33, 0, + 0, 0, 192, 8, 0, 0, + 33, 0, 0, 0, 208, 8, + 0, 0, 33, 0, 0, 0, + 224, 8, 0, 0, 37, 0, + 0, 0, 236, 8, 0, 0, + 33, 0, 0, 0, 252, 8, + 0, 0, 37, 0, 0, 0, + 8, 9, 0, 0, 42, 0, + 0, 0, 24, 9, 0, 0, + 36, 0, 0, 0, 40, 9, + 0, 0, 36, 0, 0, 0, + 56, 9, 0, 0, 36, 0, + 0, 0, 72, 9, 0, 0, + 39, 0, 0, 0, 88, 9, + 0, 0, 42, 0, 0, 0, + 104, 9, 0, 0, 41, 0, + 0, 0, 120, 9, 0, 0, + 42, 0, 0, 0, 136, 9, + 0, 0, 42, 0, 0, 0, + 148, 9, 0, 0, 42, 0, + 0, 0, 160, 9, 0, 0, + 42, 0, 0, 0, 172, 9, + 0, 0, 42, 0, 0, 0, + 188, 9, 0, 0, 42, 0, + 0, 0, 200, 9, 0, 0, + 42, 0, 0, 0, 212, 9, + 0, 0, 42, 0, 0, 0, + 224, 9, 0, 0, 47, 0, + 0, 0, 240, 9, 0, 0, + 47, 0, 0, 0, 0, 10, + 0, 0, 47, 0, 0, 0, + 20, 10, 0, 0, 47, 0, + 0, 0, 40, 10, 0, 0, + 63, 0, 0, 0, 56, 10, + 0, 0, 14, 0, 1, 0, + 72, 10, 0, 0, 14, 0, + 1, 0, 88, 10, 0, 0, + 14, 0, 1, 0, 104, 10, + 0, 0, 46, 0, 0, 0, + 120, 10, 0, 0, 46, 0, + 0, 0, 136, 10, 0, 0, + 46, 0, 0, 0, 156, 10, + 0, 0, 46, 0, 0, 0, + 176, 10, 0, 0, 46, 0, + 0, 0, 188, 10, 0, 0, + 199, 0, 2, 0, 208, 10, + 0, 0, 199, 0, 2, 0, + 224, 10, 0, 0, 63, 0, + 0, 0, 240, 10, 0, 0, + 63, 0, 0, 0, 0, 11, + 0, 0, 63, 0, 0, 0, + 16, 11, 0, 0, 190, 0, + 2, 0, 32, 11, 0, 0, + 190, 0, 2, 0, 52, 11, + 0, 0, 66, 105, 97, 115, + 88, 50, 0, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 80, 97, 114, 97, + 109, 101, 116, 101, 114, 115, + 0, 68, 105, 102, 102, 117, + 115, 101, 67, 111, 108, 111, + 114, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 49, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 86, 83, 66, 97, 115, 105, + 99, 86, 101, 114, 116, 101, + 120, 76, 105, 103, 104, 116, + 105, 110, 103, 86, 99, 66, + 110, 0, 68, 105, 102, 102, + 117, 115, 101, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 83, 112, + 101, 99, 117, 108, 97, 114, + 0, 80, 111, 115, 105, 116, + 105, 111, 110, 80, 83, 0, + 86, 3, 0, 0, 96, 3, + 0, 0, 112, 3, 0, 0, + 96, 3, 0, 0, 121, 3, + 0, 0, 96, 3, 0, 0, + 5, 0, 0, 0, 1, 0, + 12, 0, 1, 0, 3, 0, + 132, 3, 0, 0, 41, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 42, 0, + 0, 0, 255, 255, 255, 255, + 10, 0, 255, 255, 45, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 7, 0, 51, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 52, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 3, 0, 56, 0, + 0, 0, 8, 0, 9, 0, + 255, 255, 255, 255, 57, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 11, 0, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 100, 111, + 116, 72, 0, 171, 171, 171, + 16, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 20, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 22, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 100, 111, 116, 76, 0, 171, + 171, 171, 24, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 25, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 26, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 101, 121, 101, 86, + 101, 99, 116, 111, 114, 0, + 171, 171, 8, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 104, 97, 108, 102, + 86, 101, 99, 116, 111, 114, + 115, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 19, 0, 0, 0, 6, 0, + 7, 0, 8, 0, 255, 255, + 21, 0, 0, 0, 3, 0, + 4, 0, 5, 0, 255, 255, + 112, 111, 115, 95, 119, 115, + 0, 171, 4, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 5, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 6, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 114, 101, 115, 117, + 108, 116, 0, 171, 86, 3, + 0, 0, 8, 4, 0, 0, + 112, 3, 0, 0, 8, 4, + 0, 0, 5, 0, 0, 0, + 1, 0, 6, 0, 1, 0, + 2, 0, 8, 5, 0, 0, + 50, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 115, 112, 101, 99, 117, 108, + 97, 114, 0, 171, 171, 171, + 37, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 118, 105, 110, 0, 80, 111, + 115, 105, 116, 105, 111, 110, + 0, 78, 111, 114, 109, 97, + 108, 0, 67, 111, 108, 111, + 114, 0, 171, 171, 80, 5, + 0, 0, 96, 3, 0, 0, + 89, 5, 0, 0, 8, 4, + 0, 0, 96, 5, 0, 0, + 96, 3, 0, 0, 5, 0, + 0, 0, 1, 0, 11, 0, + 1, 0, 3, 0, 104, 5, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 9, 0, + 10, 0, 118, 111, 117, 116, + 0, 80, 111, 115, 95, 112, + 115, 0, 70, 111, 103, 70, + 97, 99, 116, 111, 114, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 185, 5, 0, 0, 96, 3, + 0, 0, 86, 3, 0, 0, + 96, 3, 0, 0, 112, 3, + 0, 0, 8, 4, 0, 0, + 192, 5, 0, 0, 204, 5, + 0, 0, 5, 0, 0, 0, + 1, 0, 12, 0, 1, 0, + 4, 0, 220, 5, 0, 0, + 53, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 54, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 55, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 97, 108, 0, + 15, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 122, 101, 114, 111, 76, 0, + 171, 171, 27, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 0, 0, 0, 0, + 228, 2, 0, 0, 236, 2, + 0, 0, 1, 0, 0, 0, + 252, 2, 0, 0, 8, 3, + 0, 0, 19, 3, 0, 0, + 32, 3, 0, 0, 1, 0, + 0, 0, 48, 3, 0, 0, + 0, 0, 0, 0, 60, 3, + 0, 0, 156, 3, 0, 0, + 7, 0, 0, 0, 172, 3, + 0, 0, 0, 0, 0, 0, + 0, 4, 0, 0, 8, 4, + 0, 0, 1, 0, 0, 0, + 24, 4, 0, 0, 0, 0, + 0, 0, 36, 4, 0, 0, + 8, 4, 0, 0, 3, 0, + 0, 0, 44, 4, 0, 0, + 0, 0, 0, 0, 80, 4, + 0, 0, 8, 4, 0, 0, + 3, 0, 0, 0, 88, 4, + 0, 0, 0, 0, 0, 0, + 124, 4, 0, 0, 8, 4, + 0, 0, 1, 0, 0, 0, + 136, 4, 0, 0, 0, 0, + 0, 0, 148, 4, 0, 0, + 160, 4, 0, 0, 3, 0, + 0, 0, 176, 4, 0, 0, + 0, 0, 0, 0, 212, 4, + 0, 0, 96, 3, 0, 0, + 3, 0, 0, 0, 220, 4, + 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 24, 5, + 0, 0, 1, 0, 0, 0, + 40, 5, 0, 0, 0, 0, + 0, 0, 52, 5, 0, 0, + 8, 4, 0, 0, 1, 0, + 0, 0, 64, 5, 0, 0, + 60, 3, 0, 0, 76, 5, + 0, 0, 128, 5, 0, 0, + 3, 0, 0, 0, 144, 5, + 0, 0, 0, 0, 0, 0, + 180, 5, 0, 0, 252, 5, + 0, 0, 3, 0, 0, 0, + 12, 6, 0, 0, 0, 0, + 0, 0, 48, 6, 0, 0, + 8, 4, 0, 0, 1, 0, + 0, 0, 60, 6, 0, 0, + 0, 0, 0, 0, 72, 6, + 0, 0, 8, 4, 0, 0, + 1, 0, 0, 0, 80, 6, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 25, 0, + 15, 160, 0, 0, 0, 64, + 0, 0, 128, 191, 0, 0, + 0, 0, 0, 0, 128, 63, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 15, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 16, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 17, 0, 228, 160, + 2, 0, 0, 3, 0, 0, + 7, 128, 0, 0, 228, 129, + 13, 0, 228, 160, 36, 0, + 0, 2, 1, 0, 7, 128, + 0, 0, 228, 128, 2, 0, + 0, 3, 0, 0, 7, 128, + 1, 0, 228, 128, 4, 0, + 228, 161, 36, 0, 0, 2, + 2, 0, 7, 128, 0, 0, + 228, 128, 4, 0, 0, 4, + 0, 0, 7, 128, 1, 0, + 228, 144, 25, 0, 0, 160, + 25, 0, 85, 160, 8, 0, + 0, 3, 3, 0, 1, 128, + 0, 0, 228, 128, 18, 0, + 228, 160, 8, 0, 0, 3, + 3, 0, 2, 128, 0, 0, + 228, 128, 19, 0, 228, 160, + 8, 0, 0, 3, 3, 0, + 4, 128, 0, 0, 228, 128, + 20, 0, 228, 160, 36, 0, + 0, 2, 0, 0, 7, 128, + 3, 0, 228, 128, 8, 0, + 0, 3, 2, 0, 1, 128, + 2, 0, 228, 128, 0, 0, + 228, 128, 2, 0, 0, 3, + 3, 0, 7, 128, 1, 0, + 228, 128, 5, 0, 228, 161, + 2, 0, 0, 3, 1, 0, + 7, 128, 1, 0, 228, 128, + 6, 0, 228, 161, 36, 0, + 0, 2, 4, 0, 7, 128, + 1, 0, 228, 128, 8, 0, + 0, 3, 2, 0, 4, 128, + 4, 0, 228, 128, 0, 0, + 228, 128, 36, 0, 0, 2, + 1, 0, 7, 128, 3, 0, + 228, 128, 8, 0, 0, 3, + 2, 0, 2, 128, 1, 0, + 228, 128, 0, 0, 228, 128, + 11, 0, 0, 3, 1, 0, + 7, 128, 2, 0, 228, 128, + 25, 0, 170, 160, 8, 0, + 0, 3, 2, 0, 1, 128, + 4, 0, 228, 161, 0, 0, + 228, 128, 8, 0, 0, 3, + 2, 0, 2, 128, 5, 0, + 228, 161, 0, 0, 228, 128, + 8, 0, 0, 3, 2, 0, + 4, 128, 6, 0, 228, 161, + 0, 0, 228, 128, 13, 0, + 0, 3, 0, 0, 7, 128, + 2, 0, 228, 128, 25, 0, + 170, 160, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 228, 128, 1, 0, 228, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 2, 0, 228, 128, + 0, 0, 228, 128, 15, 0, + 0, 2, 3, 0, 1, 128, + 1, 0, 0, 128, 15, 0, + 0, 2, 3, 0, 2, 128, + 1, 0, 85, 128, 15, 0, + 0, 2, 3, 0, 4, 128, + 1, 0, 170, 128, 5, 0, + 0, 3, 1, 0, 7, 128, + 3, 0, 228, 128, 3, 0, + 255, 160, 14, 0, 0, 2, + 3, 0, 1, 128, 1, 0, + 0, 128, 14, 0, 0, 2, + 3, 0, 2, 128, 1, 0, + 85, 128, 14, 0, 0, 2, + 3, 0, 4, 128, 1, 0, + 170, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 2, 0, + 228, 128, 3, 0, 228, 128, + 5, 0, 0, 3, 2, 0, + 7, 128, 1, 0, 85, 128, + 11, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 11, 128, + 1, 0, 0, 128, 10, 0, + 164, 160, 2, 0, 164, 128, + 4, 0, 0, 4, 1, 0, + 7, 128, 1, 0, 170, 128, + 12, 0, 228, 160, 1, 0, + 244, 128, 5, 0, 0, 3, + 1, 0, 7, 224, 1, 0, + 228, 128, 3, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 23, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 8, 128, + 0, 0, 228, 144, 14, 0, + 228, 160, 11, 0, 0, 3, + 0, 0, 8, 128, 0, 0, + 255, 128, 25, 0, 170, 160, + 10, 0, 0, 3, 1, 0, + 8, 224, 0, 0, 255, 128, + 25, 0, 255, 160, 5, 0, + 0, 3, 1, 0, 7, 128, + 0, 0, 85, 128, 8, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 11, 128, 0, 0, + 0, 128, 7, 0, 164, 160, + 1, 0, 164, 128, 4, 0, + 0, 4, 0, 0, 7, 128, + 0, 0, 170, 128, 9, 0, + 228, 160, 0, 0, 244, 128, + 1, 0, 0, 2, 1, 0, + 7, 128, 1, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 7, 128, 0, 0, 228, 128, + 1, 0, 228, 128, 2, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 7, 224, 0, 0, + 228, 128, 2, 0, 228, 144, + 5, 0, 0, 3, 0, 0, + 8, 224, 2, 0, 255, 144, + 1, 0, 255, 160, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 21, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 22, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 24, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 255, 255, 0, 0, 83, 72, + 68, 82, 80, 7, 0, 0, + 64, 0, 1, 0, 212, 1, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 26, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 2, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 0, 0, 0, 0, + 101, 0, 0, 3, 242, 32, + 16, 0, 1, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 104, 0, + 0, 2, 6, 0, 0, 0, + 50, 0, 0, 15, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 2, 64, 0, 0, + 0, 0, 0, 64, 0, 0, + 0, 64, 0, 0, 0, 64, + 0, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 191, + 0, 0, 128, 191, 0, 0, + 128, 191, 0, 0, 0, 0, + 16, 0, 0, 8, 18, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 19, 0, + 0, 0, 16, 0, 0, 8, + 34, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 20, 0, 0, 0, 16, 0, + 0, 8, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 21, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 9, 18, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 9, 34, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 9, 66, 0, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 29, 0, + 0, 10, 114, 0, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 10, + 114, 0, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 2, 64, + 0, 0, 0, 0, 128, 63, + 0, 0, 128, 63, 0, 0, + 128, 63, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 4, 0, 0, 0, 86, 5, + 16, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 7, 0, 0, 0, + 50, 0, 0, 10, 178, 0, + 16, 0, 3, 0, 0, 0, + 6, 0, 16, 0, 3, 0, + 0, 0, 70, 136, 32, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 70, 8, 16, 0, + 4, 0, 0, 0, 50, 0, + 0, 10, 114, 0, 16, 0, + 3, 0, 0, 0, 166, 10, + 16, 0, 3, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 8, 0, 0, 0, + 70, 3, 16, 0, 3, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 32, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 56, 0, 0, 8, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 2, 0, 0, 0, 58, 128, + 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 3, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 3, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 16, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 3, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 17, 0, 0, 0, 0, 0, + 0, 9, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 128, 65, 0, 0, 0, + 3, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 12, 0, 0, 0, 16, 0, + 0, 7, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 68, 0, 0, 5, + 130, 0, 16, 0, 0, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 4, 0, 0, 0, + 246, 15, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 50, 0, + 0, 11, 114, 0, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 16, 0, 0, 7, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 68, 0, + 0, 5, 130, 0, 16, 0, + 0, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 5, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 5, 0, 0, 0, 16, 0, + 0, 7, 34, 0, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 7, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 68, 0, 0, 5, 130, 0, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 3, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 66, 0, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 52, 0, + 0, 10, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 2, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 47, 0, 0, 5, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 246, 143, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 25, 0, + 0, 5, 114, 0, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 1, 0, 0, 0, 86, 5, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 10, 0, 0, 0, + 50, 0, 0, 10, 178, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 136, 32, 0, + 0, 0, 0, 0, 9, 0, + 0, 0, 70, 8, 16, 0, + 1, 0, 0, 0, 50, 0, + 0, 10, 114, 0, 16, 0, + 0, 0, 0, 0, 166, 10, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 11, 0, 0, 0, + 70, 3, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 32, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 17, 32, + 0, 8, 130, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 14, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 22, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 23, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 24, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 25, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 108, 0, + 0, 0, 3, 0, 0, 0, + 8, 0, 0, 0, 80, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 92, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 99, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 15, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 67, + 79, 76, 79, 82, 0, 171, + 171, 171, 79, 83, 71, 78, + 100, 0, 0, 0, 3, 0, + 0, 0, 8, 0, 0, 0, + 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 80, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 86, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 0, 0, 0, + 67, 79, 76, 79, 82, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVcBn.pdb b/DirectXTK/Src/Shaders/Compiled/BasicEffect_VSBasicVertexLightingVcBn.pdb new file mode 100644 index 0000000000000000000000000000000000000000..c185286cbb3cf6f092d1bb10bc46159b881d5b0d GIT binary patch literal 67072 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main.inc b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main.inc new file mode 100644 index 0000000..949393d --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main.inc @@ -0,0 +1,583 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TANGENT 0 xyzw 2 NONE float xyzw +// TEXCOORD 0 xy 3 NONE float xy +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float xyzw +// COLOR 0 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// TEXCOORD 1 xyz 3 NONE float xyz +// TEXCOORD 2 xyz 4 NONE float xyz +// TEXCOORD 3 xyz 5 NONE float xyz +// TEXCOORD 4 xyzw 6 NONE float xyzw +// TEXCOORD 5 xyz 7 NONE float xyz +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c1 cb0 1 1 ( FLT, FLT, FLT, FLT) +// c2 cb2 0 3 ( FLT, FLT, FLT, FLT) +// c5 cb2 4 4 ( FLT, FLT, FLT, FLT) +// c9 cb2 16 2 ( FLT, FLT, FLT, FLT) +// c11 cb2 20 1 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c0 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c12, 1, 0, 0, 0 + dcl_texcoord v0 // vertex<0,1,2,3> + dcl_texcoord1 v1 // vertex<4,5,6> + dcl_texcoord2 v2 // vertex<7,8,9,10> + dcl_texcoord3 v3 // vertex<11,12> + +#line 129 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLEffect.fx" + dp4 oPos.z, v0, c7 // ::main<2> + mad r0.xyz, v3.xyxw, c12.xxyw, c12.yyxw + dp3 oT1.x, r0, c9.xyww // ::main<8> + dp3 oT1.y, r0, c10.xyww // ::main<9> + dp3 oT2.x, v1, c2 // ::main<10> + dp3 oT2.y, v1, c3 // ::main<11> + dp3 oT2.z, v1, c4 // ::main<12> + +#line 126 + dp4 r0.x, v0, c2 // ::wp<0> + dp4 r0.y, v0, c3 // ::wp<1> + dp4 r0.z, v0, c4 // ::wp<2> + +#line 134 + add oT4.xyz, -r0, c11 // ::main<16,17,18> + +#line 126 + mov oT3.xyz, r0 // ::main<13,14,15> + +#line 129 + dp4 r0.x, v0, c5 // ::result<0> + dp4 r0.y, v0, c6 // ::result<1> + dp4 r0.z, v0, c8 // ::result<3> + +#line 122 + mad oPos.xy, r0.z, c0, r0 // ::main<0,1> + mov oPos.w, r0.z // ::main<3> + +#line 130 + mov oT0, c1 // ::main<4,5,6,7> + +#line 135 + mov oT5, v2 // ::main<19,20,21,22> + mov oT6.xyz, v1 // ::main<23,24,25> + +// approximately 20 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_constantbuffer CB2[21], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_input v3.xy +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output o3.xyz +dcl_output o4.xyz +dcl_output o5.xyz +dcl_output o6.xyzw +dcl_output o7.xyz +dcl_temps 1 +dp4 o0.x, v0.xyzw, cb2[4].xyzw +dp4 o0.y, v0.xyzw, cb2[5].xyzw +dp4 o0.z, v0.xyzw, cb2[6].xyzw +dp4 o0.w, v0.xyzw, cb2[7].xyzw +mov o1.xyzw, cb0[1].xyzw +mov r0.xy, v3.xyxx +mov r0.z, l(1.000000) +dp3 o2.x, r0.xyzx, cb2[16].xywx +dp3 o2.y, r0.xyzx, cb2[17].xywx +dp3 o3.x, v1.xyzx, cb2[0].xyzx +dp3 o3.y, v1.xyzx, cb2[1].xyzx +dp3 o3.z, v1.xyzx, cb2[2].xyzx +dp4 r0.x, v0.xyzw, cb2[0].xyzw +dp4 r0.y, v0.xyzw, cb2[1].xyzw +dp4 r0.z, v0.xyzw, cb2[2].xyzw +mov o4.xyz, r0.xyzx +add o5.xyz, -r0.xyzx, cb2[20].xyzx +mov o6.xyzw, v2.xyzw +mov o7.xyz, v1.xyzx +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLEffect_main[] = +{ + 68, 88, 66, 67, 152, 152, + 187, 89, 67, 39, 184, 153, + 197, 13, 49, 201, 235, 255, + 127, 27, 1, 0, 0, 0, + 124, 10, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 12, 6, 0, 0, 252, 8, + 0, 0, 144, 9, 0, 0, + 65, 111, 110, 57, 212, 5, + 0, 0, 212, 5, 0, 0, + 0, 2, 254, 255, 112, 5, + 0, 0, 100, 0, 0, 0, + 5, 0, 36, 0, 0, 0, + 96, 0, 0, 0, 96, 0, + 0, 0, 36, 0, 1, 0, + 96, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 2, 0, 0, 0, + 0, 0, 2, 0, 4, 0, + 4, 0, 5, 0, 0, 0, + 0, 0, 2, 0, 16, 0, + 2, 0, 9, 0, 0, 0, + 0, 0, 2, 0, 20, 0, + 1, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 250, 0, 68, 66, 85, 71, + 40, 0, 0, 0, 188, 3, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 25, 0, 0, 0, + 120, 0, 0, 0, 4, 0, + 0, 0, 108, 3, 0, 0, + 64, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 69, 102, 102, + 101, 99, 116, 46, 102, 120, + 0, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 240, 3, + 0, 0, 0, 0, 255, 255, + 8, 4, 0, 0, 0, 0, + 255, 255, 20, 4, 0, 0, + 0, 0, 255, 255, 32, 4, + 0, 0, 0, 0, 255, 255, + 44, 4, 0, 0, 129, 0, + 0, 0, 56, 4, 0, 0, + 131, 0, 0, 0, 72, 4, + 0, 0, 131, 0, 0, 0, + 92, 4, 0, 0, 131, 0, + 0, 0, 108, 4, 0, 0, + 132, 0, 0, 0, 124, 4, + 0, 0, 132, 0, 0, 0, + 140, 4, 0, 0, 132, 0, + 0, 0, 156, 4, 0, 0, + 126, 0, 0, 0, 172, 4, + 0, 0, 126, 0, 0, 0, + 188, 4, 0, 0, 126, 0, + 0, 0, 204, 4, 0, 0, + 134, 0, 0, 0, 220, 4, + 0, 0, 126, 0, 0, 0, + 236, 4, 0, 0, 129, 0, + 0, 0, 248, 4, 0, 0, + 129, 0, 0, 0, 8, 5, + 0, 0, 129, 0, 0, 0, + 24, 5, 0, 0, 122, 0, + 0, 0, 40, 5, 0, 0, + 122, 0, 0, 0, 60, 5, + 0, 0, 130, 0, 0, 0, + 72, 5, 0, 0, 135, 0, + 0, 0, 84, 5, 0, 0, + 136, 0, 0, 0, 96, 5, + 0, 0, 109, 97, 105, 110, + 0, 112, 111, 115, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 100, 105, 102, 102, 117, 115, + 101, 0, 117, 118, 0, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 119, 111, 114, 108, + 100, 80, 111, 115, 0, 116, + 111, 69, 121, 101, 0, 116, + 97, 110, 103, 101, 110, 116, + 0, 110, 111, 114, 109, 97, + 108, 0, 171, 171, 69, 1, + 0, 0, 76, 1, 0, 0, + 92, 1, 0, 0, 76, 1, + 0, 0, 100, 1, 0, 0, + 104, 1, 0, 0, 120, 1, + 0, 0, 132, 1, 0, 0, + 148, 1, 0, 0, 132, 1, + 0, 0, 157, 1, 0, 0, + 132, 1, 0, 0, 163, 1, + 0, 0, 76, 1, 0, 0, + 171, 1, 0, 0, 132, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 26, 0, 1, 0, + 8, 0, 180, 1, 0, 0, + 5, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 7, 0, 0, 0, 8, 0, + 255, 255, 255, 255, 255, 255, + 8, 0, 0, 0, 255, 255, + 9, 0, 255, 255, 255, 255, + 9, 0, 0, 0, 10, 0, + 255, 255, 255, 255, 255, 255, + 10, 0, 0, 0, 255, 255, + 11, 0, 255, 255, 255, 255, + 11, 0, 0, 0, 255, 255, + 255, 255, 12, 0, 255, 255, + 15, 0, 0, 0, 16, 0, + 17, 0, 18, 0, 255, 255, + 16, 0, 0, 0, 13, 0, + 14, 0, 15, 0, 255, 255, + 20, 0, 0, 0, 0, 0, + 1, 0, 255, 255, 255, 255, + 21, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 3, 0, + 22, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 7, 0, + 23, 0, 0, 0, 19, 0, + 20, 0, 21, 0, 22, 0, + 24, 0, 0, 0, 23, 0, + 24, 0, 25, 0, 255, 255, + 114, 101, 115, 117, 108, 116, + 0, 171, 5, 0, 0, 0, + 1, 0, 26, 0, 1, 0, + 8, 0, 180, 1, 0, 0, + 17, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 18, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 19, 0, 0, 0, 255, 255, + 255, 255, 3, 0, 255, 255, + 118, 101, 114, 116, 101, 120, + 0, 171, 69, 1, 0, 0, + 76, 1, 0, 0, 171, 1, + 0, 0, 132, 1, 0, 0, + 163, 1, 0, 0, 76, 1, + 0, 0, 100, 1, 0, 0, + 104, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 13, 0, + 1, 0, 4, 0, 228, 2, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 9, 0, + 10, 0, 4, 0, 0, 0, + 11, 0, 12, 0, 255, 255, + 255, 255, 119, 112, 0, 171, + 12, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 13, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 14, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 0, 0, 0, 0, 64, 1, + 0, 0, 244, 1, 0, 0, + 13, 0, 0, 0, 4, 2, + 0, 0, 0, 0, 0, 0, + 160, 2, 0, 0, 168, 2, + 0, 0, 3, 0, 0, 0, + 184, 2, 0, 0, 64, 1, + 0, 0, 220, 2, 0, 0, + 4, 3, 0, 0, 4, 0, + 0, 0, 20, 3, 0, 0, + 0, 0, 0, 0, 68, 3, + 0, 0, 132, 1, 0, 0, + 3, 0, 0, 0, 72, 3, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 12, 0, + 15, 160, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 3, 128, 3, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 7, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 7, 128, + 3, 0, 196, 144, 12, 0, + 208, 160, 12, 0, 197, 160, + 8, 0, 0, 3, 1, 0, + 1, 224, 0, 0, 228, 128, + 9, 0, 244, 160, 8, 0, + 0, 3, 1, 0, 2, 224, + 0, 0, 228, 128, 10, 0, + 244, 160, 8, 0, 0, 3, + 2, 0, 1, 224, 1, 0, + 228, 144, 2, 0, 228, 160, + 8, 0, 0, 3, 2, 0, + 2, 224, 1, 0, 228, 144, + 3, 0, 228, 160, 8, 0, + 0, 3, 2, 0, 4, 224, + 1, 0, 228, 144, 4, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 1, 128, 0, 0, + 228, 144, 2, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 0, 0, 228, 144, + 3, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 0, 0, 228, 144, 4, 0, + 228, 160, 2, 0, 0, 3, + 4, 0, 7, 224, 0, 0, + 228, 129, 11, 0, 228, 160, + 1, 0, 0, 2, 3, 0, + 7, 224, 0, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 5, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 6, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 8, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 0, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 15, 224, 1, 0, + 228, 160, 1, 0, 0, 2, + 5, 0, 15, 224, 2, 0, + 228, 144, 1, 0, 0, 2, + 6, 0, 7, 224, 1, 0, + 228, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 232, 2, + 0, 0, 64, 0, 1, 0, + 186, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 2, 0, + 0, 0, 21, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 3, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 3, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 4, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 5, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 6, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 7, 0, 0, 0, 104, 0, + 0, 2, 1, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 4, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 5, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 6, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 7, 0, + 0, 0, 54, 0, 0, 6, + 242, 32, 16, 0, 1, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 5, + 50, 0, 16, 0, 0, 0, + 0, 0, 70, 16, 16, 0, + 3, 0, 0, 0, 54, 0, + 0, 5, 66, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 128, 63, + 16, 0, 0, 8, 18, 32, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 131, 32, 0, + 2, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 8, + 34, 32, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 131, + 32, 0, 2, 0, 0, 0, + 17, 0, 0, 0, 16, 0, + 0, 8, 18, 32, 16, 0, + 3, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 16, 0, 0, 8, 34, 32, + 16, 0, 3, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 16, 0, 0, 8, + 66, 32, 16, 0, 3, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 5, 114, 32, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 114, 32, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 20, 0, 0, 0, + 54, 0, 0, 5, 242, 32, + 16, 0, 6, 0, 0, 0, + 70, 30, 16, 0, 2, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 7, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 140, 0, 0, 0, 4, 0, + 0, 0, 8, 0, 0, 0, + 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 116, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 123, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 15, 0, 0, + 131, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 3, 3, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 84, 65, 78, 71, 69, + 78, 84, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 79, 83, 71, 78, 228, 0, + 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 200, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 212, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 218, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 218, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 7, 8, 0, 0, 218, 0, + 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 4, 0, 0, 0, + 7, 8, 0, 0, 218, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 5, 0, 0, 0, + 7, 8, 0, 0, 218, 0, + 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 6, 0, 0, 0, + 15, 0, 0, 0, 218, 0, + 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 7, 0, 0, 0, + 7, 8, 0, 0, 83, 86, + 95, 80, 79, 83, 73, 84, + 73, 79, 78, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main.pdb new file mode 100644 index 0000000000000000000000000000000000000000..c3e58b5b3a31f47b322ec11286628cdf8b97209c GIT binary patch literal 30208 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 lk4``rpc~K&=mG51^yp3 + dcl_texcoord1 v1 // vertex<4,5,6> + dcl_texcoord2 v2 // vertex<7,8,9,10> + dcl_texcoord3 v3 // vertex<11,12> + dcl_texcoord4 v4 // vertex<13,14,15,16> + dcl_texcoord5 v5 // vertex<17,18,19,20> + +#line 97 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLEffect.fx" + mul r0.x, v4.x, c228.x + mova a0.x, r0.x + mul r0, v5.x, c0[a0.x] // ::skinning<0,3,6,9> + +#line 102 + dp3 oT5.x, v2, r0 // ::main1Bones<19> + +#line 97 + mul r1, v5.x, c1[a0.x] // ::skinning<1,4,7,10> + mul r2, v5.x, c2[a0.x] // ::skinning<2,5,8,11> + +#line 102 + dp3 oT5.y, v2, r1 // ::main1Bones<20> + dp3 oT5.z, v2, r2 // ::main1Bones<21> + dp4 r3.x, v0, r0 // Skin::vertex<0> + dp3 r0.x, v1, r0 // Skin::vertex<4> + dp4 r3.y, v0, r1 // Skin::vertex<1> + dp3 r0.y, v1, r1 // Skin::vertex<5> + dp4 r3.z, v0, r2 // Skin::vertex<2> + dp3 r0.z, v1, r2 // Skin::vertex<6> + +#line 170 + mov r3.w, v0.w + +#line 173 + dp4 oPos.z, r3, c223 // ::main1Bones<2> + mad r1.xyz, v3.xyxw, c228.yyzw, c228.zzyw + dp3 oT1.x, r1, c225.xyww // ::main1Bones<8> + dp3 oT1.y, r1, c226.xyww // ::main1Bones<9> + dp3 oT2.x, r0, c218 // ::main1Bones<10> + dp3 oT2.y, r0, c219 // ::main1Bones<11> + dp3 oT2.z, r0, c220 // ::main1Bones<12> + +#line 101 + mov oT6.xyz, r0 // ::main1Bones<23,24,25> + +#line 170 + dp4 r0.x, r3, c218 // ::wp<0> + dp4 r0.y, r3, c219 // ::wp<1> + dp4 r0.z, r3, c220 // ::wp<2> + +#line 178 + add oT4.xyz, -r0, c227 // ::main1Bones<16,17,18> + +#line 170 + mov oT3.xyz, r0 // ::main1Bones<13,14,15> + +#line 173 + dp4 r0.x, r3, c221 // ::result<0> + dp4 r0.y, r3, c222 // ::result<1> + dp4 r0.z, r3, c224 // ::result<3> + +#line 164 + mad oPos.xy, r0.z, c216, r0 // ::main1Bones<0,1> + mov oPos.w, r0.z // ::main1Bones<3> + +#line 174 + mov oT0, c217 // ::main1Bones<4,5,6,7> + +#line 102 + mov oT5.w, v2.w // ::main1Bones<22> + +// approximately 35 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_constantbuffer CB2[21], immediateIndexed +dcl_constantbuffer CB4[216], dynamicIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_input v3.xy +dcl_input v4.x +dcl_input v5.x +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output o3.xyz +dcl_output o4.xyz +dcl_output o5.xyz +dcl_output o6.xyzw +dcl_output o7.xyz +dcl_temps 5 +imul null, r0.x, v4.x, l(3) +mul r1.xyzw, v5.xxxx, cb4[r0.x + 0].xyzw +dp4 r2.x, v0.xyzw, r1.xyzw +mul r3.xyzw, v5.xxxx, cb4[r0.x + 1].xyzw +mul r0.xyzw, v5.xxxx, cb4[r0.x + 2].xyzw +dp4 r2.y, v0.xyzw, r3.xyzw +dp4 r2.z, v0.xyzw, r0.xyzw +mov r2.w, v0.w +dp4 o0.x, r2.xyzw, cb2[4].xyzw +dp4 o0.y, r2.xyzw, cb2[5].xyzw +dp4 o0.z, r2.xyzw, cb2[6].xyzw +dp4 o0.w, r2.xyzw, cb2[7].xyzw +mov o1.xyzw, cb0[1].xyzw +mov r4.xy, v3.xyxx +mov r4.z, l(1.000000) +dp3 o2.x, r4.xyzx, cb2[16].xywx +dp3 o2.y, r4.xyzx, cb2[17].xywx +dp3 r4.x, v1.xyzx, r1.xyzx +dp3 o6.x, v2.xyzx, r1.xyzx +dp3 r4.y, v1.xyzx, r3.xyzx +dp3 o6.y, v2.xyzx, r3.xyzx +dp3 r4.z, v1.xyzx, r0.xyzx +dp3 o6.z, v2.xyzx, r0.xyzx +dp3 o3.x, r4.xyzx, cb2[0].xyzx +dp3 o3.y, r4.xyzx, cb2[1].xyzx +dp3 o3.z, r4.xyzx, cb2[2].xyzx +mov o7.xyz, r4.xyzx +dp4 r0.x, r2.xyzw, cb2[0].xyzw +dp4 r0.y, r2.xyzw, cb2[1].xyzw +dp4 r0.z, r2.xyzw, cb2[2].xyzw +mov o4.xyz, r0.xyzx +add o5.xyz, -r0.xyzx, cb2[20].xyzx +mov o6.w, v2.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLEffect_main1Bones[] = +{ + 68, 88, 66, 67, 131, 228, + 99, 224, 48, 248, 222, 199, + 151, 134, 227, 239, 96, 141, + 106, 159, 1, 0, 0, 0, + 100, 15, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 220, 8, 0, 0, 152, 13, + 0, 0, 120, 14, 0, 0, + 65, 111, 110, 57, 164, 8, + 0, 0, 164, 8, 0, 0, + 0, 2, 254, 255, 52, 8, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 1, 0, 217, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 218, 0, 0, 0, + 0, 0, 2, 0, 4, 0, + 4, 0, 221, 0, 0, 0, + 0, 0, 2, 0, 16, 0, + 2, 0, 225, 0, 0, 0, + 0, 0, 2, 0, 20, 0, + 1, 0, 227, 0, 0, 0, + 0, 0, 0, 0, 216, 0, + 0, 2, 254, 255, 254, 255, + 104, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 116, 5, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 42, 0, 0, 0, + 120, 0, 0, 0, 6, 0, + 0, 0, 252, 4, 0, 0, + 200, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 69, 102, 102, + 101, 99, 116, 46, 102, 120, + 0, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 168, 5, + 0, 0, 0, 0, 255, 255, + 192, 5, 0, 0, 0, 0, + 255, 255, 204, 5, 0, 0, + 0, 0, 255, 255, 216, 5, + 0, 0, 0, 0, 255, 255, + 228, 5, 0, 0, 0, 0, + 255, 255, 240, 5, 0, 0, + 0, 0, 255, 255, 252, 5, + 0, 0, 97, 0, 0, 0, + 8, 6, 0, 0, 97, 0, + 0, 0, 24, 6, 0, 0, + 97, 0, 0, 0, 36, 6, + 0, 0, 102, 0, 0, 0, + 56, 6, 0, 0, 97, 0, + 0, 0, 72, 6, 0, 0, + 97, 0, 0, 0, 92, 6, + 0, 0, 102, 0, 0, 0, + 112, 6, 0, 0, 102, 0, + 0, 0, 128, 6, 0, 0, + 100, 0, 0, 0, 144, 6, + 0, 0, 101, 0, 0, 0, + 160, 6, 0, 0, 100, 0, + 0, 0, 176, 6, 0, 0, + 101, 0, 0, 0, 192, 6, + 0, 0, 100, 0, 0, 0, + 208, 6, 0, 0, 101, 0, + 0, 0, 224, 6, 0, 0, + 170, 0, 0, 0, 240, 6, + 0, 0, 173, 0, 0, 0, + 252, 6, 0, 0, 175, 0, + 0, 0, 12, 7, 0, 0, + 175, 0, 0, 0, 32, 7, + 0, 0, 175, 0, 0, 0, + 48, 7, 0, 0, 176, 0, + 0, 0, 64, 7, 0, 0, + 176, 0, 0, 0, 80, 7, + 0, 0, 176, 0, 0, 0, + 96, 7, 0, 0, 101, 0, + 0, 0, 112, 7, 0, 0, + 170, 0, 0, 0, 124, 7, + 0, 0, 170, 0, 0, 0, + 140, 7, 0, 0, 170, 0, + 0, 0, 156, 7, 0, 0, + 178, 0, 0, 0, 172, 7, + 0, 0, 170, 0, 0, 0, + 188, 7, 0, 0, 173, 0, + 0, 0, 200, 7, 0, 0, + 173, 0, 0, 0, 216, 7, + 0, 0, 173, 0, 0, 0, + 232, 7, 0, 0, 164, 0, + 0, 0, 248, 7, 0, 0, + 164, 0, 0, 0, 12, 8, + 0, 0, 174, 0, 0, 0, + 24, 8, 0, 0, 102, 0, + 0, 0, 36, 8, 0, 0, + 109, 97, 105, 110, 49, 66, + 111, 110, 101, 115, 0, 112, + 111, 115, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 117, 118, + 0, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 80, 111, 115, + 0, 116, 111, 69, 121, 101, + 0, 116, 97, 110, 103, 101, + 110, 116, 0, 110, 111, 114, + 109, 97, 108, 0, 171, 171, + 211, 1, 0, 0, 216, 1, + 0, 0, 232, 1, 0, 0, + 216, 1, 0, 0, 240, 1, + 0, 0, 244, 1, 0, 0, + 4, 2, 0, 0, 16, 2, + 0, 0, 32, 2, 0, 0, + 16, 2, 0, 0, 41, 2, + 0, 0, 16, 2, 0, 0, + 47, 2, 0, 0, 216, 1, + 0, 0, 55, 2, 0, 0, + 16, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 64, 2, + 0, 0, 10, 0, 0, 0, + 19, 0, 255, 255, 255, 255, + 255, 255, 13, 0, 0, 0, + 255, 255, 20, 0, 255, 255, + 255, 255, 14, 0, 0, 0, + 255, 255, 255, 255, 21, 0, + 255, 255, 22, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 24, 0, 0, 0, + 8, 0, 255, 255, 255, 255, + 255, 255, 25, 0, 0, 0, + 255, 255, 9, 0, 255, 255, + 255, 255, 26, 0, 0, 0, + 10, 0, 255, 255, 255, 255, + 255, 255, 27, 0, 0, 0, + 255, 255, 11, 0, 255, 255, + 255, 255, 28, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 29, 0, 0, 0, + 23, 0, 24, 0, 25, 0, + 255, 255, 33, 0, 0, 0, + 16, 0, 17, 0, 18, 0, + 255, 255, 34, 0, 0, 0, + 13, 0, 14, 0, 15, 0, + 255, 255, 38, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 39, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 40, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 41, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 22, 0, 114, 101, 115, 117, + 108, 116, 0, 171, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 64, 2, + 0, 0, 35, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 36, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 37, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 115, 107, 105, 110, + 110, 105, 110, 103, 0, 171, + 171, 171, 3, 0, 3, 0, + 4, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 11, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 12, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 83, 107, 105, 110, 0, 118, + 101, 114, 116, 101, 120, 0, + 98, 111, 110, 101, 73, 110, + 100, 105, 99, 101, 115, 0, + 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 98, 108, + 101, 110, 100, 87, 101, 105, + 103, 104, 116, 115, 0, 171, + 171, 171, 211, 1, 0, 0, + 216, 1, 0, 0, 55, 2, + 0, 0, 16, 2, 0, 0, + 47, 2, 0, 0, 216, 1, + 0, 0, 240, 1, 0, 0, + 244, 1, 0, 0, 216, 3, + 0, 0, 228, 3, 0, 0, + 244, 3, 0, 0, 216, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 21, 0, 1, 0, + 6, 0, 4, 4, 0, 0, + 15, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 16, 0, 0, 0, 4, 0, + 255, 255, 255, 255, 255, 255, + 17, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 18, 0, 0, 0, 255, 255, + 5, 0, 255, 255, 255, 255, + 19, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 20, 0, 0, 0, 255, 255, + 255, 255, 6, 0, 255, 255, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 9, 0, 10, 0, + 4, 0, 0, 0, 11, 0, + 12, 0, 255, 255, 255, 255, + 5, 0, 0, 0, 13, 0, + 14, 0, 15, 0, 16, 0, + 6, 0, 0, 0, 17, 0, + 18, 0, 19, 0, 20, 0, + 119, 112, 0, 171, 30, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 31, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 32, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 0, 0, + 0, 0, 200, 1, 0, 0, + 128, 2, 0, 0, 16, 0, + 0, 0, 144, 2, 0, 0, + 0, 0, 0, 0, 80, 3, + 0, 0, 88, 3, 0, 0, + 3, 0, 0, 0, 104, 3, + 0, 0, 0, 0, 0, 0, + 140, 3, 0, 0, 152, 3, + 0, 0, 3, 0, 0, 0, + 168, 3, 0, 0, 204, 3, + 0, 0, 209, 3, 0, 0, + 52, 4, 0, 0, 6, 0, + 0, 0, 68, 4, 0, 0, + 200, 1, 0, 0, 209, 3, + 0, 0, 52, 4, 0, 0, + 6, 0, 0, 0, 140, 4, + 0, 0, 0, 0, 0, 0, + 212, 4, 0, 0, 16, 2, + 0, 0, 3, 0, 0, 0, + 216, 4, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 228, 0, 15, 160, 0, 0, + 64, 64, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 3, 128, 3, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 4, 128, 4, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 5, 128, 5, 0, + 15, 144, 5, 0, 0, 3, + 0, 0, 1, 128, 4, 0, + 0, 144, 228, 0, 0, 160, + 46, 0, 0, 2, 0, 0, + 1, 176, 0, 0, 0, 128, + 5, 0, 0, 4, 0, 0, + 15, 128, 5, 0, 0, 144, + 0, 32, 228, 160, 0, 0, + 0, 176, 8, 0, 0, 3, + 5, 0, 1, 224, 2, 0, + 228, 144, 0, 0, 228, 128, + 5, 0, 0, 4, 1, 0, + 15, 128, 5, 0, 0, 144, + 1, 32, 228, 160, 0, 0, + 0, 176, 5, 0, 0, 4, + 2, 0, 15, 128, 5, 0, + 0, 144, 2, 32, 228, 160, + 0, 0, 0, 176, 8, 0, + 0, 3, 5, 0, 2, 224, + 2, 0, 228, 144, 1, 0, + 228, 128, 8, 0, 0, 3, + 5, 0, 4, 224, 2, 0, + 228, 144, 2, 0, 228, 128, + 9, 0, 0, 3, 3, 0, + 1, 128, 0, 0, 228, 144, + 0, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 144, 0, 0, + 228, 128, 9, 0, 0, 3, + 3, 0, 2, 128, 0, 0, + 228, 144, 1, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 2, 128, 1, 0, 228, 144, + 1, 0, 228, 128, 9, 0, + 0, 3, 3, 0, 4, 128, + 0, 0, 228, 144, 2, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 4, 128, 1, 0, + 228, 144, 2, 0, 228, 128, + 1, 0, 0, 2, 3, 0, + 8, 128, 0, 0, 255, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 3, 0, 228, 128, + 223, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 7, 128, + 3, 0, 196, 144, 228, 0, + 229, 160, 228, 0, 218, 160, + 8, 0, 0, 3, 1, 0, + 1, 224, 1, 0, 228, 128, + 225, 0, 244, 160, 8, 0, + 0, 3, 1, 0, 2, 224, + 1, 0, 228, 128, 226, 0, + 244, 160, 8, 0, 0, 3, + 2, 0, 1, 224, 0, 0, + 228, 128, 218, 0, 228, 160, + 8, 0, 0, 3, 2, 0, + 2, 224, 0, 0, 228, 128, + 219, 0, 228, 160, 8, 0, + 0, 3, 2, 0, 4, 224, + 0, 0, 228, 128, 220, 0, + 228, 160, 1, 0, 0, 2, + 6, 0, 7, 224, 0, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 1, 128, 3, 0, + 228, 128, 218, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 3, 0, 228, 128, + 219, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 3, 0, 228, 128, 220, 0, + 228, 160, 2, 0, 0, 3, + 4, 0, 7, 224, 0, 0, + 228, 129, 227, 0, 228, 160, + 1, 0, 0, 2, 3, 0, + 7, 224, 0, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 3, 0, 228, 128, + 221, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 3, 0, 228, 128, 222, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 3, 0, + 228, 128, 224, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 216, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 15, 224, 217, 0, + 228, 160, 1, 0, 0, 2, + 5, 0, 8, 224, 2, 0, + 255, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 180, 4, + 0, 0, 64, 0, 1, 0, + 45, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 2, 0, + 0, 0, 21, 0, 0, 0, + 89, 8, 0, 4, 70, 142, + 32, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 2, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 3, 0, 0, 0, 95, 0, + 0, 3, 18, 16, 16, 0, + 4, 0, 0, 0, 95, 0, + 0, 3, 18, 16, 16, 0, + 5, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 3, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 4, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 5, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 6, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 7, 0, + 0, 0, 104, 0, 0, 2, + 5, 0, 0, 0, 38, 0, + 0, 8, 0, 208, 0, 0, + 18, 0, 16, 0, 0, 0, + 0, 0, 10, 16, 16, 0, + 4, 0, 0, 0, 1, 64, + 0, 0, 3, 0, 0, 0, + 56, 0, 0, 9, 242, 0, + 16, 0, 1, 0, 0, 0, + 6, 16, 16, 0, 5, 0, + 0, 0, 70, 142, 32, 4, + 4, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 17, 0, 0, 7, 18, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 10, 242, 0, 16, 0, + 3, 0, 0, 0, 6, 16, + 16, 0, 5, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 10, + 242, 0, 16, 0, 0, 0, + 0, 0, 6, 16, 16, 0, + 5, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 2, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 17, 0, 0, 7, 34, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 3, 0, 0, 0, 17, 0, + 0, 7, 66, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 130, 0, 16, 0, 2, 0, + 0, 0, 58, 16, 16, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 4, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 5, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 6, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 7, 0, 0, 0, + 54, 0, 0, 6, 242, 32, + 16, 0, 1, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 5, 50, 0, + 16, 0, 4, 0, 0, 0, + 70, 16, 16, 0, 3, 0, + 0, 0, 54, 0, 0, 5, + 66, 0, 16, 0, 4, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 128, 63, 16, 0, + 0, 8, 18, 32, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 131, 32, 0, 2, 0, + 0, 0, 16, 0, 0, 0, + 16, 0, 0, 8, 34, 32, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 131, 32, 0, + 2, 0, 0, 0, 17, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 4, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 0, 0, 7, 18, 32, + 16, 0, 6, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 7, 34, 0, 16, 0, + 4, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 34, 32, 16, 0, 6, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 66, 0, + 16, 0, 4, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 7, 66, 32, 16, 0, + 6, 0, 0, 0, 70, 18, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 8, + 18, 32, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 16, 0, + 0, 8, 34, 32, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 16, 0, 0, 8, 66, 32, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 2, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 7, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 5, 114, 32, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 114, 32, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 20, 0, 0, 0, + 54, 0, 0, 5, 130, 32, + 16, 0, 6, 0, 0, 0, + 58, 16, 16, 0, 2, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 216, 0, + 0, 0, 6, 0, 0, 0, + 8, 0, 0, 0, 152, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 164, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 171, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 15, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 3, 3, 0, 0, 188, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 4, 0, 0, 0, + 15, 1, 0, 0, 201, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 5, 0, 0, 0, + 15, 1, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 84, + 65, 78, 71, 69, 78, 84, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 66, 76, + 69, 78, 68, 73, 78, 68, + 73, 67, 69, 83, 0, 66, + 76, 69, 78, 68, 87, 69, + 73, 71, 72, 84, 0, 171, + 171, 171, 79, 83, 71, 78, + 228, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, + 200, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 212, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 218, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 12, 0, 0, + 218, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 4, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 5, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 6, 0, + 0, 0, 15, 0, 0, 0, + 218, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 7, 0, + 0, 0, 7, 8, 0, 0, + 83, 86, 95, 80, 79, 83, + 73, 84, 73, 79, 78, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1Bones.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1Bones.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8cc652cf45fa109366f08bb4d0469388b9f066a2 GIT binary patch literal 32256 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1BonesVc.inc b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1BonesVc.inc new file mode 100644 index 0000000..302d284 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1BonesVc.inc @@ -0,0 +1,859 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Position 0 xyzw 0 NONE float xyzw +// NORMAL 0 xyz 1 NONE float xyz +// TANGENT 0 xyzw 2 NONE float xyzw +// COLOR 0 xyzw 3 NONE float xyzw +// TEXCOORD 0 xy 4 NONE float xy +// BLENDINDICES 0 xyzw 5 NONE uint x +// BLENDWEIGHT 0 xyzw 6 NONE float x +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float xyzw +// COLOR 0 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// TEXCOORD 1 xyz 3 NONE float xyz +// TEXCOORD 2 xyz 4 NONE float xyz +// TEXCOORD 3 xyz 5 NONE float xyz +// TEXCOORD 4 xyzw 6 NONE float xyzw +// TEXCOORD 5 xyz 7 NONE float xyz +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb4 0 216 ( FLT, FLT, FLT, FLT) +// c217 cb0 1 1 ( FLT, FLT, FLT, FLT) +// c218 cb2 0 3 ( FLT, FLT, FLT, FLT) +// c221 cb2 4 4 ( FLT, FLT, FLT, FLT) +// c225 cb2 16 2 ( FLT, FLT, FLT, FLT) +// c227 cb2 20 1 ( FLT, FLT, FLT, FLT) +// +// +// Runtime generated constant mappings: +// +// Target Reg Constant Description +// ---------- -------------------------------------------------- +// c216 Vertex Shader position offset +// +// +// Level9 shader bytecode: +// + vs_2_0 + def c228, 3, 1, 0, 0 + dcl_texcoord v0 // vertex<0,1,2,3> + dcl_texcoord1 v1 // vertex<4,5,6> + dcl_texcoord2 v2 // vertex<7,8,9,10> + dcl_texcoord3 v3 // vertex<11,12,13,14> + dcl_texcoord4 v4 // vertex<15,16> + dcl_texcoord5 v5 // vertex<17,18,19,20> + dcl_texcoord6 v6 // vertex<21,22,23,24> + +#line 112 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLEffect.fx" + mul r0.x, v5.x, c228.x + mova a0.x, r0.x + mul r0, v6.x, c0[a0.x] // ::skinning<0,3,6,9> + +#line 117 + dp3 oT5.x, v2, r0 // ::main1BonesVc<19> + +#line 112 + mul r1, v6.x, c1[a0.x] // ::skinning<1,4,7,10> + mul r2, v6.x, c2[a0.x] // ::skinning<2,5,8,11> + +#line 117 + dp3 oT5.y, v2, r1 // ::main1BonesVc<20> + dp3 oT5.z, v2, r2 // ::main1BonesVc<21> + dp4 r3.x, v0, r0 // SkinVc::vertex<0> + dp3 r0.x, v1, r0 // SkinVc::vertex<4> + dp4 r3.y, v0, r1 // SkinVc::vertex<1> + dp3 r0.y, v1, r1 // SkinVc::vertex<5> + dp4 r3.z, v0, r2 // SkinVc::vertex<2> + dp3 r0.z, v1, r2 // SkinVc::vertex<6> + +#line 237 + mov r3.w, v0.w + +#line 240 + dp4 oPos.z, r3, c223 // ::main1BonesVc<2> + mul oT0, v3, c217 // ::main1BonesVc<4,5,6,7> + mad r1.xyz, v4.xyxw, c228.yyzw, c228.zzyw + dp3 oT1.x, r1, c225.xyww // ::main1BonesVc<8> + dp3 oT1.y, r1, c226.xyww // ::main1BonesVc<9> + dp3 oT2.x, r0, c218 // ::main1BonesVc<10> + dp3 oT2.y, r0, c219 // ::main1BonesVc<11> + dp3 oT2.z, r0, c220 // ::main1BonesVc<12> + +#line 116 + mov oT6.xyz, r0 // ::main1BonesVc<23,24,25> + +#line 237 + dp4 r0.x, r3, c218 // ::wp<0> + dp4 r0.y, r3, c219 // ::wp<1> + dp4 r0.z, r3, c220 // ::wp<2> + +#line 245 + add oT4.xyz, -r0, c227 // ::main1BonesVc<16,17,18> + +#line 237 + mov oT3.xyz, r0 // ::main1BonesVc<13,14,15> + +#line 240 + dp4 r0.x, r3, c221 // ::result<0> + dp4 r0.y, r3, c222 // ::result<1> + dp4 r0.z, r3, c224 // ::result<3> + +#line 231 + mad oPos.xy, r0.z, c216, r0 // ::main1BonesVc<0,1> + mov oPos.w, r0.z // ::main1BonesVc<3> + +#line 117 + mov oT5.w, v2.w // ::main1BonesVc<22> + +// approximately 35 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_constantbuffer CB2[21], immediateIndexed +dcl_constantbuffer CB4[216], dynamicIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_input v3.xyzw +dcl_input v4.xy +dcl_input v5.x +dcl_input v6.x +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output o3.xyz +dcl_output o4.xyz +dcl_output o5.xyz +dcl_output o6.xyzw +dcl_output o7.xyz +dcl_temps 5 +imul null, r0.x, v5.x, l(3) +mul r1.xyzw, v6.xxxx, cb4[r0.x + 0].xyzw +dp4 r2.x, v0.xyzw, r1.xyzw +mul r3.xyzw, v6.xxxx, cb4[r0.x + 1].xyzw +mul r0.xyzw, v6.xxxx, cb4[r0.x + 2].xyzw +dp4 r2.y, v0.xyzw, r3.xyzw +dp4 r2.z, v0.xyzw, r0.xyzw +mov r2.w, v0.w +dp4 o0.x, r2.xyzw, cb2[4].xyzw +dp4 o0.y, r2.xyzw, cb2[5].xyzw +dp4 o0.z, r2.xyzw, cb2[6].xyzw +dp4 o0.w, r2.xyzw, cb2[7].xyzw +mul o1.xyzw, v3.xyzw, cb0[1].xyzw +mov r4.xy, v4.xyxx +mov r4.z, l(1.000000) +dp3 o2.x, r4.xyzx, cb2[16].xywx +dp3 o2.y, r4.xyzx, cb2[17].xywx +dp3 r4.x, v1.xyzx, r1.xyzx +dp3 o6.x, v2.xyzx, r1.xyzx +dp3 r4.y, v1.xyzx, r3.xyzx +dp3 o6.y, v2.xyzx, r3.xyzx +dp3 r4.z, v1.xyzx, r0.xyzx +dp3 o6.z, v2.xyzx, r0.xyzx +dp3 o3.x, r4.xyzx, cb2[0].xyzx +dp3 o3.y, r4.xyzx, cb2[1].xyzx +dp3 o3.z, r4.xyzx, cb2[2].xyzx +mov o7.xyz, r4.xyzx +dp4 r0.x, r2.xyzw, cb2[0].xyzw +dp4 r0.y, r2.xyzw, cb2[1].xyzw +dp4 r0.z, r2.xyzw, cb2[2].xyzw +mov o4.xyz, r0.xyzx +add o5.xyz, -r0.xyzx, cb2[20].xyzx +mov o6.w, v2.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLEffect_main1BonesVc[] = +{ + 68, 88, 66, 67, 165, 199, + 30, 167, 21, 102, 124, 103, + 224, 118, 76, 142, 104, 173, + 104, 228, 1, 0, 0, 0, + 204, 15, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 20, 9, 0, 0, 228, 13, + 0, 0, 224, 14, 0, 0, + 65, 111, 110, 57, 220, 8, + 0, 0, 220, 8, 0, 0, + 0, 2, 254, 255, 108, 8, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 1, 0, 217, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 218, 0, 0, 0, + 0, 0, 2, 0, 4, 0, + 4, 0, 221, 0, 0, 0, + 0, 0, 2, 0, 16, 0, + 2, 0, 225, 0, 0, 0, + 0, 0, 2, 0, 20, 0, + 1, 0, 227, 0, 0, 0, + 0, 0, 0, 0, 216, 0, + 0, 2, 254, 255, 254, 255, + 114, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 156, 5, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 43, 0, 0, 0, + 120, 0, 0, 0, 6, 0, + 0, 0, 36, 5, 0, 0, + 208, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 69, 102, 102, + 101, 99, 116, 46, 102, 120, + 0, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 208, 5, + 0, 0, 0, 0, 255, 255, + 232, 5, 0, 0, 0, 0, + 255, 255, 244, 5, 0, 0, + 0, 0, 255, 255, 0, 6, + 0, 0, 0, 0, 255, 255, + 12, 6, 0, 0, 0, 0, + 255, 255, 24, 6, 0, 0, + 0, 0, 255, 255, 36, 6, + 0, 0, 0, 0, 255, 255, + 48, 6, 0, 0, 112, 0, + 0, 0, 60, 6, 0, 0, + 112, 0, 0, 0, 76, 6, + 0, 0, 112, 0, 0, 0, + 88, 6, 0, 0, 117, 0, + 0, 0, 108, 6, 0, 0, + 112, 0, 0, 0, 124, 6, + 0, 0, 112, 0, 0, 0, + 144, 6, 0, 0, 117, 0, + 0, 0, 164, 6, 0, 0, + 117, 0, 0, 0, 180, 6, + 0, 0, 115, 0, 0, 0, + 196, 6, 0, 0, 116, 0, + 0, 0, 212, 6, 0, 0, + 115, 0, 0, 0, 228, 6, + 0, 0, 116, 0, 0, 0, + 244, 6, 0, 0, 115, 0, + 0, 0, 4, 7, 0, 0, + 116, 0, 0, 0, 20, 7, + 0, 0, 237, 0, 0, 0, + 36, 7, 0, 0, 240, 0, + 0, 0, 48, 7, 0, 0, + 241, 0, 0, 0, 64, 7, + 0, 0, 242, 0, 0, 0, + 80, 7, 0, 0, 242, 0, + 0, 0, 100, 7, 0, 0, + 242, 0, 0, 0, 116, 7, + 0, 0, 243, 0, 0, 0, + 132, 7, 0, 0, 243, 0, + 0, 0, 148, 7, 0, 0, + 243, 0, 0, 0, 164, 7, + 0, 0, 116, 0, 0, 0, + 180, 7, 0, 0, 237, 0, + 0, 0, 192, 7, 0, 0, + 237, 0, 0, 0, 208, 7, + 0, 0, 237, 0, 0, 0, + 224, 7, 0, 0, 245, 0, + 0, 0, 240, 7, 0, 0, + 237, 0, 0, 0, 0, 8, + 0, 0, 240, 0, 0, 0, + 12, 8, 0, 0, 240, 0, + 0, 0, 28, 8, 0, 0, + 240, 0, 0, 0, 44, 8, + 0, 0, 231, 0, 0, 0, + 60, 8, 0, 0, 231, 0, + 0, 0, 80, 8, 0, 0, + 117, 0, 0, 0, 92, 8, + 0, 0, 109, 97, 105, 110, + 49, 66, 111, 110, 101, 115, + 86, 99, 0, 112, 111, 115, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 117, 118, + 0, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 80, 111, 115, + 0, 116, 111, 69, 121, 101, + 0, 116, 97, 110, 103, 101, + 110, 116, 0, 110, 111, 114, + 109, 97, 108, 0, 171, 171, + 221, 1, 0, 0, 228, 1, + 0, 0, 244, 1, 0, 0, + 228, 1, 0, 0, 252, 1, + 0, 0, 0, 2, 0, 0, + 16, 2, 0, 0, 28, 2, + 0, 0, 44, 2, 0, 0, + 28, 2, 0, 0, 53, 2, + 0, 0, 28, 2, 0, 0, + 59, 2, 0, 0, 228, 1, + 0, 0, 67, 2, 0, 0, + 28, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 76, 2, + 0, 0, 11, 0, 0, 0, + 19, 0, 255, 255, 255, 255, + 255, 255, 14, 0, 0, 0, + 255, 255, 20, 0, 255, 255, + 255, 255, 15, 0, 0, 0, + 255, 255, 255, 255, 21, 0, + 255, 255, 23, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 24, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 26, 0, 0, 0, + 8, 0, 255, 255, 255, 255, + 255, 255, 27, 0, 0, 0, + 255, 255, 9, 0, 255, 255, + 255, 255, 28, 0, 0, 0, + 10, 0, 255, 255, 255, 255, + 255, 255, 29, 0, 0, 0, + 255, 255, 11, 0, 255, 255, + 255, 255, 30, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 31, 0, 0, 0, + 23, 0, 24, 0, 25, 0, + 255, 255, 35, 0, 0, 0, + 16, 0, 17, 0, 18, 0, + 255, 255, 36, 0, 0, 0, + 13, 0, 14, 0, 15, 0, + 255, 255, 40, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 41, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 42, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 22, 0, 114, 101, 115, 117, + 108, 116, 0, 171, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 76, 2, + 0, 0, 37, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 38, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 39, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 115, 107, 105, 110, + 110, 105, 110, 103, 0, 171, + 171, 171, 3, 0, 3, 0, + 4, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 12, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 13, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 83, 107, 105, 110, 86, 99, + 0, 118, 101, 114, 116, 101, + 120, 0, 99, 111, 108, 111, + 114, 0, 98, 111, 110, 101, + 73, 110, 100, 105, 99, 101, + 115, 0, 1, 0, 2, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 98, 108, 101, 110, 100, 87, + 101, 105, 103, 104, 116, 115, + 0, 171, 171, 171, 221, 1, + 0, 0, 228, 1, 0, 0, + 67, 2, 0, 0, 28, 2, + 0, 0, 59, 2, 0, 0, + 228, 1, 0, 0, 230, 3, + 0, 0, 228, 1, 0, 0, + 252, 1, 0, 0, 0, 2, + 0, 0, 236, 3, 0, 0, + 248, 3, 0, 0, 8, 4, + 0, 0, 228, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 25, 0, 1, 0, 7, 0, + 24, 4, 0, 0, 16, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 17, 0, + 0, 0, 4, 0, 255, 255, + 255, 255, 255, 255, 18, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 19, 0, + 0, 0, 255, 255, 5, 0, + 255, 255, 255, 255, 20, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 21, 0, + 0, 0, 255, 255, 255, 255, + 6, 0, 255, 255, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 3, 0, + 0, 0, 7, 0, 8, 0, + 9, 0, 10, 0, 4, 0, + 0, 0, 11, 0, 12, 0, + 13, 0, 14, 0, 5, 0, + 0, 0, 15, 0, 16, 0, + 255, 255, 255, 255, 6, 0, + 0, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 7, 0, + 0, 0, 21, 0, 22, 0, + 23, 0, 24, 0, 119, 112, + 0, 171, 32, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 33, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 34, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 0, 0, 0, 0, + 208, 1, 0, 0, 140, 2, + 0, 0, 16, 0, 0, 0, + 156, 2, 0, 0, 0, 0, + 0, 0, 92, 3, 0, 0, + 100, 3, 0, 0, 3, 0, + 0, 0, 116, 3, 0, 0, + 0, 0, 0, 0, 152, 3, + 0, 0, 164, 3, 0, 0, + 3, 0, 0, 0, 180, 3, + 0, 0, 216, 3, 0, 0, + 223, 3, 0, 0, 80, 4, + 0, 0, 6, 0, 0, 0, + 96, 4, 0, 0, 208, 1, + 0, 0, 223, 3, 0, 0, + 80, 4, 0, 0, 7, 0, + 0, 0, 168, 4, 0, 0, + 0, 0, 0, 0, 252, 4, + 0, 0, 28, 2, 0, 0, + 3, 0, 0, 0, 0, 5, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 228, 0, + 15, 160, 0, 0, 64, 64, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 3, 128, 3, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 4, 128, 4, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 5, 128, 5, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 6, 128, 6, 0, 15, 144, + 5, 0, 0, 3, 0, 0, + 1, 128, 5, 0, 0, 144, + 228, 0, 0, 160, 46, 0, + 0, 2, 0, 0, 1, 176, + 0, 0, 0, 128, 5, 0, + 0, 4, 0, 0, 15, 128, + 6, 0, 0, 144, 0, 32, + 228, 160, 0, 0, 0, 176, + 8, 0, 0, 3, 5, 0, + 1, 224, 2, 0, 228, 144, + 0, 0, 228, 128, 5, 0, + 0, 4, 1, 0, 15, 128, + 6, 0, 0, 144, 1, 32, + 228, 160, 0, 0, 0, 176, + 5, 0, 0, 4, 2, 0, + 15, 128, 6, 0, 0, 144, + 2, 32, 228, 160, 0, 0, + 0, 176, 8, 0, 0, 3, + 5, 0, 2, 224, 2, 0, + 228, 144, 1, 0, 228, 128, + 8, 0, 0, 3, 5, 0, + 4, 224, 2, 0, 228, 144, + 2, 0, 228, 128, 9, 0, + 0, 3, 3, 0, 1, 128, + 0, 0, 228, 144, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 144, 0, 0, 228, 128, + 9, 0, 0, 3, 3, 0, + 2, 128, 0, 0, 228, 144, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 2, 128, + 1, 0, 228, 144, 1, 0, + 228, 128, 9, 0, 0, 3, + 3, 0, 4, 128, 0, 0, + 228, 144, 2, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 4, 128, 1, 0, 228, 144, + 2, 0, 228, 128, 1, 0, + 0, 2, 3, 0, 8, 128, + 0, 0, 255, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 3, 0, 228, 128, 223, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 15, 224, 3, 0, + 228, 144, 217, 0, 228, 160, + 4, 0, 0, 4, 1, 0, + 7, 128, 4, 0, 196, 144, + 228, 0, 229, 160, 228, 0, + 218, 160, 8, 0, 0, 3, + 1, 0, 1, 224, 1, 0, + 228, 128, 225, 0, 244, 160, + 8, 0, 0, 3, 1, 0, + 2, 224, 1, 0, 228, 128, + 226, 0, 244, 160, 8, 0, + 0, 3, 2, 0, 1, 224, + 0, 0, 228, 128, 218, 0, + 228, 160, 8, 0, 0, 3, + 2, 0, 2, 224, 0, 0, + 228, 128, 219, 0, 228, 160, + 8, 0, 0, 3, 2, 0, + 4, 224, 0, 0, 228, 128, + 220, 0, 228, 160, 1, 0, + 0, 2, 6, 0, 7, 224, + 0, 0, 228, 128, 9, 0, + 0, 3, 0, 0, 1, 128, + 3, 0, 228, 128, 218, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 3, 0, + 228, 128, 219, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 3, 0, 228, 128, + 220, 0, 228, 160, 2, 0, + 0, 3, 4, 0, 7, 224, + 0, 0, 228, 129, 227, 0, + 228, 160, 1, 0, 0, 2, + 3, 0, 7, 224, 0, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 1, 128, 3, 0, + 228, 128, 221, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 3, 0, 228, 128, + 222, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 3, 0, 228, 128, 224, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 216, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 5, 0, 8, 224, + 2, 0, 255, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 200, 4, 0, 0, 64, 0, + 1, 0, 50, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 2, 0, 0, 0, 21, 0, + 0, 0, 89, 8, 0, 4, + 70, 142, 32, 0, 4, 0, + 0, 0, 216, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 3, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 4, 0, 0, 0, + 95, 0, 0, 3, 18, 16, + 16, 0, 5, 0, 0, 0, + 95, 0, 0, 3, 18, 16, + 16, 0, 6, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 3, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 4, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 5, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 6, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 7, 0, 0, 0, 104, 0, + 0, 2, 5, 0, 0, 0, + 38, 0, 0, 8, 0, 208, + 0, 0, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 16, + 16, 0, 5, 0, 0, 0, + 1, 64, 0, 0, 3, 0, + 0, 0, 56, 0, 0, 9, + 242, 0, 16, 0, 1, 0, + 0, 0, 6, 16, 16, 0, + 6, 0, 0, 0, 70, 142, + 32, 4, 4, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 17, 0, 0, 7, + 18, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 10, 242, 0, + 16, 0, 3, 0, 0, 0, + 6, 16, 16, 0, 6, 0, + 0, 0, 70, 142, 32, 6, + 4, 0, 0, 0, 1, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 10, 242, 0, 16, 0, + 0, 0, 0, 0, 6, 16, + 16, 0, 6, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 2, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 17, 0, 0, 7, + 34, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 3, 0, 0, 0, + 17, 0, 0, 7, 66, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 130, 0, 16, 0, + 2, 0, 0, 0, 58, 16, + 16, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 4, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 5, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 6, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 7, 0, + 0, 0, 56, 0, 0, 8, + 242, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 3, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 54, 0, + 0, 5, 50, 0, 16, 0, + 4, 0, 0, 0, 70, 16, + 16, 0, 4, 0, 0, 0, + 54, 0, 0, 5, 66, 0, + 16, 0, 4, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 128, 63, 16, 0, 0, 8, + 18, 32, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 131, + 32, 0, 2, 0, 0, 0, + 16, 0, 0, 0, 16, 0, + 0, 8, 34, 32, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 131, 32, 0, 2, 0, + 0, 0, 17, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 4, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 7, 18, 32, 16, 0, + 6, 0, 0, 0, 70, 18, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 0, 0, 7, + 34, 0, 16, 0, 4, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 34, 32, + 16, 0, 6, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 66, 0, 16, 0, + 4, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 7, + 66, 32, 16, 0, 6, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 8, 18, 32, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 8, + 34, 32, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 16, 0, + 0, 8, 66, 32, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 2, 0, 0, 0, + 54, 0, 0, 5, 114, 32, + 16, 0, 7, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 17, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 34, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 17, 0, 0, 8, 66, 0, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 2, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 0, 0, + 0, 9, 114, 32, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 20, 0, 0, 0, 54, 0, + 0, 5, 130, 32, 16, 0, + 6, 0, 0, 0, 58, 16, + 16, 0, 2, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 244, 0, 0, 0, + 7, 0, 0, 0, 8, 0, + 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 188, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 195, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 15, + 0, 0, 203, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 15, 15, + 0, 0, 209, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 3, 3, + 0, 0, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 5, 0, 0, 0, 15, 1, + 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 6, 0, 0, 0, 15, 1, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 84, 65, 78, + 71, 69, 78, 84, 0, 67, + 79, 76, 79, 82, 0, 84, + 69, 88, 67, 79, 79, 82, + 68, 0, 66, 76, 69, 78, + 68, 73, 78, 68, 73, 67, + 69, 83, 0, 66, 76, 69, + 78, 68, 87, 69, 73, 71, + 72, 84, 0, 171, 79, 83, + 71, 78, 228, 0, 0, 0, + 8, 0, 0, 0, 8, 0, + 0, 0, 200, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 212, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 12, + 0, 0, 218, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 5, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 4, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 6, 0, 0, 0, 15, 0, + 0, 0, 218, 0, 0, 0, + 5, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 7, 0, 0, 0, 7, 8, + 0, 0, 83, 86, 95, 80, + 79, 83, 73, 84, 73, 79, + 78, 0, 67, 79, 76, 79, + 82, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1BonesVc.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main1BonesVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..db34d984ad9f9f3d24adbf5b7caead629725cd3b GIT binary patch literal 32256 zcmeHQU2I%O6+YKaT-)&`wwt7GYUmK$VmHqEZ`-D>Q~a}=ddb?m@opSL9VMIHwY|+| z*WDk-p^6lWkWv(+J`_}`AP@pn1W2ufpj15YP=3TysgOXxLxlhp0ir2wRU}mNow+mX z+4b5dQ=JMGE2^Uch;GiT16nY(x9dMp{sW^$RCycp>k*|$%Og%64Q-QC@;`aRw- zAymo#>65r@u^1qF&}PoR9|8^hY{?0mSpx@b8-8Om>tHjteJlE3fCg+kAl3z6)_^$8 z2_J3^RDZae=d|t$8hF~>V|5;Udy1EK?|l1(zda$I9eMtnckVp!O)IU7a++HDX^8%G zq^}$*ra2cIM+13ReODKgn9Jwq`@6cLr=#vOxvqs=U;K1ZrMl{4rwTJOiL4ll<`dau zG&LE`=0v~9CT5d4Afo+LcZaL~aaX-Sm`P=#c~3F#(3w-oL^}Uq#YAs%W~Pu!R89=f zCt`(EG+Q~iY2vD}d0sYesBd|5NvPxY3!V$mZ4nOHOx z$sEgMQ*qCtr=&8=$)Rk9B_=9mkwqgJDX4-3l{}eDoUM?0bTX2SrgJly?3uFEKH)o; z2xW4~d@_?(ZCq~Qa3-Bt(LPUk`+o5mqQL9bRQS9_-vzf`vS|LR7CrN-MbG}Rid-Kh zI$vK!(eDu*4Oda<3l=^06N`TSMimXUS#b9 zg6PHXV}@zmIOAcn)f59iGU^YDk)YQnhQ__ZKYl1UF*X$O2ge2Q&_r<3@AY}b-k~t! zd&Mz-WHfj*B90ABObm@jJ}rWWr27~e|Fk&lANO_&A9DC6gl{S|;R}aRG&mvrW1)cG zheZGQNZ_c~KmM>7hLG`KLI93>fHJseqR`O5o5lIkx|@oXxJa{_m8XbJ=vx>21Uuo}Blq_nFS_SkK3j<8#Zd2L`FuH_;VCsddBSk%#p$$9 zq%i@&(E2fGFg^p_CG(KTN7J*IWRV;h8h_X~9w|xh6@>*(@=c8dgA-m(;|bAKzg(LW zld&6EA&-b`%v&u>^PFaKJYX z7w7el_`)SEL&j7h9aojtIgk1L50A?JTG1ye=gr(T>#Kyx-q7lO91Qz;nkpR#aeG0j zEz3+?r3>Y9wNISo_1!oI8H(zG(qk4^Sui?{9KEGE@)<12jO0Eu*<+4UH55yhlg1#| zHMkc7Y_pKlSNL=?old4_#atpak4a{xkdE=3g^{q3NyY`Iwqr5kl{Pz)DWvn|OG3DY+zX= zqWktiE*r<=Hsi~p*nJ0;XB2kL+{OTUBzasM7xxrXj1lt)?!umwWu4d6QWD@j-HYcw zi^`lSq}rFk&f;A=R7sVl{Ao#k8|xJ9woNSdb?7RW6;|%nxT7l4p`@z}tBI1eFZS4E zY-OKK#*_wb!d_EtEbX+_`Yib&>M=P6C*@!gxw&XOk?qI4EHD!H+dA1Vr?pN7wdJ_# z;l#w5CRX1;paJit7h zKs=g{+PHlWH!m_uOddd|e#AAOVYR`la@wsPEIwhEKDn!GSZ3JL?cV_OI4mr<;eC|Z zAabr#ba#rLj!sefbjyuVqf`l8_R1x-UO7<9)lxwWd+vi!YH5<~vJaZi(qjM0TxxxF zP`5%2@KRYtpQ4&-$7LSf3;9Aez1-o_4^*9FX4`z2*CclD@|eeHuyMWaa-7^|aB`TJCa+@R z>|M?FdavE~dL7%_oD=L-+MZ`M+w)wz?RgyA+nly{b&IQ;L^@uK7g zn|hsfU@EVdeRy0^>bQ>Uz?I%`<-^7mrs3;ij~iqz2*yB3d z<7RvPPw)Nvy?^sYuIKK=KO_CqNAbElH$5^}h@Cz*?M>uP=QH!u-acl9 zxRkY+KRum;Ec-WAptHGDq9_X!ma|8JPiU;e9)&yp+-+Sz*N^`Bo$xPz{HpbSH}!FT z91)TG1DSIe1GR%#_V3<%EwBT&#rXm%4a^BQi3YZy9>X-y)W{uV)uW$Yul_;5=F9tI z+9x{1XdoOA_Hc(So|#Xk@CLG{+uehrhv;CFHJ8ez4yB^AIqF{Q=^>6rqS@I*o)&T^ zJSVzOq!J5>)QJa9*lE6WK6{S%&4~TO;$)1dml~T`HG_5hFVQP%gEI4a>?3;@m_^?x zDdeVynzkaXj_kQn7F^?>-4trF(l)~RO`94u@|!l^ zZQ!PjYg=YHrj2V`W?UHh6owpgY_%D9qmdsbP}I*(1K(-jEe76V;H?JUYT#txfQ$0C z82AJ_Eq=5W-U~>md?&2x@O=$w@(Fap#!*?MNi568t1x9Nqinxb{#oC z*JV-SAzTyvh{l?@oqx-N4z#S}+e<^nDsMaJI3K z#Pb+;%ktUAE=qg=py<+ohQ$?eC;vMlSFRd39Gu<)e*^Nt0Z!+!!0F!t{}1Ad)5|KZ zIQ>P%6{jueum2*y;?#mT>rZj%3pswk#-$JB_>_t-s`84{CB)xGy5jV_N>`j-R&m8) zdAmWoJ^;U$nlQs{rTeIv?p=d>aECsm2a*5q8vOm%!-sLH}E*?dMeF_KWgP=I*66kr*D>lxS9x&Gi{Vks+aU8+(KhgpQtPfkq``cN^8g~4pS=}qu}_v|knh8C zcF1e0GRtvUS#D65^T@nSM!9BHj%D!LMa$c1;5^SU-b}l9?Z)+9SrrUA7s>YCrt)$X zH*?tb>mG~eP*(cwpkJZ0>v0O4`(bH`d(j?8JeGJaE>uNzfY(SP2&tZ^>c zVB>uz&bCx**^I~6wr$+|PK0YMqoKb=` zxScaf^7AfNb@t8Kd$o>xulQV0rQOob86|n(**S>Ghh%T?&ghD^cZJQ-*K|H^gKUb{ z-vM(D0rOW^uE!zZmAmpQ+TIm5LSK{ZZIBJnj_vWsJhUUc9=2C$)?Ilf#5tp+J}px` zl;fOL=TA-*)#02`QlE&t;oszNo=a}{%5bHByu#G%oKZ?StHtZFTEu=yI|PhZlw-Jl z2E^~7`Ca#H@vWB>T)8_4=tcJP&bJ8VUL2GaC2&458c(o zHG2wVm7T@gOGla-F~76PG|ImWv$Rz9;|umx9%;H&=HUUy-ehU1>{EPnw~=SCG>`e# zrBs$>%PRdoAn!3f(zHw6Z&2kizJgDCklrHG*<;u;I?n88`#T-S9x^UtG~ z{{|JWG5SFq*irGbPd$j!IPl-7+6&Utn)7#QSSwc_c#NN|>yhXFT~vQ*JN@vhJMaV; zfd~QW1Wkc-;D^53bwqLQBMyA7N#I$5uXU)xscf%0%Wa=U(xpvrcKZ~~L-xYq3?>1Zj%-?VLCl+=oT!YDPJIq1Xow)udi1+&Q^8=5=kAWTl z^@4aE$m6sPbQkDu&?i9cpbpSIpnV{gvmfLJb%DA;Js`F-9@lI>Jm$B7`2H@?cF+zG z*Ps1DGw4 + dcl_texcoord1 v1 // vertex<4,5,6> + dcl_texcoord2 v2 // vertex<7,8,9,10> + dcl_texcoord3 v3 // vertex<11,12> + dcl_texcoord4 v4 // vertex<13,14,15,16> + dcl_texcoord5 v5 // vertex<17,18,19,20> + +#line 97 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLEffect.fx" + mul r0.xy, v4, c228.x + mova a0.xy, r0.yxzw + mul r0, v5.y, c0[a0.x] + mad r0, c0[a0.y], v5.x, r0 // ::skinning<0,3,6,9> + +#line 102 + dp3 oT5.x, v2, r0 // ::main2Bones<19> + +#line 97 + mul r1, v5.y, c1[a0.x] + mul r2, v5.y, c2[a0.x] + mad r2, c2[a0.y], v5.x, r2 // ::skinning<2,5,8,11> + mad r1, c1[a0.y], v5.x, r1 // ::skinning<1,4,7,10> + +#line 102 + dp3 oT5.y, v2, r1 // ::main2Bones<20> + dp3 oT5.z, v2, r2 // ::main2Bones<21> + dp4 r3.x, v0, r0 // Skin::vertex<0> + dp3 r0.x, v1, r0 // Skin::vertex<4> + dp4 r3.y, v0, r1 // Skin::vertex<1> + dp3 r0.y, v1, r1 // Skin::vertex<5> + dp4 r3.z, v0, r2 // Skin::vertex<2> + dp3 r0.z, v1, r2 // Skin::vertex<6> + +#line 192 + mov r3.w, v0.w + +#line 195 + dp4 oPos.z, r3, c223 // ::main2Bones<2> + mad r1.xyz, v3.xyxw, c228.yyzw, c228.zzyw + dp3 oT1.x, r1, c225.xyww // ::main2Bones<8> + dp3 oT1.y, r1, c226.xyww // ::main2Bones<9> + dp3 oT2.x, r0, c218 // ::main2Bones<10> + dp3 oT2.y, r0, c219 // ::main2Bones<11> + dp3 oT2.z, r0, c220 // ::main2Bones<12> + +#line 101 + mov oT6.xyz, r0 // ::main2Bones<23,24,25> + +#line 192 + dp4 r0.x, r3, c218 // ::wp<0> + dp4 r0.y, r3, c219 // ::wp<1> + dp4 r0.z, r3, c220 // ::wp<2> + +#line 200 + add oT4.xyz, -r0, c227 // ::main2Bones<16,17,18> + +#line 192 + mov oT3.xyz, r0 // ::main2Bones<13,14,15> + +#line 195 + dp4 r0.x, r3, c221 // ::result<0> + dp4 r0.y, r3, c222 // ::result<1> + dp4 r0.z, r3, c224 // ::result<3> + +#line 186 + mad oPos.xy, r0.z, c216, r0 // ::main2Bones<0,1> + mov oPos.w, r0.z // ::main2Bones<3> + +#line 196 + mov oT0, c217 // ::main2Bones<4,5,6,7> + +#line 102 + mov oT5.w, v2.w // ::main2Bones<22> + +// approximately 38 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_constantbuffer CB2[21], immediateIndexed +dcl_constantbuffer CB4[216], dynamicIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_input v3.xy +dcl_input v4.xy +dcl_input v5.xy +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output o3.xyz +dcl_output o4.xyz +dcl_output o5.xyz +dcl_output o6.xyzw +dcl_output o7.xyz +dcl_temps 5 +imul null, r0.xy, v4.xyxx, l(3, 3, 0, 0) +mul r1.xyzw, v5.yyyy, cb4[r0.y + 0].xyzw +mad r1.xyzw, cb4[r0.x + 0].xyzw, v5.xxxx, r1.xyzw +dp4 r2.x, v0.xyzw, r1.xyzw +mul r3.xyzw, v5.yyyy, cb4[r0.y + 1].xyzw +mad r3.xyzw, cb4[r0.x + 1].xyzw, v5.xxxx, r3.xyzw +dp4 r2.y, v0.xyzw, r3.xyzw +mul r4.xyzw, v5.yyyy, cb4[r0.y + 2].xyzw +mad r0.xyzw, cb4[r0.x + 2].xyzw, v5.xxxx, r4.xyzw +dp4 r2.z, v0.xyzw, r0.xyzw +mov r2.w, v0.w +dp4 o0.x, r2.xyzw, cb2[4].xyzw +dp4 o0.y, r2.xyzw, cb2[5].xyzw +dp4 o0.z, r2.xyzw, cb2[6].xyzw +dp4 o0.w, r2.xyzw, cb2[7].xyzw +mov o1.xyzw, cb0[1].xyzw +mov r4.xy, v3.xyxx +mov r4.z, l(1.000000) +dp3 o2.x, r4.xyzx, cb2[16].xywx +dp3 o2.y, r4.xyzx, cb2[17].xywx +dp3 r4.x, v1.xyzx, r1.xyzx +dp3 o6.x, v2.xyzx, r1.xyzx +dp3 r4.y, v1.xyzx, r3.xyzx +dp3 o6.y, v2.xyzx, r3.xyzx +dp3 r4.z, v1.xyzx, r0.xyzx +dp3 o6.z, v2.xyzx, r0.xyzx +dp3 o3.x, r4.xyzx, cb2[0].xyzx +dp3 o3.y, r4.xyzx, cb2[1].xyzx +dp3 o3.z, r4.xyzx, cb2[2].xyzx +mov o7.xyz, r4.xyzx +dp4 r0.x, r2.xyzw, cb2[0].xyzw +dp4 r0.y, r2.xyzw, cb2[1].xyzw +dp4 r0.z, r2.xyzw, cb2[2].xyzw +mov o4.xyz, r0.xyzx +add o5.xyz, -r0.xyzx, cb2[20].xyzx +mov o6.w, v2.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLEffect_main2Bones[] = +{ + 68, 88, 66, 67, 61, 230, + 195, 122, 247, 221, 54, 22, + 9, 242, 195, 44, 206, 76, + 48, 46, 1, 0, 0, 0, + 92, 16, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 60, 9, 0, 0, 144, 14, + 0, 0, 112, 15, 0, 0, + 65, 111, 110, 57, 4, 9, + 0, 0, 4, 9, 0, 0, + 0, 2, 254, 255, 148, 8, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 1, 0, 217, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 218, 0, 0, 0, + 0, 0, 2, 0, 4, 0, + 4, 0, 221, 0, 0, 0, + 0, 0, 2, 0, 16, 0, + 2, 0, 225, 0, 0, 0, + 0, 0, 2, 0, 20, 0, + 1, 0, 227, 0, 0, 0, + 0, 0, 0, 0, 216, 0, + 0, 2, 254, 255, 254, 255, + 110, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 140, 5, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 45, 0, 0, 0, + 120, 0, 0, 0, 6, 0, + 0, 0, 20, 5, 0, 0, + 224, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 69, 102, 102, + 101, 99, 116, 46, 102, 120, + 0, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 192, 5, + 0, 0, 0, 0, 255, 255, + 216, 5, 0, 0, 0, 0, + 255, 255, 228, 5, 0, 0, + 0, 0, 255, 255, 240, 5, + 0, 0, 0, 0, 255, 255, + 252, 5, 0, 0, 0, 0, + 255, 255, 8, 6, 0, 0, + 0, 0, 255, 255, 20, 6, + 0, 0, 97, 0, 0, 0, + 32, 6, 0, 0, 97, 0, + 0, 0, 48, 6, 0, 0, + 97, 0, 0, 0, 60, 6, + 0, 0, 97, 0, 0, 0, + 80, 6, 0, 0, 102, 0, + 0, 0, 104, 6, 0, 0, + 97, 0, 0, 0, 120, 6, + 0, 0, 97, 0, 0, 0, + 140, 6, 0, 0, 97, 0, + 0, 0, 160, 6, 0, 0, + 97, 0, 0, 0, 184, 6, + 0, 0, 102, 0, 0, 0, + 208, 6, 0, 0, 102, 0, + 0, 0, 224, 6, 0, 0, + 100, 0, 0, 0, 240, 6, + 0, 0, 101, 0, 0, 0, + 0, 7, 0, 0, 100, 0, + 0, 0, 16, 7, 0, 0, + 101, 0, 0, 0, 32, 7, + 0, 0, 100, 0, 0, 0, + 48, 7, 0, 0, 101, 0, + 0, 0, 64, 7, 0, 0, + 192, 0, 0, 0, 80, 7, + 0, 0, 195, 0, 0, 0, + 92, 7, 0, 0, 197, 0, + 0, 0, 108, 7, 0, 0, + 197, 0, 0, 0, 128, 7, + 0, 0, 197, 0, 0, 0, + 144, 7, 0, 0, 198, 0, + 0, 0, 160, 7, 0, 0, + 198, 0, 0, 0, 176, 7, + 0, 0, 198, 0, 0, 0, + 192, 7, 0, 0, 101, 0, + 0, 0, 208, 7, 0, 0, + 192, 0, 0, 0, 220, 7, + 0, 0, 192, 0, 0, 0, + 236, 7, 0, 0, 192, 0, + 0, 0, 252, 7, 0, 0, + 200, 0, 0, 0, 12, 8, + 0, 0, 192, 0, 0, 0, + 28, 8, 0, 0, 195, 0, + 0, 0, 40, 8, 0, 0, + 195, 0, 0, 0, 56, 8, + 0, 0, 195, 0, 0, 0, + 72, 8, 0, 0, 186, 0, + 0, 0, 88, 8, 0, 0, + 186, 0, 0, 0, 108, 8, + 0, 0, 196, 0, 0, 0, + 120, 8, 0, 0, 102, 0, + 0, 0, 132, 8, 0, 0, + 109, 97, 105, 110, 50, 66, + 111, 110, 101, 115, 0, 112, + 111, 115, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 117, 118, + 0, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 80, 111, 115, + 0, 116, 111, 69, 121, 101, + 0, 116, 97, 110, 103, 101, + 110, 116, 0, 110, 111, 114, + 109, 97, 108, 0, 171, 171, + 235, 1, 0, 0, 240, 1, + 0, 0, 0, 2, 0, 0, + 240, 1, 0, 0, 8, 2, + 0, 0, 12, 2, 0, 0, + 28, 2, 0, 0, 40, 2, + 0, 0, 56, 2, 0, 0, + 40, 2, 0, 0, 65, 2, + 0, 0, 40, 2, 0, 0, + 71, 2, 0, 0, 240, 1, + 0, 0, 79, 2, 0, 0, + 40, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 88, 2, + 0, 0, 11, 0, 0, 0, + 19, 0, 255, 255, 255, 255, + 255, 255, 16, 0, 0, 0, + 255, 255, 20, 0, 255, 255, + 255, 255, 17, 0, 0, 0, + 255, 255, 255, 255, 21, 0, + 255, 255, 25, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 27, 0, 0, 0, + 8, 0, 255, 255, 255, 255, + 255, 255, 28, 0, 0, 0, + 255, 255, 9, 0, 255, 255, + 255, 255, 29, 0, 0, 0, + 10, 0, 255, 255, 255, 255, + 255, 255, 30, 0, 0, 0, + 255, 255, 11, 0, 255, 255, + 255, 255, 31, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 32, 0, 0, 0, + 23, 0, 24, 0, 25, 0, + 255, 255, 36, 0, 0, 0, + 16, 0, 17, 0, 18, 0, + 255, 255, 37, 0, 0, 0, + 13, 0, 14, 0, 15, 0, + 255, 255, 41, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 42, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 43, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 44, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 22, 0, 114, 101, 115, 117, + 108, 116, 0, 171, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 88, 2, + 0, 0, 38, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 39, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 40, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 115, 107, 105, 110, + 110, 105, 110, 103, 0, 171, + 171, 171, 3, 0, 3, 0, + 4, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 14, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 15, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 83, 107, 105, 110, 0, 118, + 101, 114, 116, 101, 120, 0, + 98, 111, 110, 101, 73, 110, + 100, 105, 99, 101, 115, 0, + 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 98, 108, + 101, 110, 100, 87, 101, 105, + 103, 104, 116, 115, 0, 171, + 171, 171, 235, 1, 0, 0, + 240, 1, 0, 0, 79, 2, + 0, 0, 40, 2, 0, 0, + 71, 2, 0, 0, 240, 1, + 0, 0, 8, 2, 0, 0, + 12, 2, 0, 0, 240, 3, + 0, 0, 252, 3, 0, 0, + 12, 4, 0, 0, 240, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 21, 0, 1, 0, + 6, 0, 28, 4, 0, 0, + 18, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 19, 0, 0, 0, 4, 0, + 255, 255, 255, 255, 255, 255, + 20, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 21, 0, 0, 0, 255, 255, + 5, 0, 255, 255, 255, 255, + 22, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 23, 0, 0, 0, 255, 255, + 255, 255, 6, 0, 255, 255, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 9, 0, 10, 0, + 4, 0, 0, 0, 11, 0, + 12, 0, 255, 255, 255, 255, + 5, 0, 0, 0, 13, 0, + 14, 0, 15, 0, 16, 0, + 6, 0, 0, 0, 17, 0, + 18, 0, 19, 0, 20, 0, + 119, 112, 0, 171, 33, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 34, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 35, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 0, 0, + 0, 0, 224, 1, 0, 0, + 152, 2, 0, 0, 16, 0, + 0, 0, 168, 2, 0, 0, + 0, 0, 0, 0, 104, 3, + 0, 0, 112, 3, 0, 0, + 3, 0, 0, 0, 128, 3, + 0, 0, 0, 0, 0, 0, + 164, 3, 0, 0, 176, 3, + 0, 0, 3, 0, 0, 0, + 192, 3, 0, 0, 228, 3, + 0, 0, 233, 3, 0, 0, + 76, 4, 0, 0, 6, 0, + 0, 0, 92, 4, 0, 0, + 224, 1, 0, 0, 233, 3, + 0, 0, 76, 4, 0, 0, + 6, 0, 0, 0, 164, 4, + 0, 0, 0, 0, 0, 0, + 236, 4, 0, 0, 40, 2, + 0, 0, 3, 0, 0, 0, + 240, 4, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 228, 0, 15, 160, 0, 0, + 64, 64, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 3, 128, 3, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 4, 128, 4, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 5, 128, 5, 0, + 15, 144, 5, 0, 0, 3, + 0, 0, 3, 128, 4, 0, + 228, 144, 228, 0, 0, 160, + 46, 0, 0, 2, 0, 0, + 3, 176, 0, 0, 225, 128, + 5, 0, 0, 4, 0, 0, + 15, 128, 5, 0, 85, 144, + 0, 32, 228, 160, 0, 0, + 0, 176, 4, 0, 0, 5, + 0, 0, 15, 128, 0, 32, + 228, 160, 0, 0, 85, 176, + 5, 0, 0, 144, 0, 0, + 228, 128, 8, 0, 0, 3, + 5, 0, 1, 224, 2, 0, + 228, 144, 0, 0, 228, 128, + 5, 0, 0, 4, 1, 0, + 15, 128, 5, 0, 85, 144, + 1, 32, 228, 160, 0, 0, + 0, 176, 5, 0, 0, 4, + 2, 0, 15, 128, 5, 0, + 85, 144, 2, 32, 228, 160, + 0, 0, 0, 176, 4, 0, + 0, 5, 2, 0, 15, 128, + 2, 32, 228, 160, 0, 0, + 85, 176, 5, 0, 0, 144, + 2, 0, 228, 128, 4, 0, + 0, 5, 1, 0, 15, 128, + 1, 32, 228, 160, 0, 0, + 85, 176, 5, 0, 0, 144, + 1, 0, 228, 128, 8, 0, + 0, 3, 5, 0, 2, 224, + 2, 0, 228, 144, 1, 0, + 228, 128, 8, 0, 0, 3, + 5, 0, 4, 224, 2, 0, + 228, 144, 2, 0, 228, 128, + 9, 0, 0, 3, 3, 0, + 1, 128, 0, 0, 228, 144, + 0, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 144, 0, 0, + 228, 128, 9, 0, 0, 3, + 3, 0, 2, 128, 0, 0, + 228, 144, 1, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 2, 128, 1, 0, 228, 144, + 1, 0, 228, 128, 9, 0, + 0, 3, 3, 0, 4, 128, + 0, 0, 228, 144, 2, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 4, 128, 1, 0, + 228, 144, 2, 0, 228, 128, + 1, 0, 0, 2, 3, 0, + 8, 128, 0, 0, 255, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 3, 0, 228, 128, + 223, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 7, 128, + 3, 0, 196, 144, 228, 0, + 229, 160, 228, 0, 218, 160, + 8, 0, 0, 3, 1, 0, + 1, 224, 1, 0, 228, 128, + 225, 0, 244, 160, 8, 0, + 0, 3, 1, 0, 2, 224, + 1, 0, 228, 128, 226, 0, + 244, 160, 8, 0, 0, 3, + 2, 0, 1, 224, 0, 0, + 228, 128, 218, 0, 228, 160, + 8, 0, 0, 3, 2, 0, + 2, 224, 0, 0, 228, 128, + 219, 0, 228, 160, 8, 0, + 0, 3, 2, 0, 4, 224, + 0, 0, 228, 128, 220, 0, + 228, 160, 1, 0, 0, 2, + 6, 0, 7, 224, 0, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 1, 128, 3, 0, + 228, 128, 218, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 3, 0, 228, 128, + 219, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 3, 0, 228, 128, 220, 0, + 228, 160, 2, 0, 0, 3, + 4, 0, 7, 224, 0, 0, + 228, 129, 227, 0, 228, 160, + 1, 0, 0, 2, 3, 0, + 7, 224, 0, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 3, 0, 228, 128, + 221, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 3, 0, 228, 128, 222, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 3, 0, + 228, 128, 224, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 216, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 15, 224, 217, 0, + 228, 160, 1, 0, 0, 2, + 5, 0, 8, 224, 2, 0, + 255, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 76, 5, + 0, 0, 64, 0, 1, 0, + 83, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 2, 0, + 0, 0, 21, 0, 0, 0, + 89, 8, 0, 4, 70, 142, + 32, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 2, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 3, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 4, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 5, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 3, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 4, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 5, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 6, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 7, 0, + 0, 0, 104, 0, 0, 2, + 5, 0, 0, 0, 38, 0, + 0, 11, 0, 208, 0, 0, + 50, 0, 16, 0, 0, 0, + 0, 0, 70, 16, 16, 0, + 4, 0, 0, 0, 2, 64, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 56, 0, 0, 9, 242, 0, + 16, 0, 1, 0, 0, 0, + 86, 21, 16, 0, 5, 0, + 0, 0, 70, 142, 32, 4, + 4, 0, 0, 0, 26, 0, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 242, 0, + 16, 0, 1, 0, 0, 0, + 70, 142, 32, 4, 4, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 6, 16, + 16, 0, 5, 0, 0, 0, + 70, 14, 16, 0, 1, 0, + 0, 0, 17, 0, 0, 7, + 18, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 10, 242, 0, + 16, 0, 3, 0, 0, 0, + 86, 21, 16, 0, 5, 0, + 0, 0, 70, 142, 32, 6, + 4, 0, 0, 0, 1, 0, + 0, 0, 26, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 12, 242, 0, 16, 0, + 3, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 6, 16, 16, 0, 5, 0, + 0, 0, 70, 14, 16, 0, + 3, 0, 0, 0, 17, 0, + 0, 7, 34, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 3, 0, + 0, 0, 56, 0, 0, 10, + 242, 0, 16, 0, 4, 0, + 0, 0, 86, 21, 16, 0, + 5, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 2, 0, 0, 0, 26, 0, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 12, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 2, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 6, 16, 16, 0, + 5, 0, 0, 0, 70, 14, + 16, 0, 4, 0, 0, 0, + 17, 0, 0, 7, 66, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 130, 0, 16, 0, + 2, 0, 0, 0, 58, 16, + 16, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 4, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 5, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 6, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 7, 0, + 0, 0, 54, 0, 0, 6, + 242, 32, 16, 0, 1, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 5, + 50, 0, 16, 0, 4, 0, + 0, 0, 70, 16, 16, 0, + 3, 0, 0, 0, 54, 0, + 0, 5, 66, 0, 16, 0, + 4, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 128, 63, + 16, 0, 0, 8, 18, 32, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 131, 32, 0, + 2, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 8, + 34, 32, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 131, + 32, 0, 2, 0, 0, 0, + 17, 0, 0, 0, 16, 0, + 0, 7, 18, 0, 16, 0, + 4, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 0, 0, 7, + 18, 32, 16, 0, 6, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 0, 0, 7, 34, 0, + 16, 0, 4, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 34, 32, 16, 0, + 6, 0, 0, 0, 70, 18, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 66, 0, 16, 0, 4, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 7, 66, 32, + 16, 0, 6, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 8, 18, 32, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 16, 0, 0, 8, 34, 32, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 16, 0, 0, 8, + 66, 32, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 5, 114, 32, 16, 0, + 7, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 17, 0, 0, 8, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 34, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 17, 0, + 0, 8, 66, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 2, 0, 0, 0, + 54, 0, 0, 5, 114, 32, + 16, 0, 4, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 9, + 114, 32, 16, 0, 5, 0, + 0, 0, 70, 2, 16, 128, + 65, 0, 0, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 20, 0, + 0, 0, 54, 0, 0, 5, + 130, 32, 16, 0, 6, 0, + 0, 0, 58, 16, 16, 0, + 2, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 216, 0, 0, 0, 6, 0, + 0, 0, 8, 0, 0, 0, + 152, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 164, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 171, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 15, 0, 0, + 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 3, 3, 0, 0, + 188, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 4, 0, + 0, 0, 15, 3, 0, 0, + 201, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 5, 0, + 0, 0, 15, 3, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 84, 65, 78, 71, 69, + 78, 84, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 66, 76, 69, 78, 68, 73, + 78, 68, 73, 67, 69, 83, + 0, 66, 76, 69, 78, 68, + 87, 69, 73, 71, 72, 84, + 0, 171, 171, 171, 79, 83, + 71, 78, 228, 0, 0, 0, + 8, 0, 0, 0, 8, 0, + 0, 0, 200, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 212, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 12, + 0, 0, 218, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 5, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 4, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 6, 0, 0, 0, 15, 0, + 0, 0, 218, 0, 0, 0, + 5, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 7, 0, 0, 0, 7, 8, + 0, 0, 83, 86, 95, 80, + 79, 83, 73, 84, 73, 79, + 78, 0, 67, 79, 76, 79, + 82, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main2Bones.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main2Bones.pdb new file mode 100644 index 0000000000000000000000000000000000000000..a904b4dc899cb7300ccc41d6b5dee49f1b763cfc GIT binary patch literal 32256 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≷ z?>R;gIq*cq&pz#loW}vjC8V#nUhtg%mqvL!X^xdozit-q7;ImKy&kB64LlaJAcdE18FT$l;m(}^zgSc>B&RKNe$KDIN zOk;jc>iHM{PYD9^;c~5Nzo#*#?BA^KxRIZ>(BI6E?bMCshVV`8&|zG2&NUl&{uhY9 zMSLAHOrbyecZJ{MyA9`n^Y + dcl_texcoord1 v1 // vertex<4,5,6> + dcl_texcoord2 v2 // vertex<7,8,9,10> + dcl_texcoord3 v3 // vertex<11,12,13,14> + dcl_texcoord4 v4 // vertex<15,16> + dcl_texcoord5 v5 // vertex<17,18,19,20> + dcl_texcoord6 v6 // vertex<21,22,23,24> + +#line 112 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLEffect.fx" + mul r0.xy, v5, c228.x + mova a0.xy, r0.yxzw + mul r0, v6.y, c0[a0.x] + mad r0, c0[a0.y], v6.x, r0 // ::skinning<0,3,6,9> + +#line 117 + dp3 oT5.x, v2, r0 // ::main2BonesVc<19> + +#line 112 + mul r1, v6.y, c1[a0.x] + mul r2, v6.y, c2[a0.x] + mad r2, c2[a0.y], v6.x, r2 // ::skinning<2,5,8,11> + mad r1, c1[a0.y], v6.x, r1 // ::skinning<1,4,7,10> + +#line 117 + dp3 oT5.y, v2, r1 // ::main2BonesVc<20> + dp3 oT5.z, v2, r2 // ::main2BonesVc<21> + dp4 r3.x, v0, r0 // SkinVc::vertex<0> + dp3 r0.x, v1, r0 // SkinVc::vertex<4> + dp4 r3.y, v0, r1 // SkinVc::vertex<1> + dp3 r0.y, v1, r1 // SkinVc::vertex<5> + dp4 r3.z, v0, r2 // SkinVc::vertex<2> + dp3 r0.z, v1, r2 // SkinVc::vertex<6> + +#line 259 + mov r3.w, v0.w + +#line 262 + dp4 oPos.z, r3, c223 // ::main2BonesVc<2> + mul oT0, v3, c217 // ::main2BonesVc<4,5,6,7> + mad r1.xyz, v4.xyxw, c228.yyzw, c228.zzyw + dp3 oT1.x, r1, c225.xyww // ::main2BonesVc<8> + dp3 oT1.y, r1, c226.xyww // ::main2BonesVc<9> + dp3 oT2.x, r0, c218 // ::main2BonesVc<10> + dp3 oT2.y, r0, c219 // ::main2BonesVc<11> + dp3 oT2.z, r0, c220 // ::main2BonesVc<12> + +#line 116 + mov oT6.xyz, r0 // ::main2BonesVc<23,24,25> + +#line 259 + dp4 r0.x, r3, c218 // ::wp<0> + dp4 r0.y, r3, c219 // ::wp<1> + dp4 r0.z, r3, c220 // ::wp<2> + +#line 267 + add oT4.xyz, -r0, c227 // ::main2BonesVc<16,17,18> + +#line 259 + mov oT3.xyz, r0 // ::main2BonesVc<13,14,15> + +#line 262 + dp4 r0.x, r3, c221 // ::result<0> + dp4 r0.y, r3, c222 // ::result<1> + dp4 r0.z, r3, c224 // ::result<3> + +#line 253 + mad oPos.xy, r0.z, c216, r0 // ::main2BonesVc<0,1> + mov oPos.w, r0.z // ::main2BonesVc<3> + +#line 117 + mov oT5.w, v2.w // ::main2BonesVc<22> + +// approximately 38 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_constantbuffer CB2[21], immediateIndexed +dcl_constantbuffer CB4[216], dynamicIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_input v3.xyzw +dcl_input v4.xy +dcl_input v5.xy +dcl_input v6.xy +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output o3.xyz +dcl_output o4.xyz +dcl_output o5.xyz +dcl_output o6.xyzw +dcl_output o7.xyz +dcl_temps 5 +imul null, r0.xy, v5.xyxx, l(3, 3, 0, 0) +mul r1.xyzw, v6.yyyy, cb4[r0.y + 0].xyzw +mad r1.xyzw, cb4[r0.x + 0].xyzw, v6.xxxx, r1.xyzw +dp4 r2.x, v0.xyzw, r1.xyzw +mul r3.xyzw, v6.yyyy, cb4[r0.y + 1].xyzw +mad r3.xyzw, cb4[r0.x + 1].xyzw, v6.xxxx, r3.xyzw +dp4 r2.y, v0.xyzw, r3.xyzw +mul r4.xyzw, v6.yyyy, cb4[r0.y + 2].xyzw +mad r0.xyzw, cb4[r0.x + 2].xyzw, v6.xxxx, r4.xyzw +dp4 r2.z, v0.xyzw, r0.xyzw +mov r2.w, v0.w +dp4 o0.x, r2.xyzw, cb2[4].xyzw +dp4 o0.y, r2.xyzw, cb2[5].xyzw +dp4 o0.z, r2.xyzw, cb2[6].xyzw +dp4 o0.w, r2.xyzw, cb2[7].xyzw +mul o1.xyzw, v3.xyzw, cb0[1].xyzw +mov r4.xy, v4.xyxx +mov r4.z, l(1.000000) +dp3 o2.x, r4.xyzx, cb2[16].xywx +dp3 o2.y, r4.xyzx, cb2[17].xywx +dp3 r4.x, v1.xyzx, r1.xyzx +dp3 o6.x, v2.xyzx, r1.xyzx +dp3 r4.y, v1.xyzx, r3.xyzx +dp3 o6.y, v2.xyzx, r3.xyzx +dp3 r4.z, v1.xyzx, r0.xyzx +dp3 o6.z, v2.xyzx, r0.xyzx +dp3 o3.x, r4.xyzx, cb2[0].xyzx +dp3 o3.y, r4.xyzx, cb2[1].xyzx +dp3 o3.z, r4.xyzx, cb2[2].xyzx +mov o7.xyz, r4.xyzx +dp4 r0.x, r2.xyzw, cb2[0].xyzw +dp4 r0.y, r2.xyzw, cb2[1].xyzw +dp4 r0.z, r2.xyzw, cb2[2].xyzw +mov o4.xyz, r0.xyzx +add o5.xyz, -r0.xyzx, cb2[20].xyzx +mov o6.w, v2.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLEffect_main2BonesVc[] = +{ + 68, 88, 66, 67, 237, 232, + 209, 56, 101, 64, 47, 53, + 58, 192, 25, 237, 196, 134, + 59, 230, 1, 0, 0, 0, + 196, 16, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 116, 9, 0, 0, 220, 14, + 0, 0, 216, 15, 0, 0, + 65, 111, 110, 57, 60, 9, + 0, 0, 60, 9, 0, 0, + 0, 2, 254, 255, 204, 8, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 1, 0, 217, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 218, 0, 0, 0, + 0, 0, 2, 0, 4, 0, + 4, 0, 221, 0, 0, 0, + 0, 0, 2, 0, 16, 0, + 2, 0, 225, 0, 0, 0, + 0, 0, 2, 0, 20, 0, + 1, 0, 227, 0, 0, 0, + 0, 0, 0, 0, 216, 0, + 0, 2, 254, 255, 254, 255, + 120, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 180, 5, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 46, 0, 0, 0, + 120, 0, 0, 0, 6, 0, + 0, 0, 60, 5, 0, 0, + 232, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 69, 102, 102, + 101, 99, 116, 46, 102, 120, + 0, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 232, 5, + 0, 0, 0, 0, 255, 255, + 0, 6, 0, 0, 0, 0, + 255, 255, 12, 6, 0, 0, + 0, 0, 255, 255, 24, 6, + 0, 0, 0, 0, 255, 255, + 36, 6, 0, 0, 0, 0, + 255, 255, 48, 6, 0, 0, + 0, 0, 255, 255, 60, 6, + 0, 0, 0, 0, 255, 255, + 72, 6, 0, 0, 112, 0, + 0, 0, 84, 6, 0, 0, + 112, 0, 0, 0, 100, 6, + 0, 0, 112, 0, 0, 0, + 112, 6, 0, 0, 112, 0, + 0, 0, 132, 6, 0, 0, + 117, 0, 0, 0, 156, 6, + 0, 0, 112, 0, 0, 0, + 172, 6, 0, 0, 112, 0, + 0, 0, 192, 6, 0, 0, + 112, 0, 0, 0, 212, 6, + 0, 0, 112, 0, 0, 0, + 236, 6, 0, 0, 117, 0, + 0, 0, 4, 7, 0, 0, + 117, 0, 0, 0, 20, 7, + 0, 0, 115, 0, 0, 0, + 36, 7, 0, 0, 116, 0, + 0, 0, 52, 7, 0, 0, + 115, 0, 0, 0, 68, 7, + 0, 0, 116, 0, 0, 0, + 84, 7, 0, 0, 115, 0, + 0, 0, 100, 7, 0, 0, + 116, 0, 0, 0, 116, 7, + 0, 0, 3, 1, 0, 0, + 132, 7, 0, 0, 6, 1, + 0, 0, 144, 7, 0, 0, + 7, 1, 0, 0, 160, 7, + 0, 0, 8, 1, 0, 0, + 176, 7, 0, 0, 8, 1, + 0, 0, 196, 7, 0, 0, + 8, 1, 0, 0, 212, 7, + 0, 0, 9, 1, 0, 0, + 228, 7, 0, 0, 9, 1, + 0, 0, 244, 7, 0, 0, + 9, 1, 0, 0, 4, 8, + 0, 0, 116, 0, 0, 0, + 20, 8, 0, 0, 3, 1, + 0, 0, 32, 8, 0, 0, + 3, 1, 0, 0, 48, 8, + 0, 0, 3, 1, 0, 0, + 64, 8, 0, 0, 11, 1, + 0, 0, 80, 8, 0, 0, + 3, 1, 0, 0, 96, 8, + 0, 0, 6, 1, 0, 0, + 108, 8, 0, 0, 6, 1, + 0, 0, 124, 8, 0, 0, + 6, 1, 0, 0, 140, 8, + 0, 0, 253, 0, 0, 0, + 156, 8, 0, 0, 253, 0, + 0, 0, 176, 8, 0, 0, + 117, 0, 0, 0, 188, 8, + 0, 0, 109, 97, 105, 110, + 50, 66, 111, 110, 101, 115, + 86, 99, 0, 112, 111, 115, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 117, 118, + 0, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 80, 111, 115, + 0, 116, 111, 69, 121, 101, + 0, 116, 97, 110, 103, 101, + 110, 116, 0, 110, 111, 114, + 109, 97, 108, 0, 171, 171, + 245, 1, 0, 0, 252, 1, + 0, 0, 12, 2, 0, 0, + 252, 1, 0, 0, 20, 2, + 0, 0, 24, 2, 0, 0, + 40, 2, 0, 0, 52, 2, + 0, 0, 68, 2, 0, 0, + 52, 2, 0, 0, 77, 2, + 0, 0, 52, 2, 0, 0, + 83, 2, 0, 0, 252, 1, + 0, 0, 91, 2, 0, 0, + 52, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 100, 2, + 0, 0, 12, 0, 0, 0, + 19, 0, 255, 255, 255, 255, + 255, 255, 17, 0, 0, 0, + 255, 255, 20, 0, 255, 255, + 255, 255, 18, 0, 0, 0, + 255, 255, 255, 255, 21, 0, + 255, 255, 26, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 27, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 29, 0, 0, 0, + 8, 0, 255, 255, 255, 255, + 255, 255, 30, 0, 0, 0, + 255, 255, 9, 0, 255, 255, + 255, 255, 31, 0, 0, 0, + 10, 0, 255, 255, 255, 255, + 255, 255, 32, 0, 0, 0, + 255, 255, 11, 0, 255, 255, + 255, 255, 33, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 34, 0, 0, 0, + 23, 0, 24, 0, 25, 0, + 255, 255, 38, 0, 0, 0, + 16, 0, 17, 0, 18, 0, + 255, 255, 39, 0, 0, 0, + 13, 0, 14, 0, 15, 0, + 255, 255, 43, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 44, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 45, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 22, 0, 114, 101, 115, 117, + 108, 116, 0, 171, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 100, 2, + 0, 0, 40, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 41, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 42, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 115, 107, 105, 110, + 110, 105, 110, 103, 0, 171, + 171, 171, 3, 0, 3, 0, + 4, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 15, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 16, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 83, 107, 105, 110, 86, 99, + 0, 118, 101, 114, 116, 101, + 120, 0, 99, 111, 108, 111, + 114, 0, 98, 111, 110, 101, + 73, 110, 100, 105, 99, 101, + 115, 0, 1, 0, 2, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 98, 108, 101, 110, 100, 87, + 101, 105, 103, 104, 116, 115, + 0, 171, 171, 171, 245, 1, + 0, 0, 252, 1, 0, 0, + 91, 2, 0, 0, 52, 2, + 0, 0, 83, 2, 0, 0, + 252, 1, 0, 0, 254, 3, + 0, 0, 252, 1, 0, 0, + 20, 2, 0, 0, 24, 2, + 0, 0, 4, 4, 0, 0, + 16, 4, 0, 0, 32, 4, + 0, 0, 252, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 25, 0, 1, 0, 7, 0, + 48, 4, 0, 0, 19, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 20, 0, + 0, 0, 4, 0, 255, 255, + 255, 255, 255, 255, 21, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 22, 0, + 0, 0, 255, 255, 5, 0, + 255, 255, 255, 255, 23, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 24, 0, + 0, 0, 255, 255, 255, 255, + 6, 0, 255, 255, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 3, 0, + 0, 0, 7, 0, 8, 0, + 9, 0, 10, 0, 4, 0, + 0, 0, 11, 0, 12, 0, + 13, 0, 14, 0, 5, 0, + 0, 0, 15, 0, 16, 0, + 255, 255, 255, 255, 6, 0, + 0, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 7, 0, + 0, 0, 21, 0, 22, 0, + 23, 0, 24, 0, 119, 112, + 0, 171, 35, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 36, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 37, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 0, 0, 0, 0, + 232, 1, 0, 0, 164, 2, + 0, 0, 16, 0, 0, 0, + 180, 2, 0, 0, 0, 0, + 0, 0, 116, 3, 0, 0, + 124, 3, 0, 0, 3, 0, + 0, 0, 140, 3, 0, 0, + 0, 0, 0, 0, 176, 3, + 0, 0, 188, 3, 0, 0, + 3, 0, 0, 0, 204, 3, + 0, 0, 240, 3, 0, 0, + 247, 3, 0, 0, 104, 4, + 0, 0, 6, 0, 0, 0, + 120, 4, 0, 0, 232, 1, + 0, 0, 247, 3, 0, 0, + 104, 4, 0, 0, 7, 0, + 0, 0, 192, 4, 0, 0, + 0, 0, 0, 0, 20, 5, + 0, 0, 52, 2, 0, 0, + 3, 0, 0, 0, 24, 5, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 228, 0, + 15, 160, 0, 0, 64, 64, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 3, 128, 3, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 4, 128, 4, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 5, 128, 5, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 6, 128, 6, 0, 15, 144, + 5, 0, 0, 3, 0, 0, + 3, 128, 5, 0, 228, 144, + 228, 0, 0, 160, 46, 0, + 0, 2, 0, 0, 3, 176, + 0, 0, 225, 128, 5, 0, + 0, 4, 0, 0, 15, 128, + 6, 0, 85, 144, 0, 32, + 228, 160, 0, 0, 0, 176, + 4, 0, 0, 5, 0, 0, + 15, 128, 0, 32, 228, 160, + 0, 0, 85, 176, 6, 0, + 0, 144, 0, 0, 228, 128, + 8, 0, 0, 3, 5, 0, + 1, 224, 2, 0, 228, 144, + 0, 0, 228, 128, 5, 0, + 0, 4, 1, 0, 15, 128, + 6, 0, 85, 144, 1, 32, + 228, 160, 0, 0, 0, 176, + 5, 0, 0, 4, 2, 0, + 15, 128, 6, 0, 85, 144, + 2, 32, 228, 160, 0, 0, + 0, 176, 4, 0, 0, 5, + 2, 0, 15, 128, 2, 32, + 228, 160, 0, 0, 85, 176, + 6, 0, 0, 144, 2, 0, + 228, 128, 4, 0, 0, 5, + 1, 0, 15, 128, 1, 32, + 228, 160, 0, 0, 85, 176, + 6, 0, 0, 144, 1, 0, + 228, 128, 8, 0, 0, 3, + 5, 0, 2, 224, 2, 0, + 228, 144, 1, 0, 228, 128, + 8, 0, 0, 3, 5, 0, + 4, 224, 2, 0, 228, 144, + 2, 0, 228, 128, 9, 0, + 0, 3, 3, 0, 1, 128, + 0, 0, 228, 144, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 144, 0, 0, 228, 128, + 9, 0, 0, 3, 3, 0, + 2, 128, 0, 0, 228, 144, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 2, 128, + 1, 0, 228, 144, 1, 0, + 228, 128, 9, 0, 0, 3, + 3, 0, 4, 128, 0, 0, + 228, 144, 2, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 4, 128, 1, 0, 228, 144, + 2, 0, 228, 128, 1, 0, + 0, 2, 3, 0, 8, 128, + 0, 0, 255, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 3, 0, 228, 128, 223, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 15, 224, 3, 0, + 228, 144, 217, 0, 228, 160, + 4, 0, 0, 4, 1, 0, + 7, 128, 4, 0, 196, 144, + 228, 0, 229, 160, 228, 0, + 218, 160, 8, 0, 0, 3, + 1, 0, 1, 224, 1, 0, + 228, 128, 225, 0, 244, 160, + 8, 0, 0, 3, 1, 0, + 2, 224, 1, 0, 228, 128, + 226, 0, 244, 160, 8, 0, + 0, 3, 2, 0, 1, 224, + 0, 0, 228, 128, 218, 0, + 228, 160, 8, 0, 0, 3, + 2, 0, 2, 224, 0, 0, + 228, 128, 219, 0, 228, 160, + 8, 0, 0, 3, 2, 0, + 4, 224, 0, 0, 228, 128, + 220, 0, 228, 160, 1, 0, + 0, 2, 6, 0, 7, 224, + 0, 0, 228, 128, 9, 0, + 0, 3, 0, 0, 1, 128, + 3, 0, 228, 128, 218, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 3, 0, + 228, 128, 219, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 3, 0, 228, 128, + 220, 0, 228, 160, 2, 0, + 0, 3, 4, 0, 7, 224, + 0, 0, 228, 129, 227, 0, + 228, 160, 1, 0, 0, 2, + 3, 0, 7, 224, 0, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 1, 128, 3, 0, + 228, 128, 221, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 3, 0, 228, 128, + 222, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 3, 0, 228, 128, 224, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 216, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 5, 0, 8, 224, + 2, 0, 255, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 96, 5, 0, 0, 64, 0, + 1, 0, 88, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 2, 0, 0, 0, 21, 0, + 0, 0, 89, 8, 0, 4, + 70, 142, 32, 0, 4, 0, + 0, 0, 216, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 3, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 4, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 5, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 6, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 3, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 4, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 5, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 6, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 7, 0, 0, 0, 104, 0, + 0, 2, 5, 0, 0, 0, + 38, 0, 0, 11, 0, 208, + 0, 0, 50, 0, 16, 0, + 0, 0, 0, 0, 70, 16, + 16, 0, 5, 0, 0, 0, + 2, 64, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 9, + 242, 0, 16, 0, 1, 0, + 0, 0, 86, 21, 16, 0, + 6, 0, 0, 0, 70, 142, + 32, 4, 4, 0, 0, 0, + 26, 0, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 11, + 242, 0, 16, 0, 1, 0, + 0, 0, 70, 142, 32, 4, + 4, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 6, 16, 16, 0, 6, 0, + 0, 0, 70, 14, 16, 0, + 1, 0, 0, 0, 17, 0, + 0, 7, 18, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 1, 0, + 0, 0, 56, 0, 0, 10, + 242, 0, 16, 0, 3, 0, + 0, 0, 86, 21, 16, 0, + 6, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 1, 0, 0, 0, 26, 0, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 12, 242, 0, + 16, 0, 3, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 1, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 6, 16, 16, 0, + 6, 0, 0, 0, 70, 14, + 16, 0, 3, 0, 0, 0, + 17, 0, 0, 7, 34, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 3, 0, 0, 0, 56, 0, + 0, 10, 242, 0, 16, 0, + 4, 0, 0, 0, 86, 21, + 16, 0, 6, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 2, 0, 0, 0, + 26, 0, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 12, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 6, + 4, 0, 0, 0, 2, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 6, 16, + 16, 0, 6, 0, 0, 0, + 70, 14, 16, 0, 4, 0, + 0, 0, 17, 0, 0, 7, + 66, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 0, 0, 0, 0, + 54, 0, 0, 5, 130, 0, + 16, 0, 2, 0, 0, 0, + 58, 16, 16, 0, 0, 0, + 0, 0, 17, 0, 0, 8, + 18, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 4, 0, 0, 0, 17, 0, + 0, 8, 34, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 5, 0, 0, 0, + 17, 0, 0, 8, 66, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 6, 0, + 0, 0, 17, 0, 0, 8, + 130, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 7, 0, 0, 0, 56, 0, + 0, 8, 242, 32, 16, 0, + 1, 0, 0, 0, 70, 30, + 16, 0, 3, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 5, 50, 0, + 16, 0, 4, 0, 0, 0, + 70, 16, 16, 0, 4, 0, + 0, 0, 54, 0, 0, 5, + 66, 0, 16, 0, 4, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 128, 63, 16, 0, + 0, 8, 18, 32, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 131, 32, 0, 2, 0, + 0, 0, 16, 0, 0, 0, + 16, 0, 0, 8, 34, 32, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 131, 32, 0, + 2, 0, 0, 0, 17, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 4, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 0, 0, 7, 18, 32, + 16, 0, 6, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 7, 34, 0, 16, 0, + 4, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 34, 32, 16, 0, 6, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 66, 0, + 16, 0, 4, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 7, 66, 32, 16, 0, + 6, 0, 0, 0, 70, 18, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 8, + 18, 32, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 16, 0, + 0, 8, 34, 32, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 16, 0, 0, 8, 66, 32, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 2, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 7, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 5, 114, 32, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 114, 32, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 20, 0, 0, 0, + 54, 0, 0, 5, 130, 32, + 16, 0, 6, 0, 0, 0, + 58, 16, 16, 0, 2, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 244, 0, + 0, 0, 7, 0, 0, 0, + 8, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 188, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 195, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 15, 0, 0, 203, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 15, 15, 0, 0, 209, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 4, 0, 0, 0, + 3, 3, 0, 0, 218, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 5, 0, 0, 0, + 15, 3, 0, 0, 231, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 6, 0, 0, 0, + 15, 3, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 84, + 65, 78, 71, 69, 78, 84, + 0, 67, 79, 76, 79, 82, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 66, 76, + 69, 78, 68, 73, 78, 68, + 73, 67, 69, 83, 0, 66, + 76, 69, 78, 68, 87, 69, + 73, 71, 72, 84, 0, 171, + 79, 83, 71, 78, 228, 0, + 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 200, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 212, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 218, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 3, 12, 0, 0, 218, 0, + 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 7, 8, 0, 0, 218, 0, + 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 4, 0, 0, 0, + 7, 8, 0, 0, 218, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 5, 0, 0, 0, + 7, 8, 0, 0, 218, 0, + 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 6, 0, 0, 0, + 15, 0, 0, 0, 218, 0, + 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 7, 0, 0, 0, + 7, 8, 0, 0, 83, 86, + 95, 80, 79, 83, 73, 84, + 73, 79, 78, 0, 67, 79, + 76, 79, 82, 0, 84, 69, + 88, 67, 79, 79, 82, 68, + 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main2BonesVc.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main2BonesVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..a7ccae1b3abac42d3425631567f0dd9409698cd8 GIT binary patch literal 32256 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 + dcl_texcoord1 v1 // vertex<4,5,6> + dcl_texcoord2 v2 // vertex<7,8,9,10> + dcl_texcoord3 v3 // vertex<11,12> + dcl_texcoord4 v4 // vertex<13,14,15,16> + dcl_texcoord5 v5 // vertex<17,18,19,20> + +#line 97 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLEffect.fx" + mul r0, v4, c228.x + mova a0, r0.yxzw + mul r1, v5.y, c0[a0.x] + mad r1, c0[a0.y], v5.x, r1 // ::skinning<0,3,6,9> + mad r0, c0[a0.z], v5.z, r1 // ::skinning<0,3,6,9> + mad r0, c0[a0.w], v5.w, r0 // ::skinning<0,3,6,9> + +#line 102 + dp3 oT5.x, v2, r0 // ::main4Bones<19> + +#line 97 + mul r1, v5.y, c1[a0.x] + mul r2, v5.y, c2[a0.x] + mad r2, c2[a0.y], v5.x, r2 // ::skinning<2,5,8,11> + mad r1, c1[a0.y], v5.x, r1 // ::skinning<1,4,7,10> + mad r1, c1[a0.z], v5.z, r1 // ::skinning<1,4,7,10> + mad r2, c2[a0.z], v5.z, r2 // ::skinning<2,5,8,11> + mad r2, c2[a0.w], v5.w, r2 // ::skinning<2,5,8,11> + mad r1, c1[a0.w], v5.w, r1 // ::skinning<1,4,7,10> + +#line 102 + dp3 oT5.y, v2, r1 // ::main4Bones<20> + dp3 oT5.z, v2, r2 // ::main4Bones<21> + dp4 r3.x, v0, r0 // Skin::vertex<0> + dp3 r0.x, v1, r0 // Skin::vertex<4> + dp4 r3.y, v0, r1 // Skin::vertex<1> + dp3 r0.y, v1, r1 // Skin::vertex<5> + dp4 r3.z, v0, r2 // Skin::vertex<2> + dp3 r0.z, v1, r2 // Skin::vertex<6> + +#line 214 + mov r3.w, v0.w + +#line 217 + dp4 oPos.z, r3, c223 // ::main4Bones<2> + mad r1.xyz, v3.xyxw, c228.yyzw, c228.zzyw + dp3 oT1.x, r1, c225.xyww // ::main4Bones<8> + dp3 oT1.y, r1, c226.xyww // ::main4Bones<9> + dp3 oT2.x, r0, c218 // ::main4Bones<10> + dp3 oT2.y, r0, c219 // ::main4Bones<11> + dp3 oT2.z, r0, c220 // ::main4Bones<12> + +#line 101 + mov oT6.xyz, r0 // ::main4Bones<23,24,25> + +#line 214 + dp4 r0.x, r3, c218 // ::wp<0> + dp4 r0.y, r3, c219 // ::wp<1> + dp4 r0.z, r3, c220 // ::wp<2> + +#line 222 + add oT4.xyz, -r0, c227 // ::main4Bones<16,17,18> + +#line 214 + mov oT3.xyz, r0 // ::main4Bones<13,14,15> + +#line 217 + dp4 r0.x, r3, c221 // ::result<0> + dp4 r0.y, r3, c222 // ::result<1> + dp4 r0.z, r3, c224 // ::result<3> + +#line 208 + mad oPos.xy, r0.z, c216, r0 // ::main4Bones<0,1> + mov oPos.w, r0.z // ::main4Bones<3> + +#line 218 + mov oT0, c217 // ::main4Bones<4,5,6,7> + +#line 102 + mov oT5.w, v2.w // ::main4Bones<22> + +// approximately 44 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_constantbuffer CB2[21], immediateIndexed +dcl_constantbuffer CB4[216], dynamicIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_input v3.xy +dcl_input v4.xyzw +dcl_input v5.xyzw +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output o3.xyz +dcl_output o4.xyz +dcl_output o5.xyz +dcl_output o6.xyzw +dcl_output o7.xyz +dcl_temps 5 +imul null, r0.xyzw, v4.xyzw, l(3, 3, 3, 3) +mul r1.xyzw, v5.yyyy, cb4[r0.y + 0].xyzw +mad r1.xyzw, cb4[r0.x + 0].xyzw, v5.xxxx, r1.xyzw +mad r1.xyzw, cb4[r0.z + 0].xyzw, v5.zzzz, r1.xyzw +mad r1.xyzw, cb4[r0.w + 0].xyzw, v5.wwww, r1.xyzw +dp4 r2.x, v0.xyzw, r1.xyzw +mul r3.xyzw, v5.yyyy, cb4[r0.y + 1].xyzw +mad r3.xyzw, cb4[r0.x + 1].xyzw, v5.xxxx, r3.xyzw +mad r3.xyzw, cb4[r0.z + 1].xyzw, v5.zzzz, r3.xyzw +mad r3.xyzw, cb4[r0.w + 1].xyzw, v5.wwww, r3.xyzw +dp4 r2.y, v0.xyzw, r3.xyzw +mul r4.xyzw, v5.yyyy, cb4[r0.y + 2].xyzw +mad r4.xyzw, cb4[r0.x + 2].xyzw, v5.xxxx, r4.xyzw +mad r4.xyzw, cb4[r0.z + 2].xyzw, v5.zzzz, r4.xyzw +mad r0.xyzw, cb4[r0.w + 2].xyzw, v5.wwww, r4.xyzw +dp4 r2.z, v0.xyzw, r0.xyzw +mov r2.w, v0.w +dp4 o0.x, r2.xyzw, cb2[4].xyzw +dp4 o0.y, r2.xyzw, cb2[5].xyzw +dp4 o0.z, r2.xyzw, cb2[6].xyzw +dp4 o0.w, r2.xyzw, cb2[7].xyzw +mov o1.xyzw, cb0[1].xyzw +mov r4.xy, v3.xyxx +mov r4.z, l(1.000000) +dp3 o2.x, r4.xyzx, cb2[16].xywx +dp3 o2.y, r4.xyzx, cb2[17].xywx +dp3 r4.x, v1.xyzx, r1.xyzx +dp3 o6.x, v2.xyzx, r1.xyzx +dp3 r4.y, v1.xyzx, r3.xyzx +dp3 o6.y, v2.xyzx, r3.xyzx +dp3 r4.z, v1.xyzx, r0.xyzx +dp3 o6.z, v2.xyzx, r0.xyzx +dp3 o3.x, r4.xyzx, cb2[0].xyzx +dp3 o3.y, r4.xyzx, cb2[1].xyzx +dp3 o3.z, r4.xyzx, cb2[2].xyzx +mov o7.xyz, r4.xyzx +dp4 r0.x, r2.xyzw, cb2[0].xyzw +dp4 r0.y, r2.xyzw, cb2[1].xyzw +dp4 r0.z, r2.xyzw, cb2[2].xyzw +mov o4.xyz, r0.xyzx +add o5.xyz, -r0.xyzx, cb2[20].xyzx +mov o6.w, v2.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLEffect_main4Bones[] = +{ + 68, 88, 66, 67, 34, 242, + 15, 174, 165, 223, 10, 23, + 241, 14, 49, 82, 167, 42, + 137, 61, 1, 0, 0, 0, + 124, 18, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 68, 10, 0, 0, 176, 16, + 0, 0, 144, 17, 0, 0, + 65, 111, 110, 57, 12, 10, + 0, 0, 12, 10, 0, 0, + 0, 2, 254, 255, 156, 9, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 1, 0, 217, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 218, 0, 0, 0, + 0, 0, 2, 0, 4, 0, + 4, 0, 221, 0, 0, 0, + 0, 0, 2, 0, 16, 0, + 2, 0, 225, 0, 0, 0, + 0, 0, 2, 0, 20, 0, + 1, 0, 227, 0, 0, 0, + 0, 0, 0, 0, 216, 0, + 0, 2, 254, 255, 254, 255, + 140, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 4, 6, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 51, 0, 0, 0, + 120, 0, 0, 0, 6, 0, + 0, 0, 140, 5, 0, 0, + 16, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 69, 102, 102, + 101, 99, 116, 46, 102, 120, + 0, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 56, 6, + 0, 0, 0, 0, 255, 255, + 80, 6, 0, 0, 0, 0, + 255, 255, 92, 6, 0, 0, + 0, 0, 255, 255, 104, 6, + 0, 0, 0, 0, 255, 255, + 116, 6, 0, 0, 0, 0, + 255, 255, 128, 6, 0, 0, + 0, 0, 255, 255, 140, 6, + 0, 0, 97, 0, 0, 0, + 152, 6, 0, 0, 97, 0, + 0, 0, 168, 6, 0, 0, + 97, 0, 0, 0, 180, 6, + 0, 0, 97, 0, 0, 0, + 200, 6, 0, 0, 97, 0, + 0, 0, 224, 6, 0, 0, + 97, 0, 0, 0, 248, 6, + 0, 0, 102, 0, 0, 0, + 16, 7, 0, 0, 97, 0, + 0, 0, 32, 7, 0, 0, + 97, 0, 0, 0, 52, 7, + 0, 0, 97, 0, 0, 0, + 72, 7, 0, 0, 97, 0, + 0, 0, 96, 7, 0, 0, + 97, 0, 0, 0, 120, 7, + 0, 0, 97, 0, 0, 0, + 144, 7, 0, 0, 97, 0, + 0, 0, 168, 7, 0, 0, + 97, 0, 0, 0, 192, 7, + 0, 0, 102, 0, 0, 0, + 216, 7, 0, 0, 102, 0, + 0, 0, 232, 7, 0, 0, + 100, 0, 0, 0, 248, 7, + 0, 0, 101, 0, 0, 0, + 8, 8, 0, 0, 100, 0, + 0, 0, 24, 8, 0, 0, + 101, 0, 0, 0, 40, 8, + 0, 0, 100, 0, 0, 0, + 56, 8, 0, 0, 101, 0, + 0, 0, 72, 8, 0, 0, + 214, 0, 0, 0, 88, 8, + 0, 0, 217, 0, 0, 0, + 100, 8, 0, 0, 219, 0, + 0, 0, 116, 8, 0, 0, + 219, 0, 0, 0, 136, 8, + 0, 0, 219, 0, 0, 0, + 152, 8, 0, 0, 220, 0, + 0, 0, 168, 8, 0, 0, + 220, 0, 0, 0, 184, 8, + 0, 0, 220, 0, 0, 0, + 200, 8, 0, 0, 101, 0, + 0, 0, 216, 8, 0, 0, + 214, 0, 0, 0, 228, 8, + 0, 0, 214, 0, 0, 0, + 244, 8, 0, 0, 214, 0, + 0, 0, 4, 9, 0, 0, + 222, 0, 0, 0, 20, 9, + 0, 0, 214, 0, 0, 0, + 36, 9, 0, 0, 217, 0, + 0, 0, 48, 9, 0, 0, + 217, 0, 0, 0, 64, 9, + 0, 0, 217, 0, 0, 0, + 80, 9, 0, 0, 208, 0, + 0, 0, 96, 9, 0, 0, + 208, 0, 0, 0, 116, 9, + 0, 0, 218, 0, 0, 0, + 128, 9, 0, 0, 102, 0, + 0, 0, 140, 9, 0, 0, + 109, 97, 105, 110, 52, 66, + 111, 110, 101, 115, 0, 112, + 111, 115, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 117, 118, + 0, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 80, 111, 115, + 0, 116, 111, 69, 121, 101, + 0, 116, 97, 110, 103, 101, + 110, 116, 0, 110, 111, 114, + 109, 97, 108, 0, 171, 171, + 27, 2, 0, 0, 32, 2, + 0, 0, 48, 2, 0, 0, + 32, 2, 0, 0, 56, 2, + 0, 0, 60, 2, 0, 0, + 76, 2, 0, 0, 88, 2, + 0, 0, 104, 2, 0, 0, + 88, 2, 0, 0, 113, 2, + 0, 0, 88, 2, 0, 0, + 119, 2, 0, 0, 32, 2, + 0, 0, 127, 2, 0, 0, + 88, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 136, 2, + 0, 0, 13, 0, 0, 0, + 19, 0, 255, 255, 255, 255, + 255, 255, 22, 0, 0, 0, + 255, 255, 20, 0, 255, 255, + 255, 255, 23, 0, 0, 0, + 255, 255, 255, 255, 21, 0, + 255, 255, 31, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 33, 0, 0, 0, + 8, 0, 255, 255, 255, 255, + 255, 255, 34, 0, 0, 0, + 255, 255, 9, 0, 255, 255, + 255, 255, 35, 0, 0, 0, + 10, 0, 255, 255, 255, 255, + 255, 255, 36, 0, 0, 0, + 255, 255, 11, 0, 255, 255, + 255, 255, 37, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 38, 0, 0, 0, + 23, 0, 24, 0, 25, 0, + 255, 255, 42, 0, 0, 0, + 16, 0, 17, 0, 18, 0, + 255, 255, 43, 0, 0, 0, + 13, 0, 14, 0, 15, 0, + 255, 255, 47, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 48, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 49, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 50, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 22, 0, 114, 101, 115, 117, + 108, 116, 0, 171, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 136, 2, + 0, 0, 44, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 45, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 46, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 115, 107, 105, 110, + 110, 105, 110, 103, 0, 171, + 171, 171, 3, 0, 3, 0, + 4, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 11, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 12, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 16, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 17, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 18, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 19, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 20, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 21, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 83, 107, 105, 110, 0, 118, + 101, 114, 116, 101, 120, 0, + 98, 111, 110, 101, 73, 110, + 100, 105, 99, 101, 115, 0, + 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 98, 108, + 101, 110, 100, 87, 101, 105, + 103, 104, 116, 115, 0, 171, + 171, 171, 27, 2, 0, 0, + 32, 2, 0, 0, 127, 2, + 0, 0, 88, 2, 0, 0, + 119, 2, 0, 0, 32, 2, + 0, 0, 56, 2, 0, 0, + 60, 2, 0, 0, 104, 4, + 0, 0, 116, 4, 0, 0, + 132, 4, 0, 0, 32, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 21, 0, 1, 0, + 6, 0, 148, 4, 0, 0, + 24, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 25, 0, 0, 0, 4, 0, + 255, 255, 255, 255, 255, 255, + 26, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 27, 0, 0, 0, 255, 255, + 5, 0, 255, 255, 255, 255, + 28, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 29, 0, 0, 0, 255, 255, + 255, 255, 6, 0, 255, 255, + 1, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 2, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 255, 255, + 3, 0, 0, 0, 7, 0, + 8, 0, 9, 0, 10, 0, + 4, 0, 0, 0, 11, 0, + 12, 0, 255, 255, 255, 255, + 5, 0, 0, 0, 13, 0, + 14, 0, 15, 0, 16, 0, + 6, 0, 0, 0, 17, 0, + 18, 0, 19, 0, 20, 0, + 119, 112, 0, 171, 39, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 40, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 41, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 0, 0, + 0, 0, 16, 2, 0, 0, + 200, 2, 0, 0, 16, 0, + 0, 0, 216, 2, 0, 0, + 0, 0, 0, 0, 152, 3, + 0, 0, 160, 3, 0, 0, + 3, 0, 0, 0, 176, 3, + 0, 0, 0, 0, 0, 0, + 212, 3, 0, 0, 224, 3, + 0, 0, 9, 0, 0, 0, + 240, 3, 0, 0, 92, 4, + 0, 0, 97, 4, 0, 0, + 196, 4, 0, 0, 6, 0, + 0, 0, 212, 4, 0, 0, + 16, 2, 0, 0, 97, 4, + 0, 0, 196, 4, 0, 0, + 6, 0, 0, 0, 28, 5, + 0, 0, 0, 0, 0, 0, + 100, 5, 0, 0, 88, 2, + 0, 0, 3, 0, 0, 0, + 104, 5, 0, 0, 77, 105, + 99, 114, 111, 115, 111, 102, + 116, 32, 40, 82, 41, 32, + 72, 76, 83, 76, 32, 83, + 104, 97, 100, 101, 114, 32, + 67, 111, 109, 112, 105, 108, + 101, 114, 32, 49, 48, 46, + 49, 0, 81, 0, 0, 5, + 228, 0, 15, 160, 0, 0, + 64, 64, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 2, + 5, 0, 0, 128, 0, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 1, 128, 1, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 2, 128, 2, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 3, 128, 3, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 4, 128, 4, 0, + 15, 144, 31, 0, 0, 2, + 5, 0, 5, 128, 5, 0, + 15, 144, 5, 0, 0, 3, + 0, 0, 15, 128, 4, 0, + 228, 144, 228, 0, 0, 160, + 46, 0, 0, 2, 0, 0, + 15, 176, 0, 0, 225, 128, + 5, 0, 0, 4, 1, 0, + 15, 128, 5, 0, 85, 144, + 0, 32, 228, 160, 0, 0, + 0, 176, 4, 0, 0, 5, + 1, 0, 15, 128, 0, 32, + 228, 160, 0, 0, 85, 176, + 5, 0, 0, 144, 1, 0, + 228, 128, 4, 0, 0, 5, + 0, 0, 15, 128, 0, 32, + 228, 160, 0, 0, 170, 176, + 5, 0, 170, 144, 1, 0, + 228, 128, 4, 0, 0, 5, + 0, 0, 15, 128, 0, 32, + 228, 160, 0, 0, 255, 176, + 5, 0, 255, 144, 0, 0, + 228, 128, 8, 0, 0, 3, + 5, 0, 1, 224, 2, 0, + 228, 144, 0, 0, 228, 128, + 5, 0, 0, 4, 1, 0, + 15, 128, 5, 0, 85, 144, + 1, 32, 228, 160, 0, 0, + 0, 176, 5, 0, 0, 4, + 2, 0, 15, 128, 5, 0, + 85, 144, 2, 32, 228, 160, + 0, 0, 0, 176, 4, 0, + 0, 5, 2, 0, 15, 128, + 2, 32, 228, 160, 0, 0, + 85, 176, 5, 0, 0, 144, + 2, 0, 228, 128, 4, 0, + 0, 5, 1, 0, 15, 128, + 1, 32, 228, 160, 0, 0, + 85, 176, 5, 0, 0, 144, + 1, 0, 228, 128, 4, 0, + 0, 5, 1, 0, 15, 128, + 1, 32, 228, 160, 0, 0, + 170, 176, 5, 0, 170, 144, + 1, 0, 228, 128, 4, 0, + 0, 5, 2, 0, 15, 128, + 2, 32, 228, 160, 0, 0, + 170, 176, 5, 0, 170, 144, + 2, 0, 228, 128, 4, 0, + 0, 5, 2, 0, 15, 128, + 2, 32, 228, 160, 0, 0, + 255, 176, 5, 0, 255, 144, + 2, 0, 228, 128, 4, 0, + 0, 5, 1, 0, 15, 128, + 1, 32, 228, 160, 0, 0, + 255, 176, 5, 0, 255, 144, + 1, 0, 228, 128, 8, 0, + 0, 3, 5, 0, 2, 224, + 2, 0, 228, 144, 1, 0, + 228, 128, 8, 0, 0, 3, + 5, 0, 4, 224, 2, 0, + 228, 144, 2, 0, 228, 128, + 9, 0, 0, 3, 3, 0, + 1, 128, 0, 0, 228, 144, + 0, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 1, 128, + 1, 0, 228, 144, 0, 0, + 228, 128, 9, 0, 0, 3, + 3, 0, 2, 128, 0, 0, + 228, 144, 1, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 2, 128, 1, 0, 228, 144, + 1, 0, 228, 128, 9, 0, + 0, 3, 3, 0, 4, 128, + 0, 0, 228, 144, 2, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 4, 128, 1, 0, + 228, 144, 2, 0, 228, 128, + 1, 0, 0, 2, 3, 0, + 8, 128, 0, 0, 255, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 3, 0, 228, 128, + 223, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 7, 128, + 3, 0, 196, 144, 228, 0, + 229, 160, 228, 0, 218, 160, + 8, 0, 0, 3, 1, 0, + 1, 224, 1, 0, 228, 128, + 225, 0, 244, 160, 8, 0, + 0, 3, 1, 0, 2, 224, + 1, 0, 228, 128, 226, 0, + 244, 160, 8, 0, 0, 3, + 2, 0, 1, 224, 0, 0, + 228, 128, 218, 0, 228, 160, + 8, 0, 0, 3, 2, 0, + 2, 224, 0, 0, 228, 128, + 219, 0, 228, 160, 8, 0, + 0, 3, 2, 0, 4, 224, + 0, 0, 228, 128, 220, 0, + 228, 160, 1, 0, 0, 2, + 6, 0, 7, 224, 0, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 1, 128, 3, 0, + 228, 128, 218, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 3, 0, 228, 128, + 219, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 3, 0, 228, 128, 220, 0, + 228, 160, 2, 0, 0, 3, + 4, 0, 7, 224, 0, 0, + 228, 129, 227, 0, 228, 160, + 1, 0, 0, 2, 3, 0, + 7, 224, 0, 0, 228, 128, + 9, 0, 0, 3, 0, 0, + 1, 128, 3, 0, 228, 128, + 221, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 3, 0, 228, 128, 222, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 3, 0, + 228, 128, 224, 0, 228, 160, + 4, 0, 0, 4, 0, 0, + 3, 192, 0, 0, 170, 128, + 216, 0, 228, 160, 0, 0, + 228, 128, 1, 0, 0, 2, + 0, 0, 8, 192, 0, 0, + 170, 128, 1, 0, 0, 2, + 0, 0, 15, 224, 217, 0, + 228, 160, 1, 0, 0, 2, + 5, 0, 8, 224, 2, 0, + 255, 144, 255, 255, 0, 0, + 83, 72, 68, 82, 100, 6, + 0, 0, 64, 0, 1, 0, + 153, 1, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 2, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 2, 0, + 0, 0, 21, 0, 0, 0, + 89, 8, 0, 4, 70, 142, + 32, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 2, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 3, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 4, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 5, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 3, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 4, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 5, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 6, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 7, 0, + 0, 0, 104, 0, 0, 2, + 5, 0, 0, 0, 38, 0, + 0, 11, 0, 208, 0, 0, + 242, 0, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 4, 0, 0, 0, 2, 64, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 56, 0, 0, 9, 242, 0, + 16, 0, 1, 0, 0, 0, + 86, 21, 16, 0, 5, 0, + 0, 0, 70, 142, 32, 4, + 4, 0, 0, 0, 26, 0, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 11, 242, 0, + 16, 0, 1, 0, 0, 0, + 70, 142, 32, 4, 4, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 6, 16, + 16, 0, 5, 0, 0, 0, + 70, 14, 16, 0, 1, 0, + 0, 0, 50, 0, 0, 11, + 242, 0, 16, 0, 1, 0, + 0, 0, 70, 142, 32, 4, + 4, 0, 0, 0, 42, 0, + 16, 0, 0, 0, 0, 0, + 166, 26, 16, 0, 5, 0, + 0, 0, 70, 14, 16, 0, + 1, 0, 0, 0, 50, 0, + 0, 11, 242, 0, 16, 0, + 1, 0, 0, 0, 70, 142, + 32, 4, 4, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 246, 31, 16, 0, + 5, 0, 0, 0, 70, 14, + 16, 0, 1, 0, 0, 0, + 17, 0, 0, 7, 18, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 1, 0, 0, 0, 56, 0, + 0, 10, 242, 0, 16, 0, + 3, 0, 0, 0, 86, 21, + 16, 0, 5, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 1, 0, 0, 0, + 26, 0, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 12, + 242, 0, 16, 0, 3, 0, + 0, 0, 70, 142, 32, 6, + 4, 0, 0, 0, 1, 0, + 0, 0, 10, 0, 16, 0, + 0, 0, 0, 0, 6, 16, + 16, 0, 5, 0, 0, 0, + 70, 14, 16, 0, 3, 0, + 0, 0, 50, 0, 0, 12, + 242, 0, 16, 0, 3, 0, + 0, 0, 70, 142, 32, 6, + 4, 0, 0, 0, 1, 0, + 0, 0, 42, 0, 16, 0, + 0, 0, 0, 0, 166, 26, + 16, 0, 5, 0, 0, 0, + 70, 14, 16, 0, 3, 0, + 0, 0, 50, 0, 0, 12, + 242, 0, 16, 0, 3, 0, + 0, 0, 70, 142, 32, 6, + 4, 0, 0, 0, 1, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 246, 31, + 16, 0, 5, 0, 0, 0, + 70, 14, 16, 0, 3, 0, + 0, 0, 17, 0, 0, 7, + 34, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 3, 0, 0, 0, + 56, 0, 0, 10, 242, 0, + 16, 0, 4, 0, 0, 0, + 86, 21, 16, 0, 5, 0, + 0, 0, 70, 142, 32, 6, + 4, 0, 0, 0, 2, 0, + 0, 0, 26, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 12, 242, 0, 16, 0, + 4, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 2, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 6, 16, 16, 0, 5, 0, + 0, 0, 70, 14, 16, 0, + 4, 0, 0, 0, 50, 0, + 0, 12, 242, 0, 16, 0, + 4, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 2, 0, 0, 0, 42, 0, + 16, 0, 0, 0, 0, 0, + 166, 26, 16, 0, 5, 0, + 0, 0, 70, 14, 16, 0, + 4, 0, 0, 0, 50, 0, + 0, 12, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 2, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 246, 31, 16, 0, 5, 0, + 0, 0, 70, 14, 16, 0, + 4, 0, 0, 0, 17, 0, + 0, 7, 66, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 0, 0, + 0, 0, 54, 0, 0, 5, + 130, 0, 16, 0, 2, 0, + 0, 0, 58, 16, 16, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 4, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 5, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 6, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 7, 0, 0, 0, + 54, 0, 0, 6, 242, 32, + 16, 0, 1, 0, 0, 0, + 70, 142, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 54, 0, 0, 5, 50, 0, + 16, 0, 4, 0, 0, 0, + 70, 16, 16, 0, 3, 0, + 0, 0, 54, 0, 0, 5, + 66, 0, 16, 0, 4, 0, + 0, 0, 1, 64, 0, 0, + 0, 0, 128, 63, 16, 0, + 0, 8, 18, 32, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 131, 32, 0, 2, 0, + 0, 0, 16, 0, 0, 0, + 16, 0, 0, 8, 34, 32, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 131, 32, 0, + 2, 0, 0, 0, 17, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 4, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 0, 0, 7, 18, 32, + 16, 0, 6, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 7, 34, 0, 16, 0, + 4, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 3, 0, + 0, 0, 16, 0, 0, 7, + 34, 32, 16, 0, 6, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 66, 0, + 16, 0, 4, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 16, 0, + 0, 7, 66, 32, 16, 0, + 6, 0, 0, 0, 70, 18, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 8, + 18, 32, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 16, 0, + 0, 8, 34, 32, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 16, 0, 0, 8, 66, 32, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 2, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 7, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 5, 114, 32, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 114, 32, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 20, 0, 0, 0, + 54, 0, 0, 5, 130, 32, + 16, 0, 6, 0, 0, 0, + 58, 16, 16, 0, 2, 0, + 0, 0, 62, 0, 0, 1, + 73, 83, 71, 78, 216, 0, + 0, 0, 6, 0, 0, 0, + 8, 0, 0, 0, 152, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 164, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 7, 7, 0, 0, 171, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 2, 0, 0, 0, + 15, 15, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 3, 3, 0, 0, 188, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 4, 0, 0, 0, + 15, 15, 0, 0, 201, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 5, 0, 0, 0, + 15, 15, 0, 0, 83, 86, + 95, 80, 111, 115, 105, 116, + 105, 111, 110, 0, 78, 79, + 82, 77, 65, 76, 0, 84, + 65, 78, 71, 69, 78, 84, + 0, 84, 69, 88, 67, 79, + 79, 82, 68, 0, 66, 76, + 69, 78, 68, 73, 78, 68, + 73, 67, 69, 83, 0, 66, + 76, 69, 78, 68, 87, 69, + 73, 71, 72, 84, 0, 171, + 171, 171, 79, 83, 71, 78, + 228, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, + 200, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 212, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 218, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 12, 0, 0, + 218, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 4, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 5, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 6, 0, + 0, 0, 15, 0, 0, 0, + 218, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 7, 0, + 0, 0, 7, 8, 0, 0, + 83, 86, 95, 80, 79, 83, + 73, 84, 73, 79, 78, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main4Bones.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main4Bones.pdb new file mode 100644 index 0000000000000000000000000000000000000000..b575fbba0a8885b71c3afd24f9a493adc8653a1d GIT binary patch literal 32256 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 r>`Ok6IE)xTd>HXj#77XfOVGY`yY$!Xrz-(h0 + dcl_texcoord1 v1 // vertex<4,5,6> + dcl_texcoord2 v2 // vertex<7,8,9,10> + dcl_texcoord3 v3 // vertex<11,12,13,14> + dcl_texcoord4 v4 // vertex<15,16> + dcl_texcoord5 v5 // vertex<17,18,19,20> + dcl_texcoord6 v6 // vertex<21,22,23,24> + +#line 112 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLEffect.fx" + mul r0, v5, c228.x + mova a0, r0.yxzw + mul r1, v6.y, c0[a0.x] + mad r1, c0[a0.y], v6.x, r1 // ::skinning<0,3,6,9> + mad r0, c0[a0.z], v6.z, r1 // ::skinning<0,3,6,9> + mad r0, c0[a0.w], v6.w, r0 // ::skinning<0,3,6,9> + +#line 117 + dp3 oT5.x, v2, r0 // ::main4BonesVc<19> + +#line 112 + mul r1, v6.y, c1[a0.x] + mul r2, v6.y, c2[a0.x] + mad r2, c2[a0.y], v6.x, r2 // ::skinning<2,5,8,11> + mad r1, c1[a0.y], v6.x, r1 // ::skinning<1,4,7,10> + mad r1, c1[a0.z], v6.z, r1 // ::skinning<1,4,7,10> + mad r2, c2[a0.z], v6.z, r2 // ::skinning<2,5,8,11> + mad r2, c2[a0.w], v6.w, r2 // ::skinning<2,5,8,11> + mad r1, c1[a0.w], v6.w, r1 // ::skinning<1,4,7,10> + +#line 117 + dp3 oT5.y, v2, r1 // ::main4BonesVc<20> + dp3 oT5.z, v2, r2 // ::main4BonesVc<21> + dp4 r3.x, v0, r0 // SkinVc::vertex<0> + dp3 r0.x, v1, r0 // SkinVc::vertex<4> + dp4 r3.y, v0, r1 // SkinVc::vertex<1> + dp3 r0.y, v1, r1 // SkinVc::vertex<5> + dp4 r3.z, v0, r2 // SkinVc::vertex<2> + dp3 r0.z, v1, r2 // SkinVc::vertex<6> + +#line 281 + mov r3.w, v0.w + +#line 284 + dp4 oPos.z, r3, c223 // ::main4BonesVc<2> + mul oT0, v3, c217 // ::main4BonesVc<4,5,6,7> + mad r1.xyz, v4.xyxw, c228.yyzw, c228.zzyw + dp3 oT1.x, r1, c225.xyww // ::main4BonesVc<8> + dp3 oT1.y, r1, c226.xyww // ::main4BonesVc<9> + dp3 oT2.x, r0, c218 // ::main4BonesVc<10> + dp3 oT2.y, r0, c219 // ::main4BonesVc<11> + dp3 oT2.z, r0, c220 // ::main4BonesVc<12> + +#line 116 + mov oT6.xyz, r0 // ::main4BonesVc<23,24,25> + +#line 281 + dp4 r0.x, r3, c218 // ::wp<0> + dp4 r0.y, r3, c219 // ::wp<1> + dp4 r0.z, r3, c220 // ::wp<2> + +#line 289 + add oT4.xyz, -r0, c227 // ::main4BonesVc<16,17,18> + +#line 281 + mov oT3.xyz, r0 // ::main4BonesVc<13,14,15> + +#line 284 + dp4 r0.x, r3, c221 // ::result<0> + dp4 r0.y, r3, c222 // ::result<1> + dp4 r0.z, r3, c224 // ::result<3> + +#line 275 + mad oPos.xy, r0.z, c216, r0 // ::main4BonesVc<0,1> + mov oPos.w, r0.z // ::main4BonesVc<3> + +#line 117 + mov oT5.w, v2.w // ::main4BonesVc<22> + +// approximately 44 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_constantbuffer CB2[21], immediateIndexed +dcl_constantbuffer CB4[216], dynamicIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_input v3.xyzw +dcl_input v4.xy +dcl_input v5.xyzw +dcl_input v6.xyzw +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output o3.xyz +dcl_output o4.xyz +dcl_output o5.xyz +dcl_output o6.xyzw +dcl_output o7.xyz +dcl_temps 5 +imul null, r0.xyzw, v5.xyzw, l(3, 3, 3, 3) +mul r1.xyzw, v6.yyyy, cb4[r0.y + 0].xyzw +mad r1.xyzw, cb4[r0.x + 0].xyzw, v6.xxxx, r1.xyzw +mad r1.xyzw, cb4[r0.z + 0].xyzw, v6.zzzz, r1.xyzw +mad r1.xyzw, cb4[r0.w + 0].xyzw, v6.wwww, r1.xyzw +dp4 r2.x, v0.xyzw, r1.xyzw +mul r3.xyzw, v6.yyyy, cb4[r0.y + 1].xyzw +mad r3.xyzw, cb4[r0.x + 1].xyzw, v6.xxxx, r3.xyzw +mad r3.xyzw, cb4[r0.z + 1].xyzw, v6.zzzz, r3.xyzw +mad r3.xyzw, cb4[r0.w + 1].xyzw, v6.wwww, r3.xyzw +dp4 r2.y, v0.xyzw, r3.xyzw +mul r4.xyzw, v6.yyyy, cb4[r0.y + 2].xyzw +mad r4.xyzw, cb4[r0.x + 2].xyzw, v6.xxxx, r4.xyzw +mad r4.xyzw, cb4[r0.z + 2].xyzw, v6.zzzz, r4.xyzw +mad r0.xyzw, cb4[r0.w + 2].xyzw, v6.wwww, r4.xyzw +dp4 r2.z, v0.xyzw, r0.xyzw +mov r2.w, v0.w +dp4 o0.x, r2.xyzw, cb2[4].xyzw +dp4 o0.y, r2.xyzw, cb2[5].xyzw +dp4 o0.z, r2.xyzw, cb2[6].xyzw +dp4 o0.w, r2.xyzw, cb2[7].xyzw +mul o1.xyzw, v3.xyzw, cb0[1].xyzw +mov r4.xy, v4.xyxx +mov r4.z, l(1.000000) +dp3 o2.x, r4.xyzx, cb2[16].xywx +dp3 o2.y, r4.xyzx, cb2[17].xywx +dp3 r4.x, v1.xyzx, r1.xyzx +dp3 o6.x, v2.xyzx, r1.xyzx +dp3 r4.y, v1.xyzx, r3.xyzx +dp3 o6.y, v2.xyzx, r3.xyzx +dp3 r4.z, v1.xyzx, r0.xyzx +dp3 o6.z, v2.xyzx, r0.xyzx +dp3 o3.x, r4.xyzx, cb2[0].xyzx +dp3 o3.y, r4.xyzx, cb2[1].xyzx +dp3 o3.z, r4.xyzx, cb2[2].xyzx +mov o7.xyz, r4.xyzx +dp4 r0.x, r2.xyzw, cb2[0].xyzw +dp4 r0.y, r2.xyzw, cb2[1].xyzw +dp4 r0.z, r2.xyzw, cb2[2].xyzw +mov o4.xyz, r0.xyzx +add o5.xyz, -r0.xyzx, cb2[20].xyzx +mov o6.w, v2.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLEffect_main4BonesVc[] = +{ + 68, 88, 66, 67, 201, 135, + 166, 197, 28, 191, 247, 136, + 54, 33, 223, 39, 178, 89, + 162, 136, 1, 0, 0, 0, + 228, 18, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 124, 10, 0, 0, 252, 16, + 0, 0, 248, 17, 0, 0, + 65, 111, 110, 57, 68, 10, + 0, 0, 68, 10, 0, 0, + 0, 2, 254, 255, 212, 9, + 0, 0, 112, 0, 0, 0, + 6, 0, 36, 0, 0, 0, + 108, 0, 0, 0, 108, 0, + 0, 0, 36, 0, 1, 0, + 108, 0, 4, 0, 0, 0, + 216, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 1, 0, 217, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 218, 0, 0, 0, + 0, 0, 2, 0, 4, 0, + 4, 0, 221, 0, 0, 0, + 0, 0, 2, 0, 16, 0, + 2, 0, 225, 0, 0, 0, + 0, 0, 2, 0, 20, 0, + 1, 0, 227, 0, 0, 0, + 0, 0, 0, 0, 216, 0, + 0, 2, 254, 255, 254, 255, + 150, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 44, 6, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 52, 0, 0, 0, + 120, 0, 0, 0, 6, 0, + 0, 0, 180, 5, 0, 0, + 24, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 69, 102, 102, + 101, 99, 116, 46, 102, 120, + 0, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 96, 6, + 0, 0, 0, 0, 255, 255, + 120, 6, 0, 0, 0, 0, + 255, 255, 132, 6, 0, 0, + 0, 0, 255, 255, 144, 6, + 0, 0, 0, 0, 255, 255, + 156, 6, 0, 0, 0, 0, + 255, 255, 168, 6, 0, 0, + 0, 0, 255, 255, 180, 6, + 0, 0, 0, 0, 255, 255, + 192, 6, 0, 0, 112, 0, + 0, 0, 204, 6, 0, 0, + 112, 0, 0, 0, 220, 6, + 0, 0, 112, 0, 0, 0, + 232, 6, 0, 0, 112, 0, + 0, 0, 252, 6, 0, 0, + 112, 0, 0, 0, 20, 7, + 0, 0, 112, 0, 0, 0, + 44, 7, 0, 0, 117, 0, + 0, 0, 68, 7, 0, 0, + 112, 0, 0, 0, 84, 7, + 0, 0, 112, 0, 0, 0, + 104, 7, 0, 0, 112, 0, + 0, 0, 124, 7, 0, 0, + 112, 0, 0, 0, 148, 7, + 0, 0, 112, 0, 0, 0, + 172, 7, 0, 0, 112, 0, + 0, 0, 196, 7, 0, 0, + 112, 0, 0, 0, 220, 7, + 0, 0, 112, 0, 0, 0, + 244, 7, 0, 0, 117, 0, + 0, 0, 12, 8, 0, 0, + 117, 0, 0, 0, 28, 8, + 0, 0, 115, 0, 0, 0, + 44, 8, 0, 0, 116, 0, + 0, 0, 60, 8, 0, 0, + 115, 0, 0, 0, 76, 8, + 0, 0, 116, 0, 0, 0, + 92, 8, 0, 0, 115, 0, + 0, 0, 108, 8, 0, 0, + 116, 0, 0, 0, 124, 8, + 0, 0, 25, 1, 0, 0, + 140, 8, 0, 0, 28, 1, + 0, 0, 152, 8, 0, 0, + 29, 1, 0, 0, 168, 8, + 0, 0, 30, 1, 0, 0, + 184, 8, 0, 0, 30, 1, + 0, 0, 204, 8, 0, 0, + 30, 1, 0, 0, 220, 8, + 0, 0, 31, 1, 0, 0, + 236, 8, 0, 0, 31, 1, + 0, 0, 252, 8, 0, 0, + 31, 1, 0, 0, 12, 9, + 0, 0, 116, 0, 0, 0, + 28, 9, 0, 0, 25, 1, + 0, 0, 40, 9, 0, 0, + 25, 1, 0, 0, 56, 9, + 0, 0, 25, 1, 0, 0, + 72, 9, 0, 0, 33, 1, + 0, 0, 88, 9, 0, 0, + 25, 1, 0, 0, 104, 9, + 0, 0, 28, 1, 0, 0, + 116, 9, 0, 0, 28, 1, + 0, 0, 132, 9, 0, 0, + 28, 1, 0, 0, 148, 9, + 0, 0, 19, 1, 0, 0, + 164, 9, 0, 0, 19, 1, + 0, 0, 184, 9, 0, 0, + 117, 0, 0, 0, 196, 9, + 0, 0, 109, 97, 105, 110, + 52, 66, 111, 110, 101, 115, + 86, 99, 0, 112, 111, 115, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 117, 118, + 0, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 80, 111, 115, + 0, 116, 111, 69, 121, 101, + 0, 116, 97, 110, 103, 101, + 110, 116, 0, 110, 111, 114, + 109, 97, 108, 0, 171, 171, + 37, 2, 0, 0, 44, 2, + 0, 0, 60, 2, 0, 0, + 44, 2, 0, 0, 68, 2, + 0, 0, 72, 2, 0, 0, + 88, 2, 0, 0, 100, 2, + 0, 0, 116, 2, 0, 0, + 100, 2, 0, 0, 125, 2, + 0, 0, 100, 2, 0, 0, + 131, 2, 0, 0, 44, 2, + 0, 0, 139, 2, 0, 0, + 100, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 148, 2, + 0, 0, 14, 0, 0, 0, + 19, 0, 255, 255, 255, 255, + 255, 255, 23, 0, 0, 0, + 255, 255, 20, 0, 255, 255, + 255, 255, 24, 0, 0, 0, + 255, 255, 255, 255, 21, 0, + 255, 255, 32, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 33, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 35, 0, 0, 0, + 8, 0, 255, 255, 255, 255, + 255, 255, 36, 0, 0, 0, + 255, 255, 9, 0, 255, 255, + 255, 255, 37, 0, 0, 0, + 10, 0, 255, 255, 255, 255, + 255, 255, 38, 0, 0, 0, + 255, 255, 11, 0, 255, 255, + 255, 255, 39, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 40, 0, 0, 0, + 23, 0, 24, 0, 25, 0, + 255, 255, 44, 0, 0, 0, + 16, 0, 17, 0, 18, 0, + 255, 255, 45, 0, 0, 0, + 13, 0, 14, 0, 15, 0, + 255, 255, 49, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 50, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 51, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 22, 0, 114, 101, 115, 117, + 108, 116, 0, 171, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 148, 2, + 0, 0, 46, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 47, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 48, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 115, 107, 105, 110, + 110, 105, 110, 103, 0, 171, + 171, 171, 3, 0, 3, 0, + 4, 0, 3, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 12, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 13, 0, 0, 0, 0, 0, + 3, 0, 6, 0, 9, 0, + 17, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 18, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 19, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 20, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 21, 0, 0, 0, 2, 0, + 5, 0, 8, 0, 11, 0, + 22, 0, 0, 0, 1, 0, + 4, 0, 7, 0, 10, 0, + 83, 107, 105, 110, 86, 99, + 0, 118, 101, 114, 116, 101, + 120, 0, 99, 111, 108, 111, + 114, 0, 98, 111, 110, 101, + 73, 110, 100, 105, 99, 101, + 115, 0, 1, 0, 2, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 98, 108, 101, 110, 100, 87, + 101, 105, 103, 104, 116, 115, + 0, 171, 171, 171, 37, 2, + 0, 0, 44, 2, 0, 0, + 139, 2, 0, 0, 100, 2, + 0, 0, 131, 2, 0, 0, + 44, 2, 0, 0, 118, 4, + 0, 0, 44, 2, 0, 0, + 68, 2, 0, 0, 72, 2, + 0, 0, 124, 4, 0, 0, + 136, 4, 0, 0, 152, 4, + 0, 0, 44, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 25, 0, 1, 0, 7, 0, + 168, 4, 0, 0, 25, 0, + 0, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 26, 0, + 0, 0, 4, 0, 255, 255, + 255, 255, 255, 255, 27, 0, + 0, 0, 255, 255, 1, 0, + 255, 255, 255, 255, 28, 0, + 0, 0, 255, 255, 5, 0, + 255, 255, 255, 255, 29, 0, + 0, 0, 255, 255, 255, 255, + 2, 0, 255, 255, 30, 0, + 0, 0, 255, 255, 255, 255, + 6, 0, 255, 255, 1, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 2, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 255, 255, 3, 0, + 0, 0, 7, 0, 8, 0, + 9, 0, 10, 0, 4, 0, + 0, 0, 11, 0, 12, 0, + 13, 0, 14, 0, 5, 0, + 0, 0, 15, 0, 16, 0, + 255, 255, 255, 255, 6, 0, + 0, 0, 17, 0, 18, 0, + 19, 0, 20, 0, 7, 0, + 0, 0, 21, 0, 22, 0, + 23, 0, 24, 0, 119, 112, + 0, 171, 41, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 42, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 43, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 0, 0, 0, 0, + 24, 2, 0, 0, 212, 2, + 0, 0, 16, 0, 0, 0, + 228, 2, 0, 0, 0, 0, + 0, 0, 164, 3, 0, 0, + 172, 3, 0, 0, 3, 0, + 0, 0, 188, 3, 0, 0, + 0, 0, 0, 0, 224, 3, + 0, 0, 236, 3, 0, 0, + 9, 0, 0, 0, 252, 3, + 0, 0, 104, 4, 0, 0, + 111, 4, 0, 0, 224, 4, + 0, 0, 6, 0, 0, 0, + 240, 4, 0, 0, 24, 2, + 0, 0, 111, 4, 0, 0, + 224, 4, 0, 0, 7, 0, + 0, 0, 56, 5, 0, 0, + 0, 0, 0, 0, 140, 5, + 0, 0, 100, 2, 0, 0, + 3, 0, 0, 0, 144, 5, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 228, 0, + 15, 160, 0, 0, 64, 64, + 0, 0, 128, 63, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 3, 128, 3, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 4, 128, 4, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 5, 128, 5, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 6, 128, 6, 0, 15, 144, + 5, 0, 0, 3, 0, 0, + 15, 128, 5, 0, 228, 144, + 228, 0, 0, 160, 46, 0, + 0, 2, 0, 0, 15, 176, + 0, 0, 225, 128, 5, 0, + 0, 4, 1, 0, 15, 128, + 6, 0, 85, 144, 0, 32, + 228, 160, 0, 0, 0, 176, + 4, 0, 0, 5, 1, 0, + 15, 128, 0, 32, 228, 160, + 0, 0, 85, 176, 6, 0, + 0, 144, 1, 0, 228, 128, + 4, 0, 0, 5, 0, 0, + 15, 128, 0, 32, 228, 160, + 0, 0, 170, 176, 6, 0, + 170, 144, 1, 0, 228, 128, + 4, 0, 0, 5, 0, 0, + 15, 128, 0, 32, 228, 160, + 0, 0, 255, 176, 6, 0, + 255, 144, 0, 0, 228, 128, + 8, 0, 0, 3, 5, 0, + 1, 224, 2, 0, 228, 144, + 0, 0, 228, 128, 5, 0, + 0, 4, 1, 0, 15, 128, + 6, 0, 85, 144, 1, 32, + 228, 160, 0, 0, 0, 176, + 5, 0, 0, 4, 2, 0, + 15, 128, 6, 0, 85, 144, + 2, 32, 228, 160, 0, 0, + 0, 176, 4, 0, 0, 5, + 2, 0, 15, 128, 2, 32, + 228, 160, 0, 0, 85, 176, + 6, 0, 0, 144, 2, 0, + 228, 128, 4, 0, 0, 5, + 1, 0, 15, 128, 1, 32, + 228, 160, 0, 0, 85, 176, + 6, 0, 0, 144, 1, 0, + 228, 128, 4, 0, 0, 5, + 1, 0, 15, 128, 1, 32, + 228, 160, 0, 0, 170, 176, + 6, 0, 170, 144, 1, 0, + 228, 128, 4, 0, 0, 5, + 2, 0, 15, 128, 2, 32, + 228, 160, 0, 0, 170, 176, + 6, 0, 170, 144, 2, 0, + 228, 128, 4, 0, 0, 5, + 2, 0, 15, 128, 2, 32, + 228, 160, 0, 0, 255, 176, + 6, 0, 255, 144, 2, 0, + 228, 128, 4, 0, 0, 5, + 1, 0, 15, 128, 1, 32, + 228, 160, 0, 0, 255, 176, + 6, 0, 255, 144, 1, 0, + 228, 128, 8, 0, 0, 3, + 5, 0, 2, 224, 2, 0, + 228, 144, 1, 0, 228, 128, + 8, 0, 0, 3, 5, 0, + 4, 224, 2, 0, 228, 144, + 2, 0, 228, 128, 9, 0, + 0, 3, 3, 0, 1, 128, + 0, 0, 228, 144, 0, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 1, 128, 1, 0, + 228, 144, 0, 0, 228, 128, + 9, 0, 0, 3, 3, 0, + 2, 128, 0, 0, 228, 144, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 2, 128, + 1, 0, 228, 144, 1, 0, + 228, 128, 9, 0, 0, 3, + 3, 0, 4, 128, 0, 0, + 228, 144, 2, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 4, 128, 1, 0, 228, 144, + 2, 0, 228, 128, 1, 0, + 0, 2, 3, 0, 8, 128, + 0, 0, 255, 144, 9, 0, + 0, 3, 0, 0, 4, 192, + 3, 0, 228, 128, 223, 0, + 228, 160, 5, 0, 0, 3, + 0, 0, 15, 224, 3, 0, + 228, 144, 217, 0, 228, 160, + 4, 0, 0, 4, 1, 0, + 7, 128, 4, 0, 196, 144, + 228, 0, 229, 160, 228, 0, + 218, 160, 8, 0, 0, 3, + 1, 0, 1, 224, 1, 0, + 228, 128, 225, 0, 244, 160, + 8, 0, 0, 3, 1, 0, + 2, 224, 1, 0, 228, 128, + 226, 0, 244, 160, 8, 0, + 0, 3, 2, 0, 1, 224, + 0, 0, 228, 128, 218, 0, + 228, 160, 8, 0, 0, 3, + 2, 0, 2, 224, 0, 0, + 228, 128, 219, 0, 228, 160, + 8, 0, 0, 3, 2, 0, + 4, 224, 0, 0, 228, 128, + 220, 0, 228, 160, 1, 0, + 0, 2, 6, 0, 7, 224, + 0, 0, 228, 128, 9, 0, + 0, 3, 0, 0, 1, 128, + 3, 0, 228, 128, 218, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 3, 0, + 228, 128, 219, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 3, 0, 228, 128, + 220, 0, 228, 160, 2, 0, + 0, 3, 4, 0, 7, 224, + 0, 0, 228, 129, 227, 0, + 228, 160, 1, 0, 0, 2, + 3, 0, 7, 224, 0, 0, + 228, 128, 9, 0, 0, 3, + 0, 0, 1, 128, 3, 0, + 228, 128, 221, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 2, 128, 3, 0, 228, 128, + 222, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 4, 128, + 3, 0, 228, 128, 224, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 3, 192, 0, 0, + 170, 128, 216, 0, 228, 160, + 0, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 192, + 0, 0, 170, 128, 1, 0, + 0, 2, 5, 0, 8, 224, + 2, 0, 255, 144, 255, 255, + 0, 0, 83, 72, 68, 82, + 120, 6, 0, 0, 64, 0, + 1, 0, 158, 1, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 2, 0, 0, 0, 21, 0, + 0, 0, 89, 8, 0, 4, + 70, 142, 32, 0, 4, 0, + 0, 0, 216, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 0, 0, 0, 0, + 95, 0, 0, 3, 114, 16, + 16, 0, 1, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 2, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 3, 0, 0, 0, + 95, 0, 0, 3, 50, 16, + 16, 0, 4, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 5, 0, 0, 0, + 95, 0, 0, 3, 242, 16, + 16, 0, 6, 0, 0, 0, + 103, 0, 0, 4, 242, 32, + 16, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 1, 0, 0, 0, 101, 0, + 0, 3, 50, 32, 16, 0, + 2, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 3, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 4, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 5, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 6, 0, 0, 0, 101, 0, + 0, 3, 114, 32, 16, 0, + 7, 0, 0, 0, 104, 0, + 0, 2, 5, 0, 0, 0, + 38, 0, 0, 11, 0, 208, + 0, 0, 242, 0, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 5, 0, 0, 0, + 2, 64, 0, 0, 3, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 56, 0, 0, 9, + 242, 0, 16, 0, 1, 0, + 0, 0, 86, 21, 16, 0, + 6, 0, 0, 0, 70, 142, + 32, 4, 4, 0, 0, 0, + 26, 0, 16, 0, 0, 0, + 0, 0, 50, 0, 0, 11, + 242, 0, 16, 0, 1, 0, + 0, 0, 70, 142, 32, 4, + 4, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 6, 16, 16, 0, 6, 0, + 0, 0, 70, 14, 16, 0, + 1, 0, 0, 0, 50, 0, + 0, 11, 242, 0, 16, 0, + 1, 0, 0, 0, 70, 142, + 32, 4, 4, 0, 0, 0, + 42, 0, 16, 0, 0, 0, + 0, 0, 166, 26, 16, 0, + 6, 0, 0, 0, 70, 14, + 16, 0, 1, 0, 0, 0, + 50, 0, 0, 11, 242, 0, + 16, 0, 1, 0, 0, 0, + 70, 142, 32, 4, 4, 0, + 0, 0, 58, 0, 16, 0, + 0, 0, 0, 0, 246, 31, + 16, 0, 6, 0, 0, 0, + 70, 14, 16, 0, 1, 0, + 0, 0, 17, 0, 0, 7, + 18, 0, 16, 0, 2, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 10, 242, 0, + 16, 0, 3, 0, 0, 0, + 86, 21, 16, 0, 6, 0, + 0, 0, 70, 142, 32, 6, + 4, 0, 0, 0, 1, 0, + 0, 0, 26, 0, 16, 0, + 0, 0, 0, 0, 50, 0, + 0, 12, 242, 0, 16, 0, + 3, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 1, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 6, 16, 16, 0, 6, 0, + 0, 0, 70, 14, 16, 0, + 3, 0, 0, 0, 50, 0, + 0, 12, 242, 0, 16, 0, + 3, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 1, 0, 0, 0, 42, 0, + 16, 0, 0, 0, 0, 0, + 166, 26, 16, 0, 6, 0, + 0, 0, 70, 14, 16, 0, + 3, 0, 0, 0, 50, 0, + 0, 12, 242, 0, 16, 0, + 3, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 1, 0, 0, 0, 58, 0, + 16, 0, 0, 0, 0, 0, + 246, 31, 16, 0, 6, 0, + 0, 0, 70, 14, 16, 0, + 3, 0, 0, 0, 17, 0, + 0, 7, 34, 0, 16, 0, + 2, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 3, 0, + 0, 0, 56, 0, 0, 10, + 242, 0, 16, 0, 4, 0, + 0, 0, 86, 21, 16, 0, + 6, 0, 0, 0, 70, 142, + 32, 6, 4, 0, 0, 0, + 2, 0, 0, 0, 26, 0, + 16, 0, 0, 0, 0, 0, + 50, 0, 0, 12, 242, 0, + 16, 0, 4, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 2, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 6, 16, 16, 0, + 6, 0, 0, 0, 70, 14, + 16, 0, 4, 0, 0, 0, + 50, 0, 0, 12, 242, 0, + 16, 0, 4, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 2, 0, 0, 0, + 42, 0, 16, 0, 0, 0, + 0, 0, 166, 26, 16, 0, + 6, 0, 0, 0, 70, 14, + 16, 0, 4, 0, 0, 0, + 50, 0, 0, 12, 242, 0, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 6, 4, 0, + 0, 0, 2, 0, 0, 0, + 58, 0, 16, 0, 0, 0, + 0, 0, 246, 31, 16, 0, + 6, 0, 0, 0, 70, 14, + 16, 0, 4, 0, 0, 0, + 17, 0, 0, 7, 66, 0, + 16, 0, 2, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 0, 0, 0, 0, 54, 0, + 0, 5, 130, 0, 16, 0, + 2, 0, 0, 0, 58, 16, + 16, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 18, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 4, 0, + 0, 0, 17, 0, 0, 8, + 34, 32, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 5, 0, 0, 0, 17, 0, + 0, 8, 66, 32, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 6, 0, 0, 0, + 17, 0, 0, 8, 130, 32, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 7, 0, + 0, 0, 56, 0, 0, 8, + 242, 32, 16, 0, 1, 0, + 0, 0, 70, 30, 16, 0, + 3, 0, 0, 0, 70, 142, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 54, 0, + 0, 5, 50, 0, 16, 0, + 4, 0, 0, 0, 70, 16, + 16, 0, 4, 0, 0, 0, + 54, 0, 0, 5, 66, 0, + 16, 0, 4, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 128, 63, 16, 0, 0, 8, + 18, 32, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 131, + 32, 0, 2, 0, 0, 0, + 16, 0, 0, 0, 16, 0, + 0, 8, 34, 32, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 131, 32, 0, 2, 0, + 0, 0, 17, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 4, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 0, + 0, 7, 18, 32, 16, 0, + 6, 0, 0, 0, 70, 18, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 0, 0, 7, + 34, 0, 16, 0, 4, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, + 16, 0, 0, 7, 34, 32, + 16, 0, 6, 0, 0, 0, + 70, 18, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 3, 0, 0, 0, 16, 0, + 0, 7, 66, 0, 16, 0, + 4, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 7, + 66, 32, 16, 0, 6, 0, + 0, 0, 70, 18, 16, 0, + 2, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 16, 0, 0, 8, 18, 32, + 16, 0, 3, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 0, 8, + 34, 32, 16, 0, 3, 0, + 0, 0, 70, 2, 16, 0, + 4, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 1, 0, 0, 0, 16, 0, + 0, 8, 66, 32, 16, 0, + 3, 0, 0, 0, 70, 2, + 16, 0, 4, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 2, 0, 0, 0, + 54, 0, 0, 5, 114, 32, + 16, 0, 7, 0, 0, 0, + 70, 2, 16, 0, 4, 0, + 0, 0, 17, 0, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 14, 16, 0, + 2, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 17, 0, + 0, 8, 34, 0, 16, 0, + 0, 0, 0, 0, 70, 14, + 16, 0, 2, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 1, 0, 0, 0, + 17, 0, 0, 8, 66, 0, + 16, 0, 0, 0, 0, 0, + 70, 14, 16, 0, 2, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 2, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 4, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 0, 0, + 0, 9, 114, 32, 16, 0, + 5, 0, 0, 0, 70, 2, + 16, 128, 65, 0, 0, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 20, 0, 0, 0, 54, 0, + 0, 5, 130, 32, 16, 0, + 6, 0, 0, 0, 58, 16, + 16, 0, 2, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 244, 0, 0, 0, + 7, 0, 0, 0, 8, 0, + 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 15, + 0, 0, 188, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 7, 7, + 0, 0, 195, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 15, 15, + 0, 0, 203, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 15, 15, + 0, 0, 209, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 3, 3, + 0, 0, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 5, 0, 0, 0, 15, 15, + 0, 0, 231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 6, 0, 0, 0, 15, 15, + 0, 0, 83, 86, 95, 80, + 111, 115, 105, 116, 105, 111, + 110, 0, 78, 79, 82, 77, + 65, 76, 0, 84, 65, 78, + 71, 69, 78, 84, 0, 67, + 79, 76, 79, 82, 0, 84, + 69, 88, 67, 79, 79, 82, + 68, 0, 66, 76, 69, 78, + 68, 73, 78, 68, 73, 67, + 69, 83, 0, 66, 76, 69, + 78, 68, 87, 69, 73, 71, + 72, 84, 0, 171, 79, 83, + 71, 78, 228, 0, 0, 0, + 8, 0, 0, 0, 8, 0, + 0, 0, 200, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 212, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 0, + 0, 0, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 12, + 0, 0, 218, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 5, 0, 0, 0, 7, 8, + 0, 0, 218, 0, 0, 0, + 4, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 6, 0, 0, 0, 15, 0, + 0, 0, 218, 0, 0, 0, + 5, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 7, 0, 0, 0, 7, 8, + 0, 0, 83, 86, 95, 80, + 79, 83, 73, 84, 73, 79, + 78, 0, 67, 79, 76, 79, + 82, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main4BonesVc.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_main4BonesVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2ae94e257a8388bb3a0e5a09ea6c36d876c575ab GIT binary patch literal 32256 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 + dcl_texcoord1 v1 // vertex<4,5,6> + dcl_texcoord2 v2 // vertex<7,8,9,10> + dcl_texcoord3 v3 // vertex<11,12,13,14> + dcl_texcoord4 v4 // vertex<15,16> + +#line 150 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLEffect.fx" + dp4 oPos.z, v0, c7 // ::mainVc<2> + mul oT0, v3, c1 // ::mainVc<4,5,6,7> + mad r0.xyz, v4.xyxw, c12.xxyw, c12.yyxw + dp3 oT1.x, r0, c9.xyww // ::mainVc<8> + dp3 oT1.y, r0, c10.xyww // ::mainVc<9> + dp3 oT2.x, v1, c2 // ::mainVc<10> + dp3 oT2.y, v1, c3 // ::mainVc<11> + dp3 oT2.z, v1, c4 // ::mainVc<12> + +#line 147 + dp4 r0.x, v0, c2 // ::wp<0> + dp4 r0.y, v0, c3 // ::wp<1> + dp4 r0.z, v0, c4 // ::wp<2> + +#line 155 + add oT4.xyz, -r0, c11 // ::mainVc<16,17,18> + +#line 147 + mov oT3.xyz, r0 // ::mainVc<13,14,15> + +#line 150 + dp4 r0.x, v0, c5 // ::result<0> + dp4 r0.y, v0, c6 // ::result<1> + dp4 r0.z, v0, c8 // ::result<3> + +#line 143 + mad oPos.xy, r0.z, c0, r0 // ::mainVc<0,1> + mov oPos.w, r0.z // ::mainVc<3> + +#line 156 + mov oT5, v2 // ::mainVc<19,20,21,22> + mov oT6.xyz, v1 // ::mainVc<23,24,25> + +// approximately 20 instruction slots used +vs_4_0 +dcl_constantbuffer CB0[2], immediateIndexed +dcl_constantbuffer CB2[21], immediateIndexed +dcl_input v0.xyzw +dcl_input v1.xyz +dcl_input v2.xyzw +dcl_input v3.xyzw +dcl_input v4.xy +dcl_output_siv o0.xyzw, position +dcl_output o1.xyzw +dcl_output o2.xy +dcl_output o3.xyz +dcl_output o4.xyz +dcl_output o5.xyz +dcl_output o6.xyzw +dcl_output o7.xyz +dcl_temps 1 +dp4 o0.x, v0.xyzw, cb2[4].xyzw +dp4 o0.y, v0.xyzw, cb2[5].xyzw +dp4 o0.z, v0.xyzw, cb2[6].xyzw +dp4 o0.w, v0.xyzw, cb2[7].xyzw +mul o1.xyzw, v3.xyzw, cb0[1].xyzw +mov r0.xy, v4.xyxx +mov r0.z, l(1.000000) +dp3 o2.x, r0.xyzx, cb2[16].xywx +dp3 o2.y, r0.xyzx, cb2[17].xywx +dp3 o3.x, v1.xyzx, cb2[0].xyzx +dp3 o3.y, v1.xyzx, cb2[1].xyzx +dp3 o3.z, v1.xyzx, cb2[2].xyzx +dp4 r0.x, v0.xyzw, cb2[0].xyzw +dp4 r0.y, v0.xyzw, cb2[1].xyzw +dp4 r0.z, v0.xyzw, cb2[2].xyzw +mov o4.xyz, r0.xyzx +add o5.xyz, -r0.xyzx, cb2[20].xyzx +mov o6.xyzw, v2.xyzw +mov o7.xyz, v1.xyzx +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLEffect_mainVc[] = +{ + 68, 88, 66, 67, 91, 101, + 221, 175, 122, 209, 240, 157, + 103, 55, 177, 243, 74, 121, + 207, 109, 1, 0, 0, 0, + 228, 10, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 64, 6, 0, 0, 68, 9, + 0, 0, 248, 9, 0, 0, + 65, 111, 110, 57, 8, 6, + 0, 0, 8, 6, 0, 0, + 0, 2, 254, 255, 164, 5, + 0, 0, 100, 0, 0, 0, + 5, 0, 36, 0, 0, 0, + 96, 0, 0, 0, 96, 0, + 0, 0, 36, 0, 1, 0, + 96, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 3, 0, 2, 0, 0, 0, + 0, 0, 2, 0, 4, 0, + 4, 0, 5, 0, 0, 0, + 0, 0, 2, 0, 16, 0, + 2, 0, 9, 0, 0, 0, + 0, 0, 2, 0, 20, 0, + 1, 0, 11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 2, 254, 255, 254, 255, + 3, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 224, 3, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 116, 0, + 0, 0, 26, 0, 0, 0, + 120, 0, 0, 0, 4, 0, + 0, 0, 144, 3, 0, 0, + 72, 1, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 69, 102, 102, + 101, 99, 116, 46, 102, 120, + 0, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 20, 4, + 0, 0, 0, 0, 255, 255, + 44, 4, 0, 0, 0, 0, + 255, 255, 56, 4, 0, 0, + 0, 0, 255, 255, 68, 4, + 0, 0, 0, 0, 255, 255, + 80, 4, 0, 0, 0, 0, + 255, 255, 92, 4, 0, 0, + 150, 0, 0, 0, 104, 4, + 0, 0, 151, 0, 0, 0, + 120, 4, 0, 0, 152, 0, + 0, 0, 136, 4, 0, 0, + 152, 0, 0, 0, 156, 4, + 0, 0, 152, 0, 0, 0, + 172, 4, 0, 0, 153, 0, + 0, 0, 188, 4, 0, 0, + 153, 0, 0, 0, 204, 4, + 0, 0, 153, 0, 0, 0, + 220, 4, 0, 0, 147, 0, + 0, 0, 236, 4, 0, 0, + 147, 0, 0, 0, 252, 4, + 0, 0, 147, 0, 0, 0, + 12, 5, 0, 0, 155, 0, + 0, 0, 28, 5, 0, 0, + 147, 0, 0, 0, 44, 5, + 0, 0, 150, 0, 0, 0, + 56, 5, 0, 0, 150, 0, + 0, 0, 72, 5, 0, 0, + 150, 0, 0, 0, 88, 5, + 0, 0, 143, 0, 0, 0, + 104, 5, 0, 0, 143, 0, + 0, 0, 124, 5, 0, 0, + 156, 0, 0, 0, 136, 5, + 0, 0, 157, 0, 0, 0, + 148, 5, 0, 0, 109, 97, + 105, 110, 86, 99, 0, 112, + 111, 115, 0, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 100, 105, 102, 102, + 117, 115, 101, 0, 117, 118, + 0, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 0, 171, 171, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 80, 111, 115, + 0, 116, 111, 69, 121, 101, + 0, 116, 97, 110, 103, 101, + 110, 116, 0, 110, 111, 114, + 109, 97, 108, 0, 171, 171, + 79, 1, 0, 0, 84, 1, + 0, 0, 100, 1, 0, 0, + 84, 1, 0, 0, 108, 1, + 0, 0, 112, 1, 0, 0, + 128, 1, 0, 0, 140, 1, + 0, 0, 156, 1, 0, 0, + 140, 1, 0, 0, 165, 1, + 0, 0, 140, 1, 0, 0, + 171, 1, 0, 0, 84, 1, + 0, 0, 179, 1, 0, 0, + 140, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 188, 1, + 0, 0, 6, 0, 0, 0, + 255, 255, 255, 255, 2, 0, + 255, 255, 7, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 9, 0, 0, 0, + 8, 0, 255, 255, 255, 255, + 255, 255, 10, 0, 0, 0, + 255, 255, 9, 0, 255, 255, + 255, 255, 11, 0, 0, 0, + 10, 0, 255, 255, 255, 255, + 255, 255, 12, 0, 0, 0, + 255, 255, 11, 0, 255, 255, + 255, 255, 13, 0, 0, 0, + 255, 255, 255, 255, 12, 0, + 255, 255, 17, 0, 0, 0, + 16, 0, 17, 0, 18, 0, + 255, 255, 18, 0, 0, 0, + 13, 0, 14, 0, 15, 0, + 255, 255, 22, 0, 0, 0, + 0, 0, 1, 0, 255, 255, + 255, 255, 23, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 3, 0, 24, 0, 0, 0, + 19, 0, 20, 0, 21, 0, + 22, 0, 25, 0, 0, 0, + 23, 0, 24, 0, 25, 0, + 255, 255, 114, 101, 115, 117, + 108, 116, 0, 171, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 188, 1, + 0, 0, 19, 0, 0, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 20, 0, 0, 0, + 255, 255, 1, 0, 255, 255, + 255, 255, 21, 0, 0, 0, + 255, 255, 255, 255, 3, 0, + 255, 255, 118, 101, 114, 116, + 101, 120, 0, 99, 111, 108, + 111, 114, 0, 171, 171, 171, + 79, 1, 0, 0, 84, 1, + 0, 0, 179, 1, 0, 0, + 140, 1, 0, 0, 171, 1, + 0, 0, 84, 1, 0, 0, + 235, 2, 0, 0, 84, 1, + 0, 0, 108, 1, 0, 0, + 112, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 17, 0, + 1, 0, 5, 0, 244, 2, + 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 2, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 255, 255, 3, 0, 0, 0, + 7, 0, 8, 0, 9, 0, + 10, 0, 4, 0, 0, 0, + 11, 0, 12, 0, 13, 0, + 14, 0, 5, 0, 0, 0, + 15, 0, 16, 0, 255, 255, + 255, 255, 119, 112, 0, 171, + 14, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, + 15, 0, 0, 0, 255, 255, + 1, 0, 255, 255, 255, 255, + 16, 0, 0, 0, 255, 255, + 255, 255, 2, 0, 255, 255, + 0, 0, 0, 0, 72, 1, + 0, 0, 252, 1, 0, 0, + 13, 0, 0, 0, 12, 2, + 0, 0, 0, 0, 0, 0, + 168, 2, 0, 0, 176, 2, + 0, 0, 3, 0, 0, 0, + 192, 2, 0, 0, 72, 1, + 0, 0, 228, 2, 0, 0, + 28, 3, 0, 0, 5, 0, + 0, 0, 44, 3, 0, 0, + 0, 0, 0, 0, 104, 3, + 0, 0, 140, 1, 0, 0, + 3, 0, 0, 0, 108, 3, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 12, 0, + 15, 160, 0, 0, 128, 63, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 5, 0, + 0, 128, 0, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 1, 128, 1, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 2, 128, 2, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 3, 128, 3, 0, 15, 144, + 31, 0, 0, 2, 5, 0, + 4, 128, 4, 0, 15, 144, + 9, 0, 0, 3, 0, 0, + 4, 192, 0, 0, 228, 144, + 7, 0, 228, 160, 5, 0, + 0, 3, 0, 0, 15, 224, + 3, 0, 228, 144, 1, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 7, 128, 4, 0, + 196, 144, 12, 0, 208, 160, + 12, 0, 197, 160, 8, 0, + 0, 3, 1, 0, 1, 224, + 0, 0, 228, 128, 9, 0, + 244, 160, 8, 0, 0, 3, + 1, 0, 2, 224, 0, 0, + 228, 128, 10, 0, 244, 160, + 8, 0, 0, 3, 2, 0, + 1, 224, 1, 0, 228, 144, + 2, 0, 228, 160, 8, 0, + 0, 3, 2, 0, 2, 224, + 1, 0, 228, 144, 3, 0, + 228, 160, 8, 0, 0, 3, + 2, 0, 4, 224, 1, 0, + 228, 144, 4, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 1, 128, 0, 0, 228, 144, + 2, 0, 228, 160, 9, 0, + 0, 3, 0, 0, 2, 128, + 0, 0, 228, 144, 3, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 4, 128, 0, 0, + 228, 144, 4, 0, 228, 160, + 2, 0, 0, 3, 4, 0, + 7, 224, 0, 0, 228, 129, + 11, 0, 228, 160, 1, 0, + 0, 2, 3, 0, 7, 224, + 0, 0, 228, 128, 9, 0, + 0, 3, 0, 0, 1, 128, + 0, 0, 228, 144, 5, 0, + 228, 160, 9, 0, 0, 3, + 0, 0, 2, 128, 0, 0, + 228, 144, 6, 0, 228, 160, + 9, 0, 0, 3, 0, 0, + 4, 128, 0, 0, 228, 144, + 8, 0, 228, 160, 4, 0, + 0, 4, 0, 0, 3, 192, + 0, 0, 170, 128, 0, 0, + 228, 160, 0, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 192, 0, 0, 170, 128, + 1, 0, 0, 2, 5, 0, + 15, 224, 2, 0, 228, 144, + 1, 0, 0, 2, 6, 0, + 7, 224, 1, 0, 228, 144, + 255, 255, 0, 0, 83, 72, + 68, 82, 252, 2, 0, 0, + 64, 0, 1, 0, 191, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 2, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 2, 0, 0, 0, + 21, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 0, 0, 0, 0, 95, 0, + 0, 3, 114, 16, 16, 0, + 1, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 2, 0, 0, 0, 95, 0, + 0, 3, 242, 16, 16, 0, + 3, 0, 0, 0, 95, 0, + 0, 3, 50, 16, 16, 0, + 4, 0, 0, 0, 103, 0, + 0, 4, 242, 32, 16, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 1, 0, + 0, 0, 101, 0, 0, 3, + 50, 32, 16, 0, 2, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 3, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 4, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 5, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 6, 0, + 0, 0, 101, 0, 0, 3, + 114, 32, 16, 0, 7, 0, + 0, 0, 104, 0, 0, 2, + 1, 0, 0, 0, 17, 0, + 0, 8, 18, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 4, 0, 0, 0, + 17, 0, 0, 8, 34, 32, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 5, 0, + 0, 0, 17, 0, 0, 8, + 66, 32, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 6, 0, 0, 0, 17, 0, + 0, 8, 130, 32, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 7, 0, 0, 0, + 56, 0, 0, 8, 242, 32, + 16, 0, 1, 0, 0, 0, + 70, 30, 16, 0, 3, 0, + 0, 0, 70, 142, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 54, 0, 0, 5, + 50, 0, 16, 0, 0, 0, + 0, 0, 70, 16, 16, 0, + 4, 0, 0, 0, 54, 0, + 0, 5, 66, 0, 16, 0, + 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 128, 63, + 16, 0, 0, 8, 18, 32, + 16, 0, 2, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 70, 131, 32, 0, + 2, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 8, + 34, 32, 16, 0, 2, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 131, + 32, 0, 2, 0, 0, 0, + 17, 0, 0, 0, 16, 0, + 0, 8, 18, 32, 16, 0, + 3, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 16, 0, 0, 8, 34, 32, + 16, 0, 3, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 16, 0, 0, 8, + 66, 32, 16, 0, 3, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 130, + 32, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 17, 0, + 0, 8, 18, 0, 16, 0, + 0, 0, 0, 0, 70, 30, + 16, 0, 0, 0, 0, 0, + 70, 142, 32, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 17, 0, 0, 8, 34, 0, + 16, 0, 0, 0, 0, 0, + 70, 30, 16, 0, 0, 0, + 0, 0, 70, 142, 32, 0, + 2, 0, 0, 0, 1, 0, + 0, 0, 17, 0, 0, 8, + 66, 0, 16, 0, 0, 0, + 0, 0, 70, 30, 16, 0, + 0, 0, 0, 0, 70, 142, + 32, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 54, 0, + 0, 5, 114, 32, 16, 0, + 4, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 114, 32, + 16, 0, 5, 0, 0, 0, + 70, 2, 16, 128, 65, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 2, 0, + 0, 0, 20, 0, 0, 0, + 54, 0, 0, 5, 242, 32, + 16, 0, 6, 0, 0, 0, + 70, 30, 16, 0, 2, 0, + 0, 0, 54, 0, 0, 5, + 114, 32, 16, 0, 7, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 172, 0, 0, 0, 5, 0, + 0, 0, 8, 0, 0, 0, + 128, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 15, 0, 0, + 140, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 7, 7, 0, 0, + 147, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 15, 15, 0, 0, + 155, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 15, 15, 0, 0, + 161, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 4, 0, + 0, 0, 3, 3, 0, 0, + 83, 86, 95, 80, 111, 115, + 105, 116, 105, 111, 110, 0, + 78, 79, 82, 77, 65, 76, + 0, 84, 65, 78, 71, 69, + 78, 84, 0, 67, 79, 76, + 79, 82, 0, 84, 69, 88, + 67, 79, 79, 82, 68, 0, + 171, 171, 79, 83, 71, 78, + 228, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, + 200, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 212, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 0, 0, 0, + 218, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 12, 0, 0, + 218, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 4, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 5, 0, + 0, 0, 7, 8, 0, 0, + 218, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 6, 0, + 0, 0, 15, 0, 0, 0, + 218, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 7, 0, + 0, 0, 7, 8, 0, 0, + 83, 86, 95, 80, 79, 83, + 73, 84, 73, 79, 78, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLEffect_mainVc.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLEffect_mainVc.pdb new file mode 100644 index 0000000000000000000000000000000000000000..e12dd36253ba7452beae082ff1420971a330b9ca GIT binary patch literal 30208 zcmeHQe{5UD9Y3c5(llw4LQ7Y=?p6v*8rMH!10^&lPV6>T9oyKh8>qYB*e{8R=(+}U6{rZW^{~3JW?avw8KdMf7V(Ujq zBmD6RUn68?+3_ZlfZo~eb`$X#U7sItyR)-d*PP~F(0uvXg2?S`&rMdQrj#-t%j!zG zkS(UOWsMK;vNB!JfbgD4Pj6@YbDixRVXCNRb$_*NU~aOYl=R1%W(EsWQx#2Vo|&9i za+PAX+&nilSJ1S=LS5bJO|7bN^}Is$FB&{*9f?goqvZ64ZuCs{H}+!D&m(FsTTH2E z)N(QJU-Z{Crj{KqtHe=hR>Y{9QVm8;IEd_YK{?+f_jEc{&X%+(wLI65>*JvdN?g?n zdO- z;4EW-!w&Z7Zyap;6$g9j0AoLSld->l)WR5SST?vidzPT!;vsxFDcp#AqkDQJK5>a+YS2iwBBDZWPjB;WVYZpya`!%40aIDS57z zxIUxsbU~|Ri#(}U@&%Rqg1E|-$t0e#tfy^TX^Gf^wsq0R$p~v_AL&0=HP4z}uH=Pl)S_BOn?_=hSmL@Hdq$x-tlh#EHxVHXPNh)7 zR%a5!94_SxIfaIBI1-A�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 + dcl t2.xyz // pixel<10,11,12> + +#line 99 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLLambert.hlsl" + nrm r0.xyz, t2 // ::worldNormal<0,1,2> + +#line 82 + dp3_sat r0.w, c6, r0 // ::diffuseAmount<0> + mul r1.xyz, r0.w, c2 + mul r1.xyz, r1, t0 // ::diffuse<0,1,2> + +#line 105 + mov r2.xyz, c0 // MaterialVars::MaterialAmbient<0,1,2> + mad r1.xyz, r2, c1, r1 // ::local3<0,1,2> + +#line 82 + dp3_sat r0.w, c7, r0 // ::diffuseAmount<0> + mul r2.xyz, r0.w, c3 + +#line 105 + mad r1.xyz, r2, t0, r1 // ::local3<0,1,2> + +#line 82 + dp3_sat r0.w, c8, r0 // ::diffuseAmount<0> + dp3_sat r1.w, c9, r0 // ::diffuseAmount<0> + mul r0.xyz, r1.w, c5 + mul r2.xyz, r0.w, c4 + +#line 105 + mad r1.xyz, r2, t0, r1 // ::local3<0,1,2> + mad_sat r0.xyz, r0, t0, r1 // ::local3<0,1,2> + +#line 108 + mov r0.w, t0.w + mov oC0, r0 // ::main<0,1,2,3> + +// approximately 19 instruction slots used +ps_4_0 +dcl_constantbuffer CB0[1], immediateIndexed +dcl_constantbuffer CB1[13], immediateIndexed +dcl_input_ps linear v1.xyzw +dcl_input_ps linear v3.xyz +dcl_output o0.xyzw +dcl_temps 3 +dp3 r0.x, v3.xyzx, v3.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, v3.xyzx +dp3_sat r0.w, cb1[9].xyzx, r0.xyzx +mul r1.xyz, r0.wwww, cb1[1].xyzx +mul r1.xyz, r1.xyzx, v1.xyzx +mad r1.xyz, cb0[0].xyzx, cb1[0].xyzx, r1.xyzx +dp3_sat r0.w, cb1[10].xyzx, r0.xyzx +mul r2.xyz, r0.wwww, cb1[2].xyzx +mad r1.xyz, r2.xyzx, v1.xyzx, r1.xyzx +dp3_sat r0.w, cb1[11].xyzx, r0.xyzx +dp3_sat r0.x, cb1[12].xyzx, r0.xyzx +mul r0.xyz, r0.xxxx, cb1[4].xyzx +mul r2.xyz, r0.wwww, cb1[3].xyzx +mad r1.xyz, r2.xyzx, v1.xyzx, r1.xyzx +mad_sat o0.xyz, r0.xyzx, v1.xyzx, r1.xyzx +mov o0.w, v1.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLLambert_main[] = +{ + 68, 88, 66, 67, 14, 156, + 93, 164, 205, 244, 36, 140, + 190, 7, 34, 139, 182, 185, + 126, 255, 1, 0, 0, 0, + 8, 9, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 116, 5, 0, 0, 232, 7, + 0, 0, 212, 8, 0, 0, + 65, 111, 110, 57, 60, 5, + 0, 0, 60, 5, 0, 0, + 0, 2, 255, 255, 244, 4, + 0, 0, 72, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 5, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 9, 0, + 4, 0, 6, 0, 0, 0, + 0, 0, 0, 2, 255, 255, + 254, 255, 240, 0, 68, 66, + 85, 71, 40, 0, 0, 0, + 148, 3, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 120, 0, 0, 0, 19, 0, + 0, 0, 124, 0, 0, 0, + 7, 0, 0, 0, 8, 3, + 0, 0, 252, 1, 0, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 68, 71, 83, 76, 76, + 97, 109, 98, 101, 114, 116, + 46, 104, 108, 115, 108, 0, + 171, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 200, 3, + 0, 0, 0, 0, 255, 255, + 212, 3, 0, 0, 99, 0, + 0, 0, 224, 3, 0, 0, + 82, 0, 0, 0, 236, 3, + 0, 0, 83, 0, 0, 0, + 252, 3, 0, 0, 83, 0, + 0, 0, 12, 4, 0, 0, + 105, 0, 0, 0, 28, 4, + 0, 0, 105, 0, 0, 0, + 40, 4, 0, 0, 82, 0, + 0, 0, 60, 4, 0, 0, + 83, 0, 0, 0, 76, 4, + 0, 0, 105, 0, 0, 0, + 92, 4, 0, 0, 82, 0, + 0, 0, 112, 4, 0, 0, + 82, 0, 0, 0, 128, 4, + 0, 0, 83, 0, 0, 0, + 144, 4, 0, 0, 83, 0, + 0, 0, 160, 4, 0, 0, + 105, 0, 0, 0, 176, 4, + 0, 0, 105, 0, 0, 0, + 196, 4, 0, 0, 108, 0, + 0, 0, 216, 4, 0, 0, + 108, 0, 0, 0, 228, 4, + 0, 0, 77, 97, 116, 101, + 114, 105, 97, 108, 86, 97, + 114, 115, 0, 77, 97, 116, + 101, 114, 105, 97, 108, 65, + 109, 98, 105, 101, 110, 116, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 100, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 100, 105, 102, 102, + 117, 115, 101, 65, 109, 111, + 117, 110, 116, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 8, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 11, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 12, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 108, 111, + 99, 97, 108, 51, 0, 171, + 7, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 10, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 15, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 16, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 109, 97, 105, 110, 0, 102, + 114, 97, 103, 109, 101, 110, + 116, 0, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 0, 0, + 12, 2, 0, 0, 5, 0, + 0, 0, 1, 0, 4, 0, + 1, 0, 1, 0, 28, 2, + 0, 0, 18, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 3, 0, 112, 105, 120, 101, + 108, 0, 112, 111, 115, 0, + 117, 118, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 2, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 0, 119, 111, 114, 108, + 100, 80, 111, 115, 0, 116, + 111, 69, 121, 101, 0, 116, + 97, 110, 103, 101, 110, 116, + 0, 110, 111, 114, 109, 97, + 108, 0, 70, 2, 0, 0, + 12, 2, 0, 0, 80, 1, + 0, 0, 12, 2, 0, 0, + 74, 2, 0, 0, 80, 2, + 0, 0, 96, 2, 0, 0, + 88, 1, 0, 0, 106, 2, + 0, 0, 88, 1, 0, 0, + 115, 2, 0, 0, 88, 1, + 0, 0, 121, 2, 0, 0, + 12, 2, 0, 0, 129, 2, + 0, 0, 88, 1, 0, 0, + 5, 0, 0, 0, 1, 0, + 26, 0, 1, 0, 8, 0, + 136, 2, 0, 0, 0, 0, + 0, 0, 4, 0, 5, 0, + 6, 0, 7, 0, 1, 0, + 0, 0, 10, 0, 11, 0, + 12, 0, 255, 255, 119, 111, + 114, 108, 100, 78, 111, 114, + 109, 97, 108, 0, 2, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 20, 1, + 0, 0, 33, 1, 0, 0, + 52, 1, 0, 0, 1, 0, + 0, 0, 68, 1, 0, 0, + 0, 0, 0, 0, 80, 1, + 0, 0, 88, 1, 0, 0, + 1, 0, 0, 0, 104, 1, + 0, 0, 0, 0, 0, 0, + 116, 1, 0, 0, 132, 1, + 0, 0, 4, 0, 0, 0, + 148, 1, 0, 0, 0, 0, + 0, 0, 196, 1, 0, 0, + 88, 1, 0, 0, 4, 0, + 0, 0, 204, 1, 0, 0, + 0, 0, 0, 0, 252, 1, + 0, 0, 36, 2, 0, 0, + 1, 0, 0, 0, 52, 2, + 0, 0, 252, 1, 0, 0, + 64, 2, 0, 0, 200, 2, + 0, 0, 2, 0, 0, 0, + 216, 2, 0, 0, 0, 0, + 0, 0, 240, 2, 0, 0, + 88, 1, 0, 0, 1, 0, + 0, 0, 252, 2, 0, 0, + 77, 105, 99, 114, 111, 115, + 111, 102, 116, 32, 40, 82, + 41, 32, 72, 76, 83, 76, + 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, + 105, 108, 101, 114, 32, 49, + 48, 46, 49, 0, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 15, 176, 31, 0, + 0, 2, 0, 0, 0, 128, + 2, 0, 7, 176, 36, 0, + 0, 2, 0, 0, 7, 128, + 2, 0, 228, 176, 8, 0, + 0, 3, 0, 0, 24, 128, + 6, 0, 228, 160, 0, 0, + 228, 128, 5, 0, 0, 3, + 1, 0, 7, 128, 0, 0, + 255, 128, 2, 0, 228, 160, + 5, 0, 0, 3, 1, 0, + 7, 128, 1, 0, 228, 128, + 0, 0, 228, 176, 1, 0, + 0, 2, 2, 0, 7, 128, + 0, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 7, 128, + 2, 0, 228, 128, 1, 0, + 228, 160, 1, 0, 228, 128, + 8, 0, 0, 3, 0, 0, + 24, 128, 7, 0, 228, 160, + 0, 0, 228, 128, 5, 0, + 0, 3, 2, 0, 7, 128, + 0, 0, 255, 128, 3, 0, + 228, 160, 4, 0, 0, 4, + 1, 0, 7, 128, 2, 0, + 228, 128, 0, 0, 228, 176, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 24, 128, + 8, 0, 228, 160, 0, 0, + 228, 128, 8, 0, 0, 3, + 1, 0, 24, 128, 9, 0, + 228, 160, 0, 0, 228, 128, + 5, 0, 0, 3, 0, 0, + 7, 128, 1, 0, 255, 128, + 5, 0, 228, 160, 5, 0, + 0, 3, 2, 0, 7, 128, + 0, 0, 255, 128, 4, 0, + 228, 160, 4, 0, 0, 4, + 1, 0, 7, 128, 2, 0, + 228, 128, 0, 0, 228, 176, + 1, 0, 228, 128, 4, 0, + 0, 4, 0, 0, 23, 128, + 0, 0, 228, 128, 0, 0, + 228, 176, 1, 0, 228, 128, + 1, 0, 0, 2, 0, 0, + 8, 128, 0, 0, 255, 176, + 1, 0, 0, 2, 0, 8, + 15, 128, 0, 0, 228, 128, + 255, 255, 0, 0, 83, 72, + 68, 82, 108, 2, 0, 0, + 64, 0, 0, 0, 155, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 1, 0, 0, 0, + 13, 0, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 1, 0, 0, 0, 98, 16, + 0, 3, 114, 16, 16, 0, + 3, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 104, 0, + 0, 2, 3, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 3, 0, + 0, 0, 70, 18, 16, 0, + 3, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 3, 0, 0, 0, 16, 32, + 0, 8, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 1, 0, 0, 0, + 9, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 1, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 1, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 32, 0, 8, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 10, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 2, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 2, 0, 0, 0, + 50, 0, 0, 9, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 32, 0, 8, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 11, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 32, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 12, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 4, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 2, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 50, 0, 0, 9, + 114, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 50, 32, 0, 9, + 114, 32, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 54, 0, 0, 5, + 130, 32, 16, 0, 0, 0, + 0, 0, 58, 16, 16, 0, + 1, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 228, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, + 200, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 212, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 15, 0, 0, + 218, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 0, 0, 0, + 218, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 7, 7, 0, 0, + 218, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 4, 0, + 0, 0, 7, 0, 0, 0, + 218, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 5, 0, + 0, 0, 7, 0, 0, 0, + 218, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 6, 0, + 0, 0, 15, 0, 0, 0, + 218, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 7, 0, + 0, 0, 7, 0, 0, 0, + 83, 86, 95, 80, 79, 83, + 73, 84, 73, 79, 78, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLLambert_main.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLLambert_main.pdb new file mode 100644 index 0000000000000000000000000000000000000000..7f0319317c19cfcaca1fde3f50240640ed2e200b GIT binary patch literal 24064 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 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTk.inc b/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTk.inc new file mode 100644 index 0000000..03212d6 --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTk.inc @@ -0,0 +1,527 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float +// COLOR 0 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float +// TEXCOORD 1 xyz 3 NONE float xyz +// TEXCOORD 2 xyz 4 NONE float +// TEXCOORD 3 xyz 5 NONE float +// TEXCOORD 4 xyzw 6 NONE float +// TEXCOORD 5 xyz 7 NONE float +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c1 cb1 0 5 ( FLT, FLT, FLT, FLT) +// c6 cb1 9 4 ( FLT, FLT, FLT, FLT) +// +// +// Level9 shader bytecode: +// + ps_2_0 + def c10, -1, -0, 0, 0 + dcl t0 // pixel<4,5,6,7> + dcl t2.xyz // pixel<10,11,12> + +#line 130 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLLambert.hlsl" + mul r0.w, t0.w, t0.w + cmp r0, -r0.w, c10.x, c10.y + texkill r0 + +#line 118 + nrm r0.xyz, t2 // ::worldNormal<0,1,2> + +#line 82 + dp3_sat r0.w, c6, r0 // ::diffuseAmount<0> + mul r1.xyz, r0.w, c2 + mul r1.xyz, r1, t0 // ::diffuse<0,1,2> + +#line 124 + mov r2.xyz, c0 // MaterialVars::MaterialAmbient<0,1,2> + mad r1.xyz, r2, c1, r1 // ::local3<0,1,2> + +#line 82 + dp3_sat r0.w, c7, r0 // ::diffuseAmount<0> + mul r2.xyz, r0.w, c3 + +#line 124 + mad r1.xyz, r2, t0, r1 // ::local3<0,1,2> + +#line 82 + dp3_sat r0.w, c8, r0 // ::diffuseAmount<0> + mul r2.xyz, r0.w, c4 + +#line 124 + mad r1.xyz, r2, t0, r1 // ::local3<0,1,2> + +#line 82 + dp3_sat r1.w, c9, r0 // ::diffuseAmount<0> + mul r0.xyz, r1.w, c5 + +#line 124 + mad_sat r0.xyz, r0, t0, r1 // ::local3<0,1,2> + +#line 132 + mov r0.w, t0.w + mov oC0, r0 // ::mainTk<0,1,2,3> + +// approximately 22 instruction slots used +ps_4_0 +dcl_constantbuffer CB0[1], immediateIndexed +dcl_constantbuffer CB1[13], immediateIndexed +dcl_input_ps linear v1.xyzw +dcl_input_ps linear v3.xyz +dcl_output o0.xyzw +dcl_temps 3 +eq r0.x, v1.w, l(0.000000) +discard_nz r0.x +dp3 r0.x, v3.xyzx, v3.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, v3.xyzx +dp3_sat r0.w, cb1[9].xyzx, r0.xyzx +mul r1.xyz, r0.wwww, cb1[1].xyzx +mul r1.xyz, r1.xyzx, v1.xyzx +mad r1.xyz, cb0[0].xyzx, cb1[0].xyzx, r1.xyzx +dp3_sat r0.w, cb1[10].xyzx, r0.xyzx +mul r2.xyz, r0.wwww, cb1[2].xyzx +mad r1.xyz, r2.xyzx, v1.xyzx, r1.xyzx +dp3_sat r0.w, cb1[11].xyzx, r0.xyzx +mul r2.xyz, r0.wwww, cb1[3].xyzx +mad r1.xyz, r2.xyzx, v1.xyzx, r1.xyzx +dp3_sat r0.x, cb1[12].xyzx, r0.xyzx +mul r0.xyz, r0.xxxx, cb1[4].xyzx +mad_sat o0.xyz, r0.xyzx, v1.xyzx, r1.xyzx +mov o0.w, v1.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLLambert_mainTk[] = +{ + 68, 88, 66, 67, 88, 244, + 65, 30, 50, 151, 103, 242, + 190, 198, 147, 224, 211, 93, + 248, 217, 1, 0, 0, 0, + 148, 9, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 216, 5, 0, 0, 116, 8, + 0, 0, 96, 9, 0, 0, + 65, 111, 110, 57, 160, 5, + 0, 0, 160, 5, 0, 0, + 0, 2, 255, 255, 88, 5, + 0, 0, 72, 0, 0, 0, + 3, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 72, 0, + 0, 0, 36, 0, 0, 0, + 72, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 5, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 9, 0, + 4, 0, 6, 0, 0, 0, + 0, 0, 0, 2, 255, 255, + 254, 255, 248, 0, 68, 66, + 85, 71, 40, 0, 0, 0, + 180, 3, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 120, 0, 0, 0, 23, 0, + 0, 0, 124, 0, 0, 0, + 7, 0, 0, 0, 40, 3, + 0, 0, 28, 2, 0, 0, + 67, 58, 92, 85, 115, 101, + 114, 115, 92, 67, 104, 117, + 99, 107, 87, 92, 68, 101, + 115, 107, 116, 111, 112, 92, + 68, 51, 68, 49, 49, 32, + 80, 114, 111, 106, 101, 99, + 116, 115, 92, 68, 105, 114, + 101, 99, 116, 88, 84, 75, + 92, 83, 114, 99, 92, 83, + 104, 97, 100, 101, 114, 115, + 92, 68, 71, 83, 76, 76, + 97, 109, 98, 101, 114, 116, + 46, 104, 108, 115, 108, 0, + 171, 171, 40, 0, 0, 0, + 0, 0, 255, 255, 232, 3, + 0, 0, 0, 0, 255, 255, + 0, 4, 0, 0, 0, 0, + 255, 255, 12, 4, 0, 0, + 130, 0, 0, 0, 24, 4, + 0, 0, 130, 0, 0, 0, + 40, 4, 0, 0, 130, 0, + 0, 0, 60, 4, 0, 0, + 118, 0, 0, 0, 68, 4, + 0, 0, 82, 0, 0, 0, + 80, 4, 0, 0, 83, 0, + 0, 0, 96, 4, 0, 0, + 83, 0, 0, 0, 112, 4, + 0, 0, 124, 0, 0, 0, + 128, 4, 0, 0, 124, 0, + 0, 0, 140, 4, 0, 0, + 82, 0, 0, 0, 160, 4, + 0, 0, 83, 0, 0, 0, + 176, 4, 0, 0, 124, 0, + 0, 0, 192, 4, 0, 0, + 82, 0, 0, 0, 212, 4, + 0, 0, 83, 0, 0, 0, + 228, 4, 0, 0, 124, 0, + 0, 0, 244, 4, 0, 0, + 82, 0, 0, 0, 8, 5, + 0, 0, 83, 0, 0, 0, + 24, 5, 0, 0, 124, 0, + 0, 0, 40, 5, 0, 0, + 132, 0, 0, 0, 60, 5, + 0, 0, 132, 0, 0, 0, + 72, 5, 0, 0, 77, 97, + 116, 101, 114, 105, 97, 108, + 86, 97, 114, 115, 0, 77, + 97, 116, 101, 114, 105, 97, + 108, 65, 109, 98, 105, 101, + 110, 116, 0, 171, 171, 171, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 100, 105, + 102, 102, 117, 115, 101, 0, + 1, 0, 3, 0, 1, 0, + 3, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 255, 255, 100, 105, + 102, 102, 117, 115, 101, 65, + 109, 111, 117, 110, 116, 0, + 171, 171, 0, 0, 3, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 0, 0, + 12, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 0, 0, + 15, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 0, 0, + 18, 0, 0, 0, 255, 255, + 255, 255, 255, 255, 0, 0, + 108, 111, 99, 97, 108, 51, + 0, 171, 11, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 14, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 17, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 20, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 109, 97, 105, 110, + 84, 107, 0, 102, 114, 97, + 103, 109, 101, 110, 116, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 35, 2, + 0, 0, 44, 2, 0, 0, + 5, 0, 0, 0, 1, 0, + 4, 0, 1, 0, 1, 0, + 60, 2, 0, 0, 22, 0, + 0, 0, 0, 0, 1, 0, + 2, 0, 3, 0, 112, 105, + 120, 101, 108, 0, 112, 111, + 115, 0, 117, 118, 0, 171, + 171, 171, 1, 0, 3, 0, + 1, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 0, 119, 111, + 114, 108, 100, 80, 111, 115, + 0, 116, 111, 69, 121, 101, + 0, 116, 97, 110, 103, 101, + 110, 116, 0, 110, 111, 114, + 109, 97, 108, 0, 102, 2, + 0, 0, 44, 2, 0, 0, + 112, 1, 0, 0, 44, 2, + 0, 0, 106, 2, 0, 0, + 112, 2, 0, 0, 128, 2, + 0, 0, 120, 1, 0, 0, + 138, 2, 0, 0, 120, 1, + 0, 0, 147, 2, 0, 0, + 120, 1, 0, 0, 153, 2, + 0, 0, 44, 2, 0, 0, + 161, 2, 0, 0, 120, 1, + 0, 0, 5, 0, 0, 0, + 1, 0, 26, 0, 1, 0, + 8, 0, 168, 2, 0, 0, + 1, 0, 0, 0, 4, 0, + 5, 0, 6, 0, 7, 0, + 2, 0, 0, 0, 10, 0, + 11, 0, 12, 0, 255, 255, + 119, 111, 114, 108, 100, 78, + 111, 114, 109, 97, 108, 0, + 6, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 52, 1, 0, 0, 65, 1, + 0, 0, 84, 1, 0, 0, + 1, 0, 0, 0, 100, 1, + 0, 0, 0, 0, 0, 0, + 112, 1, 0, 0, 120, 1, + 0, 0, 1, 0, 0, 0, + 136, 1, 0, 0, 0, 0, + 0, 0, 148, 1, 0, 0, + 164, 1, 0, 0, 4, 0, + 0, 0, 180, 1, 0, 0, + 0, 0, 0, 0, 228, 1, + 0, 0, 120, 1, 0, 0, + 4, 0, 0, 0, 236, 1, + 0, 0, 0, 0, 0, 0, + 28, 2, 0, 0, 68, 2, + 0, 0, 1, 0, 0, 0, + 84, 2, 0, 0, 28, 2, + 0, 0, 96, 2, 0, 0, + 232, 2, 0, 0, 2, 0, + 0, 0, 248, 2, 0, 0, + 0, 0, 0, 0, 16, 3, + 0, 0, 120, 1, 0, 0, + 1, 0, 0, 0, 28, 3, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 81, 0, 0, 5, 10, 0, + 15, 160, 0, 0, 128, 191, + 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 0, + 31, 0, 0, 2, 0, 0, + 0, 128, 0, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 2, 0, 7, 176, + 5, 0, 0, 3, 0, 0, + 8, 128, 0, 0, 255, 176, + 0, 0, 255, 176, 88, 0, + 0, 4, 0, 0, 15, 128, + 0, 0, 255, 129, 10, 0, + 0, 160, 10, 0, 85, 160, + 65, 0, 0, 1, 0, 0, + 15, 128, 36, 0, 0, 2, + 0, 0, 7, 128, 2, 0, + 228, 176, 8, 0, 0, 3, + 0, 0, 24, 128, 6, 0, + 228, 160, 0, 0, 228, 128, + 5, 0, 0, 3, 1, 0, + 7, 128, 0, 0, 255, 128, + 2, 0, 228, 160, 5, 0, + 0, 3, 1, 0, 7, 128, + 1, 0, 228, 128, 0, 0, + 228, 176, 1, 0, 0, 2, + 2, 0, 7, 128, 0, 0, + 228, 160, 4, 0, 0, 4, + 1, 0, 7, 128, 2, 0, + 228, 128, 1, 0, 228, 160, + 1, 0, 228, 128, 8, 0, + 0, 3, 0, 0, 24, 128, + 7, 0, 228, 160, 0, 0, + 228, 128, 5, 0, 0, 3, + 2, 0, 7, 128, 0, 0, + 255, 128, 3, 0, 228, 160, + 4, 0, 0, 4, 1, 0, + 7, 128, 2, 0, 228, 128, + 0, 0, 228, 176, 1, 0, + 228, 128, 8, 0, 0, 3, + 0, 0, 24, 128, 8, 0, + 228, 160, 0, 0, 228, 128, + 5, 0, 0, 3, 2, 0, + 7, 128, 0, 0, 255, 128, + 4, 0, 228, 160, 4, 0, + 0, 4, 1, 0, 7, 128, + 2, 0, 228, 128, 0, 0, + 228, 176, 1, 0, 228, 128, + 8, 0, 0, 3, 1, 0, + 24, 128, 9, 0, 228, 160, + 0, 0, 228, 128, 5, 0, + 0, 3, 0, 0, 7, 128, + 1, 0, 255, 128, 5, 0, + 228, 160, 4, 0, 0, 4, + 0, 0, 23, 128, 0, 0, + 228, 128, 0, 0, 228, 176, + 1, 0, 228, 128, 1, 0, + 0, 2, 0, 0, 8, 128, + 0, 0, 255, 176, 1, 0, + 0, 2, 0, 8, 15, 128, + 0, 0, 228, 128, 255, 255, + 0, 0, 83, 72, 68, 82, + 148, 2, 0, 0, 64, 0, + 0, 0, 165, 0, 0, 0, + 89, 0, 0, 4, 70, 142, + 32, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 1, 0, 0, 0, 13, 0, + 0, 0, 98, 16, 0, 3, + 242, 16, 16, 0, 1, 0, + 0, 0, 98, 16, 0, 3, + 114, 16, 16, 0, 3, 0, + 0, 0, 101, 0, 0, 3, + 242, 32, 16, 0, 0, 0, + 0, 0, 104, 0, 0, 2, + 3, 0, 0, 0, 24, 0, + 0, 7, 18, 0, 16, 0, + 0, 0, 0, 0, 58, 16, + 16, 0, 1, 0, 0, 0, + 1, 64, 0, 0, 0, 0, + 0, 0, 13, 0, 4, 3, + 10, 0, 16, 0, 0, 0, + 0, 0, 16, 0, 0, 7, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 3, 0, 0, 0, 70, 18, + 16, 0, 3, 0, 0, 0, + 68, 0, 0, 5, 18, 0, + 16, 0, 0, 0, 0, 0, + 10, 0, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 3, 0, 0, 0, + 16, 32, 0, 8, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 9, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 1, 0, + 0, 0, 246, 15, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 56, 0, + 0, 7, 114, 0, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 50, 0, 0, 11, + 114, 0, 16, 0, 1, 0, + 0, 0, 70, 130, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 16, 32, + 0, 8, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 1, 0, 0, 0, + 10, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 2, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 2, 0, + 0, 0, 50, 0, 0, 9, + 114, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 32, 0, 8, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 11, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 2, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 50, 0, 0, 9, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 32, 0, 8, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 12, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 8, + 114, 0, 16, 0, 0, 0, + 0, 0, 6, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 1, 0, 0, 0, + 4, 0, 0, 0, 50, 32, + 0, 9, 114, 32, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 54, 0, + 0, 5, 130, 32, 16, 0, + 0, 0, 0, 0, 58, 16, + 16, 0, 1, 0, 0, 0, + 62, 0, 0, 1, 73, 83, + 71, 78, 228, 0, 0, 0, + 8, 0, 0, 0, 8, 0, + 0, 0, 200, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 212, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 15, 15, + 0, 0, 218, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 2, 0, 0, 0, 3, 0, + 0, 0, 218, 0, 0, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 7, 7, + 0, 0, 218, 0, 0, 0, + 2, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 4, 0, 0, 0, 7, 0, + 0, 0, 218, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 5, 0, 0, 0, 7, 0, + 0, 0, 218, 0, 0, 0, + 4, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 6, 0, 0, 0, 15, 0, + 0, 0, 218, 0, 0, 0, + 5, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 7, 0, 0, 0, 7, 0, + 0, 0, 83, 86, 95, 80, + 79, 83, 73, 84, 73, 79, + 78, 0, 67, 79, 76, 79, + 82, 0, 84, 69, 88, 67, + 79, 79, 82, 68, 0, 171, + 79, 83, 71, 78, 44, 0, + 0, 0, 1, 0, 0, 0, + 8, 0, 0, 0, 32, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 15, 0, 0, 0, 83, 86, + 95, 84, 97, 114, 103, 101, + 116, 0, 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTk.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTk.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d07e2404d669a9bd56c9122d81d9a1faa4313d8d GIT binary patch literal 24064 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 YE`fuePU2Je67VJ9OTd@FCX~Q`04|w%RR910 literal 0 HcmV?d00001 diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTx.inc b/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTx.inc new file mode 100644 index 0000000..e4f96ab --- /dev/null +++ b/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTx.inc @@ -0,0 +1,560 @@ +#if 0 +// +// Generated by Microsoft (R) D3D Shader Disassembler +// +// +// Input signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_POSITION 0 xyzw 0 POS float +// COLOR 0 xyzw 1 NONE float xyzw +// TEXCOORD 0 xy 2 NONE float xy +// TEXCOORD 1 xyz 3 NONE float xyz +// TEXCOORD 2 xyz 4 NONE float +// TEXCOORD 3 xyz 5 NONE float +// TEXCOORD 4 xyzw 6 NONE float +// TEXCOORD 5 xyz 7 NONE float +// +// +// Output signature: +// +// Name Index Mask Register SysValue Format Used +// -------------------- ----- ------ -------- -------- ------- ------ +// SV_Target 0 xyzw 0 TARGET float xyzw +// +// +// Constant buffer to DX9 shader constant mappings: +// +// Target Reg Buffer Start Reg # of Regs Data Conversion +// ---------- ------- --------- --------- ---------------------- +// c0 cb0 0 1 ( FLT, FLT, FLT, FLT) +// c1 cb1 0 5 ( FLT, FLT, FLT, FLT) +// c6 cb1 9 4 ( FLT, FLT, FLT, FLT) +// +// +// Sampler/Resource to DX9 shader sampler mappings: +// +// Target Sampler Source Sampler Source Resource +// -------------- --------------- ---------------- +// s0 s0 t0 +// +// +// Level9 shader bytecode: +// + ps_2_0 + dcl t0 // pixel<4,5,6,7> + dcl t1.xy // pixel<8,9> + dcl t2.xyz // pixel<10,11,12> + dcl_2d s0 + +#line 149 "C:\Users\ChuckW\Desktop\D3D11 Projects\DirectXTK\Src\Shaders\DGSLLambert.hlsl" + texld r0, t1, s0 + +#line 139 + nrm r1.xyz, t2 // ::worldNormal<0,1,2> + +#line 82 + dp3_sat r1.w, c6, r1 // ::diffuseAmount<0> + mul r2.xyz, r1.w, c2 + mul r2.xyz, r2, t0 // ::diffuse<0,1,2> + +#line 145 + mov r3.xyz, c0 // MaterialVars::MaterialAmbient<0,1,2> + mad r2.xyz, r3, c1, r2 // ::local3<0,1,2> + +#line 82 + dp3_sat r1.w, c7, r1 // ::diffuseAmount<0> + mul r3.xyz, r1.w, c3 + +#line 145 + mad r2.xyz, r3, t0, r2 // ::local3<0,1,2> + +#line 82 + dp3_sat r1.w, c8, r1 // ::diffuseAmount<0> + dp3_sat r2.w, c9, r1 // ::diffuseAmount<0> + mul r1.xyz, r2.w, c5 + mul r3.xyz, r1.w, c4 + +#line 145 + mad r2.xyz, r3, t0, r2 // ::local3<0,1,2> + mad_sat r1.xyz, r1, t0, r2 // ::local3<0,1,2> + +#line 149 + mul r1.xyz, r0, r1 // ::local4<0,1,2> + mul r1.w, r0.w, t0.w // ::local5<0> + mov oC0, r1 // ::mainTx<0,1,2,3> + +// approximately 21 instruction slots used (1 texture, 20 arithmetic) +ps_4_0 +dcl_constantbuffer CB0[1], immediateIndexed +dcl_constantbuffer CB1[13], immediateIndexed +dcl_sampler s0, mode_default +dcl_resource_texture2d (float,float,float,float) t0 +dcl_input_ps linear v1.xyzw +dcl_input_ps linear v2.xy +dcl_input_ps linear v3.xyz +dcl_output o0.xyzw +dcl_temps 3 +dp3 r0.x, v3.xyzx, v3.xyzx +rsq r0.x, r0.x +mul r0.xyz, r0.xxxx, v3.xyzx +dp3_sat r0.w, cb1[9].xyzx, r0.xyzx +mul r1.xyz, r0.wwww, cb1[1].xyzx +mul r1.xyz, r1.xyzx, v1.xyzx +mad r1.xyz, cb0[0].xyzx, cb1[0].xyzx, r1.xyzx +dp3_sat r0.w, cb1[10].xyzx, r0.xyzx +mul r2.xyz, r0.wwww, cb1[2].xyzx +mad r1.xyz, r2.xyzx, v1.xyzx, r1.xyzx +dp3_sat r0.w, cb1[11].xyzx, r0.xyzx +dp3_sat r0.x, cb1[12].xyzx, r0.xyzx +mul r0.xyz, r0.xxxx, cb1[4].xyzx +mul r2.xyz, r0.wwww, cb1[3].xyzx +mad r1.xyz, r2.xyzx, v1.xyzx, r1.xyzx +mad_sat r0.xyz, r0.xyzx, v1.xyzx, r1.xyzx +sample r1.xyzw, v2.xyxx, t0.xyzw, s0 +mul o0.xyz, r0.xyzx, r1.xyzx +mul o0.w, r1.w, v1.w +ret +// Approximately 0 instruction slots used +#endif + +const BYTE DGSLLambert_mainTx[] = +{ + 68, 88, 66, 67, 66, 176, + 224, 229, 252, 12, 127, 202, + 193, 199, 126, 89, 230, 170, + 222, 144, 1, 0, 0, 0, + 52, 10, 0, 0, 4, 0, + 0, 0, 48, 0, 0, 0, + 48, 6, 0, 0, 20, 9, + 0, 0, 0, 10, 0, 0, + 65, 111, 110, 57, 248, 5, + 0, 0, 248, 5, 0, 0, + 0, 2, 255, 255, 172, 5, + 0, 0, 76, 0, 0, 0, + 3, 0, 40, 0, 0, 0, + 76, 0, 0, 0, 76, 0, + 1, 0, 36, 0, 0, 0, + 76, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 5, 0, + 1, 0, 0, 0, 0, 0, + 1, 0, 9, 0, 4, 0, + 6, 0, 0, 0, 0, 0, + 0, 2, 255, 255, 254, 255, + 15, 1, 68, 66, 85, 71, + 40, 0, 0, 0, 16, 4, + 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 120, 0, + 0, 0, 23, 0, 0, 0, + 124, 0, 0, 0, 9, 0, + 0, 0, 92, 3, 0, 0, + 68, 2, 0, 0, 67, 58, + 92, 85, 115, 101, 114, 115, + 92, 67, 104, 117, 99, 107, + 87, 92, 68, 101, 115, 107, + 116, 111, 112, 92, 68, 51, + 68, 49, 49, 32, 80, 114, + 111, 106, 101, 99, 116, 115, + 92, 68, 105, 114, 101, 99, + 116, 88, 84, 75, 92, 83, + 114, 99, 92, 83, 104, 97, + 100, 101, 114, 115, 92, 68, + 71, 83, 76, 76, 97, 109, + 98, 101, 114, 116, 46, 104, + 108, 115, 108, 0, 171, 171, + 40, 0, 0, 0, 0, 0, + 255, 255, 68, 4, 0, 0, + 0, 0, 255, 255, 80, 4, + 0, 0, 0, 0, 255, 255, + 92, 4, 0, 0, 0, 0, + 255, 255, 104, 4, 0, 0, + 149, 0, 0, 0, 116, 4, + 0, 0, 139, 0, 0, 0, + 132, 4, 0, 0, 82, 0, + 0, 0, 144, 4, 0, 0, + 83, 0, 0, 0, 160, 4, + 0, 0, 83, 0, 0, 0, + 176, 4, 0, 0, 145, 0, + 0, 0, 192, 4, 0, 0, + 145, 0, 0, 0, 204, 4, + 0, 0, 82, 0, 0, 0, + 224, 4, 0, 0, 83, 0, + 0, 0, 240, 4, 0, 0, + 145, 0, 0, 0, 0, 5, + 0, 0, 82, 0, 0, 0, + 20, 5, 0, 0, 82, 0, + 0, 0, 36, 5, 0, 0, + 83, 0, 0, 0, 52, 5, + 0, 0, 83, 0, 0, 0, + 68, 5, 0, 0, 145, 0, + 0, 0, 84, 5, 0, 0, + 145, 0, 0, 0, 104, 5, + 0, 0, 149, 0, 0, 0, + 124, 5, 0, 0, 150, 0, + 0, 0, 140, 5, 0, 0, + 149, 0, 0, 0, 156, 5, + 0, 0, 77, 97, 116, 101, + 114, 105, 97, 108, 86, 97, + 114, 115, 0, 77, 97, 116, + 101, 114, 105, 97, 108, 65, + 109, 98, 105, 101, 110, 116, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 4, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 100, 105, 102, 102, + 117, 115, 101, 0, 1, 0, + 3, 0, 1, 0, 3, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 100, 105, 102, 102, + 117, 115, 101, 65, 109, 111, + 117, 110, 116, 0, 171, 171, + 0, 0, 3, 0, 1, 0, + 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 11, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 14, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 15, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 108, 111, + 99, 97, 108, 51, 0, 171, + 10, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 13, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 18, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 19, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 255, 255, + 108, 111, 99, 97, 108, 52, + 0, 171, 20, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 108, 111, 99, 97, + 108, 53, 0, 171, 21, 0, + 0, 0, 255, 255, 255, 255, + 255, 255, 0, 0, 109, 97, + 105, 110, 84, 120, 0, 102, + 114, 97, 103, 109, 101, 110, + 116, 0, 1, 0, 3, 0, + 1, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 75, 2, 0, 0, 84, 2, + 0, 0, 5, 0, 0, 0, + 1, 0, 4, 0, 1, 0, + 1, 0, 100, 2, 0, 0, + 22, 0, 0, 0, 0, 0, + 1, 0, 2, 0, 3, 0, + 112, 105, 120, 101, 108, 0, + 112, 111, 115, 0, 117, 118, + 0, 171, 171, 171, 1, 0, + 3, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 119, 111, 114, 108, + 100, 78, 111, 114, 109, 0, + 119, 111, 114, 108, 100, 80, + 111, 115, 0, 116, 111, 69, + 121, 101, 0, 116, 97, 110, + 103, 101, 110, 116, 0, 110, + 111, 114, 109, 97, 108, 0, + 142, 2, 0, 0, 84, 2, + 0, 0, 112, 1, 0, 0, + 84, 2, 0, 0, 146, 2, + 0, 0, 152, 2, 0, 0, + 168, 2, 0, 0, 120, 1, + 0, 0, 178, 2, 0, 0, + 120, 1, 0, 0, 187, 2, + 0, 0, 120, 1, 0, 0, + 193, 2, 0, 0, 84, 2, + 0, 0, 201, 2, 0, 0, + 120, 1, 0, 0, 5, 0, + 0, 0, 1, 0, 26, 0, + 1, 0, 8, 0, 208, 2, + 0, 0, 0, 0, 0, 0, + 4, 0, 5, 0, 6, 0, + 7, 0, 1, 0, 0, 0, + 8, 0, 9, 0, 255, 255, + 255, 255, 2, 0, 0, 0, + 10, 0, 11, 0, 12, 0, + 255, 255, 119, 111, 114, 108, + 100, 78, 111, 114, 109, 97, + 108, 0, 5, 0, 0, 0, + 0, 0, 1, 0, 2, 0, + 255, 255, 52, 1, 0, 0, + 65, 1, 0, 0, 84, 1, + 0, 0, 1, 0, 0, 0, + 100, 1, 0, 0, 0, 0, + 0, 0, 112, 1, 0, 0, + 120, 1, 0, 0, 1, 0, + 0, 0, 136, 1, 0, 0, + 0, 0, 0, 0, 148, 1, + 0, 0, 164, 1, 0, 0, + 4, 0, 0, 0, 180, 1, + 0, 0, 0, 0, 0, 0, + 228, 1, 0, 0, 120, 1, + 0, 0, 4, 0, 0, 0, + 236, 1, 0, 0, 0, 0, + 0, 0, 28, 2, 0, 0, + 120, 1, 0, 0, 1, 0, + 0, 0, 36, 2, 0, 0, + 0, 0, 0, 0, 48, 2, + 0, 0, 164, 1, 0, 0, + 1, 0, 0, 0, 56, 2, + 0, 0, 0, 0, 0, 0, + 68, 2, 0, 0, 108, 2, + 0, 0, 1, 0, 0, 0, + 124, 2, 0, 0, 68, 2, + 0, 0, 136, 2, 0, 0, + 16, 3, 0, 0, 3, 0, + 0, 0, 32, 3, 0, 0, + 0, 0, 0, 0, 68, 3, + 0, 0, 120, 1, 0, 0, + 1, 0, 0, 0, 80, 3, + 0, 0, 77, 105, 99, 114, + 111, 115, 111, 102, 116, 32, + 40, 82, 41, 32, 72, 76, + 83, 76, 32, 83, 104, 97, + 100, 101, 114, 32, 67, 111, + 109, 112, 105, 108, 101, 114, + 32, 49, 48, 46, 49, 0, + 31, 0, 0, 2, 0, 0, + 0, 128, 0, 0, 15, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 1, 0, 3, 176, + 31, 0, 0, 2, 0, 0, + 0, 128, 2, 0, 7, 176, + 31, 0, 0, 2, 0, 0, + 0, 144, 0, 8, 15, 160, + 66, 0, 0, 3, 0, 0, + 15, 128, 1, 0, 228, 176, + 0, 8, 228, 160, 36, 0, + 0, 2, 1, 0, 7, 128, + 2, 0, 228, 176, 8, 0, + 0, 3, 1, 0, 24, 128, + 6, 0, 228, 160, 1, 0, + 228, 128, 5, 0, 0, 3, + 2, 0, 7, 128, 1, 0, + 255, 128, 2, 0, 228, 160, + 5, 0, 0, 3, 2, 0, + 7, 128, 2, 0, 228, 128, + 0, 0, 228, 176, 1, 0, + 0, 2, 3, 0, 7, 128, + 0, 0, 228, 160, 4, 0, + 0, 4, 2, 0, 7, 128, + 3, 0, 228, 128, 1, 0, + 228, 160, 2, 0, 228, 128, + 8, 0, 0, 3, 1, 0, + 24, 128, 7, 0, 228, 160, + 1, 0, 228, 128, 5, 0, + 0, 3, 3, 0, 7, 128, + 1, 0, 255, 128, 3, 0, + 228, 160, 4, 0, 0, 4, + 2, 0, 7, 128, 3, 0, + 228, 128, 0, 0, 228, 176, + 2, 0, 228, 128, 8, 0, + 0, 3, 1, 0, 24, 128, + 8, 0, 228, 160, 1, 0, + 228, 128, 8, 0, 0, 3, + 2, 0, 24, 128, 9, 0, + 228, 160, 1, 0, 228, 128, + 5, 0, 0, 3, 1, 0, + 7, 128, 2, 0, 255, 128, + 5, 0, 228, 160, 5, 0, + 0, 3, 3, 0, 7, 128, + 1, 0, 255, 128, 4, 0, + 228, 160, 4, 0, 0, 4, + 2, 0, 7, 128, 3, 0, + 228, 128, 0, 0, 228, 176, + 2, 0, 228, 128, 4, 0, + 0, 4, 1, 0, 23, 128, + 1, 0, 228, 128, 0, 0, + 228, 176, 2, 0, 228, 128, + 5, 0, 0, 3, 1, 0, + 7, 128, 0, 0, 228, 128, + 1, 0, 228, 128, 5, 0, + 0, 3, 1, 0, 8, 128, + 0, 0, 255, 128, 0, 0, + 255, 176, 1, 0, 0, 2, + 0, 8, 15, 128, 1, 0, + 228, 128, 255, 255, 0, 0, + 83, 72, 68, 82, 220, 2, + 0, 0, 64, 0, 0, 0, + 183, 0, 0, 0, 89, 0, + 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 1, 0, + 0, 0, 89, 0, 0, 4, + 70, 142, 32, 0, 1, 0, + 0, 0, 13, 0, 0, 0, + 90, 0, 0, 3, 0, 96, + 16, 0, 0, 0, 0, 0, + 88, 24, 0, 4, 0, 112, + 16, 0, 0, 0, 0, 0, + 85, 85, 0, 0, 98, 16, + 0, 3, 242, 16, 16, 0, + 1, 0, 0, 0, 98, 16, + 0, 3, 50, 16, 16, 0, + 2, 0, 0, 0, 98, 16, + 0, 3, 114, 16, 16, 0, + 3, 0, 0, 0, 101, 0, + 0, 3, 242, 32, 16, 0, + 0, 0, 0, 0, 104, 0, + 0, 2, 3, 0, 0, 0, + 16, 0, 0, 7, 18, 0, + 16, 0, 0, 0, 0, 0, + 70, 18, 16, 0, 3, 0, + 0, 0, 70, 18, 16, 0, + 3, 0, 0, 0, 68, 0, + 0, 5, 18, 0, 16, 0, + 0, 0, 0, 0, 10, 0, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 7, 114, 0, + 16, 0, 0, 0, 0, 0, + 6, 0, 16, 0, 0, 0, + 0, 0, 70, 18, 16, 0, + 3, 0, 0, 0, 16, 32, + 0, 8, 130, 0, 16, 0, + 0, 0, 0, 0, 70, 130, + 32, 0, 1, 0, 0, 0, + 9, 0, 0, 0, 70, 2, + 16, 0, 0, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 1, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 1, 0, + 0, 0, 56, 0, 0, 7, + 114, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 1, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 50, 0, 0, 11, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 130, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 16, 32, 0, 8, + 130, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 10, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 2, 0, 0, 0, 246, 15, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 2, 0, 0, 0, + 50, 0, 0, 9, 114, 0, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 2, 0, + 0, 0, 70, 18, 16, 0, + 1, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 16, 32, 0, 8, 130, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 11, 0, 0, 0, + 70, 2, 16, 0, 0, 0, + 0, 0, 16, 32, 0, 8, + 18, 0, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 12, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 56, 0, + 0, 8, 114, 0, 16, 0, + 0, 0, 0, 0, 6, 0, + 16, 0, 0, 0, 0, 0, + 70, 130, 32, 0, 1, 0, + 0, 0, 4, 0, 0, 0, + 56, 0, 0, 8, 114, 0, + 16, 0, 2, 0, 0, 0, + 246, 15, 16, 0, 0, 0, + 0, 0, 70, 130, 32, 0, + 1, 0, 0, 0, 3, 0, + 0, 0, 50, 0, 0, 9, + 114, 0, 16, 0, 1, 0, + 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 50, 32, 0, 9, + 114, 0, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 18, + 16, 0, 1, 0, 0, 0, + 70, 2, 16, 0, 1, 0, + 0, 0, 69, 0, 0, 9, + 242, 0, 16, 0, 1, 0, + 0, 0, 70, 16, 16, 0, + 2, 0, 0, 0, 70, 126, + 16, 0, 0, 0, 0, 0, + 0, 96, 16, 0, 0, 0, + 0, 0, 56, 0, 0, 7, + 114, 32, 16, 0, 0, 0, + 0, 0, 70, 2, 16, 0, + 0, 0, 0, 0, 70, 2, + 16, 0, 1, 0, 0, 0, + 56, 0, 0, 7, 130, 32, + 16, 0, 0, 0, 0, 0, + 58, 0, 16, 0, 1, 0, + 0, 0, 58, 16, 16, 0, + 1, 0, 0, 0, 62, 0, + 0, 1, 73, 83, 71, 78, + 228, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, + 200, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, + 212, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, + 0, 0, 15, 15, 0, 0, + 218, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 2, 0, + 0, 0, 3, 3, 0, 0, + 218, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 3, 0, + 0, 0, 7, 7, 0, 0, + 218, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 4, 0, + 0, 0, 7, 0, 0, 0, + 218, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 5, 0, + 0, 0, 7, 0, 0, 0, + 218, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 6, 0, + 0, 0, 15, 0, 0, 0, + 218, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 7, 0, + 0, 0, 7, 0, 0, 0, + 83, 86, 95, 80, 79, 83, + 73, 84, 73, 79, 78, 0, + 67, 79, 76, 79, 82, 0, + 84, 69, 88, 67, 79, 79, + 82, 68, 0, 171, 79, 83, + 71, 78, 44, 0, 0, 0, + 1, 0, 0, 0, 8, 0, + 0, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 15, 0, + 0, 0, 83, 86, 95, 84, + 97, 114, 103, 101, 116, 0, + 171, 171 +}; diff --git a/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTx.pdb b/DirectXTK/Src/Shaders/Compiled/DGSLLambert_mainTx.pdb new file mode 100644 index 0000000000000000000000000000000000000000..a539012300147f3f9eb5677e368efc72051e0d79 GIT binary patch literal 24064 zcmeHPU2I%O6`oxusqJ`EJB^)?mNJC2T_%GgpcO8dNsfY(a^r1+A3PPxe*HQ^u0RkS%3zWWr5I<5LpaQ86NRU!0!~^C#b7yvE zH_i`IsG8(Xay)mwbLPy0Uhwxeu)u2@fxD9}aG2WgAMa!f+}UN{it6W}DG)ib2Kn1S#0%W*ZGoQK zyLdtAu493(#3n3^OHLGE8aJ@D@@j!b91bAP&;`{mXbR8-;->F&~rcsHc8gXdes z0`(O>m(6E+#j#iUDa&mdHJ2ER}If}ETcBYje41T zRkO}l?Xp#|OoVJ+1zI!tvh7v5XRdoq$K-CwtQ(GHyJLJ6%B%(iYSv2C13*g7+s-+D z-a?FHS^h|DJ<>lu&Zj!E!mYaN8MPX(*tN3hJXV~wS6A)&$BUU%x|m+~%(`pYb+

vmzSq@q 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