From 869b97d32c42363883d1f0eb98bfb416fe6c59d0 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 22 Feb 2008 14:40:42 +0000 Subject: [PATCH] removed 1.4.3 branch since it's now tagged --HG-- branch : sourcemm-1.4.3 --- installer/Attach.cfg | 38 - installer/Attach.dpr | 77 - installer/Attach.exe | Bin 360448 -> 0 bytes installer/MMS_Installer.cfg | 38 - installer/MMS_Installer.dpr | 72 - installer/MMS_Installer.exe | Bin 638464 -> 0 bytes installer/MMS_Installer.res | Bin 171456 -> 0 bytes installer/UnitFunctions.pas | 142 - installer/UnitInstall.pas | 590 - installer/UnitPackSystem.pas | 221 - installer/UnitSelectModPath.dfm | Bin 1310 -> 0 bytes installer/UnitSelectModPath.pas | 35 - installer/UnitfrmMain.dfm | 11618 ---------------- installer/UnitfrmMain.pas | 803 -- installer/UnitfrmProxy.dfm | Bin 1584 -> 0 bytes installer/UnitfrmProxy.pas | 72 - installer/del.bat | 15 - installer/files/Readme.txt | 8 - installer/install.bmp | Bin 154542 -> 0 bytes installer/upx.exe | Bin 126464 -> 0 bytes modules.versions | 9 - sourcehook/FastDelegate.h | 3811 ----- sourcehook/generate/FastDelegate.h | 3811 ----- sourcehook/generate/FastDelegate.hxx | 1054 -- sourcehook/generate/generate | 7 - sourcehook/generate/generate.bat | 10 - sourcehook/generate/sh_memfuncinfo.h | 912 -- sourcehook/generate/sh_memfuncinfo.hxx | 332 - sourcehook/generate/shworker.bin | Bin 54998 -> 0 bytes sourcehook/generate/shworker.exe | Bin 352256 -> 0 bytes sourcehook/generate/shworker/Makefile | 13 - sourcehook/generate/shworker/fd_hopter.cpp | 370 - .../generate/shworker/msvc7/shworker.vcproj | 137 - .../generate/shworker/msvc8/shworker.vcproj | 208 - sourcehook/generate/shworker/shworker.cpp | 767 - sourcehook/generate/sourcehook.h | 6104 -------- sourcehook/generate/sourcehook.hxx | 1370 -- sourcehook/sh_list.h | 291 - sourcehook/sh_memfuncinfo.h | 912 -- sourcehook/sh_memory.h | 186 - sourcehook/sh_stack.h | 237 - sourcehook/sh_string.h | 401 - sourcehook/sh_tinyhash.h | 534 - sourcehook/sh_vector.h | 519 - sourcehook/sourcehook.cpp | 1231 -- sourcehook/sourcehook.h | 6104 -------- sourcehook/sourcehook_impl.h | 659 - sourcehook/test/Makefile | 63 - sourcehook/test/main.cpp | 131 - sourcehook/test/msvc7/test.vcproj | 362 - sourcehook/test/msvc8/test.vcproj | 513 - sourcehook/test/sourcehook_test.h | 27 - sourcehook/test/test1.cpp | 700 - sourcehook/test/test2.cpp | 171 - sourcehook/test/test3.cpp | 238 - sourcehook/test/test4.cpp | 420 - sourcehook/test/testbail.cpp | 119 - sourcehook/test/testbail.h | 40 - sourcehook/test/testbail2.cpp | 49 - sourcehook/test/testevents.h | 153 - sourcehook/test/testlist.cpp | 282 - sourcehook/test/testmanual.cpp | 355 - sourcehook/test/testmulti.cpp | 107 - sourcehook/test/testrecall.cpp | 232 - sourcehook/test/testreentr.cpp | 599 - sourcehook/test/testref.cpp | 165 - sourcehook/test/testrefret.cpp | 208 - sourcemm/CPlugin.cpp | 698 - sourcemm/CPlugin.h | 157 - sourcemm/CSmmAPI.cpp | 672 - sourcemm/CSmmAPI.h | 98 - sourcemm/IPluginManager.h | 137 - sourcemm/ISmmAPI.h | 320 - sourcemm/ISmmPlugin.h | 409 - sourcemm/LICENSE.txt | 29 - sourcemm/Makefile | 69 - sourcemm/SourceMM.Doxyfile | 257 - sourcemm/changelog.txt | 133 - sourcemm/concommands.cpp | 802 -- sourcemm/concommands.h | 55 - sourcemm/convar_smm.h | 523 - sourcemm/msvc7/sourcemm.sln | 21 - sourcemm/msvc7/sourcemm.vcproj | 258 - sourcemm/msvc8/sourcemm.sln | 20 - sourcemm/msvc8/sourcemm.vcproj | 366 - sourcemm/oslink.cpp | 81 - sourcemm/oslink.h | 91 - sourcemm/sample_mm/LICENSE.txt | 29 - sourcemm/sample_mm/Makefile | 67 - sourcemm/sample_mm/SamplePlugin.cpp | 237 - sourcemm/sample_mm/SamplePlugin.h | 132 - sourcemm/sample_mm/cvars.cpp | 27 - sourcemm/sample_mm/cvars.h | 24 - sourcemm/sample_mm/msvc7/sample_mm.sln | 21 - sourcemm/sample_mm/msvc7/sample_mm.vcproj | 149 - sourcemm/sample_mm/msvc8/sample_mm.sln | 20 - sourcemm/sample_mm/msvc8/sample_mm.vcproj | 224 - sourcemm/sourcemm.cpp | 979 -- sourcemm/sourcemm.h | 127 - sourcemm/stub_mm/LICENSE.txt | 29 - sourcemm/stub_mm/Makefile | 66 - sourcemm/stub_mm/msvc7/stub_mm.sln | 21 - sourcemm/stub_mm/msvc7/stub_mm.vcproj | 142 - sourcemm/stub_mm/msvc8/stub_mm.sln | 20 - sourcemm/stub_mm/msvc8/stub_mm.vcproj | 216 - sourcemm/stub_mm/stub_mm.cpp | 105 - sourcemm/stub_mm/stub_mm.h | 45 - sourcemm/svn_version.h | 13 - sourcemm/svn_version.tpl | 13 - sourcemm/util.cpp | 408 - sourcemm/util.h | 76 - sourcemm/version.rc | 101 - sourcemm/vsp_listener.cpp | 194 - sourcemm/vsp_listener.h | 51 - update_tool/Makefile | 68 - update_tool/README.txt | 90 - update_tool/api_link.asm | 138 - update_tool/msvc8/update_tool.sln | 20 - update_tool/msvc8/update_tool.vcproj | 203 - update_tool/sourcemm_update_tool.vdf | 6 - update_tool/sourcemm_updater.conf | 9 - update_tool/update_tool.cpp | 366 - 122 files changed, 58284 deletions(-) delete mode 100644 installer/Attach.cfg delete mode 100644 installer/Attach.dpr delete mode 100644 installer/Attach.exe delete mode 100644 installer/MMS_Installer.cfg delete mode 100644 installer/MMS_Installer.dpr delete mode 100644 installer/MMS_Installer.exe delete mode 100644 installer/MMS_Installer.res delete mode 100644 installer/UnitFunctions.pas delete mode 100644 installer/UnitInstall.pas delete mode 100644 installer/UnitPackSystem.pas delete mode 100644 installer/UnitSelectModPath.dfm delete mode 100644 installer/UnitSelectModPath.pas delete mode 100644 installer/UnitfrmMain.dfm delete mode 100644 installer/UnitfrmMain.pas delete mode 100644 installer/UnitfrmProxy.dfm delete mode 100644 installer/UnitfrmProxy.pas delete mode 100644 installer/del.bat delete mode 100644 installer/files/Readme.txt delete mode 100644 installer/install.bmp delete mode 100644 installer/upx.exe delete mode 100644 modules.versions delete mode 100644 sourcehook/FastDelegate.h delete mode 100644 sourcehook/generate/FastDelegate.h delete mode 100644 sourcehook/generate/FastDelegate.hxx delete mode 100755 sourcehook/generate/generate delete mode 100644 sourcehook/generate/generate.bat delete mode 100644 sourcehook/generate/sh_memfuncinfo.h delete mode 100644 sourcehook/generate/sh_memfuncinfo.hxx delete mode 100755 sourcehook/generate/shworker.bin delete mode 100644 sourcehook/generate/shworker.exe delete mode 100644 sourcehook/generate/shworker/Makefile delete mode 100644 sourcehook/generate/shworker/fd_hopter.cpp delete mode 100644 sourcehook/generate/shworker/msvc7/shworker.vcproj delete mode 100644 sourcehook/generate/shworker/msvc8/shworker.vcproj delete mode 100644 sourcehook/generate/shworker/shworker.cpp delete mode 100644 sourcehook/generate/sourcehook.h delete mode 100755 sourcehook/generate/sourcehook.hxx delete mode 100644 sourcehook/sh_list.h delete mode 100644 sourcehook/sh_memfuncinfo.h delete mode 100644 sourcehook/sh_memory.h delete mode 100644 sourcehook/sh_stack.h delete mode 100755 sourcehook/sh_string.h delete mode 100644 sourcehook/sh_tinyhash.h delete mode 100755 sourcehook/sh_vector.h delete mode 100644 sourcehook/sourcehook.cpp delete mode 100644 sourcehook/sourcehook.h delete mode 100644 sourcehook/sourcehook_impl.h delete mode 100644 sourcehook/test/Makefile delete mode 100644 sourcehook/test/main.cpp delete mode 100644 sourcehook/test/msvc7/test.vcproj delete mode 100644 sourcehook/test/msvc8/test.vcproj delete mode 100644 sourcehook/test/sourcehook_test.h delete mode 100644 sourcehook/test/test1.cpp delete mode 100644 sourcehook/test/test2.cpp delete mode 100644 sourcehook/test/test3.cpp delete mode 100644 sourcehook/test/test4.cpp delete mode 100644 sourcehook/test/testbail.cpp delete mode 100644 sourcehook/test/testbail.h delete mode 100644 sourcehook/test/testbail2.cpp delete mode 100644 sourcehook/test/testevents.h delete mode 100644 sourcehook/test/testlist.cpp delete mode 100644 sourcehook/test/testmanual.cpp delete mode 100644 sourcehook/test/testmulti.cpp delete mode 100644 sourcehook/test/testrecall.cpp delete mode 100644 sourcehook/test/testreentr.cpp delete mode 100644 sourcehook/test/testref.cpp delete mode 100644 sourcehook/test/testrefret.cpp delete mode 100644 sourcemm/CPlugin.cpp delete mode 100644 sourcemm/CPlugin.h delete mode 100644 sourcemm/CSmmAPI.cpp delete mode 100644 sourcemm/CSmmAPI.h delete mode 100644 sourcemm/IPluginManager.h delete mode 100644 sourcemm/ISmmAPI.h delete mode 100644 sourcemm/ISmmPlugin.h delete mode 100644 sourcemm/LICENSE.txt delete mode 100644 sourcemm/Makefile delete mode 100644 sourcemm/SourceMM.Doxyfile delete mode 100644 sourcemm/changelog.txt delete mode 100644 sourcemm/concommands.cpp delete mode 100644 sourcemm/concommands.h delete mode 100644 sourcemm/convar_smm.h delete mode 100644 sourcemm/msvc7/sourcemm.sln delete mode 100644 sourcemm/msvc7/sourcemm.vcproj delete mode 100644 sourcemm/msvc8/sourcemm.sln delete mode 100644 sourcemm/msvc8/sourcemm.vcproj delete mode 100644 sourcemm/oslink.cpp delete mode 100644 sourcemm/oslink.h delete mode 100644 sourcemm/sample_mm/LICENSE.txt delete mode 100644 sourcemm/sample_mm/Makefile delete mode 100644 sourcemm/sample_mm/SamplePlugin.cpp delete mode 100644 sourcemm/sample_mm/SamplePlugin.h delete mode 100644 sourcemm/sample_mm/cvars.cpp delete mode 100644 sourcemm/sample_mm/cvars.h delete mode 100644 sourcemm/sample_mm/msvc7/sample_mm.sln delete mode 100644 sourcemm/sample_mm/msvc7/sample_mm.vcproj delete mode 100644 sourcemm/sample_mm/msvc8/sample_mm.sln delete mode 100644 sourcemm/sample_mm/msvc8/sample_mm.vcproj delete mode 100644 sourcemm/sourcemm.cpp delete mode 100644 sourcemm/sourcemm.h delete mode 100644 sourcemm/stub_mm/LICENSE.txt delete mode 100644 sourcemm/stub_mm/Makefile delete mode 100644 sourcemm/stub_mm/msvc7/stub_mm.sln delete mode 100644 sourcemm/stub_mm/msvc7/stub_mm.vcproj delete mode 100644 sourcemm/stub_mm/msvc8/stub_mm.sln delete mode 100644 sourcemm/stub_mm/msvc8/stub_mm.vcproj delete mode 100644 sourcemm/stub_mm/stub_mm.cpp delete mode 100644 sourcemm/stub_mm/stub_mm.h delete mode 100644 sourcemm/svn_version.h delete mode 100644 sourcemm/svn_version.tpl delete mode 100644 sourcemm/util.cpp delete mode 100644 sourcemm/util.h delete mode 100755 sourcemm/version.rc delete mode 100644 sourcemm/vsp_listener.cpp delete mode 100644 sourcemm/vsp_listener.h delete mode 100644 update_tool/Makefile delete mode 100644 update_tool/README.txt delete mode 100644 update_tool/api_link.asm delete mode 100644 update_tool/msvc8/update_tool.sln delete mode 100644 update_tool/msvc8/update_tool.vcproj delete mode 100644 update_tool/sourcemm_update_tool.vdf delete mode 100644 update_tool/sourcemm_updater.conf delete mode 100644 update_tool/update_tool.cpp diff --git a/installer/Attach.cfg b/installer/Attach.cfg deleted file mode 100644 index 6c57635..0000000 --- a/installer/Attach.cfg +++ /dev/null @@ -1,38 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"c:\program files\borland\delphi7\Projects\Bpl" --LN"c:\program files\borland\delphi7\Projects\Bpl" --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/installer/Attach.dpr b/installer/Attach.dpr deleted file mode 100644 index 214317d..0000000 --- a/installer/Attach.dpr +++ /dev/null @@ -1,77 +0,0 @@ -program Attach; - -{$APPTYPE CONSOLE} - -uses - SysUtils, Classes, UnitPackSystem; - -var eStream: TMemoryStream; - eFiles: TStringList; - Version: String; -begin - WriteLn('// File attacher for the MM:S installer'); - WriteLn('// by Basic-Master'); - WriteLn(''); - WriteLn('// Looking up files...'); - { Check files } - if FileExists(ExtractFilePath(ParamStr(0)) + 'files\server.dll.source') then - WriteLn('// Found files\server.dll.source') - else begin - WriteLn('// Error: Couldn''t find files\server.dll.source!'); - ReadLn; - exit; - end; - if FileExists(ExtractFilePath(ParamStr(0)) + 'files\server_i486.so.source') then - WriteLn('// Found files\server_i486.so.source') - else begin - WriteLn('// Error: Couldn''t find files\server_i486.so.source!'); - ReadLn; - exit; - end; - if FileExists(ExtractFilePath(ParamStr(0)) + 'files\server.dll.orangebox') then - WriteLn('// Found files\server.dll.orangebox') - else begin - WriteLn('// Error: Couldn''t find files\server.dll.orangebox!'); - ReadLn; - exit; - end; - if FileExists(ExtractFilePath(ParamStr(0)) + 'files\server_i486.so.orangebox') then - WriteLn('// Found files\server_i486.so.orangebox') - else begin - WriteLn('// Error: Couldn''t find files\server_i486.so.orangebox!'); - ReadLn; - exit; - end; - if FileExists(ExtractFilePath(ParamStr(0)) + 'MMS_Installer.exe') then - WriteLn('// Found MMS_Installer.exe') - else begin - WriteLn('// Error: Couldn''t find MMS_Installer.exe!'); - ReadLn; - exit; - end; - { Get version number } - WriteLn('// Please enter the version number:'); - ReadLn(Version); - if (Trim(Version) = '') then begin - WriteLn('// Error: Invalid version number!'); - ReadLn; - exit; - end; - { Compress files } - WriteLn('// Compressing files...'); - eFiles := TStringList.Create; - eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\server.dll.source'); - eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\server_i486.so.source'); - eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\server.dll.orangebox'); - eFiles.Add(ExtractFilePath(ParamStr(0)) + 'files\server_i486.so.orangebox'); - eStream := TMemoryStream.Create; - CompressFiles(eFiles, ExtractFilePath(ParamStr(0)) + 'temp.zip'); - eStream.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'temp.zip'); - WriteLn('// Attaching output to MMS_Installer.exe...'); - AttachToFile(ExtractFilePath(ParamStr(0)) + 'MMS_Installer.exe', eStream, Version); - DeleteFile(ExtractFilePath(ParamStr(0)) + 'temp.zip'); - eStream.Free; - eFiles.Free; - WriteLn('// Done.'); - ReadLn; -end. diff --git a/installer/Attach.exe b/installer/Attach.exe deleted file mode 100644 index d83a203980b4a1778b9549c8a8bcb6af0b491d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360448 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%0A-+Kg##_gtoMUkhAj!pCyJYoKAX|Guy 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 k6reX;W=A*NsNR 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

&$-OG&nD? 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 T%UP5xmgl8GFaE#$X9oTUHt(6} diff --git a/installer/MMS_Installer.cfg b/installer/MMS_Installer.cfg deleted file mode 100644 index 6c57635..0000000 --- a/installer/MMS_Installer.cfg +++ /dev/null @@ -1,38 +0,0 @@ --$A8 --$B- --$C+ --$D+ --$E- --$F- --$G+ --$H+ --$I+ --$J- --$K- --$L+ --$M- --$N+ --$O+ --$P+ --$Q- --$R- --$S- --$T- --$U- --$V+ --$W- --$X+ --$YD --$Z1 --cg --AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; --H+ --W+ --M --$M16384,1048576 --K$00400000 --LE"c:\program files\borland\delphi7\Projects\Bpl" --LN"c:\program files\borland\delphi7\Projects\Bpl" --w-UNSAFE_TYPE --w-UNSAFE_CODE --w-UNSAFE_CAST diff --git a/installer/MMS_Installer.dpr b/installer/MMS_Installer.dpr deleted file mode 100644 index 09273ac..0000000 --- a/installer/MMS_Installer.dpr +++ /dev/null @@ -1,72 +0,0 @@ -program MMS_Installer; - -{ - - Metamod:Source installer is published under the zlib/libpng license, as well - as Metamod:Source itself. You can find a copy of it below. - - --------- - - zLib/libpng License - - Copyright (c) 2007, Metamod:Source Development Team - - 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. - - --------- - - Used components: - - - Indy 9 (www.indyproject.org) - - FlatStyle Components (www.torry.net) - - FlatPack Component Pack (www.torry.net) - - JVCL Lib Pack 3.0 (jvcl.sourceforge.net) - - Half-Life 2 Icons by Vasili "vaksa" Vorotnikov, Thanks! - Visit www.vaksa.net for further information - -} - -uses - Forms, - UnitfrmMain in 'UnitfrmMain.pas' {frmMain}, - UnitFunctions in 'UnitFunctions.pas', - UnitfrmProxy in 'UnitfrmProxy.pas' {frmProxy}, - UnitInstall in 'UnitInstall.pas', - UnitSelectModPath in 'UnitSelectModPath.pas' {frmSelectModPath}, - UnitPackSystem in 'UnitPackSystem.pas'; - -{$R *.res} - -begin - Application.Initialize; - Application.Title := 'Metamod:Source Installer'; - Application.CreateForm(TfrmMain, frmMain); - UnitfrmMain.VERSION := GetVersion; - frmMain.lblWelcome.Caption := 'Welcome to the Metamod:Source ' + VERSION + ' Setup Wizard'; - frmMain.lblInfo1.Caption := 'This wizard will guide you through the installation of Metamod:Source ' + VERSION + '.'; - frmMain.lblSubTitle1.Caption := 'Please review the following license terms before installing Metamod:Source ' + VERSION + '.'; - frmMain.lblSelectModInfo.Caption := 'Please select the mod Metamod:Source ' + VERSION + ' shall be installed to.'; - frmMain.lblTitle3.Caption := 'Installing Metamod:Source ' + VERSION + ' via FTP'; - frmMain.lblTitle5.Caption := 'Installing Metamod:Source ' + VERSION; - frmMain.lblSubTitle5.Caption := 'Please wait while Metamod:Source ' + VERSION + ' is being installed.'; - Application.CreateForm(TfrmProxy, frmProxy); - Application.CreateForm(TfrmSelectModPath, frmSelectModPath); - Application.Run; -end. diff --git a/installer/MMS_Installer.exe b/installer/MMS_Installer.exe deleted file mode 100644 index 0b64b156f923f6a5872018398567d8ae0c65c532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638464 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%0AS zDx)THG*1wFd_{k4mrv1LXhqwjY1%*6Pa(Y;oW4&{ZeoF|mh~5K&&(rogk z(-wXE5x4vlTjS7k+1N+57|;PZ^3w^lmrlzRaXec_oGFGs9%jdY{m!6G)#8e*R<8_*7ojyLCNKES*(!@)_hZN zYh24?-sh{M1Xx}@De9XzMoi$5%tR;djmk}L`7-`3lRe%V4}mWBBh7MMZb7d1Pdo3% zAs##XZ|1QPG(dh;3CJSh$4&O=6BtFIbjGMF1uJ$_*L(GwiYS_(O)ukG;K7<|vtoe- z1bw?wrJcDqPp}I(V~XM1-+nb)3z+{{?3w2}#_FOC8BYVh1Ep0xf9VQFaAQozci?+v z4@l5+!bzxF>i7JV74u)-Ecwd^oxC`L%zq)Y$>Oc_Z(Y{*+1q^2LCIUp6Sn?Ee4Z2= ze8Y^XWUlHBSy&Pb#?K~ER)jnDMA?EwmDg`;ru#PYxiy+Y1rzlX4*DUsso(VUh>#lh z5r;&XibVhKFj#Ljdh~u{1TH9|aHEW#bTJQ9UPz zDy%fL!0;kYx)y7gM9`@Z-Rj}b|>R+I&It2mw9`3hdb*%GyX%h#sp@%-j z`Y!d1+)K~OW$ignn^<;%Yq)cm4c}9~A zsv9JPi595^{8+>xALpDGdXij&H9MxkwGLUj0*_KZbVtPSUom`5AAW?mND1H^)9mu!d zS>&!HuI9GxQr~_ay{F+TV4+N3Ppw=|f#+}5?QFV_!M6`3H}9vrXgB!FJTB$uh*l>- z7_7J(4&~C{*;D7AWXs>nZZ#GMR_w1!dGR-gb1ZEVY@lLyH#qm|EHLA55(y;x-pWL7 zvp%^CmVt-7%uJj;jLwPQY&vA>y6?j2<$XZWm(K`^7>8Sl6MesBDfF5VS~p_Y_$i|9 zwoT{lTAPIzlXh>caxP6N@9(4lm8*V{-KU2P8Pc#FOS63swE$nA(EzBlf8yktk2gTi@8l&JFY z^X?VL^vq{{4hlb~1%0R;;3L>$;@NDxlpU1K=B|;gaq^zm^~-ww`soKh*~S&K3q+7!rqj`8+8bjS$K%DC zFtwiB92H&lojFW$9T<2j!P*h)@Ts=t94Q+!4gyTwTSfy4n4%52S9@J_lAh4A^2*xt zvdkRnt9{JD5n9>Of{Y8rQ28*A0jZys`a8ddW#C-aE7ANs;|R5fT>FwYV6k#FTodGD zhwK<+&;1Ud5url;M)|z0d!Y2>-sx?Isgl)`t50J>^kj4TK8S3=O&B*L?;g|Pae_tX zjjKIQNu2`0@!R66;nf<`tv8#PJZ#l%HL*W>$=sMcRb`g$*baS&Jp9>p6!UC@Ft{bw zysxEltLrbbvK6Sh_Y$}qpq8yxBVTicaKN4(c%{{PL`tmav&l}6Eclt`EIXzpMn^6Q zJg7b`zdm!Nr=rIzjcx2k{C+y1D6!ouX2Eo_-uxE(&>*Xc*D~zto0j-X{YUb*m#MXY zMON*?`VAe6s`)Rjo_C-^j#~i+=)CKgyxU4a3M$#CdW%eXM-ZZv4^4IU*o)F#QS_H zA@3bLg8*-9nt0c5e?t^#l2)^J%4wAa*A%$@_G;t&*N4YU&Guc4ovD!d9w{#enN)N% z??wP&Hz4KJFg=JZ*s-aqqR1D=8PTnunUEXc8xYAqo=e$;SF`HL^zKWLj>Qn+mhEG@F`S z>#trRC4ba0%erBuSL`;!ivCMYvyuZuT}-f%ENnwuDWkX;5O+?4$MzrMBCx0ZHXgl} zm+%-Kc7ZO?C7J6b}i~V47Ru`yQq4U31-G`?|&8zYnLYUKKqkBh(si$ zKoar(y}viw&u@M5n)lu(vIG;$S?$gSLSp# zG4@FSkZhlqd42}nf(XZK^j_kN)8%SGvaO!%PDM0RwMp74Pv}wDElE>uz81K^3BK@m z+7m*+Jxodiznn6TmWr?(a`fURt;d!4`n1V&^*+%Cwq_E5H{)38S z3AcbfKHb!sj=37=fxXsDCg*ZnXtbohxIqlZ zAIsqW(8I=z`YOl8v8-qVQ;ZA_m+o($#6Le>- zKR~>1=t9ZKtIsdIwM`q8@eHiJ`f^0ClAO-N=lPbUNY&Dj5&Jn9buN&(uScPjf@~zp za{$*Uw^vD~CLg_?3$%)et&l8&s;mrZ=_Mr3nEJ<#RWmN70Ubm?Jt04k`~}xJPC}K# z2Z*uQPcw>wN`4be6GbwZlf1iL^#B;dOucp92jg}+&r1+3Wb(xlkc-@|F;CK#dLHzR z!jP0Yj!)%-D7hdJMNuc+Li`-j@NWpTrH^;tQkp;$KIqgJr`Gyts7m~Hkl*pM$DFb^ z2;7adbGMEpiIId$b=7yy#QI57xh+5PBhL3!AE)g$oIusyesji7-Ny0q7gj(r;ptj< zr=%sN$zs!G=W4#RL9)DtQKvd4Mgw?~b5XWiOAp0!CWKFK=*QfaFV{{bl1HkHbDKle z7KmPZyZ{UqP|j{U#i$-La;&CI4P`3n=lBR6De+VF-V9LL;Uw=Yh?kZ1ljWAqOkSK2 zncM|b?@^yB0Dg$*)Z?=n?-QUN$#CRl4zFjN%n&cP^n#~AQqKACec+K9M)rqqY?P4U z!WvII-#*?pC|dQNVSh!}YA zCb`MGY9t6;`ZnTng&Ez$bIO}5Kq|0wdS4HQ{~%|=bvUf{ts37aFs80AQKV+{($wQY z^P)eTIMZl{CmQa*>9KB2Ve2M0)`a4xwZ(JpvV*gHBStBp|;_e$aNL3iW ztGDAtF*~<2;>e2S-c%mP(?${L&>&D=6t|qs>NPIRuoRdrARSxd} z`JNiu*@SW)8?HSHiRe}1g>Sd`i@oQu8*bEH$ z0h0GoGtj0_6>*O=dabD9%-+-FpZeWty6V;Ubwx3fbA2B|B|eSj8dEU3`@jdm!rY^* z1oZ&51~LMCDj<~C)rsVrYYrP2xI#Gluk`x zqZiwN{90H2;A1WR6!O^aq4200Nh^d6=T|ACyJSmYI+^tpBY#0y9ZqspzwsGb)_K5+ z7fJX)AiBEAb7Rg=0YZR^(wMwtnEs(aj*_u%H^W&pa53PL!K=h`k;c*-apoi0_am~d zf*Ur^Og9IyX4$;r)5<^Gm_PZOq$7NJbye>%ijfIxTw?8RLU``kH^tYyUjvKWzNqU! zL2t2*^lT+~-S#FPeM{TU1X3Y(*>+8PNr3`pEz0pZSrHPQxd3U|^>iZT$>H7T-F^^E z@#k~>)z^_kS&3!0JNfqm#P|mK`IUl%gy|lorfj<}%6xhOy?Pom0sjRx+vaaAsZ5zu zH@jud+#aWyMIH2&UYT+X&k4R+(5E}ujdGTU?bwT&kE$&CAuy~ADZg#4va(ATliw&? z1unAe)s3@N37c+nSM>ffKAY0Ne9_R8e1xB)Eo@uv2@aXkS_DD9m}OXyiN-T<+0xbv zu7BtC_45eI{6LPXa0uWhXW?lIFo4JrA(MXLWF|%*1?2bY9?kPBt&1T7*VaSy))5Mu z9+mH?t*NjBZUW54MbLMx=aNb2iGxj=s^6R*C;_8UaUK^cKkn`&d9jaR|7dA3lm-$W zWb9L<4lv@v{P)f07A&#H;Zi{B^Vuw?3$WgGxeL0z(1Bs~G`j=L^s;#zp8CbCu4?|M zmSCS(5op)caF|6cV74R!Kbov_;8}<3L=Zx-*3evFy&#`JFf1YN4SMY1&?lfEc`X_E z`$Q)HQEMbPbE|(mT=X{xR>_GjF^eH4gwu177gX4`52T43`Yl@%wbVP;5gNC}#DfCS z!Vo!6;gBskyr#@3F1>{yp+1TnJrb|@DC>~CEwr>z35X$n)*1>?4&emMXluRmOfZ!7 z-3V&a&a2&de+yDlR)w58+Jd}p^Q70I1tCUxcN~-k8r@HZOr7yHo2%S_l;WZwN!V?# z&w==S*-DDQ@a;?#C4v75^_bV;L6&-%i2c9-wTBFcMaMO_{&x{Pug{SJ#WiPc#$N5A z$F7Fm7E0iJ!n(?1Au%hy=a@jtUj1HudGR@w#cAuZ!Wf=Uh@doKdz(hZSE;oFOX3ibN6WHee*Y8N*70iUn-;16RuE`9HL7%DC?#qseyZ)1{-ol5w z=@*=k9q_>BY2U>h2AJ|j)a$Jtc{cBT2O^i35>mKmiip-9@g&kj)Z&3hENK|@JPiec z=kV_Zf-wAL{NWMNZV_gpVp3kY!zmiTJ9XxJF7&Q>vq(syR9{O@(w0M?zj=br~gqwGBQR8LPIM(RzYQsnPZ%LZ`HLFcMSY&zqBdwolNPx!}|NhAB^W_6rOP}Dwoj}Z}mk$?h3SU>Fe#?*87qG?QNrncw!RbaG_p85=}{1 zVD-Ud4ffCrdBFm#RhwI1o{L3<|Jn`xc3|Q(hhl5BLAWM9PbhlQ)k7~j#shr|`40I{ z_V;5u86$r^leDF=UqZ{r0h9k}o#hba4GuhbHJUbNS`-mO4V)TST#|MlZNeKZ*Zp`++tk;OaUaYbHME4bkJ;4A&zJp=jDR-}&I^5~Ws}q&X^YT`G zBbFD0(dw%)hGRbWdo9D1YP_)K}q=iCnw|fOg(k#31&DbFyJ-yD3)&G^_urU`l5(-ok4WVi4uClC4SB zpHD)~f&gjeNjeY05j4+V(RDHSTAU`oD3!Tz9jgZ7+Y8IKCEU)ASGP&+o2t8wm<>DC zDNnvGdr`y(e`cznwf}UZpooWVo}xYmi~VjIA!&uRWQN3oc}-RFXL-D&Tc1s!FwRW{ z&atNq=sn8^)0oeXXng=`w)S@tu?Z`h%K729g&|v(Gl7M{_YVqZ_*S3n*5}3><@ZrN zff}8*2)v4U*?WAjfa6=pTz-|*lg<%f(OGSd)w|zI6>~dp#WV%OYKLXchDlp!(fxqj z0s`g5V%O8T8k*Q0m1-i@olgBl*~eZV!_wRCV7Uu+@9Y?CnKBREx8)XpmGA2vBaW4( zc$AXwMOxok0+jEI2(R_f1zf|F`b+i-=ld>eJKA`$vg~1*EKc{ zFv7S&3U&~jzYu37z!r>;k8HfAV`(C8OagD%ZVLtzy8b%onGQ9=h6!gjj02<0Jbs}r zHx%45lWt9;YL@AcMv^t;;uZ^lSXCKX@<+tL#dwHNXQYGz!3l=r<8jCON+S%=K~TYK z&ihD54@pSR!|=@#Ppq7&goczb;DuGkGGC^^+^vtN8A{Q#K#==bS;Si7fLl1E5#uh}?|%O7cQ!Wx zD<+M!dMg@;$IhEaJP&KTj`pR#)s^R?IgyK$#5(QT&8ytQyU5HtwKBz%)T->@L8EVz z#`f7+8l@*CvzeMj9uk?r$=`qUNfTLM4+m0T#U$tZdyr2|$WVVo=Of?C6aJGsS!zee zZ_*qtv!UE!gf;3dbsixp`4gQh?RRzPuEORVSs7y~Ak6Tp@olMfpRb<<@=Kf)xl=7d zOydAby{byp{FCf)VZ&ndr)f{olMtF7Tkbz&q7z*Hh|d$i5j_~P6`N5i#>>ibY?r&> zYp8%)DVP9NU63!U^!$Q~>x=c**sML5X_Aa~IOUTp!i{$DHeY-`k}uB7MtPK(5{I0b z*2bqr9|@)u;-eFs8R2rsv2H@MA7tJL5h2L!n z;$r?!DA|HK%GA`?bdRkQz1Oy}89O{#YYJ1va#e?>iiV&0i@tpGx}l`U@vX#KPXttt z0h~u$a9u_ycc}^Gt2N=2>l9T{{FJikCno@wJE*0fDYDeGSUu!6xK7wVnvK1;$18Eq zYV;@}l>+-*W=X+sa4+Qbzq6ARPz!yDi%UsM6|gEry}yfGB&DjK9P#bcsBQL0=1CEK zzYzNO$C;ZtQ5Fh=Ha)rxM%iNf-$|y%i{u^D4jN;YBuwd;QPBNNU`-x6vZx?Ci2d=| zDoq?+YHT(dc3@{IlXVe@R=j2~08DBgTYAe)`PnySB4sqW_~4ONvB;Yt(n>OKd<{d} z6DwQ2G?mv-+=xjzARMYY_0i-d7Kn`AM{PVj2y{d7#Uc}6HuPgNmo)T7zb$_rv)6ox z!cRmi-FQ7xq8Jz=esf#pca+yz@>xs=5&$mi(<-snxMja4jH$)8=4M`p#^PLUxV-(( z^8LK|3ZoSf3%vb6XTux+~Bq>dVoHNxxllHPd@naAg-hWFtfo zJS}e6Vd&i;BDw?`U84NN@pi&6QVhE2U)ht1Q_a?+nIsmi7Q;;qq@m!2bbRZHex)DK ziVBzrR=D4}!sG@d$Nj|B-U-rFxPPIfI8seGusWdTI$`hcwU5ied`<+y!gA`rIJ~9(yXyXn@6ej_93KaKrTK z-`8NK;zWU2XYv|MAp5)}#z8A*J&lfW03VW-x>&khrB2Ta0^*{n7tb(}LCE7G$zOC% zde#;tz*^R)`SjcCyTRZ^qkt#X3P+6NBFiiU&swxi^ZhkFhUx>a&}2}|u3S?$I1)-b zV8z!aXGy#|vWH2|n4xLk7~FVudt0K!MPCSo;X=a_m3xqx{|PAbr^Ol7LhE?iTqy&A zV4HSP9fk!8^G?3ox4T{aSnV*DqG)*jg*=}x)APFOu@|T(*l1Z&YLY}tTTEhsxgRAU zBjOg$;dbfy6|;z8lc?V@LLd*!V`VL(Kv=bB=VCh*8CWEo3BS##vgLGo?73idY(CsV zdjPvyjuc$jbB{Yl;PKVU9us!Y-Br(yly+?ml#ukd+MB~6FV%W@W(o{}{qEe3UsjV` zl}-*UZjVsCclCV5?K@>uv_yM=%at$Xn(ZlH+Ua?GsuNF>Z4}y@3_8u)LnP|T-g-5F zwaLrfcVu;sRccFq`(yYI8Xs7V9ZHCtPp^L(Zy(=(8oy)y z|1`!2=0XQIP0h?L{%I_&tRK{vz-(;05)Ljqdk4pVQC;J(=D(<=t)u%d>ggMh{zbzh zM~(hPqNJ4czbGRsC;u-hC>~OpOtwi-7PF)S=wfyfx75d`PSe&5fvk2_Ak0cg(X~AG z8}~am)?a-!pnA@9!O`n60S9mSx3k2~T#4YMHW{#_X%Ze~5h9&jaBi~$5YlKNoJ5JN z185yyYa{~@ZFF^HSez4J#cqZF1eK^o*$X2|&9GoImlNqz1t{de1y9(%I1oL2PbQz5 z7@G9oKD5Sh7h*8)l9V33?(vsn6+8$FOC&!CSrE+NwoW=0%*89mwWV@M;6$ikip9GZ zeNmxpKRYJp&Q?ToT~7qk)%c?%W}{!pQ$kO?>?&x}4vSEQ$DNNQz%XWkiMC^pW+I^I z*d(Md9~yFGwp-iXG?T`Sp(TR4Srg&>z1wEgR~_T85M_Z2l_{9v(HL^{gRc8e{do>- zoI*!p9Ae|Rl9p6EI$=Vl=?80cF)wABJxmA>rAwhj)E_i|gGLE!&8DnMl+VU6QlPq5=n6*)wFEsSL{jWEEgWQ~o#yKSctW%QByGH|^wZsw0?XodUT{~So-4d=1a8!-2Z(JBpV^mjHx+_{ zn$A_SaS+c-px;r=o<>eEt598;yV^G6y;{b0;283y9A8-wK_*gd^1Xf+``N9G-c3(f zJpk&mbi(S=wxU7DG6$BaT3$elEekt(y%T_bIV!;*Y){{TE;GFZA+66;(%VSC;vtog6A?^PL_vMVDyaMD&$%;eIA0@zFAvzr z1DC-aWU9!lH`+HIMXN|K@cSONXSs`dt_#ABq_;Ct=?801fIzYWma3o?KMTLp4U2h> z;ChI^N4zBFIocms7@=+2K{qaypn5tCfaByL0c5=hd0&S92Fx?Oz|}NRxOlScY2qWe zFo&lBs)dqke}OXyQ$0+ukAiZ^5wo}YULA!Q2@Sg=Zr=S$u4!@=K^yLc#)D!OtQOcNuk@PyFBv?(UyPe0deimQ>b9x6_OJJP5J;F#&0eBuNj z!kUzG%KStKwkoY0Q8~;VVGDbADq1 zRO*`D`)J}swFOZgUQNz(?^)GBgdVlT*NcV0CF{~-Vh@bj=(;JZhb1wwm{iD(si`;b zF5683<6E*|v_h@|`@l%k#tSwDf%@Eyc(Xed3bhY|Cj>oVKm$Q5m~u=gf!Y|5{{V(A zL5vm@3l@^scp_)>>-j;aM>G3)Cys8yK3XRy6qvj_b>cf*@{rnz8t!|&I=}&=4?whz zJVEnKBmXlaw5v-puXT)-ns+7fuX&e(xq9Ul)OMO#(WI991gsavtr6JzAh#?`f<@2k zDt}X;vm>$cO#KitTh+LK`s|9aNtUtT5AkWIcFGc5@G=`?TE;V zIGU8DQ6r~^xLg233yQsS@{Q>*>g_VN1mZ81NN5>mJvK}q+-y+43AvSbD~Po>LOr|{;Zo*Rq z4}%Nu&_!T1C6i5-{~lbyIEt@O`yHd7#=HeXxmpLuo`55)ju)gzrb$F=Ez81*a9p=p zH@f|5XMOiF54ML~=+_ENkr6Do)eC1{4FNat^uh|5%n+7L#M~#fS;%uZ9-7JuAnD0F zz=iXoU;zN<6i4f(P2EXzuV@xz`ot;d^gUHs&TT=YjYx=`z4#aPH3q%d0tGx;liPxnlLkP>aIQKvgxG~H6_-#s> z5=epx(uYv_(zutUOr;`h$OBjux(9)Cx6N*L-wCr0+ya&*f2pu~it4j{I*r97y}rgw z*|JMECm9npP7+mzrP6P6`${tko%xZA$cd|7=bzXZ03Ca{-?NHFL-H?r-PlJsn*|{E z4ela)u|9cU6omUi;f(Wq>H|+9YhBp_Q|98&_xEj%chQKI`&NA%YvdA=aqiy0#~eqD z!Vgk1CQ|8PY2eaT^y29mrES^903K7U3e2`CbUOMx{*fG0FFT%{C1#eIbHfqo_wJ=(q9tmVouwa{z;NSl61AY1y-pa9aBc_|FZW%3RQLNiRixN znJBeIkJDan-$({#Ujf?|}ljRRzI`Gf*uoyL8X zE~dO#c%NV=8_a8YewDZ;m-AAERW19H0iT6#$c6!xNICrqw`d)q% zTz7qix1=<(j-(}Jaa*mDu}Z3wb@)dhA9J z9}zr}EP<4XWmpwrK?#Aj~e;_A5ZmgDS5F~9FsT5p_Q!_jZMfOi`hRyUK)m4&gEJu836J%wK6!u4V}lQHGtU z3`W&{!F38AYWniq5Uve{0C*<>B?jE4 ziO|A3-ql`_6C*eZ;uRq03l;bzd+%V>`PX`kOz7xEWr5;P#6wpn3?##YgU=Nh2+UT@ zTcrs%T+d9ax9eDTD5`TKv(yTt6T&qYU6`aRr?V}PJ!W?qxHP3N(G|&7_0D`u z#}3!C`)5Dww1%W4nY?{?;H+h7FZ-vg=@xd~Q|(Az+yd{S9_F{&MbLBP5|O(Ca+Z*j zEbKm%7$n;$Cc`GW>$c>1c)F7)cunLLP&xmDW83qA=_9SJ(Du$>FS*1)PKQxP3&`efhaE771=vLh%UV~{4C4sRFc`!D3cAx((lab3_Q^Q z9Wx&nh71*5DSeBG)BV{IP;4y1J6UFaBezEsl(R;a?0hoC_r%s)CiPnTlbN&G-E!`v zhbC4&8%J|T*~0OyTCG=uew^+ze+Ph1O#_y!@zZZQv|V8^1RJe5V~;{1soV;$QGLcE z>c;{I&ZXQril#LPlb`Q|Cw;!JSPyu-@V16?TECI;&G#pNe50-dZ;l6&(5oc32d33n zvs8_^CTjNe;;>w8S_a+2yuIvyiq1WrssE4TyPKJ97=~eEnEOPoVea?Hb#A%lF01BN zE_1&{Be|4{+`71yd&*ElS0W_2rEiL|N~n~d-+$-xIOp+sob$(deBQU$^Ywb3bl%UY zFhFS$BeoO7!#|&vdO@tEgQwV}u#b#y2~zLt#h&-fH9_BlV6%4`WzC+YPbgIXogJ9#qaz-dD|W$;ZJW&!N64WQB0TyijW(-r5brL> z5(jCe!V{@Ft0eGurG1)FhS_(JUXE9U*D5q&l$dY#Y((HRLGP4TrB_KiAg&%TNK}B+ z-ADd>0v}%&i^QY5 zAr{nE{yIWoMxxkVcE8E*569Pf?$m&3*!oxdGlJQq#nRlN^5laC3Q2~mhbFm0pM zb%R5+bA>q&eQL7KO$Eht2;+cMpa(o>k+Lqv`1-}IWKJ3bl3fD@jD_|#oY>;hHXb9w zQMZ#Ou+lZH}@6rfe^K=viKUIq9`= z)<9!IBU8~^>kePeonU)~WZ263X-b`ngLb-l2@3pZujO@_l)|Joq!PfvgcJMB`C{Q-)6mp?A)T%p30%hpk(El$e{0#JaSF zdwCA$IR6&$3kn-e+c)b8s_AkPV;7oD;^oveF6y+;r~Ai!i2!sm8iAst!uF@JK~`et z4@AuT{4w@=CITg;@ufj^knaeurVjsw+V*1y!2*5GGXAuSefd&}$J4ab5kPP-^>X

o8H74xj5 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

c)2ArhCxmiGTKLq@2u(+U0m*{4;nO@lCV9S-ik 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%0AYVnWllio`9SVC^;GWEPAuY(kR_l|a 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 z zYa)^_zCdZ906<=FKIH$|c2TiHgKMvk)BEqcuQOzICFV*#1bY2U`kJ^Cn!Ed7UZ3|VQKH03w68w6 zKi6wyo1i_RjiC*H2;;f_QF;kFgzrQB&T(p0fF_ST^2i{cN|h2YPsvTv`OgN{%e+yk zV#NeJ$7nnc?FRWk{YM+&0sgpMFB8A{ulPLl&_jF=>KghYez|k!?gjl!y5BNs?o4KR z&MN;nPSrn|*|+|$vwia%_>k;drOFPhRWKCKNBiC!psg+l7Ccm~cJ2S#w(zKz*MoQu z`Wuw_=H<$kT@U+th3}pb>@-#w`>QYpSYd3i!kiHbbDJp4d7?0vjRxieQJC{YVa`z1 ztw#@q^??-T2T_=`d@Wgwfe8J3w_3oqs%Z~ zqMomd`7lN{3J5p`dT8Bl${vrc`=l4gT63&D=a<1eRBAlN<4<0^OrBmFszz;2kRhRa zWI*^!s$aw_(l_!|=^OsC8n9)*3=YP+PwQjUQ!6*g)AJW`o*umM^_(l1cf-_U<~EHC zkO$C7De#vz*?px}co*uUd{wJf{af?ELVIuc-7PWy-wS*nXRy;FtQMJO3sY+Xpldh^(+_$Pu!dX>s>pA7O?Y#2eenBKgQnq zVJGN2|Ls2GY&wU&Wtm4GeY9(%h7CXEdpMPO=w{9VH4tn0OUY3BQtC;ijnrgiFx-{8)gHTQP-4Hu$`}(`)bY`V?`=2)q~L zX~yIQauq1~cjN(ej<<)0N4Mt9nw>Fa%aQ(^I}7uMsfmH}WmNcHsULP&RSf$|sz#rd znhB8IZ5O5f&MVR&>6!%Wxvm=Ry(x|NB}#H~2#}VqLV1m^g{^eWbGwd~Q>I znlx_w4P%zO6*yw zzV)K2z2mCX#oA`|ci&Y0dy~Z<>zg*%cS{<8?hT&*UIH|3DQ+8T+)@o+z`llUzY+Eu zf$p}gxqpl2@INW!r39cY`GXJjc3#Ci?-y0oxU*6r{G?O}I;sY5+$zH{&pPy?OI_5g zNs}{(*T&#|8LL$SJi6NSE_VO?Pqjvk$p3uE=lC->W~DjzDf67$hjaGLSh+^Ek9uFq zqU~3Vgl&vJFV(hPk(xWNtJ+C7rS9%zsk3Gq& zVZ-CF!GrPM&44lh{p`Q$^Crk6;xY1hAHp|fPPGA06h6{lVUHQx zmaJT<(rT;RoBD@xKVaA}HFHax)ZB7JN{60Q<)XinN(q<6XWKR9yYq%r-IXlWl2TOl z-M7RB+kOok+mNDaV&8__`SZb>Z-^6Zw_aC^TFcnSWA9eN-9LmSh4#Cd$bJ4I@t z?bX5#8f?Vt~2{Gw%?pUmB54 z2OC|qeWh*Jr1FlN%4cV?RN0k6s4BZ|iLXYA z@=d}%P*rbJ6t^~{sA|}^0sAJ;Ec~m1c4Xxp_tWqW{HV#cM!sQ-eW{t0A~km1R8@Ce z7oWt-QX%>~RWjr&sk8Zg8Mk1G;#_DB@2CAD=EjQ_DY6i>e+(#x_V8!wq1@2{Q~ira6hiaU~3rJX6MsEmC__~2YBz#|_A z*!V`?-G(prHNX>JpsEAd)|_HjvZ}iCrmC|2x|eQa z-^&~k^?qU4|8)Ki=7m**MvPF?Vs@({8$VNpLQbh7k>^$MxT~r}!VOh2@un)dHCcJD zKdkBoG*NBgM|4NK?uppbipNIHR^AEMROxNWsqn_WBg)`hD!`{QKv@Tnf6b<>R=r?H zds_j1bRRNSwRmQWsu6mOyu1zkPq}S3RM~{9s#Np^RV?(BD!uWD8n}LaJZfTas_Xm#RQ0))|euB!y$ItHSX&r7-9Zs3Hj|LKF=F9IidO zcUL_TQxTSZwmZ?__t@|HL?3A~Xp*Y1^i?U9cvDKE9Ttzqdu;hu@^AQD4cNF{$CC6h zNCPV!0{s1t!UyUA8dbPQzR*L^`z^uiKdkrVKJ$prgvBcF&Br9~=C4)$@bgk2`l=L+ zyP*n#{srTcrBHmbDg-`gV87J3^@2JFfgMquF~@Bes5`{tJC^**1YX_F?Z{M2yWPK!ft7K^@#BWg6(unu@&W>&xzbOV4_B>cq3HnE>r|-yr6SRz2cB zP&`#@H&Qr-#P zlUw!^28KmT@r}n+9;_9cC+xh+8+BFk#@vv+pntx&WU(RrevuhlrF!)mih4+|aRIt; zUU(CA$1el#Zb$)KL-P>rsDK7|YT0M|vIFhSw(mD`9%(F;Y0{iq9z#wQ>a+y;D%GlG zOZ_h72k(zOvy|^Yi~O_cO!6G}FNn5`Hm$ripOi{y1LNn;r`)BX18IS4|Ae@Rc?sr6 zJ+h1VxXy#fNh;-<dQYF`ZY~x=Byv&blv#oJUeciT$mUEMr zny0Zs(SCBVR)vHw#)B_3lp^)2@+I8zo(Is!D@({X{ZCCQgT$8+buROu0#S81> z4c@p-_uZIu;MUwPU8>Y-(2I7sNdA2JvMVR?2=v4Ovz^)bpt^PIre?2M#~g$5*mP2P zZaJqsBd@4D(Kl3{n46hG{)MkA-zvTevZvcK-b3pnbK79xWR*Ai8u&~cW z)@$gS@SbfQx{$NVGvcy%Mqf{*zbD&(o&N6j^Dh5TDpji`hzS(Ynq^Jy(?{bPs8rRTS+rN7bxRL!mw^^*-kPxUD=RDpS|2HSAfZ|Bqaus#?9K z@(MbYDZQw9Y}cXsUHD$mL7t)K@V;N^euCjoJ*D-U^*Ol@UjOLn;lVz8ottK@_gygH zAw2u5 zx~TAoRjNky>Vmv(IvVobYK&Xqmj2~uCn`K^s_wEsv$iX>VP6W)PD*{gJ9^G&$QNv! zN6nGiU>(EoZSN?oL8?4# zy8n)K4{4$40UnmE+gQOTWE)O%Pu{nhq<^aXbKh=vRq;U!)3hDO`#N6F>GMb55c(LDH?Do#Gw22Bi#lNIGg|jqy9Hmg zBPd=GxFcT_dA*L-YjU5l-_-f@RrA;*0$U{T`)%|`%zH=gWu+zFuXK~nIyXdr-AYg1 zyKU<>QfkTT>FDn}eoY$tg#Xk3%hp1AVBn(=LeUz0&2N4lgx zp5b@oLZ^WC9N&=-w9K*{#@LC$_IF8b+w^^AFJG?eMIN)qU3TB+4*VYS%MtklUsgW8 zRkhxr{&2j1<0poxyy3TXNnYdz8h7cF?sv4i^l8hs=}X@r-F+PIo2g@q57ac|9W{LX zc+x-Jz0GH?U9;xvpuP4*Ii3LfS^9wf!yV5iV0ab+ZY zAo$vB_x>U8b6s8?XOKpuxg)Kh|Gr23It)Z-?P#7Vl`Chd4LGAe*GZedVS}n1iZ$X% zf5wH`Nq_Jo@5+y*vX3wGqs&pKd$$&ypOgY2@O#1Us$*BsR;2q4ZAg_`^>j|qQ6{p3 z{`G=C;F^JM=}&%OoKp;F&#?r>(MO*pUzGGW+mg9uJpk$NgT6cZ!jOMO`tzN#6GeN^ zROsJU7@Oj>eb*efLU~19QBAw`Pxn3jCx1UbRr1NH+4@X6#M)IaC5UH&Prh%HowntsCAiMkx`lIq*=ncB2}T*}Yi ztJ<{hnC3ix$2huXtvXU*!D~)+;@!!=j)5hB`e)+A4CS9Zz?jRWkbmuqW~F};^dIO* zf7oA{y=<9k5JmlSlKK$-Pd4g*i#;ejbeYsZo)~^iI{NduT6aueFH2p7@dv6xlMXh0 z?ZhVC8U1hIdh~xl{|#SBi_o{lZhzD8pU*{_Tj>TFI)XN!`zOH%js?xsr+D$=?RYIK zIG$=sV4!LnkGwN-As%=hog2Bs+>a}rh1{1axaF*>(xjc%LF}t~0`(H?Pe;GGhP`iH zpGP0Q?#p5=26a!daT~K&_vjqZWxOx_&*Q37=&QQs19VP9A1kda`>a!$45Dja6l0z< zWryLj*0%DI`;5QX-`;22M~J_Ui)RSpuLzy@ciPsS#xfQeH*I4c=GxJJf<9gGMjeA$ z!&7zMb}j$iVE6l=zpWp}Kmy#R+wY6-SxeEZb$g6qI-zSJ*dLkK;eK}{|IDvg;;;Up z``90!M$R2+#bfe-TiCLfLH|}jX_V|{s(%u5D0n$ull@3T$BtFwcfO-@&&9qD7Gxpg0QI0f~CgFycpfM+KA=yQR87cK3G zyj0}-GuvK79_lk?>wCEbA1LcF4(WmVHr6?_F4iULt$kCqL!TmR*@hzbHw<;{&M>fl ze?6wpZ}n?VuZ5ai)NQ4(J!D-s={}f?%4734s>lZP!K_@b$MjfflhHnM(NUni_C>*q zO!=bV+bdQ+a-X$ei=twsOwcjiCuGY%BQ|kj>s;v{)?$(7=C}&h>YMxAra8vAiI$`1 z$P=icBHc$}UG7mBQwk{iRz?mVu0Vh3*lU3JV+@mdE$el-&+#1OH}#yWXG?z`IVW4} zMV~`e4LT$fo}I_>dzschq#OLQOQ;WG-8$<3)f<*kHbtos5w@r2H)ag_q=!hG_%G7`Z~FV`d$oA+d)E4<%TJ_{f96%Fd!YM0gHDUb+RxSakZsZn zwurK5(!@$1cl!2i+MyCeF8mcL<6h6$iO z=a}FeP#OB7sE5b?D%FBIXu}EJHgy|y5eJ}VN|E+mU;E*X(KqpknuWfH zIkRS^!HntCwN836_~kpgHrfGe#hmLR-S-Z^U+4XgtBw(G>%1p*0O@ciKtJCLpgVoh zQb2~jXod3SbspN3f8LYz@QD9p#;!MXn`GNW|D5gzc9sj}*v8&({3yNN_(5^&Zr}NL zKga}(6Ahd@R|U?SCw3?t%Ph>(F?R9{)#s&4Zm(|R*w7hMNv~Y5VYsK2A+W1Hh>&zG0^;q<8}BPi$b?Z4b0hq zItU$`Ge$=ZR+@KVEZg(-A7tQLKN8Bmb+@1HyTPwtm$^&V$a9Mpsl|&H3BmnE3l_-i z*|TNz>S$ay)AvaC3>{zjp0#>uZGk=JGW%Q_ZTUbZ%z1`$+}suYDZh~EFwngTzam zOszof$;5K(FMjShHD~s0HG0n%cXj;qVRQKvo;azQn4-~VG9;C0NlpxZ!LxT+J5{z#i0&~du877ODR z)l(n*B*gd+e#&s)+3)7ZACR?c))30Rl{KqZt7S`;$n2$SGj(0_-saYNpKzaAg%`4W<+mX6YU!CoR`kH(*=|&pD z7hM3_2LM)IG@bn8d;P)xyyQrK=7X4rr5(tJc-USKWXp*{578FX!T9K@AN?#g{N!?f z`a9QTX~cF}9kpH7L~mDXqIY0RY*!nDLuK=(O@y**BD#rkJ{sp5RbJ3amxc{|D-$mHwO=XCGSj-r<_A%4rH-Q;$dBrf|?**tD*g7 zv}2C@oOAf63^Dh;%W6YVsM-=5s=~HxaSQ$?X!B;Za?N`6>^m1Tymm(SpLysfGz-e@T!DHL`ig%hO%#YoNhlVGEzc7hRr|R1^Q3Zu}|rAm?41mGp)bVN9m`CQ+M$ zoNXS|kdJ@=M_K;qFNCsh)9tT3bWI{-<0Tq56-J);Zd*=&&sf; zo>oK0Jtf4DapTqhxAz_3Q5D_$LG-grFVcJOy@MdV_bLz|giu2W5Fn7ydncrkgd~vA zJ1C%n6cMB<3aCJ&_o@(3=ltJycJJoyW)lLa-}ig|+~+wvbMM|e5b$#&Hnxo zF)4I9_4yX+PTKk3sezH3^*)bvpUp16Tz?Ud(QVZ?YMiwXn!e+h8salb>#DM@8^m`T zqmLku%seyvdGqF74Bm53C?hDz{s;f*Ywe{=ZzHT9S$-sjWA#%ePkiUhm9DEGD~Nq^ z?AL0UjdV+|%b>3xO7N-2D)>}9T#~&%BkFUWuWLL;D| zxG4EzZpifGzpKcf;)S&I=Xe$QGyEX!KXF}_$HWTx3sP1$Nq^*bH|)PRhn0+9$Hn+T zvWR$og%-KA--c3`^b^L4984N6WblnXeI=QsP-!ltM{>I_#SjqxsEKh^12H8 z@sW!CC0@mzwbD7bpcOy=u2!75tX3Sq^lZX={N}mIh!gS8I`Nyzw;cP*9BZ+!|G~WP z)hE%rl;=1=R1^x?ml^u8h!M4wgENy;B_^2#%zs6!oJ7ZcaG1n9u5TW zc{Y|}-M!BqJ^D}A-n~~cETqG(eeoQed!*y$&6j>_zfs&f;U2|%!EwYHk(tMTllAB0 z)%x>KWPO|_wLb1C{02QS-T#e##)o+Q4nLG!QIIFcT$%H=4;P&fk7e5xFf7D6*GWme z)$ed@CO&WPkc~3-*zdwJnEKT(;tia^c6jbMc02Nl{DVI9e(;|9!ykZBd_{f#eYyrs znjduxll6jnoz%}Bfjt86bze#TAk0k{oKo)xo|SA%FUf$t_rU*n*>>THY`ySAZM*nX z4BC1z;r?&&>p0@os!MXVL#gK}Qum=~jdCHI{5tz-8d zGHlZknSUx?&HeGQ%>V4548R_FO2QxfS+D)LTN`BR=G;;}6x&OHb4nmkoLfKj_L!5Wm-C33L0!cs2g;1667T z&Z;eSUeD1QM;%n77l*2zz&qw%0n_Z5kCfc=JIdzt80e`2j$BbI0unj-c#&N29pFZLb*~Ovj_DNx` z)8_v`8AkaaI8G|8zN-Acy)T>N9?QO~Pi61bCyMUAtAEJeYfsg_YkvsonSQ>174PeB zpUOJ$V8j97T&=M7HINyj{zR#eqcU{a7V&~C6ZOb3W-;BiG@H}^JbucjxsREkVt)Be zHvEeC&puTCv*rlrg~^4Fb-=ISe_8M|#pAERd&6ZJpdI`|zB@}Z`y=dwDClp<#HbkQ zx%wNGmuL73aE6KYKpp2?kr$=$mK!n=b#>L*NAl(6C-Tkpr|Qs+r(z}e|A3#w=i1f& z1J|F*7nkE@`OlA(??GTMZMrVm!lAdzb3^p;A7C$`aL_SvUA{|=p0`k3`}GszlBT48 zW}Y1L#j%y;#(Y`l_jIKV)z|Jyn+t&_mEM~2VSOV z{%P>s(Y5wPhZv?KA#UBii78JU`JrRSs>#b&DL1UwO7IK;^AF0FaqY}K-*k|FE4b{k zsa^pQ8nEZC8uiURH34Na<;Vjy{@Vx2=fFMX@zovGe)~;TZ7p!lqJb5FF`nOZ zPQ&r$1FQwhEIF?F#eS)L7YFOT9LjKTp2jpert?|%{DyfT)*5lzi8W}&(beIxTzU^3 zuGXJ>pmw4UU3cVX)gOBU?1PdD8{_XL@RE4_PWPW3`JCK6+CiGyt-D4hRo41B>Iw6} zJw?dV$t28Geb?-ecCm*9Wr4la@1SRec7Z(@En`7hcj!M;{)Xc>N&C6J<8zi7_njb< z$9^p%=3Awg9FvaA_p8y%HprM+v!oaHz<`nFbRULkB5#sSv+14o-FiqA=E*xR{4VQ` zo|OR@ySWEr&70nH*l^~i?78-b+H&HY48%D#$A_fC&zmQYCwTgHa(sQB|2~+y?~N** z`+GKO)c9^v`9fNBdbm#E{EcmND9#i814G1bzy82v8v0hs9 zZ@ACJbAD^&rG4ivvhvt@_07#cW$(p@GG$?a>V$PCc&u@BhfbU>UtM`D-`xB|Z9Z~Z z`axd9ItC}|#}MWNoJZyce_y)pJC@P34Vx-q&(vvu#Jm{9vfx~ab%br1x@~TQ2P;os zUxm7>CIkhmi4oCieAG(iw`{E%M~Ysf{3B!4gs`Q`Z&836Ic16(g!6gy>$-2CjDXR{ zFnlAfmvtEy$Bnsbx2vPK|4>J7{h_uUJ*`GhovPfRmyJC*wduR_mjCd7#Kuq6C%t-c zZ@_69fL*f)d^7g{9a;F&_iHa-er?2@IbPtcmSto;B9RZy{MKiBT;%x1c_H;~*mrRJ z=6r?giuRp45v!Ktovw3iM|v!@wyUJ#NGjgvdCqux^y{xa|K*09y!$6f9licY_ME#R zM{hk*)@QQo)CDyZ=hI28=`ip71=!x)dw%A=+shUN%0CD4NX*=ON%6+Y`{c^TR%UqD zssCAgeAfTTrOo^;=G4H2^N|hT{vhAoe5}sg|5JXt|CgM(_ow>q#v|Es=sOuTak8#2 z$UEztExil}^e}hs+{8=y$9ZoqJH%T6Gy`-SW%ZqzrD{l^Ex>{c>FH%;0F2v{(sc|8sf0EDV8no z&Cg!O&-DYxR<6C+PZGzTbD^aALg-Wd3i~Xq_x}?Y^8Pw_k`L}+&=$~T+&_W)xABN! z8GJWf^Rs`!&-#BCawm%*1IqsXfA&H;(|{_1D0fHvn{}Wgpi7{KAjh`+zj{yHqzj-; zpuwQL|FcYgm9SSFc*TKN9C*cnR~&f7fma-O#er8Gc*TKN9Qgl`1M;%h+=Kx9UD6mg z@z~}w{BdAwZR-s=Y<)@5pW5;quj8`#WFQAABgT%Je)bzl-S| zJHOvVL5im`}>eQD=#ATiHR>qa?Ns<=D%B zD9=bD{%8qMAy6(*W)S6kiU09mJO4!7|HMUHC1MI>1CbY$X|4-u4Ee$~z!K<_HcgtL zz~C4L@+N)o{`&)9*SRa+X$9iBWCKuj5c!q|lnzAsl>d`;3wZpgkUyrM^@MexDtOTX zHgde7_YhgWT)6{v>(seSY!aMN@yv>NJ7)S5|2>7Q$Q{@lJW;G@(e+s}XPyLk*&Yas z{HhHimcxfQPk#s4=l^Hw6l_JXzN81SuG9ffJRujb4g7G#ywPXD#+h(RT;l(dx3JYa z1$^P`jrEE;4%xu}x4`@V+4=;$0hS@#Q32pT)CCskRMX_>W(lpZS1MMpiWy1PY6O;#a>u-}AMR+fDz5d1ZQYz}Kl!-p4iGDsS9*+N(oRq4ehoo7+R_Q%0 zKza}Mq+G8dhm)voK@R5;+FUs5563-X0HlYW^na!AM!SCp=_n42#30m_r{sxIXXvLK zE9Bi}px*@5C1|5m4L_=igq@L6(dSk9*o#te)n%!&=Blc;?z&W8cSF@!e?vgpt-kKM zs=D@?R9<~WDy+Du$}BrCg~MR$9`@l|F5IB{`i`eOr`8ukTt>ap@iPtO%9Pm+-Kb9B z59bmYQx~rKukr|SlQ$)R6|ffR(HJncIzxR6$ffolGfp~(z|MBq_fl->St%WJQ7Wvu zDwWsXkg6MQN%f6)q~_+kQfmw8p47G@JmY_x?nsS|x1`$on^I}bH7OT+Ns33FlOiD} zr77x^n~$%Ki#i^*_^mQhz&QRMW%!AeM;Y1-9{jJgwfEDf{||Um1iV>e)EC2Lok4#g z9*d%-LfA1?DB>3>8FNvUU3E<=uDhkGY`7y;H{Dg$Hs6!#Tkexo4Y(jxbL#`C34BKF z;=b0_`@EN$e24FEx`Xd;NyRnSRT=Q9$kMZ_Snx6F0!#wvW7z348R@A}z537S131ql z4sn|9(9hvz+VX~4fmwnhWj=u4{SGsi1TKqiny<+@l=Vanm`6VD*0Op zysiMAmtAvHipO3N+O94e_>H)Yok;zxL~RXo%6-UmQ&52q(xrPTeW_%a_ily^89HI! z|JcMItrPD#b(X5Q6a#j^sc14P;yeY-jz!n5B4UWyRd}Z|$!$WXkmV8?V1!1hSOpje1L$ZHo1#@{+@nW64>`8+}CzuDB(I zSKk$4Ko?naUy7_vprY`bsTl4xtt0-lJpscDytPnCxE3B;ToZq#B@~?7 z4jwH&B7IPgIL|bvm1{j(!1AjqSJ*izz4#l|XV?gvUYJqeVZ$U2>$H~O zPadobQ^Wl`t~X#yyb;@#jXxMqyZ3REP7yn`z4;Geb34cK8@?!1*$Dh3PiPkKvd=&-cuGgvwv{y}A4@~dQxzOH~NMLXphyR}HSkpg=^iWvEZjrq2%+oM=^HPFbf4W2^*Lm!R&d zJTb6WwDgk7viOvAogHc5MA_z$*fY8Rwgq1(5A3nNY#mCSIa8*V;ElFJPu@_*eh@H^ zDuy1G^g(AO)6%Pw8Fs6Qubm}^HsWCqKIn{;t6WW&9qc%0yYR3(E)72EFWIB7%ZIQZ zZ%{V)HGyA-n;m|Ga>U+|k9&DZJLo*wQQNix`w*Jibm%N~Jp824^v@+{>}?%KmL=yU zU%*ju8!PXz8Lj~x>|1Gn^oFHrzG8yiz-9Z z4ao=_$Fvo0wd+n-a`&04ux6yqYK`@8u^Zl8N{(9zo8b3g6P!f*?&RrR;FsIGS#h5g zyvw)fsA|!&6?sg179GTC8_V%K4##FFFSQg>g^cuL<^aPe{@sQ&}-Sf1-AW8?!*L1MEO}p(DyWSQz zLui~7t@07^vJAW47Mtp=J4)8DU$t#^!~VLXOa2;EanMX{m%Sy%Ba+oFyEK5^7TSL2 zGrCo()j)ecrRy(n*(4LnEj?`X=2&!G+(!G^?U#^8u<0=i{3-U%JMVCx^F^-Iu!TLz z;5%Keod<-iBW8$v06TxM!)&#!Zn3LQyBaoo&EQwo!68x+c81ZnYa8m+iy@WqoNuwC zj&~gSYUXjKh%3^dd21Vg$p_XG=tm0erqhNo?UMqlLkhKWGwj~Oy(1Z-ZVBwt$p_GZ zZoOcwK!?<>uLjoQ5iq3|h zgn=b#!?UFycElxr^+t-eu=zcCLl>9{^5Mc0Ci}~VeP-G>2ajnR1#Us#mA3Ejt?pxK zV=uegEXmwyw8~MuyyVZHUt#Vina6Ij*`!B(rX6!)Y-ucnLW>U**G%)r$Pe54VtyqasKx@-d?9a=pbVqdN*RZ;)~F2hfkIQ+zo-+`4clT7V)wsya>+YCq zwTOa!b>bda+E$Wv#<4D?o3ckrlq#+JYVyShw|d9EXam5Z41wu1_iq_LEujr)FJK@r|1HIQe%JVOQYQA z(gst7@MGF00`V0!PQSIh%;j#R&F&e>GJETR3VLvf?A#VWA7l3}_>=~=i9c$Zfd5H8 zVIN)OFKm21&4ar5#ff9%$-z~Z|A-qZ(UGUJ>rMPt2( zhsT>JFO54x-ta78BygE?1;Rc#uzhGdh4t6qMM~VX^ML74x;$-9+0~1>E!txqb-^yI z+~c=MLsQ)$e_(%CvJMEad+(X?>OKf|Y=HlnVc|(}_nWN8Pv*%Wgsrk<$ubuFDf;fa z@1|()1N?a#-`RA|**A|_xLBn}9E{7+ex_r&B~_MLKk?^yuh>?YKBkR%FX6c`p&vq? zDs&&NpBwM6Z!cY;GUlYGoz@Y9Pmbx(_w1uXVe@UlkJ4xA!bEFUrU7X>2>$SFC@tuj z7x?oozcYBuy#k-W2-raUL5~L<7oNBNFb`=krz}{Zx}L9)FGl$F8#kBC;62}g-Fm6l zP-8zCJR}~aqdOx~1?_2iF{cDmf>84(gq zJf)Z75A&b7|6;*@o}T9!agbLPdXLfk$>+OD&nJ!lIJc}+v65u;-Sm8I3vuasMVkV! z8B3g;?sFowJ!>Ouvs=7q(GB2FMRY*V+#532AJ!xCXJl}cGWbIrZasdcw0}lgjk*te z4k}-@1_FF2-M*Mc#?i20Bgr}aD^<~Tr0qHX!}>%Oty-6MD-znEDLh-aPM+!iEc_u3 z6!^1LV-y*2nq9Q{hu8z;-cWXo^~v_r;LkfuGruR%hWO~9aBKTQU;2XWOP43|k$?}7l8QTNZ7J6r7v8D;0_k`Ip0jC*ZY5p&Cejk@Z((F$wwHmzGL z+DW9%O1fN=b6; zXWI5=#VPA;-{D)mf6cuQ)==%@0{`%=xTXzWmqV zPYqDAV||5k<>vD{gNWDPY56{^FJLzZYZ|uece5xLjQvn|UxmZOXF!N}9nyiI#? z?b%bbjX<2e8ZPVxO3U`0r4r7g9lz%p8Tb0R#!t2$(XJ2Ht+cUGBWRCwLp(-)l5#O# zK7H@qcU{4syr3l4^?CE;>BcY&{t|<0SmXw*g@4rZExk5QV*Da+SWoo%uyJOb$hDj& zHyRtHZ72@J{=*>H&;x0=57v84M$Jz+b58WV+`y1Rl^qD?5u$v zCgWQEYqasIcz6z%VP0M~@`A0u-oP$x5_K$@?=9h1!?`o}o#p!VJ{{vFv$l` znQ5HSKeG)@QC+x5p*ziVPp5@l8Ui~bp zNImc;BgpB6GsgVjvu%H#Eg_kj}nX^z{jdw!E%&p{)?x5zZ?4HyLb zS>l5@dhfXUT;WjOLANpTM%Nwg`<%m>{1NehoSv}<`7FK||0CajVXWtQbRm$juD5Gz z;9n}tU)S>+qdrnrZba02tmUy51CG2NKVd_M?HzrAqFpH~8UCbP8MyDhnh_AH?OMUM zm3C)Ln;z$%f+?F7MmI9-r=$xt`#jD(ZK+ z;6vh$Ju#-4ylLw;NCwUh70(3`iD=0DaPb&3!LY-r`Gm1P9`i)Xq~`%q<|7e*@XQ7L z(e^YA9zo_&`35eLyg|U6)pi`OYJ1|&o-w05-nEVOp zcaNP?$jS`@J2i$q6+4&DBVfa6-p0L7zfCGkKA(nsmWG^*ZtK{;`(WXZ(j{bz5NFmX zQ`VmjLq>@YFwJQfW#-m>GJMto@$j7>{l<*f)N{b#L~=10!*4>~l4q@1lj0AayYw0| z#5SKMU)ffP-`^v4uWsl1%m@3@ZhIfff*&4})Pf)4?cAknw}{o&kHFqff}i$(Vq+yT zGD>0pw!V{?@UF8X6m2$4ID7~8 zWan$!;#>!#4I1Zjw)dG&63$v@f(3;^Ny_HKPSX1=TDJVjC=a^a_wXD$PGbaf93_u( zL(XOPcaJ3OOnf4WUb9ixAJ!FT6t&?qeDgTbch15xo&~}#LW$Lub1vdVR}cAG24ehU z-)l~*;U{it-{>#czGTwA3mA`moysj5@6*M(!ZGls5-3@Dh6Ouz)C4~tk*C)073~Up zPn@LMEI-J#2W+FnK`!uygq?m2O#66=f&G-2vrn|U;@}xs@%0Z1MAz)s&tgwpwY_Wk z#`2xvGTs-KB#{MV%|4S3Y0xdoBNNTRf`XT7Nq(OhvEbJ>8IBN7W>jLx7@eEMh zGJOAa8IQhe(#p?tf12DJ33?^o$bOP@Me>H%_W1ZzRXTYraO4r&n)}e9;N--Gw0DePP1h`_!s&bGl9 zEiXGDbT!9M9T)SR5+V1L-~#^At4+<+uy=borMDwM|!N;lM6v74YDNOZT8gfEvMI4q6k-KEb zl2zh8WxBxjg<;n*MfJs;9;Rc=!Z0}i`zfD(cV65F57upo>-wNi_v+`%Ki@AMAtP)4 zj((g^9>Y>J#cj)3T?#yMB3HM*eb*tpq{db~r{vlMwg99r`cvA<8HGK!Q40gr$bcmR zQX>}xiqEV$YN(&TeusA7XzP;YY)yAk;U`;v_-)StL*&5qc;Nd#m1Wy^sgaYX$*iR@ z>frTwIR;$+nL$f*do|Y|`2WIQkn4-q9W$?HZQPjZ6La?%&~O-!myFLXO>dET``MDL>x*L%S#MJeAlTUupRlrpX)^^jkKi ze(kjvl~FXa$L2@)Z-MVU;2t-Z1>-gD&3@yVqnna;bss#!IT>%+w#IB6+{9nCi9pU_k>oL|TgD*xp z!1F(G{vDGwYt|Q%-Fy*dBJTG zwQ=vyhq%oC+_?AWLtOOlrU#eV&%@8%e2B~J=Vs1sKEy?T96h+qeohkO_z)NURvzkm zE1whjt!1H~oBh_Z)6Yf!T7K;O{t18BP)6~{QctY!TO;OSoPl+!{niL5v}E9$GA{;1 zDf4b1?UFyJrEzd{xxjC^EYDxq@3PH;MOp{p_=5~AQmt8!`&ZX14!q*PD-QgF9AGz1 zc_6N3(}FUAJ_KdA5@qs;#m2KB>Ls#^Oj6Dh|NURMm}g?TF|YYS#PF;E`WVz0M9f9X zD73J;JWFi|ssrM=a}f~vLVmms`af|&{*7s688gpSARFH#129T}Q5FdduCJi$dj|VF z*KvOQn?caSxCg!DUtz!cFl6XAWc%>LnK)bSf$zy9>N^($Wda7no6ui%D(`~-|Erf3 z7lQdNf^&tsz=!ike)l48zrV=78urBg0IUY>U%Ip* zXNlW??H(ll(3Gzs4? zjl=dz)8Nmg)xr(Zc}BSO9XDBe@=OpsvYwSD+LH#KZ=$_TK>UqBh2Bk*hV}1XyGmPl zo(FsRBZv>{n0KB7;A}(&z!}=^@}lFQ@GTcpBfL-|2ufm2!FOy?>MkrEAyboFpeOMuN=w zrl0kEz_{_!Y{_n<8#tcJE=W0GH&$AQJOQ_{+NQfw9awtACba692=NH*i2ni8u?8?4 ziT7A(&2=FzVZrd9rE1WA>FqZ)5he)ZhThbV&|~a`w3R?xNU=^n-cRw>!_SZ7Zf3}& z%(Kfo+IXj~U8UcGNGZAGdnp`w-iAR~0oaVh#Unmm73g#r*nLAnOEpaoYjF}9#Rt|0#30K7tt zD|lJ*0n4y%z)tDu(LYiDSiWr8eaJui#O#HO730|Sw_I6r=Y9hi+x4g~Ym`0nPR!p9 zVLK&f$WM@exoltv0{4y>g21`cx_6HFb`~7L()dpk^olI_ffm<-A4m+r1Z>7~@Dn$% zG_V_q8<-c^id6#ki0gnsiFiOPbYz87t6+5oqEc^$?-YsBr-c#axrzVP~aUz%J>I zvDJ*_iu(Bn@bHHs zt+V0*3h@9FFae1NXd&{h$g11Ybm(NMIdhYg0G4I~-XifA!C(BJZ~0Zp4otho3pYy# zU<#YlhjaFG7#BHT=GyCJE@JK%$Gpon#&az8oH1AO1br`AfSHwj8RX!Ar*9va}lQ-NPZXf76)(Jl-8H3MC z=E!T36}VN@vm*9fu1TM1-E`uAS#i>&d53P26X`Ut=L|Oo@aW8xfbVxt>bs4!;n0zX z!12@6rb`d0Gjfp>5BOGc16MI8u*h$w({k*6v_D;5wW35?<&+ z*%w6F+tzO!<2`~_3UTPthhLVA(YI`vXuy>twwx4d?kZT{YB>-CAFblBMK&BiV$K;j zbHti6$iVK)8+cNv$8PXXyNK7S>#m;@dnDh4&5}Llwq%XECK-c%kwyzPTX3DxHyJ#D z4A%l=yb#t&FS3`C2uqE!o#mDsl{CTUwQfTC=-c-Aa?th5Jo}K8D_35pfw*v_rp;PN zj=&#nSZ4-~oY^(_SHW|h9q)*r#{2-wPxFQ0RjAzn_>nh>;U}3<1{s!Ilq}FiC$_b@ z4xk@6i~Lj9>P6;-Z)2VDi@{5_uYrNfsTU$2K>sQYbe_^g-_iQcju>(|I}8)(3hK0I zSvJgzEB6`mO#HZvORq_T7HxDNqWOmJfRQC7iWk?Ibj0x?Zd~5plXbn*7=6HrOcw#% zw#7e7(|PL?=`;dA-vjy2Q55z=;HLP(o=sIF?{tX+RX^f@RTrOn!bxKh5fi6GnerOT zg5_b9NzNI2?D5K=S8TzCv$zHP*6DYRZ&=R@H|io8JtHJrwWfl-1u0OVpk!R|ovwG( zElr0qNCTbV51{Xm7ub}p9v1vGBkkzFK0~I$3iS(0^ALCipo|CCVLfJiAd#u@^w?#+a^q%oP-Kt#%+Vao1iSvHjcmR_+(&PsyGkFo;W=zjue+cG>U~ zTGtJjL@6$RmQ{u^8wEPQ!uo84*`QGq$+Y;iEpIs|ZMT&@-{JhBFmdUU%CEEMR!pC? zz_aS-GujrH5hrXu9Yy}DVLty%c|ypZe`I_|ckt-ZQZNJ@u{lqhsdJVK5k^YYux@F5()VOQUSN;k4cbhQN zZcS*!i9PhK$bY$KjfKd6UE>?NUN4z{<|9X&!9r|ia~-JB$z5_!-eLEQ<3(QL#wAmq zoc?Dj|GpEQ=bvXWzyRTXX|iJ>>VF+`{s#l6qe!R)12!dNzq9nEfv#-v(&cp9Hi!LD zo33_sf^&w9V>iE4{yqFB+rl)*ML*_HA;^ERh!}?rTmr*C*TufxQBYO^BE)Qm1Jv>4bHC_io)1 z5qVI_dy#&Z`y|Bn;vCN$rc=K${$UPWAn>^Ka+m{~^FlxLQpY0y`H~w8(N1l;U(|`~ z9{ITi#}?R4&M<<^>0()PKa2Zzj#PER3Lyp=v84K7USSaL+u+Qn0`RBI-w?Npdj{t4 z6Ztv+L%DGNQ!Qwp(8iQwp3V1|TYQWBS50m##M$eo#y8YW93HY9^K0NpVT{o@TS=4) z_i?y?ZR}+yaZ8!cZKEQJs?c<}#2iQh^fn(9~(_7E{mi54{ z{_DEWxqqCL3jP**^6rW9YR-q@=UzU}j3|GSq<%W)p*Flit^s|5BPA^{dVrziSOa=JeTS(8!b_uViK){8oh*Qb_&_!-becr0Jk>z(H`| zcq+x;7sGgB*k6(N+Mo|WyzKe{*qX?MzT%PbK6Tf9 zLYHaXabnCHb%0~s;BS6+N}hXfi}x27WcZgCHI3Zyi_D)lUlz=_5HXs@&06I2+oZy* zfiprI?hxnv*q7)UV8O~`T3J_tO|P*BcvfK$$1&RCGWMhRF53Ah zi&#fxfw{!G$@Fo*vHRTRGG^y#@%`eAJ$-&gd=^LBwGm)XeuHdQ22qB>uKaQD((#i| zvVsQ*=O5UA9X@Tk*7Mf$A+&=G*a!9p#?s{Dj}y_Xo!?93(xnm|6_tphA|oX*C`hIp zx}E4dXJHx7O02cw2BF?(hHm+Q=?iQ)70iFnkj>(M;;~FTbW_HEc0@*jzdmdBXc`K8 zoaVCW-{Z9x+k=$pi11Gri4qfbu$Q2iX<_d)$hn)P45@nRoJWB3k^_DT$4V zv0wucAIL;8%a=>gy6uU+aTbp8%=hr`l9m{VY=6KoaSha1WOnVoUAG?Mwd(>flYW

UH{$A0WpyO}BlFGU4y3GCl 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�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 diff --git a/installer/MMS_Installer.res b/installer/MMS_Installer.res deleted file mode 100644 index ace3317386baf91cfcde64e0f3db13dbbe283fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171456 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

    iSEi@7TPRPDST6;k%@geks-j4Ea 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 0) then begin - eOld := eNew - eOld; - //eOld := eOld *2; // this is only used for faster updates... - Result := 'Metamod:Source - Uploading with ' + FloatToStr(RoundTo(eOld / 1024, -2)) + ' kb/s'; - end; -end; - -function GetAllFiles(Mask: String; Attr: Integer; Recursive: Boolean; ShowDirs: Boolean; ShowPath: Boolean = True): TStringList; -var eSearch: TSearchRec; -begin - Result := TStringList.Create; - - // Find all files - if FindFirst(Mask, Attr, eSearch) = 0 then - begin - repeat - if eSearch.Name[1] <> '.' then begin - if ShowPath then begin - if ((eSearch.Attr and Attr) = eSearch.Attr) and ((eSearch.Attr and faDirectory) <> eSearch.Attr) then - Result.Add(ExtractFilePath(Mask) + eSearch.Name) - else if (ShowDirs) and ((eSearch.Attr and faDirectory) = eSearch.Attr) then - Result.Add(ExtractFilePath(Mask) + eSearch.Name); - end - else begin - if ((eSearch.Attr and Attr) = eSearch.Attr) and ((eSearch.Attr and faDirectory) <> eSearch.Attr) then - Result.Add(eSearch.Name) - else if (ShowDirs) and ((eSearch.Attr and faDirectory) = eSearch.Attr) then - Result.Add(eSearch.Name); - end; - - if ((eSearch.Attr and faDirectory) = eSearch.Attr) and (Recursive) then begin - with GetAllFiles(ExtractFilePath(Mask) + eSearch.Name + '\' + ExtractFileName(Mask), Attr, True, ShowDirs, ShowPath) do begin - Result.Text := Result.Text + Text; - Free; - end; - end; - end; - until FindNext(eSearch) <> 0; - end; -end; - -function GetAllDirs: TStringList; -var eList: TStringList; - i: integer; -begin - eList := TStringList.Create; - frmMain.IdFTP.List(eList); - frmMain.IdFTP.DirectoryListing.LoadList(eList); - eList.Clear; - for i := 0 to frmMain.IdFTP.DirectoryListing.Count -1 do begin - if frmMain.IdFTP.DirectoryListing.Items[i].ItemType = ditDirectory then - eList.Add(frmMain.IdFTP.DirectoryListing.Items[i].FileName); - end; - Result := eList; -end; - -{ This is another possibility I coded because I couldn't find another bug... - -function GetAllDirs: TStringList; -var eList: TStringList; - i, eStart: integer; -begin - eList := TStringList.Create; - frmMain.IdFTP.List(eList, '', True); - eStart := 0; - - - // +----------------------------------------------------------------+ - // | drwxr-xr-x 5 web3 ftponly 2048 Jun 25 19:43 files | - // | drwxr-xr-x 2 web3 ftponly 2048 Jun 25 19:57 html | - // | drwxr-xr-x 3 root root 2048 Jun 20 05:03 log | - // | drwxrwxrwx 2 web3 ftponly 2048 Jun 19 2004 phptmp | - // +----------------------------------------------------------------+ - - - // at first remove all non-directories from the list - for i := eList.Count -1 downto 0 do begin - if Pos('d', eList[i]) <> 1 then - eList.Delete(i); - end; - // then we have to find the position where ALL filenames start... - for i := 0 to eList.Count -1 do begin - if (eStart = 0) and (Pos(':', eList[i]) <> 0) then - eStart := Pos(':', eList[i]); - end; - - if eStart = 0 then - eList.Clear - else begin - // find the position - for i := 0 to eList.Count -1 do begin - if Pos(':', eList[i]) <> 0 then begin - while (eStart <> Length(eList[i])) and (eList[i][eStart] <> #32) do - Inc(eStart, 1); - end; - end; - // remove the detail stuff... - for i := 0 to eList.Count -1 do - eList[i] := Copy(eList[i], eStart +1, Length(eList[i])); - end; - - Result := eList; -end; } - -function GetModName(const Path: String): String; -var i: integer; -begin - Result := ''; - for i := Length(Path) -1 downto 1 do begin - if (Path[i] = '\') or (Path[i] = '/') then begin - Result := Copy(Path, i +1, Length(Path) -i); - break; - end; - end; - if (Copy(Result, Length(Result), 1) = '\') or (Copy(Result, Length(Result), 1) = '/') then - Result := Copy(Result, 1, Length(Result) -1); -end; - -end. - - diff --git a/installer/UnitInstall.pas b/installer/UnitInstall.pas deleted file mode 100644 index c43835a..0000000 --- a/installer/UnitInstall.pas +++ /dev/null @@ -1,590 +0,0 @@ -unit UnitInstall; - -interface - -uses SysUtils, Classes, Windows, Graphics, Forms, ShellAPI, Controls, Messages, - TlHelp32, IdFTPCommon, ComCtrls; - -type TOS = (osWindows, osLinux); - -procedure AddStatus(Text: String; Color: TColor; ShowTime: Boolean = True); -procedure AddDone(Additional: String = ''); -procedure AddSkipped; -procedure AddNotFound; -procedure DownloadFile(eFile: String; eDestination: String); - -procedure BasicInstallation(ePath: String; SteamInstall, ListenInstall: Boolean; OS: TOS; const Source: Boolean); -procedure InstallDedicated(eModPath: String; const UseSteam, Source: Boolean); -procedure InstallListen(ePath: String; const Source: Boolean); -procedure InstallCustom(ePath: String; eOS: TOS; const Source: Boolean); -procedure InstallFTP(OS: TOS; const Source: Boolean; const ModDir: String); - -var StartTime: TDateTime; - SteamPath: String; - StandaloneServer: String; - Cancel: Boolean = False; - -implementation - -uses UnitfrmMain, UnitfrmProxy, UnitFunctions, UnitPackSystem; - -// useful stuff - -function InstallTime: String; -begin - Result := Copy(FormatDateTime('HH:MM:SS', Now - StartTime), 4, 5); -end; - -procedure AddStatus(Text: String; Color: TColor; ShowTime: Boolean = True); -begin - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - if ShowTime then begin - frmMain.rtfDetails.SelAttributes.Color := clBlack; - if frmMain.rtfDetails.Text = '' then - frmMain.rtfDetails.SelText := '[' + InstallTime + '] ' - else - frmMain.rtfDetails.SelText := #13#10 + '[' + InstallTime + '] '; - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - end - else - frmMain.rtfDetails.SelText := #13#10; - - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - frmMain.rtfDetails.SelAttributes.Color := Color; - frmMain.rtfDetails.SelText := Text; - frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); - - frmMain.Repaint; - Application.ProcessMessages; -end; - -procedure AddDone(Additional: String = ''); -begin - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - frmMain.rtfDetails.SelAttributes.Color := clGreen; - if Additional = '' then - frmMain.rtfDetails.SelText := ' Done.' - else - frmMain.rtfDetails.SelText := ' Done, ' + Additional + '.'; - frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); - - frmMain.Repaint; - Application.ProcessMessages; -end; - -procedure AddSkipped; -begin - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - frmMain.rtfDetails.SelAttributes.Color := $004080FF; // orange - frmMain.rtfDetails.SelText := ' Skipped.'; - frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); - - frmMain.Repaint; - Application.ProcessMessages; -end; - -procedure AddNotFound; -begin - frmMain.rtfDetails.SelStart := Length(frmMain.rtfDetails.Text); - frmMain.rtfDetails.SelAttributes.Color := clRed; - frmMain.rtfDetails.SelText := ' Not found.'; - frmMain.rtfDetails.Perform(WM_VSCROLL, SB_BOTTOM, 0); - - frmMain.Repaint; - Application.ProcessMessages; -end; - -procedure FileCopy(Source, Destination: String; CopyConfig: Boolean; AddStatus: Boolean = True); -begin - if (not CopyConfig) and (Pos('config', Source) <> 0) then begin - if AddStatus then - AddSkipped; - exit; - end; - - if not FileExists(Source) then begin - if AddStatus then - AddNotFound; - exit; - end; - - try - if FileExists(Destination) then - DeleteFile(PChar(Destination)); - CopyFile(PChar(Source), PChar(Destination), False); - except - Application.ProcessMessages; - end; - - if AddStatus then - AddDone; -end; - -procedure DownloadFile(eFile: String; eDestination: String); -var TransferType: TIdFTPTransferType; -begin - // There's only one file to download and it's ASCII :] - TransferType := ftASCII; - if frmMain.IdFTP.TransferType <> TransferType then - frmMain.IdFTP.TransferType := TransferType; - // download the file - frmMain.IdFTP.Get(eFile, eDestination, True); -end; - -procedure UploadFile(eFile: String; eDestination: String; CopyConfig: Boolean = True); -var TransferType: TIdFTPTransferType; -begin - if (Pos('config', eFile) > 0) and (not CopyConfig) then begin - AddSkipped; - exit; - end; - - eDestination := StringReplace(eDestination, '\', '/', [rfReplaceAll]); - - // the same as in DownloadFile() - TransferType := ftBinary; - if ExtractFileExt(LowerCase(eFile)) = '.txt' then TransferType := ftASCII; - if frmMain.IdFTP.TransferType <> TransferType then - frmMain.IdFTP.TransferType := TransferType; - // upload the file - frmMain.IdFTP.Put(eFile, eDestination); - AddDone; -end; - -procedure FTPMakeDir(eDir: String); -begin - eDir := StringReplace(eDir, '\', '/', [rfReplaceAll]); - try - frmMain.IdFTP.MakeDir(eDir); - except - Application.ProcessMessages; - end; -end; - -function FSize(eFile: String): Cardinal; -var eRec: TSearchRec; -begin - if FindFirst(eFile, faAnyFile, eRec) = 0 then - Result := eRec.Size - else - Result := 0; -end; - -// stuff for killing processes - -function GetProcessID(sProcName: String): Integer; -var - hProcSnap: THandle; - pe32: TProcessEntry32; -begin - result := -1; - hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); - if hProcSnap = INVALID_HANDLE_VALUE then - exit; - - pe32.dwSize := SizeOf(ProcessEntry32); - if Process32First(hProcSnap, pe32) = true then begin - while Process32Next(hProcSnap, pe32) = true do begin - if pos(sProcName, pe32.szExeFile) <> 0then - result := pe32.th32ProcessID; - end; - end; - CloseHandle(hProcSnap); -end; - -procedure KillProcess(dwProcID: DWORD); -var - hProcess : Cardinal; - dw : DWORD; -begin - hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID); - TerminateProcess(hProcess, 0); - dw := WaitForSingleObject(hProcess, 5000); - case dw of - WAIT_TIMEOUT: begin - CloseHandle(hProcess); - exit; - end; - WAIT_FAILED: begin - RaiseLastOSError; - CloseHandle(hProcess); - exit; - end; - end; - CloseHandle(hProcess); -end; - -// Installation here - -{ Basic Installation } - -procedure BasicInstallation(ePath: String; SteamInstall, ListenInstall: Boolean; OS: TOS; const Source: Boolean); -var eStr: TStringList; - CopyConfig: Boolean; -begin - frmMain.ggeAll.MaxValue := 8; - frmMain.ggeAll.Progress := 0; - frmMain.ggeItem.MaxValue := 1; - frmMain.ggeItem.Progress := 0; - - {if (GetProcessID('Steam.exe') <> -1) and (SteamInstall) then begin - if MessageBox(frmMain.Handle, 'Steam is still running. It is necersarry to shut it down before you install Metamod:Source. Shut it down now?', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNO) = mrYes then begin - AddStatus('Shutting down Steam...', clBlack, False); - if GetProcessID('Steam.exe') = -1 then - AddDone - else - KillProcess(GetProcessID('Steam.exe')); - - while GetProcessID('Steam.exe') <> -1 do begin // sure is sure... - Sleep(50); - Application.ProcessMessages; - end; - AddDone; - end - else begin - Application.Terminate; - exit; - end; - end;} - frmMain.ggeAll.Progress := 1; - frmMain.ggeItem.Progress := 1; - { Unpack } - frmMain.ggeItem.Progress := 0; - AddStatus('Unpacking files...', clBlack); - if not Unpack(Source) then begin - AddStatus('No files attached!', clRed); - Screen.Cursor := crDefault; - exit; - end; - AddDone; - frmMain.ggeAll.Progress := 2; - frmMain.ggeItem.Progress := 1; - { Check for installation / Create directories } - CopyConfig := True; - AddStatus('Creating directories...', clBlack); - if DirectoryExists(ePath + 'addons\metamod\bin') then begin - case MessageBox(frmMain.Handle, 'A Metamod:Source installation was already detected. If you choose to reinstall, your configuration files will be erased. Click Yes to upgrade, No to reinstall, or Cancel to abort the installation.', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNOCANCEL) of - mrYes: CopyConfig := False; - mrCancel: begin - Application.Terminate; - exit; - end; - end; - AddSkipped; - end - else begin - frmMain.ggeItem.Progress := 0; - ForceDirectories(ePath + 'addons\metamod\bin'); - AddDone; - end; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 3; - - { gameinfo.txt for check / create VDF file } - if not FileExists(ePath + 'gameinfo.txt') then begin - if MessageBox(frmMain.Handle, 'The file "gameinfo.txt" couldn''t be found. Continue installation?', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNO) = mrNo then begin - AddStatus('Installation canceled by user!', clRed, False); - Screen.Cursor := crDefault; - Cancel := True; - exit; - end; - end - else begin - eStr := TStringList.Create; - { Metaplugins.ini } - frmMain.ggeItem.Progress := 0; - AddStatus('Creating metaplugins.ini...', clBlack); - if CopyConfig then begin - eStr.SaveToFile(ePath + 'addons\metamod\metaplugins.ini'); - AddDone; - end - else - AddSkipped; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 4; - { CDF Plugin } - frmMain.ggeItem.Progress := 0; - AddStatus('Creating VDF Plugin...', clBlack); - if (FileExists(ePath + 'addons\metamod.vdf')) then begin - eStr.LoadFromFile(ePath + 'addons\metamod.vdf'); - if (Pos('server.dll', eStr.Text) <> 0) then - AddSkipped - else begin - eStr.Add(''); - eStr.Add('"Plugin"'); - eStr.Add('{'); - eStr.Add(' "file" "..\' + GetModName(ePath) + '\addons\metamod\bin\server.dll"'); - eStr.Add('}'); - eStr.SaveToFile(ePath + 'addons\metamod.vdf'); - AddDone; - end; - end - else begin - eStr.Add(''); - eStr.Add('"Plugin"'); - eStr.Add('{'); - eStr.Add(' "file" "..\' + GetModName(ePath) + '\addons\metamod\bin\server.dll"'); - eStr.Add('}'); - eStr.SaveToFile(ePath + 'addons\metamod.vdf'); - AddDone; - end; - eStr.Free; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 5; - end; - { Copy files } - frmMain.ggeItem.Progress := 0; - AddStatus('Copying server.dll...', clBlack); - CopyFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll'), PChar(ePath + 'addons\metamod\bin\server.dll'), False); - AddDone; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 6; - { Remove files } - frmMain.ggeItem.Progress := 0; - AddStatus('Removing temporary files...', clBlack); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll')); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server_i486.so')); - AddDone; - frmMain.ggeItem.Progress := 1; - frmMain.ggeAll.Progress := 8; - { Finish } - AddStatus('', clBlack, False); - AddStatus('Finished installation!', clBlack, False); - frmMain.cmdNext.Enabled := True; - frmMain.cmdCancel.Hide; - Screen.Cursor := crDefault; -end; - -{ Dedicated Server } - -procedure InstallDedicated(eModPath: String; const UseSteam, Source: Boolean); -begin - StartTime := Now; - Screen.Cursor := crHourGlass; - AddStatus('Starting Metamod:Source installation on dedicated server...', clBlack, False); - BasicInstallation(eModPath, UseSteam, False, osWindows, Source); -end; - -{ Listen Server } - -procedure InstallListen(ePath: String; const Source: Boolean); -begin - StartTime := Now; - Screen.Cursor := crHourGlass; - AddStatus('Starting Metamod:Source installation on the listen server...', clBlack); - BasicInstallation(ePath, True, True, osWindows, Source); -end; - -{ Custom mod } - -procedure InstallCustom(ePath: String; eOS: TOS; const Source: Boolean); -begin - StartTime := Now; - Screen.Cursor := crHourGlass; - AddStatus('Starting Metamod:Source installation...', clBlack); - BasicInstallation(ePath, False, False, eOS, Source); -end; - -{ FTP } - -procedure InstallFTP(OS: TOS; const Source: Boolean; const ModDir: String); -function DoReconnect: Boolean; -begin - Result := False; - if MessageBox(frmMain.Handle, 'You have been disconnected due to an error. Try to reconnect?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNO) = mrYes then begin - try - frmMain.IdFTP.Connect; - Result := True; - except - MessageBox(frmMain.Handle, 'Failed to reconnect. Installation aborted.', PChar(Application.Title), MB_ICONSTOP); - end; - end; -end; - - -label CreateAgain; -label UploadAgain; - -var eStr: TStringList; - CopyConfig, CommentFound: Boolean; - i: Integer; -begin - frmMain.cmdCancel.Show; - frmMain.cmdNext.Hide; - Screen.Cursor := crHourGlass; - - frmMain.ggeAll.MaxValue := 6; - frmMain.ggeAll.Progress := 0; - frmMain.ggeItem.MaxValue := 3; - frmMain.ggeItem.Progress := 0; - - StartTime := Now; - { Unpack } - AddStatus('Unpacking files...', clBlack); - if not Unpack(Source) then begin - AddStatus('No files attached!', clRed); - Screen.Cursor := crDefault; - exit; - end; - AddDone; - frmMain.ggeAll.Progress := 1; - frmMain.ggeItem.Progress := 1; - Sleep(250); - { Create directories } - frmMain.ggeAll.Progress := 2; - frmMain.ggeItem.Progress := 0; - - AddStatus('Creating directories...', clBlack); - try - FTPMakeDir('addons'); - frmMain.IdFTP.ChangeDir('addons'); - frmMain.ggeItem.Progress := 1; - FTPMakeDir('metamod'); - frmMain.IdFTP.ChangeDir('metamod'); - frmMain.ggeItem.Progress := 2; - FTPMakeDir('bin'); - frmMain.ggeItem.Progress := 3; - AddDone; - except - AddSkipped; - end; - { Check VDF Plugin } - CopyConfig := True; - - frmMain.ggeAll.Progress := 3; - frmMain.ggeItem.Progress := 0; - - AddStatus('Creating VDF Plugin...', clBlack); - eStr := TStringList.Create; - try - frmMain.IdFTP.ChangeDirUp; - - frmMain.ggeItem.Progress := 1; - DownloadFile('metamod.vdf', ExtractFilePath(ParamStr(0)) + 'metamod.vdf'); - eStr.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'metamod.vdf'); - frmMain.ggeItem.Progress := 2; - if (((Pos('server.dll', eStr.Text) <> 0) and (OS = osWindows)) or ((Pos('server_i486.so', eStr.Text) <> 0) and (OS = osLinux))) then begin - case MessageBox(frmMain.Handle, 'A Metamod:Source installation was already detected. If you choose to reinstall, your configuration files will be erased. Click Yes to upgrade, No to reinstall, or Cancel to abort the installation.', PChar(frmMain.Caption), MB_ICONQUESTION + MB_YESNOCANCEL) of - mrYes: CopyConfig := False; - mrCancel: begin - Application.Terminate; - eStr.Free; - exit; - end; - end; - end; - except - // bacon - end; - { Create and Upload plugin here } - frmMain.ggeItem.Progress := 2; - eStr.Clear; - eStr.Add('"Plugin"'); - eStr.Add('{'); - if (OS = osWindows) then - eStr.Add(' "file" "..\' + ModDir + '\addons\metamod\bin\server.dll"') - else - eStr.Add(' "file" "../' + ModDir + '/addons/metamod/bin/server_i486.so"'); - eStr.Add('}'); - eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'metamod.vdf'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'metamod.vdf', 'metamod.vdf'); - frmMain.ggeItem.Progress := 3; - { Upload metaplugins.ini } - frmMain.ggeAll.Progress := 4; - frmMain.ggeItem.MaxValue := 1; - frmMain.ggeItem.Progress := 0; - AddStatus('Uploading metaplugins.ini...', clBlack); - frmMain.IdFTP.ChangeDir('metamod'); - if (CopyConfig) then begin - eStr.Clear; - // see http://svn.alliedmods.net/viewvc.cgi/metamodsource/orangebox/addons/metamod/metaplugins.ini?revision=1099&root=Packages - eStr.Add(';List one plugin per line. Each line should contain the path to the plugin''s binary.'); - eStr.Add(';Any line starting with a '';'' character is a comment line, and is ignored.'); - eStr.Add(';'); - eStr.Add(';You do not need to include the _i486.so or .dll part of the file name. Example:'); - eStr.Add('; addons/sourcemod/bin/sourcemod_mm'); - eStr.Add(';You may also put an alias in front of the file, for example:'); - eStr.Add('; sm addons/sourcemod/bin/sourcemod_mm'); - eStr.Add(';Will allow you to use "meta load sm" from the console.'); - eStr.Add(';'); - eStr.Add(';********* LIST PLUGINS BELOW ***********'); - // end - eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini', 'metaplugins.ini'); - end - else if (frmMain.IdFTP.Size('metaplugins.ini') <> -1) then begin - DownloadFile('metaplugins.ini', ExtractFilePath(ParamStr(0)) + 'metaplugins.ini'); - eStr.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini'); - CommentFound := False; - for i := 0 to eStr.Count -1 do begin - if (Pos(';', eStr[i]) = 1) then begin - CommentFound := True; - break; - end; - end; - - if (CommentFound) then - AddSkipped - else begin - // delete empty lines first - for i := eStr.Count -1 downto 0 do begin - if (Trim(eStr[i]) = '') then - eStr.Delete(i); - end; - // see http://svn.alliedmods.net/viewvc.cgi/metamodsource/orangebox/addons/metamod/metaplugins.ini?revision=1099&root=Packages - eStr.Insert(0, ';List one plugin per line. Each line should contain the path to the plugin''s binary.'); - eStr.Insert(1, ';Any line starting with a '';'' character is a comment line, and is ignored.'); - eStr.Insert(2, ';'); - eStr.Insert(3, ';You do not need to include the _i486.so or .dll part of the file name. Example:'); - eStr.Insert(4, '; addons/sourcemod/bin/sourcemod_mm'); - eStr.Insert(5, ';You may also put an alias in front of the file, for example:'); - eStr.Insert(6, '; sm addons/sourcemod/bin/sourcemod_mm'); - eStr.Insert(7, ';Will allow you to use "meta load sm" from the console.'); - eStr.Insert(8, ';'); - eStr.Insert(9, ';********* LIST PLUGINS BELOW ***********'); - // end - eStr.SaveToFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini', 'metaplugins.ini'); - end; - end; - frmMain.ggeAll.Progress := 5; - frmMain.ggeItem.Progress := 1; - { Upload server.dll / server_i486.so } - frmMain.tmrSpeed.Enabled := True; - frmMain.ggeItem.Progress := 0; - frmMain.IdFTP.ChangeDir('bin'); - if OS = osWindows then begin - AddStatus('Uploading server.dll...', clBlack); - frmMain.ggeItem.MaxValue := FSize(ExtractFilePath(ParamStr(0)) + 'server.dll'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'server.dll', 'server.dll'); - end - else begin - AddStatus('Uploading server_i486.so...', clBlack); - frmMain.ggeItem.MaxValue := FSize(ExtractFilePath(ParamStr(0)) + 'server_i486.so'); - UploadFile(ExtractFilePath(ParamStr(0)) + 'server_i486.so', 'server_i486.so'); - end; - { Remove created files } - AddStatus('Removing temporary files...', clBlack); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server.dll')); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'server_i486.so')); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'metamod.vdf')); - DeleteFile(PChar(ExtractFilePath(ParamStr(0)) + 'metaplugins.ini')); - AddDone; - { End } - frmMain.IdFTP.Disconnect; - frmMain.ggeAll.Progress := frmMain.ggeAll.MaxValue; - frmMain.ggeItem.Progress := frmMain.ggeItem.MaxValue; - AddStatus('', clBlack, False); - AddStatus('Finished installation!', clBlack, False); - frmMain.tmrSpeed.Enabled := False; - eStr.Free; - - Screen.Cursor := crDefault; - frmMain.cmdNext.Enabled := True; - frmMain.cmdCancel.Hide; - frmMain.cmdNext.Show; - frmMain.tmrSpeed.Enabled := False; - frmMain.Caption := Application.Title; -end; - -end. diff --git a/installer/UnitPackSystem.pas b/installer/UnitPackSystem.pas deleted file mode 100644 index 21e0b2c..0000000 --- a/installer/UnitPackSystem.pas +++ /dev/null @@ -1,221 +0,0 @@ -unit UnitPackSystem; - -interface - -uses SysUtils, Classes, Zlib; - -procedure CompressFiles(Files: TStrings; const Filename: String); -function DecompressStream(Stream: TMemoryStream; DestDirectory: String; const Source: Boolean): Boolean; -function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream; Version: String): Boolean; -function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean; -function Unpack(const Source: Boolean): Boolean; -function GetVersion: String; - -implementation - -uses UnitfrmMain; - -procedure CompressFiles(Files : TStrings; const Filename : String); -var - infile, outfile, tmpFile : TFileStream; - compr : TCompressionStream; - i,l : Integer; - s : String; - -begin - if Files.Count > 0 then - begin - outFile := TFileStream.Create(Filename,fmCreate); - try - { the number of files } - l := Files.Count; - outfile.Write(l,SizeOf(l)); - for i := 0 to Files.Count-1 do - begin - infile := TFileStream.Create(Files[i],fmOpenRead); - try - { the original filename } - s := ExtractFilename(Files[i]); - l := Length(s); - outfile.Write(l,SizeOf(l)); - outfile.Write(s[1],l); - { the original filesize } - l := infile.Size; - outfile.Write(l,SizeOf(l)); - { compress and store the file temporary} - tmpFile := TFileStream.Create('tmp',fmCreate); - compr := TCompressionStream.Create(clMax,tmpfile); - try - compr.CopyFrom(infile,l); - finally - compr.Free; - tmpFile.Free; - end; - { append the compressed file to the destination file } - tmpFile := TFileStream.Create('tmp',fmOpenRead); - try - l := tmpFile.Size; - outfile.WriteBuffer(l, SizeOf(l)); - outfile.CopyFrom(tmpFile,0); - finally - tmpFile.Free; - end; - finally - infile.Free; - end; - end; - finally - outfile.Free; - end; - DeleteFile('tmp'); - end; -end; - -function DecompressStream(Stream : TMemoryStream; DestDirectory : String; const Source: Boolean): Boolean; -var - dest,s : String; - decompr : TDecompressionStream; - outfile : TFilestream; - i,l,lr,c : Integer; -begin - // IncludeTrailingPathDelimiter (D6/D7 only) - dest := IncludeTrailingPathDelimiter(DestDirectory); - - Result := False; - try - { number of files } - Stream.Read(c,SizeOf(c)); - for i := 1 to c do begin - { read filename } - Stream.Read(l,SizeOf(l)); - SetLength(s,l); - Stream.Read(s[1],l); - Stream.Read(l,SizeOf(l)); - Stream.Read(lr,SizeOf(lr)); - { check if this is the right file } - if ((Pos('.source', s) <> 0) and (Source)) or ((Pos('.orangebox', s) <> 0) and (not Source)) then begin - { remove extension and read filesize } - s := ChangeFileExt(s, ''); - { decompress the files and store it } - s := dest+s; //include the path - outfile := TFileStream.Create(s,fmCreate); - decompr := TDecompressionStream.Create(Stream); - try - outfile.CopyFrom(decompr,l); - finally - outfile.Free; - decompr.Free; - end; - end - else - Stream.Position := Stream.Position + lr; - end; - finally - Result := True; - end; -end; - -function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream; Version: String): Boolean; -var - aStream: TFileStream; - iSize: Integer; -begin - Result := False; - if not FileExists(AFileName) then - Exit; - - try - aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite); - MemoryStream.Seek(0, soFromBeginning); - // seek to end of File - // ans Ende der Datei Seeken - aStream.Seek(0, soFromEnd); - // copy data from MemoryStream - // Daten vom MemoryStream kopieren - aStream.CopyFrom(MemoryStream, 0); - // save Stream-Size - // die Streamgröße speichern - iSize := MemoryStream.Size + SizeOf(Integer); - aStream.Write(iSize, SizeOf(iSize)); - // save version number+length - iSize := aStream.Position; - aStream.Write(Version[1], Length(Version)); - aStream.Write(iSize, SizeOf(iSize)); - finally - aStream.Free; - end; - Result := True; -end; - -function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean; -var - aStream: TMemoryStream; - iSize: Integer; - EndPos: Integer; -begin - Result := False; - if not FileExists(AFileName) then - Exit; - - try - aStream := TMemoryStream.Create; - aStream.LoadFromFile(AFileName); - // drop version part - aStream.Seek(-SizeOf(Integer), soFromEnd); - aStream.Read(EndPos, SizeOf(Integer)); - aStream.SetSize(EndPos); - // seek to position where Stream-Size is saved - // zur Position seeken wo Streamgröße gespeichert - aStream.Seek(-SizeOf(Integer), soFromEnd); - aStream.Read(iSize, SizeOf(iSize)); - if iSize > aStream.Size then - begin - aStream.Free; - Exit; - end; - // seek to position where data is saved - // zur Position seeken an der die Daten abgelegt sind - aStream.Seek(-iSize, soFromEnd); - MemoryStream.SetSize(iSize - SizeOf(Integer)); - MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize)); - MemoryStream.Seek(0, soFromBeginning); - finally - aStream.Free; - end; - Result := True; -end; - -{ Unpack function } - -function Unpack(const Source: Boolean): Boolean; -var eStream: TMemoryStream; -begin - eStream := TMemoryStream.Create; - try - // Get ZIP - LoadFromFile(ParamStr(0), eStream); - DecompressStream(eStream, ExtractFilePath(ParamStr(0)), Source); // Unpack files - - Result := True; - except - Result := False; - end; - eStream.Free; -end; - -function GetVersion: String; -var FileStream: TFileStream; - EndPos, Size: Integer; - Version: String; -begin - FileStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite); - FileStream.Seek(-SizeOf(Integer), soFromEnd); - FileStream.Read(EndPos, SizeOf(EndPos)); - FileStream.Position := EndPos; - Size := FileStream.Size - EndPos - SizeOf(Integer); - SetString(Result, nil, Size); - FileStream.Read(Pointer(Result)^, Size); // YAMS - FileStream.Free; -end; - -end. diff --git a/installer/UnitSelectModPath.dfm b/installer/UnitSelectModPath.dfm deleted file mode 100644 index ef9ae6a00bf1378e8d66494971a9f5e7022a05f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1310 zcmc&!J#*7Q5IsqbWJQkS3^No|qG3`op@k}zBkYNTG}eWbaF*7V$obB5caD>PlRrYo z3=Km|P00_)&;jR@^I>MFsieKty?yWPu6}PL9FI=2qv276Pm*4Gi2LZE<7^>>)A(Qy zPsA((3b{JrMM_lJ`TL+Tgo$!KSq|oN=YWYHb9LrusD4%)}nX8I3w-c3| zO9+cfXiP4yS`n>)sXkQGQaKYVsN=J$P^I$=ZAF}N;rTi3Di)I*S}|wpc~lZ1L3z8q zqxkT2h~Gv1!%=pGx9hCA)5_^t#R|T}aH#^5sH@mFzKPzD8MrPcC7+S{qG27Nc0!9t z08x;vv^1M3m(_~C*Pin%7XU2MoI&iQ)g@4wf*7#8wBK*9O0A3RAQz{E0rlsM_CQus zW~{OsE2r$nRxR-cxohpOtnDsb08JJe+4IL2L%sw7MH7>;;b9{UIV5AC9v#yGoA4UY z-2lA41+;hWTz{HUAlh|lIvHN^g$QT7xbMPCgxWYOfl{p1y{%x`QsSa_+oXqe9{BhyOn3}-r2a1%Swh*JvO0!E@Z`~p(-J)ku-D& zY+5l0?}=HS?p~&)`v{@H@aQg-;%qCQ70IzF?OY?XJg?Wa?X&er*iY*5Z+!Xu5w(mT zG0ztgipJOPKap=vdVI-D7?`kLKQAx~la)lzf7>Mb+Q;F_%Z*%pss3&waVOe&mK<+% t}XuLVYg nil) then - chkUsesOrangebox.Checked := (chkUsesOrangebox.Checked) or (trvDirectory.Selected.Text = 'tf'); -end; - -end. diff --git a/installer/UnitfrmMain.dfm b/installer/UnitfrmMain.dfm deleted file mode 100644 index 4e2a9f9..0000000 --- a/installer/UnitfrmMain.dfm +++ /dev/null @@ -1,11618 +0,0 @@ -object frmMain: TfrmMain - Left = 333 - Top = 271 - BorderIcons = [biSystemMenu, biMinimize] - BorderStyle = bsSingle - Caption = 'Metamod:Source Installer' - ClientHeight = 355 - ClientWidth = 527 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - Icon.Data = { - 000001000C003030000001000800A80E0000C60000002020000001000800A808 - 00006E0F00001818000001000800C80600001618000010100000010008006805 - 0000DE1E0000808000000100200028080100462400006060000001002000A894 - 00006E2C010048480000010020008854000016C1010040400000010020002842 - 00009E1502003030000001002000A8250000C65702002020000001002000A810 - 00006E7D0200181800000100200088090000168E020010100000010020006804 - 00009E9702002800000030000000600000000100080000000000000900000000 - 0000000000000001000000010000000000003535360031393E003B3B3B00403E - 3E001D3642001E3C4C002A3B4400323B4100264150002C465400274C5F003E52 - 5D00214C62003A5A6B00205A7700205D7C00365E73002B627F00454343004846 - 46004647490048474800464A4D004A4848004C4A4A004D4D4D00504E4E004F4F - 50004F5050004351590053535300585656005457590055585800595858005C5B - 5B00595D5D005E5D5D00605F5F00595F600045616F005C6364005E696B004364 - 7500496A7B00596B72005B737B00636363006463630060656500666464006167 - 6B00636B6C006C6B6B00706E6E00606C70006370720068747600627479006979 - 7C007170700074737300767575007877770070777900797979007C7B7B007D7C - 7C0019668E0015699300336680002D6F91002C72970029729800337699003D7D - 9D001674A400327CA200476E820042728A005A79850051778B00567D8D005B7E - 8B00637D8500697D8200717C82001380B7002182B3002A82B000398CB7003E95 - BD005F8493006D8287006681890071808500788284007C888E00638C9B00688E - 9A0069919E0079959F00438CAE00488DAB00548CA300588FA600518FA9004B90 - AE005B91A6005594AF005993AA00408EB2004C93B2004C97B9004699BE004D99 - BA005496B100559AB7005E99B000539EBD00599DB800648FA6006397AA007098 - A8006A9CB300729EB50075A6BC007EA9BA001287C3001A8BC500118CCA00188E - CA000D95DB000D98DF001495D6001995D3001E98D5001195D800159ADD001C9B - DB00298EC2002596CD002A95CA003395C3003895C0003D9AC500329ACB00399B - CB002196D000239AD6002B9BD200239BD900319DD00024A0DF002CA1DC0032A0 - D70030A2DD000D9BE3000D9EE800119CE2001A9DE0000DA2EE001EA2E50013A4 - ED0019A5ED001DA8EF001AA7F0001CA8F00022A2E4002BA6E50021A7EB0028A7 - E80023A9ED002BABED0031A6E10034A9E50039ABE50033ACEA0039AEEA0037B0 - EE003CB2EE0024ABF0002BAEF00031AFF00033B1F1003CB4F100429AC3004C9E - C200529FC70070BADD0040B0E9004CB6EC0041B6F10047B8F2004CBAF30053BD - F3005BBEF10062BEED005BC0F40068C1EE007AC0E4007ACAEF0067C4F50069C5 - F50074C7F20078C7F00077CBF60078CBF5008281810086868600888787008B8A - 8A0086979D0090909100979B9F0099989800959DA2008FA0A60093A4AC0080AB - BE009AAEB500A5A4A400A3ADAD00AEBABA0084AFC60093B5C7009EB7C2009DBB - CA00A7BBC500AABCC30093C1D50099C2D700B1C3CA00A6C9DA00B1CAD40084CD - F1008ACFF20087D1F7008AD0F30094D5F6009ED7F5009ED8F60095D6F800A7D2 - E600B4DBED00A3DAF600ABDDF700A4DCF800AFE0F800BFE5F600B2E1F900BBE4 - F900CBE6F300CCE8F500C0E6FA00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - D13F3F3F42D10000000000000000000000000000000000000000000000000000 - 00000000000000000000000042231814141413141418181B3100000000000000 - 0000000000000000000000000000000000000000000000000000311814141414 - 141414141414141414141F420000000000000000000000000000000000000000 - 00000000000000003F14141414181F2A2F5154542F2B2218181414141F000000 - 00000000000000000000000000000000000000000000001F1314141F3969BB9C - 9CB0AFAFAF9D9471511F181414143F0000000000000000000000000000000000 - 000000000000181814183B729DAFB2B5B5B5B5C1B5B5B3B09D94531F18141331 - 000000000000000000000000000000000000000000181814236F9BAFAEB4B5B5 - B5B5B5B5B5B5B5B5B4B2AF912B18161323000000000000000000000000000000 - 000000001818182BBB9AAAAEB4B9B9B9B9B9B9B9B5B9BAB9B5B9B2AF96511818 - 183100000000000000000000000000000000002018182B929AACB7B7B7B7B7B7 - B8B8B8B8B7B9B7B9B9B8B7B7AF9A531818183F00000000000000000000000000 - 00003F14142ABBA1ABB6B6B6B6B6B6B6B6B6B7B7B7B7B7AFAFB7B7B7B69A962F - 18161800000000000000000000000000000018141F6E8BA3A84A2C2D2D8FB6B6 - B6B6A8A8B6B6B650214F5BACB6ACA38F2A161423000000000000000000000000 - 00311814558CA0A7A38804181F29A3A8A7A8A8A8B6A7A11F1F201F21508DA3A3 - 671818180000000000000000000000000014142292A0A4A7A2A710131B185AA7 - A7A7A7A7A2A74B1F1B1B1B1B1812A8A4872F1814230000000000000000000000 - 4218145F8A9FA4A2A7A28B0218180CA4A2A2A2A2A7A20C19160301130484A7A4 - A07018181800000000000000000000001F141F7286A2A2A2A2A2A24504181449 - A2A4A2A2A25916191410460506A4A2A486882A18183F00000000000000000000 - 14142A9B86A2A2A2A2A2A286071314178AA2A2A2A21116140383A2A285A2A2A2 - A28553181418000000000000000000001414568A9FA2A2A2A2A2A2A24D041314 - 47A2A2A28B1616140BA2A2A2A2A2A2A2A28670181818D10000000000000000D1 - 18186385A2A2A2A2A2A2A2A2A20913141684A7A24A1614044DA2A2A2A2A2A2A2 - A286901F14182300000000000000003F14186E86A2A2A2A2A2A2A2A2A2580114 - 160EA2A20C14140886A2A2A2A2A2A2A2A29F8F2216141800000000000000003F - 13187586A2A2A2A2A2A2A2A2A2A20D131414598413141310A2A2A2A2A2A2A2A2 - A29F952318141431000000000000003718187586A2A2A2A2A2A2A2A2A2A28401 - 13181E4814140481A2A2A2A2A2A2A2A2A29F952816141418000000000000003F - 13187785A2A2A2A2A2A2A2A2A2A2A21013181F181B180AA2A2A2A2A2A2A2A2A2 - A29F8F22141414143F000000000000D418186385A2A2A2A2A2A2A2A2A7A8B79A - 1723232723204EB6A8A2A2A2A2A2A2A2A286911F141414141B00000000000000 - 1418568786A2A2A2A2A2A7B7B8B9B9B94C2731313122B0B9B9B8A8A2A2A2A2A2 - A28667181614141414D300000000000014182A999FA2A2A2A2A7B8BABAC1C1C1 - B52B37373752C1B5C1B5BAB6A2A2A2A2A2855416141414141423000000000000 - 1F141D7586A2A2A2A2C1C3C3C3C3C3C3C37A403F37BDC3C3C3C4C3C3A8A2A2A2 - 9F952A14141414141414000000000000D118185E8B86A2A2B8C7C7C7C7C7C7C7 - C762D1D157C5C7C7C7C7C7C7C3A2A2A2866C1818141414141414330000000000 - 00141422BC86A2A2C1CCCCCCCCCCCCCCBED4D4D47ECCCCCCCCCCCCCCCCA7A286 - 893B141818181B18181418000000000000401414568986A2C7CFCFCFCFE1DBD9 - D9D8D8D6C9CFCFCFCFCFCFCFCFA7A2866B181D7D7F7F7F7F5616184000000000 - 000018141F7B869FC1EEEEEEEEE2DEDEDEDEDEDBEEEEEEEEEEEEEEEECFA28690 - 2A1618BEEE807C7C3B16141F000000000000DF1314237886A3EEF3F3F3E4DEDE - DEDEDEE8F3F3F3F3F3F3F3F3C286963B1318182ECA7F23141414141400000000 - 00000037131832BC86B4F8F8F8EAE6E6E6E6E5F6F8F8F8F8F8F8F8CDA0965518 - 181618185DEE661B1414141433000000000000001F16182A798AB0F2FBFBFBFB - FBFBFBFBFBFBFBFBFBF9CC8B8F3B181414141414187DED60181414141F000000 - 000000000018181822659B8BC6F9FFFFFFFFFFFFFFFFFFFCECB0877135181814 - 14141414181FE7F4311814141B0000000000000000001F141418397B9B8AB0CC - EDF2F6F6F3CAC08C8973551F141414141414181F1F1735FBD518141420000000 - 0000000000000034141814183564789389878B87879B736D3C1D181414141414 - 14141DF5DD182AFADA181414420000000000000000000000E018181814181C23 - 3A3C56563A2A1F181818131414141414141418E3FEDDEBFE4114141B00000000 - 00000000000000000000D1181814181818181414141414181418181414141414 - 1416181FDBE9E661181814000000000000000000000000000000000000371814 - 1414141414141414141414141414141414141418181818181823000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF - FFFFFFFF0000FFFFFFFFFFFF0000FFFFC0FFFFFF0000FFFC001FFFFF0000FFF0 - 0003FFFF0000FFC00001FFFF0000FF8000007FFF0000FF0000003FFF0000FE00 - 00001FFF0000FC0000000FFF0000F800000007FF0000F000000007FF0000F000 - 000003FF0000E000000003FF0000E000000001FF0000C000000001FF0000C000 - 000000FF0000C000000000FF0000C0000000007F000080000000007F00008000 - 0000007F000080000000003F000080000000003F000080000000001F00008000 - 0000001F0000C0000000000F0000C0000000000F0000C0000000000F0000C000 - 000000070000E000000000070000E000000000030000F000000000030000F000 - 000000030000F800000000010000FC00000000010000FE00000000010000FF00 - 000000010000FF80000000010000FFC0000000030000FFF0000000070000FFFE - 0000000F0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF - FFFFFFFF0000FFFFFFFFFFFF0000280000002000000040000000010008000000 - 00000004000000000000000000000001000000010000000000003E3D3D003042 - 4C0034444D003D464B002A495A00384B55002C51650024536C003C5968003B5B - 6D0034637B004240400045434300474545004846460046484900454B4F004A48 - 48004C4A4A004C4B4C004D4D4D00504E4E004D4E50004F50500041515B004555 - 5E005050500054525200535455005654540055595900555B5D00565C5E005A59 - 59005D5B5B00595C5D005F5E5E00605F5F00505B6000565F6100585F62005C61 - 61005A6064005261680056676D005C65690057696F005B686B005C6A6E004068 - 7D004E6A790052687100586B71005C6D7100596F7700526D780051717E006261 - 610064636300666464006B6A6A006C6B6B006E6D6D006C75780069767C007170 - 70007473730075747400787777007E7E7E00176288001F678D001D6E98001670 - 9E003B6E890029769E00397D9F001874A3001678AA00247AA700357DA2003C7F - A1004D758700497588005B7B8600507B8E00457A9500647E8900757F82001385 - BF001F88BE002981AE003E82A2003989AF003D88AE002183B500358CB6003C8D - B3003A95BF004D839A004D849C005F82910056879B0051879E005A879E006788 - 9700688997004083A1004583A0004C87A0004D88A3004888A5004488A800468C - AC00498DAB00508EA9004892B5004093B9007699A60071A1B6001E91CB001192 - D4001297DB001698D900199ADA001A9BDD001E9EDE002491C8002999CF002E99 - CE003D97C1003798C6003A98C4003399C900369AC900379BCC003A9AC8002498 - D400239CD700269CD6002E9DD2002B9DD500239EDD0026A1DF0033A2DA000D9A - E2000D9BE4000D9DE6000D9EE900129AE000179DE200149FE600189EE1000EA2 - EE001FA2E50014A1E90010A2EE0012A4EF0015A5EE001CA4EA0019A6EE0019A7 - F0001BA8F00027A6E60029A3E1002BA4E2002BA8E70025A8EB0026ABEF002EAE - EF0033A6E00031A8E40034ABE7003CACE60037AEEB0032AFEF0035AFED003AAF - EA0039B0ED003DB3EE0022AAF00024ABF00027ACF0002AADF0002DAEF10030B0 - F10035B1F10038B2F1003DB4F000439AC300429FCB0040A2D10040A3D40069AD - D00062B0D8007EBAD5004DB0E30049B1E60045B8F20049B9F3004FBAF10058BF - F30059BFF4005EC1F4006DC2ED007DCAEE0074CAF5007FCAF0007CCDF5008281 - 810085848400879396008B94940088969E0096959500989797008F9FA80087AB - BA0088ABBE0099ACB4009EAFB6009BB0BC00A5A4A400A6B3BA00A6B4BA0080B3 - CD0091B9CD00A4BFCC00ADCBD800B1CCD800B9CFD80081CCF2008AD1F60097D4 - F4009FD9F800A3CDE100A1D6F100A1D9F500ADDEF700A0DAF800B5E2F9000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 3F1E161616162244000000000000000000000000000000000000000000001E12 - 12161216160F121212220000000000000000000000000000000000003A12161F - 5675BFC1C1BE7038161612440000000000000000000000000000001E121E7091 - ADB1B4B4B4B4B2AD8439160F3A000000000000000000000000001E123488A7B1 - BBBBBBBBBBBCBBBCB1A57116163A00000000000000000000003A162D8EA8B7B7 - B7B7B7B7BBB9B9BBB7B1A461160F4600000000000000000000121F82A0804D52 - A5B6B6B6B6B6A5395FA5A89B6D16120000000000000000001E1672989F990416 - 4BA2A2A2A2A3511E1B1E327F7E34123F0000000000000000122E7C9F9D9F490F - 16799F9F9F9F1A16010F069F9F61121600000000000000440F70939D9D9D9502 - 0F0A9D9D9D5B120F4A474A9F957B280FD20000000000001E1684959D9D9D9D4F - 0C0F609D9D0B0F039D9D9D9D9D93540F1E000000000000121E8B9D9D9D9D9A9D - 050F199593100F489D9D9D9D9D935D120F0000000000000F2A7C9D9D9A9A9A9D - 5A010F4C5012017A9D9D9A9A9A9A5E0F122200000000000F2A7C9D9D9D9A9A9A - 9A080F11090F079D9D9A9A9A9A955E0F161600000000000F1F8B9D9D9A9A9A9D - 9F8B161F221E5C9F9D9A9A9A9A945D0F0F0F3F000000001E1684959D9A9AA3BB - BBBB573A3D29B1BBB99D9A9A9A94540F0F0F1600000000441268939D9AA3C8C8 - C8C8C5444469C8C8C8C89D9D9A7A28100F0F12D200000000122A7E9A9DCACCCC - CCCCC2D2D2C3CCCCCCCCBD9A9561160F12120F1E00000000221674939FCFCFCF - E2DBD9D7D6CFCFCFCFCFCA9D7B2D276A6A6A2A1000000000000F1F8893D1E9E9 - DEDFDFDFE3E9E9E9E9E9C89264102CCE77581F0F3A00000000D50F318EB4EEF0 - E4E1E1E1EDF0F0F0F0E99871150F1066C41E11121200000000002E102A84AEEE - F1F1F1F1F1F1F1F1E88F6E150F0F0F0F78DA160F120000000000002E161D688E - C5D0EEEFEFEACDAB633716120F0F16151DEC40121200000000000000D40F121F - 5574638884766537160F0F0F0F0F41E61FE55912160000000000000000003A0F - 0F0F1616160F12121212120F0F0F16DCE7DC1B12000000000000000000000000 - D83F1E0F0F1212120F120F0F0F0F0F0F16163D00000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF - FFFFFFC03FFFFF000FFFFC0003FFF80001FFF00000FFE000007FE000007FC000 - 003FC000003F8000001F8000001F8000001F8000000F8000000F800000078000 - 000780000003C0000003C0000003E0000001E0000001F0000001F8000001FC00 - 0001FF000003FFC00007FFFFFFFFFFFFFFFFFFFFFFFF28000000180000003000 - 0000010008000000000040020000000000000000000000010000000100000000 - 00003E41430039424800384851002C5B73002B5C7600345E7300464444004846 - 460045494C004A4848004C4A4A004E4D4D00454B50004D51530041525C004656 - 5F004F595D005151510054535300535455005554540058565600525859005559 - 5A00525B5E00545A5C00525C5F005B5A5A005C5B5B00595E5F005E5D5D00605F - 5F0043576200455862004F5F6800535B6000525D6100585F62004D616A005061 - 67005461670059606300596264005262690056676D00516872004F707E006065 - 670061676A006A6969006E6D6D00706F6F006972760064747D00727171007473 - 73001D6F9A002164860033658000226A900029779F003E7894001478AC00436B - 8100466F82004A7183004C74850048758A004D7A8E005D7C8B0042779300497A - 90004F7F9400467F9900497F9800607C8B001682B9003882A8002686B800348B - B500398EB5003D8EB400318CB9006E8089004583A0004A87A2004789A800428B - AD00438EB0004590B5005499BC00729FB20075A3BB001386C1001D8AC1001192 - D4001694D5001E95D1001799DB00129ADF001D9AD9001F9FDF002D95CA003296 - C6002FA0DA0037A1D6003CA1D30031A2DB0039A6DC000F9AE0000D9CE6000D9E - E900109AE0000DA0EB000DA2EE0018A1E70010A0E90011A3EE0011A4EF0014A4 - EE001CA8EF001EA9F00022A1E10027A5E5002DA7E50023A7EA002EABEB002EAC - EC0036AAE50035AFEE0039ADE80022AAF00026ACF00029ADF0002CAEF00036B2 - F10038B3F1003FB5F20042A0CC0049A9D7006AA7C70076B2CD007AB1C80046AE - E30054B3E30056B5E5005BB8E70045B7F10046B8F2004DBAF30062C2F40066C4 - F4007FCEF60081818100868686008A8989009897970099989800989C9E009E9D - 9E009CA0A3008BA5B000A2AEAE00A7B1B600B2B1B1008DB9CC00A9BDC500A2BF - CD0085C0DE009FCDE50080CBF20086CEF20091D4F6009CD7F6009CD8F800B8E3 - F900B9E4FA000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000331F1F1F370000000000 - 00000000000000000000009C0C08122528190C08120000000000000000000000 - 0000200C2E5A6D8183816B55190833000000000000000000001F0C557D828889 - 898989826C420C320000000000000000370C5284858686868686827F867C4408 - 9B000000000000000C4B74621040797A85794E25476766270C00000000000033 - 19657676050C4F767676220A080676500A9B00000000000C4470737360011070 - 765F08053F5E7671190C00000000000851737373733A083D733B084D73737370 - 400C00000000000C68737373736E020D60090373737373733E081F0000000008 - 6873737373733908220C3C73737373703E080800000000085173737376867F23 - 201F69847673736E410A08340000000C456E737A9595955B374C949589767371 - 2508080C00000037196673969797975D9B8D9797978873500C080C089B000000 - 08496E9799A9A1A0A0ABAB99999463284C8F5C2512000000A30C5983AFAAA4A4 - A8AFAFAFAD7B420C0E8E26080800000000360C5690AEB1B1B1B1B1996B2F0808 - 0828A612089C00000000540C28598C9293928B4B190808083530A23508000000 - 0000000016080C262B190C080808080831A7A71220000000000000000000A5A0 - 9D9D9D9D9D9D9D9D9DA0A0A50000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000FFFF - FF00FFFFFF00FF07FF00F801FF00F0007F00E0003F00C0001F00C0001F008000 - 0F0080000F0080000F008000070080000700800003008000030080000100C000 - 0100C0000100E0000000F0000100FC000100FF000300FFFFFF00FFFFFF002800 - 0000100000002000000001000800000000000001000000000000000000000001 - 000000010000000000003D525D00315467002E5F79004345470048464600434A - 4E004A4949004D4D4E00514F4F004F5050004D5357004A585E004C585E005152 - 52005253540053545500555758005E5D5D00475C67004A5A6200525D62004F60 - 67004B606B0058686F00436677004D6671004A6774004B68760042667800466C - 7E00496A7900486D7D0069686800647077007171710031698600306B8A003B7C - 9B003C7C9A00187FB4002F7CA3002B7DA700437085004372880047758B004777 - 8E005E7D8C001E87BC002D8AB8002D8CBB005B8094006B899600718793007A9A - A80078A4BB001386C2001C8CC6001196DA003B97C5003295C800359BCF002199 - D500249EDC002E9FD8002AA0DB0037A0D40031A2DC000F9DE600139BE0000DA0 - EA000EA2EE0014A3EB0015A5EF0027AAEC003CADE60036AFEC0027ACF00029AD - F0002CAEF00035B1F1003AB3F0003DB5F1004E9BC10058AAD20071B8DD0040B5 - F10069C5F500818080008B8A8A008D8D8D00808E95008599A40097A9B100A6AC - AF00A9AEAF00AEB5B500A3B2BA00B4B4B40097CFEB0083CBF0008DD0F20090D4 - F70095D6F70095D6F800ABDEF800AFDFF8000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000058580000 - 000000000000000000580A1B2E2E17085900000000000000211C424C51514C3B - 14230000000000591F3F3C4A4D4E3D43410C00000000000F3E48012948491708 - 293209000000001E46462806453904383A440C00000062264647470225240346 - 47461D1200006226464747390A0B304747461D050000001F4649525233225650 - 47460B08210000113E5257555C3757574F3215180F0000601F4B68615E636868 - 410C2F3408590000351B54656A6A64530C0508360F230000005F0F1B2E2B1408 - 05055B5D11000000000000000000000000000000000000000000000000000000 - 000000000000FFFF0000FCFF0000E01F0000C00F0000800F0000800700008007 - 00000003000000030000800100008001000080000000C0000000E0010000FFFF - 0000FFFF00002800000080000000000100000100200000000000000801000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000007F7F - 7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F7F017F7F - 7F01000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000100000002000000040000000500000007000000080000000A0000 - 000C0000000D0000000D0000000E0000000E0000000E0000000D0000000D0000 - 000C0000000A0000000800000007000000050000000300000002000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000100000003000000050000 - 00090000000C0000001000000014000000180000001C0000001F000000230000 - 0025000000270000002800000028000000280000002800000028000000270000 - 0025000000220000001F0000001C00000017000000130000000F0000000B0000 - 0007000000040000000200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000100000003000000070000000C00000012000000180000 - 001F000000250000002C00000032000000370000003B0000003E000000410000 - 0043000000450000004500000046000000460000004600000045000000450000 - 0043000000410000003E0000003B00000036000000310000002B000000240000 - 001D00000016000000100000000A000000060000000300000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0003000000070000000C000000130000001B000000250000002E000000360000 - 003D00000043000000480000004B0000004E0000005100000052000000540000 - 0055000000550000005500000056000000560000005600000055000000550000 - 00540000005400000052000000500000004E0000004B00000047000000420000 - 003B000000340000002B0000002200000019000000110000000A000000050000 - 0001000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001211110100000004000000090000 - 00100000001A00000025000000300000003A00000042000000490000004E0000 - 005203030357161616761F1E1E91242323A9343333BE3D3C3CD0403E3ED84543 - 43EA454343EA454343EA454343EA454343EA454343EA454343EA403E3ED83C3A - 3ACD323131BB232222A71E1D1D8C141414720000005700000056000000540000 - 00510000004C0000004700000040000000370000002C00000020000000160000 - 000E000000070000000300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000012111101000000040000000A000000130000001F0000 - 002B00000037000000410000004A000000500908085E1F1E1E902D2C2CB54240 - 40E0484646FC494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF474545F73F3D3DD5292828AC1A1A - 1A820505055D00000056000000530000004E000000470000003E000000330000 - 00260000001A0000001000000008000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000012111101000000040000000A00000014000000210000002F0000003B0000 - 00460000004E0F0F0F69262525A5403E3ED7494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF474545F7393737C8201F1F940707076000000055000000510000004B0000 - 0043000000370000002A0000001B000000100000000700000002000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00030000000800000012000000200000002F0000003D0000004805050555201F - 1F94403E3ED7494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF474545F7343232C01817177D000000570000 - 00540000004E0000004400000038000000290000001A0000000E000000061211 - 1101000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000012111101000000050000 - 000F0000001C0000002C0000003B000000480B0B0B612E2D2DB2474545F44947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF413F3FE02221 - 21970302025A000000540000004E000000440000003600000026000000160000 - 000B000000031211110100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000300000009000000160000 - 002600000037000000460D0D0D65353333BF484646FA494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF454444EF262525A10505055C000000540000004C00000041000000310000 - 001F000000100000000712111101000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000002F3F3F01000000050000000E0000001D0000002F0000 - 0040090909572F2E2EB3484646FA494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4A48 - 48FF4A4949FF4A4949FF4A4949FF4A4949FF4A4848FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF444242E7212020940000005700000052000000490000 - 003A00000028000000170000000A000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000002F3F3F0100000007000000130000002400000037000000472524 - 2497474545F4494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4949FF4C4B4BFF4F4F4FFF515353FF555757FF585C5CFF5B6060FF5D63 - 63FF5F6565FF606767FF606767FF5F6565FF5E6363FF5C6060FF585C5CFF5558 - 58FF525353FF4F4F4FFF4C4C4CFF4B4949FF494848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF3F3D3DDB12121277000000550000 - 004E00000042000000300000001D0000000E000000052F3F3F01000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000020000000A000000170000002A0000003E111111673F3D3DD94947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4A4949FF4D4C4CFF515252FF585B - 5BFF5F6565FF677070FF707B7BFF778787FF7D9293FF7D999EFF7B9EA7FF76A1 - ADFF72A2B1FF70A2B3FF70A2B3FF70A1B2FF73A0AEFF779EA9FF7B9AA0FF7B92 - 95FF78898AFF717E7EFF697272FF616767FF595C5CFF525353FF4D4D4DFF4B49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF484646FC2F2E2EB30505 - 055C0000005200000048000000370000002300000011000000062F3F3F010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00030000000C0000001B0000002F000000422928289B484646F9494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF4D4D4DFF535555FF5C6060FF687070FF768484FF7F97 - 9AFF74A1AEFF5DA1BCFF479FC6FF379DCDFF2899D1FF1F97D2FF1E96D4FF2098 - D5FF229AD6FF249BD7FF259BD7FF229AD6FF2199D6FF1E96D4FF1D96D3FF2197 - D1FF2D9ACFFF3C9CC8FF4F9DBEFF669EB2FF78989FFF778788FF6A7474FF5D63 - 63FF545656FF4E4E4EFF4A4949FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4341 - 41E512121277000000550000004B0000003C0000002800000014000000073F3F - 3F01000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000030000 - 000D0000001E000000330B0A0A543B3939CD494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B4A - 4AFF505151FF595D5DFF677070FF798889FF7E9EA5FF65A4BCFF409FCAFF2498 - D1FF1E97D5FF269CD8FF2CA0DBFF2EA2DDFF30A3DEFF31A4DFFF32A5E0FF33A6 - E1FF33A6E1FF34A6E1FF34A6E1FF34A6E1FF33A6E1FF33A5E0FF32A5E0FF31A4 - DFFF30A2DDFF2DA1DCFF279DD9FF1F98D6FF1B94D2FF2C99CDFF4E9DBFFF709D - ABFF798C8EFF6A7474FF5C6060FF515252FF4C4B4BFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF484646FC2726269F000000560000004E000000400000002B000000170000 - 0008000000020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000030000000D0000 - 001F0000003513121269444242E9494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4B4BFF525353FF5E63 - 63FF707C7CFF80999CFF6BA5BAFF3A9ECCFF2097D3FF239AD7FF2BA0DBFF2EA2 - DDFF30A4DFFF32A6E1FF34A7E2FF35A9E4FF37AAE5FF37ABE6FF38ACE6FF39AC - E7FF39ADE8FF3AADE8FF3AADE8FF3AADE8FF3AACE7FF39ACE7FF38ACE6FF38AB - E6FF37AAE5FF35A9E3FF33A7E2FF32A5E0FF30A4DFFF2DA1DCFF269CD8FF1B95 - D4FF2697CFFF4D9DBFFF7599A3FF738181FF606767FF535555FF4C4C4CFF4948 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF363434C30707075E00000050000000420000002D0000 - 0018000000090000000200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000030000000D0000001F0000 - 0036201F1F80474545F7494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4B4A4AFF515252FF5F6464FF738080FF80A0 - A6FF57A4C3FF2899D1FF2198D6FF2A9FDBFF2DA2DEFF30A5E0FF32A7E3FF34A9 - E5FF36ABE7FF37ACE8FF39AEE9FF3AAEEAFF3BAFEBFF3CB1ECFF3DB1ECFF3DB1 - ECFF3DB1EDFF3EB2EDFF3EB2EDFF3EB2EDFF3EB1ECFF3EB1ECFF3DB1ECFF3DB0 - ECFF3CB0EBFF3BAEEAFF3AAEE9FF38ACE8FF37ABE6FF34A8E4FF32A6E1FF30A4 - DFFF2CA1DCFF239BD8FF1994D2FF389AC8FF6C9DADFF758587FF616868FF5355 - 55FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF3F3D3DDD0B0B0B6700000051000000440000 - 002F000000190000000903223202000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000030000000C0000001F000000362928 - 2894484646FC494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF4F4F4FFF5B6060FF717C7CFF82A0A5FF51A3C5FF2398 - D2FF249BD8FF2AA0DCFF2DA3E0FF30A6E3FF32A8E5FF35ABE7FF36ACE9FF38AE - EAFF39B0EBFF3BB0ECFF3CB1EDFF3DB2EEFF3DB3EEFF3EB3EFFF3EB3EFFF3FB4 - F0FF3FB4F0FF3FB4F0FF40B4F0FF40B4F0FF40B4F0FF40B4EFFF3FB4EFFF3FB3 - EFFF3EB2EEFF3EB2EEFF3DB2EDFF3CB1ECFF3BB0EBFF39AEEAFF37ADE9FF35AA - E6FF33A8E4FF30A5E1FF2DA2DEFF279DDAFF1A95D3FF3099CAFF6A9CAEFF7483 - 83FF5E6464FF505151FF4A4949FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF444242EA0F0E0E71000000520000 - 00440000002F00000018000000082F3F3F010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000020000000B0000001D000000352A2929974947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4C4B4BFF555858FF687171FF81989AFF5EA6C2FF2498D1FF249BD8FF29A0 - DCFF2CA4E0FF2FA6E3FF31A9E6FF34ABE9FF36AEEAFF38AFECFF39B0EDFF3AB1 - EEFF3BB2EFFF3CB3EFFF3DB3F0FF3DB4F0FF3DB4F1FF3EB5F1FF3EB5F1FF3EB5 - F1FF3EB5F1FF3FB5F1FF3FB5F2FF3FB5F1FF3FB5F2FF3FB5F2FF3FB5F1FF3FB5 - F1FF3FB5F1FF3FB4F0FF3EB4F0FF3EB3EFFF3DB3EFFF3CB2EDFF3BB1ECFF39AF - EBFF37ADEAFF35ABE8FF32A9E5FF2FA6E2FF2CA2DFFF269DDAFF1894D3FF3699 - C7FF7399A4FF6C7777FF585B5BFF4D4C4CFF494848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF454444EF121111740000 - 0052000000430000002D00000017000000072F3F3F0100000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000002F3F3F01000000090000001A000000322B292996494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4F4F - 4FFF5D6262FF778686FF79A8B5FF319CCEFF2098D6FF279EDBFF2AA2DFFF2DA6 - E3FF30A9E7FF32ABEAFF35ADEBFF37AFEDFF38B0EEFF39B1EFFF39B2F0FF39B3 - F0FF3AB3F0FF3BB4F1FF3BB4F1FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5 - F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3EB5 - F2FF3EB5F2FF3EB5F1FF3EB5F1FF3DB4F1FF3DB4F1FF3DB3F0FF3CB3EFFF3BB2 - EFFF3AB1EDFF39AFECFF37AEEAFF34ABE8FF31A8E5FF2DA5E2FF2AA1DEFF239B - D9FF1893D1FF519DBDFF768C8FFF616767FF515252FF4A4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF474545F71413 - 137C00000051000000420000002B00000014000000062F3F3F01000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002F3F3F0100000007000000160000002F2B2A2A94494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF535454FF666E - 6EFF829A9CFF55A5C6FF1F96D3FF249CDAFF27A0DEFF2AA4E3FF2DA8E6FF30AA - E9FF32ADEBFF34AEEDFF36B0EEFF37B1EFFF38B2F0FF38B2F0FF39B2F1FF39B3 - F1FF39B3F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF3AB4F2FF3AB4F2FF3AB4 - F2FF3AB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4 - F2FF3CB4F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB5F2FF3CB4F1FF3BB4F1FF3BB4 - F0FF3AB3F0FF39B2EFFF39B1EEFF38AFECFF35ADEBFF32AAE8FF2FA7E4FF2BA3 - E0FF289FDCFF1C97D6FF2B98CBFF6F99A7FF6A7575FF555757FF4C4B4BFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4544 - 44EF0F0E0E71000000500000003F000000270000001100000004000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000500000012000000292322227E494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4C4B4BFF565858FF6E7979FF81A5 - ADFF369DCEFF1E97D6FF249EDCFF28A2E1FF2AA5E5FF2DA9E8FF2FACEAFF31AD - ECFF33AFEEFF34B0EFFF35B1F0FF35B1F1FF36B2F1FF36B2F2FF37B2F2FF37B3 - F2FF37B3F2FF37B3F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3 - F2FF38B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 - F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B4F2FF39B3 - F1FF39B3F1FF39B3F0FF39B2F0FF38B1EFFF37B0EEFF35AEECFF32ACEAFF2FA9 - E7FF2CA5E3FF29A1DEFF229BD9FF1A93D1FF599DB8FF728081FF595D5DFF4C4C - 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF454444EF0C0C0C680000004E0000003B000000220000000D000000030000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00030000000D0000002315141465484646F9494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4C4C4CFF595D5DFF758383FF79AAB9FF2598 - D1FF209AD8FF249FDDFF27A3E2FF29A7E6FF2CAAEAFF2EACECFF30ADEEFF31AF - EFFF32AFF0FF32B0F1FF33B0F1FF33B1F1FF33B1F1FF34B1F1FF34B1F2FF34B1 - F2FF34B1F2FF35B1F2FF35B1F2FF35B1F2FF35B2F2FF35B2F2FF36B2F2FF36B2 - F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B3F2FF37B3 - F2FF37B3F2FF37B3F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3F2FF38B3 - F2FF38B3F2FF38B3F2FF38B2F1FF37B2F0FF37B1F0FF36B0EFFF34AEEDFF32AD - EBFF2FAAE9FF2BA6E5FF28A2E0FF249DDCFF1694D3FF469CC2FF778A8DFF5C61 - 61FF4E4E4EFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF424040E50707075D0000004B000000360000001D0000000A2F3F - 3F01000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002F3F3F010000 - 00090000001C0D0D0D4B464444ED494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4D4C4CFF5B6060FF7A8A8AFF6BAAC1FF1D95D2FF209A - D9FF239FDEFF26A3E4FF29A7E8FF2BAAEBFF2CABEDFF2EADEEFF2FAFEFFF2FAF - F0FF30AFF0FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF32B0 - F1FF32B0F1FF32B1F1FF32B1F1FF32B1F1FF32B1F1FF33B1F1FF33B1F1FF33B1 - F1FF33B1F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF34B1F2FF34B1F2FF35B1 - F2FF35B1F2FF35B1F2FF35B1F2FF35B2F2FF35B2F2FF35B2F2FF36B2F2FF36B2 - F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF36B1F1FF35B1F0FF34B0F0FF33AF - EEFF31ADECFF2FABEAFF2BA7E7FF28A3E2FF249EDDFF1995D5FF3298C8FF7891 - 95FF5F6565FF4E4E4EFF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF3A3939D003030357000000470000002F000000160000 - 0006000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000050000 - 0015040404313F3D3DD2494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4D4C4CFF5C6161FF7D8D8EFF61A8C5FF1A95D3FF1E9ADAFF22A0 - E0FF24A4E5FF27A7E9FF29AAEBFF2AABEDFF2BADEFFF2CAEEFFF2DAEF0FF2DAF - F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FB0 - F1FF2FB0F1FF2FB0F1FF2FB0F1FF2FB0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 - F1FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0 - F1FF32B0F1FF32B0F1FF32B1F1FF32B1F1FF32B1F1FF32B1F1FF33B1F1FF33B1 - F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B1F1FF33B0F1FF32B0 - F0FF31AFEFFF30ADEDFF2DABEAFF2AA7E7FF27A4E3FF249FDDFF1A96D7FF2996 - CBFF75939AFF606767FF4E4E4EFF4A4848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF2E2C2CAE0000005200000041000000270000 - 0010000000030000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000030000000E0000 - 0025302F2FA2494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4C4B4BFF5B5F5FFF7C8D8EFF62AAC6FF1894D3FF1D9ADBFF209FE1FF23A4 - E6FF26A7E9FF28A9EBFF28ABEEFF29ACEFFF29ADF0FF2AADF0FF2AAEF1FF2BAE - F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAFF1FF2CAF - F1FF2CAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2EAF - F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FB0F1FF2FB0 - F1FF2FB0F1FF2FB0F1FF2FB0F1FF2FB0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 - F1FF30B0F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31B0F1FF31AF - F0FF30AFF0FF2FAEEFFF2EADEDFF2CAAEBFF29A8E8FF26A3E3FF229EDEFF1A97 - D7FF2895CBFF75939AFF5F6565FF4E4E4EFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF1B1B1B860000004E000000390000 - 001F0000000A1211110100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000012111101000000080000001B1A19 - 1966494747FF494747FF494747FF494747FF494747FF494747FF494747FF4C4B - 4BFF585C5CFF798989FF67ABC4FF1894D3FF1B9ADAFF1E9EE0FF21A3E5FF24A7 - E9FF25A8ECFF27AAEEFF27ABEFFF28ACF0FF28ADF1FF28ADF1FF28ADF1FF28AD - F1FF28ADF1FF28ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD - F1FF29ADF1FF2AADF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2BAE - F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAF - F1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAF - F1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAFF1FF2EAF - F1FF2EAFF0FF2EAEF0FF2DAEEFFF2CACEDFF2AAAECFF28A7E9FF24A2E4FF219E - DEFF1997D7FF2896CBFF789195FF5C6161FF4C4C4CFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF464444F20A0A0A62000000480000 - 0030000000150000000500000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000400000012090909344543 - 43E6494747FF494747FF494747FF494747FF494747FF494747FF4B4949FF5558 - 58FF748181FF73ADC0FF1793D2FF1A99DAFF1C9EE0FF1FA2E5FF22A6E9FF23A8 - ECFF24A9EEFF25ABEFFF25ABF0FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF27AC - F1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF28AD - F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28AD - F1FF28ADF1FF28ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD - F1FF2AADF1FF2AADF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2AAEF1FF2BAE - F1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAEF1FF2CAF - F1FF2CAFF1FF2CAEF0FF2BADF0FF2BADEFFF2AABEDFF28AAEBFF26A6E8FF23A2 - E4FF1F9DDEFF1796D6FF3298C8FF768A8DFF595D5DFF4C4B4BFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF373535C8000000510000 - 0040000000240000000D00000002000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000121111010000000A0000001F313030A64947 - 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF525353FF6D78 - 78FF80ACB7FF1F96D1FF1897D9FF1A9DDFFF1CA1E5FF1FA5E9FF21A7ECFF22A9 - EEFF22AAEFFF23AAF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24ABF0FF24AB - F0FF24ABF0FF24ABF0FF24ABF0FF25ABF0FF25ABF0FF25ACF1FF25ACF1FF25AC - F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF26ACF1FF27ACF1FF27AC - F1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF27ACF1FF28AD - F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF3F83 - A5FF3B8FBAFF2BA9E9FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF29AD - F1FF2AADF1FF29ADF1FF29ADF0FF29ADF0FF29ACEFFF28ABEDFF27A8EBFF24A6 - E8FF21A1E3FF1D9CDDFF1594D5FF469CC2FF728081FF555757FF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF1F1E1E8D0000 - 004C000000350000001900000007000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000040000001417171754484646FC4947 - 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF656C6CFF85A5 - AAFF299AD0FF1696D7FF189BDEFF1AA0E4FF1DA4E9FF1EA6EBFF1FA8EDFF20A9 - EEFF20A9EFFF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AA - F0FF22AAF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF23ABF0FF23AB - F0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24ABF0FF24AB - F0FF24ABF0FF24ABF0FF24ABF0FF24ABF0FF25ABF0FF25ACF1FF25ACF1FF25AC - F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF26ACF1FF26ACF1FF2AA3E1FF5658 - 5AFF5B5959FF595D60FF497790FF3596C8FF28ABEEFF27ACF1FF27ACF1FF28AD - F1FF28ADF1FF28ADF1FF28ADF1FF28ADF1FF28ACF0FF27ABEFFF26A9EDFF24A8 - EBFF21A4E7FF1FA0E2FF1B9ADBFF1292D2FF599CB8FF6A7575FF515252FF4948 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF454343EC0707 - 075B00000043000000270000000F000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000010000000B00000021413F3FCC494747FF4947 - 47FF494747FF494747FF494747FF494747FF4C4B4BFF5C6161FF839798FF46A3 - CCFF1494D5FF169ADCFF189EE2FF1BA2E7FF1CA5EAFF1DA7EDFF1DA8EEFF1DA8 - EFFF1FA5E9FF2E3B42FF3E3D3DFF4C4A4AFF535252FF565454FF565454FF5654 - 54FF565454FF565454FF555454FF3B7898FF20A9F0FF20AAF0FF20AAF0FF20AA - F0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF22AA - F0FF22AAF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF22ABF0FF23ABF0FF23AB - F0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF3A81A5FF5856 - 56FF595858FF595858FF595858FF5A5858FF546169FF427E9DFF2F9CD4FF25AC - F1FF25ACF1FF25ACF1FF26ACF1FF26ACF1FF25ACF1FF25ABF0FF25AAEFFF24A9 - EDFF22A6EAFF1FA3E6FF1C9EE0FF1999DAFF1892D0FF6F99A7FF616767FF4D4C - 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2E2D - 2DB00000004D000000360000001A000000070000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000004000000141F1E1E6D494747FF494747FF4947 - 47FF494747FF494747FF494747FF4A4848FF545656FF758282FF6CADC4FF1292 - D2FF1597DAFF169DE1FF18A1E7FF1AA4EAFF1AA6EDFF1BA7EEFF1BA7EFFF1CA8 - F0FF1CA8F0FF2277A2FF343333FF434242FF4F4D4DFF535151FF545353FF5453 - 53FF545353FF545353FF545353FF515253FF249CD9FF1EA9F0FF1EA9F0FF1EA9 - F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF1FA9F0FF1FA9F0FF1FA9F0FF1FA9 - F0FF1FA9F0FF20A9F0FF20A9F0FF20A9F0FF20AAF0FF20AAF0FF20AAF0FF20AA - F0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF21AAF0FF22A9EDFF4D5A61FF5755 - 55FF585656FF585656FF585656FF585656FF585656FF585656FF585757FF4F67 - 73FF3B86ACFF28A3E1FF23ABF0FF23ABF0FF23ABF0FF23AAF0FF23AAEFFF22A9 - EEFF22A7ECFF1FA5E9FF1CA1E5FF1A9CDEFF1696D7FF2A97CBFF768C8FFF585B - 5BFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4846 - 46FA0C0C0C6600000043000000270000000E0000000200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000A05050523454343DF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4E4E4EFF666E6EFF87ABB1FF2097D1FF1395 - D8FF159BDFFF169FE5FF17A3E9FF18A4ECFF19A6EEFF19A6EFFF19A7F0FF1AA7 - F0FF1AA8F0FF1AA6EDFF29414DFF393838FF474646FF504E4EFF525050FF5351 - 51FF535151FF535151FF535151FF535151FF3E6B82FF1BA8F0FF1CA8F0FF1CA8 - F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1DA8F0FF1DA9 - F0FF1DA9F0FF1DA9F0FF1DA9F0FF1DA9F0FF1DA9F0FF1EA9F0FF1EA9F0FF1EA9 - F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF1EA9F0FF2D8DBFFF535151FF5654 - 54FF565454FF565454FF565454FF565454FF575555FF575555FF575555FF5755 - 55FF575555FF565657FF486D81FF358CB8FF23A7EBFF21AAF0FF21AAEFFF21A9 - EFFF20A8EDFF1FA6EBFF1DA3E9FF1A9FE3FF189ADCFF1292D4FF519DBDFF6C77 - 77FF505151FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF353333BF0000004C00000034000000170000000500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000030000001127252578494747FF494747FF494747FF4947 - 47FF494747FF494747FF4B4949FF595D5DFF819494FF48A4CDFF1192D5FF1398 - DCFF149DE3FF16A1E8FF17A3EBFF17A5EEFF17A6EFFF17A7F0FF17A7F0FF17A7 - F0FF18A7F0FF18A7F0FF1C82B7FF2F2E2EFF3F3D3DFF4B4949FF504E4EFF514F - 4FFF525050FF525050FF525050FF525050FF504E4EFF2690C6FF19A7F0FF19A7 - F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF1BA8 - F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA8 - F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF40667AFF535151FF5452 - 52FF545353FF545353FF545353FF545353FF545353FF555353FF555353FF5553 - 53FF555353FF555353FF555353FF555353FF53575AFF3F728CFF2A8FC2FF1EA9 - EFFF1EA8EEFF1EA7EDFF1DA5EAFF1AA2E6FF189DE1FF1597D9FF1391D0FF7399 - A4FF5E6464FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF4947 - 47FF484646FC0E0E0E6500000040000000230000000B12111101000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000070000001B444242D8494747FF494747FF494747FF4947 - 47FF494747FF494747FF505151FF6D7878FF7CAFBEFF1090D1FF1196DAFF129B - E1FF149FE7FF15A2EAFF15A4EDFF16A5EFFF16A5EFFF16A6F0FF16A6F0FF17A6 - F0FF17A6F0FF17A6F0FF17A6F0FF23495CFF343333FF434141FF4C4A4AFF4F4D - 4DFF504E4EFF504E4EFF504E4EFF504E4EFF504E4EFF435C6AFF18A5EDFF18A7 - F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF19A7F0FF19A7 - F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF19A7F0FF1AA7F0FF1AA8 - F0FF1AA8F0FF1AA8F0FF1AA8F0FF1AA8F0FF209BDAFF4E4C4CFF535151FF5351 - 51FF535151FF535151FF535151FF535151FF535151FF535151FF535252FF5452 - 52FF545252FF545252FF545252FF545252FF535252FF4F4D4DFF434141FF2E4E - 5EFF1CA7EFFF1CA7EEFF1BA6ECFF1AA3E9FF179FE4FF169ADDFF1294D6FF3699 - C8FF748383FF535555FF494848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF2F2E2EB5000000490000002F0000001300000003000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000010000000D1F1E1E64494747FF494747FF494747FF494747FF4947 - 47FF494747FF4B4A4AFF5C6161FF879D9EFF359ECFFF0F92D6FF1098DDFF119D - E4FF13A0E9FF13A2EBFF14A4EDFF14A5EEFF14A5EFFF14A5EFFF15A6EFFF15A6 - EFFF15A6EFFF15A6EFFF15A6EFFF188DC9FF2A2B2CFF3A3838FF474545FF4D4B - 4BFF4F4D4DFF4F4D4DFF4F4D4DFF4F4D4DFF4F4D4DFF4E4C4CFF2A81AEFF16A6 - F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6F0FF17A6 - F0FF17A6F0FF17A6F0FF17A7F0FF17A7F0FF17A7F0FF17A7F0FF17A7F0FF18A7 - F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF337496FF504E4EFF514F4FFF5250 - 50FF525050FF525050FF525050FF525050FF525050FF525050FF525050FF5250 - 50FF525050FF525050FF525050FF525050FF504E4EFF494747FF3A3939FF246C - 91FF1AA8F0FF1AA7EFFF1AA6EEFF19A4EBFF17A1E7FF159DE1FF1397DAFF0E90 - D2FF699CAEFF616868FF4C4C4CFF494747FF494747FF494747FF494747FF4947 - 47FF494747FF474545F4070707580000003A0000001D00000008000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000400000015413F3FC3494747FF494747FF494747FF494747FF4947 - 47FF494747FF505151FF6F7A7AFF76AFC2FF0E8FD1FF0F95DAFF0F9AE1FF119E - E7FF12A1EAFF12A3EDFF13A4EEFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5 - EFFF13A5EFFF13A5EFFF13A5EFFF14A5EFFF1E5470FF302E2EFF3F3E3EFF4947 - 47FF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF465258FF189F - E4FF15A6EFFF15A6EFFF15A6EFFF15A6EFFF15A6EFFF15A6EFFF16A6F0FF16A6 - F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF16A6F0FF17A6 - F0FF17A6F0FF17A6F0FF17A6F0FF18A3EAFF465158FF4F4D4DFF4F4D4DFF4F4D - 4DFF504E4EFF504E4EFF504E4EFF4F4D4DFF4E4C4CFF4E4C4CFF4E4C4CFF504E - 4EFF514F4FFF514F4FFF514F4FFF514F4FFF4D4B4BFF414040FF323334FF1A9B - DDFF19A7F0FF18A6EFFF18A6EEFF17A5EDFF17A2E9FF159EE5FF1399DFFF1093 - D6FF2F98CAFF758587FF535555FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF2423239900000044000000280000000E000000020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000815141439494747FF494747FF494747FF494747FF494747FF4947 - 47FF4B4949FF5B5F5FFF869D9DFF389FCFFF0D92D6FF0E98DEFF0F9CE4FF10A0 - E8FF10A2ECFF11A3EDFF11A3EEFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF12A4 - EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF1398DBFF26292BFF353434FF4342 - 42FF4B4949FF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4D4B4BFF4C4A4AFF3073 - 95FF13A5EFFF13A5EFFF13A5EFFF13A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5 - EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF15A6EFFF15A6 - EFFF15A6EFFF15A6EFFF15A6EFFF2684B4FF4B4A4AFF4E4C4CFF4E4C4CFF4F4D - 4DFF4F4D4DFF4F4D4DFF4E4C4CFF4B4A4AFF474545FF444242FF454343FF4948 - 48FF4D4B4BFF4E4C4CFF4F4D4DFF4E4C4CFF484646FF393838FF25536BFF17A6 - F0FF17A6F0FF17A6F0FF17A5EFFF16A4EEFF16A3EBFF14A0E8FF129BE2FF1096 - DAFF0E90D1FF6C9DADFF606767FF4C4B4BFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF413F3FDD0000004C0000003400000017000000050000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00010000000D2F2E2E93494747FF494747FF494747FF494747FF494747FF4947 - 47FF4F4F4FFF6B7676FF7FB1BFFF0D8FD1FF0E94D9FF0E99E1FF0F9DE7FF0FA0 - EAFF10A2EDFF10A3EEFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF11A4 - EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF196187FF2C2B2BFF3B3A - 3AFF464444FF4B4949FF4B4949FF4B4949FF4B4949FF4B4949FF4B4949FF474A - 4CFF1998D9FF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF13A5 - EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5EFFF13A5 - EFFF13A5EFFF13A5EFFF13A5EFFF3A5D6FFF4C4A4AFF4D4B4BFF4D4B4BFF4D4B - 4BFF4D4B4BFF4D4B4BFF4C4A4AFF454343FF3B3939FF343232FF353434FF3B3A - 3AFF413F3FFF464444FF4A4848FF494747FF403F3FFF313030FF1A81B6FF15A6 - EFFF15A6EFFF15A6EFFF15A6EFFF15A5EEFF14A3ECFF13A1E9FF119DE4FF0F98 - DDFF0E92D6FF379AC8FF738081FF515252FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF1211116A00000040000000230000000B1211 - 1101000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000300000014464444E1494747FF494747FF494747FF494747FF494747FF4A48 - 48FF575A5AFF819393FF46A4CEFF0C91D5FF0D96DDFF0D9BE4FF0F9FE8FF0FA1 - ECFF0FA2EDFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF10A4EFFF10A4 - EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF109DE5FF222F36FF3231 - 31FF403F3FFF484646FF4A4848FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF34667FFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4 - EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF11A4EFFF12A4 - EFFF12A4EFFF12A4EFFF1A94D3FF484646FF4C4A4AFF4C4A4AFF4C4A4AFF4C4A - 4AFF4C4A4AFF4C4A4AFF484747FF3E3D3DFF2F2E2EFF252424FF242323FF2928 - 28FF302E2EFF363535FF3D3B3BFF3E3C3CFF363535FF273841FF14A5EFFF14A5 - EFFF14A5EFFF14A5EFFF13A5EFFF13A4EEFF12A3EDFF12A1EAFF109EE6FF0F9A - E0FF0E94D9FF0E8FD0FF7499A3FF5C6161FF4A4949FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF2E2D2DB20000004900000030000000140000 - 0004000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00061C1B1B44494747FF494747FF494747FF494747FF494747FF494747FF4C4B - 4BFF636B6BFF8AADB4FF1692D0FF0D93D8FF0D98E0FF0D9DE6FF0E9FEAFF0EA1 - EDFF0FA2EEFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF156D99FF2827 - 27FF393737FF444242FF494747FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF484646FF1C8DC6FF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4 - EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4EFFF10A4 - EFFF10A4EFFF11A4EFFF2C6E90FF494747FF4B4949FF4B4949FF4B4949FF4B49 - 49FF4B4949FF4A4848FF444242FF363434FF224558FF185A7BFF1A252AFF1D1D - 1DFF212020FF252525FF2B2A2AFF2D2B2BFF282828FF1A678EFF12A4EFFF12A4 - EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF11A3EDFF10A1EBFF109FE8FF0E9B - E3FF0E96DCFF0C91D4FF4D9DBFFF6A7474FF4E4E4EFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF474545F4050505550000003C0000001F0000 - 0009000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000A302F2F91494747FF494747FF494747FF494747FF494747FF494747FF5152 - 52FF738080FF69ADC7FF0C90D3FF0D95DBFF0D9AE3FF0E9EE8FF0EA0EBFF0EA2 - EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA0EBFF1E35 - 40FF2F2E2EFF3F3D3DFF474545FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF494747FF3B5767FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF10A4EFFF11A0E9FF404A50FF494747FF4A4848FF4A4848FF4A4848FF4A48 - 48FF4A4848FF474646FF3F3D3DFF2F2E2EFF167BAFFF10A4EFFF109FE8FF1374 - A4FF17394AFF1B1A1AFF1D1D1DFF1F1E1EFF1E2123FF1299DEFF11A4EFFF11A4 - EFFF11A4EFFF11A4EFFF10A4EFFF10A4EFFF10A3EEFF0FA2EDFF0F9FE9FF0E9C - E6FF0D98DFFF0C93D7FF2195CEFF788C8EFF545656FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF24232399000000460000002B0000 - 0011000000030000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000010000 - 000E454343CE494747FF494747FF494747FF494747FF494747FF4A4848FF585C - 5CFF85999AFF3BA1D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1ECFF0EA2 - EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF127A - B0FF262424FF363434FF434141FF484646FF494747FF494747FF494747FF4947 - 47FF494747FF484646FF237FAEFF0EA3EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF2080B2FF474545FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF494747FF454343FF393737FF26333AFF0FA1EBFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF118BC9FF155272FF182025FF154761FF10A4EFFF10A4EFFF10A4 - EFFF10A4EFFF10A4EFFF10A4EFFF0FA3EFFF0FA3EEFF0FA2EDFF0EA0EBFF0E9E - E7FF0D99E1FF0D95DAFF0C8FD1FF709DABFF5E6363FF4B4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF424141E20000004E000000370000 - 001B000000070000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000030E0D - 0D21494747FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF636A - 6AFF8DAFB4FF1592D0FF0D94D8FF0D99E0FF0D9DE6FF0EA0EAFF0EA2EDFF0EA2 - EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF1B4053FF2D2C2CFF3C3A3AFF454343FF484646FF494747FF494747FF4947 - 47FF494747FF484646FF404D54FF109EE6FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0FA3EFFF345D72FF494747FF4A4848FF4A4848FF4A4848FF4A4848FF4A48 - 48FF484646FF413F3FFF323030FF1A5D7FFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0F9EE8FF0F96DAFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0EA2EEFF0EA1ECFF0E9F - E8FF0D9BE4FF0D96DCFF0C91D4FF4E9DBFFF6A7474FF4D4D4DFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF1A19197E000000430000 - 00270000000E1211110200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000042120 - 205A494747FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF6F7B - 7BFF72B0C4FF0C8FD2FF0D95DBFF0D9AE3FF0E9EE8FF0EA0EBFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF1089C7FF242323FF343333FF413F3FFF474545FF494747FF494747FF4947 - 47FF494747FF494747FF484646FF297298FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF1496D8FF444242FF484646FF494747FF494747FF494747FF494747FF4947 - 47FF454343FF3B3939FF2A2828FF118ECEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1EDFF0E9F - E9FF0D9CE6FF0D98DFFF0C92D7FF2897CDFF778788FF525353FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF383636C70000004C0000 - 0033000000170000000500000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000072F2E - 2E8E494747FF494747FF494747FF494747FF494747FF494747FF545656FF7D8E - 8EFF4FA8CEFF0C91D5FF0D97DDFF0D9BE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF19506CFF2B2A2AFF3B3939FF454343FF484646FF494747FF4947 - 47FF494747FF494747FF494747FF444749FF1398DCFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF286F94FF474545FF494747FF494747FF494747FF494747FF494747FF4846 - 46FF424040FF343333FF1F3F50FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0 - EBFF0D9DE7FF0D99E1FF0D94D9FF0F8FD0FF78989FFF595C5CFF494848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF484646FC0E0E0E650000 - 003F000000220000000B12111101000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000094442 - 42BA494747FF494747FF494747FF494747FF494747FF4A4848FF5B5F5FFF8BA1 - A2FF2D9CD0FF0C92D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA1EDFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0F94D7FF222628FF323131FF403E3EFF474545FF494747FF4947 - 47FF494747FF494747FF494747FF484646FF316580FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - ECFF3D4C54FF484646FF494747FF494747FF494747FF494747FF494747FF4644 - 44FF3D3C3CFF2E2D2DFF16709EFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 - EBFF0E9EE8FF0D9AE3FF0D95DBFF0C90D3FF679EB2FF616767FF4B4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF2D2B2BAF0000 - 00490000002F0000001300000004000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000000000B4745 - 45E2494747FF494747FF494747FF494747FF494747FF4B4A4AFF626969FF8FAF - B3FF1491D0FF0D94D9FF0D99E0FF0D9DE7FF0EA0EBFF0EA2EDFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF165E83FF292828FF393838FF444242FF484646FF4947 - 47FF494747FF494747FF494747FF494747FF474545FF198DC9FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1C86 - BDFF454343FF494747FF494747FF494747FF494747FF494747FF484646FF4442 - 42FF383737FF262C30FF0E9CE5FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 - ECFF0E9FE9FF0D9BE4FF0D96DCFF0C91D5FF4E9DBFFF697272FF4C4C4CFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF464444F20505 - 05550000003B0000001E00000009000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F010E0D0D184947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4C4CFF697272FF85B3 - BEFF0C8ED1FF0D95DAFF0D9AE2FF0E9EE7FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0E9AE1FF202B31FF302F2FFF3F3D3DFF474545FF4947 - 47FF494747FF494747FF494747FF494747FF484646FF395869FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF3160 - 79FF474545FF494747FF494747FF494747FF494747FF494747FF474545FF403F - 3FFF323131FF1B536FFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 - EDFF0E9FE9FF0D9CE5FF0D97DEFF0C92D6FF3B9BC8FF717E7EFF4F4F4FFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2322 - 2297000000460000002A00000010000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F011F1E1E374947 - 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF707D7DFF71B0 - C6FF0C90D3FF0D95DBFF0D9AE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF146A96FF282626FF383636FF434242FF4846 - 46FF494747FF494747FF494747FF494747FF494747FF474545FF2180B0FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF119AE1FF4245 - 47FF484646FF494747FF494747FF494747FF494747FF494747FF464444FF3C3A - 3AFF2B2A2AFF1284BEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EDFF0E9FEAFF0D9DE6FF0D98DFFF0D93D7FF2898CEFF78898AFF525353FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF413F - 3FDD0000004E000000370000001A000000070000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01222121514947 - 47FF494747FF494747FF494747FF494747FF494747FF515252FF788686FF5FAD - CCFF0C90D4FF0D97DDFF0D9BE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF1E323DFF2F2E2EFF3E3C3CFF4644 - 44FF494747FF494747FF494747FF494747FF494747FF484646FF404E56FF0F9F - E9FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF2378A4FF4644 - 44FF494747FF494747FF494747FF494747FF494747FF484646FF434141FF3634 - 34FF223844FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EDFF0EA0EBFF0D9DE7FF0D99E0FF0D94D9FF1792CFFF7B9295FF555858FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1817177800000043000000260000000D1211110100000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01232222674947 - 47FF494747FF494747FF494747FF494747FF494747FF545656FF7E8F8FFF4FA9 - CFFF0C91D6FF0D97DEFF0D9CE4FF0E9FE9FF0EA1EDFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1278ADFF262525FF363434FF4240 - 40FF484646FF494747FF494747FF494747FF494747FF494747FF484646FF2874 - 9BFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF375463FF4846 - 46FF494747FF494747FF494747FF494747FF494747FF474545FF3E3D3DFF2F2E - 2EFF17668EFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA0EBFF0D9EE7FF0D9AE1FF0D94DAFF0E8FD0FF7A99A0FF585C5CFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF373636C40000004C00000033000000170000000500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F012423237E4947 - 47FF494747FF494747FF494747FF494747FF494747FF565959FF849696FF43A5 - D1FF0C92D6FF0D97DEFF0D9CE5FF0E9FEAFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1B4053FF2D2C2CFF3C3B - 3BFF464444FF484646FF494747FF494747FF494747FF494747FF494747FF4349 - 4CFF1399DEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1592D2FF444242FF4846 - 46FF494747FF494747FF494747FF494747FF484646FF444343FF393838FF2829 - 2AFF0F96DBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA0EBFF0E9EE8FF0D9AE2FF0D95DAFF0C8ED1FF769DA8FF5C6060FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF484646FC0B0B0B620000003F000000220000000B12111101000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323854947 - 47FF494747FF494747FF494747FF494747FF494747FF585B5BFF889C9CFF38A0 - D0FF0C92D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1187C3FF242323FF3433 - 33FF413F3FFF484646FF494747FF494747FF494747FF494747FF494747FF4846 - 46FF306783FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF276E93FF464444FF4947 - 47FF494747FF494747FF494747FF494747FF484646FF413F3FFF333232FF1E49 - 5FFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE2FF0D95DBFF0C8FD2FF6F9EADFF5E6363FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF2C2B2BAC000000480000002E0000001300000003000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323854947 - 47FF494747FF494747FF494747FF494747FF494747FF5A5D5DFF8BA0A0FF329E - D1FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF194E69FF2B2A - 2AFF3B3939FF454343FF484646FF494747FF494747FF494747FF494747FF4947 - 47FF474545FF188FCBFF0EA3EFFF0EA3EFFF0EA3EFFF3A4D58FF484646FF4947 - 47FF494747FF494747FF494747FF494747FF464444FF3D3B3BFF2D2B2BFF137A - AEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB1FF5F6565FF4A49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF464444EF050505550000003A0000001D00000008000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323844947 - 47FF494747FF494747FF494747FF494747FF4A4848FF5A5E5EFF8CA2A2FF309D - D0FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F92D4FF2226 - 28FF323131FF403F3FFF474545FF494747FF494747FF494747FF494747FF4947 - 47FF484646FF385A6BFF0EA3EFFF0EA3EFFF1594D6FF444242FF484646FF4947 - 47FF494747FF494747FF494747FF484646FF444242FF373535FF243138FF0EA1 - EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB2FF606767FF4A49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF1F1E1E91000000450000002A00000010000000020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323844947 - 47FF494747FF494747FF494747FF494747FF4A4848FF5A5E5EFF8CA1A1FF319D - D0FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF165C - 7FFF2A2828FF393838FF444242FF484646FF494747FF494747FF494747FF4947 - 47FF494747FF474545FF2182B3FF0EA3EFFF2677A0FF464444FF494747FF4947 - 47FF494747FF494747FF494747FF474545FF403E3EFF312F2FFF195C7EFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6B9FB2FF606767FF4A49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF403E3EDA0000004E000000360000001A000000070000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323844947 - 47FF494747FF494747FF494747FF494747FF494747FF5A5D5DFF8B9F9FFF349F - D1FF0C92D7FF0D98DFFF0D9DE6FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0E9A - E1FF20292DFF312F2FFF3F3D3DFF474545FF494747FF494747FF494747FF4947 - 47FF494747FF484646FF40535DFF0FA0E9FF395D6FFF484646FF494747FF4947 - 47FF494747FF494747FF494747FF454343FF3B3939FF2A2828FF108ECEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE3FF0D95DBFF0C8FD2FF6E9FB0FF5F6565FF4A49 - 49FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF1616167600000042000000260000000D1211 - 1101000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000007F7F7F01242323834947 - 47FF494747FF494747FF494747FF494747FF494747FF585B5BFF879B9BFF3EA3 - D1FF0C92D6FF0D98DFFF0D9CE5FF0E9FEAFF0EA2EDFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF156893FF282626FF383636FF434242FF484646FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF2C7398FF484849FF494747FF494747FF4947 - 47FF494747FF494747FF484646FF424040FF343333FF1F3F50FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA1ECFF0E9EE8FF0D9AE2FF0D95DBFF0C8ED1FF739FACFF5D6363FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF353333C20000004B00000032000000160000 - 0005000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002423237B4947 - 47FF494747FF494747FF494747FF494747FF494747FF565858FF839595FF49A7 - D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1EDFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA0EBFF1E323DFF2F2E2EFF3E3C3CFF464444FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF464444FF3D3C3CFF2E2D2DFF16709EFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EEFF0EA0EBFF0E9EE7FF0D9AE1FF0D95DAFF0D8ED1FF7A9EA6FF5B6060FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF484646FA0B0B0B620000003E000000210000 - 000A121111010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000242323644947 - 47FF494747FF494747FF494747FF494747FF494747FF535555FF7D8E8EFF57AC - CFFF0C91D5FF0D97DDFF0D9CE4FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF1577AAFF2B2A2AFF3D3C3CFF4C4A4AFF525050FF545252FF5553 - 53FF565454FF565454FF575555FF565454FF555454FF555353FF545252FF5250 - 50FF514F4FFF4D4C4CFF474545FF393737FF262C30FF0E9CE5FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EDFF0EA0EBFF0D9EE7FF0D99E1FF0D94D9FF1291D0FF7D999EFF585C5CFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF2A2929A7000000480000002E0000 - 0012000000030000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002322224C4947 - 47FF494747FF494747FF494747FF494747FF494747FF515252FF778585FF69B0 - CBFF0C90D4FF0D96DCFF0D9BE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3EFFF15A5EFFF1CA8 - F0FF20AAF0FF23ABF0FF304F5FFF403F3FFF4E4C4CFF575555FF595757FF5957 - 57FF595757FF595757FF595757FF595757FF595757FF595757FF595757FF5957 - 57FF595757FF585656FF525050FF434242FF2B5E79FF18A6EFFF12A4EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2 - EDFF0EA0EAFF0D9DE6FF0D98E0FF0D93D8FF1F95CFFF7D9293FF555757FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF464444EF030303520000003A0000 - 001D000000080000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000222121334947 - 47FF494747FF494747FF494747FF494747FF494747FF4F4E4EFF6F7B7BFF7DB5 - C5FF0C8FD2FF0D95DBFF0D9AE2FF0E9EE8FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF15A5EFFF1FA9F0FF26ACF0FF28ACF1FF28AC - F1FF28ACF1FF28ACF1FF2A92C7FF3C3B3BFF4A4949FF565454FF5C5A5AFF5D5B - 5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B5BFF5D5B - 5BFF5D5B5BFF5A5858FF514F4FFF424141FF2B91C5FF28ACF1FF28ACF1FF23AB - F0FF1AA7EFFF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0E9FEAFF0D9CE6FF0D98DFFF0C92D7FF339BCDFF778787FF515353FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF1E1D1D8C000000450000 - 00290000000F0000000200000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000001010100F4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4B4BFF677171FF8EB6 - BEFF0E8FD1FF0D94DAFF0D99E1FF0D9EE7FF0EA0EBFF0EA2EDFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0FA3EFFF1AA7EFFF27ACF0FF2CAEF1FF2CAEF1FF2CAEF1FF2CAEF1FF2CAE - F1FF2CAEF1FF2CAEF1FF2CAEF1FF366279FF464545FF545252FF5C5B5BFF5F5D - 5DFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E5EFF605E - 5EFF5F5D5DFF5A5959FF4F4E4EFF3E515BFF2CAEF1FF2CAEF1FF2CAEF1FF2CAE - F1FF2CAEF1FF2AAEF1FF21AAF0FF14A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 - ECFF0E9FE9FF0D9CE5FF0D97DDFF0C91D6FF459FC6FF707C7CFF4F4F4FFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF3F3D3DD70000004D0000 - 0036000000190000000600000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000014846 - 46E8494747FF494747FF494747FF494747FF494747FF4B4949FF606767FF93AF - B1FF1F95D0FF0D93D8FF0D98E0FF0D9DE6FF0EA0EAFF0EA2EDFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF19A7 - EFFF2AADF0FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0F1FF30B0 - F1FF30B0F1FF30B0F1FF30B0F1FF319FD7FF414547FF4F4E4EFF5B5A5AFF615F - 5FFF626161FF626161FF626161FF626161FF626161FF626161FF626161FF6261 - 61FF615F5FFF5A5858FF4D4B4BFF387B9EFF30B0F1FF30B0F1FF30B0F1FF30B0 - F1FF30B0F1FF30B0F1FF30B0F1FF2EAFF1FF23AAF0FF12A4EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1 - ECFF0E9EE8FF0D9BE3FF0D96DCFF0C90D4FF5DA1BCFF677070FF4C4B4BFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF141414720000 - 0041000000250000000D12111101000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000004745 - 45B9494747FF494747FF494747FF494747FF494747FF494848FF595D5DFF899E - 9EFF3EA3D0FF0C92D6FF0D97DEFF0D9CE5FF0E9FE9FF0EA1ECFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF13A5EFFF29ADF1FF35B1 - F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1 - F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF3C7491FF4C4B4BFF595858FF6261 - 61FF666464FF666464FF666464FF666464FF666464FF666464FF666464FF6664 - 64FF626161FF595858FF4B4C4CFF36A7E1FF35B1F2FF35B1F2FF35B1F2FF35B1 - F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF35B1F2FF31B0F1FF1DA9F0FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0 - EBFF0D9EE7FF0D9AE2FF0D95DAFF0C8FD1FF75A1AEFF5F6565FF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF343232BD0000 - 004B000000320000001600000005000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000003534 - 348D494747FF494747FF494747FF494747FF494747FF494747FF535555FF7B8B - 8BFF63B0CDFF0C90D4FF0D96DCFF0D9BE3FF0E9EE8FF0EA1ECFF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1BA8F0FF35B2F1FF39B3F2FF39B3 - F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 - F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39ACE7FF484F53FF565555FF6261 - 61FF686666FF696868FF696868FF696868FF696868FF696868FF696868FF6967 - 67FF636161FF585656FF46697BFF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3 - F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF39B3F2FF29AD - F1FF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0 - EAFF0D9DE6FF0D98E0FF0D93D8FF1A93CFFF7F9799FF585B5BFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF484646FA0A0A - 0A5F0000003D000000210000000A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000002322 - 2252494747FF494747FF494747FF494747FF494747FF494747FF4E4E4EFF6D78 - 78FF88B8C3FF0C8FD1FF0D95DAFF0D99E1FF0D9EE7FF0EA0EBFF0EA2EDFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF22ABF0FF3CB4F2FF3DB5F2FF3DB5F2FF3DB5 - F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 - F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF4485A6FF565555FF6462 - 62FF6B6969FF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6D6B6BFF6B69 - 69FF636262FF565555FF4294BEFF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 - F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5F2FF3DB5 - F2FF33B1F1FF13A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9F - E9FF0D9CE5FF0D97DEFF0C92D6FF3D9ECAFF768484FF515252FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2827 - 27A4000000470000002D00000012000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001111 - 1111494747FF494747FF494747FF494747FF494747FF494747FF4B4A4AFF6167 - 67FF92AEB0FF2799D0FF0C93D7FF0D98DFFF0D9CE6FF0E9FEAFF0EA1EDFF0EA2 - EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF25ACF0FF41B6F2FF42B7F2FF42B7F2FF42B7F2FF42B7 - F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 - F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF43B3EDFF58676FFF6866 - 66FF6E6D6DFF716F6FFF716F6FFF716F6FFF716F6FFF716F6FFF706E6EFF6C6B - 6BFF636161FF545E64FF42B5F0FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 - F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7F2FF42B7 - F2FF42B7F2FF39B3F2FF13A5EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0EA0EBFF0E9E - E8FF0D9AE3FF0D95DBFF0C90D3FF65A4BCFF687070FF4D4C4CFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 - 43EC03030352000000390000001C000000080000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000484646D0494747FF494747FF494747FF494747FF494747FF494848FF575A - 5AFF829595FF54ABD0FF0C91D4FF0D96DCFF0D9BE4FF0E9FE8FF0EA1ECFF0EA2 - EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF22AAF0FF45B8F2FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 - F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 - F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF519BC1FF6D6C - 6CFF737272FF747373FF747373FF747373FF747373FF747373FF737171FF6D6C - 6CFF616161FF50839DFF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 - F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8F3FF47B8 - F3FF47B8F3FF47B8F3FF39B3F1FF11A4EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EAFF0D9D - E6FF0D99E0FF0D94D9FF1291D0FF7E9EA5FF5C6161FF4A4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1D1C1C8900000044000000290000000F0000000200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000036343488494747FF494747FF494747FF494747FF494747FF494747FF5050 - 50FF707C7CFF82B7C5FF0C8FD1FF0D95DAFF0D99E1FF0D9DE7FF0EA0EAFF0EA2 - EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF17A6EFFF47B8F2FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA - F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA - F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF50B2E4FF7472 - 72FF777676FF787676FF787676FF787676FF787676FF787676FF757474FF6E6C - 6CFF616060FF4EA9D8FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA - F3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBAF3FF4CBA - F3FF4CBAF3FF4CBAF3FF4CBAF3FF31B0F1FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9C - E5FF0D97DEFF0C92D6FF379DCCFF798889FF535555FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF3D3C3CD20000004D00000035000000190000000600000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002322223D494747FF494747FF494747FF494747FF494747FF494747FF4C4A - 4AFF616767FF92ADAEFF2D9CD0FF0C92D7FF0D97DEFF0D9CE5FF0E9FE9FF0EA1 - ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF3DB5F2FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC - F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC - F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF619CBBFF7978 - 78FF7C7B7BFF7C7B7BFF7C7B7BFF7C7B7BFF7C7B7BFF7B7A7AFF777676FF6D6C - 6CFF5E7581FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC - F3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BCF3FF51BC - F3FF51BCF3FF51BCF3FF51BCF3FF50BCF3FF1DA9F0FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0D9EE7FF0D9A - E2FF0D95DBFF0C8FD2FF6AA5BAFF677171FF4D4D4DFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF1413137000000041000000240000000C00000001000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000484646E3494747FF494747FF494747FF494747FF494747FF4948 - 48FF555858FF7D8D8DFF68B2CDFF0C90D3FF0D95DBFF0D9AE2FF0E9EE8FF0EA0 - EBFF0EA2EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF20AA - F0FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE - F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE - F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF728995FF7F7D - 7DFF807E7EFF807E7EFF807E7EFF807E7EFF807E7EFF7E7D7DFF787777FF6D6C - 6CFF5C9AB9FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE - F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF57BE - F4FF57BEF4FF57BEF4FF57BEF4FF57BEF4FF45B7F2FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9CE6FF0D98 - DFFF0C93D7FF1F95CFFF80999CFF595D5DFF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF333131BA0000004A000000310000001500000004000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000003635358C494747FF494747FF494747FF494747FF494747FF4947 - 47FF4E4E4EFF687171FF93B6BBFF1B94D0FF0C93D8FF0D98DFFF0D9CE6FF0E9F - E9FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF44B8 - F2FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 - F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 - F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5FB8E7FF807F7FFF8382 - 82FF848282FF848282FF848282FF848282FF838282FF807F7FFF787878FF6C6F - 71FF5CBCEDFF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 - F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0 - F4FF5CC0F4FF5CC0F4FF5CC0F4FF5CC0F4FF5BC0F4FF1EA9F0FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0E9EE8FF0D9AE3FF0D96 - DCFF0C90D3FF57A4C3FF707C7CFF505151FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF484646FA0909095C0000003D000000200000000A000000000000 - 0000000000000000000000000001000000000000000000000000000000000000 - 00000000000023222228494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4848FF595C5CFF839696FF5BAECFFF0C90D4FF0D96DCFF0D9AE3FF0E9E - E8FF0EA0EBFF0EA2EDFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF14A5EFFF5DC1 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF6FA8C5FF868484FF8887 - 87FF888787FF888787FF888787FF888787FF878686FF828181FF797878FF6A8E - A1FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2 - F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF61C2F4FF3AB3F2FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0E9FE9FF0D9CE6FF0D98DFFF0C93 - D8FF1893D0FF809FA6FF5E6363FF4B4A4AFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF272626A1000000470000002C00000012000000030000 - 0000000000000000000000000002000000000000000000000000000000000000 - 00000000000000000000484646C0494747FF494747FF494747FF494747FF4947 - 47FF494747FF4F4F4FFF6B7676FF90B8BEFF1692D0FF0C93D8FF0D98DFFF0D9C - E5FF0E9FE9FF0EA1ECFF0EA2EEFF0EA2EEFF0EA3EFFF0EA3EFFF25ACF0FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF7F98A5FF8B8A8AFF8C8A - 8AFF8C8A8AFF8C8A8AFF8C8A8AFF8C8A8AFF8A8888FF838282FF797878FF69AF - D3FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4 - F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF66C4F5FF52BCF3FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA2EEFF0EA2EDFF0EA0EBFF0D9EE7FF0D9AE2FF0D96DBFF0C90 - D3FF50A2C5FF738080FF525353FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF444242E70000004F000000390000001C000000070000 - 0000000000000000000000000003000000000000000000000000000000000000 - 0000000000000000000024232350494747FF494747FF494747FF494747FF4947 - 47FF494747FF4B4949FF595D5DFF849797FF60B0CFFF0C90D3FF0D95DBFF0D9A - E2FF0D9DE7FF0EA0EAFF0EA1EDFF0EA2EEFF0EA3EFFF0EA3EFFF34B1F1FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6EC2EDFF8E8F8FFF8F8E8EFF908F - 8FFF908F8FFF908F8FFF908F8FFF8F8E8EFF8C8B8BFF848383FF78848BFF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6 - F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF6CC6F5FF63C3F4FF0EA3EFFF0EA3 - EFFF0EA2EEFF0EA2EDFF0EA1ECFF0E9FE9FF0D9CE5FF0D98DFFF0C93D7FF1A94 - CFFF82A0A5FF5F6464FF4C4B4BFF494747FF494747FF494747FF4A4848FF4B49 - 49FF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A4AFF4B4A - 4AFF4B4A4AFF4B4A4AFF4B4A4AFF4A4949FF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF1C1B1B8600000044000000280000000E0000 - 0002000000000000000000000002000000000000000000000000000000000000 - 0000000000000000000011101004484646DB494747FF494747FF494747FF4947 - 47FF494747FF494747FF4F4F4FFF697272FF92B5B9FF2297D0FF0C92D6FF0D97 - DEFF0D9BE4FF0E9FE8FF0EA0EBFF0EA2EDFF0EA2EEFF0EA3EFFF3EB5F2FF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF78B7D7FF7DB3CFFF7EB5D1FF7EB5 - D1FF7EB5D1FF7EB5D1FF7EB5D1FF7EB5D1FF85AABDFF949393FF949393FF9493 - 93FF949393FF949393FF949393FF939292FF8E8D8DFF858484FF77A5BDFF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9 - F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF71C9F6FF70C9F5FF0EA3EFFF0EA3 - EFFF0EA2EEFF0EA1EDFF0E9FEAFF0D9DE7FF0D99E1FF0D95DAFF0C8FD2FF5FA6 - C2FF717C7CFF515252FF494747FF494747FF4A4848FF4E4D4DFF545656FF5A5D - 5DFF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C6161FF5C61 - 61FF5C6161FF5C6161FF5B6060FF585C5CFF525353FF4C4B4BFF494747FF4947 - 47FF494747FF494747FF494747FF3D3B3BCF0000004D00000035000000180000 - 0005000000000000000000000002000000000000000000000000000000000000 - 000000000000000000000000000047454560494747FF494747FF494747FF4947 - 47FF494747FF494747FF4A4848FF575A5AFF7D8D8DFF75B6CCFF0C8FD1FF0D94 - D9FF0D99E0FF0D9CE6FF0E9FE9FF0EA1ECFF0EA2EDFF0EA2EEFF3EB5F2FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF889CA7FF949393FF989797FF9997 - 97FF999797FF999797FF999797FF999797FF999797FF999797FF999797FF9997 - 97FF999797FF999797FF989797FF969595FF908F8FFF868787FF78C3E9FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CB - F6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF77CBF6FF73C9F5FF0EA3EFFF0EA2 - EEFF0EA1EDFF0EA0EBFF0E9EE8FF0D9BE3FF0D96DDFF0C91D6FF2C9ACDFF8098 - 9AFF5B6060FF4B4A4AFF494747FF494747FF4C4B4BFF50626AFF6699AFFF75A4 - B8FF79A8BBFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9BCFF79A9 - BCFF79A9BCFF79A9BCFF78A7BAFF759EAFFF6A6F6FFF515252FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF1312126D00000040000000240000 - 000C000000010000000000000002000000000000000000000000000000000000 - 000000000000000000000000000048464604494747DB494747FF494747FF4947 - 47FF494747FF494747FF494747FF4D4C4CFF626969FF90A8A9FF46A6D0FF0C90 - D4FF0D96DBFF0D9AE2FF0D9EE7FF0EA0EAFF0EA1EDFF0EA2EEFF34B1F1FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF8DA0AAFF999898FF9C9B9BFF9D9C - 9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C9CFF9D9C - 9CFF9D9C9CFF9D9C9CFF9C9B9BFF999898FF919090FF859DA9FF7DCDF6FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCD - F6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF7DCDF6FF6BC7F5FF0EA2EEFF0EA2 - EDFF0EA1ECFF0E9FE9FF0D9CE5FF0D98DFFF0C93D8FF1391D1FF79A8B5FF6871 - 71FF4F4F4FFF494747FF494747FF494747FF4D4D4DFF537684FF70CCF6FF80D1 - F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1 - F7FF80D1F7FF80D1F7FF80D1F7FF83CAEBFF7D8383FF565858FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF302E2EB70000004A000000300000 - 0014000000040000000000000002000000000000000000000000000000000000 - 00000000000000000000000000000000000048464660494747FF494747FF4947 - 47FF494747FF494747FF494747FF4A4848FF525353FF6F7B7BFF90B8BFFF1C94 - CFFF0C92D7FF0D97DDFF0D9BE3FF0E9EE8FF0EA0EBFF0EA1EDFF22AAEFFF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF92A4AEFF9D9C9CFFA1A0A0FFA1A0 - A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0A0FFA1A0 - A0FFA1A0A0FFA1A0A0FFA09F9FFF9B9A9AFF929191FF86B9D3FF82CFF7FF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CF - F7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF82CFF7FF5DC0F4FF0EA2EDFF0EA1 - ECFF0E9FE9FF0D9DE6FF0D99E1FF0D95DAFF0C8FD3FF54A4C6FF778686FF5558 - 58FF4A4848FF494747FF494747FF494747FF4D4D4DFF557785FF73CDF6FF80D1 - F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1F7FF80D1 - F7FF80D1F7FF80D1F7FF80D1F7FF82C9EBFF7B8181FF555757FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF474545F70909095B0000003C0000 - 001F000000090000000000000001000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000484646CB494747FF4947 - 47FF494747FF494747FF494747FF494747FF4B4A4AFF595C5CFF7E8F8FFF7AB8 - CBFF0E8FD1FF0D94D8FF0D98DFFF0D9CE5FF0E9FE8FF0EA0EBFF0FA2EDFF74C9 - F5FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 - F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF96A8B1FFA1A0A0FFA4A3A3FFA5A4 - A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4 - A4FFA5A4A4FFA4A3A3FFA2A1A1FF9C9B9BFF93989BFF88D0F5FF88D1F7FF88D1 - F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 - F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1 - F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF88D1F7FF38B2F0FF0EA1ECFF0E9F - EAFF0D9DE7FF0D9AE2FF0D96DBFF0C91D5FF339BCDFF829A9CFF5D6262FF4C4B - 4BFF494747FF494747FF494747FF494747FF4C4B4BFF566469FF65BEE6FF80D1 - F7FF80D1F7FF80D1F7FF8EB8CAFF8AA7ACFF7C969CFF738B91FF71888EFF7188 - 8EFF71888EFF71888EFF70878DFF6B7E84FF5F6363FF4F5050FF494848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF2423239C000000460000 - 002B000000100000000300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000083A2A238494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4D4D4DFF606767FF8BA1 - A1FF5CAECFFF0C8FD2FF0D94D9FF0D99E0FF0D9CE5FF0E9FE9FF0EA0EBFF4BB9 - F1FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 - F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF9BACB5FFA5A4A4FFA8A7A7FFA8A7 - A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7A7FFA8A7 - A7FFA8A7A7FFA8A7A7FFA4A3A3FF9D9D9DFF92B2C2FF8DD3F7FF8DD3F7FF8DD3 - F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 - F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3 - F7FF8DD3F7FF8DD3F7FF8DD3F7FF8DD3F7FF82CFF6FF16A4EDFF0EA0EAFF0D9E - E7FF0D9BE3FF0D97DDFF0C92D6FF1E95CFFF81A6ADFF666E6EFF4F4F4FFF4947 - 47FF494747FF494747FF494747FF494747FF4A4848FF525353FF5D7B86FF71CB - F4FF80D1F7FF80D1F7FF81CEF2FF91A7AEFF717E7EFF5E6464FF565959FF5557 - 57FF555757FF555757FF545757FF525454FF4E4F4FFF4B4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF434141E50000004E0000 - 0036000000190000000600000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000004947479B4947 - 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF505151FF6770 - 70FF92ADAFFF44A5D0FF0C90D4FF0D95DAFF0D99E1FF0D9CE6FF0E9FE9FF19A5 - ECFF86D0F6FF92D5F7FF92D5F7FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 - F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF9FAEB7FFA7A6A6FFA9A8A8FFA9A8 - A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8A8FFA9A8 - A8FFA9A8A8FFA8A7A7FFA4A4A4FF9F9E9EFF94CBE7FF92D5F8FF92D5F8FF92D5 - F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 - F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5F8FF92D5 - F8FF92D5F8FF92D5F8FF92D5F7FF92D5F7FF50BBF1FF0EA0EAFF0D9EE7FF0D9B - E3FF0D97DEFF0C92D7FF1391D0FF79AAB9FF6E7979FF535454FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF565959FF5E91 - A5FF79CFF6FF80D1F7FF80D1F7FF84CBEBFF879496FF616767FF505151FF4A49 - 49FF4A4848FF4A4848FF4A4848FF494848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF1C1B1B820000 - 003F000000220000000A00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000A0D0D0104947 - 47E3494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF5354 - 54FF6E7979FF93B5B9FF319ED0FF0C91D4FF0D95DBFF0D99E1FF0D9CE6FF0E9F - E9FF47B7EFFF98D7F7FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 - F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FFA0B0B8FFA5A5A5FFA6A6A6FFA6A6 - A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6A6FFA6A6 - A6FFA6A6A6FFA6A5A5FFA3A3A3FF9EACB3FF98D7F8FF98D7F8FF98D7F8FF98D7 - F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 - F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7F8FF98D7 - F8FF98D7F8FF98D7F8FF98D7F7FF83CFF5FF17A3EAFF0D9EE7FF0D9BE3FF0D97 - DEFF0C93D8FF0E90D1FF6BAAC1FF758383FF565858FF4B4949FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4D4C4CFF5A5E - 5EFF5FA5C2FF7ED0F7FF80D1F7FF80D1F7FF89C2DCFF7C8686FF5B6060FF4E4D - 4DFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF383737C70000 - 00470000002B0000001000000002000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000006674 - 744C494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B49 - 49FF555858FF738080FF91B8BEFF2899CFFF0C91D5FF0D95DBFF0D99E1FF0D9C - E5FF11A0E9FF6FC6F3FF9ED9F7FF9ED9F8FF9ED9F8FF9EDAF8FF9EDAF8FF9EDA - F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FFA3ABAFFFA4A4A4FFA5A4A4FFA5A4 - A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4 - A4FFA5A4A4FFA4A4A4FFA3A3A3FFA0C3D5FF9EDAF8FF9EDAF8FF9EDAF8FF9EDA - F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDA - F8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9EDAF8FF9ED9 - F8FF9ED9F8FF9ED9F8FF97D6F6FF32AEECFF0D9EE7FF0D9BE3FF0D97DEFF0C93 - D8FF0D8FD1FF61A8C4FF7A8A8AFF595D5DFF4C4B4BFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4F4E - 4EFF5D6668FF65B9DCFF80D1F7FF80D1F7FF80D1F7FF8DB7C9FF737D7DFF575B - 5BFF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF484646F90707 - 0755000000330000001600000004000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000066757597494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4C4B4BFF575B5BFF768484FF93BAC0FF2899CFFF0C91D4FF0D95DAFF0D99 - E0FF0D9CE5FF1BA3E9FF86CFF4FFA3DBF8FFA3DBF8FFA3DBF8FFA3DCF9FFA3DC - F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA6ADB1FFA7A7A7FFA7A7A7FFA7A7 - A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7A7FFA7A7 - A7FFA7A7A7FFA7A7A7FFA7A8A9FFA3D9F5FFA3DCF9FFA3DCF9FFA3DCF9FFA3DC - F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DC - F9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DCF9FFA3DB - F8FFA3DBF8FFA1DAF7FF4BB7EEFF0D9DE6FF0D9AE2FF0D97DDFF0C93D8FF0E8F - D1FF61A9C5FF7D8D8EFF5B6060FF4C4B4BFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 - 48FF515252FF5E7379FF6DC5ECFF80D1F7FF80D1F7FF81D0F5FF8EA9B3FF6A74 - 74FF545656FF4B4A4AFF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF1E1D - 1D860000003A0000001B00000006000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000A0D1D108484646CF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4C4B4BFF585B5BFF768484FF92B8BEFF329ED0FF0C90D4FF0D94 - D9FF0D98DFFF0D9BE3FF1EA4E9FF8DD1F4FFA9DDF8FFA9DDF8FFA9DDF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DE - F9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DEF9FFA9DDF9FFA9DDF9FFA9DD - F8FFA5DBF7FF54BAEFFF0D9CE6FF0D99E1FF0D96DCFF0C92D7FF0F8FD0FF67AB - C4FF7C8D8EFF5C6161FF4D4C4CFF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4B4A4AFF545656FF5E8492FF75CDF5FF81D1F7FF81D1F7FF83CDF0FF8B9C - A0FF646B6BFF515252FF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF3635 - 35BD0000003E0000001F00000008000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000A0D1D124494747EF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4C4B4BFF575B5BFF738080FF93B5B9FF44A5D0FF0C8F - D2FF0D94D8FF0D97DDFF0D9AE2FF1CA2E7FF81CCF3FFAEDFF8FFAEDFF8FFAEDF - F9FFAEDFF9FFAEE0F9FFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 - FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 - FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 - FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0 - FAFFAEE0FAFFAEE0FAFFAEE0FAFFAEE0F9FFAEDFF9FFAEDFF9FFAEDFF8FFA4DB - F7FF4AB6EDFF0D9BE4FF0D99E0FF0D95DBFF0C91D5FF1993D0FF73ADC0FF7989 - 89FF5B5F5FFF4D4C4CFF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4C4B4BFF575B5BFF5F99AFFF7CD0F6FF81D1F7FF81D1F7FF87C8 - E6FF838F91FF5F6565FF4F4F4FFF4A4848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 - 43E900000041000000220000000A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000066757544494747FB494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4C4B4BFF555858FF6E7979FF92ADAFFF5CAE - CFFF0E8FD1FF0C92D7FF0D96DBFF0D99E0FF159EE5FF65C1F0FFAEDFF7FFB3E1 - F9FFB3E1F9FFB3E2F9FFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 - FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 - FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 - FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2FAFFB3E2 - FAFFB3E2FAFFB3E2FAFFB3E2F9FFB3E1F9FFB3E1F9FFB3E1F8FF97D5F5FF30AB - E9FF0D9AE2FF0D97DEFF0D94D9FF0C90D4FF2598CFFF80ACB7FF748181FF585C - 5CFF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4E4D4DFF5B6060FF61ACCBFF80D0F7FF81D1F7FF81D1 - F7FF8BBFD6FF7A8484FF5A5F5FFF4D4D4DFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF0A09094D000000230000000A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000039586867494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4B4949FF535454FF677070FF8BA1 - A1FF7AB8CBFF1B94CFFF0C90D4FF0D94D9FF0D97DEFF0D9AE2FF36ADE9FF96D4 - F4FFB8E3F8FFB8E3F9FFB8E3FAFFB8E3FAFFB8E3FAFFB8E4FAFFB8E4FAFFB8E4 - FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4 - FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4 - FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E4FAFFB8E3 - FAFFB8E3FAFFB8E3FAFFB8E3F9FFB8E3F9FFAFDFF7FF68C1EFFF18A0E5FF0D99 - E0FF0D96DBFF0C92D7FF0D8FD1FF45A3CCFF85A5AAFF6D7777FF555858FF4C4B - 4BFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4A4848FF504F4FFF606B6EFF8DCCE8FFA4DEF9FFA2DD - F9FF9DDBF9FF9AB8C4FF707A7AFF565959FF4B4A4AFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1616165D000000210000000A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000003958687F494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF505151FF6067 - 67FF7E8F8FFF90B8BFFF46A6D0FF0C8FD1FF0C92D6FF0D95DBFF0D98DFFF149D - E3FF52B8ECFFA3DAF6FFBEE5F9FFBEE5F9FFBEE5FAFFBEE5FAFFBEE6FAFFBEE6 - FAFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6 - FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6 - FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FBFFBEE6FAFFBEE6FAFFBEE5 - FAFFBEE5F9FFBEE5F9FFB8E3F8FF80CBF2FF2AA7E7FF0D99E1FF0D96DDFF0D94 - D9FF0C90D4FF1D95D0FF6DADC4FF839798FF656C6CFF525353FF4B4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4A4949FF525353FF677C82FF9CD9F5FFAAE0 - FAFFAAE0FAFFA9DFF9FF96A8AEFF666F6FFF515252FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1D1C1C6B0000001E00000008000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000003958688F494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4848FF4D4D - 4DFF595C5CFF6F7B7BFF8FA8A9FF77B7CCFF2297D0FF0C90D3FF0C93D8FF0D96 - DCFF0D98DFFF159EE3FF4DB6EBFF99D6F5FFC2E7F9FFC3E7FAFFC3E7FAFFC3E7 - FAFFC3E7FAFFC3E7FBFFC3E7FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8 - FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8FBFFC3E8 - FBFFC3E8FBFFC3E7FBFFC3E7FBFFC3E7FAFFC3E7FAFFC3E7FAFFC3E7FAFFC3E7 - F9FFB4E1F7FF76C7F0FF2CA8E7FF0D99E1FF0D97DEFF0D94DAFF0C91D5FF0E8F - D1FF48A4CDFF88ABB1FF748282FF5C6161FF4F4F4FFF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4B4A4AFF555757FF71939FFFA9E0 - FAFFAFE1FAFFAFE1FAFFACD9EFFF848F8FFF5C6060FF4C4C4CFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1B1A1A620000001900000005000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000003958688F4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4B4A4AFF525353FF626868FF7C8D8DFF93B5B9FF60B0CFFF1792D0FF0C90 - D4FF0C93D8FF0D95DBFF0D97DEFF0D99E1FF30A9E7FF6DC3EFFFA4DAF6FFC6E8 - F9FFC8E9FAFFC8E9FAFFC8E9FAFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9 - FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9FBFFC8E9 - FBFFC8E9FBFFC8E9FBFFC8E9FAFFC8E9FAFFC8E9FAFFBAE3F8FF8ED1F3FF4AB4 - EBFF189FE4FF0D98E0FF0D96DDFF0D94D9FF0C91D6FF0C8FD1FF349ECFFF7CAF - BEFF819393FF666E6EFF545656FF4C4B4BFF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4C4CFF5A5D5DFF84B2 - C4FFB3E3FAFFB4E3FAFFB4E3FAFFA1B8C1FF687171FF515252FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF1515154A0000001400000004000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000003958 - 687B494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF4D4C4CFF575959FF697272FF849797FF90B7BEFF5CAE - CFFF1B94D0FF0C90D3FF0C92D7FF0D95DAFF0D96DCFF0D98DFFF0D99E1FF28A6 - E6FF4EB6EBFF82CCF2FFA3DAF5FFC0E6F8FFCDEBFAFFCDEBFAFFCDEBFAFFCDEB - FBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFBFFCDEBFAFFCDEB - FAFFCAEAF9FFB2E0F7FF94D3F4FF68C1EFFF3BAEE9FF159EE4FF0D99E0FF0D97 - DEFF0D95DBFF0D93D8FF0C91D5FF0C8FD1FF379FCFFF76AFC2FF879D9EFF6D78 - 78FF595D5DFF4E4E4EFF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF4D4D4DFF4F50 - 50FF4F5050FF4D4D4DFF4B4949FF494747FF494747FF4A4848FF4F4F4FFF6472 - 75FFA8DDF5FFB8E5FBFFB8E5FBFFAFD4E4FF7B8484FF565858FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4846 - 46FC0404042B0000000E00000002000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000039586860494747FB494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF4A4848FF4F4F4FFF595D5DFF6B7575FF8396 - 96FF93B6BBFF67B1CDFF2D9CD0FF0C8FD1FF0C91D4FF0C93D7FF0D95DAFF0D96 - DCFF0D97DEFF0D98E0FF0D99E1FF109BE3FF26A5E6FF3BAFE9FF4DB6EBFF5BBB - EDFF66C0EFFF6CC3EFFF6EC4EFFF69C2EFFF61BEEEFF55B9ECFF44B2EAFF31AA - E8FF1AA0E4FF0D9AE2FF0D99E0FF0D98DFFF0D97DDFF0D95DBFF0D94D8FF0C92 - D6FF0C90D3FF1692D0FF47A4CEFF7FB1BFFF869C9DFF6F7A7AFF5C6161FF5051 - 51FF4B4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4B4949FF515252FF5D6161FF656D - 6DFF656D6DFF5D6262FF525252FF4B4949FF494747FF494747FF4A4949FF585C - 5CFF93C0D2FFBDE7FBFFBDE7FBFFB7E0F3FF848D8DFF595D5DFF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4543 - 43D80000001D0000000800000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000039586840494747E7494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF4F4F4FFF595C - 5CFF687171FF7D8D8DFF91ADAEFF83B7C5FF54ABCFFF2799D0FF0C8FD1FF0C90 - D4FF0C92D6FF0D93D8FF0D94DAFF0D95DBFF0D96DCFF0D97DDFF0D97DEFF0D98 - DFFF0D98DFFF0D98DFFF0D98DFFF0D98DFFF0D98DFFF0D97DEFF0D97DEFF0D97 - DDFF0D95DBFF0D95DAFF0D94D9FF0C92D7FF0C91D5FF0C8FD2FF1592D0FF3BA2 - D0FF69ADC7FF8BAEB4FF819393FF6B7676FF5B5F5FFF505151FF4B4A4AFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4C4C4CFF637C87FFAEDCF0FFB8E0 - F2FFB8E0F2FF95A8AFFF5E6464FF4E4E4EFF494747FF494747FF4A4848FF5658 - 58FF8BACB7FFC2E8FBFFC2E8FBFFBCE1F3FF868F8FFF5A5E5EFF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF302F - 2F9C000000120000000300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000001B7AAA1C494747C3494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 - 48FF4E4E4EFF555858FF616767FF707C7CFF829595FF92AEAFFF88B7C3FF63B0 - CDFF3EA2D0FF1F96D0FF0E8FD1FF0C8FD2FF0C90D4FF0C91D5FF0C92D6FF0C92 - D6FF0C92D7FF0C92D7FF0C92D7FF0C92D7FF0C92D7FF0C92D6FF0C91D6FF0C90 - D4FF0C90D3FF0C8ED1FF1491D0FF2C9CD0FF4FA8CEFF72B0C4FF8EAFB4FF8599 - 9AFF738080FF636B6BFF575A5AFF4F4F4FFF4B4949FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4D4C4CFF677E86FFBEE8FBFFC6EA - FCFFC6EAFCFFADC1CAFF6E7979FF545656FF4A4848FF494747FF4C4A4AFF5B5F - 5FFF9DC9D9FFC6EAFCFFC6EAFCFFBFE2F3FF848D8DFF595D5DFF4A4949FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF1C1B - 1B4A000000090000000100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000001B7AAA0439586887494747FB494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494848FF4C4A4AFF505050FF575A5AFF616767FF6D7878FF7B8B - 8BFF899E9EFF93AFB1FF8EB6BEFF7DB5C5FF69B1CBFF57ACCFFF49A7D0FF3DA2 - D1FF369FD1FF319DD0FF309DD0FF329ED1FF38A0D0FF43A5D1FF4FA9CFFF5FAD - CCFF71B0C6FF85B3BEFF8FAFB3FF8BA1A2FF7D8E8EFF6F7B7BFF626A6AFF585C - 5CFF515252FF4C4B4BFF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4C4A4AFF5D6465FFBAE5F8FFCBEC - FCFFCBECFCFFC2E1F0FF899697FF646B6BFF545555FF505151FF565959FF7083 - 87FFC1E8FAFFCBECFCFFCBECFCFFBBD8E5FF7A8484FF565858FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF454343D10000 - 0010000000030000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000083A3A338494747D74947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494848FF4B4A4AFF4E4E4EFF5355 - 55FF595D5DFF606767FF677171FF6F7B7BFF778585FF7D8E8EFF839595FF879B - 9BFF8A9F9FFF8CA1A1FF8CA2A2FF8BA0A0FF889C9CFF849696FF7E8F8FFF7886 - 86FF707D7DFF697272FF626969FF5B5F5FFF545656FF4F4F4FFF4C4A4AFF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4A4848FF555858FF9ABECDFFCFED - FCFFCFEDFCFFCFEDFCFFB8D1DCFF869596FF6E7979FF697373FF788B8FFFB8DA - E7FFCFEDFCFFCFEDFCFFCFEDFCFFA9BBC2FF687171FF505151FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF212020590000 - 0007000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000A0D1D1046675 - 757B494747F7494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494848FF4B4949FF4C4B4BFF4F4E4EFF515252FF535555FF565858FF575B - 5BFF595D5DFF5A5E5EFF5A5E5EFF5A5D5DFF585B5BFF565959FF545656FF5152 - 52FF4F4F4FFF4C4C4CFF4B4A4AFF4A4848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4F4F4FFF68777CFFC2E5 - F4FFD4EFFCFFD4EFFCFFD4EFFCFFCEEAF8FFBCD9E4FFBCDCE8FFD0EDFBFFD4EF - FCFFD4EFFCFFD4EFFCFFC5DEEAFF7F8888FF5A5E5EFF4C4B4BFF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF424040B9000000090000 - 0001000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00006675751C4947479F494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4B4949FF535555FF7688 - 8EFFC6E5F3FFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1FDFFD8F1 - FDFFD8F1FDFFC8DFEBFF869394FF606767FF505050FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF484646EC10101025000000020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000049474730494747AF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4C4A4AFF5456 - 56FF687578FF9DB5BDFFC4E1EEFFD9F0FBFFDDF2FDFFDDF2FDFFD6EEF9FFC5DE - E9FFA3B6BBFF778283FF5F6565FF515252FF4B4949FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FB2C2B2B4600000002000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000004947472C4947479B494747F74947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B4A - 4AFF505050FF585C5CFF626969FF697373FF6D7878FF6E7979FF6C7777FF6770 - 70FF606565FF565959FF4E4E4EFF4A4949FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FB323131580000000200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000494747144947 - 4773494747D7494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4B4A4AFF4E4D4DFF505050FF525353FF525353FF525252FF4F50 - 50FF4D4C4CFF4A4949FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF484646E732303042000000010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000004947473049474787494747DB494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF464444A82322221500000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000004947472449474768494747A74947 - 47DF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FB484646B04846 - 4634000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000049474714494747444947476C4947478F494747AF494747C7494747DF4947 - 47EB494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747F3494747D3494747A34947476448464618000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFF007FFFFFFFFFFFFFFFFFFFFFFFFFFF800001FFFFFFFFFFFFFFFFFFF - FFFFFF80000001FFFFFFFFFFFFFFFFFFFFFFFC000000003FFFFFFFFFFFFFFFFF - FFFFF00000000007FFFFFFFFFFFFFFFFFFFF800000000001FFFFFFFFFFFFFFFF - FFFE0000000000007FFFFFFFFFFFFFFFFFF80000000000001FFFFFFFFFFFFFFF - FFF000000000000007FFFFFFFFFFFFFFFFC000000000000001FFFFFFFFFFFFFF - FF8000000000000000FFFFFFFFFFFFFFFE00000000000000007FFFFFFFFFFFFF - FC00000000000000001FFFFFFFFFFFFFF800000000000000000FFFFFFFFFFFFF - F0000000000000000007FFFFFFFFFFFFE0000000000000000003FFFFFFFFFFFF - C0000000000000000001FFFFFFFFFFFF80000000000000000000FFFFFFFFFFFF - 000000000000000000007FFFFFFFFFFE000000000000000000003FFFFFFFFFFC - 000000000000000000001FFFFFFFFFF8000000000000000000001FFFFFFFFFF8 - 000000000000000000000FFFFFFFFFF00000000000000000000007FFFFFFFFE0 - 0000000000000000000007FFFFFFFFE00000000000000000000003FFFFFFFFC0 - 0000000000000000000001FFFFFFFF800000000000000000000001FFFFFFFF80 - 0000000000000000000000FFFFFFFF000000000000000000000000FFFFFFFF00 - 00000000000000000000007FFFFFFE0000000000000000000000007FFFFFFE00 - 00000000000000000000003FFFFFFE0000000000000000000000003FFFFFFC00 - 00000000000000000000001FFFFFFC0000000000000000000000001FFFFFF800 - 00000000000000000000001FFFFFF80000000000000000000000000FFFFFF800 - 00000000000000000000000FFFFFF000000000000000000000000007FFFFF000 - 000000000000000000000007FFFFF000000000000000000000000007FFFFF000 - 000000000000000000000003FFFFE000000000000000000000000003FFFFE000 - 000000000000000000000001FFFFE000000000000000000000000001FFFFE000 - 000000000000000000000000FFFFE000000000000000000000000000FFFFE000 - 000000000000000000000000FFFFC0000000000000000000000000007FFFC000 - 0000000000000000000000007FFFC0000000000000000000000000003FFFC000 - 0000000000000000000000003FFFC0000000000000000000000000001FFFC000 - 0000000000000000000000001FFFC0000000000000000000000000001FFFC000 - 0000000000000000000000000FFFC0000000000000000000000000000FFFC000 - 00000000000000000000000007FFC00000000000000000000000000007FFE000 - 00000000000000000000000003FFE00000000000000000000000000003FFE000 - 00000000000000000000000003FFE00000000000000000000000000001FFE000 - 00000000000000000000000001FFE00000000000000000000000000000FFF000 - 00000000000000000000000000FFF00000000000000000000000000000FFF000 - 000000000000000000000000007FF000000000000000000000000000007FF800 - 000000000000000000000000003FF800000000000000000000000000003FF800 - 000000000000000000000000001FFC00000000000000000000000000001FFC00 - 000000000000000000000000001EFC00000000000000000000000000000EFE00 - 000000000000000000000000000EFE000000000000000000000000000006FE00 - 0000000000000000000000000006FF000000000000000000000000000002FF00 - 0000000000000000000000000002FF800000000000000000000000000002FFC0 - 0000000000000000000000000001FFC00000000000000000000000000001FFE0 - 0000000000000000000000000001FFE00000000000000000000000000000FFF0 - 0000000000000000000000000000FFF80000000000000000000000000000FFF8 - 0000000000000000000000000000FFFC0000000000000000000000000000FFFE - 0000000000000000000000000000FFFF0000000000000000000000000000FFFF - 8000000000000000000000000000FFFFC000000000000000000000000000FFFF - E000000000000000000000000000FFFFF000000000000000000000000000FFFF - F800000000000000000000000001FFFFFC00000000000000000000000001FFFF - FE00000000000000000000000001FFFFFF00000000000000000000000003FFFF - FFC0000000000000000000000007FFFFFFE0000000000000000000000007FFFF - FFF800000000000000000000000FFFFFFFFE00000000000000000000001FFFFF - FFFF80000000000000000000003FFFFFFFFFE0000000000000000000007FFFFF - FFFFFC00000000000000000001FFFFFFFFFFFF80000000000000000007FFFFFF - FFFFFFF800000000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFF2800000060000000C0000000010020000000 - 0000809400000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000009F9F9F019F9F - 9F019F9F9F010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000010000 - 000300000006000000080000000B0000000E0000001000000011000000120000 - 00120000001200000011000000100000000D0000000A00000007000000050000 - 0002000000010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000100000003000000070000000D000000140000 - 001B00000021000000280000002D000000320000003500000037000000370000 - 0037000000370000003700000034000000300000002C000000250000001F0000 - 0018000000100000000A00000005000000020000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000002000000070000000F00000019000000240000002F000000390000 - 0040000000460000004B0000004E000000500000005200000052000000530000 - 0053000000530000005200000051000000500000004D00000049000000440000 - 003D000000340000002A0000001E000000130000000A00000004000000010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000025242401030303040000 - 000B0000001700000025000000330000004000000049030303530F0F0F711B1A - 1A8B292828A9302E2EC13D3B3BD4424040E1464444EF464444EF464444EF4644 - 44EF464444EF434141E53E3C3CD7323030C4292828AD1D1C1C900F0F0F750404 - 045B000000520000004C00000045000000390000002C0000001D000000100000 - 0007141313020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000050505040000000D0000001A0000 - 002B0000003B01010149090909621F1E1E92343333C4413F3FE9474545F84947 - 47FE494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE474545F94140 - 40EA353434C5201F1F960B0A0A6A010101540000004C00000041000000320000 - 0022000000130202020716161602000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000D0D0D020000000A000000190000002C0000003E0302 - 024E1D1C1C8C363535CB474545F6494747FF494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF474545F6363535CB1B1B1B8C030303590000004F0000 - 0045000000350000002100000011000000062322220100000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00001B1A1A010000000700000015000000290000003D0A0A0A5F282626A64543 - 43EE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE444242ED262525A60A0A - 0A680000005100000045000000330000001E0000000C03030303000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000606 - 06030000000D0000001F0000003608080857292828A6454343F1484646FE4846 - 46FE494747FF494747FF484646FE494747FF494747FF494747FF484646FE4947 - 47FF494747FF494747FE494747FF494747FF494747FE494747FF494747FF4947 - 47FE494747FF494747FF494747FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4442 - 42EF2A2929AB070707620000004E000000400000002A00000014030303062C31 - 3101000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000B0F0F050000 - 0013000000290000004022212192424040E9484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE494747FE494747FE4A49 - 49FE4D4C4CFE505050FE535555FE565959FE595D5DFE5B5F5FFE5B5F5FFE5A5E - 5EFE585B5BFE555757FE515353FE4E4F4FFE4C4B4BFE4A4848FE494747FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE414040E91F1E1E940101015500000048000000340000001D0000 - 0009324343020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000596B6B0100000008000000190000 - 0033101010663B3939D1494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF494747FE4A4949FF4E4E4EFF565858FF616767FE6C78 - 78FF728689FF6F909AFE6796A6FF619AB0FF5D9DB7FE5B9EBAFF5A9FBBFF5A9D - B9FE5D9BB5FF6098ADFF6692A2FE6D8C95FF6F8184FF687171FE5C6161FF5354 - 54FF4C4C4CFE4A4848FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF484646FE3A3838D30E0E0E6F0000004F0000003E0000 - 00240000000E1A23230300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000073737301000000090000001D0201013A2121 - 2190454343F1484646FE494747FF494747FF484646FE494747FF494747FF4947 - 47FE4A4848FF4E4D4DFF575A5AFE666F6FFF71868AFF6B98A7FF529CBCFE3B9D - CAFF2D9BD1FF299CD6FE299DD9FF2A9FDBFF2CA0DCFE2DA1DCFF2EA1DCFF2DA1 - DCFE2BA0DBFF2A9EDAFF289DD8FE289BD5FF2B99CFFF3B9AC7FE5198B6FF6890 - 9EFF6B7D80FE606666FF535555FF4C4A4AFE494747FF494747FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE444242F0201F1F95010101540000 - 00430000002A000000112B2B2B03000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000073737301000000090000001F04040442302F2FB44846 - 46FE484646FE484646FE484646FE484646FE484646FE494747FE4A4848FE4F4E - 4EFE5C6161FE717F80FE7099A6FE499DC3FE309CD1FE269BD7FE2BA0DBFE30A4 - DFFE32A6E1FE34A8E3FE36A9E4FE37AAE5FE38ABE6FE39ABE6FE39ABE6FE39AB - E6FE38ABE6FE37AAE5FE36A9E4FE34A8E2FE32A6E1FE30A3DEFE299FDBFE249A - D6FE2F99CDFE4998BAFE6C8F9AFE687272FE565959FE4C4B4BFE494747FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FC2F2D2DB80404 - 0458000000460000002D00000012070707040000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000006B6B6B010000000A000000200B0B0B503B3A3AD2484646FE4947 - 47FF494747FF484646FE494747FF494747FF494848FE4F4F4FFF5E6363FF7386 - 89FE649FB5FF389ECEFF239AD7FE2CA1DDFF2FA4E0FF32A7E3FF35AAE6FE37AC - E8FF39AEEAFF3BAFEBFE3CB1ECFF3DB1EDFF3DB1EDFE3EB2EDFF3EB2EDFF3EB2 - EDFE3EB2EDFF3EB1ECFF3DB1ECFE3CB0EBFF3BAFEAFF39ADE8FE36AAE6FF33A8 - E3FF30A5E0FE2AA0DCFF1F98D6FF399AC8FE6294A6FF6A797BFE565959FF4C4B - 4BFF494747FE494747FF494747FF484646FE494747FF494747FF484646FE3A38 - 38D209090965000000490000002F0000001301131C0400000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000090000001F0C0C0C51403F3FE0494747FE484646FE4947 - 47FF494747FF484646FE494747FF4C4B4BFF575B5BFE708081FF679DB1FF359C - CDFE259CD9FF2BA1DEFF2FA6E2FE32A9E6FF35ACE9FF38AEEBFF39B0ECFE3BB1 - EEFF3CB2EFFF3DB3EFFE3DB4F0FF3EB4F0FF3EB4F0FE3FB4F0FF3FB5F1FF3FB4 - F1FE3FB5F1FF3FB4F0FF3FB4F0FE3EB3EFFF3EB3EFFF3DB2EDFE3BB1ECFF39AF - EBFF37ACE8FE34A9E6FF30A6E2FF2AA1DDFE239AD7FF3398C8FE6591A1FF6570 - 71FF525353FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF3D3C3CDD0B0B0B6A000000480000002E00000012202B2B03000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000060000001B0C0C0C4F3F3E3EDD484646FE484646FE484646FE4846 - 46FE484646FE494747FE4F5050FE646B6BFE77979FFE409EC9FE239AD7FE28A0 - DDFE2CA5E3FE30A9E7FE33ACEAFE36AEECFE38B0EEFE39B1EFFE39B2F0FE3BB3 - F0FE3BB3F1FE3CB4F1FE3CB4F1FE3CB4F1FE3DB4F1FE3DB5F1FE3DB5F1FE3DB5 - F1FE3DB5F1FE3DB5F1FE3EB5F1FE3EB5F1FE3EB4F1FE3DB4F0FE3DB3F0FE3CB2 - EFFE3AB1EEFE38AFECFE36ADEAFE32A9E6FE2EA5E2FE29A0DDFE2098D4FE4297 - BEFE6E878CFE595D5DFE4C4B4BFE494747FE484646FE484646FE484646FE4846 - 46FE484646FE413F3FE60B0A0A6A000000470000002B0000000F202B2B020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000080B - 0B04000000160C0C0C4B413F3FE0484646FE494747FF494747FF484646FE4947 - 47FF4A4949FF545757FE718182FF61A1BAFF2699D3FE259EDCFF29A3E1FF2DA8 - E6FE31ABEAFF33AEECFF35AFEEFE37B1EFFF37B2F0FF38B2F1FF38B3F1FE38B3 - F2FF39B3F2FF39B3F1FE39B3F2FF3AB3F2FF3AB3F1FE3AB4F2FF3AB4F2FF3AB4 - F1FE3AB4F2FF3BB4F2FF3BB4F1FE3BB4F2FF3BB4F2FF3BB4F1FE3BB4F1FF3BB4 - F1FF3AB3F0FE39B2F0FF39B1EEFF37AFECFE34ACEAFF30A9E6FE2BA4E1FF249D - DAFF2497D0FE6094A8FF646E6EFF4F4F4FFE494747FF494747FF484646FE4947 - 47FF494747FF484646FE3F3D3DE00A0A0A6900000045000000260000000C506B - 6B01000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000002C3B3B020000 - 0011050505373D3B3BD4494747FF484646FE494747FF494747FF494747FE4B4A - 4AFF5A5E5EFF778C8FFE49A0C6FF219AD7FF259FDEFE29A5E4FF2CA9E9FF2FAC - ECFE31AEEEFF33AFEFFF33B0F0FE34B1F1FF35B1F1FF35B2F2FF35B2F1FE36B2 - F2FF36B2F2FF36B2F1FE37B2F2FF37B2F2FF37B2F1FE37B3F2FF37B3F2FF37B2 - F1FE38B3F2FF38B3F2FF38B3F1FE38B3F2FF38B3F2FF38B3F1FE38B3F2FF39B3 - F2FF38B3F1FE38B3F1FF38B2F0FF38B1EFFE36B0EEFF34AEECFE30AAE9FF2CA6 - E4FF27A0DEFE1E97D4FF4C97B8FF6A797BFE515252FF4A4848FF494747FE4947 - 47FF494747FF484646FE494747FF3C3A3AD7070707600000003F000000200000 - 0008000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000000000B0202 - 022A333131B6484646FE484646FE484646FE484646FE494747FE4B4A4AFE5D61 - 61FE79959BFE3B9DCBFE1F9AD8FE24A0E0FE28A6E6FE2AAAEAFE2DACEDFE2FAE - EFFE30AFF0FE30AFF0FE31B0F0FE31B0F0FE31B0F0FE32B0F1FE32B0F1FE32B0 - F1FE32B0F1FE33B1F1FE33B1F1FE33B1F1FE33B1F1FE34B1F1FE34B1F1FE34B1 - F1FE34B1F1FE35B1F1FE35B1F1FE35B1F1FE35B1F1FE35B2F1FE36B2F1FE36B2 - F1FE36B2F1FE36B2F1FE36B2F1FE36B2F1FE35B1F0FE34B0EFFE32AEEDFE2FAB - EAFE2BA7E6FE27A1E0FE1E98D7FE3B97C2FE6E7F81FE535555FE4A4848FE4846 - 46FE484646FE484646FE484646FE484646FE353434C801010152000000380000 - 0018040404040000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000050000001C2726 - 268E494747FF484646FE494747FF484646FE494747FF4B4A4AFF5D6363FE789B - A4FF2F9BCFFF1E9ADAFE22A1E2FF26A6E8FF28A9EBFE2AACEDFF2BADEFFF2CAE - F0FE2DAFF1FF2DAFF1FF2DAFF0FE2DAFF1FF2EAFF1FF2EAFF1FF2EAFF0FE2FAF - F1FF2FAFF1FF2FAFF0FE2FAFF1FF2FAFF1FF30AFF0FE30B0F1FF30B0F1FF30B0 - F0FE31B0F1FF31B0F1FF31B0F0FE31B0F1FF31B0F1FF32B0F0FE32B0F1FF32B0 - F1FF32B0F1FE32B0F1FF33B1F1FF33B0F1FE33B1F1FF32B0F0FE32AFF0FF30AE - EEFF2EABEBFE2AA7E7FF26A2E1FF1E99D9FE3197C7FF6C8489FF545656FE4A48 - 48FF494747FF484646FE494747FF494747FF484646FE292828A90000004D0000 - 00300000000F1312120200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000002B373702000000111616165E4644 - 44F4494747FF484646FE494747FF494747FE4B4A4AFF5C6161FF78989FFE2D9B - CFFF1C9ADAFF20A0E2FE24A6E8FF26A9EBFF27ABEEFE28ACEFFF29ADF0FF29AD - F0FE29ADF1FF2AADF1FF2AADF0FE2AAEF1FF2AAEF1FF2BAEF1FF2AAEF0FE2BAE - F1FF2BAEF1FF2BAEF0FE2CAEF1FF2CAEF1FF2CAEF0FE2CAFF1FF2DAFF1FF2DAE - F0FE2DAFF1FF2DAFF1FF2EAFF0FE2EAFF1FF2EAFF1FF2EAFF0FE2EAFF1FF2FAF - F1FF2FAFF0FE2FAFF1FF2FB0F1FF2FAFF0FE30B0F1FF30AFF0FE2FAFF0FF2FAE - F0FF2EADEEFE2BABECFF28A7E8FF24A1E2FE1C99D9FF3296C6FF6B8287FE5253 - 53FF494747FF484646FE494747FF494747FF484646FE474545F8181717830000 - 0044000000220101010800000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000008050505283F3E3EDB4846 - 46FE484646FE484646FE484646FE4A4848FE575A5AFE799397FE359CCDFE1A99 - D9FE1D9FE1FE21A4E8FE23A8ECFE25AAEEFE25ABEFFE26ACF0FE26ACF0FE26AC - F0FE27ACF0FE27ACF0FE27ACF0FE27ACF0FE27ACF0FE28ACF0FE28ACF0FE28AC - F0FE28ADF0FE28ADF0FE28ADF0FE28ADF0FE28ADF0FE29ADF0FE29ADF0FE29AD - F0FE29ADF0FE29ADF0FE2AADF0FE2AADF0FE2AAEF0FE2AAEF0FE2BAEF0FE2BAE - F0FE2BAEF0FE2BAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAEF0FE2CAE - F0FE2CADEFFE2BACEEFE29AAECFE26A6E8FE22A0E1FE1B98D9FE3897C4FE6C79 - 7BFE505050FE494747FE484646FE484646FE484646FE484646FE403E3EE30706 - 065D000000370000001606060603000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000A090903000000172B2A2A98494747FF4947 - 47FF494747FF484646FE494747FF525454FE778B8DFF43A0CAFF1797D8FE1A9E - E1FF1DA3E8FF20A7EBFE21A9EEFF22AAEFFF23AAEFFE23ABF0FF23ABF0FF23AB - F0FE24ABF0FF24ABF0FF24ABF0FE24ABF0FF24ABF0FF25ABF0FF25ABF0FE25AB - F0FF25ABF0FF25ABF0FE26ACF1FF26ACF1FF26ACF0FE26ACF1FF26ACF1FF27AC - F0FE27ACF1FF27ACF1FF27ACF0FE27ACF1FF27ACF1FF28ACF0FE28ACF1FF28AC - F1FF457995FE3C8CB5FF2EA4E1FF28ADF0FE29ADF1FF29ADF0FE29ADF1FF29AD - F1FF29ADF0FE29ACF0FF28ABEEFF27A9EBFE23A5E7FF1F9FE1FF1896D7FE4798 - BBFF667172FF4D4D4DFE494747FF494747FF484646FE494747FF494747FF302E - 2EB800000049000000290000000B000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000A11111148464444F2494747FF4947 - 47FF494747FF494747FE4E4E4EFF6D7878FE59A4C3FF1696D6FF189CDFFE1BA2 - E7FF1DA5EBFF1EA7EDFE1FA8EFFF238BBFFF2F7295FE377B9EFF3B7FA1FF3C7F - A2FE3C7FA2FF3C7FA2FF3C7FA2FE2A9AD3FF21AAF0FF21AAF0FF22AAEFFE22AA - F0FF22AAF0FF22AAEFFE22ABF0FF22ABF0FF23AAF0FE23ABF0FF23ABF0FF23AB - F0FE23ABF0FF24ABF0FF24ABF0FE24ABF0FF24ABF0FF24ABF0FE25ABF0FF2F98 - CEFF585757FE5A5859FF565F63FF48768DFE3692C2FF29A6E7FE26ACF1FF26AC - F1FF27ACF0FE27ACF1FF26ABF0FF25AAEEFE24A8EBFF20A3E6FF1C9DDEFE1795 - D4FF5A94ACFF5D6363FE4A4949FF494747FF484646FE494747FF494747FF4846 - 46FB121212740000003C00000019090808030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000200000016353434B6484646FE484646FE4846 - 46FE484646FE4B4949FE5F6565FE75A2AFFE1794D3FE1599DCFE179FE4FE1AA4 - EAFE1BA6EDFE1CA7EEFE1CA8EFFE1F92CDFE33393DFE474646FE525050FE5453 - 53FE545353FE545353FE545353FE44677AFE1FA6EBFE1EA9EFFE1EA9EFFE1EA9 - EFFE1FA9EFFE1FA9EFFE1FA9EFFE1FA9EFFE1FA9EFFE20A9EFFE20A9EFFE20A9 - EFFE20AAEFFE20AAEFFE21AAEFFE21AAEFFE21AAEFFE21AAEFFE22AAEFFE3F73 - 8EFE575656FE585656FE585656FE585656FE585757FE52616AFE417C9BFE2E9A - D1FE23ABF0FE23ABF0FE23ABF0FE23AAEFFE22A9EDFE21A6EAFE1DA1E5FE199A - DCFE1E94CFFE6B8B94FE535454FE494747FE484646FE484646FE484646FE4846 - 46FE383636CE0202024E0000002A0000000A0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000819181859484646F9484646FE494747FF4947 - 47FF494747FF545656FE799295FF309CCFFE1397DAFF159DE3FF17A2E9FE18A5 - EDFF19A6EFFF19A7EFFE19A7F0FF1AA7EFFF236282FE3A3939FF4B4949FF514F - 4FFE535151FF535151FF535151FE515051FF2D88B7FF1BA8F0FF1CA8EFFE1CA8 - F0FF1CA8F0FF1CA8EFFE1CA8F0FF1CA8F0FF1DA8EFFE1DA8F0FF1DA8F0FF1DA8 - EFFE1DA8F0FF1DA8F0FF1EA8EFFE1EA9F0FF1EA9F0FF1EA8EFFE239EDDFF4E57 - 5CFF565454FE565454FF565454FF565454FE565454FF565454FE565454FF5755 - 55FF4E626EFE3A82A7FF299CD7FF21A9EFFE20A9EEFF1FA7ECFF1DA4E9FE1A9F - E2FF1697D9FF3698C6FE697576FF4D4D4DFF494747FE494747FF494747FF4846 - 46FE484646FE1A1919840000003B000000151312120200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000002000000123B3939BE494747FF484646FE494747FF4947 - 47FF4C4B4BFF6B7575FE5BA4C1FF1193D6FE139AE0FF15A0E7FF16A3ECFE16A5 - EEFF16A6EFFF16A6EFFE17A6F0FF17A6F0FF189CE0FE2C363BFF413F3FFF4D4B - 4BFE504E4EFF514F4FFF514F4FFE514F4FFF465B67FF1CA1E5FF19A7EFFE19A7 - F0FF19A7F0FF19A7EFFE19A7F0FF19A7F0FF1AA7EFFE1AA7F0FF1AA7F0FF1AA7 - EFFE1AA7F0FF1AA8F0FF1BA8EFFE1BA8F0FF1BA8F0FF1BA8EFFE317FA7FF5250 - 50FF535252FE545252FF545252FF535252FE545252FF545252FE545353FF5453 - 53FF545252FE545353FF505559FF3D5F71FE2488BBFF1DA7EEFF1CA6EBFE1AA1 - E7FF169BDFFF1293D4FE5D94AAFF5A5E5EFF4A4848FE494747FF494747FF4846 - 46FE494747FF393737D00101014A000000240101010800000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000611111142484646FC494747FF484646FE494747FF4947 - 47FF565959FF7C9CA3FE1F96D1FF1096DBFE129DE4FF13A1EAFF14A4EDFE14A5 - EEFF14A5EFFF15A5EFFE15A6EFFF15A6EFFF15A5EFFE1D6B92FF343333FF4644 - 44FE4E4C4CFF4F4D4DFF4F4D4DFE4F4D4DFF4E4D4DFF2F7BA2FF16A6EFFE17A6 - F0FF17A6F0FF17A6EFFE17A6F0FF17A6F0FF17A6EFFE17A6F0FF17A7F0FF17A6 - EFFE17A7F0FF18A7F0FF18A7EFFE18A7F0FF18A7F0FF19A4EBFE435C69FF514F - 4FFF525050FE525050FF525050FF525050FE525050FF525050FE525050FF5250 - 50FF525050FE525050FF4E4C4CFF3E3D3DFE23749DFF1AA7EFFF1AA6EDFE19A3 - EAFF169FE4FF1497DBFE2795CBFF6B7E82FF4E4E4EFE494747FF494747FF4846 - 46FE494747FF474545F914131375000000320000001022212101000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000D343232A5484646FE484646FE484646FE494747FE4D4C - 4CFE6C7777FE53A5C7FE0E93D6FE0F9AE0FE119FE7FE12A2ECFE12A3EEFE12A4 - EEFE13A4EEFE13A4EEFE13A4EEFE13A4EEFE13A4EEFE149DE4FE253C49FE3B39 - 39FE494747FE4D4B4BFE4D4B4BFE4D4B4BFE4D4B4BFE494E52FE1A9BDDFE15A5 - EFFE15A5EFFE15A5EFFE15A5EFFE15A5EFFE15A5EFFE16A5EFFE16A5EFFE16A5 - EFFE16A5EFFE16A5EFFE16A5EFFE16A6EFFE16A6EFFE248BC0FE4C4D4EFE4F4D - 4DFE4F4D4DFE4F4D4DFE4F4D4DFE4E4C4CFE4C4A4AFE4D4B4BFE4F4D4DFE504E - 4EFE514F4FFE504E4EFE464545FE32383CFE19A0E5FE18A6EFFE18A6EEFE17A4 - ECFE16A0E8FE139AE0FE0F92D5FE5696B1FE5C6161FE494747FE484646FE4846 - 46FE484646FE484646FE313030BB000000410000001C00000005000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000209090928464444EA494747FF494747FF484646FE494747FF5658 - 58FF809CA1FF1A94D1FE0E96DBFF0E9CE4FE10A0EAFF10A2EDFF10A3EEFE11A4 - EFFF11A4EFFF11A4EEFE11A4EFFF11A4EFFF11A4EEFE11A4EFFF1777A8FF2D2D - 2EFE413F3FFF4B4949FF4C4A4AFE4C4A4AFF4C4A4AFF4C4A4AFF336C89FE13A4 - EDFF13A4EFFF13A4EEFE13A5EFFF13A5EFFF13A5EEFE13A5EFFF13A5EFFF13A5 - EEFE14A5EFFF14A5EFFF14A5EFFE14A5EFFF14A5EFFF36667FFE4D4B4BFF4E4C - 4CFF4E4C4CFE4E4C4CFF4D4B4BFF474545FE3E3C3CFF3D3B3BFE434242FF4947 - 47FF4C4A4AFE4B4949FF3D3C3CFF235C79FE16A6EFFF16A6EFFF16A5EFFE15A4 - EDFF14A1EAFF129DE4FE0F96DAFF2695CBFF6C7E81FE4D4C4CFF494747FF4846 - 46FE494747FF494747FF474545F5050505520000002B0000000C000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000005201F1F68484646FE494747FF494747FF484646FE4B4A4AFF676F - 6FFF60A6C1FF0C91D6FE0D98E0FF0E9EE7FE0FA1ECFF0FA2EEFF0FA3EEFE0FA3 - EFFF0FA3EFFF0FA3EEFE10A4EFFF10A4EFFF10A3EEFE10A4EFFF109FE8FF1F42 - 54FE373535FF454343FF4A4848FE4A4848FF4A4848FF4A4848FF474A4DFE1C90 - CCFF11A4EFFF11A3EEFE11A4EFFF11A4EFFF11A4EEFE11A4EFFF11A4EFFF11A4 - EEFE11A4EFFF12A4EFFF12A4EEFE12A4EFFF169BDFFF474A4CFE4C4A4AFF4C4A - 4AFF4C4A4AFE4C4A4AFF4A4848FF3D3B3BFE2C2A2AFF272626FE2D2C2CFF3635 - 35FF3E3C3CFE3F3D3DFF313335FF1887BFFE14A5EFFF14A5EFFF14A5EEFE13A4 - EEFF12A2EBFF109EE7FE0E98DEFF0F91D4FF6094A9FE565959FF494747FF4846 - 46FE494747FF494747FF484646FE1E1D1D8E0000003B00000017121111020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000A3B3939B8484646FE484646FE484646FE494747FE515151FE7A8F - 91FE2D9BCFFE0C95DAFE0D9BE3FE0D9FE9FE0EA1EDFE0EA2EEFE0EA2EEFE0EA2 - EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE1283 - BDFE2A292AFE3D3C3CFE484646FE494747FE494747FE494747FE494747FE385E - 72FE10A1EBFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE0FA3EEFE10A3 - EEFE10A3EEFE10A3EEFE10A3EEFE10A3EEFE28769EFE494747FE4A4848FE4A48 - 48FE4A4848FE4A4848FE444242FE313132FE186A93FE174A64FE1C2428FE2120 - 20FE272626FE292828FE203F50FE12A2ECFE12A4EEFE12A4EEFE12A4EEFE11A3 - EEFE10A2EDFE0F9FE9FE0E9AE2FE0D94D9FE3698C6FE666F6FFE4B4A4AFE4846 - 46FE484646FE484646FE484646FE3B3939D70202024C00000026000000080000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000C0C0C22464444EA484646FE494747FF494747FF494747FE5B5F5FFF77A4 - B1FF1092D3FF0C97DEFE0D9DE6FF0DA0EBFE0EA2EEFF0EA3EFFF0EA2EEFE0EA3 - EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2 - EEFE1B4A62FF323131FF434141FE494747FF494747FF494747FF494747FE4748 - 49FF2183B5FF0EA2EEFE0FA3EFFF0FA3EFFF0FA3EEFE0FA3EFFF0FA3EFFF0FA3 - EEFE0FA3EFFF0FA3EFFF0FA3EEFE119FE7FF3B5461FF494747FE4A4848FF4A48 - 48FF4A4848FE484646FF3E3C3CFF254150FE109FE7FF10A3EDFE1192D4FF1461 - 88FF192F3BFE1B1C1DFF146E9CFF10A3EEFE10A4EFFF10A4EFFF10A3EEFE10A3 - EFFF0FA2EEFF0FA0EBFE0D9CE5FF0D96DCFF1291D1FE70898FFF505050FF4947 - 47FE494747FF494747FF484646FE484646FC1514147700000036000000121616 - 1602000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000219191951484646FC484646FE494747FF494747FF4A4949FE6A7373FF5AA6 - C5FF0C92D6FF0C99E1FE0D9EE8FF0DA1ECFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE108AC8FF262C30FF3A3939FE464444FF484646FF494747FF484646FE4846 - 46FF3E525DFF0FA0EAFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2 - EEFE0EA3EFFF0EA3EFFF0EA2EEFE1B8AC4FF474647FF494747FE4A4848FF4A48 - 48FF494747FE454343FF363434FF196891FE0FA3EFFF0EA2EEFE0FA3EFFF0FA3 - EFFF0F9EE7FE117BB2FF0F9AE1FF0FA3EEFE0FA3EFFF0FA3EFFF0FA3EEFE0FA3 - EFFF0EA2EEFF0EA1ECFE0D9EE7FF0D98E0FF0C91D5FE5C96ACFF585C5CFF4947 - 47FE494747FF494747FF484646FE494747FF323131BF000000440000001F0505 - 0506000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00032B2A2A8B484646FE484646FE484646FE494747FE4E4E4EFE7B8D8EFE309B - CEFE0C94DAFE0D9BE4FE0D9FEAFE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE18597BFE2F2E2EFE424040FE484646FE484646FE484646FE4846 - 46FE484646FE2777A0FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE30637DFE484646FE484646FE484646FE4846 - 46FE484646FE3F3E3EFE2B2D2FFE0F97DCFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2 - EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2EEFE0EA2 - EEFE0DA2EEFE0DA1EDFE0D9FE9FE0D9AE3FE0C94D9FE3B97C2FE646D6DFE4A48 - 48FE484646FE484646FE484646FE484646FE454343F40D0C0C65000000300000 - 000F252424010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00063F3E3EBB494747FF484646FE494747FF494747FF545656FE7E9FA6FF1994 - D2FF0D96DDFF0D9CE5FE0EA0EBFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0F93D7FF233037FE393737FF454444FF484646FF484646FE4947 - 47FF494747FF414E55FE1497DBFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF1397DBFE414B50FF484646FF484646FE494747FF4947 - 47FF464444FE393737FF1F4D65FF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA0EAFF0D9CE4FF0C95DBFE2295CDFF6C7E82FF4C4C - 4CFE494747FF494747FF484646FE494747FF494747FE282727A60000003F0000 - 001B030303040000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0008474545E4494747FF484646FE494747FF494747FF5B6060FE74A7B7FF0F92 - D4FF0D98DFFF0D9EE7FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF16658DFE2E2D2DFF403E3EFF484646FF484646FE4947 - 47FF494747FF484646FE2E6B8BFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF237AA7FE474545FF494747FF484646FE494747FF4846 - 46FF434141FE313131FF147AAEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1EBFF0D9DE6FF0C97DDFE1292D2FF6C8C96FF5051 - 51FE494747FF494747FF484646FE494747FF494747FF444242EB0302024E0000 - 002A0000000B0000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000D0D - 0D16484646FE484646FE484646FE484646FE4A4848FE646B6BFE64A9C3FE0C92 - D6FE0C99E1FE0D9EE8FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0E9EE7FE21333CFE363535FE454343FE484646FE4846 - 46FE484646FE484646FE45494CFE198ECAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0EA2EEFE395463FE484646FE484646FE484646FE484646FE4745 - 45FE3D3B3BFE263944FE0E9CE5FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA1ECFE0D9DE7FE0C98E0FE0C91D4FE6395A8FE5557 - 57FE484646FE484646FE484646FE484646FE484646FE484646FE1F1E1E8E0000 - 003A000000160D0D0D0200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001818 - 1834494747FF494747FF484646FE494747FF4B4A4AFF6C7777FE51A7CBFF0C93 - D8FF0D9AE2FF0D9FE9FE0EA1EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE1472A2FF2B2B2CFF3E3D3DFF474545FE4947 - 47FF494747FF484646FE484646FF365E73FF0EA2EDFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF1790CEFF454445FE484646FF494747FF484646FE484646FF4543 - 43FF363434FE1A5F83FF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1EDFF0D9EE8FF0C99E1FE0C92D6FF5497B4FF5A5F - 5FFE494747FF494747FF484646FE494747FF494747FF484646FE3A3838D20202 - 024B000000250000000800000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001A19 - 194B494747FF494747FF484646FE494747FF4D4C4CFF748181FE40A3CFFF0C94 - D9FF0D9BE3FF0D9FE9FE0EA2EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0E9EE8FF1E3D4EFF343333FF444242FE4846 - 46FF494747FF484646FE494747FF474546FF1D87BDFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF2A6C8FFF484646FE494747FF494747FF484646FE484646FF413F - 3FFF2D2F30FE118BCAFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1EDFF0D9FE9FF0D9AE2FE0C93D8FF4798BCFF5F66 - 66FE494747FF494747FF484646FE494747FF494747FF484646FE484646FB1312 - 127300000035000000111A191901000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A60484646FE484646FE484646FE484646FE4E4E4EFE7A8A8AFE349FD1FE0C95 - DAFE0D9BE4FE0D9FEAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE1280B9FE282A2BFE3D3B3BFE4745 - 45FE484646FE484646FE484646FE484646FE3C5563FE109DE5FE0DA2EEFE0DA2 - EEFE109DE4FE3C4F59FE484646FE484646FE484646FE484646FE464444FE3A39 - 39FE21465AFE0EA0EBFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0D9FE9FE0D9AE3FE0C94D9FE3E99C3FE646C - 6CFE494747FE484646FE484646FE484646FE484646FE484646FE484646FE312F - 2FBD000000440000001F03030306000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A64494747FF494747FF484646FE494747FF4F4F4FFF7F9090FE2A9BD2FF0C95 - DBFF0D9BE5FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA0EBFF1B4B63FF323131FE4341 - 41FF484646FF484646FE494747FF494747FF484646FE2679A4FF0EA3EFFF0DA2 - EEFE1B87BFFF454444FF484646FE494747FF494747FF484646FE434242FF3331 - 31FF1672A1FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE4FE0C94D9FF3799C6FF6771 - 71FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4543 - 43F20C0C0C630000002F0000000E292727010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A64494747FF494747FF484646FE494747FF505050FF819393FE279AD1FF0C95 - DBFF0D9CE5FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF108CCCFF27282AFE3B39 - 39FF464444FF484646FE494747FF494747FF484646FE414E56FF1399DDFF0DA2 - EEFE2B6A8BFF474545FF484646FE494747FF494747FF484646FE3E3D3DFF2930 - 34FF0E9CE4FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE4FE0C94D9FF3498C7FF6973 - 73FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF262525A20000003E0000001A060606040000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A64484646FE484646FE484646FE484646FE505050FE819393FE289AD1FE0C95 - DBFE0D9BE5FE0DA0EAFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE185878FE302E - 2EFE414040FE484646FE484646FE484646FE484646FE484646FE2F6B8BFE0FA0 - E9FE3E515CFE484646FE484646FE484646FE484646FE454343FE373636FE1C56 - 74FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0D9FEAFE0D9BE4FE0C94D9FE3599C7FE6973 - 73FE4A4848FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE444242EA0202024E0000002A0000000B0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A63494747FF494747FF484646FE494747FF4F4F4FFF7F9090FE2D9DD2FF0C95 - DBFF0D9BE4FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0EA3EFFF0F92D4FE242F - 36FF393737FF464444FE484646FF494747FF484646FE494747FF46494CFF2381 - B1FE46494BFF494747FF484646FE494747FF484646FF424040FE2F3032FF1382 - BCFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA2EEFF0E9FEAFF0D9BE3FE0C94D9FF3999C6FF6770 - 70FE4A4848FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE1B1B1B880000003A000000161312120200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001B1A - 1A5E494747FF494747FF484646FE494747FF4E4E4EFF7A8989FE38A0D1FF0C95 - DAFF0D9BE4FF0D9FEAFE0EA2EEFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0EA3EFFF0DA2EEFE1662 - 89FF2E2C2CFF413F3FFE484646FF494747FF484646FE494747FF494747FF454B - 4FFE494747FF494747FF484646FE494747FF474545FF3B3A3AFE243D4AFF0E9F - EAFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA2EDFF0E9FE9FF0D9AE3FE0C93D9FF419AC2FF646C - 6CFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE393737CF0202024A000000240000000700000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001A1A - 1A48484646FE484646FE484646FE484646FE4C4C4CFE738080FE47A5CFFE0C94 - D9FE0C9AE3FE0D9FE9FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0FA3EFFE149B - E1FE293D48FE414040FE504E4EFE555353FE565454FE575555FE575555FE5654 - 54FE565454FE555353FE535151FE514F4FFE4B4949FE373636FE196B94FE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA1EDFE0D9FE8FE0C9AE2FE0C93D7FE4D9ABBFE5F65 - 65FE494747FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FB1212127200000035000000111D1C1C01000000000000 - 0000000000000000000000000000000000000000000000000000000000001A19 - 1931494747FF494747FF484646FE494747FF4B4A4AFF6B7575FE59A9CAFF0C93 - D7FF0D99E2FF0D9EE9FE0EA1EDFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF0EA3EFFF0EA3EEFE10A4EFFF17A6EFFF1FA9F0FF24ABF0FE25AB - F0FF2B7FAAFF413F3FFE515050FF595858FF5B5959FE5B5959FF5B5959FF5B59 - 59FE5B5959FF5B5959FF5B5959FE5A5858FF535151FF3F4549FE269BD8FF1EA9 - F0FF16A6EFFE10A3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1ECFF0D9EE8FF0C99E1FE0C92D6FF5C9AB2FF5A5E - 5EFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF302E2EB9000000430000001E04040405000000000000 - 0000000000000000000000000000000000000000000000000000000000000F0F - 0F0F494747FF494747FF484646FE494747FF4A4848FF626A6AFE6CACC3FF0C92 - D6FF0D98E0FF0D9EE8FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2 - EEFE0EA3EFFF12A4EFFF1FA9F0FE28ADF0FF2BAEF1FF2BAEF1FF2BAEF0FE2BAE - F1FF2BACEEFF3A525FFE4E4C4CFF5B5959FF5F5D5DFE5F5D5DFF5F5D5DFF5F5D - 5DFE5F5D5DFF5F5D5DFF5F5D5DFE5D5B5BFF525050FF3A6378FE2BADEFFF2BAE - F1FF2BAEF0FE27ACF0FF1EA9F0FF11A4EFFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA1ECFF0D9DE7FF0C98DFFE0D91D4FF6A96A5FF5456 - 56FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF444242F00A09095F0000002E0000000D222121010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0001484646E6484646FE484646FE484646FE494747FE5A5E5EFE7CA9B6FE1292 - D3FE0C97DEFE0D9DE7FE0DA0EBFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE11A4 - EFFE22AAF0FE2FAFF1FE30B0F1FE30B0F1FE30B0F1FE30B0F1FE30B0F1FE30B0 - F1FE30B0F1FE3490BFFE484A4CFE585757FE626060FE636161FE636161FE6361 - 61FE636161FE636161FE636161FE5E5C5CFE4F4E4EFE368EBCFE30B0F1FE30B0 - F1FE30B0F1FE30B0F1FE30B0F1FE2EAFF1FE20A9F0FE10A3EFFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA0EBFE0D9CE6FE0C96DDFE1793D1FE708C92FE4F50 - 50FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE252424A00000003E0000001A0A0909040000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000444242BA494747FF484646FE494747FF494747FF535454FE84A0A3FF2097 - D1FF0D96DCFF0D9CE5FE0EA0EAFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF1AA7EFFF30B0 - F1FE37B2F2FF37B2F2FF36B2F1FE37B2F2FF37B2F2FF37B2F2FF36B2F1FE37B2 - F2FF37B2F2FF37B1EFFE42687BFF555454FF636161FE676565FF676666FF6766 - 66FE676666FF676666FF666464FE5E5C5CFF4B575DFF37B0EEFE37B2F2FF37B2 - F2FF36B2F1FE37B2F2FF37B2F2FF36B2F1FE36B2F2FF2FAFF1FE17A6EFFF0EA3 - EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EDFE0E9FEAFF0D9BE4FF0C95DAFE2B97CBFF6E7D7FFF4C4B - 4BFE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF424040E70101014D000000290000000A0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002D2B2B86484646FE484646FE484646FE494747FE4D4D4DFE7A8B8BFE40A2 - CEFE0C94D9FE0D9AE3FE0D9FE9FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE22AAF0FE3AB4F1FE3CB5 - F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5 - F1FE3CB5F1FE3CB5F1FE3F9FCFFE535759FE656363FE6B6A6AFE6C6A6AFE6C6A - 6AFE6C6A6AFE6C6A6AFE696868FE5D5C5CFE477E9AFE3CB5F1FE3CB5F1FE3CB5 - F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE3CB5F1FE39B3F1FE1EA9 - EFFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA1EDFE0D9EE8FE0D9AE2FE0C93D7FE4A9BBFFE636B6BFE4A48 - 48FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE1A19198300000038000000150000 - 0002000000000000000000000000000000000000000000000000000000000000 - 00001C1B1B46494747FD484646FE494747FF494747FF4A4949FE677070FF6BAC - C3FF0C91D5FF0C98E0FE0D9EE7FF0DA1ECFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF26ACF0FE42B7F2FF43B7F2FF43B7 - F2FE43B7F2FF43B7F2FF43B7F2FE43B7F2FF43B7F2FF43B7F2FF43B7F2FE43B7 - F2FF43B7F2FF43B7F2FE43B6F1FF528099FF6A6868FE706F6FFF716F6FFF716F - 6FFE716F6FFF716F6FFF6B6969FE5B5F61FF46A5D5FF43B7F2FE43B7F2FF43B7 - F2FF43B7F2FE43B7F2FF43B7F2FF43B7F2FE43B7F2FF43B7F2FE43B7F2FF41B6 - F2FF21AAF0FE0EA3EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA2EEFF0DA0EBFE0D9DE7FF0D97DEFF0C90D4FE6C99A9FF575959FF4947 - 47FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE383737CE02010149000000240000 - 0007000000000000000000000000000000000000000000000000000000000000 - 00000F0F0F17474545E9484646FE494747FF494747FF494747FE595D5DFF81A6 - ADFF1894D2FF0C96DCFE0D9CE5FF0DA0EAFE0EA2EEFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF21AAF0FF47B8F2FE49B9F3FF49B9F3FF49B9 - F2FE49B9F3FF49B9F3FF49B9F2FE49B9F3FF49B9F3FF49B9F3FF49B9F2FE49B9 - F3FF49B9F3FF49B9F2FE49B9F3FF4DAFE1FF717070FE757474FF767474FF7574 - 74FE767474FF747373FF6B6A6AFE597380FF4AB8F1FF49B9F2FE49B9F3FF49B9 - F3FF49B9F2FE49B9F3FF49B9F3FF49B9F2FE49B9F3FF49B9F2FE49B9F3FF49B9 - F3FF46B8F2FE1BA7EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0EA2EDFF0D9FEAFE0D9BE4FF0C95DBFF1D95D0FE75888AFF4F4F4FFF4947 - 47FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE474545F91010106E000000340000 - 0010000000010000000000000000000000000000000000000000000000000000 - 0000000000003F3D3DB8484646FE484646FE484646FE484646FE505050FE7A8C - 8DFE41A2CEFE0C93D8FE0D9AE2FE0D9EE8FE0DA1EDFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA2EEFE0DA2EEFE13A5EFFE47B8F2FE50BCF3FE50BCF3FE50BCF3FE50BC - F3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BC - F3FE50BCF3FE50BCF3FE50BCF3FE5AA7CFFE797777FE7B7979FE7B7979FE7B79 - 79FE7B7979FE777676FE6B6A6AFE5698B9FE50BCF3FE50BCF3FE50BCF3FE50BC - F3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BCF3FE50BC - F3FE50BCF3FE41B6F2FE11A4EFFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0DA1ECFE0D9EE8FE0C99E1FE0C92D7FE4B9EC2FE646C6CFE4A4949FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE2E2D2DB4000000430000 - 001D000000050000000000000000000000000000000000000000000000000000 - 00000000000024232360484646FE494747FF494747FF484646FE4A4949FF646C - 6CFF77ADBEFF0C90D4FE0D97DEFF0D9DE6FE0EA0EBFF0EA2EEFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE34B1F1FF58BEF4FF57BEF3FE58BEF4FF58BEF4FF57BE - F3FE58BEF4FF58BEF4FF57BEF3FE58BEF4FF58BEF4FF58BEF4FF57BEF3FE58BE - F4FF58BEF4FF57BEF3FE58BEF3FF6E94A8FF807E7EFE807F7FFF807F7FFF807F - 7FFE807E7EFF797878FF6A7277FE59B7E7FF58BEF4FF57BEF3FE58BEF4FF58BE - F4FF57BEF3FE58BEF4FF58BEF4FF57BEF3FE58BEF4FF57BEF3FE58BEF4FF58BE - F4FF57BEF3FE58BEF4FF2AADF0FF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA2 - EDFF0EA0EAFF0D9CE6FE0D96DDFF1392D2FF6F97A3FE545656FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF444242F00909095E0000 - 002D0000000D0000000100000000000000000000000000000000000000000000 - 0000000000000C0C0C19484646E9494747FF494747FF484646FE494747FF5456 - 56FF849A9BFF2E9CD1FE0C94DAFF0D9AE3FE0E9FE9FF0EA1EDFF0DA2EEFE0EA3 - EFFF0EA3EFFF0FA3EFFE54BDF3FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1 - F4FE5EC1F4FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1F4FF5EC1F4FE5EC1 - F4FF5EC1F4FF5EC1F4FE60BDECFF7E888FFF858484FE868484FF868484FF8584 - 84FE848282FF7A7A7AFF688EA1FE5EC1F3FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1 - F4FF5EC1F4FE5EC1F4FF5EC1F4FF5EC1F4FE5EC1F4FF5EC1F4FE5EC1F4FF5EC1 - F4FF5EC1F4FE5EC1F4FF4BBAF2FF0FA3EFFE0EA3EFFF0EA3EFFF0DA2EEFE0EA1 - ECFF0D9EE8FF0D9AE2FE0C93D8FF3B9BC7FF6E7B7CFE4C4B4BFF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE2423239C0000 - 003D000000190000000300000000000000000000000100000000000000000000 - 000000000000020202013B39399D484646FE484646FE484646FE484646FE4C4B - 4BFE697272FE6DAEC5FE0E91D4FE0C97DEFE0D9DE6FE0DA0EBFE0DA2EDFE0DA2 - EEFE0DA2EEFE1DA8F0FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 - F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 - F4FE65C4F4FE65C4F4FE6EB4D8FE898889FE8B8989FE8B8989FE8B8989FE8A89 - 89FE868585FE7B7A7AFE68B0D5FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 - F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4F4FE65C4 - F4FE65C4F4FE65C4F4FE5FC1F4FE18A6EFFE0DA2EEFE0DA2EEFE0DA1EDFE0DA0 - EAFE0D9CE5FE0C97DDFE1091D3FE6B9AAAFE595D5DFE494747FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE413F3FE30000 - 0049000000280000000A00000000000000000000000200000000000000000000 - 000000000000000000001A1A1A2E494747FD494747FF484646FE494747FF4947 - 47FF545656FF849C9DFE329DCFFF0C93D8FE0D9AE2FF0D9EE8FF0DA1ECFE0EA2 - EEFF0EA3EFFF2CAEF1FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7 - F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7F5FF6DC7F5FF6CC7F5FE6DC7 - F5FF6DC7F5FF6CC7F5FE81A5B8FF908F8FFF908F8FFE908F8FFF908F8FFF8F8E - 8EFE898787FF7A8890FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6DC7 - F5FF6CC7F5FE6DC7F5FF6DC7F5FF6CC7F5FE6DC7F5FF6CC7F5FE6DC7F5FF6DC7 - F5FF6CC7F5FE6DC7F5FF6BC6F5FF22AAF0FE0EA2EFFF0EA2EEFF0DA1ECFE0D9E - E7FF0D99E1FF0C93D8FE3E9CC6FF6E7B7CFF4D4D4DFE494747FF494848FF4B4A - 4AFE4D4D4DFF4E4D4DFF4E4D4DFE4E4D4DFF4E4D4DFF4E4D4DFE4E4D4DFF4E4D - 4DFF4D4D4DFE4C4B4BFF4A4949FF494747FE494747FF494747FF484646FE1A19 - 1982000000390000001500000002000000000000000100000000000000000000 - 0000000000000000000000000000484646B7494747FF484646FE494747FF4947 - 47FF4B4A4AFF677070FE77ADBEFF1192D3FE0D96DDFF0D9CE5FF0D9FEAFE0EA1 - EDFF0EA2EEFF32B1F1FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CAF6FF74CA - F5FE74CAF6FF74CAF6FF74CAF5FE76C3EBFF889EAAFF8EA0AAFF8FA1AAFE8FA1 - ABFF8FA1ABFF8FA1AAFE94989AFF969595FF969595FE969595FF969595FF9492 - 92FE8A898AFF7AA8BFFF74CAF5FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CA - F6FF74CAF5FE74CAF6FF74CAF6FF74CAF5FE74CAF6FF74CAF5FE74CAF6FF74CA - F6FF74CAF5FE74CAF6FF74CAF6FF26ACF0FE0EA2EEFF0EA1ECFF0D9FE9FE0D9B - E4FF0C95DBFF1492D1FE7498A2FF585B5BFF494747FE494747FF4D4E4FFF5A68 - 6DFE68797EFF6B7D82FF6B7D82FE6B7D82FF6B7D82FF6B7D82FE6B7D82FF6B7D - 82FF6A7C81FE647073FF545656FF4A4848FE494747FF494747FF484646FE3735 - 35CA010101480000002300000006000000000000000100000000000000000000 - 000000000000000000000000000048464640484646F8484646FE484646FE4846 - 46FE494747FE525353FE7B8E8EFE4FA7CDFE0C92D6FE0D98DFFE0D9DE7FE0DA0 - EBFE0DA1EDFE2CAEF0FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD - F5FE7BCDF5FE7BCDF5FE7BCDF5FE7EC5E8FE93979AFE9B9A9AFE9C9B9BFE9C9B - 9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9C9B9BFE9B9A9AFE9796 - 96FE8C8F92FE7DC3E6FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD - F5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCDF5FE7BCD - F5FE7BCDF5FE7BCDF5FE78CBF5FE22AAEFFE0DA1EDFE0DA0EAFE0D9DE6FE0C97 - DEFE0D92D5FE56A1C0FE677070FE4C4B4BFE494747FE494747FE515B5EFE66BB - E3FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0F6FE7FD0 - F6FE7FD0F6FE86BCD6FE646969FE4C4A4AFE484646FE484646FE484646FE4745 - 45F80F0E0E6A000000330000000F000000010000000100000000000000000000 - 000000000000000000000000000048464601535858B1484646FE494747FF4947 - 47FF494747FF4A4848FE5C6161FF87A5A9FE2699D1FF0C94D9FF0C99E1FE0D9E - E8FF0EA0EBFF1AA6EEFE81CFF6FF83CFF7FF83CFF6FE83CFF7FF83CFF7FF83CF - F6FE83CFF7FF83CFF7FF83CFF6FE85C8EAFF9A9EA0FFA1A0A0FFA1A0A0FEA1A0 - A0FFA1A0A0FFA1A0A0FEA1A0A0FFA1A0A0FFA1A0A0FEA1A0A0FFA09F9FFF9998 - 98FE8CA3AFFF83CFF7FF83CFF6FE83CFF7FF83CFF7FF83CFF6FE83CFF7FF83CF - F7FF83CFF6FE83CFF7FF83CFF7FF83CFF6FE83CFF7FF83CFF6FE83CFF7FF83CF - F7FF83CFF6FE83CFF7FF76CAF6FF16A5EEFE0EA0EBFF0D9DE7FF0C99E1FE0C93 - D8FF329ACAFF75898CFE515252FF494747FF484646FE494747FF535B5FFF68BC - E2FE80D1F7FF80D1F7FF82CBEDFE82C8E7FF7FC5E5FF7EC4E4FE7EC4E4FF7EC4 - E4FF7EC4E4FE81B0C6FF616565FF4B4A4AFE494747FF494747FF484646FE4947 - 47FF2E2D2DB4000000420000001D000000050000000000000000000000000000 - 0000000000000000000000000000000000008AAEAE2F484646F2494747FF4947 - 47FF494747FF494747FE4D4D4DFF687171FE79AEBEFF1794D2FF0C95DBFE0D9B - E3FF0D9EE8FF0EA1EBFE6CC6F4FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2 - F7FE8AD2F7FF8AD2F7FF8AD2F7FE8CCBEBFF9FA3A5FFA6A5A5FFA6A5A5FEA6A5 - A5FFA6A5A5FFA6A5A5FEA6A5A5FFA6A5A5FFA6A5A5FEA6A5A5FFA4A3A3FF9B9B - 9BFE8DBED8FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2 - F7FF8AD2F7FE8AD2F7FF8AD2F7FF8AD2F7FE8AD2F7FF8AD2F7FE8AD2F7FF8AD2 - F7FF8AD2F7FE8AD2F7FF5DC0F3FF0EA0EBFE0D9EE8FF0D9AE2FF0C94DAFE1D95 - D0FF7298A3FF5A5F5FFE4A4848FF494747FF484646FE494747FF4F5050FF5D8E - A3FE7CCFF6FF80D1F7FF86C7E4FE899DA0FF6E7B7DFF636D6FFE626B6DFF626B - 6DFF616B6CFE5C6263FF515151FF4A4848FE494747FF494747FF484646FE4947 - 47FF434141ED0808085A0000002B0000000B0000000000000000000000000000 - 000000000000000000000000000000000000ABE2E2015E696989484646FE4846 - 46FE484646FE484646FE494747FE515252FE768484FE68ADC7FE0F91D3FE0C96 - DCFE0D9BE4FE0D9EE8FE39B1EFFE8FD4F6FE91D5F7FE91D5F7FE91D5F7FE91D5 - F7FE91D5F7FE91D5F7FE91D5F7FE93CEECFEA3A6A9FEA8A7A7FEA8A8A8FEA8A8 - A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA8A8A8FEA5A4A4FE9CA4 - A8FE92D1F2FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5 - F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5F7FE91D5 - F7FE91D5F7FE8DD3F6FE2AACEDFE0D9EE8FE0D9AE3FE0C95DBFE1091D2FE6CA1 - B3FE636B6BFE4C4B4BFE494747FE484646FE484646FE484646FE4A4949FE5659 - 59FE65AAC8FE7ED0F6FE7FD0F6FE89BACFFE6F7879FE535454FE4B4A4AFE4B4A - 4AFE4B4A4AFE4A4949FE494848FE494747FE484646FE484646FE484646FE4846 - 46FE484646FE2121219600000038000000140000000100000000000000000000 - 00000000000000000000000000000000000000000000ADE4E409494747D64947 - 47FF494747FF484646FE494747FF494747FE555757FF7C8E8FFF5BAACAFE0D91 - D4FF0C96DDFF0D9BE4FE11A0E9FF6DC6F3FF99D7F7FE99D7F8FF99D7F8FF99D7 - F7FE99D7F8FF99D7F8FF99D7F7FE9AD0ECFFA3A6A8FFA6A5A5FFA6A5A5FEA6A5 - A5FFA6A5A5FFA6A5A5FEA6A5A5FFA6A5A5FFA6A5A5FEA5A5A5FFA4A3A3FF9DBA - C9FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7 - F8FF99D7F7FE99D7F8FF99D7F8FF99D7F7FE99D7F8FF99D7F7FE99D7F8FF99D7 - F8FF99D7F7FE5DBFF1FF0F9FE8FF0D9AE3FE0C96DBFF1092D3FF5FA2BCFE6973 - 73FF4E4E4EFF494747FE494747FF494747FF484646FE494747FF494747FF4B4A - 4AFE596467FF6BB8DAFF7FD0F6FE80D0F6FF88ABBAFF656C6CFE4E4D4DFF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF3F3D3DDD000000430000001E0000000500000000000000000000 - 000000000000000000000000000000000000000000000000000088ABAB414A49 - 49F3494747FF484646FE494747FF484646FE4A4949FF595C5CFF819597FE50A7 - CCFF0E92D4FF0C96DCFE0D9BE3FF22A6EAFF89D0F5FEA1DAF8FFA1DAF8FFA0DB - F8FEA1DBF8FFA1DBF8FFA0DBF8FEA1D1E9FFA5A6A7FFA5A5A5FFA5A5A5FEA5A5 - A5FFA5A5A5FFA5A5A5FEA5A5A5FFA5A5A5FFA5A5A5FEA5A5A5FFA5A5A5FFA1D2 - EAFEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA1DB - F8FFA0DBF8FEA1DBF8FFA1DBF8FFA0DBF8FEA1DBF8FFA0DBF8FEA1DAF8FFA0DA - F8FF81CDF4FE17A2E8FF0D9AE3FF0C96DCFE1092D3FF58A1BEFF6F7C7DFE5051 - 51FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4947 - 47FE4E4D4DFF5C747CFF72C5EAFE80D1F7FF82CDF1FF849DA6FE5C6161FF4C4B - 4BFF494747FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FD0E0E0E60000000270000000800000000000000000000 - 0000000000000000000000000000000000000000000000000000000000006777 - 777C484646FE484646FE484646FE484646FE494747FE4B4A4AFE5A5E5EFE8299 - 9AFE55A9CCFE0D90D4FE0C96DBFE0D9AE2FE2AA9E9FE98D6F6FEA7DCF8FEA7DD - F8FEA7DDF8FEA7DEF8FEA7DEF8FEA8DBF5FEA8D1E5FEA8D0E4FEA8D0E4FEA8D0 - E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D0E4FEA8D1E5FEA7DE - F8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DE - F8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DEF8FEA7DDF8FEA7DDF8FEA7DCF8FE8CD1 - F4FE22A5E8FE0D99E1FE0C95DAFE0E90D3FE5DA3BFFE707E7FFE525353FE4947 - 47FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE494747FE505151FE5E8594FE7ACEF5FE80D0F6FE85C9E9FE7D8A8DFE575A - 5AFE4A4949FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE242323970000002E0000000C00000000000000000000 - 000000000000000000000000000000000000000000000000000000000000B8F6 - F6065B6363A9484646FE494747FF484646FE494747FF494747FF4B4949FE595D - 5DFF7E9091FF68ADC8FE1392D2FF0C94DAFF0C99E0FE26A6E8FF8BD0F4FFAFDF - F8FEAFDFF9FFAFE0F9FFAFE0F9FEAFE0FAFFAFE0FAFFAFE0FAFFAFE0F9FEAFE0 - FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0 - F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFE0FAFFAFE0 - FAFFAFE0F9FEAFE0FAFFAFE0FAFFAFE0F9FEAFDFF9FFAFDFF8FE7FCCF3FF1EA2 - E6FF0C98DFFE0C94D9FF1994D1FF69A4B9FE6D7878FF515252FF494747FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF4A4848FF535555FE639AB1FF7DCFF5FF80D0F6FE87C1DCFF7480 - 81FF545555FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE343333C5000000320000000E00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000A2D3D311464A4DCE494747FF484646FE494747FF494747FF494747FE4B49 - 49FF565959FF768585FE74AEC1FF2398D1FF0C92D7FE0D97DDFF1AA0E4FF6BC3 - F0FEAFDFF8FFB6E2F9FFB5E2F9FEB6E3FAFFB6E3FAFFB6E3FAFFB5E3F9FEB6E3 - FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3 - F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3FAFFB5E3F9FEB6E3FAFFB6E3 - FAFFB5E3F9FEB6E3FAFFB6E2F9FFB5E2F8FEAADDF7FF61BFEEFE149DE3FF0C96 - DDFF0C92D6FE2998CEFF729FADFF687272FE4F5050FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF4B4949FE575E5FFF73B2CDFF91D7F8FE8FD6F7FF91B8 - C9FF6B7474FE4F5050FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE3F3E3EDB040404370000000E00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000001B79A921464A4DDE484646FE484646FE484646FE484646FE4947 - 47FE4A4848FE525353FE6D7878FE83A9B1FE44A4CFFE0C90D4FE0C94DAFE0D98 - DFFE37ACE8FE8CD0F3FEBBE4F9FEBDE5F9FEBDE5F9FEBDE5FAFEBDE5FAFEBDE6 - FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6 - FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE6FAFEBDE5FAFEBDE5 - FAFEBDE5F9FEBDE5F9FEB9E3F8FE81CCF2FE2EA8E7FE0D98DFFE0C94D9FE0F91 - D3FE49A2C9FE7A969BFE606767FE4D4D4DFE494747FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE494747FE4C4C4CFE5F6C70FE95CDE6FEA9E0F9FEA8DE - F7FE94ABB4FE5F6565FE4C4B4BFE494747FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE444242E6060606390000000C00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000001A7BAC29454B4FDD494747FF494747FF484646FE4947 - 47FF494747FF494747FE4E4D4DFF5E6464FF809393FE71AEC4FF2799D1FF0C91 - D5FE0C95DBFF0E99E0FF34ABE7FE80CBF1FFB3E0F7FFC4E7FAFFC3E7F9FEC4E7 - FAFFC4E7FBFFC3E8FAFEC4E8FBFFC4E8FBFFC3E8FAFEC4E8FBFFC4E8FBFFC3E8 - FAFEC4E8FBFFC4E8FBFFC3E8FAFEC4E8FBFFC4E7FBFFC3E7FAFEC4E7FAFFC4E7 - FAFFAEDEF7FE76C7F0FF2EA8E6FF0C98DFFE0C95DAFF0C91D4FE2E9ACEFF71A4 - B4FF728080FE565858FF4B4A4AFF494747FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF4E4E4EFF677B82FEA6DCF4FFB0E1 - FAFFAEDDF3FE808C8EFF555757FF494747FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE434141E1060606310000000800000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000001A7BAC29464A4DDC494747FF484646FE4947 - 47FF494747FF484646FE494747FF4B4949FF545656FE6C7777FF83A2A6FF60AB - C8FE2197D1FF0D92D5FF0C94DAFE0E98DEFF1EA1E3FF49B4EAFF83CCF2FEAADD - F6FFBEE5F9FFC8E9FAFECAEAFAFFCAEAFAFFCAEAFAFECAEAFBFFCAEAFBFFCAEA - FAFECAEAFBFFCAEAFAFFCAEAFAFEC7E9FAFFBDE5F8FFA5DBF6FE7CC9F1FF45B2 - E9FF1A9EE2FE0D97DEFF0C94D9FF0E92D5FE2798CFFF61A5BFFE7A9093FF6168 - 68FF4F5050FE4A4848FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4A49 - 49FE4B4A4AFF4B4949FF494848FE494747FF494848FF525252FE80A3B1FFB4E3 - FAFFB5E4FAFE9EB8C2FF606666FF4B4949FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE3D3C3CD3030303220000000500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001B79A921464A4DCA484646FE4846 - 46FE484646FE484646FE484646FE494747FE494747FE4D4C4CFE595D5DFE717D - 7DFE85A5AAFE65ADC7FE2C9CD1FE0C90D3FE0C93D7FE0C95DBFE0C97DDFE119B - E1FE25A4E5FE3EAEE8FE58BAECFE6BC2EFFE79C8F0FE82CCF2FE86CDF2FE81CB - F2FE78C7F0FE69C1EEFE55B9EBFE3AADE8FE23A3E4FE0F99E0FE0C97DDFE0C95 - DAFE0C92D7FE0E91D3FE309CD0FE68A7BEFE7C9699FE677070FE535454FE4B4A - 4AFE494747FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE494747FE4D4C4CFE575A - 5AFE616767FE5D6363FE525353FE4A4848FE494747FE4A4949FE637175FEAFDE - F2FEBBE6FAFEAECDDBFE6A7171FE4C4B4BFE484646FE484646FE484646FE4846 - 46FE484646FE484646FE343333B2000000130000000200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001A7BAC0F3F515BA14947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494848FF4D4C - 4CFE585B5BFF6B7575FF84999AFE7CACBAFF54A7CAFF2C9CD1FF1192D2FE0C91 - D5FF0C93D8FF0C94D9FE0D95DBFF0D96DCFF0C96DDFE0D97DDFF0D97DDFF0C96 - DDFE0D96DDFF0D96DCFF0C95DBFE0C94D9FF0C93D7FF0C91D5FE1492D2FF2F9C - CFFF57A5C5FE7AA4B0FF7B8C8CFF626969FE525454FF4B4A4AFE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF555C5FFFA2D0 - E4FEBBE2F5FFAECEDDFF6B7272FE4D4D4DFF494747FF494848FE5C6263FFB0D9 - EBFFC2E8FBFEB4D1DEFF6C7474FF4C4C4CFE494747FF494747FF484646FE4947 - 47FF494747FF484646FE21202070000000090000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000E87C4053859 - 6A70484849EF484646FE494747FF494747FF484646FE494747FF494747FF4947 - 47FE494747FF4C4B4BFF535555FE606666FF717E7EFF80979AFF7FA9B3FE6AAA - C2FF51A6CBFF3AA0CEFE2799D0FF1C96D2FF1894D2FE1594D3FF1593D3FF1694 - D3FE1894D2FF1D96D2FF2999CFFE3CA0CDFF52A5C8FF6BA7BDFE7CA1AAFF7A8E - 90FF6A7474FE5B5F5FFF505151FF4A4949FE494747FF494747FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF55595AFFA9CF - DFFEC8EBFCFFC3E3F3FF869395FE585C5CFF4C4C4CFF4F4F4FFE718389FFC1E6 - F7FFC8EBFBFEB3CDD8FF686F6FFF4C4B4BFE494747FF494747FF484646FE4947 - 47FF494747FF484646F20909091F000000020000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000088B0B236535858CA484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE494747FE4A4848FE4C4C4CFE525353FE5A5F5FFE656E - 6EFE707C7CFE7B8C8CFE829899FE839FA3FE81A2A9FE7FA4ADFE7EA4ADFE7EA3 - ACFE80A1A7FE829DA0FE7F9495FE778686FE6D7777FE616868FE575A5AFE5050 - 50FE4B4A4AFE494747FE494747FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE494747FE4F5050FE8FAD - B9FECEEDFBFECEECFBFEB6CED8FE7A8787FE656D6DFE6E7B7DFEB2D2DFFECEED - FBFECEEDFBFE9FB1B7FE5D6262FE4A4949FE484646FE484646FE484646FE4846 - 46FE484646FE3130309400000006000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000ADE5E502768E8E724C4C4CE6484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF494747FF494747FE4A48 - 48FF4B4A4AFF4D4D4DFE505050FF525454FF545656FE565858FF565959FF5558 - 58FE535555FF525252FF4F4F4FFE4C4B4BFF4B4949FF494747FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF4B4949FF5F68 - 6AFEBCDCEAFFD4EFFCFFD4EFFCFECEE9F6FFC2DEEAFFCEECF9FED4EFFCFFD4EF - FCFFBFD7E2FE717A7AFF515252FF494747FE494747FF494747FF484646FE4947 - 47FF444242DC0B0A0A1D00000001000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000004A49491C4846468E494747F0494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF494747FE494747FF494747FF4947 - 47FE494747FF494747FF494747FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4E4D - 4DFE697578FFB0CBD5FFD2EBF7FED9F1FCFFDAF1FDFFD9F0FCFED2EAF6FFB4CA - D2FF798385FE565858FF4A4949FF494747FE494747FF494747FF484646FE4846 - 46F31F1F1F4C0000000100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000484646244846468A4846 - 46ED484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4947 - 47FE4D4D4DFE595C5CFE707D80FE859395FE8A979AFE869497FE768284FE6167 - 67FE525454FE4B4949FE494747FE484646FE484646FE484646FE484646FC2D2C - 2C63010101020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000004846 - 460B49474765494747BD484646F6494747FF494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF4A4848FF4C4B4BFE4E4E4EFF505050FF4F4F4FFE4D4D4DFF4B49 - 49FF494747FE494747FF494747FF484646FE494747FF464444E1302F2F4C0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000049474704484646224947476E494747B4494747E5484646F94947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FF484646FE494747FF494747FF484646FE4947 - 47FF494747FF484646FE494747FF494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FF484646FE494747FF494747FF484646FE494747FF4947 - 47FF484646FE494747FF494747FE484646EF413F3F943837371D000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000004846460F484646354846 - 46604846468B484646AE484646CD484646E4484646F3484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FE484646FE484646FE484646FE484646FE484646FE484646FE484646FE4846 - 46FC484646E2484646B24846466E484646210000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FFFFFFFFFFFFFFFFF - FFFF80000FFFFFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFFFE00000003FFFFF - FFFFFFFFFF000000000FFFFFFFFFFFFFFE0000000003FFFFFFFFFFFFF8000000 - 0000FFFFFFFFFFFFE000000000007FFFFFFFFFFFC000000000001FFFFFFFFFFF - 8000000000000FFFFFFFFFFE00000000000007FFFFFFFFFC00000000000003FF - FFFFFFF800000000000001FFFFFFFFF000000000000000FFFFFFFFF000000000 - 0000007FFFFFFFE0000000000000003FFFFFFFC0000000000000001FFFFFFF80 - 000000000000001FFFFFFF80000000000000000FFFFFFF000000000000000007 - FFFFFE000000000000000007FFFFFE000000000000000003FFFFFC0000000000 - 00000003FFFFFC000000000000000001FFFFF8000000000000000001FFFFF800 - 0000000000000000FFFFF0000000000000000000FFFFF0000000000000000000 - 7FFFF00000000000000000007FFFE00000000000000000007FFFE00000000000 - 000000003FFFE00000000000000000003FFFE00000000000000000001FFFC000 - 00000000000000001FFFC00000000000000000000FFFC0000000000000000000 - 0FFFC00000000000000000000FFFC000000000000000000007FFC00000000000 - 0000000007FFC000000000000000000003FFC000000000000000000003FFC000 - 000000000000000001FFC000000000000000000001FFC0000000000000000000 - 01FFC000000000000000000000FFC000000000000000000000FFC00000000000 - 00000000007FC0000000000000000000007FC0000000000000000000003FC000 - 0000000000000000003FE0000000000000000000003FE0000000000000000000 - 001FE0000000000000000000001FE0000000000000000000000FF00000000000 - 00000000000FF00000000000000000000007F00000000000000000000006F000 - 00000000000000000006F80000000000000000000002FC000000000000000000 - 0002FC0000000000000000000000FC0000000000000000000001FE0000000000 - 000000000001FE0000000000000000000000FF0000000000000000000000FF80 - 00000000000000000000FFC000000000000000000000FFC00000000000000000 - 0000FFE000000000000000000000FFF000000000000000000000FFF800000000 - 000000000000FFFC00000000000000000000FFFE00000000000000000000FFFF - 00000000000000000001FFFF80000000000000000001FFFFE000000000000000 - 0003FFFFF0000000000000000003FFFFFC000000000000000007FFFFFF000000 - 00000000000FFFFFFFC0000000000000003FFFFFFFF0000000000000007FFFFF - FFFF00000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28000000480000009000 - 0000010020000000000060540000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000003737370137373702373737043737370637373707373737073737 - 3707373737063737370537373703373737010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000001000000050000 - 000B000000130000001B00000023000000290000002E00000030000000310000 - 00310000002F0000002C000000260000001E000000160000000E000000070000 - 0002000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000040000000D0000001A000000290000 - 00370000004200000049030303520C0C0C64100F0F7110101073101010741010 - 10740E0D0D6B0707075B000000500000004C000000460000003B0000002F0000 - 0020000000110000000600000001000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000028272701070707060000001300000026000000390303034E121111742423 - 23A1333232C7424040E5474545F9484646FC484646FD484646FD484646FD4846 - 46FD484646FC474545FA444242EE383636D12A2929AF171616840606065F0000 - 004C0000003F0000002D000000190101010A1F1E1E0200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000D0C - 0C04000000120000002900000040121111702D2C2CB6424040E9484646FE4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF454343F23332 - 32C7181717860101015400000046000000320000001A03030308242323010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001A1A1A020000000D0000 - 0024020202421B1A1A873C3A3AD9484646FE494747FF484646FE494747FF4846 - 46FE494747FF494747FF484646FE494747FF484646FE494747FF484646FE4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4846 - 46FE494747FF424040E92322229F0606065E000000460000002E000000140808 - 0804000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001014140500000017000000341716 - 16783C3A3AD9484646FE494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4A4949FF4C4B4BFF4D4D4DFF4E4E4EFF4E4E4EFF4D4D - 4DFF4C4B4BFF4A4949FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF424040EA1F1E1E97020202540000003D0000 - 0020010101090000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000040505080000002009090950323131BE4846 - 46FE494747FF484646FE494747FF484646FE494747FF494747FE4C4C4CFF5456 - 56FE606666FF697879FF68848CFE638C9AFF6091A4FE5E94A9FF5E93A9FE5E90 - A4FF618A9AFE66838CFF687779FF5F6565FE545656FF4C4B4BFE494747FF4947 - 47FE494747FF484646FE494747FF484646FE494747FF3B3A3AD9100F0F740000 - 00480000002B0000000F546B6B01000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000505050A0000002718171776424141EA494747FF4947 - 47FF494747FF494747FF494747FF4B4A4AFF545656FF657071FF6A8B95FF5598 - B4FF3F9DC9FF2F9DD4FF2B9FD9FF2CA0DCFF2EA2DDFF30A3DEFF30A3DEFF2EA2 - DDFF2CA0DCFF2B9ED9FF2C9CD4FF399BCAFF4C95B5FF638895FF636E70FF5355 - 55FF4B4949FF494747FF494747FF494747FF494747FF494747FF464444F62322 - 229E010101500000003300000012515151020000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000606060A0101012B25242498484646FA494747FF484646FE4947 - 47FF494747FF4B4A4AFE575A5AFF6C7F82FE5A98B1FF399ECEFE289DD9FF2EA3 - DFFE33A7E3FF35AAE5FF38ACE7FE3AAEE9FF3BAEEAFE3CAFEAFF3CAFEAFE3CAF - EAFF3BAEE9FE39ADE8FF37ABE6FF34A8E3FE30A4DFFF279DD9FE319BCFFF4F93 - B0FE667C81FF565959FE4B4949FF494747FE494747FF494747FF484646FE4846 - 46FE323030C00404045800000037000000140327390200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000404040A0101012C2E2D2DAD484646FD494747FF494747FF494747FF4948 - 48FF525454FF6A7B7EFF599AB5FF2E9DD3FF2AA0DDFF2FA6E3FF34AAE7FF37AD - EAFF39B0ECFF3BB1EEFF3DB3EFFF3EB4EFFF3EB4F0FF3FB4F0FF3FB4F0FF3FB4 - F0FF3FB4EFFF3EB3EFFF3EB2EEFF3CB1ECFF3AAFEBFF36ACE8FF32A7E4FF2BA1 - DEFF289AD4FF4B95B5FF65787CFF525454FF494848FF494747FF494747FF4947 - 47FF494747FF393737D30606065D0000003700000013526E6E01000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000D12 - 1206010101282E2D2DAC484646FE494747FF484646FE494747FF4B4A4AFE5F65 - 65FF6994A3FF349DCFFE269FDCFF2DA6E3FE31AAE8FF35AEECFE38B0EEFF39B2 - EFFE3AB3F0FF3BB4F1FF3BB4F1FE3CB4F1FF3CB4F1FE3DB5F2FF3DB5F1FE3DB5 - F2FF3DB4F1FE3EB5F1FF3DB5F1FF3DB4F1FE3CB3F0FF3BB2EEFE38B0ECFF35AC - E9FE30A7E4FF28A0DDFE2A99CFFF5A8EA3FE5D6363FF4B4A4AFF494747FE4947 - 47FF484646FE494747FF3C3B3BDB0505055B000000350000000F5E7E7E010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000263333040000 - 001E2D2C2CA6484646FE494747FF494747FF494747FF4E4E4EFF6A7778FF539D - BDFF239BD8FF28A2E1FF2DA8E7FF31ADECFF33AFEEFF35B1F0FF36B2F1FF37B2 - F1FF37B2F2FF37B3F2FF38B3F2FF38B3F2FF38B3F2FF39B3F2FF39B3F2FF39B3 - F2FF39B3F2FF39B3F2FF3AB4F2FF3AB4F2FF3AB4F2FF39B3F1FF39B3F0FF38B1 - EFFF36AFEDFF31ABE9FF2BA5E2FF229BD9FF4196BDFF647478FF4E4D4DFF4947 - 47FF494747FF494747FF494747FF393838D4050505580000002E0304040B0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000526E6E0100000014201F - 1F82484646FE494747FF494747FF494747FF505050FF6F8285FF419DC7FF219C - DBFF27A4E4FF2BA9EAFF2EADEDFF30AEEFFF31B0F0FF32B0F1FF32B0F1FF32B0 - F1FF33B1F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF34B1F1FF34B1F1FF35B1 - F1FF35B2F2FF36B2F2FF36B2F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B2 - F1FF36B1F0FF34AFEEFF31ACEBFF2BA7E6FF239EDDFF3197C8FF657D83FF4F50 - 50FF494747FF494747FF494747FF494747FF333232C40000004B000000240E11 - 1105000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000B131313584745 - 45F7484646FE494747FF494747FE505151FF70878CFE359CCDFF1F9CDDFE24A4 - E6FF28A9EBFF2AACEEFE2BADF0FF2CAEF0FE2DAFF1FF2DAFF0FE2DAFF1FF2EAF - F0FE2EAFF1FF2EAFF1FF2EAFF0FE2FAFF1FF2FAFF0FE2FB0F1FF30B0F0FE30B0 - F1FF30B0F0FE30B0F1FF31B0F1FF31B0F0FE31B0F1FF32B0F1FE32B0F1FF32B0 - F1FE32B0F1FF32B0F0FE31AFEFFF2EACECFE29A7E7FF239FDFFF2797CEFE6481 - 8AFF505050FE494747FF484646FE494747FF484646FE262525A4000000420000 - 00181B1A1A020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001315150405040428413F3FDF4947 - 47FF494747FF494747FF4E4E4EFF6F8285FF379CCCFF1C9CDDFF21A3E6FF25A8 - ECFF27ABEFFF27ACF0FF28ACF1FF28ADF1FF28ADF1FF28ADF1FF29ADF1FF29AD - F1FF29ADF1FF29ADF1FF2AADF1FF2AADF1FF2AAEF1FF2BAEF1FF2BAEF1FF2BAE - F1FF2BAEF1FF2CAEF1FF2CAEF1FF2CAEF1FF2DAEF1FF2DAFF1FF2DAFF1FF2DAF - F1FF2EAFF1FF2EAFF1FF2EAFF0FF2DAEEFFF2BABEDFF27A7E8FF219EDFFF2796 - CDFF647D83FF4D4D4DFF494747FF494747FF494747FF474545F9121212770000 - 00330000000B0000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000102D2C2CA0494747FF4947 - 47FF494747FE4B4A4AFF6B7778FE439EC7FF199ADBFE1DA2E6FF21A7EBFE22A9 - EEFF23AAF0FF23ABF0FE24ABF0FF24ABF0FE24ABF0FF24ABF0FE25ABF0FF25AB - F0FE25ACF0FF26ACF0FF26ACF0FE26ACF1FF26ACF0FE26ACF1FF27ACF0FE27AC - F1FF27ACF0FE27ACF1FF28ADF1FF28ADF0FE28ADF1FF3990BDFE3698CAFF2AAB - EDFE29ADF1FF29ADF0FE2AADF1FF29ADF0FE29ACEFFF28AAECFF24A5E7FE1E9D - DEFF2F96C8FE647376FF4B4A4AFE494747FF484646FE494747FF3E3D3DE00303 - 034F000000201211110300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000511111148474545F7494747FF4947 - 47FF494848FF5E6465FF589FBBFF1697D9FF199FE4FF1CA5EAFF1EA8EEFF1FA0 - E2FF2F6581FF3D708AFF42748EFF42748EFF42748EFF3B7D9FFF21A9EEFF21AA - F0FF21AAF0FF22AAF0FF22AAF0FF22AAF0FF22AAF0FF23ABF0FF23ABF0FF23AB - F0FF23ABF0FF24ABF0FF24ABF0FF24ABF0FF26A7EAFF535D63FF595959FF5264 - 6EFF4180A1FF2F9ED7FF26ABEFFF26ACF0FF26ACF0FF26ABEFFF24A8ECFF20A3 - E6FF199ADBFF4194BBFF5D6363FF494747FF494747FF494747FF484646FE2524 - 24A1000000390000000E00000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000001010110373636BF484646FE494747FF4947 - 47FF525454FE7096A2FF1996D5FE169CE1FF18A3E9FE1AA6EEFF1AA7EFFE1BA7 - EFFF285C77FF434242FE515050FF535252FE545252FF535152FE2B8EC1FF1DA8 - EFFE1DA8F0FF1DA8F0FF1DA8EFFE1EA9F0FF1EA9EFFE1EA9F0FF1EA9EFFE1FA9 - F0FF1FA9EFFE1FA9F0FF20A9F0FF20A9EFFE3288B4FF565454FE575555FF5755 - 55FE575555FF575657FE4B6979FF3986AEFE27A2E1FF22AAEFFF22A9EEFE20A6 - EBFF1BA0E4FE1796D7FF5B8DA1FE515252FF494747FE494747FF494747FF4442 - 42F10908085A0000002016161603000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000031615154F484646FC494747FF494747FF4B49 - 49FF6D7B7DFF359BCCFF1298DDFF15A0E7FF16A4EDFF17A6EFFF17A6F0FF17A6 - F0FF1998D9FF32373AFF494747FF504E4EFF514F4FFF514F4FFF465D6AFF1BA3 - E9FF19A7F0FF19A7F0FF19A7F0FF1AA7F0FF1AA7F0FF1AA8F0FF1AA7F0FF1AA8 - F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA7EEFF446272FF545252FF545252FF5452 - 52FF545252FF545353FF555353FF555353FF525659FF40697FFF2689BCFF1DA7 - EDFF1BA3E9FF179CDFFF2295CEFF65767AFF4B4949FF494747FF494747FF4947 - 47FF282727A8000000340202020A000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000B363434B6494747FF484646FE494747FF5658 - 58FF659EB3FE1094D7FF119CE3FE13A2EAFF14A4EEFE14A5EFFF15A5EFFE15A5 - EFFF15A5EFFF1F6487FE3B3A3AFF4C4A4AFE4E4C4CFF4E4C4CFE4E4C4DFF2D7E - A9FE16A6F0FF16A6F0FF16A6EFFE16A6F0FF17A6EFFE17A6F0FF17A6EFFE17A6 - F0FF17A6EFFE18A6F0FF18A7F0FF2294CEFE4E4F50FF514F4FFE514F4FFF514F - 4FFE514F4FFF514F4FFE525050FF525050FE514F4FFF454444FF266A8DFE1AA7 - EFFF19A5ECFE16A0E6FF1396DAFE4B92B1FF555858FE494747FF494747FF4846 - 46FE434242ED0505054D00000017252424010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000010D0D0D31484646F9494747FF494747FF4B4A4AFF707F - 7FFF2B9AD0FF0E98DEFF109FE8FF11A2EDFF11A4EEFF11A4EFFF12A4EFFF12A4 - EFFF12A4EFFF139BE0FF293841FF434141FF4C4A4AFF4C4A4AFF4D4B4BFF4751 - 57FF189DE1FF13A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5EFFF14A5 - EFFF15A5EFFF15A5EFFF15A5EFFF356D8BFF4E4C4CFF4F4D4DFF4F4D4DFF4D4B - 4BFF474545FF464545FF4C4A4AFF4F4D4DFF4C4A4AFF383A3CFF1996D7FF17A6 - F0FF16A5EEFF15A2EAFF129AE1FF1C94D0FF657A7FFF4A4949FF494747FF4947 - 47FF484646FE1D1C1C8C0000002A0A0A0A060000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000327262684494747FF494747FF494747FF535555FF6B9D - AEFF0C92D7FF0E9BE3FF0FA0EBFF0FA2EEFF0FA3EFFF0FA3EFFF10A3EFFF10A4 - EFFF10A4EFFF10A4EFFF186E9AFF353434FF474545FF4A4848FF4A4848FF4A48 - 48FF307091FF11A4EFFF11A4EFFF11A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4 - EFFF12A4EFFF12A4EFFF159FE6FF464D51FF4C4A4AFF4C4A4AFF4C4A4AFF4544 - 44FF313030FF2C2A2AFF363434FF403E3EFF3F3E3EFF265065FF14A5EFFF14A5 - EFFF14A5EEFF13A2ECFF109DE5FF0E94D9FF5192ADFF525353FF494747FF4947 - 47FF494747FF373535CD0000003E000000110000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000101010A403E3ED2484646FE494747FF494747FE666F70FF3E9E - CAFF0C96DCFE0D9DE7FF0EA1EDFE0EA2EEFF0EA2EEFE0EA3EFFF0EA2EEFE0EA3 - EFFF0EA3EFFF0EA2EEFE0F9FE9FF233B48FE3E3C3CFF494747FE4A4848FF4947 - 47FE464A4DFF1993D1FF0FA3EEFE0FA3EFFF0FA3EEFE0FA3EFFF0FA3EEFE10A3 - EFFF10A3EEFE10A3EFFF257CA9FF494747FE4A4848FF4A4848FE494747FF3A39 - 39FE1B658CFF16587AFE1C2B33FF232323FE262525FF167DB2FF12A4EEFE12A4 - EFFF11A4EEFE10A2EDFF0F9FE8FE0D97DEFF2696CCFE636B6BFF494747FF4846 - 46FE494747FF484646FC0E0E0E68000000231414140300000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000C0C0C2B484646F7494747FF494747FF4C4B4BFF758E93FF1995 - D3FF0D99E1FF0D9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF1379ADFF303030FF454343FF494747FF4947 - 47FF494747FF356178FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0FA1EDFF395969FF494747FF4A4848FF494747FF454343FF2E37 - 3DFF109BE2FF0FA3EFFF0F9BE2FF1371A2FF154964FF109EE7FF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA2EEFF0EA0EBFF0D9AE3FF0D92D5FF668690FF4C4B4BFF4947 - 47FF494747FF494747FF2D2C2CB4000000370101010C00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000201F1F63494747FF484646FE494747FF535454FE689EB2FF0C93 - D7FF0D9BE4FE0EA1EBFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0EA1ECFE1E455AFF3B3939FE474545FF4846 - 46FE494747FF484646FF1C88C0FE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE188FCCFF464647FF494747FE494747FF484646FE3E3C3CFF1E59 - 77FE0EA3EFFF0EA2EEFE0EA3EFFF0EA2EEFE0EA3EFFF0EA3EFFF0EA2EEFE0EA3 - EFFF0EA2EEFE0EA2EEFF0DA1ECFE0D9DE6FF0C94DAFE4D92B0FF525454FF4846 - 46FE494747FF484646FE444242F1070707550000001C1F1E1E02000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000067676701312F2F94494747FF494747FF494747FF5E6363FF4EA2C5FF0C95 - DBFF0D9DE7FF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1186C2FF2C2E2FFF434141FF4846 - 46FF494747FF494747FF3B5766FF0F9FE9FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF2C6B8CFF484646FF494747FF494747FF464444FF343435FF1285 - BFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9EE8FF0D97DDFF3396C4FF5D6262FF4947 - 47FF494747FF494747FF494747FE222121980000003001010108000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000067676703393737BE494747FF484646FE494747FF6B7575FE349ECFFF0D97 - DEFF0D9EE8FE0EA2EDFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA2EEFF1B516CFE383737FF4745 - 45FE494747FF494747FF484646FE247CA9FF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0F9EE7FE414B52FF494747FF484646FE484646FF424040FE26404DFF0EA1 - EDFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FE9FF0D99E0FE1E94CFFF657274FF4947 - 47FE494747FF484646FE494747FF3F3D3DE201010145000000162A2929010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000069696907464444DC494747FF494747FF4A4949FF778787FF1E97D2FF0D99 - E0FF0E9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1090D2FF292F33FF413F - 3FFF484646FF494747FF494747FF424E55FF119CE2FF0EA3EFFF0EA3EFFF0EA3 - EFFF1F81B4FF474646FF494747FF494747FF484646FF3A3838FF186B95FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D9AE2FF1393D4FF677F85FF4A48 - 48FF494747FF494747FF494747FF484646FE1717177D000000290B0B0B050000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000069696909484646F0494747FF484646FE4C4B4BFF7B9396FE1293D4FF0D9A - E2FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE185D80FF3534 - 34FE464444FF494747FF484646FE484646FF2C7093FE0EA3EFFF0DA2EEFE0EA2 - EEFF345E75FE484646FF494747FF484646FE454343FF2F3437FE1094D8FF0DA2 - EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA0EBFF0D9BE3FE0D92D6FF648793FF4B4A - 4AFE494747FF484646FE494747FF484646FE353434C90000003D000000100000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00006969690B484646FE494747FF494747FF4D4D4DFF78979FFF0F92D5FF0D9A - E3FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F98DEFF2534 - 3BFF3F3E3EFF484646FF494747FF494747FF45494DFF1693D4FF0EA3EFFF1397 - DBFF43474AFF494747FF494747FF484646FF3F3D3DFF205069FF0EA2EEFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D9BE5FF0C92D7FF608C9DFF4C4B - 4BFF494747FF494747FF494747FF494747FF474545F90E0E0E67000000211414 - 1403000000000000000000000000000000000000000000000000000000000000 - 00006969690B494747FF494747FF494747FF4E4E4EFF769AA3FF0E92D5FF0D9A - E3FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF166A - 96FF333232FF454444FF494747FF494747FF484646FF34637BFF0EA3EFFF227C - AAFF474545FF494747FF494747FF474545FF363536FF147CB2FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D9CE5FF0C93D7FF5E8EA1FF4D4C - 4CFF494747FF494747FF494747FF494747FF494747FF2B2929B0000000350100 - 000B000000000000000000000000000000000000000000000000000000000000 - 00006969690B484646FE494747FF484646FE4E4E4EFF7799A2FE0E92D5FF0D9A - E3FF0DA0EBFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0E9F - E9FE223A46FF3D3C3CFF484646FE494747FF484646FE474748FF1D89C1FE3561 - 77FF484646FE494747FF494747FF434141FE293942FF0EA0EAFE0EA3EFFF0DA2 - EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA1ECFF0D9CE5FE0C93D7FF5E8EA0FF4D4C - 4CFE494747FF484646FE494747FF484646FE494747FF464444F30504044F0000 - 001B1F1E1E010000000000000000000000000000000000000000000000000000 - 00006969690A484646FE494747FF494747FF4D4C4CFF7A989EFF0F92D5FF0D9A - E2FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF1478ABFF302F2FFF454343FF484646FF494747FF494747FF3E5866FF454B - 4FFF494747FF494747FF484646FF3C3A3AFF1B6185FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EFFF0EA1ECFF0D9BE4FF0C92D7FF628D9CFF4C4B - 4BFF494747FF494747FF494747FF494747FF494747FF494747FF201F1F940000 - 002F050505070000000000000000000000000000000000000000000000000000 - 000069696907484646F0494747FF484646FE4C4B4BFF7C9295FE1493D4FF0D9A - E1FF0DA0EAFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3 - EEFE10A1EBFF25485BFF434141FE504F4FFF525151FE535151FF535151FE5351 - 51FF525050FE504E4EFF4B4949FF333638FE118ECDFF0DA2EEFE0EA3EFFF0DA2 - EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA0EBFF0D9BE3FE0E92D6FF678892FF4B4A - 4AFE494747FF484646FE494747FF484646FE494747FF484646FE3E3C3CDE0202 - 0246000000152928280100000000000000000000000000000000000000000000 - 000069696904484646DB494747FF494747FF4A4949FF768586FF2499D2FF0D98 - E0FF0E9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF11A4EFFF1BA7EFFF22AA - F0FF26ACF0FF2992C7FF434243FF565555FF5B5959FF5B5959FF5B5959FF5B59 - 59FF5B5959FF5B5959FF545353FF395A6BFF23A9EFFF1CA8EFFF13A4EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D9AE2FF1694D3FF697E84FF4A48 - 48FF494747FF494747FF494747FF494747FF494747FF494747FF484646FE1514 - 147A000000270B0B0B0500000000000000000000000000000000000000000000 - 0000000000003A3838BC494747FF484646FE494747FF697373FE3CA1CFFF0D97 - DDFF0D9EE8FE0EA2EDFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0EA3EFFF0DA2EEFE0EA3EFFF13A5EFFE23ABF0FF2DAEF0FE2EAFF1FF2DAF - F0FE2EAFF1FF2EAFF1FF3A667DFE535151FF605E5EFE615F5FFF615F5FFE615F - 5FFF615F5FFE605E5EFF535151FF3586AFFE2EAFF1FF2DAFF0FE2DAFF0FF25AB - F0FE15A5EFFF0EA3EEFE0EA3EFFF0DA2EEFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FE9FF0D98DFFE2496CDFF667172FF4947 - 47FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF3533 - 33C60000003C0000001000000000000000000000000000000000000000000000 - 00000000000034323291494747FF494747FF494747FF5C6161FF58A5C4FF0C95 - DAFF0D9DE6FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0FA3EFFF21AAF0FF34B1F1FF36B2F2FF36B2F1FF36B2F2FF36B2 - F1FF36B2F2FF36B2F2FF38A1D8FF4D5255FF616060FF676565FF676565FF6765 - 65FF676565FF636161FF4F5559FF36ADEAFF36B2F2FF36B2F1FF36B2F2FF36B2 - F1FF35B1F1FF25ABF0FF10A3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA1EDFF0D9EE7FF0D96DDFF3C98C2FF5C6060FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4745 - 45FA0C0B0B610000002100000003000000000000000000000000000000000000 - 0000000000002120205C494747FF484646FE494747FF525353FE73A1B0FF0D92 - D6FF0D9BE3FE0EA0EBFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0EA3 - EFFF0FA3EFFF2DAFF0FE3DB5F1FF3DB5F1FE3DB5F2FF3DB5F1FE3DB5F2FF3DB5 - F1FE3DB5F2FF3DB5F2FF3DB5F1FE487D98FF636161FE6C6B6BFF6D6B6BFE6D6B - 6BFF6D6B6BFE646363FF4A7991FF3DB5F1FE3DB5F2FF3DB5F1FE3DB5F2FF3DB5 - F1FE3DB5F2FF3DB5F1FE32B0F1FF12A4EFFE0EA3EFFF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA2EEFF0DA1ECFE0D9CE5FF0C94D9FE5894ACFF515252FF4846 - 46FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF4947 - 47FF2A2929AD000000350000000B000000000000000000000000000000000000 - 0000000000000E0D0D22484646F7494747FF494747FF4B4A4AFF788D8FFF2298 - D2FF0D98E0FF0D9FE9FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0FA3 - EFFF32B0F1FF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8 - F2FF46B8F3FF46B8F3FF46B8F2FF48B1E7FF697075FF737272FF737272FF7372 - 72FF727070FF636464FF4AA2CFFF46B8F2FF46B8F3FF46B8F2FF46B8F3FF46B8 - F2FF46B8F3FF46B8F2FF46B8F3FF3AB3F1FF10A4EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA2EEFF0EA0EAFF0D99E1FF1092D4FF6E868BFF4B4A4AFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF434141ED050505500000001A000000010000000000000000000000000000 - 00000000000002010101424141D1484646FE494747FF494747FE646C6CFF4EA3 - C8FF0C95DBFE0D9DE6FF0DA1ECFE0EA2EEFF0DA2EEFE0EA3EFFF0DA2EEFE27AC - F0FF4EBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBB - F3FE4FBBF3FF4FBBF3FF4FBBF3FE50B9F0FF737D82FE7A7979FF7A7979FE7A79 - 79FF757474FE61737DFF4FB9F0FF4FBBF3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBB - F3FE4FBBF3FF4FBBF3FE4FBBF3FF4FBBF3FE31B0F1FF0EA3EFFF0DA2EEFE0EA3 - EFFF0DA2EEFE0EA1EDFF0D9EE7FE0C96DDFF359AC9FE616868FF494747FF4846 - 46FE494747FF484646FE494747FF484646FE494747FF484646FE494747FF4947 - 47FF484646FE1F1E1E900000002E000000070000000000000000000000000000 - 000000000000000000002A29297C494747FF494747FF494747FF525353FF79A0 - AAFF0F92D5FF0D9AE2FF0E9FEAFF0EA2EEFF0EA3EFFF0EA3EFFF11A4EFFF51BC - F3FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF - F4FF59BFF4FF59BFF4FF59BFF4FF61ADD4FF807E7EFF818080FF818080FF807F - 7FFF777676FF6098B5FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF - F4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF55BEF3FF18A7EFFF0EA3EFFF0EA3 - EFFF0EA2EEFF0EA0EBFF0D9BE4FF0D93D7FF6094A8FF505151FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF3D3B3BDD01010143000000140000000000000000000000000000 - 0000000000000000000012111123484646F9494747FF494747FF4A4949FF6F7A - 7BFF3EA1CFFF0C96DCFF0D9DE7FF0EA1ECFF0EA2EEFF0EA3EFFF26ACF0FF61C2 - F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2 - F4FF62C2F4FF62C2F4FF62C2F4FF769EB4FF888787FF888787FF888787FF8685 - 85FF787A7BFF63BAE7FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2 - F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF62C2F4FF33B1F1FF0EA3EFFF0EA2 - EEFF0EA1EDFF0D9EE8FF0D97DEFF2797CDFF697779FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF484646FD15141477000000260000000500000000000000010000 - 00000000000000000000010101013C3A3AAF494747FF484646FE494747FF5456 - 56FF76A2AFFE1293D5FF0D99E1FE0D9FE9FF0DA1EDFE0EA2EEFF3AB3F1FE6BC6 - F5FF6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6 - F5FE6BC6F5FF6BC6F5FF6CC4F1FE8A959BFF8F8E8EFE8F8E8EFF8F8E8EFE8A88 - 88FF7793A2FE6BC6F4FF6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6 - F5FE6BC6F5FF6BC6F5FE6BC6F5FF6BC6F5FE6BC6F5FF49B9F2FF0DA2EEFE0EA2 - EEFF0DA0EAFE0D9BE3FF0D92D7FE5F96ABFF545656FE494747FF4A4848FF4C4B - 4BFE4C4C4CFF4C4C4CFE4C4C4CFF4C4C4CFE4C4C4CFF4C4B4BFE4B4A4AFF4947 - 47FF484646FE494747FF323131C30000003B0000000F00000000000000010000 - 00000000000000000000000000002524243E484646FB494747FF494747FF4A49 - 49FF6C7777FF4AA3CAFF0C94DAFF0D9CE5FF0EA0EBFF0EA2EEFF43B7F2FF75CB - F6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF86A2B1FF919E - A6FF929FA6FF929FA6FF929EA4FF979696FF979696FF979696FF969595FF8D8C - 8CFF79B4D2FF75CBF6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF75CA - F6FF75CBF6FF75CAF6FF75CBF6FF75CAF6FF75CBF6FF53BDF3FF0EA2EEFF0EA1 - ECFF0D9DE6FF0C96DCFF3299CAFF677274FF4A4949FF4A4848FF53656DFF6C8D - 9BFF70929FFF70929FFF70929FFF70929FFF70929FFF6F919EFF697B82FF4F4F - 4FFF494747FF494747FF474545F80B0B0B5F0000002000000002000000010000 - 000000000000000000000000000000000000484646B8484646FE494747FF4947 - 47FF515151FE7C979CFF2198D2FE0C97DEFF0D9DE7FE0EA1ECFF3BB3F1FE7FCE - F6FF7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE92A1AAFF9E9D - 9DFE9F9E9EFF9F9E9EFF9E9D9DFE9F9E9EFF9E9D9DFE9F9E9EFF9C9B9BFE8E97 - 9BFF80CBF2FE7FCEF6FF7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCE - F6FE7FCEF6FF7FCEF6FE7FCEF6FF7FCEF6FE7FCEF6FF4CBAF2FF0DA1ECFE0D9E - E8FF0D98E0FE1693D3FF6C8F99FE505050FF494747FE4A4949FF5A8CA1FF7FD0 - F6FE80D1F7FF7FD0F6FE80D1F7FF7FD0F6FE80D1F7FF7FD0F6FE82ADC0FF5456 - 56FF484646FE494747FF484646FE282727A9000000340000000A000000010000 - 000000000000000000000000000000000000748A8A33484646F7494747FF4947 - 47FF494747FF5C6060FF71A5B7FF1294D5FF0D99E0FF0D9EE8FF1EA7EDFF86D0 - F6FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF9AA9B0FFA5A4 - A4FFA6A5A5FFA6A5A5FFA6A5A5FFA6A5A5FFA6A5A5FFA5A4A4FF9F9F9FFF90B1 - C3FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF89D2 - F7FF89D2F7FF89D2F7FF89D2F7FF89D2F7FF88D1F7FF2FAEEFFF0D9FE9FF0D9A - E2FF0E93D6FF5A9AB4FF5B5F5FFF494747FF494747FF4A4848FF566F79FF78CB - F1FF80D0F6FF8BB5C4FF758C92FF697C82FF687B81FF687B81FF606B6EFF4D4D - 4DFF494747FF494747FF494747FF424141EB0404044D00000018000000010000 - 00000000000000000000000000000000000000000000626F6F91494747FF4947 - 47FF484646FE4B4A4AFF687272FE5FA7C3FF0D92D7FE0D99E1FF0D9EE8FE65C3 - F3FF92D5F7FF92D5F7FE92D5F8FF92D5F7FE92D5F8FF92D5F7FEA0ADB4FFA8A7 - A7FEA8A8A8FFA8A8A8FFA8A7A7FEA8A8A8FFA8A7A7FEA8A7A7FFA1A1A2FE94CC - E9FF92D5F7FE92D5F8FF92D5F8FF92D5F7FE92D5F8FF92D5F7FE92D5F8FF92D5 - F7FE92D5F8FF92D5F7FE92D5F8FF92D5F7FE77CAF4FF11A0E9FF0D9AE3FE0C93 - D8FF479CC1FE656F6FFF4B4949FE494747FF484646FE494747FF4E4D4DFF618D - 9FFE7DCFF5FF82CCEEFE7A8C91FF535454FE4B4949FF4A4949FE4A4848FF4947 - 47FF484646FE494747FF484646FE484646FE1D1C1C8B00000027000000040000 - 00000000000000000000000000000000000000000000ABE2E20D4E4F4FDA4947 - 47FF494747FF494747FF4D4C4CFF707D7EFF52A5C8FF0D93D7FF0D99E1FF1FA5 - EAFF8DD2F6FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FFA3ACB1FFA5A4 - A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA5A4A4FFA2B0B8FF9DD9 - F7FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9F8FF9DD9 - F8FF9DD9F8FF9DD9F8FF9DD9F8FF97D6F7FF2CABEBFF0D9AE3FF0C94D9FF3B9A - C6FF6C7A7BFF4C4C4CFF494747FF494747FF494747FF494747FF494747FF5152 - 52FF66A3BDFF7FD0F6FF84C4E2FF6F7A7CFF4E4D4DFF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF383737CF000000360000000A0000 - 000000000000000000000000000000000000000000000000000092BABA3D4846 - 46F6484646FE494747FF494747FE4F4F4FFF748384FE52A5C9FF0D92D6FE0D99 - E0FF31ACEAFF9DD8F7FEA6DCF8FFA6DDF8FEA6DDF9FFA6DDF8FEA8C9D9FFA8C6 - D5FEA8C6D5FFA8C6D5FFA8C6D5FEA8C6D5FFA8C6D5FEA8C6D5FFA7D1E7FEA6DD - F9FFA6DDF8FEA6DDF9FFA6DDF9FFA6DDF8FEA6DDF9FFA6DDF8FEA6DDF9FFA6DD - F8FEA6DDF9FFA6DCF8FEA2DAF7FF45B4EDFE0D99E1FF0C93D8FF3C9BC7FE6D7F - 81FF4E4E4EFE494747FF484646FE494747FF484646FE494747FF494747FF4948 - 48FE555C5EFF6EB8D8FE80D0F6FF86B8CEFE636A6AFF4B4A4AFE494747FF4947 - 47FF484646FE494747FF484646FE494747FF474545F90707074B000000100000 - 0000000000000000000000000000000000000000000000000000000000007891 - 916A494747FE494747FF494747FF494747FF4E4E4EFF707D7DFF62A7C2FF1293 - D5FF0C97DDFF2EA9E8FF96D5F5FFB0E0F8FFB0E0F9FFB0E1FAFFB0E1FAFFB0E1 - FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1 - FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E1FAFFB0E0 - F9FFB0E0F9FFA0D9F6FF3DAFEAFF0D98DFFF0F93D6FF4C9DC1FF6C797AFF4E4D - 4DFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4949FF596A70FF75C5E9FF81D1F7FF84A9B8FF5C6060FF4A4848FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF17161674000000140000 - 000000000000000000000000000000000000000000000000000000000000B9F8 - F80138586992494747FE494747FF494747FF494747FF4D4C4CFF677171FF72A5 - B6FF2398D2FF0C94DAFF1A9FE2FF6FC4EFFFB2E1F8FFB9E3F9FFB9E4FAFFB9E4 - FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4 - FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB9E4FAFFB6E2 - F8FF7DCAF1FF22A3E4FF0C95DBFF1995D2FF629DB3FF656F6FFF4D4C4CFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4C4B4BFF67828DFF9CD9F6FF9FD9F5FF879AA1FF545555FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF2423238B000000120000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000E88C50638596BA1484646FE494747FF484646FE494747FF4B4949FE5B5F - 5FFF7C9599FF4EA4C9FE1293D4FF0C95DBFE28A5E4FF73C5EFFEB1DFF7FFC2E7 - FAFEC3E7FAFFC3E7FAFFC2E7FAFEC3E7FBFFC2E8FAFEC3E8FBFFC2E8FAFEC3E8 - FBFFC2E7FAFEC3E7FBFFC3E7FBFFC2E7FAFEC3E7FAFFB6E2F8FE7FCAF1FF32A9 - E6FE0D96DDFF0F93D5FE3F9DC8FF739198FE595E5EFF4A4949FF494747FE4947 - 47FF484646FE494747FF484646FE494747FF484646FE494747FF494747FF4846 - 46FE494747FF494747FE4F4F4FFF7B9EACFEADE1F9FFACD9EEFE727B7CFF4C4C - 4CFF484646FE494747FF484646FE494747FF484646FE252424890000000D0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000E88C60638596A9C494747FD494747FF494747FF494747FF4947 - 47FF505050FF6A7475FF77A1ACFF42A2CDFF1293D5FF0C95DAFF179CE0FF42B0 - E8FF75C6F0FFA0D9F5FFBCE4F8FFC5E8FAFFC9E9FAFFCBEAFAFFCBEAFAFFC9E9 - FAFFC6E8FAFFBFE5F9FFA6DBF6FF7CC9F0FF4BB4EAFF1C9FE1FF0D95DBFF0F93 - D5FF379CCCFF6B9BABFF687272FF505050FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4A4949FF4D4D - 4DFF4D4C4CFF494848FF494747FF545758FF9CC9DDFFB6E4FAFF95ACB4FF5355 - 55FF494747FF494747FF494747FF494747FF494747FF1C1B1B6E000000070000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000E88C50338596B7D484646FA494747FF484646FE4947 - 47FF494747FF4A4949FE535555FF6D7878FE789EA7FF54A4C6FE279AD2FF0E92 - D5FE0C94DAFF0D96DDFF129ADFFE22A2E3FF2EA7E5FE35AAE6FF36ABE6FE30A8 - E5FF24A3E3FE149BE0FF0D97DDFF0C94DAFE0C92D6FF2198D2FE4AA0C6FF7099 - A6FE6B7677FF535555FE4A4949FF494747FE494747FF494747FF484646FE4947 - 47FF484646FE494747FF484646FE494747FF484646FE4A4848FF64747AFF8DA5 - AFFE7F8F94FF525353FE494747FF4B4A4AFE84A1ACFFBFE7FAFEA5BEC9FF585B - 5BFF484646FE494747FF484646FE494747FF484646FE0F0E0E38000000020000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000296A8B4D47494BE7494747FF4947 - 47FF494747FF494747FF494747FF4A4848FF515252FF616868FF76888AFF769F - ABFF5CA4C0FF43A1CCFF2C9BD0FF1C96D3FF1594D4FF1394D4FF1394D4FF1594 - D4FF1A96D3FF299AD1FF3E9FCCFF56A1BFFF6F9CAAFF748689FF616767FF5151 - 51FF4A4848FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4A4848FF7B939DFFC7EA - FBFFB7D2DFFF676E6EFF4C4C4CFF505151FF98B7C3FFC7EAFBFFA5BCC5FF5759 - 59FF494747FF494747FF494747FF494747FF3F3D3DCF0101010D000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000097CDD11E5C6666AE4947 - 47FE494747FF484646FE494747FF484646FE494747FF494747FE4B4A4AFF5151 - 51FE5A5F5FFF666F6FFF728080FE798D8FFF799397FE77959CFF77959CFE7792 - 97FF788C8EFE717F80FF666F6FFF5A5E5EFE515151FF4B4A4AFE494747FF4947 - 47FE494747FF484646FE494747FF484646FE494747FF494747FF484646FE4947 - 47FF484646FE494747FF484646FE494747FF484646FE494747FF606B6FFFC7E9 - F8FECEECFAFFA4B9BFFE778588FF8CA0A6FEC9E9F8FFCFEDFBFE8B989CFF5050 - 50FF484646FE494747FF484646FE484646FD1F1E1E6100000002000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000008CB1B1015D67 - 674D494747D0494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF4A4848FF4B4949FF4B4B4BFF4C4C4CFF4C4C4CFF4C4B - 4BFF4B4949FF4A4848FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF4D4D4DFF8498 - 9FFFCFEAF7FFD7F0FCFFD6EFFBFFD7F0FCFFD4EEFAFFA7BAC1FF5D6262FF4A48 - 48FF494747FF494747FF494747FF393838B20302020600000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000494747084846465F494747D0484646FE494747FF484646FE494747FF4846 - 46FE494747FF494747FF484646FE494747FF484646FE494747FF484646FE4947 - 47FF484646FE494747FF494747FF484646FE494747FF484646FE494747FF4846 - 46FE494747FF484646FE494747FF484646FE494747FF494747FF484646FE4947 - 47FF484646FE494747FF484646FE494747FF484646FE494747FF494747FF4E4E - 4EFE6A7477FF92A2A8FE9EADB2FF98A9AEFE7C888AFF5A5E5EFE4B4A4AFF4947 - 47FF484646FE494747FF434141D00C0C0C160000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000004947473E4947479D494747E6494747FE4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4848FF4C4B4BFF4E4D4DFF4D4D4DFF4B4A4AFF494747FF494747FF4947 - 47FF484646FC3D3C3CA618181811000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000004947470C4947473F4947 - 477E494747B6494747E3494747F8494747FB494747FD494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FD494747F24846 - 46B2444242424442420200000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000D1D0D00DD1D1D127D1D0D036D1D1D13FD1D0D03FD1D1 - D13FD1D0D03FD1D1D13FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0 - D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D1D13FD1D0D03FD1D1 - D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D1D13FD1D0 - D03FD1D1D13FD1D0D03FD1D1D13FD1D0D03FD1D1D13FD1D0D030D1D1D10A0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000FFFF - FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF00 - 0000FFFFFFFFFFFFFFFFFF000000FFFFFFC007FFFFFFFF000000FFFFFC00007F - FFFFFF000000FFFFF000000FFFFFFF000000FFFF80000003FFFFFF000000FFFF - 00000000FFFFFF000000FFFC000000007FFFFF000000FFF8000000003FFFFF00 - 0000FFF0000000000FFFFF000000FFE00000000007FFFF000000FFC000000000 - 03FFFF000000FF800000000001FFFF000000FF000000000000FFFF000000FE00 - 0000000000FFFF000000FC0000000000007FFF000000FC0000000000003FFF00 - 0000F80000000000003FFF000000F80000000000001FFF000000F00000000000 - 001FFF000000F00000000000000FFF000000E00000000000000FFF000000E000 - 000000000007FF000000C000000000000007FF000000C000000000000007FF00 - 0000C000000000000003FF000000C000000000000003FF000000C00000000000 - 0001FF0000008000000000000001FF0000008000000000000000FF0000008000 - 000000000000FF0000008000000000000000FF00000080000000000000007F00 - 000080000000000000007F00000080000000000000003F000000800000000000 - 00003F00000080000000000000001F00000080000000000000001F000000C000 - 0000000000001F000000C0000000000000000F000000C0000000000000000F00 - 0000C00000000000000007000000C00000000000000007000000E00000000000 - 000007000000E00000000000000002000000E00000000000000002000000F000 - 00000000000000000000F80000000000000000000000F8000000000000000000 - 0000FC0000000000000000000000FC0000000000000000000000FE0000000000 - 000000000000FF0000000000000000000000FF0000000000000000000000FF80 - 00000000000000000000FFC000000000000000000000FFE00000000000000000 - 0000FFF800000000000001000000FFFC00000000000001000000FFFE00000000 - 000003000000FFFF80000000000007000000FFFFF000000000000F000000FFFF - FC00000000001F000000FFFFFFE000000000FF000000FFFFFFFFFFFFFFFFFF00 - 0000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF - FFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF0000002800 - 0000400000008000000001002000000000000042000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000020000 - 00050000000A0000001000000015000000190000001B0000001B0000001A0000 - 0017000000120000000C00000007000000030000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000020000000900000015000000230000 - 00310000003C00000044000000490000004C0000004D0000004E0000004D0000 - 004B000000470000004000000036000000280000001A0000000C000000040000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000121111040000001000000023000000380202024A131212772322 - 22A1323030C13A3939D9444242E9474545F4474545F4474545F4464444F0403E - 3EE1343333CC292828B01A19198B0707075F0000004C0000003E0000002A0000 - 0015090808072D2C2C0100000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000001616 - 160300000010000000280101014218171780323030C3464444F5494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF484646FD3A3939D6201F1F9B0605055C0000 - 0047000000300000001709080806000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000040404090000 - 00220303034422212198414040E9494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF474545F72D2B - 2BB70A0A0A68000000460000002B0000000F1B1A1A0200000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000475F5F0200000012000000331D1C - 1C88424040EA494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4B4A4AFF4E4E4EFF515252FF545656FF555858FF545656FF525353FF4E4E - 4EFF4B4A4AFF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF474545F92A2929B10404045A0000003D0000001C232F2F05000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000272F2F040000001B0A0A0A51383737CE4947 - 47FF494747FF494747FF494747FF494747FF4A4848FF505151FF5F6565FF6A7E - 82FF5F8B9BFF5594AEFF4D99BBFF4B9DC2FF4A9EC5FF499DC3FF4B99BCFF5093 - B0FF598A9EFF667E85FF606767FF515252FF4A4949FF494747FF494747FF4947 - 47FF494747FF494747FF424040EB1616168200000048000000260B0F0F090000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000002F2F2F050000002018181876454343F2494747FF4947 - 47FF494747FF494747FF4C4B4BFF5A5E5EFF6B8389FF5497B3FF3D9FCEFF289D - D8FF2EA2DEFF32A6E1FF35A8E3FF36A9E4FF37A9E4FF37A9E4FF35A8E3FF34A7 - E2FF2FA3DFFF279DDAFF339DD0FF4A95B7FF62838EFF5C6161FF4C4C4CFF4947 - 47FF494747FF494747FF494747FF484646FE292828AD0101014F0000002C0000 - 000B000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000002F2F2F040000002024232392484646FD494747FF494747FF4947 - 47FF4A4949FF5A5E5EFF698A94FF479EC5FF289DD9FF2EA4E0FF33A9E5FF37AC - E8FF3AAFEBFF3CB1ECFF3DB2EDFF3EB2EEFF3FB3EEFF3FB3EEFF3EB2EDFF3DB1 - EDFF3CB0EBFF39AEE9FF36AAE6FF31A6E1FF269DDAFF399AC9FF5C899AFF5C61 - 62FF4B4A4AFF494747FF494747FF494747FF494747FF363434CB030303560000 - 002E00080C0B0000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002F3F3F030000001D27262698494747FF494747FF494747FF494747FF5051 - 51FF6B7E81FF4C9CC0FF269DD9FF2CA4E2FF32AAE7FF36AEEBFF39B1EEFF3AB2 - EFFF3BB3F0FF3CB4F1FF3DB5F1FF3DB5F1FF3EB5F1FF3EB5F1FF3EB5F1FF3EB5 - F1FF3EB4F1FF3DB4F0FF3CB2EEFF39B0ECFF36ACE9FF30A7E4FF259EDBFF3998 - C5FF637F87FF525353FF494747FF494747FF494747FF494747FF3A3838D60504 - 04580000002C0B0F0F0800000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000005F7F - 7F010000001625242490494747FF494747FF494747FF494848FF585B5BFF6892 - A1FF2D9CD3FF27A1DFFF2DA8E7FF31ADECFF34B0EEFF36B1F0FF37B2F1FF38B3 - F1FF38B3F2FF38B3F2FF39B3F2FF39B3F2FF3AB4F2FF3AB4F2FF3AB4F2FF3AB4 - F2FF3BB4F2FF3BB4F2FF3AB4F1FF3AB3F1FF39B2EFFF37AFEDFF32ABE9FF2BA4 - E1FF249BD6FF538FA9FF5B6060FF4A4848FF494747FF494747FF494747FF3837 - 37D30303035100000025232F2F05000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000D1A191970484646FD494747FF494747FF4A4848FF5F6464FF5E9BB3FF229B - D8FF26A3E3FF2BA9EAFF2FADEEFF30AFF0FF31B0F1FF32B0F1FF32B1F1FF33B1 - F1FF33B1F1FF33B1F1FF34B1F1FF34B1F1FF35B1F1FF35B2F1FF35B2F2FF36B2 - F2FF36B2F2FF36B2F2FF37B2F2FF37B2F2FF37B2F1FF36B1F1FF35B0EFFF31AC - EBFF2BA7E5FF229CDBFF4295BBFF60696AFF4A4949FF494747FF494747FF4947 - 47FF333131C4000000480000001B272A2A020000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000171F1F050D0C - 0C43464444F3494747FF494747FF4A4848FF606666FF569DBBFF1D9ADAFF24A3 - E5FF28A9EBFF2AACEEFF2BAEF0FF2CAEF1FF2CAFF1FF2DAFF1FF2DAFF1FF2EAF - F1FF2EAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAFF1FF2FB0F1FF30B0F1FF30B0 - F1FF30B0F1FF31B0F1FF31B0F1FF31B0F1FF32B0F1FF32B0F1FF32B0F1FF31AF - EFFF2FADEDFF29A7E7FF219EDDFF3895C2FF616B6DFF4A4949FF494747FF4947 - 47FF494747FF242323A10000003C0000000F0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000242323010202021A3C3A - 3AD2494747FF494747FF494747FF5B6060FF5B9DB8FF1A99D9FF20A2E5FF24A8 - ECFF26ABEFFF27ACF0FF27ACF1FF27ACF1FF28ACF1FF28ADF1FF28ADF1FF28AD - F1FF29ADF1FF29ADF1FF29ADF1FF29ADF1FF2AADF1FF2AAEF1FF2AAEF1FF2BAE - F1FF2BAEF1FF2BAEF1FF2CAEF1FF2CAEF1FF2DAFF1FF2DAFF1FF2DAFF1FF2DAF - F0FF2DAEF0FF2BABEDFF26A6E8FF1F9DDDFF3A95BFFF5E6565FF494848FF4947 - 47FF494747FF484646FB101010710000002A0908080500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000004040409242323854947 - 47FF494747FF494747FF545555FF6799AAFF1998D8FF1BA0E4FF1FA6EBFF21A9 - EEFF22AAF0FF22AAF0FF22ABF0FF23ABF0FF23ABF0FF23ABF0FF24ABF0FF24AB - F0FF24ABF0FF25ABF0FF25ABF0FF25ACF0FF25ACF0FF26ACF0FF26ACF1FF26AC - F1FF26ACF1FF27ACF1FF28AAEDFF4B7185FF3D8BB2FF2CA7E6FF28ADF1FF28AD - F1FF28ADF0FF28ACF0FF27AAEDFF22A5E7FF1B9ADBFF4993B3FF565A5AFF4947 - 47FF494747FF494747FF3D3C3CDE010101470000001500000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000010707072B474545F24947 - 47FF494747FF4C4C4CFF708A8FFF2098D3FF179DE1FF1BA4EAFF1CA7EEFF1DA7 - EEFF314855FF4C4A4AFF555353FF555353FF555353FF3484ADFF1FA9F0FF1FA9 - F0FF20A9F0FF20A9F0FF20AAF0FF20AAF0FF21AAF0FF21AAF0FF21AAF0FF22AA - F0FF22AAF0FF22AAF0FF338CB9FF585656FF595757FF57595BFF487287FF3591 - C0FF25A9ECFF24ABF0FF24AAEFFF22A8ECFF1EA2E5FF1897D8FF5C899AFF4E4E - 4EFF494747FF494747FF494747FF201F1F970000002E09080806000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000072E2D2D9E494747FF4947 - 47FF494747FF646B6BFF409EC9FF1499DDFF16A1E8FF18A5EEFF18A7EFFF19A7 - F0FF1E84B8FF3C3A3AFF4F4D4DFF525050FF525050FF4D565CFF1DA2E5FF1BA8 - F0FF1BA8F0FF1BA8F0FF1BA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1CA8F0FF1DA8 - F0FF1DA8F0FF1DA8F0FF456577FF555353FF555353FF555353FF565454FF5654 - 54FF525A5FFF407794FF2B95CBFF1FA8EEFF1DA5EAFF199EE2FF2396CEFF6371 - 74FF4A4848FF494747FF494747FF434242EE0303034900000013000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000007070725474545F5494747FF4947 - 47FF505151FF6998A9FF1094D7FF129EE5FF14A3ECFF15A5EFFF15A5EFFF16A6 - EFFF16A6EFFF264D61FF444242FF4E4D4DFF4F4D4DFF4F4D4DFF357394FF17A6 - F0FF17A6F0FF17A6F0FF18A6F0FF18A7F0FF18A7F0FF18A7F0FF18A7F0FF19A7 - F0FF19A7F0FF2197D4FF504E4EFF525050FF525050FF525050FF525151FF5351 - 51FF535151FF525050FF454343FF2282B3FF1BA6EDFF18A2E8FF1498DCFF4892 - B3FF525454FF494747FF494747FF494747FF1F1E1E92000000261B1A1A030000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000327262684494747FF494747FF4947 - 47FF687272FF329CCEFF0F99DFFF11A0E9FF12A3EDFF12A4EFFF12A4EFFF12A4 - EFFF13A4EFFF168DCAFF323233FF494747FF4D4B4BFF4D4B4BFF4B4C4EFF1C97 - D6FF14A5EFFF14A5EFFF15A5EFFF15A5EFFF15A5EFFF15A5EFFF15A5EFFF16A6 - EFFF16A6EFFF347090FF4E4D4DFF4F4D4DFF4F4D4DFF4C4A4AFF494747FF4E4C - 4CFF504E4EFF4D4B4BFF343F46FF18A3EBFF17A6EFFF16A3ECFF139CE3FF1794 - D3FF65787CFF4A4848FF494747FF494747FF3D3C3CDD0000003B0000000B0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000009424040DC494747FF494747FF4E4E - 4EFF6C97A5FF0D92D7FF0E9CE5FF0FA1ECFF0FA3EEFF10A3EFFF10A3EFFF10A4 - EFFF10A4EFFF10A4EFFF1D5673FF3D3B3BFF4A4848FF4B4949FF4B4949FF3764 - 7BFF11A4EFFF11A4EFFF11A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4EFFF12A4 - EFFF14A0E8FF464E52FF4C4A4AFF4D4B4BFF4B4949FF3B3939FF2C2B2BFF3534 - 34FF413F3FFF3F3E3EFF216385FF15A5EFFF14A5EFFF14A4EDFF119FE7FF0E96 - DBFF4B90AFFF505151FF494747FF494747FF494747FF100F0F690000001C2927 - 2701000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000013121239494747FF494747FF494747FF5D62 - 62FF459FC7FF0D97DDFF0D9EE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF1094D8FF2C3033FF454343FF4A4848FF4A4848FF4947 - 47FF1D8AC2FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EFFF10A3EFFF10A3EFFF10A3 - EFFF247FAEFF4A4848FF4A4848FF4A4848FF454343FF27485AFF14709FFF1A3A - 4BFF222121FF242425FF1492D2FF12A4EFFF11A4EFFF11A3EEFF0FA0EAFF0E99 - E1FF2195CEFF616969FF494747FF494747FF494747FF2E2D2DB8000000330908 - 0807000000000000000000000000000000000000000000000000000000000000 - 000000000000000000003F3F3F012726267F494747FF494747FF4A4848FF7383 - 85FF1A96D3FF0D9AE2FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF186085FF383737FF484646FF494747FF4947 - 47FF3D5663FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF395A6CFF4A4848FF4A4848FF494747FF3C3A3AFF1775A5FF0FA3EFFF0FA3 - EFFF1189C6FF136792FF0FA3EFFF0FA3EFFF0FA3EFFF0FA3EEFF0EA1ECFF0D9C - E5FF0C92D7FF618490FF4A4949FF494747FF494747FF474545F7060606510000 - 0015000000000000000000000000000000000000000000000000000000000000 - 000000000000000000003F3F3F02383737B9494747FF494747FF4D4D4DFF6B98 - A7FF0C93D8FF0D9CE6FF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0E9CE5FF27343BFF424040FF484646FF4947 - 47FF484646FF247DABFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1692 - D2FF474545FF494747FF494747FF464444FF2E3539FF0E9DE6FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9E - E8FF0C96DCFF4A91B1FF4F4F4FFF494747FF494747FF494747FF2422229D0000 - 002B121111040000000000000000000000000000000000000000000000000000 - 000000000000000000003F3F3F05474545E6494747FF494747FF545656FF569F - BDFF0C96DCFF0D9EE8FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF156E9CFF353434FF474545FF4947 - 47FF494747FF424E54FF109DE5FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF2B6D - 90FF484646FF494747FF484646FF403E3EFF1E5978FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0E9F - EAFF0D98DFFF3397C6FF585B5BFF494747FF494747FF494747FF413F3FE70101 - 01420000000F0000000000000000000000000000000000000000000000000000 - 000000000000000000004B4A4A14494747FF494747FF494747FF5D6262FF43A0 - CAFF0D97DFFF0E9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF233B47FF403E3EFF4846 - 46FF494747FF484646FF2C7093FF0EA3EFFF0EA3EFFF0EA3EFFF0EA0EBFF404C - 53FF494747FF494747FF474545FF363535FF1287C2FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 - EBFF0D9AE2FF1F96D1FF626A6AFF494747FF494747FF494747FF494747FF1918 - 1882000000231B1A1A0200000000000000000000000000000000000000000000 - 000000000000000000005150502F494747FF494747FF494747FF676F6FFF319E - D1FF0D99E1FF0EA0EAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF137BB1FF323131FF4644 - 44FF494747FF494747FF46484AFF1596D8FF0EA3EFFF0EA3EFFF1D84B9FF4846 - 46FF494747FF494747FF444242FF27404DFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - ECFF0D9BE4FF1092D5FF68787AFF494747FF494747FF494747FF494747FF3836 - 36CE0000003A0404040A00000000000000000000000000000000000000000000 - 0000000000000000000051515141494747FF494747FF494747FF6E7A7AFF259A - D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1F4559FF3E3C - 3CFF484646FF494747FF494747FF33647DFF0EA3EFFF0EA3EFFF31627BFF4846 - 46FF494747FF484646FF3C3B3BFF196B95FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0D9CE5FF0C92D6FF678086FF494747FF494747FF494747FF494747FF4846 - 46FE0E0D0D650000001B29272701000000000000000000000000000000000000 - 0000000000000000000052515143494747FF494747FF494747FF737F7FFF1F98 - D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1189C6FF2F2E - 2FFF454343FF494747FF494747FF484646FF1B8BC5FF0F9FE8FF434649FF4947 - 47FF494747FF464545FF313335FF0F98DEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0D9CE5FF0C92D6FF65828BFF494848FF494747FF494747FF494747FF4947 - 47FF2D2B2BB50000003209080807000000000000000000000000000000000000 - 0000000000000000000052515142494747FF494747FF494747FF727F7FFF1F98 - D3FF0D9AE2FF0EA0EBFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1C52 - 6EFF3B3A3AFF484646FF494747FF494747FF3C5867FF1F85BAFF484646FF4947 - 47FF494747FF424040FF215069FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0D9CE5FF0C92D6FF66838BFF494848FF494747FF494747FF494747FF4947 - 47FF464444F50505054F00000015000000000000000000000000000000000000 - 0000000000000000000051515140494747FF494747FF494747FF6E7979FF289B - D3FF0D99E1FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0F93 - D7FF2B2F32FF444242FF494747FF494747FF494747FF41525BFF494747FF4947 - 47FF484646FF383737FF147DB3FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - EDFF0D9CE5FF0C92D6FF698085FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF2221219A0000002A121111040000000000000000000000000000 - 000000000000000000005151512C494747FF494747FF494747FF666E6EFF369F - D0FF0D99E0FF0EA0EAFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF10A3EFFF16A6 - EFFF256789FF464444FF555353FF575555FF585656FF575555FF575555FF5553 - 53FF4F4E4EFF334148FF11A2ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1 - ECFF0D9BE3FF1293D4FF6A7779FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF403E3EE5000000400000000F0000000000000000000000000000 - 000000000000000000004C4C4C10494747FF494747FF494747FF5C6161FF49A2 - C9FF0D97DEFF0D9FE9FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF17A6EFFF23ABF0FF29ADF0FF2AAD - F1FF2AA6E6FF404B50FF585757FF5E5C5CFF5E5C5CFF5E5C5CFF5E5C5CFF5E5C - 5CFF555353FF367494FF2AADF1FF25ABF0FF1BA7EFFF0FA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA0 - EBFF0D99E1FF2497D0FF626969FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF1716167D000000221B1A1A0200000000000000000000 - 0000000000000000000000000000484646E7494747FF494747FF535555FF5EA1 - BCFF0C95DBFF0D9EE7FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF16A6EFFF2BAEF1FF32B0F1FF32B0F1FF32B0F1FF32B0 - F1FF32B0F1FF3982A8FF545353FF636161FF646262FF646262FF646262FF6361 - 61FF525252FF34A1D8FF32B0F1FF32B0F1FF32B0F1FF2EAFF1FF1BA8F0FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9F - E9FF0D98DFFF3A98C4FF575A5AFF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF363535CB000000390404040A00000000000000000000 - 00000000000000000000000000003A3939B7494747FF494747FF4D4C4CFF759A - A5FF0C92D6FF0D9CE5FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF22AAF0FF3AB4F1FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4 - F2FF3BB4F2FF3BB2EFFF4E6069FF666565FF6B6969FF6B6969FF6B6969FF6665 - 65FF4D6A79FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF3BB4F2FF2BAE - F0FF0FA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9E - E7FF0C95DBFF5393AEFF4F4F4FFF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF484646FD0C0C0C620000001A00000001000000000000 - 000000000000000000000000000028272778494747FF494747FF494848FF7381 - 81FF259AD3FF0D99E1FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF26ACF0FF44B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7 - F2FF45B7F2FF45B7F2FF4C9BC4FF6D6C6CFF727171FF727171FF727070FF6766 - 66FF4B93B9FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7F2FF45B7 - F2FF33B1F1FF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0EA1ECFF0D9B - E4FF0E92D6FF6A858CFF4A4848FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF2B2A2AB10000003000000006000000000000 - 000000000000000000000000000016151531494747FF494747FF494747FF5B5F - 5FFF53A3C5FF0C96DCFF0D9EE8FF0EA2EDFF0EA3EFFF0EA3EFFF0EA3EFFF1CA8 - EFFF4DBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBB - F3FF4EBBF3FF4EBBF3FF53B1E1FF787777FF7A7878FF7A7878FF787676FF666B - 6EFF4FB7ECFF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBBF3FF4EBB - F3FF4EBBF3FF2BAEF0FF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9FEAFF0D98 - E0FF2E99CBFF606667FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF464444F30504044D00000014000000000000 - 000000000000000000000000000000000000444242DB494747FF494747FF4D4D - 4DFF7899A1FF1093D5FF0D9BE4FF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF46B8 - F2FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF - F4FF59BFF4FF59BFF4FF6A9FBBFF818080FF828080FF818080FF7C7B7BFF648C - A1FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BFF4FF59BF - F4FF59BFF4FF54BDF3FF12A4EFFF0EA3EFFF0EA2EEFF0EA1ECFF0D9DE6FF0C94 - D9FF5993AAFF4F4F4FFF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF2120209600000029000000030000 - 0000000000000000000000000000000000002D2C2C79494747FF494747FF4947 - 47FF656E6EFF43A2CCFF0C97DDFF0D9EE8FF0EA1EDFF0EA2EEFF15A5EFFF63C3 - F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3 - F4FF64C3F4FF64C3F4FF80939EFF8A8888FF8A8888FF898888FF7E7D7DFF67B1 - D7FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3F4FF64C3 - F4FF64C3F4FF64C3F4FF2AADF0FF0EA3EFFF0EA2EEFF0D9FEAFF0D99E1FF2096 - D0FF697577FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF3F3D3DE10000003F0000000E0000 - 0000000000010000000000000000000000000D0D0D15484646F6494747FF4947 - 47FF4F4F4FFF789BA4FF1293D5FF0D9AE3FF0EA0EBFF0EA2EEFF23ABF0FF6EC8 - F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF70C3EDFF74BDE2FF75BE - E3FF75BEE3FF77BADCFF919091FF929191FF929191FF8F8E8EFF7E8C94FF6EC8 - F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8F5FF6EC8 - F5FF6EC8F5FF6EC8F5FF3CB4F2FF0EA2EEFF0EA1ECFF0D9CE5FF0C93D8FF5B95 - ACFF515252FF494747FF4D4D4DFF535454FF545555FF545555FF545555FF5455 - 55FF535555FF4F5050FF4A4848FF494747FF494747FF16151579000000210000 - 000200000001000000000000000000000000000000004846468F494747FF4947 - 47FF494747FF616767FF56A5C6FF0C95DAFF0D9DE6FF0EA1ECFF23AAF0FF7ACC - F6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF82B5CFFF989797FF9B99 - 99FF9B9999FF9B9999FF9B9999FF9B9999FF9A9999FF949393FF80ADC3FF7ACC - F6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACCF6FF7ACC - F6FF7ACCF6FF7ACCF6FF3EB5F2FF0EA1EDFF0D9EE8FF0C97DEFF3199CAFF656E - 6EFF494747FF4B4949FF5E8FA5FF7BBBD8FF7CBDD9FF7CBDD9FF7CBDD9FF7CBD - D9FF7CBCD9FF7896A3FF4F4F4FFF494747FF494747FF353333C8000000370000 - 00090000000100000000000000000000000000000000575D5D18484646F24947 - 47FF494747FF4C4B4BFF758889FF2C9BD0FF0D97DEFF0D9EE8FF13A3EDFF80CE - F6FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF8CBBD3FFA1A0A0FFA3A2 - A2FFA3A2A2FFA3A2A2FFA3A2A2FFA3A2A2FFA2A1A1FF979898FF86CAEDFF85D0 - F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0F7FF85D0 - F7FF85D0F7FF85D0F7FF2CADEFFF0D9FE9FF0D99E1FF1694D4FF6B8992FF4D4C - 4CFF494747FF4B4949FF609AB3FF80D1F7FF83CAEBFF81B8CDFF79ADC3FF78AC - C2FF78ACC2FF718B95FF4E4E4EFF494747FF494747FF484646FD0B0B0B5E0000 - 0019000000010000000000000000000000000000000000000000748B8B744947 - 47FF494747FF494747FF525353FF789BA4FF1A96D4FF0D99E0FF0D9EE8FF5EC0 - F2FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF96C1D7FFA7A6A6FFA8A8 - A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA6A5A5FF98AEB9FF90D4F7FF90D4 - F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4F7FF90D4 - F7FF90D4F7FF7CCCF5FF10A0EAFF0D9AE3FF0E93D6FF6197ABFF545656FF4947 - 47FF494747FF494747FF545C5FFF72BFE2FF80D0F5FF83A1ABFF595D5DFF4F50 - 50FF4F4F4FFF4D4C4CFF494747FF494747FF494747FF494747FF2A2929AD0000 - 002C000000040000000000000000000000000000000000000000B6F3F3045052 - 52CB494747FF494747FF494747FF585B5BFF72A3B2FF1394D5FF0D99E0FF1DA4 - E9FF8FD3F6FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9EC3D6FFA5A4A4FFA5A5 - A5FFA5A5A5FFA5A5A5FFA5A5A5FFA5A5A5FFA4A4A4FF9DC8DEFF9BD8F8FF9BD8 - F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8F8FF9BD8 - F8FF99D7F7FF36AFEDFF0D9AE3FF0C93D7FF559BB8FF5C6161FF494747FF4947 - 47FF494747FF494747FF4A4848FF596E75FF78CAF0FF82CDF0FF76878BFF4E4E - 4EFF494747FF494747FF494747FF494747FF494747FF494747FF444242EF0101 - 013E0000000B000000000000000000000000000000000000000000000000A0D1 - D127484646F3494747FF494747FF494848FF5C6161FF71A4B4FF1595D5FF0D98 - DFFF33ACEAFF9FD9F7FFA6DCF8FFA6DDF9FFA6DDF9FFA7D1E7FFA8C2D0FFA8C2 - D0FFA8C2D0FFA8C2D0FFA8C2D0FFA8C2D0FFA8C3D0FFA6DCF8FFA6DDF9FFA6DD - F9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DDF9FFA6DCF9FFA5DB - F8FF53BAEEFF0D9AE1FF0D93D7FF559CBAFF606667FF4A4848FF494747FF4947 - 47FF494747FF494747FF494747FF4C4B4BFF5F8493FF7DD0F6FF85C6E4FF6B74 - 75FF4C4B4BFF494747FF494747FF494747FF494747FF494747FF494747FF1514 - 146F000000120000000000000000000000000000000000000000000000000000 - 000083A3A355494747FE494747FF494747FF4A4848FF5B5F5FFF76A0ACFF2198 - D2FF0C96DCFF30A9E8FF9CD7F6FFB1E0F9FFB1E1F9FFB1E1FAFFB1E1FAFFB1E1 - FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1 - FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1FAFFB1E1F9FFB1E0F9FFAADDF7FF4BB5 - ECFF0D98DFFF1294D5FF609BB2FF5E6464FF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4E4E4EFF669DB4FF80D0F7FF85B9 - D1FF606666FF4A4949FF494747FF494747FF494747FF494747FF494747FF2625 - 259D000000160000000000000000000000000000000000000000000000000000 - 00000000000032607879494747FF494747FF494747FF494747FF555757FF7993 - 98FF3FA0CDFF0C93D7FF179DE1FF6DC3EFFFB4E1F8FFBBE4F9FFBBE5FAFFBBE5 - FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE5 - FAFFBBE5FAFFBBE5FAFFBBE5FAFFBBE4F9FFBAE3F9FF84CDF2FF26A4E4FF0C94 - DAFF2999CFFF6C939EFF575B5BFF494848FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF535656FF8DC0D6FFA4DE - F9FF92AEB9FF565959FF494747FF494747FF494747FF494747FF494747FF3130 - 30B1000000140000000000000000000000000000000000000000000000000000 - 0000000000000000000032607887494747FF494747FF494747FF494747FF4E4E - 4EFF6C7778FF6AA4B8FF2499D2FF0C94D9FF1FA0E2FF66C0EDFFA5DBF6FFC5E8 - FAFFC5E8FAFFC5E8FBFFC5E8FBFFC5E9FBFFC5E9FBFFC5E9FBFFC5E8FBFFC5E8 - FBFFC5E8FAFFC5E8FAFFB3E1F8FF76C7F0FF2FA7E5FF0C95DBFF1695D4FF549D - BCFF6D7C7DFF505050FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF5B6568FFA4D5 - ECFFB0E0F7FF7A8688FF4C4B4BFF494747FF494747FF494747FF494747FF302F - 2FAA0000000D0000000000000000000000000000000000000000000000000000 - 000000000000000000000000000032607876494747FE494747FF494747FF4947 - 47FF4A4848FF565959FF76888AFF63A3BCFF2B9CD2FF0C92D7FF0C96DCFF24A2 - E3FF50B6EAFF71C4EFFF88CEF2FF96D4F4FF9DD7F5FF99D5F4FF8CD0F3FF78C7 - F0FF58B9EBFF2FA7E5FF0F98DEFF0C93D8FF1D97D3FF529FBFFF728A8FFF585C - 5CFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF515252FF5A5E5EFF525353FF494747FF4B4949FF7E9B - A6FFBAE6FBFF99B1BAFF515151FF494747FF494747FF494747FF494747FF2423 - 2387000000060000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000002A698950494747F0494747FF4947 - 47FF494747FF494747FF4B4949FF565959FF717E7FFF729DA9FF53A3C5FF2E9D - D2FF1193D4FF0C92D7FF0C94D9FF0C95DAFF0C95DBFF0C95DBFF0C94DAFF0C93 - D8FF0E92D5FF2599D2FF48A0C7FF679AACFF718183FF585B5BFF4B4A4AFF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4949FF8EAFBEFFBFE5F7FF839195FF4D4D4DFF4A4848FF768B - 92FFC4E9FBFFA1B8C0FF525353FF494747FF494747FF494747FF494747FF1312 - 1240000000010000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000074B4C422575E5EC24947 - 47FF494747FF494747FF494747FF494747FF494848FF4E4E4EFF5A5E5EFF6C77 - 77FF7A8F91FF7399A4FF689DB0FF619FB7FF5E9FB9FF5F9FB7FF659DB1FF6E98 - A5FF788F93FF6E7979FF5B5F5FFF4F4F4FFF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF4A4848FF8198A0FFCDECFCFFB5CDD7FF6B7474FF626A6BFFAECC - D9FFCDECFCFF91A2A7FF4E4E4EFF494747FF494747FF494747FF3E3C3CCA0000 - 0006000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000099C5C5016675 - 7563494747E7494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF4A4848FF4C4B4BFF4F4F4FFF515151FF525353FF515252FF4F4F4FFF4C4C - 4CFF4A4949FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF55595AFFB4D0DCFFD6F0FCFFCEE9F5FFCFEAF7FFD6F0 - FCFFB9D0D9FF626767FF4A4848FF494747FF494747FF484646FA1414143A0000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00004947470C49474776494747E4494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494848FF56595AFF87979CFFA3B3B9FFA3B4B9FF8C9A - 9EFF5E6364FF4C4A4AFF494747FF494747FF494747FE2A282867000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004947470549474752494747AD494747F6494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF4A4949FF4D4C4CFF4D4D4DFF4B4A - 4AFF494747FF494747FF494747FF484646E93533335000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000049474709494747434947 - 477C494747AB494747CF494747E9494747FA494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747F1494747C1484646704442420D0000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFF8001FFFFFFFFFFFC00003FFFFFFFFFF0000007FFFFFFFFC - 0000003FFFFFFFF80000000FFFFFFFE000000007FFFFFFC000000003FFFFFF80 - 00000001FFFFFF0000000000FFFFFE00000000007FFFFC00000000003FFFFC00 - 000000001FFFF800000000001FFFF000000000000FFFF000000000000FFFE000 - 0000000007FFE0000000000007FFE0000000000003FFC0000000000003FFC000 - 0000000001FFC0000000000001FF80000000000001FF80000000000000FF8000 - 0000000000FF800000000000007F800000000000007F800000000000003F8000 - 00000000003F800000000000003F800000000000001F800000000000001F8000 - 00000000000FC00000000000000FC000000000000007C000000000000007C000 - 000000000007E000000000000003E000000000000002E000000000000000F000 - 000000000000F000000000000000F800000000000000F800000000000000FC00 - 000000000000FE00000000000000FF00000000000000FF80000000000000FFC0 - 000000000000FFE0000000000000FFF0000000000001FFF8000000000003FFFE - 000000000007FFFF80000000000FFFFFF0000000001FFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - FFFFFFFFFFFF2800000030000000600000000100200000000000802500000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000200000008000000110000001A000000210000 - 002400000025000000230000001D000000140000000B00000004000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000A09 - 0901000000090000001B000000310404044B1110106F1B1A1A8C2221219D2322 - 22A1232222A1201F1F98161616830B0B0B640101014700000036000000210000 - 000C050404020000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000A0A0A0A0000 - 0024080707502221219B393838D5464444F7484646FE494747FF484646FE4846 - 46FE494747FF484646FE484646FE484646FD424040EB2E2D2DBD1414147E0000 - 00470000002C0606060F29282801000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000191818040000001C0C0C0C59302E - 2EBD484646FA494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF3F3D - 3DE41E1D1D950101014A000000250F0E0E070000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000202B2B0904040435292828A9474545F94846 - 46FE484646FE494747FE4A4949FF525353FE5D6566FE5E7379FF5B7B87FE5B7F - 8DFE5A7D8AFF5B757EFE5E6A6CFE565858FF4C4B4BFE494747FE494747FF4846 - 46FE484646FE3C3B3BDE12111178000000380C10100F00000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000001C1C1C0D0D0D0D533E3C3CDF484646FE494747FF4947 - 47FE4F5050FE617073FE548CA3FF439CC5FE32A0D7FE2FA3DDFF31A5E0FE33A6 - E1FE32A6E1FF30A4DFFE2FA0DAFE399DCEFF4990B0FE5A7884FE555757FF4948 - 48FE484646FE494747FF474545FB262525A7010101430A0A0A15467287010000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000001A1A1A0D16151568454343F3494747FF494747FF4D4D4DFF6174 - 79FF4C97B9FF2DA0D9FF31A7E3FF36ACE8FF3AAFEBFF3CB2EDFF3EB3EEFF3FB3 - EFFF3FB3EFFF3EB3EEFF3DB1EDFF3AAEEAFF35AAE6FF2BA2DEFF3A9AC9FF567F - 8FFF535555FF494747FF494747FF494747FF323131C50202024A000407160000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00002531310816161665464444F6484646FE494747FF585C5CFE588FA6FF2C9E - D7FE2DA6E4FE33ADEBFE37B0EEFF39B2F0FE3AB3F1FE3BB4F1FF3BB4F1FE3CB4 - F1FE3CB4F2FF3CB4F1FE3DB4F1FE3CB4F1FF3BB3EFFE38B0EDFE33ABE8FF29A1 - DEFE3E95BDFE5A6A70FF4A4949FE494747FF484646FE353333CB02020248080A - 0A11000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000004F6A - 6A030E0E0E4A464444F4494747FF494747FF5E6869FF4699BEFF24A0DFFF2BA9 - E9FF30AEEEFF32B0F0FF33B1F1FF34B1F1FF34B1F1FF35B1F1FF35B2F1FF35B2 - F1FF36B2F1FF36B2F2FF37B2F2FF37B2F2FF37B3F1FF37B2F1FF36B1F0FF33AD - ECFF2BA6E4FF2C9AD1FF597884FF4C4B4BFF494747FF494747FF302F2FBF0000 - 003A171D1D090000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000505 - 0524403E3EE0494747FF494747FE5F6A6BFE3C9AC7FF21A0E1FE27A9EBFF2AAC - EFFE2BAEF0FE2BAEF0FE2CAEF1FF2CAEF0FE2DAFF0FE2DAFF1FF2EAFF0FE2EAF - F0FE2EAFF1FF2FAFF0FE30B0F0FE30B0F1FF30B0F1FE31B0F1FE31B0F1FF31AF - F0FE2FADEEFE29A7E7FF249BD7FE577C8BFF4B4A4AFE484646FE494747FF2221 - 219C000000292221210200000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000000D0D0D092E2D - 2DA6484646FE494747FF5B6061FE4299C2FE1C9EE1FF21A7EBFE24AAEFFF24AB - F0FE25ABF0FE25ABF0FE26ACF0FF26ACF0FE26ACF0FE27ACF0FF27ACF0FE27AC - F0FE28ADF1FF28ADF0FE29ADF0FE29ADF1FF31A0DAFE30A3DEFE2AAEF1FF2AAE - F0FE2AADF0FE29ACEEFF24A5E7FE2299D5FF5A747EFE4A4848FE494747FF4644 - 44F80D0D0D650101011300000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000111111474846 - 46FB484646FE505151FF5594AFFE179BDDFE1BA4EAFF1DA8EFFE297298FF4364 - 75FE48697AFE48697AFE2C94CAFF20A9EFFE20AAEFFE21AAF0FF21AAF0FE21AA - F0FE22AAF0FF22AAF0FE23ABF0FE23ABF0FF476E82FE58595AFE4C6D7FFF398C - B7FE28A7E8FE25ABF0FF24A9EDFE1EA2E5FF2A96CBFE596365FE494747FF4846 - 46FE373535CF000000331E1D1D03000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000007393737C34947 - 47FF4A4848FF658088FF1A98D8FF16A0E8FF17A5EEFF18A7EFFF1B93D0FF3C3E - 3FFF504E4EFF525050FF45616FFF1BA6EDFF1AA7F0FF1AA7F0FF1BA8F0FF1BA8 - F0FF1BA8F0FF1CA8F0FF1CA8F0FF239BD9FF525354FF555353FF555353FF5553 - 53FF53575AFF42728AFF298EC2FF1DA6ECFF189DE0FF448DAEFF4E4E4EFF4947 - 47FF484646FE1514147605040411000000000000000000000000000000000000 - 000000000000000000000000000000000000000000001111113E484646FE4947 - 47FE565959FE3F9AC4FF109BE2FE13A3ECFE13A5EFFF14A5EFFE14A5EFFF225E - 7CFE464444FE4E4C4CFE4E4C4CFF2A82B0FE16A6EFFE16A6EFFF16A6EFFE16A6 - EFFE17A6EFFF17A6EFFE17A6EFFE337699FF504E4EFE514F4FFE504E4EFF504E - 4EFE514F4FFE4D4C4CFF2B627FFE19A6EFFF17A1E8FE1796D7FE5B7179FF4947 - 47FE484646FE353434CA000000282D2B2B010000000000000000000000000000 - 000000000000000000000000000000000000000000022E2D2D9E494747FF4947 - 47FE67828AFE1095D8FF0F9FE8FE10A3EEFE10A3EFFF10A4EEFE10A4EFFF1297 - DBFE31393EFE494747FE4B4949FF44525AFE149FE5FE12A4EFFF12A4EEFE12A4 - EEFE12A4EFFF13A4EFFE14A2EBFE465158FF4D4B4BFE4C4A4AFE3B3A3AFF3534 - 34FE424141FE3E3D3EFF198BC5FE15A5EFFF14A3ECFE109AE1FE408EB2FF4D4D - 4DFE484646FE484646FC090808510F0F0F090000000000000000000000000000 - 0000000000000000000000000000000000000303030B444242E8494747FF4F50 - 50FF4C98B9FF0D99E0FF0EA1ECFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF19668EFF3F3D3DFF494747FF494747FF2C7297FF0FA3EFFF0FA3EFFF0FA3 - EFFF0FA3EFFF0FA3EFFF2183B5FF4A4848FF4A4848FF454343FF205F7FFF1569 - 93FF1D3642FF1E3C4CFF11A3EEFF11A4EFFF10A3EEFF0E9DE7FF1895D3FF5C65 - 66FF494747FF494747FF272525A50000001E0000000000000000000000000000 - 00000000000000000000000000000000000011101038484646FE494747FF5F66 - 66FE299AD1FE0D9CE6FF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0E9CE5FE2A3B44FE464444FF484646FE46494CFE1497DAFF0EA2EEFE0EA2 - EEFE0EA3EFFF0EA2EEFE365E73FE494747FF494747FE393939FE1191D3FF0EA2 - EEFE0EA1EDFE0F97DCFF0FA3EEFE0EA3EFFF0EA2EEFE0EA0EAFE0C96DCFF557D - 8EFE494747FE494747FF424040EC0303033E1B1A1A0500000000000000000000 - 0000000000000000000000000000000000002120206B484646FE494747FF687F - 85FE1095D8FE0D9FE9FF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE1573A3FE3B3939FF484646FE484646FE336680FF0DA2EEFE0DA2 - EEFE0EA3EFFF1496D8FE464749FE494747FF464444FE274C5FFE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA1ECFE0D99E1FF438C - AEFE4B4A4AFE494747FF484646FE1B1B1B880000001500000000000000000000 - 0000000000000000000000000000000000002E2C2C92494747FF4A4848FF618C - 9CFF0C96DCFF0EA0EBFF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA1EDFF264150FF454343FF494747FF484748FF1B8CC6FF0EA3 - EFFF0EA3EFFF297399FF484646FF494747FF403E3EFF1776A6FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EDFF0D9BE4FF3494 - C2FF505151FF494747FF494747FF3A3939D70000003024232302000000000000 - 000000000000000000000000000000000000313030AA484646FE4B4A4AFF5893 - ABFE0D98DFFE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0DA2EEFE1380B7FF373737FE484646FE494747FF3A5A6BFE0EA1 - ECFE0EA1ECFF3E525DFE484646FE484646FF323B41FE0E9CE4FE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9DE6FF2796 - CCFE555858FE494747FF484646FE484646FD1110106A0707070E000000000000 - 000000000000000000000000000000000000323030B1484646FE4C4B4BFF5496 - B2FE0D98E0FE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0DA2EEFE0EA2EEFF214C62FE434141FE494747FF484646FE2281 - B1FE188ECAFF474546FE484646FE444343FF205C7BFE0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9DE7FF2196 - D0FE595D5DFE494747FF484646FE484646FE302E2EBD00000025302F2F010000 - 000000000000000000000000000000000000323030B1494747FF4C4B4BFF5596 - B1FF0D98E0FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF118CCAFF333537FF484646FF494747FF4150 - 59FF2D6F91FF484646FF484646FF3B3A3BFF1287C3FF0EA3EFFF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF2296 - D0FF595D5DFF494747FF494747FF494747FF474545F90707074E100F0F090000 - 000000000000000000000000000000000000323030A9484646FE4B4A4AFF5B94 - AAFE0D97DEFE0EA1ECFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0DA2EEFE0EA3EFFF0EA3EFFE205A77FE464545FF4F4D4DFE504E - 4EFE4F4F50FF4E4C4CFE4B4949FE2C4654FF0EA2EDFE0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EEFE0D9CE6FF2A96 - CBFE555858FE494747FF484646FE484646FE494747FF252424A10000001C0000 - 0000000000000000000000000000000000002F2D2D8F484646FE494848FF658D - 9BFE0C95DBFE0DA0EAFF0DA2EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2 - EEFE0DA2EEFE13A5EFFE1FA9F0FF26ACF0FE29A1DEFE464B4FFF5B5A5AFE5D5B - 5BFE5D5B5BFF5D5B5BFE575555FE327CA2FF22AAF0FE19A7EFFE0EA3EFFF0DA2 - EEFE0DA2EEFE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0DA2EDFE0D9BE4FF3895 - C0FE505050FE494747FF484646FE484646FE494747FF413F3FE90202023B1918 - 18050000000000000000000000000000000023222268494747FF494747FF6B7F - 83FF1395D7FF0D9EE8FF0EA2EEFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF11A4 - EFFF27ACF0FF33B1F1FF34B1F1FF34B1F1FF34B1F1FF3D7D9DFF5C5B5BFF6563 - 63FF656363FF656363FF555759FF35A8E3FF34B1F1FF34B1F1FF2FAFF1FF19A7 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA1ECFF0D99E0FF488D - ABFF4B4A4AFF494747FF494747FF494747FF494747FF494747FF1A1919840202 - 02140000000000000000000000000000000012111133484646FE494747FF5E64 - 64FE319DD0FE0D9CE5FF0DA2EDFE0DA2EEFE0EA3EFFF0DA2EEFE14A5EFFF38B3 - F1FE3FB6F2FE3FB6F2FE40B6F2FF3FB6F2FE3FB6F2FE40B0E9FF5D696FFE6E6D - 6DFE6F6D6DFF6C6A6AFE51778BFE40B6F2FF3FB6F2FE3FB6F2FE40B6F2FF3FB5 - F2FE23ABF0FE0EA3EFFF0DA2EEFE0EA3EFFF0DA2EEFE0D9FEAFE0C95DBFF5C7E - 8BFE494747FE494747FF484646FE484646FE494747FF484646FE393737D40000 - 002F0000000200000000000000000000000003030305464444E8494747FF4F4F - 4FFE559AB7FE0D98DFFF0DA0EBFE0DA2EEFE0EA3EFFF0FA3EFFE40B5F2FF4DBA - F3FE4DBAF3FE4DBAF3FE4DBAF3FF4DBAF3FE4DBAF3FE4DBAF3FF648FA6FE7877 - 77FE787777FF706F6FFE529FC7FE4DBAF3FF4DBAF3FE4DBAF3FE4DBAF3FF4DBA - F3FE4CBAF3FE1EA9F0FF0DA2EEFE0EA3EFFF0DA2EDFE0D9DE6FE2097D1FF5D63 - 63FE484747FE494747FF484646FE484646FE494747FF484646FE484646FD0F0F - 0F660000000D00000000000000000000000000000000302F2F98494747FF4947 - 47FF6D8287FF1596D7FF0D9DE7FF0EA2EEFF0EA3EFFF29ADF0FF5BC0F4FF5BC0 - F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BBFF2FF7C888EFF8382 - 82FF828181FF717C82FF5BBEF0FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0F4FF5BC0 - F4FF5BC0F4FF4BBAF3FF0EA3EFFF0EA2EEFF0DA0EBFF0D98DFFF4B90AEFF4C4C - 4CFF494747FF494747FF494747FF494747FF494747FF494747FF494747FF2F2D - 2DBA000000240000000100000000000000000000000016151533494747FE4846 - 46FE545757FE4C9EC2FF0D98E0FE0DA0EBFE0EA2EEFF47B8F2FE69C5F5FF69C5 - F5FE69C5F5FE69C5F5FE69C5F5FF69C5F5FE69C5F5FE70B9DEFF8D8C8CFE8D8C - 8CFE8A8989FF729EB5FE69C5F5FE69C5F5FF69C5F5FE69C5F5FE69C5F5FF69C5 - F5FE69C5F5FE67C4F5FF15A5EFFE0EA2EDFF0D9DE6FE1A96D3FE607074FF4947 - 47FE4A4949FE4B4A4AFF4B4A4AFE4B4A4AFE4B4A4AFF4A4848FE494747FE4745 - 45F80606064B0000000800000000000000000000000000000000484646BB4947 - 47FF494747FF6B7F84FF1E98D5FF0D9CE5FF0EA1EDFF53BDF3FF78CBF6FF78CB - F6FF78CBF6FF78CBF6FF84AFC6FF959DA2FF959EA3FF979B9FFF999898FF9998 - 98FF909091FF7AC0E4FF78CBF6FF78CBF6FF78CBF6FF78CBF6FF78CBF6FF78CB - F6FF78CBF6FF77CBF6FF19A6EFFF0D9FEAFF0D96DDFF518FA9FF4D4D4DFF4C4E - 4FFF699BB1FF75A7BCFF75A7BCFF75A7BCFF75A6BCFF687B82FF4A4848FF4947 - 47FF2322229D0000001B000000010000000000000000000000005C6565384846 - 46FB484646FE4F4F4FFF6397AAFE0F95DAFE0D9EE8FF45B7F1FE87D1F7FF87D1 - F7FE87D1F7FE87D1F7FE93B5C7FFA3A2A2FEA4A3A3FEA4A3A3FFA4A3A3FEA3A2 - A2FE93A5AEFF87D1F7FE87D1F7FE87D1F7FF87D1F7FE87D1F7FE87D1F7FF87D1 - F7FE87D1F7FE78CBF5FF10A1EBFE0D99E1FF3396C5FE5A6061FE494747FF4D4E - 4FFE70BBDCFE82CDF0FF7EA9BAFE7098A9FE7098A8FF647278FE494848FE4947 - 47FF413F3FE80202023900000004000000000000000000000000000000006777 - 7799484646FE494747FF595D5DFE539EBDFE0D96DCFF19A3E9FE8AD1F6FF95D6 - F7FE95D6F7FE95D6F7FE9DBBCAFFA7A6A6FEA7A6A6FEA7A6A6FFA7A6A6FEA6A5 - A5FE99C2D7FF95D6F7FE95D6F7FE95D6F8FF95D6F7FE95D6F7FE95D6F8FF95D6 - F7FE95D6F7FE49B7EFFF0D9AE2FE2397CFFF627378FE494848FE494747FF4947 - 47FE586C74FE7ACAEFFF80ABBEFE545656FE4A4848FF494747FE494747FE4947 - 47FF484646FE1817177C0000000E00000000000000000000000000000000B0EA - EA10515353DB494747FF494747FF5F6667FF4D9FC2FF0D96DCFF38AEEBFFA0DA - F7FFA4DCF8FFA4DCF8FFA6C9DAFFA7BBC5FFA7BBC5FFA7BBC5FFA7BBC5FFA7BB - C5FFA4DAF5FFA4DCF8FFA4DCF8FFA4DCF9FFA4DCF8FFA4DCF8FFA4DCF9FFA4DC - F8FF74C7F2FF0F9BE2FF2297D0FF627C84FF4B4949FF494747FF494747FF4947 - 47FF4A4848FF5F8493FF7FCFF5FF79959FFF4E4D4DFF494747FF494747FF4947 - 47FF494747FF313030BD0000001A000000000000000000000000000000000000 - 00009DCBCB30484748F2484646FE494747FE5E6464FF599DB8FE1296D8FF36AB - E7FE9ED8F6FEB2E1F9FEB2E2FAFFB2E2F9FEB2E2F9FEB2E2FAFFB2E2F9FEB2E2 - F9FEB2E2FAFFB2E2F9FEB2E2F9FEB2E2FAFFB2E2F9FEB2E1F9FEAFE0F8FF69C2 - EFFE1199DEFE3098C9FF63777DFE4B4A4AFF484646FE484646FE494747FF4846 - 46FE484646FE4C4B4BFF6B9EB5FE8AD0F0FE718085FF4B4949FE484646FE4947 - 47FF484646FE413F3FE701010121000000000000000000000000000000000000 - 00000000000021729B4A484849F6484646FE494747FF555858FE69919EFF2C9B - D0FE179BDEFE62BEEDFEABDDF7FFC0E6FAFEC0E6FAFEC0E7FAFFC0E7FAFEC0E7 - FAFEC0E7FAFFC0E7FAFEC0E7FAFEC0E6FAFFBBE4F9FE86CEF2FE32A8E4FF1596 - D7FE4F96B4FE5F6869FF4A4848FE494747FF484646FE484646FE494747FF4846 - 46FE484646FE494747FF515354FE93C1D5FEA7D2E6FF606565FE494747FE4947 - 47FF484646FE464444F10303031F000000000000000000000000000000000000 - 0000000000000000000021729B49484748F1494747FF494747FF4C4B4BFF6570 - 72FF5E99B0FF2B9CD2FF1197DBFF39ABE5FF68C0EDFF8ACFF2FF9ED7F5FFA7DB - F6FFA3DAF6FF94D3F4FF78C7F0FF4FB5E9FF1E9EDFFF1696D6FF469ABFFF657E - 86FF515252FF494747FF494747FF494747FF494747FF494747FF494747FF4A48 - 48FF535555FF515252FF494747FF606C70FFB5E3F8FF86979DFF4A4848FF4947 - 47FF494747FF413F3FE00000000F000000000000000000000000000000000000 - 00000000000000000000000000001D77A52D444B50D7484646FE494747FF4947 - 47FE4D4D4DFE636B6CFE688E9AFF4F9BBCFE359DCEFE1E98D5FF1396D7FE1195 - D8FE1295D8FF1897D6FE2A9BD1FE429BC3FF5B91A6FE68787BFE525353FF4947 - 47FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4F51 - 52FEB4DBEDFE99AEB6FF4F4F4FFE595F60FEBFE5F6FF8FA0A6FE4A4949FE4947 - 47FF484646FE2F2D2DA000000003000000000000000000000000000000000000 - 000000000000000000000000000000000000A5E4E80D7084848F494848F84846 - 46FE484646FE494747FE4A4848FF4F5050FE5A5F5FFE677071FF6B7B7EFE6A7E - 83FE6A7C80FF687476FE5F6565FE535454FF4B4A4AFE494747FE494747FF4846 - 46FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4B4A - 4AFE9EB7C2FECBE6F3FF9CAFB5FEB1CAD4FECCE8F5FF707779FE494747FE4947 - 47FF474545F60F0E0E2E00000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000000000004947472A4947 - 47A7494747FA494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4947 - 47FF535656FF93A4AAFFB1C3CAFFAABCC3FF788284FF4D4C4CFF494747FF4947 - 47FE262424690000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00004846461C48464676494747C8484646F7484646FE494747FF484646FE4846 - 46FE494747FF484646FE484646FE494747FF484646FE484646FE494747FF4846 - 46FE484646FE494747FF484646FE494747FF484646FE484646FE494747FF4846 - 46FE494747FE4A4848FF4C4B4BFE4B4A4AFE494747FF484646FE474545E03C3B - 3B52000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000A3A2A211A3A2A23BA4A3A35FA3A2A276A3A2 - A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2 - A27FA3A2A27FA4A3A37FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A37FA3A2 - A27FA3A2A27FA4A3A37FA3A2A27FA3A2A27FA4A3A377A3A2A248A3A2A2080000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF - FFFFFFFF0000FFFE001FFFFF0000FFF00003FFFF0000FFE00000FFFF0000FF80 - 00007FFF0000FF0000003FFF0000FE0000000FFF0000FC0000000FFF0000F800 - 000007FF0000F000000003FF0000F000000001FF0000E000000001FF0000E000 - 000000FF0000C000000000FF0000C0000000007F000080000000007F00008000 - 0000007F000080000000003F000080000000003F000080000000001F00008000 - 0000001F000080000000000F000080000000000F000080000000000F00008000 - 000000070000800000000007000080000000000300008000000000030000C000 - 000000010000C000000000010000E000000000000000E000000000000000F000 - 000000000000F000000000000000F800000000000000FC00000000000000FE00 - 000000000000FF00000000000000FF80000000010000FFE0000000030000FFF8 - 000000070000FFFF0000000F0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF - FFFFFFFF0000FFFFFFFFFFFF0000280000002000000040000000010020000000 - 0000801000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000030000 - 000E0000001F0000002D00000033000000340000002F00000022000000110000 - 0004000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000252424040404041F121212672928 - 28AD393838D8444242F0484646F9474545F8414040EB353333CE2221219F0909 - 0958020202251F1F1F0700000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000B0B0B14181818763D3B3BDF494747FF4947 - 47FF494747FF4C4B4BFF4F4F4FFF4E4D4DFF4B4949FF494747FF494747FF4846 - 46FD323030C60B0B0B5F0606061A526262010000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000BBC3C3011011112D343232C4494747FF494848FF565C5EFF507B - 8EFF4892B5FF429FCBFF40A3D4FF40A2D1FF439AC3FF4888A5FF526D78FF4E4E - 4EFF494747FF474545FA2221219D0304042A6183900300000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000151515363F3E3EE3494747FF545858FF4D88A3FF33A2DAFF34AB - E7FF39B0EDFF3DB3EFFF3EB4F0FF3EB4F0FF3DB3EEFF3AAFEBFF31A8E4FF3A9A - C8FF51717EFF4B4A4AFF494747FF2F2D2DBD0103042F7FABAB02000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00001E262625403E3EE2494747FF57696FFF379BCCFF2BA8E7FF32AFEFFF35B1 - F1FF35B2F1FF36B2F1FF37B2F1FF37B3F1FF38B3F2FF38B3F1FF38B2F1FF35AF - EDFF2BA4E2FF4488A8FF4F5050FF494747FF2E2C2CBA090C0C23000000000000 - 000000000000000000000000000000000000000000000000000000000000292E - 2E08363434C2494747FF586B71FF2B9DD5FF25A8EBFF29ACF0FF2AADF1FF2AAE - F1FF2BAEF1FF2CAEF1FF2CAEF1FF2DAFF1FF2EAFF1FF2EAFF1FF2FAFF1FF2FAF - F1FF2EAEEFFF27A6E6FF3C8DB3FF4E4F4FFF494747FF1F1E1E920F0F0F0F0000 - 0000000000000000000000000000000000000000000000000000000000001E1D - 1D6B494747FF565C5EFF2E99CEFF1CA4EAFF2491C8FF397D9FFF3C7FA1FF26A1 - DFFF22AAF0FF22AAF0FF23ABF0FF23ABF0FF24ABF0FF29A3E1FF4E6A79FF3D88 - AEFF2BA5E3FF26ABEFFF1FA2E5FF4583A0FF4A4848FF464444F6080808493230 - 30010000000000000000000000000000000000000000000000000101010B4240 - 40E44B4949FF478DADFF149FE6FF16A5EFFF189EE1FF3D464BFF514F4FFF3B6E - 89FF19A7F0FF19A7F0FF1AA7F0FF1AA7F0FF1BA8F0FF357DA2FF545252FF5452 - 52FF535455FF40687DFF1E9EDEFF1A9BDDFF526871FF494747FF2C2A2AB21413 - 130F0000000000000000000000000000000000000000000000001A19195B4947 - 47FF5B686BFF1799DAFF10A2ECFF11A4EFFF11A4EFFF1D6E98FF474545FF4B4A - 4AFF1E91CBFF13A4EFFF13A5EFFF14A5EFFF15A4EDFF45555EFF4D4B4BFF3F3D - 3DFF454343FF384B55FF16A5EEFF14A1E9FF358CB6FF4B4949FF464444F60403 - 0333000000000000000000000000000000000000000000000000333131AD4947 - 47FF4C87A0FF0D9CE5FF0EA2EEFF0EA3EFFF0EA3EFFF0E9FE9FF30424CFF4947 - 47FF3B5B6DFF0FA3EEFF0FA3EFFF0FA3EFFF1F88BEFF4A4848FF454343FF1874 - A3FF176288FF16709EFF10A3EFFF0FA2EDFF1297DBFF555F62FF494747FF1F1E - 1E8D21202007000000000000000000000000000000009F9F9F02444242E74D4C - 4CFF3798C6FF0D9FEAFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1678AAFF4240 - 40FF484646FF2183B5FF0EA3EFFF0EA3EFFF34637BFF484646FF34444DFF0EA1 - ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9BE3FF497588FF494747FF3D3C - 3CE00404042000000000000000000000000000000000A6A6A610494747FF5558 - 58FF239CD7FF0EA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF2A49 - 5AFF484646FF41515BFF0F9FE9FF129AE0FF464849FF474545FF1F678DFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF3E82A2FF494747FF4947 - 47FF1413136B2B2A2A03000000000000000000000000A8A8A821494747FF5D62 - 62FF1799DBFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF1385 - BFFF3E3D3DFF494747FF29769EFF247AA7FF484646FF3F3E3FFF1192D4FF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0D9FE9FF3989AFFF494747FF4947 - 47FF333131C60C0C0C15000000000000000000000000A8A8A820494747FF5C61 - 61FF189ADBFF0EA1EDFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3 - EFFF24536CFF474545FF454B4FFF3C5968FF484646FF2C5165FF0EA3EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF0D9EE9FF3A89AFFF494747FF4947 - 47FF484646FC0A09094A353434010000000000000000A7A6A60F494747FF5557 - 57FF269CD6FF0DA1ECFF0EA3EFFF0EA3EFFF0EA3EFFF0EA3EFFF10A3EFFF1AA7 - EFFF2498D4FF4D4E50FF5B5959FF5A5858FF565454FF2981AEFF17A6EFFF0EA3 - EFFF0EA3EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9DE7FF4083A1FF494747FF4947 - 47FF494747FF282727A81616160D000000000000000000000000454343E74C4C - 4CFF3B99C4FF0D9FEAFF0EA3EFFF0EA3EFFF0EA3EFFF20AAF0FF35B1F1FF36B2 - F1FF36B2F1FF457A95FF666464FF676666FF5A6064FF37AEEBFF36B2F1FF30B0 - F1FF15A5EFFF0EA3EFFF0EA3EFFF0EA2EEFF0D9AE3FF4D7587FF494747FF4947 - 47FF494747FF444242F104040430000000000000000000000000343232A94947 - 47FF51879EFF0D9BE4FF0EA2EEFF0EA3EFFF27ACF0FF49B9F3FF49B9F3FF49B9 - F3FF49B9F3FF4DB0E3FF747373FF757474FF5A879EFF49B9F3FF49B9F3FF49B9 - F3FF45B8F2FF15A5EFFF0EA3EFFF0DA1ECFF1598D9FF575F60FF494747FF4947 - 47FF494747FF494747FF1D1C1C880000000600000000000000001C1B1B554947 - 47FF5D6769FF1B9AD9FF0DA1ECFF0FA3EFFF59BFF4FF5EC1F4FF5EC1F4FF5EC1 - F4FF5EC1F4FF69ADD0FF858484FF818080FF62B0D8FF5EC1F4FF5EC1F4FF5EC1 - F4FF5EC1F4FF3DB4F2FF0EA2EEFF0D9EE7FF3C8DB3FF4A4949FF494747FF4947 - 47FF494747FF494747FF3C3A3ADD0000001E0000000000000000030303054846 - 46E14A4949FF508EA9FF0D9BE3FF18A6EEFF74CAF5FF74CAF5FF74CAF5FF80B3 - CDFF88ABBEFF8F9FA8FF969595FF88969EFF74CAF5FF74CAF5FF74CAF5FF74CA - F5FF74CAF5FF58BFF3FF0DA1ECFF1698D9FF56676DFF505B60FF678897FF6889 - 97FF688997FF585F62FF494747FF121212660000000300000000000000005E69 - 695F494747FF575B5BFF3399C9FF0F9EE7FF7CCDF5FF8AD2F7FF8AD2F7FF9BB0 - BCFFA5A5A5FFA5A5A5FFA5A4A4FF91B9CDFF8AD2F7FF8AD2F7FF8AD2F7FF8AD2 - F7FF8AD2F7FF4FBAF1FF0D99E1FF4D839AFF4A4848FF526168FF7DCAEEFF7699 - A6FF647E89FF555B5DFF494747FF313030C200000012000000000000000090B7 - B701606C6CB9494747FF5C6A6EFF2999CFFF3BAFEAFF9FD9F8FFA0DBF8FFA4BF - CCFFA6B4BAFFA6B4BAFFA6B3BAFFA1D6F1FFA0DBF8FFA0DBF8FFA0DBF8FFA0DA - F8FF8BD1F5FF179DE2FF458CACFF4E4E4EFF494747FF494747FF5F8291FF7EBA - D5FF535555FF494747FF494747FF474545FB0505053200000000000000000000 - 0000AFE8E815434D53DD494747FF5C676AFF3998C5FF3CACE6FFA1D9F6FFB6E3 - F9FFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB6E3FAFFB5E2F9FF81CC - F2FF239EDDFF4D87A0FF4E4E4EFF494747FF494747FF494747FF4A4949FF71A1 - B6FF87ABBAFF4C4C4CFF494747FF494747FF1515155E00000000000000000000 - 0000000000001580B621434D53DC494747FF535555FF56879BFF2E9DD2FF49B1 - E6FF7FCAF0FFA1D9F5FFAFDFF7FFACDEF7FF97D4F4FF6DC2EDFF33A6E0FF3A95 - BFFF596F77FF4A4949FF494747FF494747FF494747FF4B4A4AFF4F4F4FFF4E4F - 50FFA3CDE1FF6C7578FF494747FF494747FF1514145100000000000000000000 - 00000000000000000000409FC71457686CB5494747FF494747FF565959FF5B7B - 86FF498DABFF3D97C1FF369AC9FF3799C7FF4093B9FF4D849CFF5C6D71FF4D4D - 4DFF494747FF494747FF494747FF494747FF494747FF69767CFFB1CCD8FF595C - 5DFFADCBD8FF757F82FF494747FF464444F10404041200000000000000000000 - 00000000000000000000000000000000000050525255494747D6494747FF4947 - 47FF494747FF4B4A4AFF4D4C4CFF4C4B4BFF4A4848FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF4C4B4CFF99ACB4FFB9CF - D8FF9EAFB6FF505050FF494747FE212020670000000000000000000000000000 - 0000000000000000000000000000000000000000000049474701494747404947 - 4790494747C9494747ED494747FD494747FF494747FF494747FF494747FF4947 - 47FF494747FF494747FF494747FF494747FF494747FF494747FF494747FF4B49 - 49FF494848FB484646CC42404051000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF80 - 1FFFFE0007FFFC0001FFF00000FFF000007FE000007FC000003FC000001F8000 - 001F8000001F8000000F0000000F000000070000000700000003000000038000 - 0003800000018000000180000000C0000000C0000000E0000000F0000000F800 - 0000FE000001FF000003FFFFFFFFFFFFFFFFFFFFFFFF28000000180000003000 - 0000010020000000000060090000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000006767 - 67066767670F6767671267676710676767076767670100000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000021202002040404201616166F2928 - 28AC333232C9363434D0323030C6252424A510101064010101201D1C1C040000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000262B2B101F1E1E86424040ED494747FF5051 - 51FE535F63FF526269FF525B5EFF4D4C4CFE494747FF3B3A3ADD141313711A1D - 1D14000000000000000000000000000000000000000000000000000000000000 - 000000000000000000004A4A4A20363535C94A4848FE516872FF4590B5FF39A6 - DCFE37ABE6FF39ADE8FF36AAE5FF3CA1D3FE4583A0FF4F595DFE484646FE2827 - 27AB1521271D0000000000000000000000000000000000000000000000000000 - 0000000000004E6767153B3939D34E4F4FFE4789A8FE2DA7E5FE34AFEFFE37B2 - F1FE38B3F1FE39B3F1FE39B3F1FE39B3F1FE36AFEDFE31A2DBFE4A7183FE4948 - 48FE2C2B2BB42B39391500000000000000000000000000000000000000000000 - 0000171A1A022F2D2DAA4D4D4DFF3E8FB5FF23A7EAFE27ACF0FF29ADF0FF29AD - F0FE2AADF0FF2BAEF1FF2CAEF1FF2EABEBFE2FACECFF2DAEF0FE27A5E5FF4875 - 8AFF494747FE1D1C1C892B2A2A05000000000000000000000000000000000000 - 000012121245494747FE497F98FF18A1E7FF1E95D1FE46565FFF436B81FF1DA8 - EFFE1EA9F0FF1EA9F0FF1FA9F0FF3882A8FE535B60FF427793FE2D95CAFF1F9F - DFFF4D616AFE444242F30E0D0D2F000000000000000000000000000000000000 - 0000343333B6545A5CFE1C9ADAFE11A3EEFE12A4EFFE2B5C76FE4C4A4AFE2686 - B8FE14A5EFFE14A5EFFE15A5EEFE455862FE4A4848FE464444FE345E73FE16A4 - ECFE318CB9FE4A4848FE21202090333232020000000000000000000000007C7C - 7C11474545F9497A90FE0D9EE8FF0EA3EFFF0EA2EEFE1192D4FF3E4143FF4152 - 5CFE10A0E9FF0EA3EFFF1D8AC1FF494747FE2C5B73FF1478ACFE1386C1FF0FA3 - EEFF109AE0FE515C60FF3E3D3DE4151515180000000000000000000000008B8A - 8A3F494747FF398EB5FE0DA1ECFF0EA3EFFF0DA2EEFE0EA3EFFF216486FF4746 - 46FE29779FFF0EA3EFFF336580FF464444FE1682B9FF0DA2EEFE0EA3EFFF0EA3 - EFFF0D9EE8FE456F83FF494747FF16151569000000000000000000000000908F - 8F574A4848FF3296C7FE0EA2EDFF0EA3EFFF0DA2EEFE0EA3EFFF0F9AE0FF3942 - 48FE454B50FF1694D5FF45494CFF384851FE0EA1ECFF0DA2EEFE0EA3EFFF0EA3 - EFFF0D9FEAFE3E7894FF494747FF343333C91F1E1E0D0000000000000000908F - 8F564A4848FE3296C6FE0DA2EDFE0DA2EEFE0DA2EEFE0DA2EEFE0DA2EEFE1D6F - 9AFE494747FE435762FE4B4949FE226A90FE0DA2EEFE0DA2EEFE0DA2EEFE0DA2 - EEFE0D9FEAFE3E7894FE484646FE484646FD0F0E0E4500000000000000008C8B - 8B3E494747FF3C8EB4FE0DA1ECFF0EA3EFFF0DA2EEFE15A5EFFF26ACF0FF2EAC - ECFE4F5F68FF615F5FFF5B5B5BFF2FA0DAFE22AAF0FF10A4EFFE0EA3EFFF0EA3 - EFFF0D9DE7FE476F82FF494747FF484646FE292828AA07060606000000007D7C - 7C0E484646F94D7A8EFE0D9DE7FE0DA2EEFE1CA8EFFE44B7F2FE46B8F2FE46B8 - F2FE5499BCFE737272FE607C8BFE46B8F2FE46B8F2FE3FB5F2FE12A4EFFE0DA2 - EEFE129ADFFE525C5FFE484646FE484646FE454343F304030329000000000000 - 0000363434B2555A5BFE1F9BD8FF0DA2EDFF4DBAF3FE62C2F4FF62C2F4FF62C2 - F4FE75A3BBFF878686FF6AA7C7FF62C2F4FE62C2F4FF62C2F4FE35B2F1FF0DA0 - EBFF348BB5FE4A4949FF4A4848FF4A4848FE494747FF1F1E1E88000000020000 - 0000292B2B3D494747FE4F7F94FF0E9CE5FF66C4F4FE7FCEF6FF85C0DEFF9CA0 - A3FE9E9E9FFF989C9EFF80CBF2FF7FCEF6FE7FCEF6FF7FCEF6FE46B7F1FF1799 - DBFF506167FE5D7C8BFF7AB1C8FF729FB2FE585F62FF3D3C3CE0000000160000 - 0000000000006C7F7FA14D4C4CFE438EB0FE3AAEE9FE9CD8F8FE9FCDE5FEA7B1 - B6FEA7B1B6FEA2BFCDFE9DD9F8FE9DD9F8FE9DD9F8FE91D4F6FE22A1E1FE4C74 - 85FE494747FE4D5153FE76B2CDFE596063FE494747FE484646FE121111580000 - 000000000000B5F2F20C3E525DCC4E4E4EFF4A87A2FE46AEE3FF9CD7F6FFB9E4 - FAFEB9E4FAFFB9E4FAFFB9E4FAFFB8E3F9FE86CEF2FF37A1D6FE4F707EFF4947 - 47FF484646FE494747FF546167FF8DB9CCFE4F4F4FFF494747FF232222860000 - 000000000000000000001184BF123C5461BD494848FE56676DFF428BADFF49A9 - D7FE56B5E5FF5BB8E7FF54B3E3FF42A0CCFE467F99FF525859FE494747FF4947 - 47FF484646FE687277FF606567FF8BA5B0FE6A7275FF494747FF1C1B1B640000 - 00000000000000000000000000007B9EA1035459596C484646E8494747FE4F4F - 4FFE595E5FFE596264FE56595AFE4C4B4BFE494747FE484646FE484646FE4846 - 46FE484646FE61676AFEAABFC7FEA8BCC4FE535455FE3F3E3ED70303030B0000 - 00000000000000000000000000000000000000000000767575077675754F7675 - 7590767575B4767575BF767575BF767575BF767575BF767575BF767575BF7675 - 75BF767575BF767575BF777676BF777676BD7674748C58575714000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000000000000000000000000000FFFF - FF00FF03FF00F800FF00F0007F00E0003F00C0001F0080000F0080000F008000 - 0700000007000000070000000300000003000000010000000100800000008000 - 0000C0000000C0000000E0000000F0000000FC000100FFFFFF00FFFFFF002800 - 0000100000002000000001002000000000004004000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000001B1A1A01050505221818186D2322 - 2292222121911615156802020220191818010000000000000000000000000000 - 00000000000000000000000000006C7B7B0B2827279349494AF74A6774FF4777 - 8EFF47758BFF4B606BFF444343F01F1E1E844E63660B00000000000000000000 - 0000000000000000000073959509373636BF4B6876FF37A0D4FF36AFEDFF3AB3 - F0FF3BB3F0FF37AFECFF3B97C5FF4A5A62FF292929A94E5F5F09000000000000 - 000000000000000000003131318D496A79FF249EDCFF3295C8FF27AAECFF27AC - F0FF29ADF0FF359BCFFF31A2DCFF2AA0DBFF49585FFF1F1E1E78000000000000 - 000000000000565656194C4E4FF8219AD6FF14A3EBFF3D525DFF2F7CA3FF16A6 - EFFF17A6EFFF475C67FF4B4A4AFF2B7DA7FF2D8CBBFF413F3FE9282727100000 - 0000000000006D6C6C65466C7EFF0DA0EBFF0EA3EFFF187FB4FF434A4EFF139B - E0FF1C8CC5FF434547FF1386C2FF1196DAFF0F9EE6FF4C585EFF201F1F650000 - 0000000000007877778C3B7C9BFF0EA2EDFF0EA3EFFF0EA2EEFF315467FF306B - 8AFF316986FF2E5F79FF0EA3EFFF0EA3EFFF0DA0EBFF426678FF363434CB3231 - 3106000000007877778B3C7C9AFF0DA2EDFF0EA3EFFF0EA3EFFF1C8DC7FF4D4E - 4FFF4D5357FF1E87BCFF0EA3EFFF0EA3EFFF0DA0EBFF436677FF484646FE1F1E - 1E40000000006E6D6D64486D7DFF0DA0EAFF14A5EFFF3AB3F1FF40B6F2FF5B80 - 94FF647077FF40B5F0FF35B1F1FF0FA3EFFF0F9DE6FF4D585DFF494747FF2B2A - 2AAA00000001575757164E4F50F72199D4FF3DB5F1FF69C5F5FF71B8DDFF8599 - A4FF78A4BBFF69C5F5FF69C5F5FF2CAEF0FF2D8AB8FF525D62FF58686FFF494A - 4AF60404042200000000667474864B6976FF3CADE6FF95D6F7FFA3B2BAFFA6AC - AFFF97CFEBFF95D6F8FF90D4F7FF2E9FD8FF4B585DFF5E7D8CFF6B8996FF4C4C - 4CFF1F1F1F8000000000A4D6D605395869B64C6773FF58AAD2FF8DD0F2FFAFDF - F8FFABDEF8FF83CBF0FF4E9BC1FF4C595FFF494747FF4B4A4AFF7A9AA8FF5253 - 54FF2F2E2EAB00000000000000005897AD05586263824C4B4BF44E6570FF4372 - 88FF437085FF4F6067FF4A4848FF494747FF494747FF808E95FF97A9B1FF5557 - 58FE1B1A1A5A00000000000000000000000000000000A4A3A310A4A3A356A4A3 - A37AA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37FA4A3A37EA2A1 - A147000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000FFFF0000E01F0000C00F00008007000080070000000300000003 - 0000000100000001000000000000000000008000000080000000C0000000F001 - 0000FFFF0000} - OldCreateOrder = False - Position = poScreenCenter - OnClose = FormClose - OnCreate = FormCreate - PixelsPerInch = 96 - TextHeight = 13 - object bvlSpace: TBevel - Left = 0 - Top = 314 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - object jplWizard: TJvPageList - Left = 0 - Top = 0 - Width = 527 - Height = 314 - ActivePage = jspWelcome - PropagateEnable = False - Align = alClient - OnChange = jplWizardChange - object jspWelcome: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - Color = clWhite - object imgInstall: TImage - Left = 0 - Top = 0 - Width = 164 - Height = 314 - Align = alLeft - AutoSize = True - Picture.Data = { - 07544269746D6170AE5B0200424DAE5B0200000000003600000028000000A400 - 00003A0100000100180000000000785B0200C40E0000C40E0000000000000000 - 00008C00018900028400047800036E02085F06094B02043500003404022F0401 - 3100004303024D00006200007300008304068000018200008600008700008700 - 018400018000047800046700016508094D00004D01024300004400014804053E - 00004300033C00003E00004302043D00004201034403053E00004201033C0000 - 3E00004302043D00004201034403053E00004201033C00003E00004302043D00 - 004201034403053E00004201033C00003E00004302043D00004201034403053E - 00004201033C00003E00004302043D00004201034403053E00004201033C0000 - 3E00004302043D00004201034403053E00004501023F00004100004603024000 - 004502014504033F00004302013C00003E00004104023900003E030140050338 - 00003B03023300003800003F04023B00004302014D03014C00005D0302570000 - 7002027A03047C00008702058700008A00028400018200018000018000018000 - 018000018400018400018300008000017B00027101016705055D08064E03013F - 00004003003F02004100004D02005200005E00006A00007A05087B00027F0002 - 8200018200018200018000018001008001008601008700008900008700008400 - 017D01017201046604045300014300003E00003F03043D00014300064B000845 - 00014C06063C00004F0A074000008A00018700028000047500046A03085D0609 - 4903043500003303013606043000004908074C00006701027000008405078000 - 018200008600008700008700018400017D0004760104640000680B0C49000051 - 07073E00004804054501024100003F0000420103390000500F113900004E0D0F - 3E00004201033E0000420103390000500F113900004E0D0F3E00004201033E00 - 00420103390000500F113900004E0D0F3E00004201033E000042010339000050 - 0F113900004E0D0F3E00004201033E0000420103390000500F113900004E0D0F - 3E00004201033E0000420103390000500F113900004E0D0F3E00004202024100 - 004502013C000053100F3C0000510E0D3F00004302013F00004202013900004E - 110F3700004C0F0D3C00003E03013800003C03013500004E110F3A0000530E0B - 4800005300005F03025A00007002027B03047C00008702058700008A00028600 - 018200018000017F00017F00017F00017F00017F00017E00017B00027601026A - 03016206055809064904013D0000420200490401430000580704520000670102 - 6800007D06077D00028000028200018400018200018200018001008001008200 - 008401008400008200007F00017801026D02046205044E00004901013900004E - 0F11390000510B124500024B00034D01024300005609074A0000880006820004 - 7D01076D00026403074F00004301023800003403013401003A00004A00005D03 - 036E03057B02068000028301028301018600008500008500007F000079000470 - 02046200015600004F01024500004701024100004600014300004100013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004300004200004502014100004302013F000042010041 - 00004000003E00004303023F00004404034000004303024101003E01003E0100 - 4101004300004700004C00005100005900006804046D02047402027B00028000 - 028600028700028900018700018400007F00007C000078000176000076000074 - 00007502056B00006400005600005001004200003C05003C0200480000520000 - 5A03016104036A04057103037801027C00018300038500028700028600018400 - 018100008100007F00007E03017C03017E06067903027606066900005F000051 - 00004C00014500004300033D00004300054000004700034B00005400005B0000 - 6101016303037D00047D04086B00006D06095100005006063D00003A02013802 - 013900004200004F00006202027103037E010382000183010183010184000084 - 00008100007E00007500036D02045C00005704034500004C06063C0000490506 - 3F00004501024000004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101014000004704033D000048 - 07063A00004706053D00004101003E00004404033B00004908073B0000480706 - 4000004502014300004300004800004C00005201005601005E01006400006D02 - 047201047801027D00028200028600028700028700018600008300007E000078 - 00007301016F01016E01036A0203680203670505550000570402400000440802 - 3500003F03005300005F00006602026D03027303037902037F00028100018500 - 028700028700028600018400018200018000017D01017501007708066B000073 - 0C0A6000006407065100004F00004A00004A04043C00004702054000004F0307 - 4800005801056200006A00006E00027002027602076900006E070C5200005908 - 0B3E00004405073800003D01014100004A000058000069010277020380010382 - 00018301018301018200008200007F00007A00007100036602025A0202480000 - 4F09093A00004B090A3A00004905064200004300033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004301023B00004A09083A00004B0A093900004606053E00004202013B0000 - 4A09083C00004F09093E00004C04044600004900004E00005300005700005D02 - 006403006904027004037402027801027D000280000282000284000286000286 - 00018500008100007A00007302006C02016703036302046104055F0505530000 - 5A0706470000520B083A00004309034400006102006E01007202027703027D03 - 038001028200018300008600018600018600018500028101028001027E020279 - 03026F05046200006B0C09540000630C0A4A00005106044700004C0404420000 - 5006064300005605084900005D080C6102066F00017900007D00027E02026500 - 016906085000005B080A4000004A08093700004203054100004A000055000162 - 00006E00027901028000018400018102018102018001008001007C0000740000 - 6D00026101015100005107053A00004A0D0B3700004B0B0B3B00004503043E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004C0C0B390000480B09 - 3700004003013F00004807063C0000500A0A4000005208084300005000005500 - 005B00005E00006400006902006F03027404047A03047B00027D000280000282 - 00028400028400028400028400028301017E03017602016E03006402025D0302 - 5603025503025000005704064A00005C0A09470000590E0C4700005806016F04 - 017A02027D03037F03038202038301028400018600018600018400018200017F - 00017C02027903027703027103036200006309094C00005E0C0B430000540A08 - 3F00004904014700005105064900005F0909500000690A0E5E000172070A7B00 - 028301028402038402035C03064D00005608094000004B090A37000045060840 - 00004900005300016000036B00027500037C00018200018400008001007F0100 - 8002017D02007800007001006700005C00005202013F00004B0B0A350000480C - 0C3700004808084100004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202370000 - 4A0A093700004A0D0B3500004308063C00004404033B00004F09094000005509 - 0A4500005505065200006302006A01006D02006F02007302007802017C010380 - 01038200028200028400028400028400028400028400048000028204037A0502 - 6F04016504005A03015102004A00004900004D00014900005E05085200006B0D - 0E5A00006A0D0C6702007B030382030282030284020286020285010184000184 - 00018100007E00007B01017802017203017003016D04016804025E04044E0000 - 57090A420000500A0A3C00004B08074600004B00004A0000630909570000760D - 106500007A090C7700018102038602028602028602024A00004E06063C000047 - 0A083500004408083900004601044D00005900016700057300037A00017F0000 - 8300008400008001007F01008002017C03017802016D00006300005700004900 - 00470703350000430C09330000460A0A3C00004604053E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023C0000440705370000460B09350000450A083600004003014000 - 004807063E00005208084500005808094D00005D03036D030274030176020179 - 01017D0101800001820002860002870002870002860002860002840002820002 - 8200047F00027A03017305006804005C03004F02004500004200004300004800 - 005702065300006F080D6500007F0C0F7300017F050584020285010187010187 - 01018701018701018500028101027E00007800007501006F0200690200660300 - 6302005E02015200005405084200004C08093A00004808073E00004B03034C00 - 005F05045D0000790C0E6D0000830B0C77000080010282030283010183010183 - 01014302013D00004206063300003E08083400004304064700015000005F0002 - 6E00067901057E00018200008500008400007F00007D02007E03017A03017602 - 016C01005E00005400004B01003C000040070530000040080736000044060642 - 02024100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00003F01013800004207053300004108 - 063400004005033D00004303024000004D05054300005606074D00005D060960 - 02037203017B02007D01018000018200018600018700018900018B0002890002 - 8700028600028400028200028000047B00027100006702005E02005301004801 - 004001003D00004000005104085400016A030A6A000085070D8000008E02098A - 0000870000860100870000860000860000840000830101800201790101750100 - 6D02006602006002005A02005700005300005000024700004D03093A00004706 - 083B00004805044900005A04045F000075070972000087080A7F00008B030584 - 00008001007F01007F01007F01003F00003F02003900003D05043701003E0504 - 4000004A00015400006300027201057C01058000018200008500008400007F00 - 007D01017A02027504026F03026302005700004C00004500003F02003800003B - 03023800003F03033F01014404044000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000013E00013D01023C00004201033E0000430003 - 4000004100014100014200023F00004201033E00004001033D00003C00013901 - 003A03003700003B04013800003E03013D00004100004600004C01004C000055 - 00005600006103046401036D05067501007A01007F0100800001840001880002 - 8A00028C00038B00028900048600048000047D00047900047800057002046100 - 005A00005600005100004B00004A00004A00014D00015C05096605096D00057B - 03087F00038A01058B00008B0000890000860000860000860000860000860001 - 8301027F03037801026F01016602025E02015302004B01004500004500004C00 - 004E00024900004C01034600004D03034E000057000068060672060576000080 - 01038000008700028700008701018001007C01007E00007C0100430000400000 - 4002023A00003C03023C00004401004A00005E04046802037301017B01018000 - 018301018501018301018301027D00027806066800015F02034F00004A000142 - 00004000013D00004001033C00004002023E00003F02003E00004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100023E0001390100360000 - 3C03023C00004301024100004600024700014700014400004500053F00014000 - 053800013A01043501013202013000003403013200003D04023C00004502004A - 00005000005800006301016A0203730205770205790102780000770500770500 - 7A04007D020080010083000086000086000187000484000582040A7901067303 - 0A6600026000025400004C00004A00004E00005200005800005F00016700066F - 03096F01057201047402027802017B01017D0200820100840100820000850000 - 8700008800018800028800038500057F00047A04096900055A00034800004201 - 033400002F03043100004600005100005500005900005F02016703016E040374 - 04047801027B01017F00018000018200018200018200018200018000017F0001 - 8000017F00014400004703043A00004507073500004606054100004F00006004 - 036A03017301017B01018001008301018301018301018100018205076E00006C - 0A0A4E00004F05053D00003F00023B00024003073A00004706083A0000460606 - 3C00003F02003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00003D01023600003B05043300004307073900004905064100004800024600 - 004902053D000047050A3500003F06093300003402023101003606042D00003E - 09063500004906034600005200005B00006300006D01007601027E0103810003 - 8400018100007A04007705007A04007B03008001008200018400028400028000 - 0580040A6E000172060C5C00005F03084E00004C00034300034400044E000558 - 00026200026D00037600057C00067B00047B00027901017902007902007B0300 - 7F02008002008401008600008701018500028500038000027C00047600036D00 - 056402084C00004C040A34000039070B2800003200004A00005700005E000064 - 01006B02007203017A02027F0303800001820001820001820001800001800001 - 7F00017F00018000018000018000018000014701023D0000490909370000480B - 093900004D06034E00006104036A03017402027B010180010082000083010183 - 0101820104760000790B0D5A00005E0A0C4000004605073B00003E0105360000 - 49080A3900004B090A3900004606053C00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073C00003B0302330000430A093500004A0A - 0A3A00004904074100004500033D00004A070A390000460A0B3300003F060735 - 0000390302340000430A083700004D0A09420000560403530000610101690200 - 7202027A02038102038301028600018300007F02007D02007F01008002018101 - 028101028100037E01037D03096C000070060C5500005F050A47000051040846 - 00024200024801045200055E00056700047100047A00047E00057D00027D0002 - 7D01017D02007F01007F02008201008401008802028801038402038001027901 - 027200006A00026200015E00044D00005506094000004F0A0D3A000045050A40 - 00005601006002006502006902006F02007602017C0202800102800001820001 - 8200018200018000018000017F00017F00018000018000018000018000014300 - 004A06073900004A0C0C3700004B0A094200005200006404046D03027601027D - 01018001008200008200008001007D00007F08096500006D0D0D490000510909 - 3A00004004053A000145050A3900004C0B0D3A00004A0A0A3900004003013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004001033A00 - 00410807350000480C0C370000480A0A3900004201033E00004706083900004A - 0B0D370000460A0B3500003E02023C00004707033C0000540D0A4500005C0B08 - 5300006203006904027103037803047D03038202038500028700018600008400 - 008201008200008001008001027E02027A02037702056C00026C07095200005C - 080A4300004E08093B00004503044502014D03035804066403076F0105770004 - 7D00048100038000028000027F00018000018001008200008600008600008902 - 048502057F02047702036C02016000005700004F000049000050060642000055 - 080B4500005D090D4E00005C03066303036804006C0300700301740301790101 - 7E02028101028200018200018200018200018000017F00017D01017D01018000 - 018000018000018000014501023C00004A0A0A3900004C0C0B3C00005106044F - 00006604046F03027801027D01018001008200008001007F01007F02046F0000 - 760B0D5300005B0B0C3E00004807093C00013E01053700004A090B3A00004D0B - 0C3900004707063C00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E0000400202370000480A0A350000480C0C35000041080738 - 00003C0302350000460A0A3700004A0C0C390000470707410000490000450000 - 5809064A0000650E0C5500006C0B086801007205037804037D03038103028402 - 028701018700008700008600008500008400018000017D00027801027002046B - 030460000150000059090A4000004D0B0C3700004007063B00004A0300560502 - 6206056B05067502057B00028000028301028200018200018000018000018200 - 018400018700018600018400067C01057502056A02035C02015101004401003F - 00004205013B000050090647000062070A59000074060C6F0004700403700502 - 7304027703027A02027E02028000018200018200018400018200018200018000 - 017F00017D01017D01018000018000018000018000014100004705063900004A - 0A0A3900004E08084600005700006905057103037901027F0001800100820000 - 7F00007C01007600007707075E0000640A094500004D07073B00004105063A00 - 014404093900004B080B3A00004909093A00004003013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033F000046060639000048 - 0A0A330000420A093300003B03023700003F0706350000480A0A3A00004C0809 - 3F00004C00015000005D04005300006A0C075C0000740D0A6B00007708067804 - 037A02028002018102018501018701018800018800018600008300008100007C - 00007400006D01006501015E02014C00004F04023E00004C0C0B350000420A09 - 3000003E01005204006105006B07037205037A02028000018400018500028400 - 018200017F00017F00018000018200018400028000027700037000036600025E - 01024F02004502003A02003602003901004809054200006009075A0000780508 - 79000085050A7902037504027903027A02027E02028101028200018400018400 - 018400018200018000018000017F00017D01017D01017F000180000180000180 - 00014200013D00004606063900004807064100005402015800006C0405750303 - 7C01038000018200008100007F00007A01007601026A00006907075100005004 - 053C00004304063E02033F00043A00004605073A00004806073A00004404033D - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A000044030540 - 00004400023F00004605073700004108073300003B0504360000380300350000 - 4207053900004C06064300004E02035000006102006200007007046700007609 - 076F00007B08057A03017D02007F010080010082000084000084000087010185 - 01018200017E00017700007100006700005F00005500004E01004700003C0000 - 4407053400004209083400003C04034100005E03006C04007504017A03018001 - 008600008700008802028200017F00017B00027901027901027901027B000478 - 00046600005D00005700015000014701013F02003902003801003C0200410000 - 5B0A075C00007606067500008B02068800037F00017B01017D01017F00018000 - 018200018500028700028600018400018200018000018000017F00017D01017D - 01017F00018000018000018000014100004200013E00004301024100004B0101 - 5000005C00007003057902038001038200018200008100007E00007A01007000 - 006B04025D00005502004600004201003E00014004053E00034100043F000043 - 00033F00004202023D00003E01004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004100014300014400023F00004001033800003B0302 - 3600003701003902003B02003E00004502014700005000005000005900006D03 - 027605037401007B06037700007D04027C01008002018001007F00007F00007F - 00007F00008001008102017F03037801027301016D00026600015C0000520000 - 4A00004500003F00003D03003700003C03013700003E02023E00004C01006703 - 007804007C04008103008500008800008700008602027F000179010174020270 - 02027002047002047002046B02055500004E00004900004700004201003F0200 - 3E01004001004000005103005F0400710A077802018402038700008900018100 - 007F00007F000082000184000186000187000287000286000184000182000180 - 00018000017F00017D01017D01017F0001800001800001800001420202410101 - 4404044000004701014A00005901016300027002047901028000028400018400 - 008200007F01007902007103036400005B01004E00004A02023F00003D01023A - 00003E00033F00024300034100004301023E00003F02003E01004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E0000410002410001440002420000 - 4300033E00003E02023800003B02003900004005034202014400004700004E00 - 005600005E01026804047403017B02007D02007D02007F010080010080010082 - 00008001007F00007E00007C01007B02007A03017A02027605036D0506640202 - 6103045400005000004500004502003F02003C01003900003C03013A00004202 - 013F00004400015100006F03007D010080000084000087000088000088000281 - 01027901027101016F07086503036706085F00005F00005600004C0103430102 - 4400014300004200004500004700004D00005D06046405026D03027403017B01 - 0182000086000087000084000184000184000186000186000186000186000186 - 00018400018400018200018000018000017F00017D01017D01017F0001800001 - 8000018000014000004606063C00004907084000005404055600006801047401 - 047D00028200028400018400008200007F01007803006C02016506034F000053 - 06033F00004707063800003B01023D00024402073B00004A05083A0000460606 - 3A00003D02003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004200024200004702053B00004805083900004305053900004000004502 - 014801004C00005000005A00006000006703037004037B010180010080010082 - 00008200008200008400008200007E00007C01007C03017A0502750402720301 - 6E01006601005F02035B08074B00005207053E00004607033B00003D05003900 - 003E05033600004707063C00004D050545000056000074060281040085020087 - 01018700008600008100007A00017202026E08095C0000620A0A5100005A0608 - 5100004E00014100003C00004000004600004B00005200005900006000006B04 - 027002027602017B01017F010080010082010084000086000186000186000186 - 00018700018600018600018400018400018200018200018000017F00017F0001 - 7D01017F00018000018000018000018000014103033A00004B0B0B3C00005309 - 094900006305066900017800047F00028400028600018400008200007D020076 - 03006B06045800005B08064300004E0B0A3700004206073800004000053A0000 - 4A070A3C00004B090A3900004407053A00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004401063C00004A070A3A00004C08 - 093C00004903034500004D00005200005800005F00006600016C020171030379 - 05047F01008200008200008400008400008400008200018000017D0000790101 - 7804037205036E04036702006000005700005404034400004F09093A00004909 - 083500004108063A01003C0301360000470A083A000051090943000052040553 - 00006F04017A03018103028303048402038201047B00027300036F07085C0000 - 610B0B47000057090A4300005104074700003E00003C00004300004C00015700 - 036201036D02057502057901027D00027F00018000017F01007F01007D02007F - 0100840001870001870001870001860001860001860001840001840001820001 - 8200018000017F00017F00017F00017F00018000018000018000018000013C00 - 00460808390000500C0D4300005C080A5900007002067B000482000286000287 - 00018600008200007D0200740300650100600905470000550C083A0000480D0B - 3400003C02033C000147050A3A00004F0A0D3A00004A0A0A3700003E03013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 0147050A3A00004F0A0D3E00005207094500005200005900005D00006501016B - 01007202027703027903027D0303800100840000840000840000840000820001 - 8000017F00017B01017702036F03026903046101015A00005300004C00004400 - 00480706390000490C0A350000460B093400003E05033A00004508063900004F - 0C0B4000005309094300005300006100006A00007000007702037B0307790407 - 7204066D04075F0102600A0A450000560C0C42000051080A4200004A01034400 - 004700004E000159010165020470030579040781030880000284000284000182 - 00018001007F01007B02007D0200840001870001870001860001860001840001 - 8400018200018200018200018000018000017F00017F00017F00017F00018000 - 018000018000018000013E02023800004C0C0C3C0000560A0B4C00006906086D - 00027D00048400028700028900018600008200007D0200720400670603500000 - 570A074000004D0D0C3500004208093800004000053900004B080B3C00004D0B - 0C3900004508063A00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083C00004101063700004A090B3C0000550A0C4700005C030658 - 00006601036C01037201047702037A02037E02027F00017F0000820001820001 - 8200018200018200018000027F00027B00027803046F02046501015C00005300 - 004E0000480000450000430201390000470909370000490B0B3700004507073D - 00004202013900004B0A093C0000510B0B3E00004C06064800004F0000570000 - 5D00006402026803056803056502046002065801044A0000560B0D400000560B - 0D4200005104074B00005600005B01006100026701027002047702037F020483 - 02058400028600028600018400018200017F00017D01017F0001840001860001 - 8600018400018400018400018400018200018200018000018000018000018000 - 018000018000018000018000018000018000018000013A000044060639000050 - 0A0B4300005D06095F00007403077D0004860002890002890001860000800100 - 7D02007204006001005A08034300004F0B06370000450C0A3500003D03043C00 - 014604093C00004D080B3A00004909093800003E03013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A000040010338000140050939000050 - 090C4500005F080C5A00006900037001057702057C0103800102810102820001 - 8100008100008200018200018200018200018000027F00027B00027801027002 - 046701025C00005000004800004300004000004002023D00004505053900004A - 0A0A3A00004A08093C00004301023F00004706053C00004B0A093A00004A0908 - 3A00004302014401004800004D01025101025600025500015400015100004A00 - 004F0406400000530A0C42000057080B4C00005A00026802036E020171000374 - 02027801027C0103800103830003840002840002840001840001820001800001 - 8000018000018400018400018400018400018400018200018200018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00013D01013A00004707073F00005305065100006A03067300047F0004870002 - 8B00028B00018600008001007D02007204006104014F00004F06023C00004609 - 073600003F06073A00013F00043C00004904073C00004806073A00004205033B - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053D - 000039000335000045060841000059080B5700006C050A6E00037800057D0004 - 8200028400018600018600008701018501018200018000018000028000027F00 - 027D00027900047401046800006000005500004B00004300003D00003A02013C - 02034201033E00004A05083D00004D07084000004B02044300004600013F0000 - 4706053900004508063600003E05033601003704023903023E02024200014800 - 014900004900004900004A00024300004C03054200005405084D00005C050963 - 00047800047F00017F00027F00017F00017F00017F0002800002800002800002 - 8200028200028400028400028400028400028400018400018400018200018200 - 018000018000017F00017F00017F00017F00017F000180000180000180000180 - 00018000018000018000018000013E00003F01013F0000460203480000590003 - 6700017901068400048900028900028700018400008001007D02007203015C03 - 004E04004500004303003D00004005033B02013E02034000014200023F000043 - 01023F00004202023D00003E01004000004101013E00004202023E0000420202 - 3F00004000004000014101013E00004202023E00004202023F00004000004100 - 014200013E00004202023E00004001033D00003C00013E00013F00023C000042 - 01033F00004300034200004100013E00004200014600005404055A0002690406 - 7201057B02067E00028200008500008800008900008800018901028703037F00 - 017B00027B00047900047601047201046F02046902055800005200004D000047 - 00004200013D01013A02013900013F0002430204410001470205420000480203 - 4500004700004700004600014100004202023C00003E02023800003502003002 - 013002013301013900014000014400024900024D00034B00014D00014B000052 - 00005300006100026702047406087E0001850000840001820001800001800001 - 8001038001037F00027F00028000028200028400028400028600028600028400 - 018200018200018200018000018000017F00017F00017F00017F00017F00017F - 00018000018000018000018000017F00017F00017F00017F0001460001400000 - 3F03033B00004701015200006E00047F00058900048D00028700028200017F01 - 007D02008001007403015100004200004303003F00004202013E000041010040 - 00004100004000004301023E00004202013C00003F02003E01004000003F0000 - 4301023F00004301023F00004200014100004100004000004301023F00004202 - 023E00003F01014000004300004200004301023E00004002023800003A020137 - 01003C03043A01023F03043E00004500034500004B00054A00004D0000540000 - 5E02016703017004037902037F00028500008900018D00008C00008A00008800 - 008700008502008203027800047100047304086C01046805075B00005400004B - 00004A00004400004502013E00004003013C00003D02003A0100390100380000 - 3C03023A00004202023F00004600024700014700014600004700034100004300 - 033E00004100023A00013503053001033604043800004103034200004C000150 - 00005600005D00006600016E02017503037903027B01017E0000800001820001 - 8200018000018000018000018000018000018000018000018000018000018200 - 0182000182000182000182000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017D00027B0002 - 7B00027B00024600004703043500004108073C00005804066C00008400078D00 - 048F00028600028000017B02007B02008200007602014F00004404033A000047 - 07063A00004706053D00004201004000004504033A0000470706370000440705 - 3A00003F02003F00004404033B00004807063A00004706053F00004201004000 - 004504033B00004707063900004407053A00004101004200004903033B000047 - 07063500004007053300003802013701013E0405380000480508400000530308 - 4C00005700045B00006100006902007203017A02028101028600008A00008D00 - 008F00008D00008900008600008302008102017C020272010571050B62000067 - 060A510000570406460000470101400000420503360000430806370000440705 - 3C00003F02003900003D05043400004307073700004606063F00004400024400 - 004902053F00004A040A3A00004704093C00003D00043700033B060933000042 - 08093A00004D05054A00005600005E0000660000700000790101800201830101 - 8601008500008200018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017F00027D00027F00027D00024900023E0000430A093300004D0A - 094A00007504088100048D00048F00028600028000017B02007B020082000076 - 02015200003B00004A09083A00004B0A093A00004706053F00004302013B0000 - 490908390000480B093700004407053C00004202013B00004A09083A00004B0A - 093A00004706053F00004302013A0000490908370000480B093500004207053C - 00004301023D00004A0809390000460A0A3300004007063800003D0101390000 - 4B070842000059080B4B00005F050A5D00006501006B03007004007704017F04 - 028301018700008800008B00018900018901038602028102037C030179010173 - 01017305096300016A060B5200005B0407450000500606440100420201380000 - 450A08350000480B093900004706053F00004301023A00004A08093900004B09 - 0A3A00004704073F00004201033A000049080A37000048090B3500004206073A - 00003D030437000048090B3A000052090B4500005805045900006501016B0100 - 7402027A02028103028301018401008300008200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018200018600028600028700028600024500 - 004A0607330000460D0C3C00005D090B6700008501088D00048D000286000280 - 00017B02007D02008200007602014F00004807063A00004D0C0B3A00004B0A09 - 3A00004302013F00004807063900004C0C0B370000480B093700004202013F00 - 004807063A00004D0C0B3A00004B0A093A00004202013E000045080637000048 - 0D0B350000460B093500004003013F00004806073900004C0C0C370000480A0A - 3700004202023C00004C04044300005C090B4E0000690B0C5E00006B05066F04 - 017504017A05027D040282030285010186000087000087000185000284020380 - 03057B04057303036E00006A000165000268070B5200005F0609490000520607 - 3F00004605043E0000450806350000480D0B3900004A0A093A00004502014500 - 004E05073E00004F0B0C3C00004B090A3900004001033A000043070833000046 - 0C0D330000440A0B3300004001033D00004B0407420000570A0D470000610A0D - 5700006604046B03047103037804037B03038103028102018401008400008200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018200018900 - 018B00018B00028B00014A01033D0000450C0B3300004C0B0A4A00007305097E - 00038B00048D00028600027F00017B02007D02008200007802015500003C0000 - 4D0A093C00004F0C0B3C00004807063F00004202013900004A0A093900004C0C - 0B3900004707063E00004302013C00004D0A093C00004D0C0B3A00004707063C - 0000400301350000460B09350000480D0B3300004108063A0000420103390000 - 4A090B3900004C0C0C3A00004A07064300004C00014700005E0808520000700B - 0D5F000076090B7301017B04027F040081040082040086020285010186000184 - 00018200028001037B03047704076F04066802036000005D00005E0004500000 - 5E070A49000055090A4000004906053E0000400301350000460B093500004C0C - 0B3900004807064300004C000245000054070A4000004F0B0C39000045070738 - 00003B0302300000410B0A300000450D0C3300004108073F00004B00004A0000 - 5D060A4E00006A0C10590000700B0D6B03047204067604047A04037D03037F04 - 0281020182000082000080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018200018900018B00008B00018B000045000049050633000044 - 0B0A3A00005A07096700008201088900048B00028400027F00017B02007D0200 - 8200007802015100004B05053E00004D0A093C00004C09083B00004302013E00 - 004606053900004A0A093900004909083A00004302014100004906053C00004D - 0A093A00004909083800003E03013A0000420705350000460B09330000430A08 - 3400003E02023C00004604093900004B080B3C00004E08094300004E00015200 - 00600605570000700B096400007C0A0A73000081050582040085020085020085 - 02008701018501018301028101027D00027901057103056A03066302045C0104 - 5500015100004E0000560305450000560A0B4000004C09083A00003F02003A00 - 00420705350000480B093900004909083B00004701014A000054030643000051 - 080A3C00004709093400003B03023500003B0806300000430B0A350000470909 - 3A00004B00025200006400055800006F090E5E0000750C0F6D000278070A7604 - 047902037A02027C02027E030180020181020181020180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000182000186000086000087000086 - 00004B00024000004007063200004606054A00006E03067C0004870004890002 - 8200027D01017B02007D02008200007802015600004300004D05053E00004A07 - 063D00004504034000004101003C00004407053700004707063A000044040340 - 00004401004100004906053C00004807063A00004205033B00003D0200360000 - 4007053300004308063600004005033B00003F00023C00004704093C00004E05 - 074400005401035400006305066400007408076C00007E080777000085060584 - 01008700008701008700008700008600008200008001027C0103770205700305 - 6702045F01055700034E00024A00014700004A00004500004D05053F00004B08 - 073B00004306043B00003D02003800004407053700004707063A000045040344 - 00004B00014800004F03073C00004707073600003D0504360000380300330000 - 4007053700004A07064100004D03035000006801066A00007405096B00007908 - 0C7000007C070A7901057901027901027B01017D01017F00017F000180020181 - 0201800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00017F01007D02007F01007D02004900004501023900003B03023D0000510102 - 6700017C00068700048900028200027D01017B02007D02008200007901015700 - 004A00004700004901014300004502014000004000004000004101003C000040 - 03013E00004202013F00004100004300004600004100004302013F0000400301 - 3D00003C01003A01003B02003800003E03013A00004003013D00004000004100 - 014400044300014B00034A00005300015600005C00006C06077406067602017E - 05037D00008403008500008902008901008800008800008500008100007F0001 - 7A02037603067104066803055D02055400044C00024600024100014000014400 - 014701014100004302013E00004104023D02004005033C01003D02003C000040 - 03013E00004202014000004300004700014800024100004201033A00003C0302 - 3600003701003902003D02003F00004901014A00005300005400005E00007403 - 077D03097900057D04087800037D02067A00037B00027D00027C00017C00007C - 00007E00007F0001800201810302800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017B0200790200790200790200490000430000 - 3E05043800004205034D00006902057A00068600048700028000027D01017B02 - 007D02008400007B01015F02034E00014C00014600004701014100004302013F - 00004000003D00004003013C00004202013E0000420100410000430000440000 - 4502013F00004302013C00003F02003C01003D02003B00003F04023D00004404 - 034000004403024400014801044900034900004C00005300005C00026502046D - 05066F01037500017A00008001008400008702008A01008A0200890000860000 - 8500008100007F00017A02027503036F04065E00005600005200014700004500 - 033E00013D00043C00014000004000004202013C00004003013A00003D02003C - 01003C01003B00004003013C00004202013E00004201004100004100023D0000 - 3F03043900003D05043800003C05023B02004303024701014B00005100005900 - 006100006A01047403067B000480000480000480000480000480000280000280 - 00027F00027F00017F00017F00017F00017F00017F00017F0001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017F04027D0402 - 7C03017B02004800004804053600004109083800005406076300007A02078400 - 048600027F00027B01017902007D02008400007B010161000255050646000050 - 04054000004906053D00004101003D0000420503380000450806390000460605 - 3D00004401004400004903033D00004807063900004407053800003D02003B00 - 004205033B00004807063D00004C06064400004B01014B00004E000052000158 - 00025F00046601036D02047303037700017A00007E0000820000860100880100 - 8A02008801008400008100008101027F03037903027202026901026300025600 - 005401034400004A06073900004205093500003A01023B000042050338000045 - 08063500004207053800003D02003B0000400503380000450806390000460605 - 3D00004101013900003B05053400004007083300004108073B00004302014600 - 004E00005800006100006A00017000027601047C010382000484000284000484 - 00028400028200028200028200028200018000018000017F00017F00017F0001 - 7F00017F00018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017D00007E00007F00018002014C0002400000440B0A320000490C - 0A4400006B06087400038200048400027F00027B01017902007D02008400007D - 01016603054F00005707084500005309093E00004706053E0000400301360000 - 450A083700004A0A093900004706054100004701013F00004C09083A00004A0A - 093700004207053A00004104023B00004A09083E00005309094300005404054E - 00004F00005400005C00026302046B04077104067502057901027C00017E0000 - 8200008400008401008601008702008502007D00007901017A03047404047004 - 036701025C00005500005200014400004E0809390000460A0B3300003F060937 - 00003E0202360000450A08350000460B093500004407053C0000400301380000 - 4909083900004A0A093900004706053C00003A04042E00003E0A0A300000440B - 0A3900004B05054800004D00005800006400006F01037803067D020480010382 - 0001860002860001860002860001860001840001840001820001820001800001 - 8000018000018000018000017F00017F00018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018200018300008500008500018500004800 - 004D0708330000440E0D350000550B0B5C00007802078000048200027D000279 - 01017902007D02008400007D01016400015E070A490000580A0B420000500A0A - 3B00004104023C0000430806350000480D0B3900004A0A093C00004502014300 - 004A07063A00004C0C0B390000480B093500004003013E00004807063E000055 - 0B0B4500005B080A4D00005A00025A00006000006701026E0305750407780304 - 7C01037F00018000018200018400008200008201008201008002007D02007601 - 027103056D02046902056100025A00005100004A00004700004A07063A00004A - 0C0C350000440A0B3200003C02033A0000430806350000480D0B370000480B09 - 3700004003013C00004508063900004C0C0B3900004A0A093A00004002023300 - 003A080A300000460C0D39000052090B4800005800025C000065000070000279 - 0203800305820203830102840001860001860001860001840001860001840001 - 8400018400018200018200018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018200018400 - 028400028500038300014D00033F0000460D0C300000480D0B42000068050770 - 00017F00048200027D00027901017902007B02008400007D0101690406530000 - 5D090B470000560C0C3E00004908073C0000400301350000460B093500004C0C - 0B3900004A07064100004502013C00004B0A093900004C0C0B3700004508063C - 00004403023F0000540A0A4700005F0B0D4E00006204085E00006802036C0201 - 7002027402027901027D01018000018400018400018400008400008001007F01 - 007D02007B02007602016D05066403055F01025A00025100004E000048000045 - 0000430102390000480A0A350000480C0C3500004307073A0000400301370000 - 480B093700004C0C0B3900004707063E00004202013900004A0A093900004C0C - 0B3900004707063C00003C0304310000470B0C3A0000570C0E4A000062040861 - 00006E00047300037900047D00027F0002800001800001820000820000840000 - 8400008200008400008200008200018200018200018200018200018200018200 - 0182000182000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000017F00027A00017900027C00047C01054900004C060733000041 - 0B0A3500005008085900007300047F00048000027B00027901017803007B0200 - 8400007D010166000260070A4A000059090A430000500A0A3D00004104023A00 - 00420705350000460B093900004909083D00004502014100004906053A00004A - 0A09390000470A083800004202014100004D05054500005D090B50000067080C - 5E00006B02057305057605027802017900007D00008000008500008700018701 - 018701018200008001007B02007902007502006E02016204055902065300024D - 00004700004300004100004202023C0000420606350000460A0A350000470909 - 3A00004202023C00004407053900004A0A093900004909083A00004202013E00 - 004606053900004A0A093900004909083A00004002023A00004205093A000055 - 090D4A000067070D6300007201057B03087D02067F00027D00007D00007D0000 - 7C01007F01008001008001008001008001008200008200008200018200018200 - 0182000182000182000182000182000182000182000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017B00027100046C01046D00056A - 00024C00024200004108073000004007054100006201036D00007D0004800002 - 7B00027901017803007B02008400007F00016C03065800005B04074800005206 - 074400004706053E01003D02003600004207053500004707063A000047040342 - 00004401003F0000470605390000470706380000440403400000450000450000 - 5505064F000065070B5F000070060C6F01057703027903007C01007E00008200 - 008400008800008900008800018701018301027F000179010175010071020068 - 03015600034E00034A00014600004100003F00003D01023C02033B0201360000 - 4207053500004508063A00004504034000004101003C00004706053A00004807 - 063B00004504034000004201003D00004706053A00004707063A00004205033D - 00004000013F00005004084C000065070C62000177050C7900057E0006800004 - 7F00017E00007B00007700007702007902007D02007F02007F01007F01008001 - 0080010080010080010080000180000182000182000182000182000182000282 - 0002800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000178 - 01026201035602045600035200004A00004802033B00003B0401380000460100 - 5A00006C00017900047F00027D01017B01017B02007D02008200007D01016F01 - 036502045900005400024800004805043F02003C03013A01003B02003A000040 - 02023E00004301024000004100004000004101013E00004202013F0000430201 - 4400004900004C00005200005600006201036500017204087302067A05087800 - 007B00007F01008100008601008700008900008700018700028101027C010376 - 01026F03026802036503035C04044800004400004200004100004100023F0101 - 3D01023C00003C00003D01013C00004202013F00004502014400004300003E01 - 003D02003C00004202013F000043020142000045000045000044010043000045 - 02014100004303003F00004300004A000052000156000062010567000375030A - 7901068103097C00017E00007F00007F00007D02007902007803007902007D02 - 007F01007F01007F01007F01007F010080010080010080000180000182000182 - 0001820001820001820002820002820001800001800001800001800001800001 - 8000018000018000017F00018000018000018000018000018000018001007F01 - 007F01007F01008001008001008001008000018000017F00017F00017D01017D - 00027B00027901027901026F02044F00004600004800014A01034B0002450000 - 4303023C00004104024400005401005F00007302057D02048202038301027E00 - 007C01007C03017C04047800037502056B04075100004600003A000039060333 - 03003701003900004201033F00004300033F00004100043C0003380000360000 - 3E04054000004802024600005000005500006605026B04027002027402027900 - 047B00047F00047F000481020382030284020285010186000086000085000081 - 000183030879010672040A6200035902054B00004800013F00004100003F0000 - 4202023E00004202023F00004200014100004300004200004502014300004701 - 014300004800004100003901003500003C04033B00004404044300004802024A - 00004900004A00004B00004A00004700004400004200004A0000680404720104 - 7401047402027801027901027B00027B00027D00027F00017F00017F00017F00 - 017F00017D01017F00017F000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001820001820002820002 - 8200018200018000018000017F00017F00017F01007D02007F01007F01007F01 - 007F01007F01007F02007E04007C04007D03007F03008002007F01007F00007E - 00007D01017B00027D06077502057305076800006300005600004D0003430003 - 4100013E00004700004A04053C00004707063900004906034B00005C00006F03 - 027B03048202038500028200007C01007904017A04037C000081060A6700005E - 04033E00004008033101003405013401003E05043A00004A040A3C0000470409 - 3C00003D00053600023C06063800004806074300005603015600006502006F04 - 017602017901017F000180000282000284000484000282020381020182000081 - 000083000083000182000480000578000774060C5F00015F080C460000480508 - 3600003900013B00004205033800004707063A00004706053F00004600004400 - 004903033F00004C06063E00004B05054100004201003A00003D050435000044 - 08083800004707073E00004701014902004A00004900004A00004D0000500000 - 5201005D00007601027F00017F00017D01017D01017D01017D01017D01017D01 - 017D01017F00017F000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200028400028200018200018000018000017F00017F00017F01 - 007F01007F01007F01007F01007F01008002007F02008004008004007F030080 - 02008002008002007F01007D01017901027B06076A00007008095C0000620405 - 5400005200024000003D00003F00004302044903043F0000490909370000480B - 093C00005306045700006C02017902038102038301028001007E00007A03017B - 0303800103760000770A0C5000005208063500003C0906320200390302340000 - 49080A3A00004D070D3A000046030A3C00024003073B00004E0A0B4200005A08 - 075000006908056B02007403017902007D010180000182000284000286000284 - 00028101027F01007E00007D00007E00017F00027F01067B0307720007610000 - 66080D4A000055090D3A00004005093800004002023A00004909083900004B0A - 093A00004706054100004502013D00004C09083C00004D0A093C000047060541 - 00004701024000004C0809390000460B093300003E0704370000400300410100 - 4700004E00005600006000006901027202027B00028000018000017F00017F00 - 017F00017F00017F00017F00017F00017F00017F000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018200018200018200018000 - 0180000180000180000180000180000180010080010080010080010082000082 - 01008402008601008702008502008302008102017E03017A0202780606690000 - 6E070A5500006106094A00005703074B00014702054201034000013D00004000 - 004907083700004A0C0C3700004C0B0A4500005901016701027402027E010381 - 01028000017E00007B02007D04027D00008207096400006A0D0C4300004A0B07 - 3300003B06033700004307073900004D0A0D3C00004B080D3900004200054100 - 00500709450000610E0D5200006D0C096600007807047902007D020080000182 - 00018400028400028600028200027F00017B02007B0101790101790102760102 - 7300036E00046100006304084C00005A0B0E4000004B0A0C3600003F03043C00 - 004707063900004C0C0B3A00004B0A093A00004202013E00004707063900004C - 0C0B3900004A0A093700004302014900005304074200004E0A0B370000430A08 - 3200003B04013C02004200004C00005700006400006F00017900047F02048000 - 018000018000018000018000017F00018000017F00018000017F00017F00017F - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0182000182000182000180000180000180000180000182000182000182000082 - 00008400008400008400008600008900008900008800018701018301017E0202 - 7903027303036A00016A07095200005E070A4700005306094100004903043E00 - 003E0000400001430204440404390000470B0B3500004A0D0B3A000051070552 - 00006400006E00007A02038001028000018000017F0100800201830205760000 - 7A0C0C5600005F0E0B3E00004508063A01003C03023500004A090B3A00004D0A - 0F3A000047050A4100014C00004C0000650C0F56000075100E6400007B0A0877 - 00007F01008201008400008400008600018600018400028200027A0000780201 - 7803047604047103056B00026200005C00005A00024B000057080B4200004F0A - 0D39000045050A3C00004202023A00004B0A093A00004C0C0B3900004707063C - 0000400301370000460B09350000480D0B3500004308063E00004E0104480000 - 5408093E00004C0B0A3900004508043F00004300004C00005A00006501017201 - 047B000483000384000282000182000182000182000182000180000182000180 - 00018200018000018000018000018000018000017F00017F0001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000182000182000182000182 - 00018400018400018400018400018600018600018600018700018C00018C0001 - 8700018400017F00017700016F01036801045E00014E000059090A420000510B - 0C3A00004605073B00004302044201034000013D00003C000043070733000044 - 0B0A3500004A09084500005502015F00006A00017601027F0204810102820001 - 8001008101028100008205076A0000720E0C4D00005208043D00004306043C00 - 004406063900004B080B3A00004A070C3A00004900034E00006204055D000078 - 10116800007F0C09740000810201840100860100860000860000840001840001 - 8200027F00027700017402027103036E04036703035D00005400004D00004A00 - 004F05053E00004D090A3A000049080A3B00004302043F00004706053A00004B - 0A09390000470A083800003E03013A0000400705330000440B09330000430A08 - 3400004003014500005005074200005008084200005309094900005604035500 - 005E00006901027302057B020681010684000282000084000182000182000182 - 0001820001820001820001820001820001820001820001800001800001800001 - 7F00017F00018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000017F00017F000180000180 - 0001820001820001840001840001840001840001860001860001860001860001 - 8600028700028800038700038200027C00037400026C00016400015A00004C00 - 004E04043E00004C0C0C37000045090A3300003A00013A00003E000040000143 - 02043D03043700003F06073300004307073B00004C04044E00005B0000660001 - 7202027B03048001028200018400018400018503047800007B0607650000660A - 094A00004C02004502004101003C00004606063900004706083A000045020748 - 00005A00006200007407096C00007F0908770000830403820000870000870000 - 8600008400008200018000017F00027B00027301016B00026600015F00005900 - 005200004C00004600004502013D00004707073800004706083B000044030540 - 00004200013F00004706053A00004707063800004005033900003B0200350000 - 3F08053200004009063300003E05033900003F04023D00004906054200005906 - 055600006A05076D00037100017600027B00047E00058102048001037E00017D - 0000820001820001820001820001840001840001840001840001840001820001 - 8200018200018000018000017F00017F00018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00017F00017D01017F0001800001820001820001840001840001860002860002 - 8600028600028400028400028400048200048101067A01057601046E00036500 - 015C00005300004C00004500003B000042060734000041080B3400003C030638 - 00014304064302044100023D00003A01023C03043800003D03043A0000430303 - 4500004E00015400006000006D02047604047C01038000018400018600018301 - 027D01017500007307066400005800004B00004B04014300004101003E000042 - 02023E00004201034000024A00015E00006D00026E0000790302760000800100 - 8200008702008700008700008400008200017F00017D00027901027601046C01 - 036501015D00005300004E00004900004502014404033D02003D040239000040 - 04043D00004302044000004200014300004401003F00004202013E00003E0301 - 3B00003A01003902003A03003800003C03013800003E03013B00003C01003B02 - 004003014300005000015800006A01047400037F010784000687000587000584 - 00027F00017E00017C00017D00027F0001800001800001820001820001840001 - 8600018600018400018400018400018200018200018000017F00017F00018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017F00017D01017F00017F0001800001820001 - 8400018400018400028400028400028200028200048000047F00047900047203 - 076A03066502045E00045500014E00004500003E00003B00003A020136000039 - 03033400003B02053900033C01053B00003E0000400001430204370003380002 - 3B02033800003E02023E00004401004900005100005A00006301016F03027902 - 038001038500008400008200017F00017A02027403016B010061000054000049 - 00004901014100004303033C00004302043F00004401044B00016502046F0103 - 7200007600007B00007F00008401008601008802028300008202037B00007C04 - 057601047605087005086000005800005700014E00004C00014100003F02003A - 01003901003600003B03023800003E02033E0000420002430000430000420000 - 4302013E00004202013A00003D02003A01003B02003A01004005033E01004205 - 033F00004201004000004101004300004B00005800006500027200037C000384 - 00048A00058C00058C00038700028400027F00007C00007A00008004047F0303 - 8001028000018200018400018700028700028600018400018400018200018200 - 018000017F00017F000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017E00007C0100 - 7E00007F00018000018101028300038300038300057E00028100057B00007C00 - 067700037B03087203075A00004F00004E00014700004701023F00003F010139 - 00003C03043802023B05053500003B02033700003B0002390000430204420103 - 4000013D00003600023D04073400004307083700004606063F00004800004B00 - 005300005E02016802037503037D00028500008600008200017F00017E020279 - 03027101016700005B00005000004A00004805043B0000450707390000460507 - 3E00004D00036201036D00027000027500017B01017F01008200008200008200 - 008505067500007C07086A000072070A6500016504085800005700034A000051 - 05063E00004606053600003A03003600003B0504310000400807350000460507 - 3D00004400014200004504033B00004707063700004407053800003D02003C01 - 004306043B00004908073F00004D05054600004C00015101005401005B010163 - 00026D00037600057D0004850005870004890002880001860001830000810000 - 7F00007C00007B03037A02027C02027D01018000018200018500028700028600 - 018600018600018400018400018200018000017F000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017E00007C01007E00007F00018000018101028100038100037D00 - 0281030876000080080D6E000075060A6A00006302064900004504033A000045 - 07073500003F06053400003901003700003D0405340000410708350000440507 - 3C00004100023B00003D00003F00004302043B020533000045080C3700004A09 - 0B3A00004705064100004800004E01005702006303037002027B000284000286 - 00008100008001008001027E02027801027000006500005A0000500301410000 - 490908350000480A0A3900004806074A00005C00006500006B00027202027702 - 037A02027E02027D01017F05057400007C0A0A6300006F0A0C57000060040954 - 00015200024600005207093E00004B090A370000400706370000390302310000 - 420A09330000480A0A3900004705064100004302013B00004A0908390000480B - 093700004407053C00004303023E00004E08084200005608094900005A030659 - 00006702046C01046E00047001057201047502057901057A01057B00007D0000 - 8100018100008300008500008500008100007802017203017602017901017D01 - 0180000183010287000286000186000186000184000184000182000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000017E00007E00008001008001008000 - 018000018001037E01037C01057200007E0A0F660000730C115B00006203074F - 0000430303320000400A09320000420A093300004004043800003F0000390000 - 4806073A00004D090A3E00004D07084500014502054201034000013D00003700 - 0141060A3700004C0A0F3A00004B080B3A00004301024300004800005202015D - 03026C01037901028400028600018100008001008200018101027E0103780102 - 6E01036303034F00004F0805390000480D0B3700004B0B0B3C00004D02045400 - 005D00006601036C040571040674040477020376010273010177090B5F00006E - 0B0D5000005C070B4500004C00034700004E05073E00004D0B0C390000460A0A - 3300003C0302370000410807330000480C0C3900004B090A3A00004301023F00 - 004707063900004C0C0B370000480B093700004202014200004E06064500005C - 090B4E000066070B5800006900057701067C00067A00067A0006790105780004 - 7601047800047800017800017C00007E00008000018400018600018000016F00 - 006B02006F02007403017901017D010180000184000186000187000186000186 - 0001860001840001820001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018001 - 008001008001008001008000017F00017D00027901027500037A090D61000071 - 0D125200005F080C4900004800013800003A0907300000450D0C350000490909 - 3C0000460001460000500306430000560A0B430000540A0A4500004B02043E00 - 003E00004000014302043C00063500004A080D3A00004F0A0D3C00004806073E - 00004000004201004B01005702006701027601048200028700028100007F0000 - 8400008501018301027E02027303036905055502014200004B0B0A350000480C - 0C3700004B07084600004D00005200005B01016104036905056C04056F02046E - 01036F0406610000690A0E4C000058080D4000004603083B00004300033A0000 - 4A090B3900004A0B0D3700004307083A0000400103370000480A0A3900004C0C - 0C3A00004806073F0000420201370000480B093700004A0D0B37000047070641 - 00004A02024600005C080A5200006C080D5D000074040B7100027F0005820004 - 8000048000047E00037C00037A00017A00017901027901027901017A02027C03 - 017C03017E03017904016800006401006902006F02007602017A02027F000182 - 0001860001860001870001860001860001840001820001820001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018001008002008001008001007F00017D01017B000276 - 010475060A6500006B0A0E4E00005A090C4200004A05083C00003C0403320000 - 460B09390000530B0B4300005704065100005D020554000062090C4C00005D0A - 0C4700005204054600004602034201034000013D00003A000242040A3A00004D - 070D3E00004E070A3B00004002023C01003E0100470200510100630101730003 - 8100038700037F00007F00008300008600008600018101027902036C05035300 - 00500604390000460B093500004709093F00004B02044800004B000051010258 - 02025F02036202026501016501016100006305094D000057070C3E000046060C - 3200003A000538000142060735000048090B37000047080A3A00004201033F00 - 004704073A00004B090A3A00004A08093B00004202023C000044070537000048 - 0B093700004909083B00004701014800005703055300006F090E6300007B070E - 7200007E00067E00048100038100038300038300038300038400008200008300 - 038001037C02027802017403006F03006E03006804005C00005E00006401006C - 03007203017903027D0101800001840001860001870001870001860001860001 - 8400018200018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180010083010183020082000080 - 01007F00017D01017800037300036C01046A07094E00005405083E0000450608 - 3400003E05063A00004606053C000055090A4A000063080B5A00006600056700 - 056E070A5C0000690B0C4E00005A07064700004900003F00003E000040000143 - 02043F00053A00004903093E00004E040A3F00004503043D00003900003A0100 - 4202004F02006101017100038000058601047F00007F00008500008600008600 - 008200017901026E040358010046000046070333000043080639000048040545 - 00004300004600004A00005000005500005A00005D00005D00005B0003510000 - 5504073E000045050B31000036030A3200063801043500004005093500004505 - 0A3A00004502054200004600024100004905063C00004806073B00004404043F - 00003F02003800004207053500004508063A00004704034600004E0000520000 - 67060A6600007D091077000385020C7D00037800047800037E00038300038A00 - 018E00019400029400029100028900018200017600006802005E030056030054 - 03005200005800006002006804006F04017504027B0101800001840001860001 - 8700018700018600018600018400018200018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 01008301018302008301018001007F00017C00007700036F0103660002570000 - 5603054000004203053000003706083602024000004500005505065100006706 - 0863000073040872000378040970000373080B5F00006408074F000052030047 - 00004804054302044100023D0000400003410004410000470003430000470003 - 4000003E00003900003C01004101004C01005901016802037501067D02067C00 - 007F00008200008500008700008500007C00017202025F000054010048000044 - 04003E00004303024100004301023F01014101014300004700004C0000510000 - 5500015500015100005000024700004300033A00013802073300073503073900 - 033D01023A00014001033E000143000344000045000147000146000243000045 - 01024100004301024000003E00003C00003B02003A00004003013F0000470101 - 49000050000055000061000069000177060A7A020783050B8000058100067C00 - 037C00017F00018600028900028E00039000038E000389000281000176000068 - 01005C01004F01004501004501004A00005100005D00006902007403017C0202 - 8000018300008400018400018400018400018400018400018600018400017F00 - 027B00027D00027D00027F00027F000180000180000182000182000182000180 - 00018000018001008000018001008301018301018001027B01017601026F0101 - 6802036104035200004C00004400004301023900003B02033501013C02034700 - 005400005900006700036B00007702057800047B02067E03077D040877000374 - 03066400005F03025100004B01014000003E0000400001430204410000400000 - 4301023F00004301023F00004101004000004101004000004603024500005000 - 015000005D02056803057801027F00008300008400008500008500008300017C - 00017705056C05035F03025201004900004000003C00003900003B0203390001 - 3F03043C00004601044400004C01034B00014900004600004701023F00003E02 - 0337000038020239000140000142000045000341000047000343000046000245 - 00014600024400004700034100004500054100004400043D00003D0504390302 - 3B00004000004800005200005F01026902057001057401047800047900047B00 - 027B00027B00027F00028600018800008600008500008200018001037A020374 - 03066D04076201035C03064D00004901013F00004002023F01014502014E0100 - 5D00006D00018000028B00038E00028D00008700008200007F01007D02007F00 - 018200018700028400027800047201057401047800047B00047D000280000282 - 00028702048601038501018200007F00007E00007D00007E00008202037F0002 - 7901056A00006202025000004A00003E00003A01003A03003A03003B02003E00 - 003F00004200004800005C04046802037101017901027F00018001027C02027C - 02027D01017E00008300018000047901056A0104540002460000440104420103 - 4000013D00004200004504033B00004707063900004606053C00004101004000 - 004605043E00004C06064200005105064B000060060675030380000182000183 - 00008600008600008500018100017F02047601026901025D0100520100470000 - 3F01003800003900013E050834000043060A3700004704094000004601044200 - 004702053B00004707073700004206063600003D01014200004B02043F00004C - 06073E00004B05063F00004400024200004702053D00004A040A3C0000480208 - 3E00004100013C03023D01014100004900005400006000016C01047702057B00 - 047D00027F00027F00027D01017B01017901017F00018700008C000088000184 - 02027C02027402026901026101015B02055808094600004B0708370000420607 - 3700003D03043E02034901015B00016D00018400049100039300028F00008700 - 008001007902007803007D010180000187000286000478000572010574000578 - 00057B00047F00048200028400028500028500028400018200007F01007D0200 - 7D02007B02007700027703086500006507084C00004C07043800003503003405 - 013404003601003A00004200004A00005200025A00026503036F01017A000082 - 00018600008301017E03017C03017D02008100008800018700028000066E0004 - 5600034600003C00003D00003F00004302044302013B00004A09083900004A0A - 093700004407053C00004202013C00004D0A093E000051090942000053070859 - 01017103037E02028001028200018600028500018500018300017F0002780102 - 6E02016403005902004E010047000040000042040438000045090A3700004A09 - 0B3900004805084100014300033A0000490909370000480A0A3500004206063A - 00004202023B00004A08093A00004A0A0A3900004605073E00004401043C0000 - 4A070A3A00004C070A3C00004902054100004600014A00004F00005800026300 - 046C01047701067E03078000048200028200028200018000017F00017B02007D - 02008200008400008202037D03037702036D0100620000590000570305490000 - 51080A3C000049080A35000043060A3A00013C02034201005500016800017F00 - 048B00038E00028B00008400007D02007803007603007B01017F000186000286 - 00027F00047B00047D00047F0004800004820004840002840002830001810000 - 8000018001027C02027A03017903027203016B00035C000065070B4A00005509 - 0A3C00004407053800003C04003C02003F00004700004F000057000060010568 - 03056A02037101017D01018400018600008400007E03017C03017D0200810000 - 8600018600027E00066C01045400034400004502054201034000013D00003F00 - 004707063900004A0D0B370000480B093700004003013B00004808073A000050 - 0D0C3E00005109094500005805046E04037903027C0202800102830003840002 - 8500018300017F00017B00027402026B04026202025902005201004A00004400 - 004906093A00004C0B0D3900004B0A0C3900004203053C000045060835000048 - 0C0C370000480A0A3700004002023C00004507073700004A0C0C350000460A0A - 3500004001033C00004706083A00004F0A0D3E00004E070A4000004B00015300 - 015A00006100046700037001057901057E000584010484000286000286000184 - 00018200017F00017D02007B02007D02007C03017802017403016C0000640000 - 5A00005300004F00005105064000004E0A0B39000048090B3800003E04053802 - 023F02005000016200007800048500028800028600008200007B020078030076 - 03007901017D0101840002860002840002840002840004840004860004860004 - 8600028400027F00017F00027C01037A02027702037203016F01016702005500 - 00570406450000550B0B3E00004B0A093900004303024300004600004E000055 - 00005F00006600016F02047204066F03027402027F0001860001870000840000 - 7D02007B02007D02007F00008600018600027E00066C01045400034400003E00 - 003E00004000014302044202013900004A0A093700004A0D0B3500004308063A - 00003E03013800004C0C0B3A00004F0C0B3E00004D07074F0000670303710101 - 7601027A02037E01038000028400028300018100017F00027A02037303036D03 - 026602005E010057000052020344000052090B3E00004D0B0C37000044080839 - 00003B0302320000440B0A330000480C0C3700004707073E00003E0202350000 - 440B0A330000460D0C3300004108073A00004103033900004D090A3E0000530A - 0C4300005304075100006601036E01037201057702057E000581000386000286 - 00018900028900018700018600018200007F01007D02007902007605036F0401 - 6A00006400005E00005900005200005000004C00014000004E08093C00004B0A - 0C39000047050A3B00003602023B02004A00005D01007100037E020284000183 - 00008001007B02007803007603007901017D01018200028600028B00028B0001 - 8B00028B00028900028700028400028000027F02047902037503037002026B00 - 026601006100005900004A00013900004909093900004C0C0C3A00004C060647 - 00004C00005300005D00006601007002047801027C01037B0002760102780102 - 8200018700018700008600007D02007B02007D02007F00008600018400027C00 - 066A01045300034200004401044201034000013D00003E000046060537000048 - 0B09350000450A083600003E03013900004207053700004B0B0A3A00004B0807 - 3E00005003015D00006700006D01007202027902037E01038000028100018500 - 038100038001037A02037601026F01016B010066020257000058030747000053 - 080A3C00004909093600003D05043500003D0706300000440B0A350000490909 - 3B00004202023C0000400706330000430B0A320000420A093400003E02023C00 - 004705063E000054090B4700005C080C5100006201057401047C010380000581 - 00038500038700028800018A00018900018700018600018200017F01007B0200 - 7902007403006905016203005C00005600005100004E00004C00004B01004400 - 004A04043C00004B090A3A000049080A3B00003E02033802013902004800005B - 01006E01037901018000018100008001007D02007902007902007B01017D0101 - 8200028700028D00019000018F00018D00018900028400028000027B00027904 - 057103036A02036301015D00005800005600004D00003A00003B050533000045 - 09093900004E08094500005401005900006200006D01007503037D0204820203 - 8400017E00007A02037A02038400018900018900008600007C01007801007B02 - 007E00008500018400027C00066A01045300034200003D00003E000040000143 - 02044101003C00004407053700004308063600003E05033900003A0100380000 - 4409073900004707063A00004403024800005200005B00006400006C01037302 - 057A01057F00028200028601048601048301028000017D010179010178020171 - 03036300005600005B02054700004E06063C0000410604370200360301310000 - 3D07063200004506083A00004702054000004100023800004206073300004108 - 073400004004043D00004000004100005105064C000060070A59000067060A6B - 00037D00028600018600028700018900018900018A00028A0002870001840001 - 8000017D01017902007603007403006B04015C01005300005000004D00004800 - 004800004600004502014302013E00004806073B00004906093C00004502053C - 00003901003A01004800005801006C0103790101800001820000820000800100 - 7D02007D02007F00018000018200028700028F00019000008D00008900008600 - 017F00017901027202026E03056503035D00015400004F00004A00004A000043 - 01023900013000003E05063700004A06074400005501035900006600016E0002 - 7801027E02028202038501018600008200007E02027E01038800028B00018B00 - 008500007C01007801007B02007E00008500018200027A00066A010453000342 - 00004603064302044100023D00004000004101003E00004003013A00003E0301 - 3900003A01003800003C03013C01004005033B00004101003F00004500004B00 - 005200005C00006402026D02047502057B000280000287020586010487000283 - 00008100008000018102037C04056900006300005900005600024A0000480202 - 3E01003B04013701003603013500003B03023C00004300034200004300014100 - 014100023E00004001033A00003E02023D00004000004100004A00004F00005D - 02056100026C03066F01077A0207820000870000870000880000890001880002 - 8801038702048000017D01017901017602017003016D05006B04016406014E00 - 0048000048000047000044010042020041010040000041010043030240000045 - 03044000004401044100004000013A01003E01004A00005A00006B0002780201 - 7F00008200008400008400008200008200008200018200018400028600018B00 - 018B00008700008400007D01017802017002026904026205045803014F000047 - 00004200004000004202024004043800003A01043C0000450003480000530001 - 5900006200007403067902037E02028001008300008500008500008400007E02 - 028001038A00028D00018D00008600007E00007801007B02007E000083000182 - 00027A00066A01045300034400003E00003E0000400001430204430201400000 - 4303023C00003F04023B00003D04023B02003A01003900003E03013A00004003 - 013C00004101004300004A00004B00005300005500006501016B00007A050681 - 04068100038500038700028600018600008500008300007F00007B0307700305 - 6700035C00005100004900004100003D00003B04013702003C04033800004102 - 044000004601044600024500014400004500033F00004202023E000042010043 - 00004900004F00005800006300026B00037401047900057F0004870002890001 - 8900018700018500008100007D00007800007C05067303037206056500006403 - 005900005A00004F00004900004000004302013E00004202013C00003D02003C - 01003C00003D00004202023F00004300034100004600024100014002023F0000 - 4C00005500006C01037500008000018300008800018800018800018600008600 - 018300008300018300008500028301018405067A02027606066700005F000053 - 00005200004A00004701013E00004002023900003B02013B00003D0000410000 - 4900015000035A00056302066C03067403077800047B00027F00018001008200 - 008201008201008002007D01018000028900018D00018D00008700007F010079 - 02007C03017F0100830001820002790005690003540003450000440104420103 - 4000013D00004300004605043C00004707063700004207053900003D04023900 - 003E05033600004308063700004407053C00004201004200004B040144000058 - 05045500006D07086D00017D06077E0103830102870002870000870000860000 - 8600008300007D02047601046D00026400005B00005000004800004100003E01 - 004106043500004307073700004704074000004801044800004D01054100004C - 05083C00004705063F00004600004A00005200005D00016701027201047B0004 - 8000048400028700028600008400008200007E00007A00007802017303036D03 - 026E09075D0000630A064F00005805034A00004A000042000042050338000043 - 08063500004207053600003B02003B00004004043A00004707073C0000490407 - 4100004400024100004603024500005E04036100007C08077C00008701018900 - 008B00008800008800008500008300008100017F00017C00007D070670000077 - 0B0A6000006308044F00004D00004500004603003B0000440907340000400706 - 3500004000004900005000005500035D00046600056D02057501067A02067D00 - 027F00027F00018001007F01007F02007D02007D02007D01018000028B00018F - 00018D00008700007F01007902007C03017F01008500018400027B00056B0003 - 5600034700003C00003D00003F00004302044903033F00004C09083A00004A0A - 093700004308063C01003E0301360000450A08350000480B093700004606053E - 00004202013B00004D0707450000600A0A59000071090A7202027A0203800102 - 8200018600008600008601008600008300007F00017901027500016D01006400 - 005B00005000004900004903033D00004909093700004A090B39000048050A43 - 00034C000546000052060A4000004D090A3C0000490605430000490000530000 - 6100026D02047702058001038700038700028600028300017E00007B00007700 - 007402026F05046B07076205045700005E0B09470000560B094000004D060341 - 0000420201380000470909350000460A0A3300004007063800003E0202360000 - 4909093900004D090A3C00004B05064300004501023F0000560607500000700A - 0B6A00008408088300008700008900008A00008800008500008100007E000178 - 00017404046500006F0B09550000630C0A480000500604410000410100370000 - 470A083500004A0D0B3700004505044300005A00026200036600056B00057100 - 067600057A00067E00057F00027F00027F00017F01007D02007B030079030079 - 02007D01018000028B00018F00018D00008600007D02007803007A03017F0100 - 8500018600027F00056F00045B00044A00014702054201034000013D00004600 - 004D07073E00004F0C0B3A00004B0B0A3900004005033A000043080635000048 - 0D0B370000480B093900004003013900004308063A0000540C0C490000650B0B - 5F00007105047601027B01018001008200008401008401008601008401007F00 - 007D01017901027402026D00026400005B00005100004B00004F07073C00004D - 0B0C3900004B0A0C39000045020747000153030A420000510A0D3C00004B090A - 3A00004502014800005201005F02016D03027803048102038700028700018200 - 027F00027D00027801027202026D020465030360030453000057070643000055 - 0D0D3C00004C0B0A3A00004303033E0000450707370000480C0C350000440B0A - 3300003C03023A00004307073700004C0C0C3A00004D090A3E00004501024000 - 004B0505450000610C0A570000790E0B74000085060585000088000088000085 - 00008000017D01017801027002026400006508094E00005E0D0A430000520B08 - 3B00004405013B00004407033900004D0C0B3C0000520B084400005502016801 - 047100047300047600057900057D00048000058000058000028000027F00017F - 00017D01017B02007902007902007B01018000028900018D00018B0000860000 - 7B02007803007A03017F01008600018700028100067100045D00044E00024000 - 003E00004000014302044D0303440000520A0A3E00004F0C0B3A00004808073D - 0000400301370000480B093700004C0C0B3900004807063C00003B0302320000 - 460B093A0000580D0B4A00006508076300007002027602017B02007F01008002 - 008201008402008201008100008001007E02027A02027402026D01006400005C - 000057000349000054090B3E00004C0B0D37000044070B3D0002490005430000 - 51070B3C00004A0C0C3500004308063C00004300004B01005902006703017503 - 037E02028500028600018000027C01057A02067704076E03056601035B000051 - 00004F0102430000500A0B3A00004C0C0C3700004506083C00004300033A0000 - 4B080B3900004A0B0D3500004307083A00003E0203350000480A0A3900004D0B - 0C3A00004A06074100004200013C0000540A0A490000670D0C5C00007A0B097B - 02008001008400008400008102017C02027504027004036905055E04044D0000 - 57090A4000004E0B0A3900004609073B00004205013B00004E09064200005909 - 084C00006309096501017502057C01057C01057E000580000580010380000280 - 00028000028000028000027F00027F00027D01017D01017D01017B0002800002 - 8700018B00018900008400007B02007803007A03017F01008700028900028300 - 067600056100055100034801044201034000013D00004A000051050642000051 - 09093E00004C09083D00004404033E0000440705370000480B09390000490908 - 3B00004003013400003A07053300004B0B0A4000005808075300006201006C02 - 017102007803007B02007D02007F02008103008103008301018301018001027E - 02027901027500016D00026701025A00005C030647000051080A3A000045090A - 3500004003074300014D03093C00004A090B330000400A093100003B04003E01 - 004801005402006103006E01007800008200008200017D000279010578030672 - 04066801045D00005200004A00004700004B05063A000048090B35000045080C - 3700004101064100014904073C00004B080B39000047080A3800003E02033A00 - 004206073700004A0A0A3A00004A08093D00004301023D00004606053E000056 - 0C084A0000660A056600007706037E03018002018002017B02007403016C0300 - 6703015E04034F00005106083E00004A09083700004409073700004005034102 - 004C07044300005B08065200006B09096500007606067C010381010281000381 - 0003810003810003800002800002800002800002800002800002800002800002 - 8000028000027D00027F00028700018900018700008200007902007803007902 - 008001008900028A00038400077901066400065400044100003E000040000143 - 02044F01024700005004054200004C06063E00004605044000004101003C0000 - 4606053900004807063B00004704033D00003701002F00003F07063800004D08 - 054700005902005B00006803016E03007302007803007903007C04007E040080 - 04008402028402028301018001007D0101790102760104700305630002560000 - 5702064200004805083700003E05083A00034200044100004605073500003E08 - 072D00003707033402003B03004202004D01005901006600007401007F010081 - 01027C01057600057200036C00026300025A00005100004B0000490003400000 - 47050A38000043060A3700004002083F00024600044300004B03093C00004805 - 0A3A00004403053D00003F00023A00004606063900004806073B000047030440 - 00003E00003B00004808074000005306035000006704006C0100790401790200 - 7902007401006C01006401005C01005401004B00024000004704073700004307 - 073700004106043E01004502004600005906045700007008096C00007D06077D - 0002820001840000840001820001800001800001810102810102800002800002 - 8200028400028400048600048600048400027D00027D00028600018900018700 - 008200007902007603007902008001008900028C00038600077A000667000755 - 00044A03064302044100023D00005600005600005000005101004800004A0300 - 4300004202013E01003F02003C00004202023F00004301024200004000003700 - 003603013500003D04033E00004702004A00005100006005016504016A030070 - 03017603007A04007C0400800300830403840202830101810000810000800001 - 7F02047B03076B00006600005900005400024800004602033E00014001034300 - 014400023E00003E02033500003704023202003502003A030040020048000050 - 00005B00006501007101017303037103076A01046300005C00005300004F0000 - 4C00024A01034200024302043D00024003073D00024101073D00034200044900 - 014D00024A00004E00034A00005000024D00005000005000005100004C00004E - 00014800004901014400004100003E0000400301410000490401460000520000 - 5700006103006904026804006702006302005D00005800005100004A00004100 - 004001033D00004103033D00004404034300004901014900005500005D00006E - 06077302057D06077D0004800002830000830000830000820000800001800001 - 8101028101028000028000028200028400028600028600028700048400027F00 - 027F00028400018600018400008001007902007902007D02008200018900018A - 00038400067A02076801045801044400003E00004000014302047207046E0502 - 6602005B00005100004900004100003D00003E03013A01003F03033C00004302 - 044200004800064400043C00033800003902053700003B02033800003F010141 - 00004B01005000005E02016200007002027600007F02048001028001007F0000 - 8100008200008500008500008500008300017F00027900047302056903045F03 - 025401004B00004600004A01034400014703043F00004103033A00003B020139 - 00003E03014000004603024700004F01024F00005800025400005000004B0000 - 4C00014700004701013F00003F01013C00003C02033A00013D03043B00004102 - 043F00024200054500014D00005600005C02026103046905056E040374020277 - 00017B03047901027301016B00025F02015300004700003E0000430000440000 - 4901014700004E01004A00004D00004C00004A00004700004C02024600004D03 - 034A00004F00034800013D04023904013B02003E01004400004800004E000054 - 00006603056B02057001057400057800057900047B00057D0004800001820001 - 8200018000018000018000018000018000018000018000018000018200018200 - 018200018200028200018000018000018000017F00017F00017D01017D01017F - 00018100008700028700028300007D00027503036902005800004A0103420103 - 4000013D00007B04027603006E01006501005B00005000004600003E00003C01 - 003F06053500004307083900004903094200014800073F000240030734000040 - 070A3000003D07073500003B02014100004D05054D00006306075F0000740608 - 7300007A02037C02027D02008000018300008600008800008800008800008600 - 028000027C01037303036A03016001005800005000004900004B02044000004A - 06073B00004707073B00004103033E00004305053B00004806073E00004B0506 - 4400004A01034200004404033A00004508063500004007053500003A02013900 - 014006073800004607093B00004904074100004B00015700015F00006602026B - 04027503037C02028200008600008C00018900008100007800006A02035C0201 - 4C01004400004400004903034100005006064300004F05054100004200013C00 - 003E05043500004408083A00004A05084400004701023C01003902003E010044 - 01004D00005700005E00006500007201057600057900057B00057D00057D0005 - 7D00057D00047F00028000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302047F00017B01017501006B02006001 - 005501004A000042000044040338000045090A3500004A080D3A00004A040A43 - 00034300053A000047080A350000440A0B3300004206063C0000450403430000 - 570A084A0000660A095900006B05066900007504027A02027E02027F00018400 - 018500008600018600018500018200027E01037702036F03026702006200005A - 00005100004300005106084000004E0A0B3A00004808083F0101400404380000 - 4709093700004B090A3A00004A06074300004301023A0000490909370000460A - 0A3500004206063A00004103033B00004D090A3E000054090B43000053040751 - 00006300026900036D02047103037803047C0202820000850000890000860000 - 8100007901016E03056105045303024902004502013B00004C09083C00004F09 - 093C00004706053C00003C0302340000420A09330000480A0A3A00004A040544 - 00004100004100004900005001005902006202026B03047302057800047B0004 - 7D00047F00048000048000047F00047F00048000028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00008300 - 008000017B01017203016902005D02005300004900004200004808073700004A - 0B0D3900004B090E3C00004701074100014A040A3A00004C0B0D39000048090B - 3900004202024000004D0707400000570C0A4700005C09074D00005D00006E04 - 037504027703027C02028001028200018500018500018500018400027F00027C - 01037702037002026E0103670303530000580408470000570A0D420000510B0C - 3C00004404043D0000460808350000480C0C370000490B0B3B00004404043E00 - 004707073700004A0C0C370000480A0A3900004301023F00004D050543000059 - 0B0C490000610B0B5300006204056F01057501067603067803047B03047E0202 - 8001008400008700008500007F00007901016F02046303035701014B00003F00 - 004508063900004C0C0B3A00004A0A093700003E030139000041080733000047 - 0B0B3900004C08093E00004B01014B00005000005700005E0100670303700305 - 7704077D04087D00048000048200048200048200048200048200048000028000 - 0280000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302048800008600018101027A02027202026602005D010052 - 00004E02034000004E0A0B3A00004C0B0D3900004807094000004500033E0000 - 4D080B3C00004F0B0C3C00004806073F00004504033B00004E0B0A3C00004F0C - 093E00004C07044900006304016C02017002027503037A02037F000282000283 - 00018500018300018200028100037E01037A0203790203710305650106550000 - 630A0D4A00005C0C0D4300004E06064300004504033B0000490C0A350000480D - 0B3500004209073B00004001033700004A090B3900004C0C0C3A00004C060645 - 00004900004700005B08075000006B0D0E5B0000700C0C6F02047B01077F0107 - 7F01067D02047D02047E02028001008200008501018400007E00007800006F01 - 036501015B00004D0000430201350000460B09350000480D0B35000043080638 - 0000400503360000480B093900004C0B0A3E00004E06064D00005C0000640000 - 6600016D00027401047901057F01068302078400048600048600048600048600 - 0484000484000482000280000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00008E00028C000287000281 - 01027801026E02016602025D03025100005305064000004F090A3A00004A070A - 3C00004502053F00004904073C00004D080B3E00004E08093D00004501024200 - 00470605390000490C0A350000450B063600004502005601006201006701026D - 03027303037902037D00027F0001830001830001830001840002820002810003 - 8001037A01056D00036D070C5C0000690A0E5000005E070A4B00004E00014700 - 004A07063A0000480B09370000450A083600004004043C00004604093900004B - 080B3C00005007094400005000014E00005D03025400006F0B09600000790D0C - 7000007E07088400068700068300058100038001038001028002018102018301 - 018200007E00007800007100036800015D00004F000041000042070533000044 - 0B09330000430A083400003E03013E01004707063C00004E0808420000540809 - 4700005903036802037100037300037800047B00048000058300058500058600 - 0487000487000486000486000484000484000482000280000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02049200039100038A00038400027D00027601026F02046905055C00004E0000 - 5204054200004C06063E00004604054000003F01013A00004606063A00004A06 - 073D00004903034200004502013D00004606053600004209073400003C07043E - 01004D00005800005D00016503036C04057302057800047D00047F0003810003 - 8300018500018500018600028400028100057A02076F000275060A6700006D06 - 095D00006104055700005301004900004D06033E00004808043B00004306023E - 01004100023D00004903093E0000500507460000540103540000610304620000 - 7107066900007B0A087400008108068101028900048B00058700048400028000 - 027F00018002018002018102018001007E00007B01017702056E010365000159 - 00004800003A00004207053300004108063400004005033F0000460300440000 - 5205034900005906054E00005B08076002037201047B00027D00027F00028200 - 0284000286000286000287000287000286000286000284000282000282000280 - 0002800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00009300049100038C00038500018100017B0002 - 7803067205076100005C00005200005101024800004A02024500004301023C00 - 003A02013A00004002023E00004501024200004500004200004401003E000041 - 04023900003B06033803003F04024600004F00005600005D03036403056C0405 - 7002047601047A00037E00038000008200008400008600018600018600027F00 - 037E00067900037A02077100027102066800026702045B00005800005000004F - 02004800004A03004700004701014500014600044500014C00034C0000530001 - 5600005C00006B05067307067403017C07047C01008104008100008600008D00 - 048C00048800038300017F00017D01017E03017F04027E00007F00007E00007E - 02027B03077403066D02055F01024A00004200013C00003E03013800003E0301 - 3F00004300004B00005300005500005C00005B00006303036002036B05067700 - 017F000180000282000284000286000287000387000386000286000284000282 - 00028200028000027F00027F0002800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302048D00028A0001 - 8A00018500008200007E00007A00037300037003056804046104035A02025301 - 004D00004900004100003D04023603003D06033900004104023E000044010042 - 00004500004200004501023E00004002023800003B02013C0000460001490000 - 5202035200005E03066100026A03066F01057502057B02068102048401048601 - 048800038700018600018800058700058500058200047F00047A000375000371 - 00036C01036602026101015D01005700005100005000004D00004D00014E0003 - 5000035300035900045E00046401036901026F01037500017800007D02008200 - 008502008702008A00018F00068C00068600038000007B00007A00007C03017D - 04027F01007F01008000018001027B02067601046C0001610000500000440000 - 4301023E00004003013E00004401004A00005200005D00006800016E01037003 - 057004036D02046F01017B000282000282000282000284000284000284000284 - 00028200028200028000027F00027F00027D00027B00027B00027F0001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00008800038700028700028500018300018100017E00037800037702 - 056F02046802036202025D01005500005100004A00003C02003C070434000042 - 09073600004606053D00004502014400004903033D00004A06073A0000460606 - 3A00004101014100004B02044400005406074C00005F06095B00006601036D02 - 047201047902037E01038100038500038600018700018A00038A00038A000587 - 00028600048100017E00037A00017601047101016E01036902006400005F0000 - 5F00005B00005700015600035800035D00036100046700036C01037101017500 - 017800007C010080010084010087020088020088000188000587000683000580 - 01037901027802017801007A01007F01008001008000018001027F0106780004 - 7100026300005200004D02043D00004707073700004606054300005100005E00 - 006800007400027901027A02037A02037601027700017F000282000282000282 - 00028200028200028200028200028000027F00027F00027D00027B0002790102 - 7801027901027F00018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302048001038100038100038200028200 - 028100017F00017E00017B00027801027101016C02016602006102005E020154 - 0300430300360000450B06350000490C0A3900004706054000004501023D0000 - 4E08093E00004D080B3C00004904074100004400023C00004D06094200005607 - 0A4900005A03065800006301016901026E00007301017901017D010180010283 - 01028800028A00028900028900018700028600018300017F00008001037C0202 - 7801027403017101016E03006D01006902006200016100046300046700036C01 - 046F01037401047801027A00017C000080010082000084010086010087020085 - 01018000047E00067B02067A0304780304760201760100780000800201820000 - 8200018101028101067900047300026600005700024400004E0809390000480B - 093900004D06035100006600017400027F00048300038401048101027D01017C - 00007F00018000018000018000018000018000017F00017F00017F00017D0101 - 7D01017B01017B01017901017802017901017F00018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00007702 - 037902037A02037E01038001038000028100018100018000027D000279010276 - 01027002026B04026804026106024900004C07043E00004F0C093C00004E0B0A - 3B00004504033F00004806073C00004F0B0C3C00004D080B3E00004500033E00 - 004704073C000050090C4000005306094500005300015800005D00006400006A - 00006E01007403017903027D0303820001860001860001860001870001860001 - 8600018400018200018000017F00017D01017901017903027703027304026D00 - 026C01036E01036F01037401047801027C01037E02027F000180000182000082 - 00008201008201008201007F01007901057302067002046F03026F0302710200 - 7502007A01008102018400008400018400018000057C01057400036900035300 - 005104073C00004A0C0C350000480B094000005500006D02047A02038601048B - 00038B00038701018200007F01008000018000018000018000017F00017F0001 - 7D01017D01017D01017D01017D01017D01017B01017B01017B01017B01017F00 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302046A02036C01037002027702037C01037F000282000283 - 00018500018400028000017D01017903027504027205036B06045C00004D0000 - 5C0907470000570C0A4000004D070740000042020239000048090B3900004C0B - 0D3A00004A040A4100014502073B00004C090E3C00004F0A0D3E00004D050547 - 00004F00005200005800005E00006401006902006F04017304027902007F0100 - 7F01008001008200008200008400008400008300008300008100008001007F01 - 007D02007E03017A02027602017601027801027901027C010380010281010283 - 01028200018200008200008001008001007F01007F01007802016D0506660305 - 6301016100006400006A01007403007D04028402028600008600008600018100 - 057C01057600056900055500024200004A0A0A330000430E0B3300004C070451 - 00006F04067D02048900048F00038D00038A0001820000800100800001800001 - 7F00017F00017F00017F00017F00017F00017F00017F00017F00017F00017F00 - 017F00017F000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00005D000062000067020070 - 02027902037E01038400028600018800018700028600018200018001027A0202 - 7A04037405036700006B0506590000660A094A0000570A084300004504033C00 - 00420606330000440A0B35000047080A3A000043000541000348050A3A00004C - 090E3A00004B080B3C00004603024801004A00005000005300005B0000600200 - 6403006B04017103007502007803007B02007D02007F01008301018501018300 - 008300008300008300008200008001008001007F01007D02007D020080010281 - 02018301028500028500028700028501018501018001007F01007D02007B0200 - 7A01007102006205045802025600005600005C00006501007305017F06048402 - 028800018800008700018300057D02067701066A00064F00004B040735000041 - 0B0A2C0000400B083B00005201006D05067C01038800028E00018E00018A0100 - 8302008103008001008000018000017F00018000017F00018000018000018000 - 0180000182000182000182000182000184000184000182000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02045400005800006201006C02017503037E01038400028900028B00018B0001 - 8900018700018400018001027E03017A02027A02037100007605085F00006306 - 074D00004D05054000003D01013500003D070730000040070A3400004003073D - 00024300063E00014704093A0000480709390000430505400000420200450100 - 4800004D00005100005701005E04006204006A04006E03006F03007403007803 - 007C030180020181020183010184000084000084000084000082000082000082 - 0000820000840100840000860100860000870000870000870000870101850101 - 8101027D01017B01017701007701006C02015500004B00004B00005000005700 - 006401007004007E05038602028A00018800008700018300057D020678020769 - 02074F00013D00003F07062B0000350B062C00004205014D0000690304790102 - 8700018D00008D00008700008103008003008001008200008200008001008200 - 0080010082000082000082000084000086000086000087000087000089000087 - 0000820001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004700004D00005600006003026D0204750205 - 7D00048400028900028B00018B00018900018600018400018001008000018100 - 038102047700027401046500006100025300004E00014700004200013E000040 - 01033A00003E02033B00023C00033C00013E00033B00003E02033A00003F0304 - 3C00003E02023F02004001004200004500004900004F01005302005804005E05 - 016105006504016B04017003017703027A02027C02027F030381020382020383 - 0101850101840000840000860000870000870000870000890000890000870000 - 8700008600018301028001027C01037601027202026E01036C01036104034700 - 004100004500004C00005501006001006E03007901018503048800028A000086 - 00008300037F02047A02066C03065000004200013700003505012E0100350501 - 3D00004E00006903047800018500008A00008A00008700008103008104008001 - 0082000082000082000082000082000082000082000082000084000086000086 - 0000870000870000870000860000820001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302043E02033F0000 - 4701024A00005B00036200017102067A00067D00018200008600008600008700 - 008800018802028602028200018000017F00027D00027B00027800047201046D - 02056200005B00015500015000024B00024400014200023F00023B0203370101 - 3A04043500003B03023600003901003800003B02013B00004202013E00004401 - 004100004600004400004A00004A000055010357000067020469000171030575 - 02057400007600007B00027B00008402038400008B00038B00008A00008A0000 - 8A00008900008900008700028300038101067D02067600057002086400026001 - 055600005400014A00004400013F000046030244000050000056000068020374 - 01047F00028600028900018900018400018000017B01016F0302530000450000 - 4102003700003D06033A01004701014F00006A03067A02078600068A00038800 - 0085000083010183040380010080000180000180000180000180000180000180 - 0001800001820001820001820001820001820001820001820001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003700033E05083800004B04074800006004096300017102067800 - 057D000482000284000186000186000087010187010182000182000182000182 - 00018200028200027F00047B00047400036C00026500035D00025300024D0001 - 4A00014300003B00003E05043400004108073500004206063800003D01013B00 - 004004043800004507073700004505053C00004101013D000045030443000058 - 04085200006504086200006A01046F01057507096F00007F0809760000850506 - 8100008700018600008600008500008500008300008000027D00047800047000 - 0570040A5E000062060B4C00005104084500004300013D00004204043B00004C - 06074300005A03066200007403077D0004840002890002890001860000820000 - 7D02007203015600004D03003C00004508043700004808074300005300006B01 - 077A020784000788000387000285000083010182030280000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302043D04073500004807093E00005607 - 0A4C00006504086500007102067702057C01037F000180000182000181000081 - 00008200008001008200018200018400018200018000027D00027A0105740104 - 6E00046601035E00035700015200004D00004B00024100005007094000005108 - 0A3E00004905064200004301023A0000490909370000490B0B3500004307073B - 00003E02033700004B07084200005A060A4E00006002065C0000680507620000 - 730B0C6400007C0B0E6F00007E06077800007E03017D02007D01017B01017901 - 027801027300036E01036700055A000063070C49000055080C3E00004903093E - 00004001033900004909093E00005408094C00006906086F00047B0004820002 - 8700028700018600008200007D02007203015D02004700004D0805390000490C - 0A3900004D05054E000068010677010682000787000387000285000083010182 - 0302800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003B00 - 0246060B3900004E090C42000058070A4F00005D00026702046C010371000376 - 01027901027D01017F00017F01007F0100800100800001820001840001840001 - 8200028000028000057A01057601046F00046900036300026000035D00035700 - 005E04094E000060090D4A00005A060A4500004C00024600004B05063C00004D - 0B0C370000470B0B3600003D04033800004307083900004E0A0B420000570609 - 4900005500015400005F05055200006D0D0D5A0000750D0E6A00007406067205 - 037206027205037104026F03026D03026802036502045700005A030647000055 - 0A0C3E00004A090B3700003F03043A00004507073900004F0B0C4300005F080B - 5D00007304087B00048200028700028700018600008200007D02007203015B00 - 005607044000004D0D093700004C0C0B41000053000166000576000581000687 - 0003870002850000820000820302800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044301063A00004B080B3C0000500A0B4200005204054E - 00005A00005D00006400006B01007101017703027A04037B03037D02007F0100 - 8001008200008400018400018400018400018300017F00017C00017900047601 - 047201047001056F010570020864000072080E5A00006C080D5300005D02054F - 00005200014500005309093E00004D0C0B3900004508063900003E0405350000 - 490A0C3900004C090C3E00004E05074700004A00004500005808094A0000640B - 0E52000066090A5F02016304016305006304016003005F02015E02015B010157 - 01015100004300005007093A00004A0B0D33000040070A3700003F0304380000 - 4B0B0B3C000055090A4A00006807096D00037900048200028700028700018600 - 008200007D02007403016304014C00005309073A00004B0E0C3900004D07074D - 0000620003720003800006850003860002840001820000810201800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00004100014704093A00004B - 080B3C00004B07083F00004A00004C00005100005900006000006701026D0302 - 7103037605037902007B02007D02007F01008200018400018600018600018400 - 008500018300018200028001037E01037D02067B02067800047E050D6C00007C - 080F62000070040A5D00005F00025900005A030649000057090A4200004D0707 - 3F000042000140000146060B370000490A0C37000049080A3B00004503044200 - 004B0506400000540A0A43000055070848000052000052000054000052000052 - 00005100004E00004E00004A0000430000470403390000450909330000400A0A - 3200003A04043A00004406063900004D090A4200005B07095C00007204087900 - 048000028600028700018600008200007D02007403016201005C07054300004D - 0A073700004A0A094000005000016100026F00027D0005860104870003840001 - 8200008102018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044600023F00004704073B00004808083900004306043F0000420000470000 - 4D00005300005D01006101016602026C02017403017803007902007B02007F00 - 0182000184000186000187000187000189000187000187000187000287000383 - 00038100067B000182040A7300007F050B6D00007203076A00026801045E0000 - 6306075200005C06064C00005402014B00004A00044000004704093900004306 - 0A3700004105063D01024302043F00004A05083D00004C05083F000048010444 - 00004800004900004900004900004900004700004700004300004100003B0000 - 4105053300004007083100003B05053600003E02023B00004606063C00004F05 - 054C00006305066C01047800048000028600028700018600008200007F010076 - 02016A05035800005505043E00004707063900004805044B00005E00016D0002 - 7B00058401048500038400018200008001008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004400004400024000004403053C00003E0504 - 3A01003C03013C01004000004601004B00005200005801005C00006100006D04 - 017004007403017602017901017D01018000018400018800028A00028A00028B - 00018B00018A00008A00008600018100018000057D00028100077B00037D0309 - 7701067504087102066F04076900036803056000006100025C00005900015000 - 004D00044400004400043B00003C01053900013D03043B00004100023F000044 - 0104400000450205410002440203450000470000480100470200470200460300 - 4403024403023F00003F02003A00003E02023800003C02033800003A01023C00 - 004002023F00004301024400005101025D00016C03067601047F000284000286 - 00018400008200007F01007802016B04026003024F00004B01003E0000410402 - 4100004B00005A00006900017900058201048500038400018200008001008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E0000400001430204450001420000 - 4300033C00003C03023700003802013701003902003900004202014100004B01 - 014C00005200005700006605026703006E04036B00007402027400007A00017D - 00008300008500008800008A00008A00008C00008C00008700008200047F0004 - 7F00047D00047D00047B00047900047800047800047601047401047401047201 - 047201047201046D02056400065800025000014500004302043A00013B020339 - 00003E00013F00004500054100014300053E00013F0004400001430000440000 - 4701014300004701014100004201004100004000003F00004002023C00004001 - 033C00003F00023E00013F01014000004303033F00004901014D00005F020369 - 02057401047D00028200028400018400008200007F01007802016C00005E0000 - 5400004500004201003C00004201004700005C01046A01047A02078102048300 - 0384000182000080010080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00004200004702053A00004506083300003F07063300003802013601 - 003D06033600004707063E00004F05054600005100005600005F02015900006B - 07056200007408077100007C04057D00028000018400018600018900018B0001 - 8B00018700028000027B00027B00047D00027D00047D00027D00047D00027D00 - 047D00027D00047D00027D00047D00027D00047900046E000668010851000052 - 03063D00004307083700003B01023D00004502053F00004C040A3C0000470409 - 3A00003F00024200004903033F00004C06063C00004906053D00004201003F00 - 004404043A00004806073A00004704073D00004200023F00004505053B000048 - 06074000005305065800006904067401047B0002800002840001840000820000 - 7F01007901016F00006802035200005205033A00004508063D00004800005900 - 036801047501067F020481000382000182000080010080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044301023A0000490909370000440B - 0A3200003F07063700003B03023300004509093700004B090A3C00004B050647 - 00004D00004A00005E0606500000690B0C5C000071090A6E0103750205790203 - 7C01038001038300038500038700038500037D00027901017901027B01017B00 - 027D01017D00027F000180000280000182000282000184000284000186000282 - 00027F020B6B00006A060C4A0000500A0B3700004007063700004202023F0000 - 52060A42000051070B3C00004404093E00004701024100005007093E00004D09 - 0A3C00004705063F00004301023B00004A08093C00004D090A3C00004B050641 - 00004301023B00004A0A0A3A00004F09094500005E0606620001720104790102 - 8000028200018400008200008001007B01017803046400006306074500004D0C - 0B3500004508064400005501036401037302067D020481000382000182000082 - 0000800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003C00 - 00450707370000480C0C350000460A0A3300003C03023800004307073500004A - 0C0C3700004A0A0A3900004501024500005206074500005B0B0C4A0000610909 - 5400006300026B02056F02047201047702037A02037C01038102047F02047B01 - 017901017901017B01017B01017D01017F00017F000180000182000184000186 - 000186000186000187000186000283000580080D5D0000620C0C400000470C0A - 3300003C03023E00004C060743000056090D4200004D080B3700004001034300 - 00500507400000510B0C3C00004B090A3A00004202023F00004806073A00004F - 0B0C3C00004F090A4000004701023E00004808083900004E0C0D3E0000540809 - 4F00006502047002047901027F00028200018400008200008001007D01017600 - 007306085300005B0B0A3A0000480D0B3800004502015300026100027001057A - 02037F0002820001820000830101800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302043C0302330000460A0A3500004A0C0C3700004706083E - 00004201033900004A090B3700004A0B0D3500004307083A00004504063C0000 - 4F0A0D3E0000550A0C4500005501054E00005F01056302046801046C01036F02 - 047002047502057702037901017B02007B02007D02007D02007F01007F01007F - 01008001008200008200008400008400008400008600008400018A0508760000 - 770C0E4E0000520D0A3300004009043700004202013E000054070A450000550A - 0C3C00004307083C000047000342000051070B3E00004F0A0D3A00004706083C - 00004201033900004A0A0A3A00004F0B0C3C00004C06074300004301023B0000 - 4C0C0C3A00004F0C0B4300005B05055D00006F02047801027F00028200018200 - 008200008001007D01017B03046800006807094900004F0C0B3500004207053F - 00005000015E00016F00047A02037F0002810000820000830101800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003500003F070633000046 - 0A0A3900004A08093D00004500034100004904073A00004A090B35000043090A - 3300003B020338000142050935000048090B3A00004B06094100004C00025300 - 035700035D00036100026401036602026A02036F01017901017F01007F01007F - 01007F01007F01007F01007F01007F0100800100800100800100800100800100 - 80010082000084000185080A640000630C0A3C0000400A032F00003A06003C00 - 004B050543000056070A4200004C08093600003E02034100004D03073E00004D - 080B3A000049080A3800003E02033A00004206073700004A0A0A3A00004C0809 - 3D00004501023E00004705063900004C0A0B3C00005107074C00006000016F02 - 047801027F00028200018200008001008001007D01017900007704075700005A - 08073C00004409073500004100004F00005D00016E00047801027F0002810000 - 8200008301018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02043603013300003F07063500004707073D0000490205460000480002410000 - 49030939000043060A3300003B04073400023500043200003C04093200004306 - 0A3900004603064500004900004C00005100005500005A00005D000160000168 - 00017B01018400008400008200008200008001008001007F01007F01007D0200 - 7D02007D02007B02007B02007B02007D02008301027A00007009065000004708 - 003000003608003405003D03003F00005004054300004E05073B00003E050439 - 00004200024100004B03093C000047050A3800004004053900003B0102360000 - 4206063500004507073A00004503044000004100003D00004808083C00004A07 - 064200005401005900006D02047601027D00028000018200008001008001007F - 00018003057100006904064B00004D07073700004005033D00004C00005C0000 - 6D00037801027F00027F00008200008301018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00003701003802013800004002023F0000450102 - 4400004700014700014600024100014300053C00013C01053800023700033900 - 043B01063700023D02063800013E01053C00004100014300004700004B000051 - 00005600005B00005F00006800007D0101860000860001840000820001820000 - 8000018001007F00017D02007D01017B02007901017803007901017802017600 - 007103035F02005206003D00003703003102003606003A020041020041000047 - 01013F00003E02023600003901004000014600044100014300053F0001420005 - 3D00003C00013C00013D01023A00004002023E00004202024000004100003F00 - 004202023E00004205033D00004600004C00005700006903047201047B00027F - 00018200018200008000017F0001800305780306630000560302450000420503 - 3A01003E01004A00005800026900037601047D00028100008400018501018200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302043C00013B0000 - 4001033E00004201033F00004200024100014100014000004300033E00004201 - 033C00003F00023E00014100034200024300053E00014000053C00003F000240 - 00014501024900025000015400005A00006200016800047302067F0002840001 - 8400028400018200028200018000028000017F00027D01017D00027B01017B00 - 027901017B00027202025D01005202014C02004502003F02003A020039020036 - 01003B04013B04013A03003A03003803003303003203003502003F0000420000 - 4200004200004200004200004200004000004300034100014401044200004601 - 044100004400024200004000003B00003C03013600003C03013C00004601004F - 00006205046D02047601047D00028000028200018200028000017C0001720000 - 6804025400004A03003B00003B02003C01004400005300026502047302057D00 - 028500008A000089000184000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004200024400024B01073F00004A - 05083900004405073A00004101014501024C02025300025A0002600001680002 - 6E00057800058000048400028400028200028200028200028000028000027F00 - 027F00027D00027D00027B00027B00027B00027002045700004C00014B000049 - 00004800004500004300004000004302014202013F02003D02003B02003A0100 - 3A01003C01004101014200014200024200014400024400014400024400014500 - 034A06074000004C08093E00004A060740000043010240000043060437000042 - 09073400004508044200005000006205046D02047601047D0004800002820002 - 8400028000027B00007706046200006009054100004306023600003C03014200 - 005101026302047103057D00048500018C00008D000184000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073F - 00004700033F00004C070A3A00004A0A0A390000460606410000480000500203 - 5B02056201036900036F00027700047B00058000048200028200028200028200 - 028000028000028000027F00027F00027D00027D00027B00027B00027B000276 - 01046600006000006000005D00005C00005A0000580000560000580000560000 - 5300005200005200004F00004F00004B00004200003F00003F00003F00003F00 - 003F00003F00003F00004204043A0000480A0A370000490B0B3700004406063F - 00004701014100004C09083A00004B0B073E00005005035100006604046F0204 - 7801027F0002820002840002820002800002800102720000740A09510000540A - 083900004007053B00004200005101026103047103057D00048500018C00008B - 0001840001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004300034100004A06073A00004D0B0C3900004A0A09 - 3A00004701014B00005502016104056A03067302067700037E00048000048200 - 028200018200028200018200028000018000028000018000027F00017F00027D - 01017D00027B01017D00027901027500037300037300047200026F00026F0001 - 6D00026B00006B00036901026600026501016400016400006400015E00015100 - 004B00004B00004A00004B00004A00004A00004A00004600004F080540000053 - 0C09400000510A074000004B01014D000056030545000055090A430000550806 - 4A00005B00006B03047401047B00028000028200028400028200028200027D00 - 008208086400006B0E0B4500004B0B0736000040050342000051010261030470 - 03057B00048300018A00008B0001840001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E00004301023A0000 - 4A0A093900004C0C0B3A00004A07044700005100005C02016905057305077B02 - 0680010386000486000284000184000084000182000082000182000082000180 - 01008000017F01007F00017F01007F00017D02007F00017F0001810204810003 - 8000058001038000057D00027B00047901027A01057902037800047601027500 - 037301017300037100036D020469030469020568040469020568040468030566 - 0404630204590000680A0B530000690B0C5300006305065A0000610002570000 - 6508094E0000630B0B5000006306056100007002047800047F00028200028400 - 028400028200018200018601037900007C0C0C5500005C0C0B3E00004609073E - 01004400005101026103047003057B0004830001880000890001840001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023C00004407053700004A0B073900004A0A063F00004E01005500 - 005F02016C04057604048102048400028B00028C000287000084000086000084 - 0000840000840000840000820000820000820000800100800100800100800100 - 8001008001008400018400028200028200028200028200028000027F00028102 - 047F02047F02047E01037C01037B00027B00027B00027E01037E01037E00057C - 01037C01057C01037C01057A02037700037D08096E00007F0D0D6A00007C0A0A - 6C00007302056D000274060A620000710C0E5B0000700B0D6400007103057800 - 047D00028200028600028400028400028000018200018400008707086B000070 - 0C0A4A00005009063B0000440403440000510102610304700305790004810001 - 8600008700018200018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003D02003800004208033700004708 - 043D00004B04004D00005801006302006F03027903028200018700018F000190 - 0002890000860000870000860000860000860000860000840000840000840000 - 8400008400008400008400008400008200008100007F00007F00007F00007E00 - 007E00007E00007C00007E02027C02027C02027B01017B01017B01017A00007F - 00008800008C00008C00018A00008A00018800008800018600008A0206820000 - 8C070A7F00008A070A7D00008603067F00017D02067500027A060B6C00007609 - 0B6A00007605087700037D000282000286000287000186000184000180000182 - 00018901038100007E07086000005C0606440000460504410100440000510102 - 6103046E03057800047F00018500008600018200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003C01 - 003B03003A00004003003E00004503004800004E00005A01006302006F020079 - 01018100008600008D00018E0002890000870000870000870000870000870000 - 8600008600008600008600008600008600008600008600008600008400008000 - 017F00017F00017F00017D01017D01017D01017E02027D01017D01017D01017C - 00007C00007B00007B00008000008C00029100029000029000028E00028E0002 - 8C00028C00028900018800028500008801038300008500028300008300018000 - 027F00057900017A00067200007601047600017C000182000286000289000189 - 00018700018400018000018200018900018902047700006B04025300004C0200 - 4100004303024400005101026103046E03057800047E00018300008600018200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003901003E04003C00004204004100004A01004E - 00005A0300620100710603770100830405830000890001860000870000850000 - 8500008400008400008500008500008600008600008600008600008600008700 - 008700008700008400008000017D01017D01017D01017D01017D01017F00017F - 00017F00017F00017F00017F00017F00017F00017F0001800001860103870002 - 8400018300008100008100008100007F00008000017F00017F00017D01017D01 - 017B01017D01017F00028200028200028000027E00037A00037A00037D000280 - 00028600028900018B00018B00018700008400007F0100800100890001850000 - 7C04056700005802024700004100003E00004701014E00015C00006800017601 - 047F020483010284000182000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900003E060136000045 - 08043900004907024300004D00005400006205026400007A0B09730000840808 - 7F00008301028301028001008100008100008100008100008200018301018100 - 008100008100008100008300008300008300008100007E00007E00007E00007E - 00007D00007D00007E00007E00007F00007F0000810000810000810000810000 - 8300008100008101028001027F00017E00007B00007B00007C00007C00007C02 - 027C02027C02027A02027A02027A02027A02027E020284000486000482000480 - 00047D00047E01038001038300038700018B00018D00018B0001870000820000 - 7F01008001008600008B0406740000710A084F00004D06033C00004101004502 - 014E00015900006600017401047D020481010282000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003E0301340000450A083700004A0B073A00004B0603470000520100510000 - 6909095E00007A0E0D6A00007D08097600007801027802017800017800007800 - 017800007901027901017B00027B01017B00027B01017D00027D01017D00027D - 00027E00017F00017F00017F0001810001810001830001830001860002860002 - 8700028700028700028700028900028600028101027E02027D01017C00007C00 - 007C00007C00007C00007E02027E02027E02027C02027C02027C02027C020280 - 01028200048400048000027F00027D00027D00027F00028200018700018B0001 - 8D00008B00008600008200007F01007F0100890204800000800B0C5D00005F0C - 0B3E00004606053D00004502014B00005700006501017201047D020481010282 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004001033A00004308063500004A0D0B3700004A0B07 - 3C00004702004700005607044C0000670D0C5300006D0C095F00006A03016B00 - 026B01006A00016A00006C00016C00006D00026D010071030571030371030573 - 03037302057303037302057702037A01057C01037C01057E01037E0005810204 - 8201068201048200048200028400048400028600048600028600048400028001 - 037E02027D00027C00007C00017D01017D00027E02027E00017E00007E00017E - 00007E00017E00007E00017F00017F00017F00037C00017A0001790000790000 - 7D00008000008700018B00018B00008900008600008001007D02007F01008300 - 008808096B000071100D4900004E0B083700004106044201004B000057000064 - 00007201047A0203810102810000800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000400103370000 - 480A0A3700004A0C0C3900004707063F0000480202410000550A084500005D0B - 0A4A00005A04045200005A00005A00005B00005B00005B00005B00005D00005D - 00006201036202026201036402026401036402026401036701026B00036D0002 - 6E00046F01037201057201047501067702057800057800047900057B00047D00 - 057D00047D00057D00047C01057B00027B00047A00017D00047D000280000580 - 01037F00037F00018100038100018300038300018300038100017F00027B0002 - 7901027801027700017800017C00007F00008600008900008B00008900008601 - 008002007D02007D02008503047700007A0C0C5300005A0D0B3A0000430A083B - 02004101004A00005400006200007100037A0203800001810000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E0000440507370000480A0A3700004709093800004202013F00 - 004706053C00004E09063E00004D06034200004800004B00004B00004C00004C - 00004C00004C00004F00004F0000510000510000520000520000520000520000 - 5400005600005800005A00005A00005B00005D00006000016000016200016601 - 036700036900036B00036D00036D00036E00036E00036E00036E00026E00026F - 00017000027300037300037601047901057A01057C01057C01057E00057E0005 - 7E00057E00057901027601027503037503037503037803047B03038102038400 - 008700008900008900008401008002007B03007B03007D000080060665000067 - 0C08430000490A063500003E07043F0200470000540000620000710003790102 - 7F00018100008000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100043C00004604093700004506 - 083600004004053B00003E02023900004407053700004407053700004303023E - 00004101004101004000003F0000400000410000440001440100450000450000 - 4700004700004900004900004900004700004200004200004300004600004700 - 004A00004B00004E000151010253000254000256000258000258000258000258 - 00005700005700005700005900005900005C00005E0001610002640103660103 - 6700036900036B00036B00036B00036D00026E00006F00006D00006E00007003 - 017304027903027F03038400008700008900008700008401008002007B03007B - 03007D01017200006E07055200004F05033700003C07043904013E0100470000 - 5400006100006F01037901027F00018000008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 034100043F00014300033E00004201033D00003E00003C00003B02003800003B - 04013800003E05033B02003E05033E03013D02003B02003A01003A01003D0101 - 3D01014002024202024301024500034501024501024501024301024202023900 - 003800003A00003B00003E01003F020042020143020143000045000045000047 - 00004900004900004A00004900004800004800004700004700004900004A0000 - 4D00005000005200015300005500015700005700015900005900015B00005B00 - 005D00005C00005E00005F00006302006901026E020174020278010278010278 - 01027602017203016F04016F04016D00006C01035E00005401004300003E0100 - 3801003C05023E01004700005200006100007000007B01018300008400008200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000013E00013F000043000343000049000345000046000143 - 00004000003B00003B04013501003B04003700003B03003C02004004003E0200 - 3F05003800003B03023600003A00013A00004100014200004700054300004701 - 023F00004101003E01003D01013C00003F03033B00004204043D000041030341 - 0101410101400000430102410000460203410000470102430000460203440100 - 4703044200004602034200004701024500004700004600004B00024700004B00 - 024800004B00014A00004900004600004900024500004B00024700004B00014C - 00004E00004F00005200014E00005200014C00004F0000500000510000500000 - 5200024800004900033F00003F00023E00004301024600005300005D00007302 - 007D00008C00018C000084000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F00023D00004203053D00004E - 04084300005003064500004600013F00004005033300003E0A043000003F0803 - 3800003F0300410100450700370000420A053300003F07063600003E02033F00 - 024701073F00004C05083C00004705063A00003F02003E00004305053A000046 - 08083900004507073C00004103033D00004303033900004606063A0000460405 - 3C00004000003F00004204043800004507073700004305053B00004101013F00 - 004404043B00004806073A00004705063D00004101013D000040040536000043 - 07083500004206073A00003F00023D0000420305380000450608370000440507 - 3C00004200024400004B01054100004C05083C00004704093C00003F00024000 - 004903034A00006405026800008506058900008E000086000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00004001033800004A070A3E000053080A4300004F0406430000420201360000 - 420B06300000430C073300004407033F00004404003C0000480C06350000450E - 0B3200004108093A00014000053A00004A070A3A00004A0A0A3700004207053A - 00004303033C00004A0A0A3900004B0B0B3900004707073F00004101013A0000 - 4808083900004A0A0A3900004505053D00003E0202360000440808350000460A - 0A3500004206063A00003E0202360000450909350000460A0A3500004206063A - 00003C020334000043090A330000440A0B3300004206073A00003E0203360000 - 45090A350000460A0B3500004206073C00004202023B00004A070A3A00004A09 - 0B3700004206073800004004043C0000530806500000740B087000008C070485 - 0000840001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004001033C00004506083A0000510A0D42000053080A - 4000004501023E0000430806320000450E09330000480B073A00004503004300 - 004C08013A00004D0F09350000460D0B3500003E04053A000145050A3700004A - 0B0D370000460A0A3500004003013F00004C06073E0000510B0C3E00004D090A - 3C00004301024000004907083A00004E0C0D3A00004C0A0B3B00004404043C00 - 00440808350000490D0D350000460D0C3500003F060538000041080733000045 - 0D0C320000430B0A3200003B0302380000430708350000480C0D350000440A0B - 3300003C0203380000410708330000460C0D330000430A0B3300003C03023A00 - 004507073700004A0B0D370000460A0B3200003B02033800004508063E00005F - 0D085700007C0E0A780000840300820001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C0000400103370000 - 4B080B3E0000530A0C4200004E0507410000420201350000440C073300004A0D - 093A00004C07044700004D0300440000520B073E00004E0D0C3700004607093A - 00003E0203350000460A0B350000480C0C3500004308063E00004A0202440000 - 54080943000055090A4200004E04044300004A0202410000500A0A3E0000500D - 0C3C00004B08073F0000430302370000490C0A3700004B0E0C3500004409073A - 00003C0301330000430C09320000450E0B3000003E09063700003E0202370000 - 480A0A3700004A0C0C3500004307073A00003C0302330000430B0A320000450D - 0C3000004008073700003C0302330000460A0A330000460C0D3200003E080835 - 00003B05043400004B0B074500006A0F0A6200007F0A057A0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004001033C00004405073A00004F080B4000005007093F00004301023C00 - 00420705350000480B073A00004E09064400005001005200005907024A000058 - 0B084200004E08083E00004201033C0000420607350000460A0A370000470A08 - 3A00004701015100005B04074C00005F080B4A00005A06084A00004F00004B00 - 005103044500005408094300005107074300004A00004500004B05053E00004E - 08083E00004A07063A00004100003E0000460605370000460B09350000450A08 - 3600004003013F00004905063E00004D090A3C00004A08093B00004202023C00 - 00440606350000440B0A330000430A093400003C030138000040070535000046 - 0A0A35000043090A3300003903023702004008033A0000560C06520000710D08 - 6E00007D05007F00018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003F00023A00004704073E00004E05 - 074100004703044000003F02003800004208033900004C070444000054020154 - 00006205025F01006508055500005D07074D00004F02054500004200023A0000 - 4406063700004707073D00004B03034D00006204056300006A07095C00006706 - 085900006002035A00005C00005500005D05054E00005C06064D000057040352 - 00005603025100005906054B00005705044800004E01004900004B0000460000 - 4F05034000004E07043F00004904014600004B00004800005404054500005105 - 064300004D03034600004600004100004906053A00004807063A00004404033F - 00004101003C00004707033A00004807063A00004204043B00003F04023B0000 - 4B0603470000650A066300007608047701007F00018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000013E00 - 013F00023F00004500034300004701024000004000003E01003D02003C000043 - 03004700005000005400005C00006D06047007046C02016A05036100005F0203 - 5200014F00034500014200023E00004301024300004C00014F00005700006E03 - 067504086F00047203076C00026F010569000168000267000368030564000167 - 04066000016403055F01026302046904066A0507660103670406600000610002 - 5B00005B00005900005800005300005500005100005300005000005100005500 - 005800005500005900015300005500015000005100005000004F00004A00004C - 00014800004B01014800004700004700004801004700004B01004700004B0101 - 4600004500004401004702004800005503005E00006E05027302007902007F00 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000013E00013D00004300034100004501024100004200013E - 00003D02003B0000420300430000510402560000630506690304730200790302 - 7902037500017201056C03066200065400014B00014400004501024500005103 - 045600006205066902057800047D00047B00047B000479000479000478000476 - 01047401047201047201047002046F02046F02046D0204700204760104780004 - 7800047601047601047401047201047002046F02046D02046D02046B03046903 - 046903046903046903046C05086D04076902056700036400015F00005C00005B - 00005C00005B0000590000570000570000550000550000530000550200550200 - 5601005500005600005300005000004F00004F00005100005400005B00006500 - 007001007902007E03017F000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023D00004203053B000048 - 05083C00004705063C00003F01013B00004005033A00004E07044B0000610707 - 6300007204067800008002018101027E00017B00047501066900055A00014D00 - 004D02044100005006064C00006406076400007603067F000484000284000482 - 00028200048000028000047F00027D00047B0002790004790102780004780102 - 7601047901028000048400028200048200028000048000027F00047D00027B00 - 0479010279000478010276010476010276010476010475020575020574000571 - 00037000036D00016C00026900006B0003690102670003670102660103660202 - 6401036202026104016003006203006301016400006300006100025E00015D00 - 025D00005F00006400006D00007600007F010080010080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004001033800004A070A3A00004B090A3A00004406063A00003C0301360000 - 4A0A064200005F090958000072070A7500037E00008501018700028300018200 - 047C00066E00055D00005300024400005008084300006109095C00007706097A - 0003840002870001870002870001870002860001860002840001820002800001 - 8000027F00017F00027F00017D00028000018700028B00018900028900018900 - 028700018700028600018400028200018200028000018000028000017F00027F - 00027D00027B00027C01057C01037C01057B03047B02067A0304770205750303 - 7502057303037302057303037103057004036F06036F06037005027002027201 - 047100036E00036D00036B00036900036A00016D00007600007C000084000086 - 0000820001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033C00004706083900004D0A0D3A00004A0A0A - 3700003E02023800004508063C0000570C0A5000006F0A0C6800007C03077F00 - 008701018800028600008600047E00057000055F00004E000050050740000057 - 0B0C50000070090C6E0000830205860001890001870001870001870001870001 - 8700018600018400018400018200018200018200018200018000018400018900 - 018D00018B00018B00018B00018B000189000189000187000186000186000186 - 0001860001860001840001840001820002800002810003800103820104810204 - 8203058003057C00017A00017A00017800017A00017800017800017701007706 - 037706037A04037B03037C01037C01057B000578000577010674000574010477 - 00037A00017F0000870001870000820001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0C0C3700004307073800003D04023700004D0A07450000670A - 0B5E00007A060B7900027F00008501018700028500008400047E00056E00055B - 00004F01023E00004D0A09420000630B0B5E00007E060A7E0000840001860000 - 8600008600008600008600008600008400008400008400008400008400008200 - 0082000082000084000086000087000087000087000087000087000086000086 - 0000860000840000840000840000840000840000840000840001830003830003 - 8300038100038300038000028000028000027F00017F00017F00017E00017F00 - 017E00017E00017C00007B04027B05007E03018101028300038300058200057F - 00057D01077B01077A01057B00047F0002840001870001880002820001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B3900004709093600003C03023800 - 004407053C000059090853000072070A7100008002077E000081030085000283 - 00008200047C01056D00035A0000470000460605390000520B084C00006E0809 - 7200008302058200018200008200008200008200008200008200008200008200 - 0082000082000082000082000080010082000082000082000082000082000082 - 0000820000820000800100800100800100800100820000820000820000820000 - 8200008200008402038300038300038200028100018100018000008000008300 - 038300038300038300038300038300038300038101027D02007D020082000084 - 00008700028700028600048200058200077E00067E00057D0004800002840002 - 8A00028800028200018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004507 - 073600003E05043800003B04013800004B06034800006504066600007C02087E - 00037C01007E03008101027F00007F0004790105690003560000470101380000 - 4208033B00005A07055F00007B04057E00017F00017D02007D02007D02007D02 - 007D02007F01007F01007F01007F01008001008001008001007F01008001007F - 01007B02007902007902007902007B02007B02007B02007B02007B02007B0200 - 7D02007D02007D02007D02007D02007F01008001028101028101028000018000 - 0180000181000081000083010283010285000285000285000285000285000283 - 01027E00007E01008300008600008900028900028700048400048300067F0005 - 7D00047E00038000028400028800028901038200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004002023900003A01003A01003F020043000053 - 01005C00006E00047700037E01037A01007C03018001027F00007F0004790105 - 6700035400004300003B02003800004404005000006703037600028001037D01 - 017D02007D02007D02007D02007D02007D02007D02007F01007F01007F01007F - 01007F01007F01007F01007D0200790200780300790200790200790200790200 - 7902007902007B02007B02007B02007B02007D02007D02007D02007D02007F00 - 017F000181010281010281010281010283010284020382000182000182000182 - 00018400018200018400018200017F00007F0000840000860001870001870002 - 8600028400048200047F00037E00037E00017F00018200028700028801038200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000003F00004301023F00004300033E00003F00023C - 00013B00003E00004802024B00005D00006900007A02067A00017A01007E0301 - 8101028100008000047A01056900035600004400003C01003F04024000005600 - 006700007D02068100018000017F00017F00017F00017F00017F00017F00017F - 00018000018000018000018000018000018000018000017F00017F00017D0101 - 7F00017F00017F00017F00017F00017F00017F00017F00017F00017F00017F00 - 017F00017F00017F000180000180000180000180000180000180000180000180 - 0001800001800001800001800001820001800001820001800001800001800001 - 8200018200018200018200018200018200028000028000028000028000018000 - 0180000182000182000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073C00003F00043A0000460606410000540403540000710608 - 7300007C02027A00007E03018301028100008200047A01056B00055600004500 - 004407053800004906054F00006F06097A000183000382000280000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 - 4F090A4700006507086300007C07087800007A00007E03018301028100008200 - 047A01056B00055600004800003A0000460B093C000060080861000083050A7F - 0000820002800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B - 3900004000053900004808083E0000590908530000750A0C7000007D03037A00 - 007E03018301028100008200047A01056B00055600004400004609073500004E - 0B0A4E0000730A0D770000840104820002800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 - 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 - 0A6100007E090A7800007A00007E03018301028100008200047A01056B000556 - 0000480000390000480D0B3C0000620A0A5F000085070C7F0000820002800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 - 004707073E000057070653000074090B7100007C02027A00007E030183010281 - 00008200047A01056B00055600004400004508063500004C09084E000072090C - 7800008300038200028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004402073D00023C00013E00004C06074700006103046500007B060779 - 00007A00007E03018301028100008200047A01056B00055600004700003C0000 - 4308063C00005C04046300008204098000008200028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033F00023E00033A00004303034400004F - 00005800006D02047500017B01017A00007E03018301028100008200047A0105 - 6B00055600004500004104023B00004401005300006B02057C00038200028200 - 0280000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017B01017D01017F00018200018500008700028700027F - 00007901017304026B02005A00004600003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004000003F00004301023F00004300033E00004100043E - 00033B00004000004802034B00005D00006900007803047A00007A00007E0301 - 8301028100008200047A01056B00055600004600003E01003F04024000005800 - 006700017F010681000182000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018000017F00017D01017B01017D01017F000182 - 00018500008700028700027F00007901017304026B02005A00004C0103420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073C00003F00043A0000460606410000540403540000710608 - 7300007C02027A00007E03018301028100008200047A01056B00055600004500 - 004407053800004906054F00006F06097A000183000382000280000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018200018000017F00017D - 01017B01017D01017F00018200018500008700028700027F0000790101730402 - 6B02005A00004400003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 - 4F090A4700006507086300007C07087800007A00007E03018301028100008200 - 047A01056B00055600004800003A0000460B093C000060080861000083050A7F - 0000820002800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018200018000017F00017D01017B01017D01017F0001820001850000870002 - 8700027F00007901017304026B02005A00004D02044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B - 3900004000053900004808083E0000590908530000750A0C7000007D03037A00 - 007E03018301028100008200047A01056B00055600004400004609073500004E - 0B0A4E0000730A0D770000840104820002800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018200018000017F00017D01017B01017D0101 - 7F00018200018500008700028700027F00007901017304026B02005A00004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 - 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 - 0A6100007E090A7800007A00007E03018301028100008200047A01056B000556 - 0000480000390000480D0B3C0000620A0A5F000085070C7F0000820002800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001800001 - 7F00017D01017B01017D01017F00018200018500008700028700027F00007901 - 017304026B02005A00004C01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 - 004707073E000057070653000074090B7100007C02027A00007E030183010281 - 00008200047A01056B00055600004400004508063500004C09084E000072090C - 7800008300038200028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018000017F00017D01017B01017D01017F00018200018500 - 008700028700027F00007901017304026B02005A00004500003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004402073D00023C00013E00004C06074700006103046500007B060779 - 00007A00007E03018301028100008200047A01056B00055600004700003C0000 - 4308063C00005C04046300008204098000008200028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018000017F00017D01017B01 - 017D01017F00018200018500008700028700027F00007901017304026B02005A - 00004E03054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033F00023E00033A00004303034400004F - 00005800006D02047500017B01017A00007E03018301028100008200047A0105 - 6B00055800004500004104023B00004401005100006B02057A00038200028000 - 0280000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 018000017F00017D01017D01017D01017F00018000018300008500028301027E - 00007B01017703026E01005D00004700003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004000003F00004301023F00004300033E00004100043E - 00033B00004000004802034B00005D00006900007803047A00007800007C0100 - 8100008200018300057800036800025700004600003E01003F04024000005600 - 006700017D020681000180000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017F00017F00017D01017F00017F - 00017F00017F00017F00017D01017D01017B01017901016D03024F0003420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073C00003F00043A0000460606410000540403540000710608 - 7300007C02027800007A01008100008400018300057A00036B00035A00004700 - 004606053A00004906054D00006D060976000183000380000280000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00017F00017F00017D01017D01017D01017D01017D01017D01017D01017F0001 - 7F00017002024900003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 - 4F090A4700006507086300007C07087800007901017A01008100008400018300 - 057A00036B00035B00014A00003C0000480B093C00005C09085F00007F060A7D - 0000800002800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000017F00017F00017F00017F00017F00017F0001 - 7F00017F00017F00018000018000017202025201044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B - 3900004000053900004808083E0000590908530000750A0C7000007D03037901 - 017A01008100008300008200047B00046C00045C00024600004808073700004E - 0B0A4A0000700B0D720000820104800002800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000017F00017F0001 - 7F00017F00018000017F00018000018000018000018000018000017202024B00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 - 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 - 0A6100007E090A7800007A02027A01008000008300008400047D00046F00065E - 00044A00003B00004A0D0B3C00005D0B0A5C00007E090C7C0000800002800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000017F00017F0001 - 8000018000018000018000018000018000018200018000018200018200018200 - 018200018200017402025100034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 - 004707073E000057070653000074090B7100007C02027A02027D020080000083 - 00008400047E00057000076001054700004707063700004C09084900006D0A0C - 6F00007E01037F00028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017F00017F00018000018000018000018000018200018200018200 - 018200018200018200018200018200018200017402024A00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004402073D00023C00013E00004C06074700006103046500007B060779 - 00007A02027D02008000008500008600048000057301086102064A00003F0000 - 4508063C00005705045C00007706097900007F00028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000017F00017F00018000018000018200 - 0182000184000184000184000184000184000184000182000182000182000174 - 02025302054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033F00023E00033A00004303034400004F - 00005800006D02047500017B01017B03037D0200800000840000860004810005 - 7301086403074A00004403023D00004201004C00006403057100037B00027F00 - 0280000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000017F00 - 017F000180000180000182000182000184000184000186000186000184000182 - 00018200018000018000017202024B00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004000003F00004301023F00004300033E00004100043E - 00033B00004000004802034B00005D00006900007803047A00007901017D0200 - 8200018600018700048000047400076602074D00004200004104023E00005000 - 005900006F01037901027F000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000017F00017F000180000182000184000184000186000186 - 00018500008600018500028402038202038102037E0202700403510003420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073C00003F00043A0000460606410000540403540000710608 - 7300007C02027901017D02008200018600018700048200047600076602074D00 - 004704033900004807064500006003046900007A03047D000280000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000017F000180000182000182 - 00018400018400018600018600018700028500028200018000017D01017C0202 - 7A02026C05034700003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004202023A00004A08093A00004B080B3900004604093C00013D01023C0000 - 4F090A4700006507086300007C07087800007901017D02008200018600018700 - 048200047600076802075200013E0000470A083A000056090750000070050775 - 00017D0002800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001820001840001860001860001870001860001880103830102 - 8000017C00007800007602017203016905034E01044201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004707063A00004D0B0C3A00004A090B - 3900004000053900004808083E0000590908530000750A0C7000007D03037901 - 017D02008200018700018900048400047800076802074E00004C06063900004D - 0C0B4300006109096200007904057D0002800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001820001840001840001860001860001 - 8700018600018400018000017E02027A02027403016F02006B02005F02004600 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420202390000 - 4B090A3A00004D0A0D39000047050A3C00013D01023B0000510B0C4700006709 - 0A6100007E090A7800007901017D020084000187000189000484000478000769 - 02075400023F00004B0B0A3A0000550A084E00006F07087200007D0002800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001820001 - 8400018600018700018700018600018600017F00007E00007B03037905047205 - 036A03006300005700004A01034201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023E00004606053A00004B090A3A000049080A3A00004000053900 - 004707073E000057070653000074090B7100007C02027901017D020084000187 - 00018900048400047900076902074F00004B05053900004A0A094300005F0707 - 6100007705057D00028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018400018600018600018700018700018600018400017E00 - 007C00007A04037506046E05026502005D00005100004300003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004402073D00023C00013E00004C06074700006103046500007B060779 - 00007901017D02008400018700018900048400047900076B0107530001420000 - 4606053900005005035100006A04057301017D00028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018400018600018600018700 - 018700018600018400018101027C02027403016E03006602005F010058000050 - 00004A04054302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033F00023E00033A00004303034600004F - 00005800006D02047700017B00027B01017F0001840001860001860002820004 - 7D00056F01075100004701023F00004202014400005401006700007702037D01 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001820001820001820001820001800001800001 - 7F00017F00017F00017F00017F00017F00017F00017F00017F00018000018200 - 018200018400018400018600018600018400018000018006067803046D010063 - 00005A00005200004E02004C03004000003F00004100014401044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000003E00003F00004301023F00004300033E00004100043E - 00033D00004000004A01034D00005F00006900007A03047C00017F0002800002 - 8400018200007B02007B01018200027800055400014200004301063B00004202 - 014D00006E03007D02007F000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001820001860002870002 - 8600018400018200017F00017D01017B01017B02007902007902007B02007B02 - 007D02007D02007F01007D00007F00008200008301018301028101028001037B - 00027604046B00026303035200004B01003F00003E04003D0200440203450102 - 4300004000003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013D00004205033B000048 - 06073A00004605073C00003F00043C0000470506430000560403560000730608 - 7500007E01037F00048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018200018600028600028400018200018000017F00017D01017B01017B02 - 007B02007B02007B02007D02007F01007F020080020082000082000081020180 - 01027E02027802017301016D01006602026307064D00005107053A0000420705 - 3600003C05023B00003E00004000004402034201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004002023800004A08093A00004B080B3900004604093C00013F00023D0000 - 51080A4900006706086500007E07087A00007F00048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000017F00017F00017F00 - 017F00017F00017F00017F000180000180010082000082000084000084000086 - 00008B00038901038402037E01037402026902005F0201570200520503440000 - 4F09093C00004A09083A00004806074100004204043E02023C00003900003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023C00004508063A00004D0B0C3A00004A090B - 3700004000053B00004808084000005B0908550000750A0C7000007F02047F00 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000017F00017B01 - 017B01017B01017D01017F000180000182000184000184000186000186000086 - 00008600008600008600008700018C01048901058102047702036A02035D0100 - 5001004601003F0000430904350000490C0A3A00004D0A094100004703043900 - 003500003701003A04034201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000400202370000 - 4B090A3A00004D0A0D39000045050A3A00013D01023B0000530A0C4700006709 - 0A6100007E090A7800007F00048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000017D01017802017602017802017B01017F000182000186000187 - 00018900018B00018B00018900018900018700018700018600018400067E0005 - 7702056C01035F01025301004601003D00003B0401300000420A09330000490B - 0B3A00004C05084200003C04033704013502003200003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023C00004606053A00004B090A3A000049080A3800003E01053900 - 004507073E0000570706520000720A0B6F00007C01037F00048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017D01017802017602017802017B - 01018000018400018700018B00018D00018D00018B0001890001870001860001 - 8400027D00027200036B00036500045E01025400024C00014300003D00003700 - 003E0704320000440B0A3500004709093B00004002023600003500003702003A - 05024100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004101013C00004705063A00004805 - 083A00004202073B00023A00013C00004C06074500005E040461000079070777 - 00007F00048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 00017901017802017B01017F00018400018700018B00018D00018D00028B0002 - 8900028600028000027D00027B00047002045800004F00005000024E00014E00 - 024B00014900004600004701023E00004706083600004208093400003B050537 - 00004106044304004102003D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101003F00004301023F00004201033D00023C00033800003F03034200004D - 00005500006804047101017901027F00048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017D01017D0101800001840001870001890001 - 8B00018B00018900028600028200027D00027800047201046F02046204054700 - 003E00004000004300004800014A00014A00004A00004A00014A010343000144 - 03053B00003C03043300003901004200004800004C00004F02004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000004000003F00004301023F00004300033E00003F00043C - 00033C02033C00004503044800005800006000007002027902037D0004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001820001840000860000 - 8700018900018800008800008700008400008200047C00037B03076F01036B04 - 075E00005800004B00004000003900003E02033C000043000343000048000149 - 00004900024700004701024000004202023B00003C00004000005000005B0000 - 6101016303033F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004101013F00004404033B000048 - 06073A00004605073A00003B00043900013F06053C00005107054D0000660404 - 6A00007904057D00048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018200018900008A00008900008900008700008600008400028100037900 - 047605086600006706085100005705044700004901013F000040040538000045 - 06083700004406063C00004101014200014804053E00004B03034200004F0505 - 4800005602046200006A00006E00027002024201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004301023B00004C08093C00004B080B3900004205093800013C0304360000 - 4A0A0A4000005C09085600007107067601027D00048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018400018B00008C00008B00008700008400 - 008000017D02047904057306086000006508094A00005206073E000048070642 - 00014900034100004E0809390000440B0A3000003B08063101003A0704350000 - 4A07064300005B04075300006C060B6E00047500007900007D00027E02023E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023F00004807063C00004F0B0C3A00004A090B - 3500003C0105380000420908390000540D0A4A0000670A096300007806067D00 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018400018B00 - 008D00008900008400007F00017802016F01016803015F02015F090947000051 - 09093C00004608083600004505054800005504074200004D0B0C3300003D0D09 - 2900003205013101004109043E00005D0A0857000077090B7300008404098000 - 018301028402038402034201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E00004301023A0000 - 4D090A3C00004D0A0D39000043060A3800013D04053400004A0C0C3E00005C0A - 095300007009077301017D00048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018200018600008702008402027E05037504026B02005E000055 - 0000530302440000500A0A3A0000490B0B3500004206073F00004E0002490000 - 53080A3C0000480D0B3000003A0A063101003A0300390000580B085200007A0D - 0F6F00008A070A8500008601038602028602028602023E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004202023F00004706053C00004D090A3A000049080A3600003B02053800 - 00400807370000500B084900006408076400007606067D00048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018001008200008003007B040274 - 06026A03005D0100500000460000430000460703370000480C0C35000047080A - 3800004200024700005003064000004D0A09390000450B063600004004004300 - 00540802520000720E0C6B0000870B0B80000088000286020283010183010183 - 01014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004200013D00004905063C00004805 - 083A00004003073800023C03043700004507073F00005705045600006D060472 - 02027D00048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 01007C03017803006E02006602005C01005101004700004000003D0300360000 - 4007053400004607093B00004603084000004200013D00004706053C00004C07 - 044300005003014F00005E04035F00007009076A0000800A097800008305047E - 00007F01007F01007F01007F01004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000004000 - 004101004100004501023F00004001033B00023C00033D01023F03033C000044 - 04004800005902006A00007A03047D00048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017F00017F00017F00017F00017F00017F00017F00017F00018000018200 - 018200018200018000018000017F00017F00017F00017F00017F000180000180 - 00018200018200018400017F00017405036A03006100005700004E0000480000 - 4303003F05003A03003904013700003C03023C00004302044200044702054100 - 004202004300004B01004E00005700005900006000006F05047505057400007A - 02027700007E03017B00007E03017D02007C01007E00007C01004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003C00003D00004501024100004001033A00003F000441 - 00034800024400003D04033600004003004D0000710101800002800004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001820001820001 - 8200018200018000018000017F00017D01017D01017D01017D01017D01017D01 - 017D01017D01017F00018602028701018400008100007E00007C01007A000079 - 01017C02027B00008001037C00008500038500008C0105810106600000520000 - 5200004A00004902004100003F02003C01003B03023901003C02033700003E02 - 033B00004100044200004700004E00005300005900006302006A030171030378 - 04037901017D01017F00017F00017F00017F00017F00017F00017F00017F0001 - 8000017F00013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008800048200048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018200018400018200018200018000018000017F00017D01017D01 - 017D01017D01017D01017D01017D01017D01017F000183010185010184000082 - 00008001008001007F00017D01017B000081050578000085080A770000840507 - 7A00007100045400004D03034100004C06063A00004606053A00003D01013800 - 003D03043700004607093800004605073B00004700005000005700005E000064 - 01006B02007203017A02027F0303800001820001820001820001800001800001 - 7F00017F00018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058500018200048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018200018200018200018000 - 018000018000017F00017F00017F00017F00017F00017F00017F00017F00017F - 00017E03018002018102018501018700028800028A00028B00038700037A0000 - 850A0C6B0000770C0E5D00006404045100004C00013F00004C08093A00004A0A - 0A3700004406063C00003C00003700004909093A00004F0B0C3E00004C030548 - 00005801006002006502006902006F02007602017C0202800102800001820001 - 8200018200018000018000017F00017F00018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058200 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018200 - 0182000182000182000180000180000180000182000182000182000182000182 - 00018200018200018200018000017D02007D02008102018802028B00038D0003 - 8F00038D000385000187080A6A0000740F0D5000005A0B084000004202003F00 - 004707073900004C0C0C370000480A0A3700004202023D00004706053E000055 - 0B0B430000570A084900005702006104016804006C0300700301740301790101 - 7E02028101028200018200018200018200018000017F00017D01017D01018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000182000182000182000184 - 0001840001840001860001860001860001860001860001840001820001800001 - 8500028801038B00048B00048800038400028204096E0000700A0B4E0000550B - 093700003E0A043300003B0203350000460A0B350000480C0C3700004707063F - 00004903034300005508064900005E08084E00006309085F02006A0602700502 - 7304027703027A02027E02028000018200018200018400018200018200018000 - 017F00017D01017D01018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058200048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001820001840001840001860001860001870001870001870001870001870001 - 8700018700018500008600018700028601038300038000027900007300006E01 - 036A08084C00005107053900003E0A042D00003708043300003F060932000044 - 0A0B3500004909093B00004701014B00005506034C00006108045300006B0A07 - 6200006F08057104027504027903027A02027E02028101028200018400018400 - 018400018200018000018000017F00017D01017D01017F000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00017F00017F0001800001800001820001840001860001870001870001890001 - 8900018900018700018700018700018900018A00018B00028700038001037800 - 046E00026300005900005503024700004906033900004005033300003E07043A - 02013802023300003F06093300004507073B00004B0303490000520000520000 - 6205025E00007009066900007709057403007802017B01017D01017F00018000 - 018200018500028700028600018400018200018000018000017F00017D01017D - 01017F00018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008700038200048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000017F00017F0001800001800001840001840001 - 8600018700018700018700018700018700018600018600018600018600018600 - 018600028001037702056A02035F02015100004800004000003C02003700003C - 03013900004003014000004002023A00013A01043800014001033F0000490101 - 4B00005100005400005E00006600007207037504017B09037903007B03007E00 - 007F00007F000082000184000186000187000287000286000184000182000180 - 00018000017F00017D01017D01017F00018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D0403320000390500490000750001860002820004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000017F00017F0001 - 8000018000018400018400018600018600018801038700028600018300008100 - 007F00007F00007F00017E03057601047204066300005C02024D00004801003E - 00003C01003700003D04033B00004404044300004802034600014102043E0203 - 4100024300004600004A00004E00005600006604046B04027203017603007902 - 007D02007F020080020082000084000184000186000186000186000186000186 - 00018400018400018200018000018000017F00017D01017D01017F0001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008800048200048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000017F00017F00018000018200018400018400018600018600018400 - 018400018200017F00017D01017A02027903027303036400006205045500005C - 06064900004F05034100004201003C00004205033900004808083B00004C0607 - 4400004900024300004300004700004B00004F00005500005C00006200006D03 - 027203017803007B02007F020080020082020084010086000086000186000186 - 00018700018600018600018400018400018200018200018000017F00017F0001 - 7D01017F00018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058500018200048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018200018200018400 - 018400018400018400018000007D00007D01017A020275040272050370050265 - 06034B01003C00004B08073E00005109094200005003064900004C0002450000 - 52060A4000004F080B3C00004603064000004800004C00005000005500005D00 - 016402026903047004037402027802017D02007F010082010084010084010086 - 0100860000870001870001870001860001860001860001840001840001820001 - 8200018000017F00017F00017F00017F00018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058200 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018200018200018200018400018400018200018000017E000078000076020171 - 04026E05026805016305005605003A00003A0802320000490C0A3C0000510909 - 4600005300034F000057030747000055080C4000004C070A3900004700035000 - 005700005C00006000006802037004037505057A06057901017D010180010082 - 0000840100840100860100860000870001870001870001860001860001840001 - 8400018200018200018200018000018000017F00017F00017F00017F00018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018200018400018400018400018400018200018000017F - 00017B03037605037005026905016004005C04005403004903003C05002C0000 - 400D0B3300004C0C0C3E00005104084A000052000548000056060D4300005208 - 0E3E000048050A4800005C00006500006A00006D01007202027903027D030380 - 0404800001820000840000840000860000860000860000860000860001860001 - 8600018400018400018400018400018200018200018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058200048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000182000184000184000184000184 - 00018400018200018000017B01017A06057205036905015F03005602004F0100 - 4901004302003B03003F0A07330000460D0C3700004909093B00004400024500 - 014E040842000052050C42000053060D46000057020668030171030075010078 - 03007B0101800102810102850002860000860000860000860000860000860000 - 8600008600008600018400018400018400018400018200018200018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000182 - 00018400018600018600018600018400018200017F00017901017706046D0401 - 6002005600004D00004601004103004203004802024300004A06073A00004307 - 073400003905053400003A03063700004604093E000052030C4D00015D040E62 - 00067202027903007D02007F0200800100840000860000870000890000890000 - 8900018700018600018600018400018400018400018400018400018200018200 - 018000018000017F00017F00017F00017F00017F000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008700038200048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018001 - 0080010080010080010082000182000182000182000182000182000182000180 - 00018000018000018000018000018400018400018200018000017D0101790101 - 7403016F03026905035F04005501004C00004600004100004103004305004400 - 004800014100004202023800003B03023600003802013B010242010345000050 - 00025600006300086700077202097800007E0100800100820100840000860000 - 8701018800018700008700008700018600018600018400018200018200018200 - 018200018200018200018000018000017F00017F00017F00017F00017F00017F - 00018000018000018000018000018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D0403320000390500490000750001860002820004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018001007F020080020080020082010084000084000086000086 - 00008701018701018500028200018000017F00007E00017E0001830102810102 - 8205077702037307066400005A01004F00004A00004600004702004100004302 - 013F00004201004000003C02033900013C03043900003F03033F00004701014A - 00004F00005800006301016C01037503037902037D00027E00007F0001800100 - 8000018001008200018200018200018200018200018200018200018200018200 - 0182000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008800048200048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018001007F02007F030080020082 - 0100840100860100860000870000880001870101850002840001820001800001 - 7F00027F00027E0000800606720000770B0A5C00005D09044A00004602003F00 - 004006013600004308063700004606063D00004100023701013B060933000042 - 08093A00004D05054A00005600005E0000660000700000790101800201830101 - 8601008500008200018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058500018200048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 01007D02007B03007D02007F0200800100820000840000860000860001860001 - 8400018500028300038100038100037E01037B03046E000076090B5B0000670B - 0A4A00005006043F0000400301340000430A0935000048090B3900004704073F - 00003F030437000048090B3A000052090B4500005805045900006501016B0100 - 7402027A02028103028301018401008300008200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058200 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017B02007903007B03007D02007F0100800100 - 8200008200008400018400018200018200018100038001038001037A02036E00 - 006F0708590000670B0A4A0000550A083F00004404033A000041080633000048 - 0C0C3700004A090B3C00004500033F00004B0407420000570A0D470000610A0D - 5700006604046B03047103037804037B03038103028102018401008400008200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017B0200790200 - 7B02007D02007D02007F01007F00018000017F00017F00017F00027F00027D00 - 047B00047B000474010468020356000060080849000055090A3E00004808073B - 00003C0302320000440A0B3500004A0B0D3900004A05084500004D00004A0000 - 5D060A4E00006A0C10590000700B0D6B03047204067604047A04037D03037F04 - 0281020182000082000080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058200048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017F00017D02007D02007D02007D02007D02007D01017D01017D01017A00 - 017A00017800017700017200027000026F000168000258000056060745000050 - 08083C00004808073700003E050438000040070635000048090B3900004C070A - 3F00004E00035400006400055800006F090E5E0000750C0F6D000278070A7604 - 047902037A02027C02027E030180020181020181020180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018200018200018200018000017F00 - 017D00027B00027901027601047100036E00026A000165000163000060000059 - 00004C00014200004905063900004507073700003F06053A01003B0102380000 - 4405073A00004A05084100004D01055000006701066A00007405096B00007908 - 0C7000007C070A7901057901027901027B01017D01017F00017F000180020181 - 0201800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008700038200048000028400017F0100760400780300 - 8400017B00045300014300053F00034000053900004D03006E00008103008000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018200018600 - 018700018600018400018000027D00027901027402026F02046802036402025F - 01025800005400005100004A00004100004002023B00003F03033B00003E0504 - 3A01003E02023E00014100024100004700034700004C00024B00005700007203 - 077D03097900057D04087800037D02067A00037B00027D00027C00017C00007C - 00007E00007F0001800201810302800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D0403320000390500490000750001860002820004800002 - 8400017F01007604007803008400017B00045400024000024300073B00003E03 - 0149000071030080020080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018400018B00028C00018A00018500018200047C010575020571 - 04066500025B00005802024D00004C02024200004300003D00003B0201380000 - 3D04033900004004043B00004103034101014703044701024800004A00004E00 - 0052000058010563020678000580000480000480000480000480000280000280 - 00027F00027F00017F00017F00017F00017F00017F00017F0001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008800048200048000028400017F01007604007803008400017B00045200 - 004502073B000045050A3500005107036C000082040080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018400018900008C00018A000386 - 00068000057800046E00026500025900005704034600004D07073A0000420705 - 3500003904013600003D05043400004108073800004707074000004901014900 - 004E00005200005500015A00025E01026001056A01047D000484000284000484 - 00028400028200028200028200028200018000018000017F00017F00017F0001 - 7F00017F00018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058500018200048000028400017F01007604 - 007803008400017B00045500033C000049060D370000460B094300007507037F - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000182 - 00018500008700048600068100077A00066E00036300005A0000530001440000 - 4C0809370000440C0B2E00003B0A083302003A0403340000450A083700004B0A - 094000005004054E00004F00005600005D00006502046A03066C04056B020571 - 0003800002860001860002860001860001840001840001820001820001800001 - 8000018000018000018000017F00017F00018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058200 - 048000028400017F01007604007803008400017B000451000048050A3900004A - 0A0F350000560C08690000830501800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000028000047E00057900057400056C0002630000 - 5A00005100004A00004C0606390000470E0D300000410E0C2E00003906043700 - 004308063900004F0C0B4200005909084D00005C00005C00006300006B000270 - 0403740404740404740202780001820001860001860001840001860001840001 - 8400018400018200018200018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200048000028400017F01007604007803008400017B - 00045600043B00004B080F370000470C0A4300007608047E0000800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017D00027603066F0105 - 6800026300005A00005500004F00004A00004B02043C00004C0B0D350000470D - 0E3300004007083800004104023B0000500B084200005C0C0B4E000063060560 - 00006E01037101017601027802017901017B01017D01017F0001820000840000 - 8400008200008400008200008200018200018200018200018200018200018200 - 0182000182000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058200048000028400017F - 01007604007803008400017B000451000047040939000048080D350000540A06 - 6A00008305018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017901026903045F02035700005000004E00004800004900004701014100 - 004808083900004B0A0C39000049080A3A00004301024100004B06034200005A - 0B084E0000670A096100006F03027904057B03037D01017E00007E0000810000 - 8200008301018200008001008001008001008200008200008200018200018200 - 0182000182000182000182000182000182000182000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200048000028400017F01007604007803008400017B00045500033E0000 - 46030A3700004207054600007305017F01008000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000017601025A00004C00014900004600004300 - 004200004200014202024201033C00004704073D00004D050B4300004F020949 - 00014700004500005506034F00006609086100007408077602017C02027F0100 - 8100008500008500008701008801008603008002007F02007F01007F01008001 - 0080010080010080010080000180000182000182000182000182000182000282 - 0002800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D0300720000870003840004820002840001800100760300780300 - 8600027B00045300004300033F00024001033900004D03006E00008102018000 - 0180010080000182000182000182000182000182000182000182000182000182 - 0001820001820001800001800001820001820000820000820000820000820001 - 8000018000017F00017D01017B01017901017802017602017601026B03044F00 - 004600004200004100004101013D01013D01013A01003900003C00013D000046 - 01044600004F0206500003550105510000580000590000640300670000730505 - 7703027F05057C00008000008300008601008801008902008902008603008002 - 007F01007F01007F01007F01007F010080010080010080000180000182000182 - 0001820001820001820002820002800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D0403320000390500490000750001870002860002860002 - 8700028200017802017901028600027D00045400004000004303023B00003E04 - 0049000071000480000282000182010082000084000086000086000087000087 - 0000870001870001860001860001840002840002820002820001880202890200 - 8902008801008601008300008000007C00007F05057703027305056700006403 - 005900005800005100005000004800004A000442000042030539000138040434 - 02023302003603013B02014101014500004900004D00005500006D0204760201 - 7601027802017901017B01017D01017F00018000018000018200018200008200 - 0082000082000082000080010080000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008900048700028700028700028400027901027901028700047D00045200 - 004505003B00004508043700005306046C000182010680000180020082010084 - 0100860000860000870000870000870001870001870001860001860002840002 - 8200028200018803008802008700008500008500008100007F01007C02027602 - 017408076100006609064F00005506034500004900004800004D000740000049 - 060B3600003E08083200003504023704023802013B0000410000480000500000 - 5500016300007801028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058600018600028600028700028200027901 - 027901028700047D00045700003E00004A0A06370000480B0745000075030A7F - 00037F00017F0200800200800200820000840000860000860000860001860001 - 8600028400028200028000028000028000018301018201008100007E00007E00 - 007D01017B03037904056F0302610000670A094E00005A0A094200004B060341 - 00004301023B000047080A350000440A0B3200003E0605370000400202410000 - 4500004C00005400005C00006401036F02047B00028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008901058400 - 028400028600028200027801027901028600047D00045300004A08033A00004C - 0D093900005A0A096B00008301087D01017D02007D02007F0200800100820000 - 8200008400008400018400018400028200028000027F00027F00027D00027D01 - 017B01017B01017901017802017601027101016E01036000006306054E00005C - 0C0B420000500B083B0000410402390000400708320000440B0C330000450909 - 3900004501024900004D00005300005A00006300006A00027001057803067D00 - 0280000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008200028000028400028000027801027901028600047D - 00045801003D00004C0C083900004B0C0847000078040B7E00037D01017B0200 - 7B02007D02007F01008001008200018200018200018200018200028000028000 - 027F00027F00047B00047700017402027604047404047004036B00026300005C - 00005C00004D00005909084200004F0C0B3900004308063700003906042D0000 - 3F0C0A320000490B0B3A00005005074D00005300005C00006400006C00027400 - 057900057C01057D000480000280000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008901058000027F00028200027F - 00027601027901028600047D00045300004B07023C00004B0B07390000580807 - 6C00008301087D01017B02007B02007D02007F01008001008200018200018200 - 018200018200028000027F00027F00027D00047900046F01036B03046C030669 - 04066502045D00005600004F00004E00005004054000004B0A09370000450A08 - 3400003A04033302003A09073000004509093C00005408094E00005F01056100 - 006A00007400037A00067F010782010682000480000080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020383 - 00017F00027D00028000027D00027601027801028700047F0004590000420000 - 4906033A00004607034A00007501087F00047D01017D02007F01008001008000 - 018200018200018400018400028200028200048000047F00047F00047D000476 - 01046801046002035E00045A00025700015200004E0000490000490002400000 - 4707073800004108073400003D05043600003A05023600004407053C00005406 - 075200006605096B00037100027700027F000481000584000685000383000180 - 0000800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008500037F00027D00027F00027D0002740202780102 - 8700047F00045700004703004200004203003B00004F02006E00038100067F00 - 017F010080010082000082000184000184000184000184000284000282000480 - 00047F00047D00047D00047400056302065801045200014C00004A0000480000 - 4701024703044101014103033B00003E05043900003D04033800003B02013F02 - 004302014500005000015600006702046D00037803067F010681000583000584 - 0002830001830001810001800002800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D04033200003905004900007500018400027D00027B0002 - 7F00027D00027601027901028700047F00045A00004501004404003F00004006 - 014C01006E00067E00047F000181000083000083000083000085000085000185 - 00018400048300038400067F00038103097B00057D03097203075700004B0000 - 4C00034700004900034100004100023E00013E02023A01003E05043900003F03 - 033B00004002024100004A00005000005600005D00006800027000027800037F - 00048200048400028400028200028200027F00017D01017D01017F0001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008601047D00027B00027F00027D00027601027901028700047F00045700 - 004A06013C0000450804350000510A076700017E000683000385000285000285 - 000285000285000285000383000383000586050A79000082070B7100007A0409 - 6E00006A00065000004D01054100004A05083A00004405073800003B01023A01 - 003F06053700004507073A00004905064200004C00015A00006100006500016C - 00017200027900047F00048300038400028400028400028200017F00017B0101 - 7901017901017F00018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058300017F00027D00028000027F00027801 - 027B00028900048000045A0000400000490A06350000450E094000006C060B77 - 000381000383010283000383000383000381000381000580000581060A770002 - 800A0F67000076080C5F00006900035900005000023F00004C070A3900004809 - 0B3500004007063800003E05043700004808073C000052080845000056060758 - 00006A01047100037300037800047B0004800103830003850003840002840001 - 8200018001007D02007902007803007803007D01018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008702057F00 - 027D00028200027F00027901027B00028900048000045500004A080337000046 - 0E092E00004F0F0B5B00007701067B00027F00017F00027F00027D00027B0002 - 790004780004740104780A0C620000710C0E5500006406075200005000004700 - 004A05083A00004A0B0D350000440B0A3200003C03023B00004808073E000055 - 0A084900006008085600006703037502057C01057C01057E0103800103800002 - 8200028200018200018200018001007F01007D02007902007803007902007F00 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068400008000027F00028400028000027B00027D00028B000480 - 00045B01003D0000480B0732000040100A37000064060A6B0000760104790102 - 7901027801027601027402027002046D02046902055C0000670A0B4C00005D0A - 0C4500005004054300004701023A00004A090B370000480C0C3300004108073A - 00004404033F0000550A084A0000670A0B5900006F07086E00007B00027F0002 - 7F00027F00027F00017F00007F00007F00008000018001007F01007F01007F02 - 007D02007D02007D02007F000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E000089010582000280000284000282 - 00027B00027F00028D00048200045A00004B0904350000410D072B0000450B06 - 5300006A00027103057303037303037303037103036E04036A04056505055900 - 005A0404470000540A083C00004A0A093900004104023F000047040739000048 - 0A0A350000430A083400004003003F00005007034A0000670B0A5B0000760A09 - 6E00007B03047E00017F00017F00017E00017E00007E00007D00007D00007F01 - 007F01007F01007F010080020080020082010082010080010080000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020385 - 00018200028200028600028400027D00027F00028D00048200045F0302430100 - 4309042E0000340A033300005700036000006B00026B01006B01006902006701 - 026402025F03025B0402510000460000490603380000410A0731000039090535 - 02004101013D00004606063700004307073600004005033F00004601004A0000 - 5D08065C0000770B0A7200008005077E00007E00017E00017E00007C00007A00 - 007A00007B02007B02007B02007D02007F020080020084010086010087010086 - 0100820000800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008700038200028200018400028400027F0002800002 - 8900047F00046003024D06024001003B04002E00003902004900005900005A00 - 005A00005A00005900005500005100004E00004A00004700004502013D00003D - 04023601003805023303003704013E01004101003E00004202013F0000450200 - 4400004A00004E00005801006001007107067503037E06078001028101027F00 - 007E00007C01007F01008600018301027A02027703027901017B010180000182 - 0000860001870000870000860000820001800001820001820001820001820001 - 8400018400018400018400018200018200018200018200018000018000018200 - 0182000182000182000182000182000182000182000182000182000182000182 - 0001820001820001820001820001820001800001820001800001820001800001 - 8200018000018200018000018200018000018200018000018200017F00027901 - 027900048000048400028600028600028200018000017F00017F00017F000180 - 00018000018000017F00017F00018000018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D04033200003905004900007500018400028000017F0100 - 8200018200018200018000028000047800046603055100004800003E00004005 - 033900004100004700004A00014900004B00034500004700034100004100023E - 00013F01013B00003E02023A00004002023C00003F01013D00004006003E0500 - 3F01004000004700005100005A03006405026904026F04017203017602017901 - 017B01017D01017F0100810300780000860A047C00009F00049E040970000071 - 060878050874000085030A8100018500068B050B7F0001820004820002820002 - 8400028600028600028700028900028900028900028900028700028600028600 - 0284000282000282000284000284000284000284000286000286000287000287 - 0002870002870002860002860002840002840002840002840002840002820002 - 8400028200028400028200028400028200028904077700008F0A0D7B00008300 - 017E00008400027A000374080E62000074000090030E8D000296020A84000088 - 070A7901017901017D01018000018200018000017D00027B00027F0001800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008601037F00017D02008001008200008400018000017D00047401046601 - 035B03034500004C06063A00004305053700004001034200024701083B000047 - 040B3700004205093600003A01043900003E0405360000450707390000460405 - 3E00004300004204004104004502004900005201005E02006804007104027602 - 017901017D01017D01017F00017F00017F00017F01007F03008007007B060080 - 0000A00105830000720E0E4D0000530000640307690308740D12620001620003 - 66050966070B6103046104036303036503036703036802036A02036A02036C01 - 036A020368020367030365030363030361040361040363030365030365030365 - 0303670303670303670303670303680203670303670303650303650303650303 - 6503036503036703036703036703036703036703036703036703036703036400 - 006300006D09095D00006A06066000006B07077113145300045F020B921C2777 - 00008A00019000048400017900007802017802017D0101800001840001820001 - 7D00027B00027F00018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058300007F00017D02008001008200008400 - 018000017D00047401046904065100005305063E00004B0B0B3700004004043F - 00004700054100004E060C3C00004B080D3900004206073800003F0304370000 - 4509093700004909093A00004504033F00004802004B02005101005802006103 - 006804007104027905047B01017F00018000018200018200018200018000017F - 01007C04008211076300006600008A04048C1615FFEDE7FFFDF5FFFCF7FFFBF8 - FFEBE8FFFBF8FFF4F0FFFDF8FFFDF8FFFDF7FFFFF8FFFFF8FFFFF8FFFEF8FFFE - F8FFFEF8FFFDF8FFFDF8FFFDF8FFFDF8FFFEF8FFFEF8FFFEF8FFFFF8FFFFF8FF - FFF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8 - FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFEF8FFFDF8FFFCF8FFFCF8FFFCF8FFFC - F8FFFCF8FFFCF8FFFCF8FFFCF8FFFCF8FFF8F4FFF8F4FFFCF8FFFCF8FFF6F2FF - E8E5FFF9F9FFECF2FFDDE5850E178B040E8600038504097D0204760201780201 - 7F00018400018700018400017F00027D00027F00018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008702047F00 - 017D02008001008200008400018000017D00047401046500025D050545000052 - 0C0C3900004709093500004303034300014E040A40000051090F3C00004B080B - 3900004001033C00004507073700004C0C0C3A00004A09083C00004A00005301 - 005A02005F03006603006D04017504027A02027F030380000184000184000186 - 00018600018400018400018001007100007D0902740D04740A037F0303610000 - FFF5EEFFFFF7FFFFF6FFFDF6FBF5EEFFFFF9FFFFF9FBFFF8F8FFF9E7F5EAF3FF - FAF2FFFAF3FFFBF5FFFAF7FFFBF7FFFAF9FFFBFAFFFAFAFFFBF9FFFAF7FFFBF7 - FFFAF5FFFBF3FFFAF3FFFBF3FFFAF5FFFBF5FFFAF5FFFBF5FFFAF7FFFBF7FFFA - F7FFFBF7FFFAF7FFFBF7FFFAF7FFFBF7FFFAF5FFFBF5FFFAF5FFFBF7FFFAFCFF - FBFEFFFAFEFFFBFEFFFAFEFFFBFEFFFAFEFFFBFEFFFAFCFDF9FFFFFBFFFFFCFF - FFFBF8F9F5F7F9F3FFFFFCFFFFFBFFFDFBFFF9FBFFF5F9600000770005810106 - 7F01067E06077602017901018200018700018900018700018000027F00028000 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068200007F00017D02008001008200008400018000017D000474 - 01046A05075000005507083E00004D0D0D3700004105053E0000470005400000 - 51070B3E00004F0A0D3C00004805083F00004402033A00004D090A3C0000510B - 0B3E00004E06064E00006203006C03007003017504027A02027E020282000183 - 000087000187000187000187000187000186000186000186000097100E7E0000 - 7502006B00007D00006D0909FFFDF7FFFFF8FCFFF8FBFFFBFAFFFBF1FCF4F0FF - F7E5F9EDEDFFF9F1FFFBF3FFFEF7FFFEF9FEFFF9FFFEFAFEFFFAFFFEFCFEFFFC - FEFEFCFEFFFCFEFEFAFEFFFAFFFEF9FEFFF7FFFEF7FFFFF7FFFEF9FEFFFAFFFE - FAFEFFFAFFFEF9FEFFF9FFFEF9FEFFF9FFFEF9FEFFF9FFFEF9FEFFF9FFFEFAFE - FFFAFFFEFAFEFFF9FFFEF3FFFFF2FFFEF2FFFFF2FFFEF2FFFFF2FFFEF2FFFFF2 - FFFEF3FFFFEBF9F7EFFDFCF3FFFFECFAF9F3FFFFF3FFFFDFE7E6F5F4F0FFFCFA - FFF8F95500046F01077F070B6A00006F00007802017D01018600018900018B00 - 018900018200027F00028000018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008702047F00017D020080010082 - 00008400018000017D00047401046500025C0404450000500A0A390000460808 - 3500004103033F00004904073E00004D080B3C00004C08093F00004701024500 - 004D050542000055090A4500005A0A094E00005F03026F03027903027A02027E - 02028101028400018600008800008B00018B0001890001870001870001860001 - 8600018700019102047C00008408087A0203850107730E10FFF6F2F8F9F0F6FA - F4FBFFFCF0F6F1F1F7F2FBFFFCFBFFFBF3FAF5F9FEFCFFFEFFFFFDFFFFFDFFFF - FDFFFFFDFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFCFFFFFDFFFFFDFFFFFDFF - FFFDFFFFFDFFFFFDFFFFFCFFFFFCFFFFFDFFFFFDFFFFFDFFFFFDFFFFFDFFFFFD - FFFFFDFFFFFDFFFFFDFFFFFDFFFFFCFFFFFCFFFFFDFFFDFEFFFAFFFFFBFEFFFA - FFFFFBFEFFFAFFFFFBFEFFFAFFFFFBFEFFEEF3F6F4F7FBFAFFFFFBFEFFFAFFFF - F8FBFFFAFFFFF8FFFCFFFFFBFFF7F54B00026300027D080B740000850D0E7B01 - 017F00018700018D00018D00018900018000027F000280000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020383 - 00007F00017D02008001008200008400018000017D0004740104690406530000 - 5002033F00004808083700003F03033C00003F01013A00004606063900004806 - 073D00004B02044800004C00004C00005804065100006407085A000067060869 - 01027901028000018200018400018600018700018A00028C00028B00018B0001 - 8900018700018400018200018200018600018B00008B00008405067F04067B00 - 00690005FFFAF8FFFFFBFFFFFCFCF0F03020211400011C04061B00001E000221 - 02051B01071901091B00091B00091B00091D00091D00091D00091D00091D0009 - 1D00091B00091B00091B00091B00091B00091D00091D00091D00091B00091B00 - 091901091901091901091901091901091901091B00091B00091D00091D00091D - 00091D00091B00091D00091B00091D00091B00091D00091B00091B0007220710 - 2A0D161B00091700031500033C1F28F8E9EDF4FBF6FDFDF7FFF9F74F090A6D07 - 0C7200007600017700007F00018200018900018D00018D00018700017F00027D - 00027F00018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02004100004501023C00003E02033D00024300034C00014B000239000037 - 05003400004D03007200008500027F00017D0200800100820000840001800001 - 7D00047401046702045800004900004802023F00003F01013900003B02013901 - 003A02013800004002023E00004502014800004E00005100005800005B000066 - 01036800007003057002047A03047E00008200008400008500008700018A0002 - 8B00038C01048900018700018600018400018000017F00017F00018200018A00 - 009106097000007E060A7F00066A030AFFFBFBFFFDFAFFF7F7FFFDFE13000020 - 01042400012700003000042900002200011E00011E00011E00011E00011E0001 - 1E00011E00011E00011E00011E00011E00011E00011E00011E00011E00012000 - 012000012000011E00011C00011C00011B00011B00011B00011B00011C00011C - 00011E0001200001200001220001230001230001250001230001250001230001 - 250001230001250001270005250001230001390C15230001250001FFFBFFFAFE - F9FEFEF8FFFBF94C030570060C6B0000890B107E00008000018600018B00018F - 00018D00018600017D00027901027F00018000018000018000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003A01003B00004501024100004001033A00003F000443 - 00034D00024800003D04033200003905004900007500018400017F00017D0200 - 8001008200008400018000017D00047401046803055500004D00004300004404 - 043B00003C00003A01003704013303003904013700004202014200004C000052 - 00006103046703036E01037401047900047E0103800103830003840001860001 - 8600018600018600018700018700018600018600018400018000017F00017D01 - 017B01017B01017D01018100007D01016F03026A02037501085D0308FFFDFBFB - FFFCFFFFFEFFFEFF1E0B0E1C01052F060D2900023D09102E00022E050A1E0000 - 39161A2200032A070B1F00002D0A0E2200033C191D1E00002D0A0E2704082C09 - 0D1E000027040823000231090E2A0207310C101E00002D0C101E00013112151B - 00002B0C0F1B00002B0A0E1F00022F0C102400032D050A25000132060C250000 - 43151B25000035070D2500003F111725000032040A2C000634060C2700013608 - 0E27000135070DFFFBFCFFFEFBFFFFFBFFFAF957060971000680000483000385 - 00038400018700018D00018D00018B00018400017801027601027D0101800001 - 8000018000013F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013900004005033D00004A - 06073700004206073A00004400044B00004D02043500003C0A04300000510703 - 7000008601037F00017D02008001008200008400018000017D00047401046601 - 035B03034500004C06063A00004305053700003C030236030038080432000040 - 05033C00005005034F00005E02016802036F01037700037D0002820002870003 - 8A00038A00038600018600018600018400018400018400018400018400018200 - 018000017D01017B01017901017802017802017901017F00007B01016D030268 - 0203710108590408FFFEFBF8FFFCF6FBF9FCFAFA100305130000200004230000 - 2F01072700002300002501012000001F00002604042200002402021E00001E00 - 002A08083715151E00001E00002301012000002200002300002300002200002F - 0B0B1E00001C00001B00002C0E0D1C00002608071C00001E0000200000220000 - 2300002B0304280001230000230000391112240000320A0B2300002300002400 - 00230000270000230000290102230000270000FFF8F7FFFEFAFFFEFBFFF8F95E - 04097700068400048600038800038600018700018B00018D0001890001820001 - 7601027402027D01018000018000018000014201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003C03023600004C08093C000048090B3500004404094100014E0003440000 - 430A092E0000410D074300007904058300007F00017D02008001008200008400 - 018000017D00047401046904065100005305063E00004B0B0B37000040040439 - 00003E07043400004508043A00005107054900006509086703036F0103770001 - 7D00028400028700028B00019000028E00028700018400018400018200018200 - 018200018000018000017F00017D01017B01017901017901017802017802017B - 01018500008400017402026F01037900085D0308FFFDFBFAFFFCFAFFFEFDFFFE - 140E0F110305210B0D1B00012E0D112100002B070729060334110E200000300F - 0C2403001D00002809063314112203002706031E000045221F20000039131122 - 00003A13112400003812102805022E0D0A1C0000270A061900002005011B0000 - 341512270603401D1A22000038110F220000300F0C1B00002E110D1B00002A0D - 091C000030130F1B0000270A06230602290C081D00002B0E0A1D0000290C08FF - FDF9FFFDFAFFFCFBFFF7F96303097A0006870004860003880003860001860001 - 8900018B00018700018000017601027402027D01018000018000018000013E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023800004308063C00004F0B0C370000460A0B - 3700004500054A0000500507330000410F09300000560C086D00008702047F00 - 017D02008001008200008400018000017D00047401046500025D050545000052 - 0C0C3900004709093500004104023E00004A0704400000580B084A0000680C0B - 6200007408077601027D00028200028600018900018D00018F00018D00018600 - 018400018200018200018000018000017F00017F00017D01017D01017B01017B - 01017901017901017802017F00018A00008B00007B0101770001800006660207 - FFFCF9FFFFFBFAFBF7FCFAF90C04040C00001601031500001F04071900001B00 - 002A0D081B00001900001E05011A02001500001500001500009A847E8A716DD9 - C1BBD9BEBAFFFDF8FFFDF91C00001E00002D0D081C0000190000170000150000 - 1D09049E8C85FFFEF998857E1903001700001B000032140F2B0A071E00002003 - 001900002106021E04001C01001900001E03002B110B1A00001900001D020019 - 00001F04001900001D0200FFFAF5FFFDFAFFFCFBFFF6F9650309780006860004 - 8500038500038200018400018700018900018700018000017801027601027D01 - 018000018000018000014201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003C0302350000 - 4D090A3C00004A0B0D35000045050A4100014F0004430000450C0B2E0000420E - 084300007A05068200007F00017D02008001008200008400018000017D000474 - 01046A05075000005507083E00004D0D0D3700004105053F00004D00004C0000 - 610A08520000710F0F610000780A0A7500017B00028000018200018400018700 - 018700008900008700008400018200018200018200018000018000017F00017F - 00017F00017F00017D01017D01017D01017D01017D0101840001910000920000 - 8400017F00018800066F0107FFFAF9FFFFFBFFFFFCFFFEFC1F0D0C180302250B - 0B1B00002D0E0F1C00002613100E00000C0000110700180F0B090100A39D98CE - C8C1FFFFFBFFFBF4FFFFFBCBC3BCB8ADA9FFFFF9BFB0AD1F0F09271411120000 - 251613100400180D099A948DFFFDF8F3F1E9FFFEF9FFFFF9FFFAF58B837C1F13 - 0F0E00001502001E0803280C0B1B00002D0F0E1B0000381A191B00002A0C0B1B - 0000260807230602290B0A1D00002B0D0C1D0000290B0AFFFDFBFFFDFAFFFCFB - FFF7F96204097500067F00047E00038001037D01017F00018600018700018700 - 018200017901027801027F00018000018000018000013E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023800004207053C00004D090A37000045090A3800004500054A00 - 004F04063300003F0D07300000540A066E00008702047F00017D020080010082 - 00008400018000017D00047401046500025C0404450000500A0A390000460808 - 350000480202550000690304600000790C0E690000800B0C7300007E01038001 - 0281010282000182000182000082000081000081000082000182000182000182 - 00018200018000018000017F0001800001800001800001800001800001800001 - 8000018600008E00008D00007F01007C00008700056F0105FFFBF8FFFFF9FFF9 - F6FFF7F61803021700001E00001C00002604051B00001200000F0200160A0809 - 0000918A87FAF5F2FFFFFCAFACA87A7773787571787370FFFFFCD9D0CD8B7F7D - 1306040E00001000001001001B0E0C090000D6CFCCBAB7B3878682848581F7F8 - F40C0B0784817DC4BDBAFFFFFCC1B4B2A492911300001A00001C00001E00001E - 00001C00001C00002000012303041D00001C00002000011C00002202031C0000 - 200001FFF7F7FFFDFAFFFDFBFFF8F95C05096E00067900047700037902037802 - 017B01018200018700018700018600017D00027B00027F000180000180000180 - 00014100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003B02013800004905063C00004506 - 083600004202074200024E00034600004007062E00003D090346000077020383 - 00007F00017D02008001008200008400018000017D0004740104690406530000 - 5002033F00004808083700003F03034900006801047100007D06077300008508 - 0A7A00008404057E00008301028101028002017D02007D02007A01007801007A - 0100800001840001840001820001820001820001820001800001820001820001 - 8200018200018400018400018600018400008100007B03006F04006E03007C01 - 05660305FFFCF8FFFFF9FFFFFBFFFEFB240D0B1E02012A0B0A220000340E0E21 - 0000290C0F291216715C5FFFFCFFFFF7FAFFFDFF8C7F81180B0D180B0D241719 - 1507091302051C090C1200001600031B02062E1317170000967D81FFFBFE8F7E - 81140709090000867E7FFFFEFF090000180B0D120104180306957E82FFF9FDFF - F4F991717629090E1B00001B000046262B1B000023030823030826060B230308 - 29090E1D00022B0B101D000229090EFFFCFEFFFEFBFFFEFBFFF9F95506096701 - 067201047100037303037203017602018000018600018900018700018200027F - 00028000018000018000018000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003A01 - 003D02003F00004501023C00004001033D00004100014700014701023900003B - 04013900004F02006C00007E01037F00017F01008001008200008000017F0001 - 7901027201046802035D00005000005101004B00004B00004700005600007403 - 068203057D00008100037C00008300038000008301028301028101028002017D - 02007B0200780100770200780100800001820001840001820001820001820001 - 8200018200018200018200018200018400018400018400018600018200007C01 - 007404006B05006C03007A0105640305FFFDF8FFFFF9FFFBF6FFFAF61A03011B - 00002400012000002804041C0000190002FFEDF19D868A917A7EFFF6F9190407 - 120000120000190407120000160003170004150000150000250A0E1700009C80 - 86FFEEF4D6BCC2998287847075FFF1F59E8F93897B7DFFFCFF1406080E000012 - 000020090D1500001A00039C7E83DFBFC4FFF7FCE3C2C99A7C8119000125070C - 1900011900001B00031900001F00051B00002100071B0000210006FFF7FBFFFE - FBFFFEFBFFF9F95506096801067201047100037103037003017403017F000186 - 00018900018900018400018000017F00017F00017F00017F00014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003C00003B00004202013F00004302013E00004101013E - 00004002023F02004106043D00004802024E00006302046F01037D0002820001 - 8200017F00017D01017901017403017002026B01006500006100006300006A03 - 016D06046F03026E00007B000280000180000180000180000180000180000180 - 00018000018000018000017F00017F00017F00017D01017F0001800001800001 - 8200018000018000018000018000018000018000018000018000018200018200 - 018200018200018000017C0100790200760201770001850006690207FFFCF9FD - FFFBFEFFFAFFFFFC260E0E1C00002E060B300B0D1C0000170201FFFBFC938384 - 180607D6C4C598838513000021090B1F04072B101317000024090C22070A2409 - 0C150000331B1D887274FFF2F59C8B8E958487C0AFB2FFFCFF7D6F712413168D - 7D7EFFFCFF857576322021100000210F101402031F0B0A19040323080B1B0001 - 927479FFFAFDFFFBFF8D727523080C190001290E1217000034161B1B00002C0C - 111C00003E1A20FFF2F5FFFEFBFFFEFBFFF8F95C05096F000679000477000377 - 02037203017403007D02008200008700008700008600008000017A0000790101 - 7901017A02023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013B000040050338000047 - 07063C00004706053C00003D02003A0100400705390000490807430000580507 - 5600006A03067D00028400018200017F00017B01017602017203017003016E01 - 006B00006B00006F00007802017B03037D01017C000080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017F00017E00007B02007B00027E - 00038800066B0108FFFCF9FAFFFBF3F9F4FFFFFC1500001E0000340C111E0000 - 170000D7C5C49285830B00009A8B89FFFCFB1300001F07071900001900001F00 - 011900001A00001700002A10109D8585FFF2F1D1BFBE180B0D73686AFFF7F992 - 87890B0000887B7DFFFDFEFFFDFEFFF1F2FFFDFEF1E2E09182800C00000D0000 - 271B171000001800022005081500001D0507957D7FA48E90FFFCFEC5AFB1907A - 7C2810121700001900001F00032605091F0000FFFAFDFFFEFBFFFEFBFFF7FB5E - 04097300067F00047C00037A02027403017603007D0200820100870000870000 - 8400008001007B00007A00007D01017E02024201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003E0202360000470A083900004D0A093A00004606053A00003D0402360000 - 470C0A3A0000540A0A49000060070A6600027D00028600018400017F00017B01 - 017802017403017203017102006F00006F00007300007A02027E04047E02027D - 0000800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBFBFFFCFFFEFA - 1C0406300D112800052300043A2020FFEEED0F00001D0E0CC2B3B19D8B8A220D - 0C1500002A1010200606280C0C2004042206062B1111C2AAAAFFFBFA9B86850E - 0000877F80C3BEBF251F20827C7DD5CDCEFFFEFFFFF7F7FBF1F1FFFEFEFFFEFE - FFFEFCFFF6F4FFFEFCBFB3B1877C780C00001702041B05071500011200001B06 - 081200002D181A988385CCB7B9FFFCFED0B5B81C00023011141C0000351216FF - F5F8FFFEFBFFFEFBFFF8FB5E04097500068000047E00037E0202780201790200 - 7F01008400008700018700018400018200018800048900048800038700023E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023A00004308063700004C0C0B3C00004B0A09 - 3900003E03013800004209073500004E0D0C4200005C090B5300006A03067F00 - 028600018400018000017D010179010176020174030174030172010073000077 - 01007C0202800404800102800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017E00007B02007B00027E00038800066B0108 - FFFCF9FAFFFBF9FFFAF7F4F01C04062000012200002200038A70709B87861A08 - 07190706FFF5F4998584150000190101210707170000190000170000907676FF - F2F2A89392120000200C0B0C00000500000202027D7B7BF6F4F4FDF8F9F2EDEE - FFFFFEFFFFFEFFFCFBF2EDECFFF9F6FFFBF8FFFFFCFFF9F6FFFFFBFFFFFB9484 - 851000002210110E000019090A1404050E00000F0000160405150002D0B8BAD5 - BABD1B00001C00001C0000FFFCFEFFFEFBFFFEFBFFF9F95E0409750006840004 - 8300038100037D01017D02008001008400008700018600018000018000018A01 - 058D00048C00038B00024201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003E0202350000 - 480B093900004F0C0B3A00004707063A00003D0402340000470C0A3A0000550B - 0B49000060070A6500017F00028600018400018200017F00017B010179010178 - 02017802017802017800007B01017E0202810203810102800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017E00007B0200 - 7B00027E00038800066B0108FFFCF9FAFFFBF9FFFAFFFFFC20080A1E0000370F - 14240105FEE4E49D8988180403120000FFFDFC8A7272371F1F170000290F0F17 - 00002E1414D8BEBEFFFCFC8B76751803021200001F0D0C1C100E9A9898EFF1F1 - FDFFFFFDFFFFFFFFFFFFFFFFEFEDECFDFBFAFFFCFB888483DCD7D4FFFFFCFFFC - F9FFFFFCFFFFFBFDF4F0F9EDEDFFFEFEB9ADAD867C7C180E0E1107071C10100C - 0000100001100000978183C7AFB133161927080B27060AFFFCFEFFFFFBFFFFFB - FFF9F95C05097700068700048600038700038000018000018400018600018600 - 028200027B00027B00028200028500018600028700033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023A00004207053700004A0A093C00004A09083A00003E03013800 - 004007053500004B0A094200005906085300006902057F000286000186000182 - 00017F00017D01017B01017901017901017901017B01017D01017F0001800001 - 8200018200018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017F00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBF6FC - F7FFFFFB1500001E00002A02071E0000FFFCFC897574200B0A1C0404D7BFBF99 - 7F7F170000240A0A170000967C7CFFFCFC856D6D130000210D0C170302100000 - 948583BCB0AEF7F5F5FBFFFFFBFFFFFBFFFFF7F9F9F1F3F39C9D9B7F7D7CFFFF - FE110D0C040100050000CCC5C2FFFFFCFFF8F4FFFFFBFFFEFEFFF7F7FFFFFEFF - FFFEF5F0EF7F77779189890900001D0F100E0000120000FFFCFE170000190000 - 240508F7E2E1FEFFFBFFFFFBFFF9F95C05097800068900048A00038A00038400 - 018200018400018400018200027F00027601027402027A02067A020378000375 - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003D01013800004407053900004A07 - 063B00004404033B00003B02003600004207053A00004F05054A00005C030666 - 00027F00028600018600018200018000017F00017D01017B01017A00007D0101 - 7D01017F00017F00008100008300008400018200018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000017F00017E00007B02007B00027E00038800 - 066B0108FFFCF9FAFFFBFBFFFCFFFFFC1F07092C090D220000280509FFF1F190 - 7B7A240C0C170000907676FFFCFC2F1515170000FFF6F6DFC7C7200808130000 - 220D0C120000210D0C9C8A89FFFEFCFFF6F4FEFCFCFDFFFFFDFFFFFBFDFDC5C7 - C70000000D0E0C807E7DFAF6F5070201140D0A1B120F160A08998C8AFFF3F0FF - FCF8FEF6F6FFFFFEFBF7F6FFFBFAFFFFFEFFFEFDFFFEFDFFFEFE7C70701D0F10 - 8A7879FFFCFE1700001F02053A1B1EFFFDFCFCFFFBFFFFFBFFFAF95C05097800 - 068900048C00038C00038400028200028200028200027F00047900047002046B - 03046C07096806066300025F00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00003C00 - 003D02003C00004202014100004302013F00003C01003900003C03013A000043 - 02014600005200015700016700037D0002860001840001820001800001800001 - 7F00017D01017D00007E00007F00018000018000008200008400008300008200 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000017F00017E00 - 007B02007B00027E00038800066B0108FFFCF9FAFFFBF0F6F1FFFFFC1500001E - 00002700041E00009A8080D0BBBA170000220606200404FFEDEDA187871E0404 - 977F7F1300001300001C0807120000968281FFFDFC837170796A68FFFEFCFFFE - FFF8F8F8FEFEFE8A8A8A0000008E8E8E020000040000FFFFFE0D03030C00000C - 00001200001200009D8684FFFEFBFFFAFAFFFFFEFEFCFBFCFAF9FFFFFEFFFFFE - F3EEEDFFFEFEFFFEFEFEF0F1FFFDFED0BABC1800021900001B0000FFFCFBFAFF - FBFFFFFBFFFAF95A05097800068900058A00038A00038400028000028000027D - 00027900047201046902056204055805045404035202015101004000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00003C00003B00004003013E00004502013F00004101003C - 01003B02003700003D02004000004C02024D00005800026801047B0002840001 - 8400018200018000018000018000017F00018000018000018000018200018200 - 0184000186000184000182000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000017F00017E00007B02007B00027E00038800066B0108FFFCF9FA - FFFBF9FFFAFFFFFC250D0F1E0000340C111E00002D1313FFFDFC2105051B0000 - 270B0B1F0303FFF6F69B8181240C0C130000230E0D120000FFF1F0FFF9F8A795 - 94100000251312FFF7F5FFFEFF8D8788040000140F10B6B1B2FFFEFF807B7A07 - 0000FFFCFC0F0102210F0E1300002F15151900002F100FFFFDFB918787777574 - C5C3C2FCFAF9FFFFFEFFFFFEFFFEFDFFFEFEFFFEFEFFF3F4FFFDFE8973753119 - 1B19000026070AFFFCFBFAFFFCFFFFFBFFFAF95A050977000686000487000286 - 00048001037C01038005097901057605096700015D00024F00004C0202450201 - 4300004000003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00003F01013B000040050338000047 - 07063C00004706053C00003D02003A01003D0402350000490807430000540103 - 5300006A03067901028200018200018200018000018000018000018000018000 - 0180000182000182000184000184000186000184000182000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000017F00017E00007B02007B00027E - 00038800066B0108FFFCF9FAFFFBFBFFFCFDFAF61800021E00002E060B1E0000 - 1B0101907B7AE2C6C61C0000190000170000907676FFFCFC846F6E220E0D1200 - 009A86859E8C8B100000100000120000170302998A880B00000700008D8586FF - FEFFFFFEFFFFFAFB948C8C0B0101FFFDFE1000001803021700002E0E0F200000 - 240000997B7ABEB2B21915140400000E0A097F7B7AF0ECEBFFFFFEFEF6F6FFF5 - F5A89A9B816F701701031700001900002C0D10FFF9F8FBFFFBFFFFF9FFFBF859 - 060875000684000583000381000577000179070770000078090D630000660509 - 5100004B00003E00003D00003F00004303024201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073C - 00003E0202360000470A083900004D0A093A00004606053A00003D0402330000 - 4409073A0000540A0A4900005C03066500027801028000018000018000018000 - 0180000180000180000182000182000182000182000184000184000184000184 - 0001820001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018000018000018000017F - 00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBFBFFFCFEFBF7 - 1800022100022800052502061B01011E0908D2B8B8DBBFBF270B0B170000331B - 1B897473FFFDFCD2BEBD210D0C1000001804038F7B7AFFFCFB8D7877200B0A12 - 00009B8E90CCC4C5FFFAFBFFFEFFF3EBECFFFAFB9187870B0000FFFDFE120000 - 1901011B00002D080A2800022800002C0808FFFDFE847C7C1914130500001813 - 12CDC5C5FFFEFE8B81811608090E000029141617010323080B1B0001250609FF - FDFCFDFFFBFFFFF9FFFBF85906087200078000067D00047A0206710406630000 - 70090C5B000068090D4F00005304074500004B02044701024500004200003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004002023A00004308063700004C0C0B3C00004B0A09 - 3900003E03013800003F06043500004E0D0C4200005906085000006A05077601 - 027F00017F00017F00017F000180000180000180000182000182000182000182 - 0001840001840001840001820001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000017F00017E00007B02007B00027E00038800066B0108 - FFFCF9FAFFFBFAFFFBFFFFFC1E0608250206230000230004280E0E1300001900 - 00DAC0C0FFFAFA937B7B1300002E1A19120000907C7BFFFDFCCEBCBBD5C1C0FF - FDFC927D7CFFF8F8230B0B8F7A79F3E6E8FFFEFFFFFEFFFBF5F6FFFEFFFFFEFF - 756D6D160C0CFFFCFD1604051F07071E000027020428000037080A2200009781 - 83C4B8B8140808090000110707FFFCFC7F73730C00001F0F101000001B050715 - 00001C00021B00001C0000FFFAF9FEFFFAFFFFF9FFFAF85707086F01077A0006 - 760104710406620000650908500000630A0D4C000057080B3F00004502054400 - 004700004700004A01034201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003E0202350000 - 480B093900004F0C0B3A00004707063A00003D0402330000450A083A0000560C - 0C4900005D04076500027601027D01017D01017D01017D01017F000180000180 - 0001800001800001820001820001820001820001820001820001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018000018000018000017F00017E00007B0200 - 7B00027E00038800066B0108FFFCF9FAFFFBF0F6F1FFFFFC1A02041F00002200 - 001E0000260C0C1500001F07071B0101917979FFFDFCDEC9C88B777628141312 - 00001C0A098B79788B7776170201281010FFEDED2C1010917C7BFFFDFFFFFEFF - FFFEFFFFFEFFFAF8F8F2F0F07D79780B0605FDF3F31B0B0C1A05041900002702 - 04230000330708260000190103FFFDFE1000000E0000958586FFFDFE16060718 - 08091B090A1200001901031700002D0E112D0C102C0B0FFFFCFCFFFFFAFFFFF9 - FFF9F75406076A00067400056C01036705055A04044B000057090A4500005508 - 0B3E000046060B3D00004801044B00034900014600003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023A00004207053700004A0A093C00004A09083A00003E03013900 - 003E05033500004C0B0A4200005704065100006904067402027B01017B01017B - 01017D01017D01017F0001800001800001800001820001820001820001820001 - 8200018200018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000017F00017E00007B02007B00027E00038800066B0108FFFCF9FAFFFBF5FB - F6FFFFFC1600001E00002A02071E00001C02021601001500001B030313000012 - 0000988483D2C0BFFFEEEDD1BFBE1000001200002C1716150000170000FFFCFC - 1E0000897171FFFEFFF8F8F8FFFFFFFDFFFFF3F5F5FDFFFF979896020000FFFA - F9160A0A1200001700002A0A0B2200002700002600001A00008F797B97818312 - 00008F7A7C8671732D181A1200001601031F090B250A0D1900001B00001C0000 - 200001FFFCFCFFFFFAFFFFF9FFF9F75305066500046D00036400005B04024B00 - 004D08053C00004C08093C00004807093400003D04073D000043000045000148 - 01044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003D01013800004407053900004A07 - 063B00004404033B00003C03013500004106043B00005006064900005B020564 - 01037202027901017901017B01017D01017D01017F00017F0001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000017F00017E00007B02007B00027E00038800 - 066B0108FFFCF9FAFFFBFBFFFCFFFFFC1B03052603072800052100021D030312 - 000025100F130000341F1E150100100000DCCDCBFFFEFCD7C8C6877574A69291 - 130000150000391D1DFFFBFC240405A89090FFFEFFFAFFFEF6FBFAFAFFFFFAFF - FFECF4F36C7370050A08FFFFFE0700001306041702012509091F000026000022 - 00002D0E111B0003FFFCFE150000DAC2C48973751600022C1618130000190103 - 1800002104072F101328070B260307FFFAFAFFFEFAFFFFF9FFF8F65204056100 - 026600005B00005301004502003B00004407053700004506083500003A040935 - 00033F05063F03043D01023900004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00013C00 - 003D02003C00004202013F00004302013F00003E01003C00003C01003B000045 - 04034500004D00005000006104056F02047602017801027901017B01017D0101 - 7D01017F00018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000017E00 - 007D02007B00027E00038800066B0108FFFDF9FAFFFBFBFFFCF5F2EE21090B2A - 070B220000210000230909130000170000260C0C1500001702011D0908837170 - FFFEFCFFF1EFFFFEFCFFEEEDFFFDFCFFFDFCFFF0F3FFFCFC230407846E70FAF6 - F5FAFFFFFAFFFFF2FAF9F7FFFEF8FFFF818885000100FFFFFE070000190C0A1A - 06051700001C00002904062000001B0000170000D2BABCA08A8CC8B2B4250F11 - 1300001500001700011F04071900001C00001E00011C00001C0000FFFCFCFFFE - FAFFFFF9FFF8F74604055300015900015000004B00004101003E04003B00003F - 03033B00003E03073700033702053600003800003A00013D03044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000013E00013D00004201033E00004201033E000041000240 - 00003E00013D00004201033E0000430003410000460002500000670003700000 - 7300037601027A02037C01037E01038001038000018000018000018000018001 - 008001007F01007F010080000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000017F00008001007D00027F00038A00066B0108FFFDF9FA - FFFBFBFFFCFFFFFC230B0D23000430070C2400012C0D0E1C00002E0F0E1E0000 - 200001270B0B2208081300001F0D0E1202031D0D0E1303041303041F0D0E1B06 - 091300003922267D6D6EFFFFFEFBFFFEF8FDFBF9FEFCFBFFFEF9FCFA7A7B790B - 0706FFFEFE11050519090A18020426090C2000032C070B240203270B0B150000 - 857170FFFDFCFFFEFC0E00002C1A1913000022080822030429090A2000002B0B - 0C1D0000270B0BFFFDFCFFFDFBFFFEFCFFFBFC2F00023C000143000049010144 - 00004300003F00004003013C00004002023A00003D01023C0001410204400103 - 3E00013B00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004A00015F00006B00006E00027401047801027901027D00027E00018000 - 018200018200018200018001008001008001007F010080000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018100008001007F00027F - 00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E0000290003230000 - 2304051B00002000002F09092803051C00001E0202947F7E7967680F0102897B - 7C867A7A86787A8E8082938285857477867376978A8CFFFDFCF9FEFCF3F8F6F4 - F9F7FDFFFEFFFFFE888483050000FFF9F90C00001100001300001C00021C0000 - 2000011C0000190000200B0A210F0EFBECEAC7BAB81205030E00001804031A00 - 001C00002200011E00002202031900001B0101FFF9F8FFFBFBFFFEFEFFF4F42D - 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605074500005700006300006800016F01037401 - 047800037B00007C000082000284000284000184000182000080010080010080 - 0100800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018100008001007F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC - 240C0E23000433070D2500012D0E0F1E00002500002B03042000001C00001C02 - 02DFCAC99A88890E0001FFFEFEFFFEFEFFFDFFFFFBFDFFFDFFFFFDFFFFF9FCFF - F4F6FFFDFCFDFFFEFDFFFEFDFFFEF4F5F3F5F6F48682810E0606FFFEFE120405 - 1D080A1B0305270A0D2000032A070B230206280C0C190101120000E3D4D2C3B6 - B41508061C0D0B1804032509092404052C0A0B2000002C0C0D1D0000250B0BFF - FDFCFFFEFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 - 490908370000480A0A3700004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004701025000 - 005A00006200006A02037002047700037B00007D000084000286000286000186 - 0001840000820000800100800100800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018100008001007F00027F00038A00066B0108 - FFFDF9F8FFFBF6FCF7FEFBF71A02041E00002900032300002304051B0000350F - 0F230000200000270708170000D9C5C48676770B0000FFFAFAFFFEFEFFFEFFFA - F2F3FFF7F9FFFDFFFFFDFFFFFEFFFFFFFEF7FAF8FFFFFEFFFFFEFFFFFEFFFFFE - 85807F070000FFF9F90C00001300001500001C00021B00001E00011C00001900 - 001F0707120000948583FFF8F60C00001000001300001A00001C000024000120 - 00002402031B00001B0101FFF9F8FFFAFAFFFEFEFFF0F03210102B0000460D0C - 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706084100004A00005100005901016302046D02047401047C000381 - 0003860002870002870001870001860001840001820001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001810000800100 - 7F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E2300043307 - 0D2500012D0E0F1E00002B0505230000351012220203170000D8C4C38F7F8009 - 0000FDF5F5FFFFFEFFFEFFFFFDFEFFFEFFFFFAFBFEF6F7FFFDFEFFFFFEFEFFFD - FCFAF9F8F6F5FBF9F8FFFFFE928D8C110909FFFEFE1404051D080A1B03052409 - 0C1F000328070B2302062B0F0F1600001E0A09897A78FFFCFA0D00002D1B1A13 - 00002408082404052E090B2200002E0C0D1D0000250B0BFFFDFCFFFEFEFFF9F9 - FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C - 0C3700004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004301024300004A00005101005C - 02026602027002047B0004820004860002890002890002870001860001840001 - 8200018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018100008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FC - F7FDFAF61A02041E00002800022300002304051B00002D0707230000330E101D - 00001C0202D6C2C1928485070000FFFFFEFFFFFEFEFCFCFFFFFFFFFFFFFFFFFF - FDF8F9FFFDFEFFFBFAFFFFFEFFFFFEFFFEFDFFFFFEFEF9F87D7575090000FFF9 - F90E00001300001300001A00021900001E00011C00001900001B030312000027 - 1514FFFDFB0E00001000001601001C00001E00002400012000002402031B0000 - 1B0101FFF8F7FFFBFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 - 00470703390000480B093700004709093A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00003E01004001004801005100005D00006A0002780004800005860004870002 - 8900028700028600018400018200018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018100008001007F00027F00038A00 - 066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E23000433070D2500012D0E0F1E - 0000300A0A230000220000220304220808CAB8B7877B7B070201FFFFFEFFFFFE - F8F8F8F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFFFEFDFFFDFCFFFFFEFFFF - FEBAB5B4312929090000FFFEFE1204051B090A19030524090C1D000327080B22 - 0306290D0D170000230E0D100000FFFEFC0E0000231110170201260708260405 - 2E090B2200002E0C0D1E0000270B0BFFFDFCFFFEFEFFFCFCFFFCFC2000003706 - 083600004505054200004401003D00004606053700004507073800004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00003E00003902003901003F0000480000550000630000 - 7100037C01058000048600048600028600028400028200018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018100 - 008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E - 00002900032300002304051B00002200002901022400011E0000150000D0BEBD - 8D8181050000F6F4F3FFFFFEFDFFFFFCFEFEFBFDFDFBFDFDF9FBFBFCFCFCFFFF - FEFFFFFEFFFFFEFAF5F48C87860803020700008A8282FFFAFA0C000010000112 - 00001901031700001C00021900001900001C0202190403100000FFFCFA1F100E - 1200001500001D00001E00002600012200002601031C00001E0202FFF9F8FFFC - FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 - 03013C00004002023F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100023C0000390401370200 - 3F04024300005301005900006600006D00007D02067F00048100037F00007D00 - 007D00007E00017F000280000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018100008001007F00027F00038A00066B0108FFFDF9F8 - FFFBFBFFFCFFFFFC230B0D23000432060C2500012C0D0E1E00002C0808240000 - 2E0C0D1D0000230B0BD5C3C28E82820B0605FFFFFEFFFFFEFDFFFFFBFFFFFBFF - FFF9FEFDFDFFFFFEFEFEFFFFFEFFFEFECDC5C50700001D1817080302C1BCBBFF - FEFEFFF9F9897D7D1F11121505061F0A0C1300002D1517160000270B0B250B0B - 261110867473FFFEFC0E00002E1A191500002607082503042F080A2400002F0A - 0C1E0000270B0BFFFDFCFFFDFDFFFEFEFFFCFC2402023201033A010042020242 - 00004300004000004202013C00004002023C0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00003D01023701003A07043500004807064300005903035900006600007201 - 047700037A00037B00027C00017C00017D00027D00027F000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 018000018000018000018000018000018000018000018100008001007F00027F - 00038A00066B0108FFFDF9F8FFFBF6FCF7FEFBF71A02041E0000290003230000 - 2304051B0000230000220000240203190000180302C9BAB8857979050000FEFC - FBF4F5F3FDFFFFE5EAE9FBFFFFFDFFFFFCFEFEFAF8F8FDF8F7847C7C0700000D - 0807898483FCF7F6FFFEFDFFFFFEFFFCFCFFFEFEFFFBFB7B6D6E908081B09E9F - 8570728F797B8E7474947A7A968180FFFAF99B89881000001200001500001D00 - 002000002600012200002601031C00001D0101FFF9F8FFFBFBFFFEFEFFF4F42D - 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073C00003D0504330000430A083900005109 - 094500005A04045A00006500026A00026E00027401047800047A01057A02037B - 00027F0001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018100008001007F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC - 240C0E23000433070D2500012D0E0F1E00002D09092300002C0C0D1C0000220D - 0CD3C4C28F83830B0605FFFFFEF3F4F2FAFCFCFDFFFFFBFDFDFFFFFFFFFFFF81 - 7F7F211C1B150D0D8F8A89FFFDFCFAF5F4FFFFFEFFFFFEFFFCFBFDF9F8FFFFFE - FFF9F9FFFBFBFFFEFEEDDFE0FFFDFEFFFCFEFFFCFCFFFCFCFFF2F2A28E8D200E - 0D1000003D292815000028080928030530090B240000300B0D200000290A0BFF - FDFCFFFEFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 - 490908370000480A0A3700004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004001033900 - 004209083500004A0D0B3A0000520A0A4500005402015700005D00006602026D - 02047103057502057902037901027F0001800001800001800001800001800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 00018000018000018000018000018100008001007F00027F00038A00066B0108 - FFFDF9F8FFFBF6FCF7FEFBF71A02041E00002900032300002304051900002100 - 00200000220203190000180302C9BAB8857979050000EBE9E8FFFFFEFBFBFBFE - FEFEFFFFFFBEBCBC04000004000005000075706FFFFFFEFAF6F5FFFDFCFDFBFA - FFFFFEFFFDFCFFFFFEFDF9F8FFFFFEFFFEFDFAF0F0FFFBFBFFFEFEFFF3F4FFF9 - F98C70702109091200001000001000001500002107071D000020000027000123 - 00002801031E00001F0001FFF9F8FFF9FAFFFEFEFFF0F03210102B0000460D0C - 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E0000420404390000490B0B3700004A0D0B39000049080744 - 00004A00005100005B01016201036B03047002047401047801027D0101800001 - 8000018000018000018000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001810000800100 - 7F00027F00038A00066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E2300043307 - 0D2500012D0E0F1C00002B09092100002C0C0D1B0000210C0BD3C4C28F83830D - 0505FFFFFEFFFFFEECEAEAFFFFFF817C7D0500001C1415847C7DFFFFFEFCF7F6 - F8F3F2FFFFFEFFFFFEF7F8F6FFFFFEF6F7F5EDEEECF8F9F7F7F5F4FFFFFEFFFC - FBFFFFFEF4ECECDACCCD170000240808260E0E1200002E1C1B1000001D080717 - 000027070828030531090B250000320B0D200000290A0BFFFDFCFFFDFEFFF9F9 - FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C - 0C3700004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A000042010341000048060739000048 - 0A0A350000430A08360000400503400000470000500000590101630101690102 - 6E00027500017D00028000018000018000018000018000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018100008001007F00027F00038A00066B0108FFFDF9F8FFFBF6FC - F7FDFAF61A02041E00002800022300002304051900002100001E000022020317 - 0000160201C9BAB8857979070000FDF8F7F8F4F39C97980500000B0506857D7E - D2C7C9FFFDFFE4DFDEFFFFFEFFFEFDF7F5F4FFFFFEFCFFFDF6F9F7FDFFFEFDFF - FEF8FBF9FDFFFEFFFFFEF9F7F6FFFFFE807C7B0C00001E06062307071500001D - 08071200001501001A05041700001F00002200002700012300002801031E0000 - 1F0001FFF7F7FFFAFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 - 00470703390000480B093700004709093A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A000044030540 - 00004802034200004705063700004108073200003A07043702003A0200400100 - 4900005100005B00006400006B00007300007D00028000018000018000018000 - 0180000180000180000180000180000180000180000180000180000180000180 - 0001800001800001800001800001800001800001800001800001800001800001 - 8000018000018000018000018000018000018100008001007F00027F00038A00 - 066B0108FFFDF9F8FFFBFBFFFCFFFFFC240C0E23000433070D2500012D0E0F1C - 0000290A091F00002B0C0D190000200C0BD3C4C28F83830D0505C9C4C38E8988 - 0E08090E0607CDC2C4FFFDFFFFFDFFFFF4F6FFFFFEFEFAF9FFFFFEF7F5F4FFFF - FEEDF0EEFDFFFEFBFFFEE8EDEBF9FEFCFAFFFDF6F9F7898A8802000017151409 - 00001D05051900002F151519040324100F1200002914131700002907082A0305 - 31090B250000320B0D2200002A0A0BFFFCFCFFFDFEFFFCFCFFFCFC2000003706 - 083600004505054200004401003D00004606053700004507073800004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004100014600014802034000004103033800003C0403 - 3701003904013A03003E01004200004900005000005800005F00006500007202 - 027601027601027601027801027801027901027901027B00027B00027D00027D - 00027F00027F00027F00027F00027F00017F00017F00017F00017F00017F0001 - 7F00017F00017F00017F00017F00017F00017F00017F00017F00018000018100 - 008000017D00027C0003830008660208FFFCFBFDFFFBF8FCF7FFFAF71C010420 - 00002600032000002304051B00002300002000002503041900001A0202CCBAB9 - 8678790900000904030702017F797AFFFBFCFFFDFFFCF1F3FFF7F9FFFEFEFFFF - FEF3F4F2FFFFFEFFFFFEFDFFFEFDFFFEF4F7F5FFFFFEFFFFFEFFFFFEC4C2C104 - 00000904030700000900001002031800001C00001800001500001300001F0A09 - 1500001F03031E00002000002600012200002601031E0000210102FFF8F8FFFB - FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 - 03013C00004002023F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E0000410002400001410001400000 - 4201033E00004001033C00003D01023C00003E00003F00004301024100004701 - 024500004A00014E00005500005A00005E02015C00006505056602026B05066E - 03057305077302057A05087700037D04087A00037F01067D00047C00017A0000 - 7D00027900007E01037900007D00027B00007C00017A00007D00027900007E01 - 037900007D00027D00007E00007D00017A020771000474010B580008FFFBFBFF - FFFCFFFFFEFFFEFE290A0B27000229090A1D00002C0E0D2100003A0D10290000 - 2D04092B060A331619C2ACAED8C8C9090000837E7DBFBBBAFBF7F6FFFFFEFFFF - FEFFFDFCFFFCFCFFFBFAF5FAF8F8FFFCFAFFFCF6FCF7FDFFFCF3F4F0FFFFFCFE - F9F6FFFDFA8A7E7C2A1B191000001F0A091C04042309091A0000270809210203 - 2509091C0000270B0B1E020224080820010226070823030429090A1E00002B0B - 0C1E0000290A0BFFFCFCFFFCFDFFFEFEFFFCFC2402023201033A010042020242 - 00004300004000004202013C00004002023C0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004200014400004C010046000055 - 05044C00005B05055700005F01026500026D040768000076070B6D00007C060B - 7500027A02077700037A05067100007D08097000007C07087300007803047500 - 017A05067100007D08097000007C07087300007B02067B00018002086E000372 - 080F6300035A0A11FFF6F8FFFEFCFCFAF9FFF9F92101022200001F0100170000 - 2306022000002500002800002500021C0000170000E7D2D4C4B8B8837E7DFFFF - FEFFFFFEF9FCFAF5F8F6F9FAF8FFFFFEFFFFFEFFFFFEFAFFFCF4FEF8F6FDF8FB - FFFCF2F6F1FFFFFCFFF8F59185831809071000001300001700002405061C0000 - 2100001C00001E00001B00001E00001B00002001021B00001C00001B00001C00 - 001B00001F00011B00002102031B00001F0001FFF8F8FFFAFBFFFEFEFFF4F42D - 0B0B2B00004108073D00004401004200004505013A0000450806370000440606 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073F - 00004300003E00004C07044000005308064700005604035100005A0000560000 - 6906085A000070090C61000072070A6B00036E0305660000750A0C620000760B - 0D6400007207096A00016E0305660000750A0C620000760B0D6400007207096D - 00017500026E000075090F5900006D0A12460000FFFBFCFFFFFCFFFFFEFFFEFE - 2B0B0C270002290B0A1900002E0F0C21000024040528090C2005081400011709 - 0A817979FFFFFEF5FAF8F1FAF7F4FFFCF6FFFEF6FFFEF8FFFEEFF8F5F5FCF9FA - FFFEF0F6F1F4FAF5FDFFFCFDFEFAFFFFFCC0BBB88A817E0D0000100000120000 - 2810101C02022001021D00002F0D0E22020328080922030428090A1E00002A0B - 0C200102270809210203270809230405290A0B1D00002B0C0D1D0000290A0BFF - FCFCFFFDFEFFFAFAFFFCFC1E00003A090B3300004707074100004502003B0000 - 490908370000480A0A3700004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004202023E00004809053900004E0E0A3C0000520B08 - 4200004F02004B00005704034C0000620A0A50000066090A5700006002035A00 - 00630605530000680B0A5300006609085500005F02015A000063060553000068 - 0B0A5300006609085500006300026400006D020555000064080D5000004F090F - FFF0F1FFFFFCF8FBF9FFFAF92101022200001F01001700002405021C00001F03 - 031500001200000E0000201616040000F3F6F4F9FFFDF6FFFEF0FEFAEEF9F6F3 - FEFBF6FFFEF8FFFEF6FDFAF2F7F5FFFFFCF0EFEBFFFEFAFFFFFC7B7471170E0B - 0E01001000001F0B0A1601001E04041900001B00001C00002301021E00001E00 - 001B00001E00001B00002001021B00001C00001B00001C00001B00001F00011B - 00002102031B00001F0001FFF8F8FFF9FAFFFEFEFFF0F03210102B0000460D0C - 3A00004502014100004808043900004A0D0B370000480A0A3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083C00003F0604350000 - 460D0B3500004B0E0C390000490807410000470101400000530909430000580A - 0B4700005505064B000050000147000057070847000059090A4700005404054B - 000050000147000057070847000059090A4700005404054E00005B0000530000 - 5C080A4700005C080D370000FFFCFCFEFDF9FBFFFEFFFFFE2B0B0C270002290B - 0A1900002E0F0C1F00002E14141701031A05070E00002418180F0A09939190FD - FFFEF7FCFAFAFFFEFBFFFEF8FDFBFBFEFCFDFFFEFFFFFEFFFFFEFFFFFCFFFFFC - BFB3B11205031407050E0000210F0E1300001B03031700002105051E00002606 - 071F00002C0A0B22000128080923030429090A1F00002B0B0C21010227070822 - 02032707082404052A0A0B1E00002C0C0D1E00002A0A0BFFFCFCFFFDFEFFF9F9 - FFFCFC1E00003C0B0D3300004808084100004502003A00004A0A093700004A0C - 0C3700004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004002023700003D0805320000430C093200004209073600004003013D00 - 004606053A00004D0A093C00004B08073E00004600004300004B05053E00004F - 09093E00004E08083F00004701014300004B05053E00004F09093E00004E0808 - 3F00004B01014E00005705044200004F090A420000440B0EFFF5F4FDFFFCF5FC - F9FDF9F82001022200001E00001700002405021C00001B00001900002E131619 - 03051402030E00000B00000900008C8484B4ACACD2CACACCC4C4C0B6B6C4B8B8 - CBBDBECCBEBFCABBB982706F1A08071200001200001C07061C0404170000280E - 0E1900001B00001B00001E00001C00002100001E00001E00001C00001F00001C - 00002101021C00001D00001C00001D00001C00002000011C00002202031C0000 - 200001FFF7F7FFFAFBFFFEFEFFF1F1310F0F2B0000440B0A3B00004502014100 - 00470703390000480B093700004709093A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053D00003A02013200003C07043000003E09 - 063300003D06033900003B02003800004207053700004508063900004306043E - 01004202023D00004706083A00004807093B00004504063F00004201033D0000 - 4706083A00004807093B00004504064000004800004400004707063700004906 - 09300000FFFEFCFBFFFCF8FFFEFFFFFE2A0B0C270002290B0A1900002D100C21 - 00003D161823000030080D2400031C00001B000045282B170000260B0E22070A - 1C01041B00012506092D0E1129080C1B0000250B0B230B0B220A0A1C02023F25 - 251700001900002408082307071B00002102032505063313142606072707081C - 000028080923030429090A1F00002B0B0C210102270708220203270708240405 - 2A0A0B1E00002C0C0D1E00002A0A0BFFFCFCFFFDFEFFFCFCFFFCFC2000003706 - 083600004505054200004401003D00004606053700004507073800004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00003E00013A01 - 003B04013801003C05023801003D06033A03003C05023800003A01003700003D - 04023900003F06043C03013E05043B00003D01023A00003E02033900003E0203 - 3B00003C00013B00003D01023A00003E02033900003E02033B00003E00003F00 - 00410200360000390100390000330406FFF9F7FAFFFCF3FCF9FEFAF920010222 - 00001D01001700002306021E00002500002F0107270000280002260002220000 - 2100002000002200012000002200002200002300002500002500002500011C00 - 001900001B00001900001B00001B00003213141B00002001021B00002303041C - 00001C00001C00002404051E00001F00001C00001F00001C00002101021C0000 - 1E00001C00001E00001C00002000011C00002202031C0000210102FFF8F8FFFB - FCFFFEFEFFF8F82907072E00003E05043F00004300004300004202003E000040 - 03013C00004002023F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100023E00013E00003B00003E02023A00003E02023A00003D01013A - 01003C00003B00003E02023A00003C03023800003B02013A01003C00013D0002 - 4000053C00014000053C00013F00043E00033E00033D00024000053C00014000 - 053C00013F00043C00013F040232000045120F2E000043090A290000FFFEFCF5 - FBF6F4FBF8FFFFFE1F00012B0406311514150000280D0922030230080A2A0004 - 31050B250000330A0F2600032D050A2500022F070C2700042F060B2500003509 - 0F2B000332040A2800022B090A2001022808091B00002C0C0D2000012707081F - 000028090A2001022708091B00002B0C0D1F00012607081E000028090A200102 - 2708091B00002B0C0D1F00012607081E0000240506270809290A0B1B00001C00 - 002A0B0C1B0000FFFCFCFFFDFEFFFDFDFFF8F82100004211133600004A0A0A3C - 00004300004000004202013C00004002023C0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004404043A000047 - 07073900004406063A00003F01013D0000420404380000430707350000420606 - 3800003D01013D00004202073A000045050A3900004404093C00003F00043F00 - 024202073A000045050A3900004404093C00003F00023900003F0B052B00003C - 0B09330000491A1CFFF0EEFDFFFCFAFFFEFCF7F6200001220000230A08130000 - 1C03001900002000011E00002100021E00002401051E00001E00011C00002200 - 031E00002300022000002601052200002400012200002200011C00001F00001C - 00002202031B00001E00001B00001F00011B00001E0000190000210203190000 - 1D00001900001F00011900001E00001900002102031900001D00001900001B00 - 001900002506072509092B0C0D1900001B0000FFF4F4FFFDFEFFFEFEFFE9E930 - 0E0E2B0000370000390000520F0E4200004505013A0000450806370000440606 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004301023B00004A08093A00004B090A3A00004705063E00004202023A0000 - 490909370000480A0A3700004406063E00004201033A00004A070A3900004B08 - 0B3900004704073E00004300033A00004A070A3900004B080B3900004704073C - 00003400003300004919152E00004E12132F0000FFEFEEFFFFFCFBFFFEEDE5E5 - 4222232200001C030112000028140F230E0C1B07061601031B06081400011D08 - 0A1601031A05071500021B06081601031C06081500011E080A1901031D05071A - 00022405061F00012405061D00002607081D01012304051C00002206061D0101 - 2206061900002408081B01012105051A00002206061B01012206061900002408 - 081B01012105051A00002C10101700001900001700001F0303190000472B2BFF - F5F4FFFBFBFFF8F8FFFCFC1E00004211133300004707073C00004502003B0000 - 490908370000480A0A3700004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033F00004A06073C00004F0B0C3C00004D090A - 3A00004301023F00004806073900004C0C0C3900004A0A0A3900004202023F00 - 004805083A00004D0A0D3A00004B080B3A00004300033F00004805083A00004D - 0A0D3A00004B080B3A00004202023D02003D06013906033200003F0000370205 - FFFDFCFFFFFCFAFBF9FFFEFEFFE9EAFFF6F8FFFDFBFFFCF9FFFCF7FFEFECFFFE - FCFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFDFEFFFEFEFFFDFEFFFDFEFFFDFEFF - FDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFC - FFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFC - FCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFFCFCFFF7F7FFFCFCFFFCFCFF - FCFCFFFCFCFFEDEDF7DFDFFFFDFCFFFEFEFFFEFEFFF5F52000002B00004A1110 - 3F00004704034100004808043900004A0D0B370000480A0A3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E00004300033A0000 - 4B080B3A00004D0A0D3A00004805083F00004300033A00004B080B3A00004D0A - 0D3A00004805083F00004301023A00004B090A3A00004D0B0C3A00004806073F - 00004301023A00004B090A3A00004D0B0C3A00004806073E0000430302350000 - 3B0401370000510C0F320000FFFCFCEDE6E3FDFBFAFFFEFEFFFAFCFFF9FBFFFD - FBFFF8F5FFFFF9FFFEFBFFF9F7FFFAFAFFF9F9FFFBFBFFF8F8FFFBFBFFF9F9FF - FBFBFFF9F9FFFAFAFFF9F9FFFBFBFFF8F8FFFBFBFFF9F9FFFAFBFFF8F7FFF8F8 - FFF7F7FFF9F9FFF6F6FFF9F9FFF7F7FFF9F9FFF7F7FFF8F8FFF7F7FFFAF9FFF6 - F6FFFAF9FFF7F7FFFAF9FFF8F7FFF9F8FFF8F7FFFAF9FFF7F6FFFAF9FFF8F7FF - FAF9FFF6F5FFFDFCFFFAF9FFF1F0FFFDFCFFFDFCFFFDFCFFF9F8FFFEFEFFFBFB - FFFCFC2B09093F0E103500003C00004906054502003A00004A0A093700004A0C - 0C3700004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3B00004201033F00 - 004605073A00004B080B3A00004A070A3B00004300033F00004705063A00004B - 090A3A00004A08093B00004301023F00004705063A00004B090A3A00004A0809 - 3B00004302013B00004203003A00004F1111410000420509FFFBFCFFFFFCFFFC - FBFFF9FAFFFAFCFFF8FAFFFBF9FFFBF8FFFBF5FFFEFAFFFEFCFFFDFEFFFDFEFF - FDFEFFFCFDFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFDFEFFFCFDFFFDFE - FFFDFEFFFDFEFFFDFCFFFDFCFFFDFCFFFDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFD - FCFFFDFCFFFDFCFFFDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF - FDFCFFFCFBFFFDFCFFFDFCFFFDFCFFFAF9FFFDFCFFFBFAFFFDFCFFFBFAFFFDFC - FFFCFBFFF7F5F9EFEFFFFEFEFFFBFB2A08083100023500004808084401004100 - 00470703390000480B093700004709093A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00003F00023A00004405073700004506 - 083800004403053D00004100023A00004605073900004706083A00004403053F - 00004101013C00004606053900004707063A00004404033F00004101003C0000 - 4606053900004707063A00004404034000004D0A073F00005212113A00005407 - 0B400003FFE2E3FFFEFCFFFEFEFFFDFEFFFAFCFFFAFCFFFDFBFFFFFBFFF7F1FF - F9F6FFF5F4FFFBFDFFF4F7FFFBFEFFF1F4FFFBFEFFF5F8FFFBFEFFF3F6FFFAFD - FFF4F7FFFBFEFFF2F4FFFCFEFFF6F8FFFCFEFFF5F4FFFCFBFFF6F5FFFDFCFFF3 - F2FFFDFCFFF7F6FFFDFCFFF5F4FFFCFBFFF6F5FFFDFCFFF3F2FFFDFCFFF7F6FF - FDFCFFF5F4FFFDFBFFF6F5FFFEFCFFF3F2FFFEFCFFF7F6FFFEFCFFFDFCFFFEFC - FFF9F8FFFEFCFFF5F4FFFEFCFFF8F7FFFEFCFFFEFEFFFEFEFFFCFC1E00004918 - 1A3300005313133C00004401003D00004606053700004507073800004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000013E00 - 013D01023C00004001033C00004001033D00003E00013E00013F00023C000040 - 01033E00004201033F00004000014000004101003E00004202013E0000420201 - 3F00004000004000004101003E00004202013E00004202013F00004100003C00 - 004A07063A00004C0809480000470409300607290D0D1300002408082A000031 - 02041D00002108061C03002C100F2300002D0608270001330B0D2300002F0709 - 2A000232070A2600002E0608270001330B0D2200002C07092700022B090A1E00 - 002408071D0101290D0C190000250908200102280A091E00002608071F00012B - 0D0C1B0000270908210102280A091C00002408071D0101290D0C190000250908 - 1E0202260A091D01012105041900002A0E0D1900002D11101900002208081500 - 002B11111E00002500003703034D1112390000500F0E4300004201003E000040 - 02023C00004002023F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013D00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000004000013F00004201033E00004201 - 033E00004100024000004100004000004202023F00004500033E00003A010235 - 00033301033400023C0105380000390303330000360202350101370003380002 - 3B02053700013B02053700013A01043900033900033800023B02053700013B02 - 053500013A010437000335000334000037020533000037020533000036010435 - 0101350003340000370205330000370205330000380104350101350003340000 - 3702053300003702053300003601043501013500033400003702053300003702 - 053300003601043500033301033400023902053700003E02033C000041000240 - 00004100003F00004202023E00004201033E0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000013D00003E00004000014302044000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E00004100024000014000013F0000 - 4201033E00004201033E00004100024000014000013F00004201033E00004201 - 033E00004100024000014000013F00004201033E00004201033E000041000240 - 00014000013F00004201033E00004201033E0000410002400001430204420103 - 4000013D00003F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023F00004403053A00004706083900004605073C00004100023F00 - 004403053A00004706083900004605073C00004100023F00004403053A000047 - 06083900004605073C00004100023F00004403053A0000470608390000460507 - 3C00004100023B00003D00003F00004302044201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004201033A000049080A3900004A09 - 0B3900004605073E00004201033A000049080A3900004A090B3900004605073E - 00004201033A000049080A3900004A090B3900004605073E00004201033A0000 - 49080A3900004A090B3900004605073E00004403054201034000013D00003E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033E00 - 004706083900004C0B0D3900004A090B3900004201033E00004706083900004C - 0B0D3900004A090B3900004201033E00004706083900004C0B0D3900004A090B - 3900004201033E00004706083900004C0B0D3900004A090B3900004201033D00 - 003E00004000014302044201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004201033900004A090B3900004C0B0D3900004706083E - 00004201033900004A090B3900004C0B0D3900004706083E0000420103390000 - 4A090B3900004C0B0D3900004706083E00004201033900004A090B3900004C0B - 0D3900004706083E00004302044201034000013D00003E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033E00004605073900004A - 090B39000049080A3A00004201033E00004605073900004A090B39000049080A - 3A00004201033E00004605073900004A090B39000049080A3A00004201033E00 - 004605073900004A090B39000049080A3A00004201033C00003E000040000143 - 02044100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004100023C00004605073900004706083A00004403053F00004100023C0000 - 4605073900004706083A00004403053F00004100023C00004605073900004706 - 083A00004403053F00004100023C00004605073900004706083A00004403053F - 00004504064302044100023D00004000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000014000014100023E00004201033E0000420103 - 3F00004000014000014100023E00004201033E00004201033F00004000014000 - 014100023E00004201033E00004201033F00004000014000014100023E000042 - 01033E00004201033F00004000013D00003E0000400001430204} - end - object lblWelcome: TLabel - Left = 172 - Top = 10 - Width = 318 - Height = 50 - Caption = 'Welcome to the Metamod:Source (version) Setup Wizard' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -21 - Font.Name = 'Tahoma' - Font.Style = [] - ParentFont = False - WordWrap = True - end - object lblInfo1: TLabel - Left = 172 - Top = 82 - Width = 331 - Height = 26 - Caption = - 'This wizard will guide you through the installation of Metamod:S' + - 'ource (version).' - WordWrap = True - end - object lblInfo2: TLabel - Left = 172 - Top = 120 - Width = 335 - Height = 39 - Caption = - 'It is recommended that you close all other applications before s' + - 'tarting a setup for e.g. Half-Life 2 or other games. Otherwise y' + - 'ou should restart your system after this installation.' - WordWrap = True - end - object lblInfo3: TLabel - Left = 172 - Top = 176 - Width = 108 - Height = 13 - Caption = 'Click Next to continue.' - end - end - object jspLicense: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - object pnlLicense: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon1: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Stretch = True - Transparent = True - end - object lblTitle1: TLabel - Left = 12 - Top = 8 - Width = 116 - Height = 14 - Caption = 'License Agreement' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSubTitle1: TLabel - Left = 22 - Top = 28 - Width = 408 - Height = 13 - Caption = - 'Please review the following license terms before installing Meta' + - 'mod:Source (version).' - end - object bvlSpacer1: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object freLicense: TmxFlatRichEdit - Left = 10 - Top = 62 - Width = 507 - Height = 207 - Lines.Strings = ( - 'The zlib/libpng License' - '' - 'Copyright (c) 2006-2008, AlliedModders' - '' - - 'This software is provided '#39'as-is'#39', without any express or implie' + - 'd warranty. In no event will the ' - - 'authors be held liable for any damages arising from the use of t' + - 'his software.' - '' - - 'Permission is granted to anyone to use this software for any pur' + - 'pose, including commercial ' - - 'applications, and to alter it and redistribute it freely, subjec' + - 't to the following restrictions:' - '' - - ' 1. The origin of this software must not be misrepresented; y' + - 'ou must not claim that you wrote the ' - - 'original software. If you use this software in a product, an ack' + - 'nowledgment in the product ' - 'documentation would be appreciated but is not required.' - '' - - ' 2. Altered source versions must be plainly marked as such, a' + - 'nd must not be misrepresented as ' - 'being the original software.' - '' - - ' 3. This notice may not be removed or altered from any source' + - ' distribution.' - '') - ReadOnly = True - ScrollBars = ssVertical - TabOrder = 1 - Activate = True - BorderColor = clBtnShadow - Flat = True - ShowBorder = True - Version = '1.26' - end - object frbAgree: TFlatRadioButton - Left = 10 - Top = 274 - Width = 231 - Height = 17 - Caption = 'I accept the terms in the License Agreement' - TabOrder = 2 - OnClick = CheckNext - end - object ftbDontAgree: TFlatRadioButton - Left = 10 - Top = 290 - Width = 265 - Height = 17 - Caption = 'I do not accept the terms in the License Agreement' - Checked = True - TabOrder = 3 - TabStop = True - OnClick = CheckNext - end - end - object jspInstallMethod: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - object lblInstallMethod: TLabel - Left = 124 - Top = 124 - Width = 144 - Height = 13 - Caption = 'Please select a install method:' - end - object pnlHeader2: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon2: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Transparent = True - end - object lblTitle2: TLabel - Left = 12 - Top = 8 - Width = 137 - Height = 14 - Caption = 'Choose install method' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSubTitle2: TLabel - Left = 22 - Top = 28 - Width = 263 - Height = 13 - Caption = 'Choose a install method for installing Metamod:Source.' - end - object bvlSpacer2: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object pnlInstallMethod: TPanel - Left = 122 - Top = 142 - Width = 267 - Height = 97 - BevelOuter = bvLowered - TabOrder = 1 - object frbDedicatedServer: TFlatRadioButton - Left = 4 - Top = 4 - Width = 135 - Height = 17 - Caption = 'Steam Dedicated Server' - Checked = True - TabOrder = 0 - TabStop = True - end - object frbListenServer: TFlatRadioButton - Left = 4 - Top = 22 - Width = 115 - Height = 17 - Caption = 'Steam Listen Server' - TabOrder = 1 - end - object frbSelectMod: TFlatRadioButton - Left = 4 - Top = 58 - Width = 117 - Height = 17 - Caption = 'Select mod directory' - TabOrder = 3 - end - object frbFTP: TFlatRadioButton - Left = 4 - Top = 76 - Width = 35 - Height = 17 - Caption = 'FTP' - TabOrder = 4 - end - object frbStandaloneServer: TFlatRadioButton - Left = 4 - Top = 40 - Width = 107 - Height = 17 - Caption = 'Standalone Server' - TabOrder = 2 - end - end - end - object jspSelectMod: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - object lblInfo: TLabel - Left = 138 - Top = 114 - Width = 255 - Height = 26 - Caption = - 'The following mods were detected. Please select the mod you want' + - ' to install Metamod:Source to:' - WordWrap = True - end - object shpMods: TShape - Left = 136 - Top = 142 - Width = 255 - Height = 104 - Pen.Color = clBtnShadow - end - object pnlSelectMod: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon5: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Stretch = True - Transparent = True - end - object lblSelectMod: TLabel - Left = 12 - Top = 8 - Width = 68 - Height = 14 - Caption = 'Select Mod' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSelectModInfo: TLabel - Left = 22 - Top = 28 - Width = 332 - Height = 13 - Caption = - 'Please select the mod Metamod:Source (version) shall be installe' + - 'd to.' - end - object bvlSelectMod: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object trvMods: TTreeView - Left = 137 - Top = 143 - Width = 253 - Height = 102 - BorderStyle = bsNone - Indent = 19 - MultiSelectStyle = [] - ReadOnly = True - RightClickSelect = True - RowSelect = True - TabOrder = 1 - OnClick = trvModsClick - end - end - object jspFTP: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - object lblStep1: TLabel - Left = 44 - Top = 56 - Width = 100 - Height = 13 - Caption = '1. Set your FTP data' - end - object lblStep2: TLabel - Left = 44 - Top = 146 - Width = 244 - Height = 13 - Caption = '2. Connect to server and select the mod directory:' - end - object lblStep5: TLabel - Left = 44 - Top = 338 - Width = 64 - Height = 13 - Caption = '5. Click Next.' - end - object lblStep3: TLabel - Left = 44 - Top = 252 - Width = 223 - Height = 13 - Caption = '3. Select the operating system of your server:' - end - object lblStep4: TLabel - Left = 44 - Top = 296 - Width = 125 - Height = 13 - Caption = '4. Select the engine type:' - end - object pnlHeader3: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon3: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Transparent = True - end - object lblTitle3: TLabel - Left = 12 - Top = 8 - Width = 269 - Height = 14 - Caption = 'Installing Metamod:Source (version) via FTP' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSubTitle3: TLabel - Left = 22 - Top = 28 - Width = 189 - Height = 13 - Caption = 'Do the following steps and press Next. ' - end - object bvlSpacer3: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object pnlFTPData: TPanel - Left = 44 - Top = 72 - Width = 441 - Height = 64 - BevelOuter = bvLowered - TabOrder = 1 - object lblHost: TLabel - Left = 4 - Top = 4 - Width = 26 - Height = 13 - Caption = 'Host:' - end - object lblUserName: TLabel - Left = 180 - Top = 6 - Width = 52 - Height = 13 - Caption = 'Username:' - end - object lblPassword: TLabel - Left = 308 - Top = 4 - Width = 50 - Height = 13 - Caption = 'Password:' - end - object lblPort: TLabel - Left = 132 - Top = 4 - Width = 24 - Height = 13 - Caption = 'Port:' - end - object txtHost: TFlatEdit - Left = 4 - Top = 20 - Width = 121 - Height = 19 - ColorFlat = clBtnFace - ParentColor = True - TabOrder = 0 - end - object txtUserName: TFlatEdit - Left = 180 - Top = 20 - Width = 121 - Height = 19 - ColorFlat = clBtnFace - ParentColor = True - TabOrder = 2 - end - object txtPassword: TFlatEdit - Left = 308 - Top = 20 - Width = 127 - Height = 19 - ColorFlat = clBtnFace - ParentColor = True - PasswordChar = '*' - TabOrder = 3 - end - object txtPort: TFlatEdit - Left = 132 - Top = 20 - Width = 43 - Height = 19 - ColorFlat = clBtnFace - ParentColor = True - MaxLength = 5 - TabOrder = 1 - Text = '21' - OnChange = txtPortChange - end - object chkPassive: TFlatCheckBox - Left = 4 - Top = 44 - Width = 139 - Height = 16 - Caption = 'Use PASV (Passive) Mode' - Checked = True - TabOrder = 4 - TabStop = True - end - object cmdProxySettings: TFlatButton - Left = 350 - Top = 42 - Width = 83 - Height = 18 - ColorFocused = 16245198 - ColorDown = 16245198 - ColorHighLight = 8623776 - ColorShadow = 8623776 - Caption = 'Proxy-Settings' - TabOrder = 5 - OnClick = cmdProxySettingsClick - end - end - object cmdConnect: TFlatButton - Left = 416 - Top = 161 - Width = 71 - Height = 20 - ColorFocused = 16245198 - ColorDown = 16245198 - ColorBorder = clBtnShadow - ColorHighLight = clBtnShadow - ColorShadow = clBtnShadow - Caption = 'Connect' - TabOrder = 3 - OnClick = cmdConnectClick - end - object pnlDirectory: TPanel - Left = 44 - Top = 162 - Width = 367 - Height = 83 - BevelOuter = bvLowered - TabOrder = 2 - object trvDirectories: TTreeView - Left = 1 - Top = 1 - Width = 365 - Height = 81 - Align = alClient - BorderStyle = bsNone - Images = ilImages - Indent = 19 - TabOrder = 0 - OnChange = trvDirectoriesChange - OnCollapsing = trvDirectoriesCollapsing - OnExpanding = trvDirectoriesExpanding - OnExpanded = trvDirectoriesExpanded - OnMouseDown = trvDirectoriesMouseDown - end - end - object pnlOS: TPanel - Left = 44 - Top = 268 - Width = 441 - Height = 21 - BevelOuter = bvLowered - TabOrder = 4 - object optWindows: TFlatRadioButton - Left = 1 - Top = 3 - Width = 62 - Height = 14 - Caption = 'Windows' - Checked = True - TabOrder = 0 - TabStop = True - end - object optLinux: TFlatRadioButton - Left = 183 - Top = 3 - Width = 82 - Height = 14 - Caption = 'Linux (32-bit)' - TabOrder = 1 - end - object FlatRadioButton1: TFlatRadioButton - Left = 319 - Top = 3 - Width = 82 - Height = 14 - Caption = 'Linux (64-bit)' - Enabled = False - TabOrder = 2 - end - end - object pnlEngineType: TPanel - Left = 44 - Top = 312 - Width = 441 - Height = 21 - BevelOuter = bvLowered - TabOrder = 5 - object optAutoDetect: TFlatRadioButton - Left = 1 - Top = 3 - Width = 154 - Height = 14 - Caption = 'Auto-Detect (recommended)' - Checked = True - TabOrder = 0 - TabStop = True - end - object optSource: TFlatRadioButton - Left = 183 - Top = 3 - Width = 96 - Height = 15 - Caption = 'Source'#8482' Engine' - TabOrder = 1 - end - object optOrangeBox: TFlatRadioButton - Left = 319 - Top = 3 - Width = 118 - Height = 15 - Caption = 'OrangeBox'#8482' Engine' - TabOrder = 2 - end - end - end - object jspInstallProgress: TJvStandardPage - Left = 0 - Top = 0 - Width = 527 - Height = 314 - Caption = 'jspInstallProgress' - object ggeAll: TFlatGauge - Left = 8 - Top = 84 - Width = 509 - Height = 24 - AdvColorBorder = 0 - Color = clBtnFace - ColorBorder = 8623776 - MaxValue = 8 - Progress = 0 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -9 - Font.Name = 'Tahoma' - Font.Style = [] - ParentColor = False - ParentFont = False - end - object lblProgress: TLabel - Left = 8 - Top = 66 - Width = 46 - Height = 13 - Caption = 'Progress:' - end - object ggeItem: TFlatGauge - Left = 8 - Top = 112 - Width = 509 - Height = 24 - AdvColorBorder = 0 - Color = clBtnFace - ColorBorder = 8623776 - Progress = 0 - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -9 - Font.Name = 'Tahoma' - Font.Style = [] - ParentColor = False - ParentFont = False - end - object lblDetails: TLabel - Left = 10 - Top = 152 - Width = 36 - Height = 13 - Caption = 'Details:' - end - object bvlSpace2: TBevel - Left = 4 - Top = 142 - Width = 519 - Height = 3 - Shape = bsTopLine - end - object pnlHeader5: TPanel - Left = 0 - Top = 0 - Width = 527 - Height = 49 - Align = alTop - BevelOuter = bvNone - Color = clWhite - TabOrder = 0 - object imgIcon4: TImage - Left = 486 - Top = 8 - Width = 32 - Height = 32 - AutoSize = True - Picture.Data = { - 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000002000 - 0000200806000000737A7AF40000000467414D410000AFC837058AE900000019 - 74455874536F6674776172650041646F626520496D616765526561647971C965 - 3C000008ED4944415478DAD556096C54D7153D7FE6CFFC59BC321EE3F1162F60 - 833DB6C10B019C60410007D43649518480B64924BAD0D00401A58AD456EA42A4 - 268A4848216D43054A55910588484A020D2EE09D181BDB78C106DB638FEDB1F1 - 18DBE3F12C7FFED2FBBFC1402090B46AAB3EE96966DEBCE5DC7BCF3DF732AB57 - 3F8EFFE6D06AB5686C6C80CBE5527F33FF8F00CC34B9AF7340969529836120B1 - 2C3BDED07001C3C3C35F19004B7339CDB5744911DD9328430E67C02817D264EE - 7B58926408A20893914320C08B3A1DDBD9D3D3BDB7B3B3E3FDAF02600341DF29 - 8872BE286BC1EA39707AFA6419D5A2202F83E74380C883D5021A0D73D7E346A3 - 1E3F78E69B489D930247B71307DEF9580182CB97DBB7381C3D7FF832007134F7 - 0BA2F494ACE1101F6B4656BC0F732CE3B09A791875324472ABC7CF6060C288F6 - E128740C6AE1F54E41AF9566BC120886B0A2380BDF5B5F8ADFED3B8A977EB20E - 474FD4E2A393B5049819AFACACB0DF0B400645EC3819362F26D68255760F8A13 - 5D88B725C2146B87C69C044617465B44C8C1318426AEC0E36A419B730A7FBFFA - 102E748A80E023B269542F994D9C1227F294803FEEDE80831F36A0ACBC590D49 - 7D7DDDFA2F02502C3FC70B4CC6FC0C2B36E5B6213BD10073E626B0519960345A - C892A0D00A924C618086EE26DF0B531086CEC1DD7E0CA77A5270AC2E0281A949 - C54A8ABF043E24E1575B164267B6E2B7FBCB2189210A234B002E6CBE1D8086E6 - DFC8F235F6F9B3F1C385E7911C1B0EA3FD456828759A1D22AE793420C354F215 - A6F230734A9C152611109D19D24407BC4D7B503698834395B3C0FB271122BC1B - 4B6D5856908C1D7B9BE0A330190D3A088218AAAAAA58C19496AE515D45F35951 - 940FC6C55BB1BDA41369BA361873B781E1ACD02288CFDA67C1311E01032B4224 - 721526B8919B14002FDE229E863523D47F0ABEDE933836B00A7F39A34141860E - AF6F5F884FEAFCE8EC19414B970703435E0C0D0D5636355D5CCBE4E717107B35 - E6A8A8E866B0E6B4CDAB24AC8CFA94DC351BBAF4F58A79D03012DA5D61180B18 - 31EC35C0E531C0C28DE3E9FC6BE40D8AF50C021DE4C93EF08E0F302E5AF04A4D - 31A6A6043C5A10A7440D1CC7A2B27114DDCE71345EACFBB1DBED7E8BD1EBF588 - 8B8B5B3F37D3FE6E669A053B1757221A2E30FA30B0B615605813794702AB91C1 - E944B40E46E2484B32B990C7A6050EA4C70AAA17981B00C4894E88A3F5F4A084 - F29102BC713A1641BF173733D4C8E9303939DE535B5B53425E77AACB0B16E4BF - 1F13F7D0D31B96C978D2F6992A9732B15C634E80262243BD4C3141A79531E4D1 - 615F7506A67816453627BEF3F02802218DCA03884188D79B2841FCAAFC8DF251 - 78B972097A9C93D0B1D308585687E6E6C657FBFB9DBB542122361A962C296E8B - B6C6A5EE5CD98B1C632318AD7EDAADF4B0C6685179408B30E9451CA88C468533 - 0D0612244E1EC32F4ABB1161A444080520FB06200B816952D2F11089C581D665 - 38D940DE632525D42442018F42BE502854AF02309BCDC9458B96B627265A4D2F - 9534205ED74BABBADB845C525D6B301AD03164C42F4FCE87DE14AD7A64CA17C2 - F78B9AF18D6C377D0F4E8BBEE2094C678A4CE9F651DF221CAC88849EE1A1D3E9 - 70F5EA950F3A3A2E6FA42D82BA2F2C2C2CBBA070496366BA95DDB5B41A167644 - B5F6F6A1643C47ECFFD9311BCE0F6722D512443817428B2B02B931DD78EDDB0E - 08127B8B8CEA1905630865AE3CEC3F1307AD1C5016C4EAEAAA755EAFF7F8CC3E - 05402101C8488FB901C07D1700935E467927879F7F9A05D61085AD4BDB616405 - BC7ACE0E569AC09E275A30CF16425060EE02F00F572EF69DB141AF1194D43B7F - F162C36AFAC733B38F42904221684D4A8CA110D4C3A673DE118269F64AD8FA5E - 323A3D69C8B47AF1C6130D18F3EBF1E2F185182652AEB7B7E285E56E7883B780 - DF0CC1C7BD853848BC51F4A3AEEEFC0B947A6FDEE15D62BC69C9D2475A2DD6B8 - 949D8F75C16E6EA130EA67DC19669070B4DE88D7CA73603499F0D3925694660C - 931831D85D361FA7AFC623DE3088031B3A10499D829F57C8379D968A0CFFB9B5 - 18279BF4084E5DEFABA9A95652CF716778D5345C782CC696FAD4A64702F856FC - 594AC3E9782AB2EB0BCAF8D1BBE918E293B138D98DDF3CDEA23EAE5854E9B010 - 885C88C4FC67165CC2D098041BF173D3121EFEA084EB41135EAE5A8ADE411E1D - 979BF7F4F5F56DFF62E55301D86CF1DFCDCEC97F675E6A38763C5C812876420D - 8362FD818A701C6AB0233A9CC5AF57372327DE4379AF55C185A8F0ED3A9107E7 - 7818BC93E3F0F21C526679F1F6C6AB30698328776560EFD964F0BE715F7575E5 - 63C160B0F69E00480BA2480B9A4C1131C99B974F6265ECE7249B7A38DC1A3C7F - 641E021A1B9ECCEEC3B647AFC02F686F1E839974E17063320E5D9843592223DA - 2460EE2C379E2BEC22D594F14A55212E39240C3ABB4EB4B5B5AEA323C17B0250 - 466242E2D6ACECBC3767CF8EC08E920E6484F7E3D250241A5C5698382D4A5287 - 610DE311923433C754659C34128054E42578A8405D872D22A0880D8E74CCC3E1 - 9A704A046FB0A6A66A9DCFE73B817B8C1900D4C57054984E455BE24BEC734CD8 - B2A81D49E113D4824D133240960B92A270CCF42995E6D37D2129377542B21A92 - 50C087B37D09F853790C756A3CDADA2EBDD5D7D7BB8D4EF0F705A00C83C19051 - 54B4E834678C4A9A9F66C2B3454ECC891CA5326B80ACD1DDD87E03C08DEF37B1 - 2875C017E471BA2B0E876B23C0533BD6EFEC296B6D6D798EFE75E24BC65D2D2D - E9C262F2C47B9C3132D932CB88B5797E14278F20C6A474315AA57ADC925BF28D - D221F979115D6E033EA19EA1B6430B860468A0BFF72C3DFE3CA55D1BEE33EED9 - 53731C97939565FFBD35366E9944D9906065919714C2DCD800628907D4D0A81D - AF27C0A07F5C8F9601035AFBB5540F04305250E8EABAF2576ABD77D35557F080 - 71BFA63ED266B36D494949DB6C0E8B4C97C972C5039C9E514BAB4C0002216ACB - 69529347BF7969D47DEDF3EEEEAEB73D1ECF87747EEC418F3F08C04D72A6582C - 96353131D695111111597ABDC14A65D500E55951F005027ED7D8D858D3C8C8B5 - B2C9C9C9725AEF03EEA84BFF1E80DB23433396A47B360130290BA2284E499244 - E51354C1E0FB1A77FD4B00FE23E37F0EE09F19A8E321D9E34DB9000000004945 - 4E44AE426082} - Transparent = True - end - object lblTitle5: TLabel - Left = 12 - Top = 8 - Width = 223 - Height = 14 - Caption = 'Installing Metamod:Source (version)' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -12 - Font.Name = 'Tahoma' - Font.Style = [fsBold] - ParentFont = False - end - object lblSubTitle5: TLabel - Left = 22 - Top = 28 - Width = 296 - Height = 13 - Caption = 'Please wait while Metamod:Source (version) is being installed.' - end - object bvlSpacer5: TBevel - Left = 0 - Top = 46 - Width = 527 - Height = 3 - Align = alBottom - Shape = bsBottomLine - end - end - object rtfDetails: TmxFlatRichEdit - Left = 8 - Top = 166 - Width = 509 - Height = 139 - ReadOnly = True - ScrollBars = ssVertical - TabOrder = 1 - Activate = True - BorderColor = clBtnShadow - Flat = True - ShowBorder = True - Version = '1.26' - end - end - end - object pnlButtons: TPanel - Left = 0 - Top = 317 - Width = 527 - Height = 38 - Align = alBottom - BevelOuter = bvNone - TabOrder = 1 - object cmdNext: TFlatButton - Left = 438 - Top = 7 - Width = 85 - Height = 25 - ColorFocused = 16245198 - ColorDown = 16245198 - ColorBorder = clBtnShadow - ColorHighLight = clBtnShadow - ColorShadow = clBtnShadow - Caption = '&Next >' - TabOrder = 0 - OnClick = cmdNextClick - end - object cmdCancel: TFlatButton - Left = 4 - Top = 7 - Width = 85 - Height = 25 - Color = clBtnFace - ColorFocused = 16245198 - ColorDown = 16245198 - ColorBorder = clBtnShadow - ColorHighLight = clBtnShadow - ColorShadow = clBtnShadow - Caption = '&Cancel' - ParentColor = False - TabOrder = 1 - OnClick = cmdCancelClick - end - object cmdBack: TFlatButton - Left = 348 - Top = 7 - Width = 85 - Height = 25 - ColorFocused = 16245198 - ColorDown = 16245198 - ColorBorder = clBtnShadow - ColorHighLight = clBtnShadow - ColorShadow = clBtnShadow - Caption = '< &Back' - TabOrder = 2 - Visible = False - OnClick = cmdBackClick - end - end - object ilImages: TImageList - Left = 334 - Top = 8 - Bitmap = { - 494C010102000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 - 0000000000003600000028000000400000001000000001002000000000000010 - 00000000000000000000000000000000000000000000008CBD00008CBD00008C - BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00008CBD00008CBD00000000000000000000000000008CBD00008CBD00008C - BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00008CBD000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD0063CEF700008CBD00A5F7 - FF0063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CE - F70039ADDE00ADF7FF00008CBD0000000000008CBD0021A5CE005ACEEF0084E7 - FF0063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CEF70063CE - F70039ADDE001094C60000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD006BD6F700008CBD00ADF7 - FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6 - FF0039ADDE00BDEFF700008CBD0000000000008CBD004ABDE70031ADD60094EF - FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6FF006BD6 - FF0039B5DE00CEF7FF00008CBD00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD0073D6FF00008CBD00ADF7 - FF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDE - FF0042B5DE00BDEFF700008CBD0000000000008CBD0073D6FF00008CBD00ADFF - FF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDEFF007BDE - FF0042B5DE00CEF7FF00008CBD00000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD007BDEFF00008CBD00B5F7 - FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7 - FF0042B5DE00C6F7F700008CBD0000000000008CBD007BDEFF001094C60094EF - FF0094EFFF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7FF0084E7 - FF004ABDE700CEF7FF001094C600000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD0084E7FF00008CBD00BDF7 - FF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEF - FF004ABDE700BDF7FF00008CBD0000000000008CBD0084E7FF0042B5DE005AC6 - EF00ADFFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEFFF008CEF - FF004ABDE700CEF7FF00CEF7FF00008CBD000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD008CEFFF00008CBD00D6F7 - FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7 - FF00BDDEDE00D6F7FF00008CBD0000000000008CBD008CE7FF007BDEFF0021A5 - CE00E7FFFF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7FF00CEF7 - FF0094EFFF00E7FFFF00CEF7FF00008CBD000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD0094F7FF00008CBD00008C - BD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00008CBD00008CBD00008CBD0000000000008CBD0094F7FF0094F7FF001094 - C600008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00008CBD00008CBD00008CBD00008CBD000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD009CF7FF009CF7FF009CF7 - FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7 - FF00008CBD00000000000000000000000000008CBD009CF7FF009CF7FF009CF7 - FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7FF009CF7 - FF00088CBD000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000008CBD00D6F7FF00A5F7FF00A5F7 - FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7FF00A5F7 - FF00008CBD00000000000000000000000000008CBD00E7FFFF00A5FFFF00A5FF - FF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FFFF00A5FF - FF00088CBD000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 00000000000000000000000000000000000000000000008CBD00D6F7FF00A5F7 - FF00A5F7FF00A5F7FF00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD000000000000000000000000000000000000000000008CBD00E7FFFF00A5FF - FF00A5FFFF00A5FFFF00008CBD00008CBD00008CBD00008CBD00008CBD00008C - BD00000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000008CBD00008C - BD00008CBD00008CBD0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000008CBD00008C - BD00008CBD00008CBD0000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 000000000000000000000000000000000000424D3E000000000000003E000000 - 2800000040000000100000000100010000000000800000000000000000000000 - 000000000000000000000000FFFFFF0080038007000000000001000300000000 - 0001000100000000000100010000000000010001000000000001000000000000 - 0001000000000000000100000000000000070007000000000007000700000000 - 800F800F00000000C3FFC3FF00000000FFFFFFFF00000000FFFFFFFF00000000 - FFFFFFFF00000000FFFFFFFF0000000000000000000000000000000000000000 - 000000000000} - end - object IdFTP: TIdFTP - Intercept = IdLogFile - MaxLineAction = maException - ReadTimeout = 0 - RecvBufferSize = 1024 - SendBufferSize = 1024 - OnWork = IdFTPWork - ProxySettings.ProxyType = fpcmNone - ProxySettings.Port = 0 - Left = 454 - Top = 8 - end - object IdAntiFreeze: TIdAntiFreeze - IdleTimeOut = 150 - Left = 424 - Top = 8 - end - object tmrSpeed: TTimer - Enabled = False - OnTimer = tmrSpeedTimer - Left = 394 - Top = 8 - end - object IdLogFile: TIdLogFile - LogTime = False - Left = 364 - Top = 8 - end -end diff --git a/installer/UnitfrmMain.pas b/installer/UnitfrmMain.pas deleted file mode 100644 index 2f810dc..0000000 --- a/installer/UnitfrmMain.pas +++ /dev/null @@ -1,803 +0,0 @@ -unit UnitfrmMain; - -interface - -uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, TFlatRadioButtonUnit, StdCtrls, ComCtrls, mxFlatControls, JvPageList, - ExtCtrls, JvExControls, JvComponent, TFlatButtonUnit, jpeg, TFlatEditUnit, - TFlatGaugeUnit, ImgList, FileCtrl, Registry, CheckLst, TFlatComboBoxUnit, - TFlatCheckBoxUnit, IdBaseComponent, IdComponent, IdTCPConnection, - IdTCPClient, IdFTP, IdException, IdAntiFreezeBase, IdAntiFreeze, - IdIntercept, IdLogBase, IdLogFile, pngimage; - -type - TfrmMain = class(TForm) - jplWizard: TJvPageList; - jspWelcome: TJvStandardPage; - pnlButtons: TPanel; - bvlSpace: TBevel; - cmdNext: TFlatButton; - cmdCancel: TFlatButton; - imgInstall: TImage; - lblWelcome: TLabel; - lblInfo1: TLabel; - lblInfo2: TLabel; - lblInfo3: TLabel; - jspLicense: TJvStandardPage; - pnlLicense: TPanel; - imgIcon1: TImage; - lblTitle1: TLabel; - lblSubTitle1: TLabel; - freLicense: TmxFlatRichEdit; - frbAgree: TFlatRadioButton; - ftbDontAgree: TFlatRadioButton; - jspInstallMethod: TJvStandardPage; - pnlHeader2: TPanel; - imgIcon2: TImage; - lblTitle2: TLabel; - lblSubTitle2: TLabel; - lblInstallMethod: TLabel; - pnlInstallMethod: TPanel; - frbDedicatedServer: TFlatRadioButton; - frbListenServer: TFlatRadioButton; - frbSelectMod: TFlatRadioButton; - frbFTP: TFlatRadioButton; - cmdBack: TFlatButton; - jspFTP: TJvStandardPage; - pnlHeader3: TPanel; - imgIcon3: TImage; - lblTitle3: TLabel; - lblSubTitle3: TLabel; - lblStep1: TLabel; - pnlFTPData: TPanel; - lblHost: TLabel; - txtHost: TFlatEdit; - lblUserName: TLabel; - txtUserName: TFlatEdit; - txtPassword: TFlatEdit; - lblPassword: TLabel; - txtPort: TFlatEdit; - lblPort: TLabel; - lblStep2: TLabel; - cmdConnect: TFlatButton; - pnlDirectory: TPanel; - trvDirectories: TTreeView; - lblStep5: TLabel; - jspInstallProgress: TJvStandardPage; - pnlHeader5: TPanel; - imgIcon4: TImage; - lblTitle5: TLabel; - lblSubTitle5: TLabel; - ggeAll: TFlatGauge; - lblProgress: TLabel; - ggeItem: TFlatGauge; - rtfDetails: TmxFlatRichEdit; - lblDetails: TLabel; - bvlSpace2: TBevel; - ilImages: TImageList; - bvlSpacer1: TBevel; - bvlSpacer2: TBevel; - bvlSpacer3: TBevel; - bvlSpacer5: TBevel; - jspSelectMod: TJvStandardPage; - pnlSelectMod: TPanel; - imgIcon5: TImage; - lblSelectMod: TLabel; - lblSelectModInfo: TLabel; - bvlSelectMod: TBevel; - lblInfo: TLabel; - chkPassive: TFlatCheckBox; - lblStep3: TLabel; - pnlOS: TPanel; - optWindows: TFlatRadioButton; - optLinux: TFlatRadioButton; - IdFTP: TIdFTP; - cmdProxySettings: TFlatButton; - IdAntiFreeze: TIdAntiFreeze; - frbStandaloneServer: TFlatRadioButton; - tmrSpeed: TTimer; - IdLogFile: TIdLogFile; - shpMods: TShape; - trvMods: TTreeView; - FlatRadioButton1: TFlatRadioButton; - pnlEngineType: TPanel; - optAutoDetect: TFlatRadioButton; - optSource: TFlatRadioButton; - optOrangeBox: TFlatRadioButton; - lblStep4: TLabel; - procedure jvwStepsCancelButtonClick(Sender: TObject); - procedure cmdCancelClick(Sender: TObject); - procedure cmdNextClick(Sender: TObject); - procedure CheckNext(Sender: TObject); - procedure cmdBackClick(Sender: TObject); - procedure cmdConnectClick(Sender: TObject); - procedure jplWizardChange(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure cmdProxySettingsClick(Sender: TObject); - procedure txtPortChange(Sender: TObject); - procedure trvDirectoriesExpanded(Sender: TObject; Node: TTreeNode); - procedure trvDirectoriesChange(Sender: TObject; Node: TTreeNode); - procedure IdFTPWork(Sender: TObject; AWorkMode: TWorkMode; - const AWorkCount: Integer); - procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure tmrSpeedTimer(Sender: TObject); - procedure trvDirectoriesExpanding(Sender: TObject; Node: TTreeNode; - var AllowExpansion: Boolean); - procedure trvDirectoriesCollapsing(Sender: TObject; Node: TTreeNode; - var AllowCollapse: Boolean); - procedure trvModsClick(Sender: TObject); - procedure trvDirectoriesMouseDown(Sender: TObject; - Button: TMouseButton; Shift: TShiftState; X, Y: Integer); - private - OldProgress: Integer; - CurrProgress: Integer; - public - procedure ExceptionHandler(Sender: TObject; E: Exception); - end; - -var - frmMain: TfrmMain; - -var VERSION: String = ''; - -const NormalHeight = 382; - FTPHeight = 422; - -implementation - -uses UnitFunctions, UnitfrmProxy, UnitInstall, UnitSelectModPath; - -{$R *.dfm} - -procedure TfrmMain.jvwStepsCancelButtonClick(Sender: TObject); -begin - Close; -end; - -procedure TfrmMain.cmdCancelClick(Sender: TObject); -begin - Close; -end; - -procedure TfrmMain.cmdNextClick(Sender: TObject); -var ePath: String; - eRegistry: TRegistry; - eStr: TStringList; - CurNode: TTreeNode; - eOS: TOS; - i: integer; - Source: Boolean; -begin - { FTP } - if (jplWizard.ActivePage = jspFTP) then begin - if (not IdFTP.Connected) then - IdFTP.Connect; - eStr := TStringList.Create; - ePath := '/'; - CurNode := trvDirectories.Selected; - if (Assigned(CurNode)) then begin - repeat - ePath := '/' + CurNode.Text + ePath; - CurNode := CurNode.Parent; - until (not Assigned(CurNode)); - end; - IdFTP.ChangeDir(ePath); - IdFTP.List(eStr, '', False); - eStr.CaseSensitive := False; - // check if gameinfo.txt is in the directory -> valid installation - if (eStr.IndexOf('gameinfo.txt') = -1) then begin - MessageBox(Handle, 'Invalid directory. Please select your mod directory and try again.', PChar(Application.Title), MB_ICONWARNING); - eStr.Free; - exit; - end - else - eStr.Free; - // check for orangebox directory (!! OrangeBox Check !!) - if (optAutoDetect.Checked) then - Source := not ((AnsiSameText(trvDirectories.Selected.Text, 'tf')) or (Pos('orangebox', LowerCase(ePath)) <> 0)) - else if (optSource.Checked) then - Source := True - else - Source := False; - // design stuff - trvDirectories.Enabled := False; - cmdConnect.Enabled := False; - optWindows.Enabled := False; - optLinux.Enabled := False; - Screen.Cursor := crHourGlass; - - if (optWindows.Checked) then begin - eOS := osWindows; - if (Source) then - rtfDetails.Lines.Text := '* Installing Source binaries for Windows' + #13#10 + #13#10 - else - rtfDetails.Lines.Text := '* Installing OrangeBox binaries for Windows' + #13#10 + #13#10 - end - else begin - eOS := osLinux; - if (Source) then - rtfDetails.Lines.Text := '* Installing Source binaries for Linux' + #13#10 + #13#10 - else - rtfDetails.Lines.Text := '* Installing OrangeBox binaries for Linux' + #13#10 + #13#10 - end; - jspInstallProgress.Show; - // installation - Screen.Cursor := crAppStart; - InstallFTP(eOS, Source, trvDirectories.Selected.Text); - end - else if (jplWizard.ActivePage = jspInstallProgress) then - Close - else if (jplWizard.ActivePage = jspSelectMod) then begin - { Dedicated Server } - if frbDedicatedServer.Checked then begin - Source := True; - ePath := trvMods.Selected.Text; - if (ePath = 'Counter-Strike:Source') then - ePath := trvMods.Selected.Parent.Text + '\source dedicated server\cstrike' - else if (ePath = 'Day of Defeat:Source') then - ePath := trvMods.Selected.Parent.Text + '\source dedicated server\dod' - else if (ePath = 'Half-Life 2 Deathmatch') then - ePath := trvMods.Selected.Parent.Text + '\source dedicated server\hl2mp' - else begin - { get games } - if (ePath = 'Team Fortress 2') then - ePath := trvMods.Selected.Parent.Text + '\source 2007 dedicated server\tf'; - { ask user, just in case } - case MessageBox(Handle, 'It looks like your server is using the OrangeBox engine. Would you like to install the appropriate binaries for it?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNOCANCEL) of - mrYes: Source := False; - mrNo: Source := True; - mrCancel: exit; - end; - end; - SteamPath := IncludeTrailingPathDelimiter(SteamPath) + 'steamapps\'; - // install it - if (DirectoryExists(SteamPath + ePath)) then begin - jspInstallProgress.Show; - InstallDedicated(IncludeTrailingPathDelimiter(SteamPath + ePath), True, Source); - end - else begin - MessageBox(Handle, 'Error: The directory of the mod you selected doesn''t exist any more. Run Dedicated Server with the chosen mod and try again.', PChar(Application.Title), MB_ICONERROR); - jspSelectMod.Show; - exit; - end; - end; - { Standalone Server } - if (frbStandaloneServer.Checked) then begin - Source := True; - ePath := trvMods.Selected.Text; - if ePath = 'Counter-Strike:Source' then - ePath := 'cstrike' - else if ePath = 'Day of Defeat:Source' then - ePath := 'dod' - else if ePath = 'Half-Life 2 Deathmatch' then - ePath := 'hl2mp' - else begin - { get games } - if (ePath = 'Team Fortress 2') then - ePath := 'orangebox\tf'; - { ask user, just in case } - case MessageBox(Handle, 'It looks like your server is using the OrangeBox engine. Would you like to install the appropriate binaries for it?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNOCANCEL) of - mrYes: Source := False; - mrNo: Source := True; - mrCancel: exit; - end; - end; - // install it - if (DirectoryExists(StandaloneServer + ePath)) then begin - jspInstallProgress.Show; - InstallDedicated(IncludeTrailingPathDelimiter(StandaloneServer + ePath), False, Source) - end - else begin - MessageBox(Handle, 'Error: The directory of the mod you selected doesn''t exist (any more). Run Half-Life Dedicated Server with the chosen mod again and restart.', PChar(Application.Title), MB_ICONERROR); - jspSelectMod.Show; - exit; - end; - end; - { Listen Server } - if (frbListenServer.Checked) then begin - Source := True; - ePath := trvMods.Selected.Text; - if (ePath = 'Counter-Strike:Source') then - ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\counter-strike source\cstrike' - else if (ePath = 'Half-Life 2 Deathmatch') then - ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\half-life 2 deathmatch\hl2mp' - else if ePath = 'Day of Defeat:Source' then - ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\day of defeat source\dod' - else begin - { get games } - if (ePath = 'Team Fortress 2') then - ePath := SteamPath + 'SteamApps\' + trvMods.Selected.Parent.Text + '\team fortress 2\tf'; - { ask user, just in case } - case MessageBox(Handle, 'It looks like your server is using the OrangeBox engine. Would you like to install the appropriate binaries for it?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNOCANCEL) of - mrYes: Source := False; - mrNo: Source := True; - mrCancel: exit; - end; - end; - - if (Pos(SteamPath, ePath) = 0) then - MessageBox(Handle, 'An error occured. Please report this bug to the Metamod:Source team and post a new thread on the forums of www.amxmodx.org.', PChar(Application.Title), MB_ICONSTOP) - else begin - if (not FileExists(ePath + '\gameinfo.txt')) then begin - MessageBox(Handle, 'You have to play this game once before installing Metamod:Source. Do that and try again.', PChar(Application.Title), MB_ICONWARNING); - exit; - end; - - jspInstallProgress.Show; - InstallListen(IncludeTrailingPathDelimiter(ePath), Source); - end; - end; - { Custom mod below } - end - else if (jplWizard.ActivePage = jspInstallMethod) then begin - if (frbDedicatedServer.Checked) then begin // Dedicated Server - eRegistry := TRegistry.Create(KEY_READ); - try - eRegistry.RootKey := HKEY_CURRENT_USER; - if eRegistry.OpenKey('Software\Valve\Steam', False) then begin - ePath := eRegistry.ReadString('SteamPath'); - ePath := IncludeTrailingPathDelimiter(StringReplace(ePath, '/', '\', [rfReplaceAll])); - SteamPath := ePath; - - ePath := ePath + 'SteamApps\'; - if (DirectoryExists(ePath)) then begin - trvMods.Items.Clear; - // Check Mods - eStr := GetAllFiles(ePath + '*.*', faDirectory, False, True, False); - for i := 0 to eStr.Count -1 do begin - CurNode := trvMods.Items.Add(nil, eStr[i]); - - if (DirectoryExists(ePath + eStr[i] + '\source dedicated server\cstrike')) then - trvMods.Items.AddChild(CurNode, 'Counter-Strike:Source'); - if (DirectoryExists(ePath + eStr[i] + '\source dedicated server\dod')) then - trvMods.Items.AddChild(CurNode, 'Day of Defeat:Source'); - if (DirectoryExists(ePath + eStr[i] + '\source dedicated server\hl2mp')) then - trvMods.Items.AddChild(CurNode, 'Half-Life 2 Deatmatch'); - if (DirectoryExists(ePath + eStr[i] + '\source 2007 dedicated server\tf')) then - trvMods.Items.AddChild(CurNode, 'Team Fortress 2'); - - if CurNode.Count = 0 then - CurNode.Free - else - CurNode.Expand(False); - end; - // Misc - jspSelectMod.Show; - trvMods.Selected := nil; - cmdNext.Enabled := False; - end - else - MessageBox(Handle, 'You have to run Dedicated Server once before installing Metamod:Source!', 'Error', MB_ICONWARNING); - end - else - MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); - finally - eRegistry.Free; - end; - end - else if (frbListenServer.Checked) then begin // Listen Server - eRegistry := TRegistry.Create(KEY_READ); - try - eRegistry.RootKey := HKEY_CURRENT_USER; - if (eRegistry.OpenKey('Software\Valve\Steam', False)) then begin - ePath := eRegistry.ReadString('SteamPath'); - ePath := IncludeTrailingPathDelimiter(StringReplace(ePath, '/', '\', [rfReplaceAll])); - SteamPath := ePath; - - ePath := ePath + 'SteamApps\'; - if DirectoryExists(ePath) then begin - trvMods.Items.Clear; - // Check Mods - eStr := GetAllFiles(ePath + '*.*', faDirectory, False, True, False); - for i := 0 to eStr.Count -1 do begin - CurNode := trvMods.Items.Add(nil, eStr[i]); - - if DirectoryExists(ePath + eStr[i] + '\counter-strike source') then - trvMods.Items.AddChild(CurNode, 'Counter-Strike:Source'); - if DirectoryExists(ePath + eStr[i] + '\day of defeat source') then - trvMods.Items.AddChild(CurNode, 'Day of Defeat:Source'); - if DirectoryExists(ePath + eStr[i] + '\half-life 2 deathmatch') then - trvMods.Items.AddChild(CurNode, 'Half-Life 2 Deatmatch'); - if DirectoryExists(ePath + eStr[i] + '\team fortress 2') then - trvMods.Items.AddChild(CurNode, 'Team Fortress 2'); - - if CurNode.Count = 0 then - CurNode.Free - else - CurNode.Expand(False); - end; - // Misc - jspSelectMod.Show; - trvMods.Selected := nil; - cmdNext.Enabled := False; - end - else - MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); - end - else - MessageBox(Handle, 'You haven''t installed Steam yet! Download it at www.steampowered.com, install Dedicated Server and try again.', 'Error', MB_ICONWARNING); - finally - eRegistry.Free; - end; - end - else if (frbStandaloneServer.Checked) then begin // Standalone Server - eRegistry := TRegistry.Create; - try - eRegistry.RootKey := HKEY_CURRENT_USER; - if eRegistry.OpenKey('Software\Valve\HLServer', False) then begin - StandaloneServer := IncludeTrailingPathDelimiter(eRegistry.ReadString('InstallPath')); - if DirectoryExists(StandaloneServer + 'cstrike') then - trvMods.Items.Add(nil, 'Counter-Strike:Source'); - if DirectoryExists(StandaloneServer + 'dod') then - trvMods.Items.Add(nil, 'Day of Defeat:Source'); - if DirectoryExists(StandaloneServer + 'hl2mp') then - trvMods.Items.Add(nil, 'Half-Life 2 Deatmatch'); - if DirectoryExists(StandaloneServer + 'orangebox\tf') then - trvMods.Items.Add(nil, 'Team Fortress 2'); - jspSelectMod.Show; - cmdNext.Enabled := False; - end - else - MessageBox(Handle, 'You haven''t installed Half-Life Dedicated Server yet!', 'Error', MB_ICONWARNING); - finally - eRegistry.Free; - end; - end - else if (frbSelectMod.Checked) then begin - { Custom mod } - if frmSelectModPath.ShowModal = mrOk then begin - ePath := frmSelectModPath.trvDirectory.SelectedFolder.PathName; - { install now } - jspInstallProgress.Show; - InstallCustom(IncludeTrailingPathDelimiter(ePath), osWindows, not frmSelectModPath.chkUsesOrangebox.Checked); - end; - end - else if (frbFTP.Checked) then begin // FTP - Height := FTPHeight; - jspFTP.Show; - end; - end - else - jplWizard.NextPage -end; - -procedure TfrmMain.CheckNext(Sender: TObject); -begin - cmdNext.Enabled := frbAgree.Checked; -end; - -procedure TfrmMain.cmdBackClick(Sender: TObject); -begin - if jplWizard.ActivePage = jspFTP then begin - Height := NormalHeight; - jspInstallMethod.Show; - end - else begin - jplWizard.PrevPage; - cmdBack.Visible := jplWizard.ActivePageIndex <> 0; - end; -end; - -procedure TfrmMain.cmdConnectClick(Sender: TObject); -var i, k: integer; - eStr: TStringList; - CurNode, CurNode2: TTreeNode; - Path: String; -begin - if (Trim(txtHost.Text) = '') or (Trim(txtUsername.Text) = '') then - MessageBox(Handle, 'Please fill in each field!', PChar(Application.Title), MB_ICONWARNING) - else if cmdConnect.Caption = 'Connect' then begin - // ... design stuff ... - Screen.Cursor := crHourGlass; - cmdConnect.Enabled := False; - cmdProxySettings.Enabled := False; - txtHost.Enabled := False; - txtPort.Enabled := False; - txtUsername.Enabled := False; - txtPassword.Enabled := False; - chkPassive.Enabled := False; - cmdConnect.Caption := 'Connecting...'; - // ... set values ... - IdFTP.Host := txtHost.Text; - IdFTP.Port := StrToInt(txtPort.Text); - IdFTP.Username := txtUsername.Text; - IdFTP.Passive := chkPassive.Checked; - IdFTP.Password := txtPassword.Text; - // ... connect and check values etc ... - try - IdFTP.Connect(True, 15000); - // ... get initial directory ... - Path := IdFTP.RetrieveCurrentDir; - // ... "fix" path ... - eStr := TStringList.Create; - eStr.Text := StringReplace(Path, '/', #13, [rfReplaceAll]); - for i := eStr.Count -1 downto 0 do begin - if (eStr[i] = '') then - eStr.Delete(i); - end; - if (Copy(Path, Length(Path) -1, 1) <> '/') then - Path := Path + '/'; - // ... connect successful, change captions ... - trvDirectories.Enabled := True; - cmdConnect.Enabled := True; - cmdConnect.Caption := 'Disconnect'; - // ... find directories in start path ... - CurNode := nil; - CurNode2 := nil; - if (eStr.Count <> 0) then begin - IdFTP.ChangeDir('/'); - for i := 0 to eStr.Count do begin - try - with GetAllDirs do begin - for k := 0 to Count -1 do begin - if (i = eStr.Count) or (Strings[k] <> eStr[i]) then - trvDirectories.Items.AddChild(trvDirectories.Items.AddChild(CurNode, Strings[k]), 'Scanning...') - else - CurNode2 := trvDirectories.Items.AddChild(CurNode, Strings[k]); - end; - Free; - - CurNode := CurNode2; - trvDirectories.Selected := CurNode; - Repaint; - Application.ProcessMessages; - end; - - if (i <> eStr.Count) then - IdFTP.ChangeDir(eStr[i]); - except - IdFTP.CheckForDisconnect(False); - if (not IdFTP.Connected) then - IdFTP.Disconnect; - CurNode := trvDirectories.Items.AddChild(CurNode, eStr.Strings[i]) - end; - end; - end; - eStr.Free; - - if Assigned(CurNode) then - CurNode.Expand(False); - except - on E: Exception do begin - // reset button properties - cmdConnect.Enabled := True; - txtHost.Enabled := True; - txtPort.Enabled := True; - txtUsername.Enabled := True; - txtPassword.Enabled := True; - chkPassive.Enabled := True; - cmdProxySettings.Enabled := True; - cmdNext.Enabled := False; - cmdConnect.Caption := 'Connect'; - // analyze messages - if Pos('Login incorrect.', E.Message) <> 0 then begin // login failed - MessageBox(Handle, 'Login incorrect. Check your FTP settings and try again.', PChar(Application.Title), MB_ICONWARNING); - txtUsername.SetFocus; - txtUsername.SelectAll; - end - else if Pos('Host not found.', E.Message) <> 0 then begin // host not found - MessageBox(Handle, 'The entered host couldn''t be found. Check your settings and try again.', PChar(Application.Title), MB_ICONWARNING); - txtHost.SetFocus; - txtHost.SelectAll; - end - else if Pos('Connection refused.', E.Message) <> 0 then begin // wrong port (?) - MessageBox(Handle, 'The host refused the connection. Check your port and try again.', PChar(Application.Title), MB_ICONWARNING); - txtPort.SetFocus; - txtPort.SelectAll; - end - else if E is EIdProtocolReplyError then begin // wrong port - MessageBox(Handle, 'The port you entered is definitely wrong. Check it and try again.', PChar(Application.Title), MB_ICONWARNING); - txtPort.SetFocus; - txtPort.SelectAll; - end - else - MessageBox(Handle, PChar(E.Message), PChar(Application.Title), MB_ICONWARNING); // unknown error - // ... connect failed, leave procedure ... - Screen.Cursor := crDefault; - exit; - end; - end; - - Screen.Cursor := crDefault; - end - else begin - Screen.Cursor := crHourGlass; - IdFTP.Quit; - trvDirectories.Items.Clear; - trvDirectories.Enabled := False; - cmdConnect.Enabled := True; - cmdProxySettings.Enabled := True; - txtHost.Enabled := True; - txtPort.Enabled := True; - txtUsername.Enabled := True; - txtPassword.Enabled := True; - chkPassive.Enabled := True; - cmdConnect.Caption := 'Connect'; - cmdNext.Enabled := False; - Screen.Cursor := crDefault; - end; -end; - -procedure TfrmMain.jplWizardChange(Sender: TObject); -begin - if (jplWizard.ActivePage = jspInstallProgress) then begin - cmdNext.Caption := '&Finish'; - cmdNext.Enabled := False; - cmdBack.Visible := False; - end - else begin - cmdNext.Caption := '&Next >'; - cmdNext.Enabled := True; - cmdBack.Visible := jplWizard.ActivePageIndex <> 0; - end; - - if (jplWizard.ActivePage = jspLicense) then - cmdNext.Enabled := frbAgree.Checked; - - if (jplWizard.ActivePage = jspFTP) then - cmdNext.Enabled := False; -end; - -procedure TfrmMain.FormCreate(Sender: TObject); -begin - if LowerCase(ParamStr(1)) = '-logftp' then begin - MessageBox(Handle, 'FTP installation will be logged to FTP.log!', PChar(Application.Title), MB_ICONINFORMATION); - IdLogFile.Filename := ExtractFilePath(ParamStr(0)) + 'FTP.log'; - IdLogFile.Active := True; - end; - - rtfDetails.Clear; -end; - -procedure TfrmMain.cmdProxySettingsClick(Sender: TObject); -begin - frmProxy.ShowModal; - // Apply Proxy Settings - case frmProxy.cboProxy.ItemIndex of - 0: IdFTP.ProxySettings.ProxyType := fpcmNone; // none - 1: IdFTP.ProxySettings.ProxyType := fpcmHttpProxyWithFtp; // HTTP Proxy with FTP - 2: IdFTP.ProxySettings.ProxyType := fpcmOpen; // Open - 3: IdFTP.ProxySettings.ProxyType := fpcmSite; // Site - 4: IdFTP.ProxySettings.ProxyType := fpcmTransparent; // Transparent - 5: IdFTP.ProxySettings.ProxyType := fpcmUserPass; // User (Password) - 6: IdFTP.ProxySettings.ProxyType := fpcmUserSite; // User (Site) - end; - - IdFTP.ProxySettings.Host := frmProxy.txtHost.Text; - IdFTP.ProxySettings.UserName := frmProxy.txtPort.Text; - IdFTP.ProxySettings.Password := frmProxy.txtPassword.Text; - IdFTP.ProxySettings.Port := StrToInt(frmProxy.txtPort.Text); -end; - -procedure TfrmMain.txtPortChange(Sender: TObject); -var i: integer; -begin - if txtPort.Text = '' then - txtPort.Text := '21' - else begin - // check if value is numeric... - for i := Length(txtPort.Text) downto 1 do begin - if Pos(txtPort.Text[i], '0123456789') = 0 then begin - txtPort.Text := '21'; - txtPort.SelStart := 4; - exit; - end; - end; - end; -end; - -procedure TfrmMain.trvDirectoriesExpanded(Sender: TObject; - Node: TTreeNode); -var ePath: String; - CurNode: TTreeNode; - i: integer; -begin - if Node.Item[0].Text = 'Scanning...' then begin // no directories added yet - Screen.Cursor := crHourGlass; - // get complete path - ePath := '/'; - CurNode := Node; - repeat - ePath := '/' + CurNode.Text + ePath; - CurNode := CurNode.Parent; - until (not Assigned(CurNode)); - // change dir and add directories in it - try - Repaint; - IdFTP.ChangeDir(ePath); - with GetAllDirs do begin - Node.Item[0].Free; - for i := 0 to Count -1 do begin - trvDirectories.Items.AddChild(trvDirectories.Items.AddChild(Node, Strings[i]), 'Scanning...'); - end; - Free; - end; - finally - Application.ProcessMessages; - end; - Screen.Cursor := crDefault; - end; -end; - -procedure TfrmMain.trvDirectoriesChange(Sender: TObject; Node: TTreeNode); -begin - cmdNext.Enabled := Assigned(trvDirectories.Selected); -end; - -procedure TfrmMain.IdFTPWork(Sender: TObject; AWorkMode: TWorkMode; - const AWorkCount: Integer); -begin - if AWorkCount > 15 then begin - ggeItem.Progress := AWorkCount; - CurrProgress := AWorkCount; - end; - - if Cancel then - IdFTP.Abort; - - Application.ProcessMessages; -end; - -procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction); -begin - if (jplWizard.ActivePage = jspFTP) and (IdFTP.Connected) then - IdFTP.Quit; - if (jplWizard.ActivePage = jspInstallProgress) and (ggeAll.Progress <> ggeAll.MaxValue) and (not Cancel) then begin - if MessageBox(Handle, 'Do you really want to cancel the installation?', PChar(Application.Title), MB_ICONQUESTION + MB_YESNO) = mrYes then begin - Screen.Cursor := crDefault; - Application.OnException := ExceptionHandler; - Cancel := True; - if IdFTP.Connected then - IdFTP.Quit; - end - else - Action := caNone; - end; -end; - -procedure TfrmMain.ExceptionHandler(Sender: TObject; E: Exception); -begin - // IF any exceptions were raised after close, nobody would want them so leave this empty -end; - -procedure TfrmMain.tmrSpeedTimer(Sender: TObject); -begin - Caption := CalcSpeed(OldProgress, CurrProgress); - OldProgress := CurrProgress; -end; - -procedure TfrmMain.trvDirectoriesExpanding(Sender: TObject; - Node: TTreeNode; var AllowExpansion: Boolean); -begin - Node.ImageIndex := 1; - Node.SelectedIndex := 1; -end; - -procedure TfrmMain.trvDirectoriesCollapsing(Sender: TObject; - Node: TTreeNode; var AllowCollapse: Boolean); -begin - Node.ImageIndex := 0; - Node.SelectedIndex := 0; -end; - -procedure TfrmMain.trvModsClick(Sender: TObject); -begin - if Assigned(trvMods.Selected) then - cmdNext.Enabled := Assigned(trvMods.Selected.Parent) - else - cmdNext.Enabled := False; -end; - -procedure TfrmMain.trvDirectoriesMouseDown(Sender: TObject; - Button: TMouseButton; Shift: TShiftState; X, Y: Integer); -var Node: TTreeNode; -begin - Node := trvDirectories.GetNodeAt(X, Y); - if (Assigned(Node)) then begin - if (Node.DisplayRect(True).Right < X) then - trvDirectories.Selected := nil; - end; -end; - -end. diff --git a/installer/UnitfrmProxy.dfm b/installer/UnitfrmProxy.dfm deleted file mode 100644 index 7ba9c06c5cae79c3827a3d1d98e81d212d147e8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1584 zcmb7EO>fgc5Z&00KjI`*DjSGp8wQ9=#K`$X!!aK*xPz!0uToNo)ez2 zS-|M>!Y+RpeRRh4&lNqSbN#F4wkeAd8}kc{EPIl5Qi$o)^5C4Ol$cG~{B(>sPsuc^ zdpJde_fR@bxc&vWDn3nPp6EY7)uWg)%ZYHC6CXyX?o+~dy#%rhaqCW}>mQ!8@$ zSt`g|TXQ;qDe)!JzfDT73QEtfLpf#rKi~qGWs6)k3T`f$m2l5)fGg`a;oQ*2khjk{ zr^JqCv4?3^@Ovqx`5qJmPfEo5btx~OM&}udjc-4H14sVTp$j5ISB6T_mMc{_PGByo zrcCs5)%JyQFXdE|s=Jg}y>L~Ma|bkrc!aWZ%(aRg!im(IRt3P3%XH(ETRa!kmB)Xf z7STU|a+7VvTU@}ha^WW_M=J%akt+Z+B(g_m6WXRrJDSi9X=?KFcMJIMEBJd=W#?v; zbr_wC^Yqh<7w)u6r`3))nw4^Hh#=b?b0&OVF^ywNkh$Fp!=NQcwiYQ*T7DRq#&C{^ zX^eByrW-OyvN>eAzf4!?ruA4n_f8pzsvWT22^hk23f>Vjk4TJ`8nA~X|4fi6vYO?R zD!zK%wI@C*PZa0X4sUf`X8@OdM5a8^s%utS!D@eRe{apCkw2ywcb$lvXG)W7n(D03 lY;-Fw>-qZTmIA!Ai~=X}q5luOUP6ekuUUDr9%cXl{sJ)8?-l?6 diff --git a/installer/UnitfrmProxy.pas b/installer/UnitfrmProxy.pas deleted file mode 100644 index 1556226..0000000 --- a/installer/UnitfrmProxy.pas +++ /dev/null @@ -1,72 +0,0 @@ -unit UnitfrmProxy; - -interface - -uses - SysUtils, Windows, Messages, Classes, Graphics, Controls, - StdCtrls, ExtCtrls, Forms, TFlatButtonUnit, TFlatComboBoxUnit, - TFlatEditUnit; - -type - TfrmProxy = class(TForm) - cmdClose: TFlatButton; - lblProxy: TLabel; - txtHost: TFlatEdit; - cboProxy: TFlatComboBox; - lblHost: TLabel; - txtPort: TFlatEdit; - lblPort: TLabel; - lblUsername: TLabel; - txtUsername: TFlatEdit; - txtPassword: TFlatEdit; - lblPassword: TLabel; - procedure cboProxyChange(Sender: TObject); - procedure txtPortChange(Sender: TObject); - public - procedure EnableControls(Enable: Boolean); - end; - -var - frmProxy: TfrmProxy; - -implementation - -{$R *.DFM} - -{ TfrmProxy } - -procedure TfrmProxy.EnableControls(Enable: Boolean); -begin - lblHost.Enabled := Enable; - lblPassword.Enabled := Enable; - lblPort.Enabled := Enable; - lblUsername.Enabled := Enable; - txtHost.Enabled := Enable; - txtPassword.Enabled := Enable; - txtPort.Enabled := Enable; - txtUsername.Enabled := Enable; -end; - -procedure TfrmProxy.cboProxyChange(Sender: TObject); -begin - EnableControls(cboProxy.ItemIndex <> 0); // 0 = None -end; - -procedure TfrmProxy.txtPortChange(Sender: TObject); -var i: integer; -begin - if txtPort.Text = '' then - txtPort.Text := '8080' - else begin - // check if value is numeric... - for i := Length(txtPort.Text) downto 1 do begin - if Pos(txtPort.Text[i], '0123456789') = 0 then begin - txtPort.Text := '8080'; - txtPort.SelStart := 4; - exit; - end; - end; - end; -end; - -end. diff --git a/installer/del.bat b/installer/del.bat deleted file mode 100644 index 74a143b..0000000 --- a/installer/del.bat +++ /dev/null @@ -1,15 +0,0 @@ -del .\*.~pas -del .\*.dcu -del .\*.~ddp -del .\*.ddp -del .\*.~dpr -del .\*.~dfm -del .\*.~dpr -del .\*.map -del .\*.drc -del .\*.~xfm -del .\*.log -del .\*.dof -upx MMS_Installer.exe -upx Attach.exe -upx hl2launch.exe \ No newline at end of file diff --git a/installer/files/Readme.txt b/installer/files/Readme.txt deleted file mode 100644 index 4f858b5..0000000 --- a/installer/files/Readme.txt +++ /dev/null @@ -1,8 +0,0 @@ -Every MM:S library should be located in this directory. - -How to prepare a release: -1) Copy the latest MM:S dlls into this folder -2) Append .source to the Source binaries and .orangebox to the OrangeBox binaries -3) Run Attach.exe -4) Test MMS_Installer.exe once (recommended) -5) Release it or e-Mail me if you find a bug \ No newline at end of file diff --git a/installer/install.bmp b/installer/install.bmp deleted file mode 100644 index 39b905be4507286639395912964881258552398f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154542 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 diff --git a/installer/upx.exe b/installer/upx.exe deleted file mode 100644 index d47856823e48792f97d19f20ed08d40bc7cb0d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126464 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 z 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,<=,>= comparison operators to allow storage in ordered containers. -// * Substantial reduction of code size, especially the 'Closure' class. -// * Standardised all the compiler-specific workarounds. -// * MFP conversion now works for CodePlay (but not yet supported in the full code). -// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 -// * New syntax: FastDelegate< int (char *, double) >. -// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). -// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. -// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" -// * Fully supported by CodePlay VectorC -// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! -// * More optimal assignment,== and != operators for static function pointers. - -#ifndef FASTDELEGATE_H -#define FASTDELEGATE_H - -#ifdef _MSC_VER -# if _MSC_VER > 1000 -# pragma once -# endif // _MSC_VER > 1000 -#endif // #ifdef _MSC_VER - -#include // to allow <,> comparisons - -//////////////////////////////////////////////////////////////////////////////// -// Configuration options -// -//////////////////////////////////////////////////////////////////////////////// - -// Uncomment the following #define for optimally-sized delegates. -// In this case, the generated asm code is almost identical to the code you'd get -// if the compiler had native support for delegates. -// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). -// Thus, it will not work for DOS compilers using the medium model. -// It will also probably fail on some DSP systems. -#define FASTDELEGATE_USESTATICFUNCTIONHACK - -// Uncomment the next line to allow function declarator syntax. -// It is automatically enabled for those compilers where it is known to work. -//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Compiler identification for workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Compiler identification. It's not easy to identify Visual C++ because -// many vendors fraudulently define Microsoft's identifiers. -#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) -#define FASTDLGT_ISMSVC - -#if (_MSC_VER <1300) // Many workarounds are required for VC6. -#define FASTDLGT_VC6 -#pragma warning(disable:4786) // disable this ridiculous warning -#endif - -#endif - -// Does the compiler uses Microsoft's member function pointer structure? -// If so, it needs special treatment. -// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's -// identifier, _MSC_VER. We need to filter Metrowerks out. -#if defined(_MSC_VER) && !defined(__MWERKS__) -#define FASTDLGT_MICROSOFT_MFP - -#if !defined(__VECTOR_C) -// CodePlay doesn't have the __single/multi/virtual_inheritance keywords -#define FASTDLGT_HASINHERITANCE_KEYWORDS -#endif -#endif - -// Does it allow function declarator syntax? The following compilers are known to work: -#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. -#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. -#if defined (__MWERKS__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -#ifdef __GNUC__ // Workaround GCC bug #8271 - // At present, GCC doesn't recognize constness of MFPs in templates -#define FASTDELEGATE_GCC_BUG_8271 -#endif - - - -//////////////////////////////////////////////////////////////////////////////// -// General tricks used in this code -// -// (a) Error messages are generated by typdefing an array of negative size to -// generate compile-time errors. -// (b) Warning messages on MSVC are generated by declaring unused variables, and -// enabling the "variable XXX is never used" warning. -// (c) Unions are used in a few compiler-specific cases to perform illegal casts. -// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to -// (char *) first to ensure that the correct number of *bytes* are added. -// -//////////////////////////////////////////////////////////////////////////////// -// Helper templates -// -//////////////////////////////////////////////////////////////////////////////// - - -namespace fastdelegate { -namespace detail { // we'll hide the implementation details in a nested namespace. - -// implicit_cast< > -// I believe this was originally going to be in the C++ standard but -// was left out by accident. It's even milder than static_cast. -// I use it instead of static_cast<> to emphasize that I'm not doing -// anything nasty. -// Usage is identical to static_cast<> -template -inline OutputClass implicit_cast(InputClass input){ - return input; -} - -// horrible_cast< > -// This is truly evil. It completely subverts C++'s type system, allowing you -// to cast from any class to any other class. Technically, using a union -// to perform the cast is undefined behaviour (even in C). But we can see if -// it is OK by checking that the union is the same size as each of its members. -// horrible_cast<> should only be used for compiler-specific workarounds. -// Usage is identical to reinterpret_cast<>. - -// This union is declared outside the horrible_cast because BCC 5.5.1 -// can't inline a function with a nested class, and gives a warning. -template -union horrible_union{ - OutputClass out; - InputClass in; -}; - -template -inline OutputClass horrible_cast(const InputClass input){ - horrible_union u; - // Cause a compile-time error if in, out and u are not the same size. - // If the compile fails here, it means the compiler has peculiar - // unions which would prevent the cast from working. - typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) - && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; - u.in = input; - return u.out; -} - -//////////////////////////////////////////////////////////////////////////////// -// Workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Backwards compatibility: This macro used to be necessary in the virtual inheritance -// case for Intel and Microsoft. Now it just forward-declares the class. -#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; - -// Prevent use of the static function hack with the DOS medium model. -#ifdef __MEDIUM__ -#undef FASTDELEGATE_USESTATICFUNCTIONHACK -#endif - -// DefaultVoid - a workaround for 'void' templates in VC6. -// -// (1) VC6 and earlier do not allow 'void' as a default template argument. -// (2) They also doesn't allow you to return 'void' from a function. -// -// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use -// when we'd like to use 'void'. We convert it into 'void' and back -// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. -// Workaround for (2): On VC6, the code for calling a void function is -// identical to the code for calling a non-void function in which the -// return value is never used, provided the return value is returned -// in the EAX register, rather than on the stack. -// This is true for most fundamental types such as int, enum, void *. -// Const void * is the safest option since it doesn't participate -// in any automatic conversions. But on a 16-bit compiler it might -// cause extra code to be generated, so we disable it for all compilers -// except for VC6 (and VC5). -#ifdef FASTDLGT_VC6 -// VC6 workaround -typedef const void * DefaultVoid; -#else -// On any other compiler, just use a normal void. -typedef void DefaultVoid; -#endif - -// Translate from 'DefaultVoid' to 'void'. -// Everything else is unchanged -template -struct DefaultVoidToVoid { typedef T type; }; - -template <> -struct DefaultVoidToVoid { typedef void type; }; - -// Translate from 'void' into 'DefaultVoid' -// Everything else is unchanged -template -struct VoidToDefaultVoid { typedef T type; }; - -template <> -struct VoidToDefaultVoid { typedef DefaultVoid type; }; - - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1: -// -// Conversion of member function pointer to a standard form -// -//////////////////////////////////////////////////////////////////////////////// - -// GenericClass is a fake class, ONLY used to provide a type. -// It is vitally important that it is never defined, so that the compiler doesn't -// think it can optimize the invocation. For example, Borland generates simpler -// code if it knows the class only uses single inheritance. - -// Compilers using Microsoft's structure need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS - // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP - // (4 bytes), even when the /vmg option is used. Declaring an empty class - // would give 16 byte pointers in this case.... - class __single_inheritance GenericClass; -#endif - // ...but for Codeplay, an empty class *always* gives 4 byte pointers. - // If compiled with the /clr option ("managed C++"), the JIT compiler thinks - // it needs to load GenericClass before it can call any of its functions, - // (compiles OK but crashes at runtime!), so we need to declare an - // empty class to make it happy. - // Codeplay and VC4 can't cope with the unknown_inheritance case either. - class GenericClass {}; -#else - class GenericClass; -#endif - -// The size of a single inheritance member function pointer. -const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); - -// SimplifyMemFunc< >::Convert() -// -// A template function that converts an arbitrary member function pointer into the -// simplest possible form of member function pointer, using a supplied 'this' pointer. -// According to the standard, this can be done legally with reinterpret_cast<>. -// For (non-standard) compilers which use member function pointers which vary in size -// depending on the class, we need to use knowledge of the internal structure of a -// member function pointer, as used by the compiler. Template specialization is used -// to distinguish between the sizes. Because some compilers don't support partial -// template specialisation, I use full specialisation of a wrapper struct. - -// general case -- don't know how to convert it. Force a compile failure -template -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // Unsupported member function type -- force a compile failure. - // (it's illegal to have a array with negative size). - typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; - return 0; - } -}; - -// For compilers where all member func ptrs are the same size, everything goes here. -// For non-standard compilers, only single_inheritance classes go here. -template <> -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { -#if defined __DMC__ - // Digital Mars doesn't allow you to cast between abitrary PMF's, - // even though the standard says you can. The 32-bit compiler lets you - // static_cast through an int, but the DOS compiler doesn't. - bound_func = horrible_cast(function_to_bind); -#else - bound_func = reinterpret_cast(function_to_bind); -#endif - return reinterpret_cast(pthis); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1b: -// -// Workarounds for Microsoft and Intel -// -//////////////////////////////////////////////////////////////////////////////// - - -// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), -// need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) -// at the start of each function for extra safety, but VC6 seems to ICE -// intermittently if you do this inside a template. - -// __multiple_inheritance classes go here -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -template<> -struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // We need to use a horrible_cast to do this conversion. - // In MSVC, a multiple inheritance member pointer is internally defined as: - union { - XFuncType func; - struct { - GenericMemFuncType funcaddress; // points to the actual member function - int delta; // #BYTES to be added to the 'this' pointer - }s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); - } -}; - -// virtual inheritance is a real nuisance. It's inefficient and complicated. -// On MSVC and Intel, there isn't enough information in the pointer itself to -// enable conversion to a closure pointer. Earlier versions of this code didn't -// work for all cases, and generated a compile-time error instead. -// But a very clever hack invented by John M. Dlugosz solves this problem. -// My code is somewhat different to his: I have no asm code, and I make no -// assumptions about the calling convention that is used. - -// In VC++ and ICL, a virtual_inheritance member pointer -// is internally defined as: -struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance -}; -// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the -// m_codeptr member is *always* called, regardless of the values of the other -// members. (This is *not* true for other compilers, eg GCC, which obtain the -// function address from the vtable if a virtual function is being called). -// Dlugosz's trick is to make the codeptr point to a probe function which -// returns the 'this' pointer that was used. - -// Define a generic class that uses virtual inheritance. -// It has a trival member function that returns the value of the 'this' pointer. -struct GenericVirtualClass : virtual public GenericClass -{ - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } -}; - -// __virtual_inheritance classes go here -template <> -struct SimplifyMemFunc -{ - - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - union { - XFuncType func; - GenericClass* (X::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = function_to_bind; - bound_func = reinterpret_cast(u.s.codeptr); - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) - && sizeof(function_to_bind)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - return (pthis->*u.ProbeFunc)(); - } -}; - -#if (_MSC_VER <1300) - -// Nasty hack for Microsoft Visual C++ 6.0 -// unknown_inheritance classes go here -// There is a compiler bug in MSVC6 which generates incorrect code in this case!! -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // There is an apalling but obscure compiler bug in MSVC6 and earlier: - // vtable_index and 'vtordisp' are always set to 0 in the - // unknown_inheritance case! - // This means that an incorrect function could be called!!! - // Compiling with the /vmg option leads to potentially incorrect code. - // This is probably the reason that the IDE has a user interface for specifying - // the /vmg option, but it is disabled - you can only specify /vmg on - // the command line. In VC1.5 and earlier, the compiler would ICE if it ever - // encountered this situation. - // It is OK to use the /vmg option if /vmm or /vms is specified. - - // Fortunately, the wrong function is only called in very obscure cases. - // It only occurs when a derived class overrides a virtual function declared - // in a virtual base class, and the member function - // points to the *Derived* version of that function. The problem can be - // completely averted in 100% of cases by using the *Base class* for the - // member fpointer. Ie, if you use the base class as an interface, you'll - // stay out of trouble. - // Occasionally, you might want to point directly to a derived class function - // that isn't an override of a base class. In this case, both vtable_index - // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. - // We can generate correct code in this case. To prevent an incorrect call from - // ever being made, on MSVC6 we generate a warning, and call a function to - // make the program crash instantly. - typedef char ERROR_VC6CompilerBug[-100]; - return 0; - } -}; - - -#else - -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -// unknown_inheritance classes go here -// This is probably the ugliest bit of code I've ever written. Look at the casts! -// There is a compiler bug in MSVC6 which prevents it from using this code. -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - XFuncType func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - GenericMemFuncType m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - const int * vtable = *reinterpret_cast( - reinterpret_cast(pthis) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - } - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - return reinterpret_cast( - reinterpret_cast(pthis) + u.s.delta + virtual_delta); - }; -}; -#endif // MSVC 7 and greater - -#endif // MS/Intel hacks - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 2: -// -// Define the delegate storage, and cope with static functions -// -//////////////////////////////////////////////////////////////////////////////// - -// DelegateMemento -- an opaque structure which can hold an arbitary delegate. -// It knows nothing about the calling convention or number of arguments used by -// the function pointed to. -// It supplies comparison operators so that it can be stored in STL collections. -// It cannot be set to anything other than null, nor invoked directly: -// it must be converted to a specific delegate. - -// Implementation: -// There are two possible implementations: the Safe method and the Evil method. -// DelegateMemento - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// A static function pointer is stored inside the class. -// Here are the valid values: -// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ -// | 0 | 0 | 0 | Empty | -// | !=0 |(dontcare)| Invoker | Static function| -// | 0 | !=0 | !=0* | Method call | -// +--------------------+----------+------------+----------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// When stored stored inside a specific delegate, the 'dontcare' entries are replaced -// with a reference to the delegate itself. This complicates the = and == operators -// for the delegate class. - -// DelegateMemento - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. In this case the DelegateMemento implementation is simple: -// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ -// | 0 | 0 | Empty | -// | !=0 | !=0* | Static function or method call| -// +----------+------------+-------------------------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - -class DelegateMemento { -protected: - // the data is protected, not private, because many - // compilers have problems with template friends. - typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. - detail::GenericClass *m_pthis; - GenericMemFuncType m_pFunction; - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - typedef void (*GenericFuncPtr)(); // arbitrary code pointer - GenericFuncPtr m_pStaticFunction; -#endif - -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; - void clear() { - m_pthis=0; m_pFunction=0; m_pStaticFunction=0; - } -#else - DelegateMemento() : m_pthis(0), m_pFunction(0) {}; - void clear() { m_pthis=0; m_pFunction=0; } -#endif -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - inline bool IsEqual (const DelegateMemento &x) const{ - // We have to cope with the static function pointers as a special case - if (m_pFunction!=x.m_pFunction) return false; - // the static function ptrs must either both be equal, or both be 0. - if (m_pStaticFunction!=x.m_pStaticFunction) return false; - if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; - else return true; - } -#else // Evil Method - inline bool IsEqual (const DelegateMemento &x) const{ - return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; - } -#endif - // Provide a strict weak ordering for DelegateMementos. - inline bool IsLess(const DelegateMemento &right) const { - // deal with static function pointers first -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) - return m_pStaticFunction < right.m_pStaticFunction; -#endif - if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; - // There are no ordering operators for member function pointers, - // but we can fake one by comparing each byte. The resulting ordering is - // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. - return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; - - } - // BUGFIX (Mar 2005): - // We can't just compare m_pFunction because on Metrowerks, - // m_pFunction can be zero even if the delegate is not empty! - inline bool operator ! () const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } - inline bool empty() const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } -public: - DelegateMemento & operator = (const DelegateMemento &right) { - SetMementoFrom(right); - return *this; - } - inline bool operator <(const DelegateMemento &right) { - return IsLess(right); - } - inline bool operator >(const DelegateMemento &right) { - return right.IsLess(*this); - } - DelegateMemento (const DelegateMemento &right) : - m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - , m_pStaticFunction (right.m_pStaticFunction) -#endif - {} -protected: - void SetMementoFrom(const DelegateMemento &right) { - m_pFunction = right.m_pFunction; - m_pthis = right.m_pthis; -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = right.m_pStaticFunction; -#endif - } -}; - - -// ClosurePtr<> -// -// A private wrapper class that adds function signatures to DelegateMemento. -// It's the class that does most of the actual work. -// The signatures are specified by: -// GenericMemFunc: must be a type of GenericClass member function pointer. -// StaticFuncPtr: must be a type of function pointer with the same signature -// as GenericMemFunc. -// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 -// where it never returns void (returns DefaultVoid instead). - -// An outer class, FastDelegateN<>, handles the invoking and creates the -// necessary typedefs. -// This class does everything else. - -namespace detail { - -template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> -class ClosurePtr : public DelegateMemento { -public: - // These functions are for setting the delegate to a member function. - - // Here's the clever bit: we convert an arbitrary member function into a - // standard form. XMemFunc should be a member function of class X, but I can't - // enforce that here. It needs to be enforced by the wrapper class. - template < class X, class XMemFunc > - inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { - m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(pthis, function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } - // For const member functions, we only need a const class pointer. - // Since we know that the member function is const, it's safe to - // remove the const qualifier from the 'this' pointer with a const_cast. - // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. - template < class X, class XMemFunc> - inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { - m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(const_cast(pthis), function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates - template < class X, class XMemFunc> - inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { - bindconstmemfunc(pthis, function_to_bind); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#endif - // These functions are required for invoking the stored function - inline GenericClass *GetClosureThis() const { return m_pthis; } - inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } - -// There are a few ways of dealing with static function pointers. -// There's a standard-compliant, but tricky method. -// There's also a straightforward hack, that won't work on DOS compilers using the -// medium memory model. It's so evil that I can't recommend it, but I've -// implemented it anyway because it produces very nice asm code. - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - -// ClosurePtr<> - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// I store the function pointer inside the class, and the delegate then -// points to itself. Whenever the delegate is copied, these self-references -// must be transformed, and this complicates the = and == operators. -public: - // The next two functions are for operator ==, =, and the copy constructor. - // We may need to convert the m_pthis pointers, so that - // they remain as self-references. - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { - SetMementoFrom(x); - if (m_pStaticFunction!=0) { - // transform self references... - m_pthis=reinterpret_cast(pParent); - } - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - template < class DerivedClass, class ParentInvokerSig > - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind ) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - bindmemfunc(pParent, static_function_invoker); - } - m_pStaticFunction=reinterpret_cast(function_to_bind); - } - inline UnvoidStaticFuncPtr GetStaticFunction() const { - return reinterpret_cast(m_pStaticFunction); - } -#else - -// ClosurePtr<> - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and -// speeds up comparison and assignment. If C++ provided direct language support -// for delegates, they would produce asm code that was almost identical to this. -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { - SetMementoFrom(right); - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - // ******** EVIL, EVIL CODE! ******* - template < class DerivedClass, class ParentInvokerSig> - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - // We'll be ignoring the 'this' pointer, but we need to make sure we pass - // a valid value to bindmemfunc(). - bindmemfunc(pParent, static_function_invoker); - } - - // WARNING! Evil hack. We store the function in the 'this' pointer! - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; - m_pthis = horrible_cast(function_to_bind); - // MSVC, SunC++ and DMC accept the following (non-standard) code: -// m_pthis = static_cast(static_cast(function_to_bind)); - // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long -// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); - } - // ******** EVIL, EVIL CODE! ******* - // This function will be called with an invalid 'this' pointer!! - // We're just returning the 'this' pointer, converted into - // a function pointer! - inline UnvoidStaticFuncPtr GetStaticFunction() const { - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; - return horrible_cast(this); - } -#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - - // Does the closure contain this static function? - inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ - if (funcptr==0) return empty(); - // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary - // value that is not equal to any valid function pointer. - else return funcptr==reinterpret_cast(GetStaticFunction()); - } -}; - - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 3: -// -// Wrapper classes to ensure type safety -// -//////////////////////////////////////////////////////////////////////////////// - - -// Once we have the member function conversion templates, it's easy to make the -// wrapper classes. So that they will work with as many compilers as possible, -// the classes are of the form -// FastDelegate3 -// They can cope with any combination of parameters. The max number of parameters -// allowed is 8, but it is trivial to increase this limit. -// Note that we need to treat const member functions seperately. -// All this class does is to enforce type safety, and invoke the delegate with -// the correct list of parameters. - -// Because of the weird rule about the class of derived member function pointers, -// you sometimes need to apply a downcast to the 'this' pointer. -// This is the reason for the use of "implicit_cast(pthis)" in the code below. -// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, -// without this trick you'd need to write: -// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); -// but with the trick you can write -// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); - -// RetType is the type the compiler uses in compiling the template. For VC6, -// it cannot be void. DesiredRetType is the real type which is returned from -// all of the functions. It can be void. - -// Implicit conversion to "bool" is achieved using the safe_bool idiom, -// using member data pointers (MDP). This allows "if (dg)..." syntax -// Because some compilers (eg codeplay) don't have a unique value for a zero -// MDP, an extra padding member is added to the SafeBool struct. -// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so -// in that case the static function constructor is not made explicit; this -// allows "if (dg==0) ..." to compile. - -//N=0 -template -class FastDelegate0 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(); - typedef RetType (*UnvoidStaticFunctionPtr)(); - typedef RetType (detail::GenericClass::*GenericMemFn)(); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate0 type; - - // Construction and comparison functions - FastDelegate0() { clear(); } - FastDelegate0(const FastDelegate0 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate0 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate0 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate0 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate0 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate0 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate0(DesiredRetType (*function_to_bind)() ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)() ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)()) { - m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() () const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction() const { - return (*(m_Closure.GetStaticFunction()))(); } -}; - -//N=1 -template -class FastDelegate1 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate1 type; - - // Construction and comparison functions - FastDelegate1() { clear(); } - FastDelegate1(const FastDelegate1 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate1 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate1 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate1 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate1 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate1 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { - m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1) const { - return (*(m_Closure.GetStaticFunction()))(p1); } -}; - -//N=2 -template -class FastDelegate2 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate2 type; - - // Construction and comparison functions - FastDelegate2() { clear(); } - FastDelegate2(const FastDelegate2 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate2 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate2 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate2 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate2 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate2 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { - m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2); } -}; - -//N=3 -template -class FastDelegate3 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate3 type; - - // Construction and comparison functions - FastDelegate3() { clear(); } - FastDelegate3(const FastDelegate3 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate3 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate3 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate3 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate3 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate3 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { - m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } -}; - -//N=4 -template -class FastDelegate4 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate4 type; - - // Construction and comparison functions - FastDelegate4() { clear(); } - FastDelegate4(const FastDelegate4 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate4 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate4 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate4 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate4 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate4 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } -}; - -//N=5 -template -class FastDelegate5 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate5 type; - - // Construction and comparison functions - FastDelegate5() { clear(); } - FastDelegate5(const FastDelegate5 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate5 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate5 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate5 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate5 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate5 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } -}; - -//N=6 -template -class FastDelegate6 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate6 type; - - // Construction and comparison functions - FastDelegate6() { clear(); } - FastDelegate6(const FastDelegate6 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate6 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate6 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate6 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate6 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate6 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } -}; - -//N=7 -template -class FastDelegate7 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate7 type; - - // Construction and comparison functions - FastDelegate7() { clear(); } - FastDelegate7(const FastDelegate7 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate7 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate7 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate7 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate7 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate7 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } -}; - -//N=8 -template -class FastDelegate8 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate8 type; - - // Construction and comparison functions - FastDelegate8() { clear(); } - FastDelegate8(const FastDelegate8 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate8 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate8 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate8 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate8 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate8 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } -}; - -//N=9 -template -class FastDelegate9 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate9 type; - - // Construction and comparison functions - FastDelegate9() { clear(); } - FastDelegate9(const FastDelegate9 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate9 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate9 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate9 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate9 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate9 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate9(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate9(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate9(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - m_Closure.bindstaticfunc(this, &FastDelegate9::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } -}; - -//N=10 -template -class FastDelegate10 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate10 type; - - // Construction and comparison functions - FastDelegate10() { clear(); } - FastDelegate10(const FastDelegate10 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate10 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate10 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate10 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate10 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate10 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate10(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate10(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate10(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - m_Closure.bindstaticfunc(this, &FastDelegate10::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } -}; - -//N=11 -template -class FastDelegate11 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate11 type; - - // Construction and comparison functions - FastDelegate11() { clear(); } - FastDelegate11(const FastDelegate11 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate11 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate11 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate11 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate11 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate11 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate11(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate11(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate11(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - m_Closure.bindstaticfunc(this, &FastDelegate11::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } -}; - -//N=12 -template -class FastDelegate12 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate12 type; - - // Construction and comparison functions - FastDelegate12() { clear(); } - FastDelegate12(const FastDelegate12 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate12 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate12 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate12 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate12 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate12 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate12(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate12(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate12(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - m_Closure.bindstaticfunc(this, &FastDelegate12::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } -}; - -//N=13 -template -class FastDelegate13 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate13 type; - - // Construction and comparison functions - FastDelegate13() { clear(); } - FastDelegate13(const FastDelegate13 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate13 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate13 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate13 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate13 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate13 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate13(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate13(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate13(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - m_Closure.bindstaticfunc(this, &FastDelegate13::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } -}; - -//N=14 -template -class FastDelegate14 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate14 type; - - // Construction and comparison functions - FastDelegate14() { clear(); } - FastDelegate14(const FastDelegate14 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate14 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate14 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate14 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate14 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate14 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate14(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate14(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate14(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - m_Closure.bindstaticfunc(this, &FastDelegate14::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } -}; - -//N=15 -template -class FastDelegate15 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate15 type; - - // Construction and comparison functions - FastDelegate15() { clear(); } - FastDelegate15(const FastDelegate15 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate15 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate15 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate15 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate15 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate15 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate15(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate15(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate15(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - m_Closure.bindstaticfunc(this, &FastDelegate15::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } -}; - -//N=16 -template -class FastDelegate16 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate16 type; - - // Construction and comparison functions - FastDelegate16() { clear(); } - FastDelegate16(const FastDelegate16 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate16 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate16 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate16 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate16 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate16 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate16(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate16(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate16(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - m_Closure.bindstaticfunc(this, &FastDelegate16::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } -}; - -//N=17 -template -class FastDelegate17 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate17 type; - - // Construction and comparison functions - FastDelegate17() { clear(); } - FastDelegate17(const FastDelegate17 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate17 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate17 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate17 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate17 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate17 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate17(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate17(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate17(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - m_Closure.bindstaticfunc(this, &FastDelegate17::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } -}; - -//N=18 -template -class FastDelegate18 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate18 type; - - // Construction and comparison functions - FastDelegate18() { clear(); } - FastDelegate18(const FastDelegate18 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate18 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate18 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate18 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate18 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate18 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate18(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate18(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate18(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - m_Closure.bindstaticfunc(this, &FastDelegate18::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } -}; - -//N=19 -template -class FastDelegate19 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate19 type; - - // Construction and comparison functions - FastDelegate19() { clear(); } - FastDelegate19(const FastDelegate19 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate19 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate19 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate19 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate19 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate19 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate19(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate19(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate19(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - m_Closure.bindstaticfunc(this, &FastDelegate19::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } -}; - -//N=20 -template -class FastDelegate20 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate20 type; - - // Construction and comparison functions - FastDelegate20() { clear(); } - FastDelegate20(const FastDelegate20 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate20 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate20 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate20 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate20 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate20 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate20(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate20(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate20(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - m_Closure.bindstaticfunc(this, &FastDelegate20::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } -}; - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 4: -// -// FastDelegate<> class (Original author: Jody Hagins) -// Allows boost::function style syntax like: -// FastDelegate< double (int, long) > -// instead of: -// FastDelegate2< int, long, double > -// -//////////////////////////////////////////////////////////////////////////////// - -#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -// Declare FastDelegate as a class template. It will be specialized -// later for all number of arguments. -template -class FastDelegate; - -//N=0 -// Specialization to allow use of -// FastDelegate< R ( ) > -// instead of -// FastDelegate0 < R > -template -class FastDelegate< R ( ) > - // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 - : public FastDelegate0 < R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate0 < R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=1 -// Specialization to allow use of -// FastDelegate< R ( Param1 ) > -// instead of -// FastDelegate1 < Param1, R > -template -class FastDelegate< R ( Param1 ) > - // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 - : public FastDelegate1 < Param1, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate1 < Param1, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=2 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2 ) > -// instead of -// FastDelegate2 < Param1, Param2, R > -template -class FastDelegate< R ( Param1, Param2 ) > - // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 - : public FastDelegate2 < Param1, Param2, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate2 < Param1, Param2, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=3 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3 ) > -// instead of -// FastDelegate3 < Param1, Param2, Param3, R > -template -class FastDelegate< R ( Param1, Param2, Param3 ) > - // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 - : public FastDelegate3 < Param1, Param2, Param3, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=4 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4 ) > -// instead of -// FastDelegate4 < Param1, Param2, Param3, Param4, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > - // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 - : public FastDelegate4 < Param1, Param2, Param3, Param4, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=5 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > -// instead of -// FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > - // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 - : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=6 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > -// instead of -// FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > - // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 - : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=7 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > -// instead of -// FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > - // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 - : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=8 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > -// instead of -// FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > - // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 - : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=9 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > -// instead of -// FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > - // Inherit from FastDelegate9 so that it can be treated just like a FastDelegate9 - : public FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=10 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > -// instead of -// FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > - // Inherit from FastDelegate10 so that it can be treated just like a FastDelegate10 - : public FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=11 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > -// instead of -// FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > - // Inherit from FastDelegate11 so that it can be treated just like a FastDelegate11 - : public FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=12 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > -// instead of -// FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > - // Inherit from FastDelegate12 so that it can be treated just like a FastDelegate12 - : public FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=13 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > -// instead of -// FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > - // Inherit from FastDelegate13 so that it can be treated just like a FastDelegate13 - : public FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=14 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > -// instead of -// FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > - // Inherit from FastDelegate14 so that it can be treated just like a FastDelegate14 - : public FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=15 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > -// instead of -// FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > - // Inherit from FastDelegate15 so that it can be treated just like a FastDelegate15 - : public FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=16 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > -// instead of -// FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > - // Inherit from FastDelegate16 so that it can be treated just like a FastDelegate16 - : public FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=17 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > -// instead of -// FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > - // Inherit from FastDelegate17 so that it can be treated just like a FastDelegate17 - : public FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=18 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > -// instead of -// FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > - // Inherit from FastDelegate18 so that it can be treated just like a FastDelegate18 - : public FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=19 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > -// instead of -// FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > - // Inherit from FastDelegate19 so that it can be treated just like a FastDelegate19 - : public FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=20 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > -// instead of -// FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > - // Inherit from FastDelegate20 so that it can be treated just like a FastDelegate20 - : public FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - - -#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 5: -// -// MakeDelegate() helper function -// -// MakeDelegate(&x, &X::func) returns a fastdelegate of the type -// necessary for calling x.func() with the correct number of arguments. -// This makes it possible to eliminate many typedefs from user code. -// -//////////////////////////////////////////////////////////////////////////////// - -// Also declare overloads of a MakeDelegate() global function to -// reduce the need for typedefs. -// We need seperate overloads for const and non-const member functions. -// Also, because of the weird rule about the class of derived member function pointers, -// implicit downcasts may need to be applied later to the 'this' pointer. -// That's why two classes (X and Y) appear in the definitions. Y must be implicitly -// castable to X. - -// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. -// GCC 3.2 and later won't compile this unless it's preceded by 'typename', -// but VC6 doesn't allow 'typename' in this context. -// So, I have to use a macro. - -#ifdef FASTDLGT_VC6 -#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type -#else -#define FASTDLGT_RETTYPE RetType -#endif - -//N=0 -template -FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { - return FastDelegate0(x, func); -} - -template -FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { - return FastDelegate0(x, func); -} - -template -FastDelegate0 MakeDelegate(RetType (*func)()) { - return FastDelegate0(func); -} - -//N=1 -template -FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { - return FastDelegate1(x, func); -} - -template -FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { - return FastDelegate1(x, func); -} - -template -FastDelegate1 MakeDelegate(RetType (*func)(Param1 p1)) { - return FastDelegate1(func); -} - -//N=2 -template -FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { - return FastDelegate2(x, func); -} - -template -FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { - return FastDelegate2(x, func); -} - -template -FastDelegate2 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2)) { - return FastDelegate2(func); -} - -//N=3 -template -FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { - return FastDelegate3(x, func); -} - -template -FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { - return FastDelegate3(x, func); -} - -template -FastDelegate3 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3)) { - return FastDelegate3(func); -} - -//N=4 -template -FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - return FastDelegate4(x, func); -} - -template -FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - return FastDelegate4(x, func); -} - -template -FastDelegate4 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - return FastDelegate4(func); -} - -//N=5 -template -FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - return FastDelegate5(x, func); -} - -template -FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - return FastDelegate5(x, func); -} - -template -FastDelegate5 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - return FastDelegate5(func); -} - -//N=6 -template -FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - return FastDelegate6(x, func); -} - -template -FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - return FastDelegate6(x, func); -} - -template -FastDelegate6 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - return FastDelegate6(func); -} - -//N=7 -template -FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - return FastDelegate7(x, func); -} - -template -FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - return FastDelegate7(x, func); -} - -template -FastDelegate7 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - return FastDelegate7(func); -} - -//N=8 -template -FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - return FastDelegate8(x, func); -} - -template -FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - return FastDelegate8(x, func); -} - -template -FastDelegate8 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - return FastDelegate8(func); -} - -//N=9 -template -FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - return FastDelegate9(x, func); -} - -template -FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - return FastDelegate9(x, func); -} - -template -FastDelegate9 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - return FastDelegate9(func); -} - -//N=10 -template -FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - return FastDelegate10(x, func); -} - -template -FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - return FastDelegate10(x, func); -} - -template -FastDelegate10 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - return FastDelegate10(func); -} - -//N=11 -template -FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - return FastDelegate11(x, func); -} - -template -FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - return FastDelegate11(x, func); -} - -template -FastDelegate11 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - return FastDelegate11(func); -} - -//N=12 -template -FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - return FastDelegate12(x, func); -} - -template -FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - return FastDelegate12(x, func); -} - -template -FastDelegate12 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - return FastDelegate12(func); -} - -//N=13 -template -FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - return FastDelegate13(x, func); -} - -template -FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - return FastDelegate13(x, func); -} - -template -FastDelegate13 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - return FastDelegate13(func); -} - -//N=14 -template -FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - return FastDelegate14(x, func); -} - -template -FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - return FastDelegate14(x, func); -} - -template -FastDelegate14 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - return FastDelegate14(func); -} - -//N=15 -template -FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - return FastDelegate15(x, func); -} - -template -FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - return FastDelegate15(x, func); -} - -template -FastDelegate15 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - return FastDelegate15(func); -} - -//N=16 -template -FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - return FastDelegate16(x, func); -} - -template -FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - return FastDelegate16(x, func); -} - -template -FastDelegate16 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - return FastDelegate16(func); -} - -//N=17 -template -FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - return FastDelegate17(x, func); -} - -template -FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - return FastDelegate17(x, func); -} - -template -FastDelegate17 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - return FastDelegate17(func); -} - -//N=18 -template -FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - return FastDelegate18(x, func); -} - -template -FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - return FastDelegate18(x, func); -} - -template -FastDelegate18 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - return FastDelegate18(func); -} - -//N=19 -template -FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - return FastDelegate19(x, func); -} - -template -FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - return FastDelegate19(x, func); -} - -template -FastDelegate19 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - return FastDelegate19(func); -} - -//N=20 -template -FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - return FastDelegate20(x, func); -} - -template -FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - return FastDelegate20(x, func); -} - -template -FastDelegate20 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - return FastDelegate20(func); -} - - - // clean up after ourselves... -#undef FASTDLGT_RETTYPE - -} // namespace fastdelegate - -#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/FastDelegate.h b/sourcehook/generate/FastDelegate.h deleted file mode 100644 index a17bb1a..0000000 --- a/sourcehook/generate/FastDelegate.h +++ /dev/null @@ -1,3811 +0,0 @@ -// FastDelegate.h -// Efficient delegates in C++ that generate only two lines of asm code! -// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp -// -// - Don Clugston, Mar 2004. -// Major contributions were made by Jody Hagins. -// History: -// 24-Apr-04 1.0 * Submitted to CodeProject. -// 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. -// * Improved syntax for horrible_cast (thanks Paul Bludov). -// * Tested on Metrowerks MWCC and Intel ICL (IA32) -// * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. -// 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 -// * Now works on /clr "managed C++" code on VC7, VC7.1 -// * Comeau C++ now compiles without warnings. -// * Prevent the virtual inheritance case from being used on -// VC6 and earlier, which generate incorrect code. -// * Improved warning and error messages. Non-standard hacks -// now have compile-time checks to make them safer. -// * implicit_cast used instead of static_cast in many cases. -// * If calling a const member function, a const class pointer can be used. -// * MakeDelegate() global helper function added to simplify pass-by-value. -// * Added fastdelegate.clear() -// 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) -// 30-Oct-04 1.3 * Support for (non-void) return values. -// * No more workarounds in client code! -// MSVC and Intel now use a clever hack invented by John Dlugosz: -// - The FASTDELEGATEDECLARE workaround is no longer necessary. -// - No more warning messages for VC6 -// * Less use of macros. Error messages should be more comprehensible. -// * Added include guards -// * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). -// * Now tested on VS 2005 Express Beta, PGI C++ -// 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. -// * <,>,<=,>= comparison operators to allow storage in ordered containers. -// * Substantial reduction of code size, especially the 'Closure' class. -// * Standardised all the compiler-specific workarounds. -// * MFP conversion now works for CodePlay (but not yet supported in the full code). -// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 -// * New syntax: FastDelegate< int (char *, double) >. -// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). -// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. -// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" -// * Fully supported by CodePlay VectorC -// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! -// * More optimal assignment,== and != operators for static function pointers. - -#ifndef FASTDELEGATE_H -#define FASTDELEGATE_H - -#ifdef _MSC_VER -# if _MSC_VER > 1000 -# pragma once -# endif // _MSC_VER > 1000 -#endif // #ifdef _MSC_VER - -#include // to allow <,> comparisons - -//////////////////////////////////////////////////////////////////////////////// -// Configuration options -// -//////////////////////////////////////////////////////////////////////////////// - -// Uncomment the following #define for optimally-sized delegates. -// In this case, the generated asm code is almost identical to the code you'd get -// if the compiler had native support for delegates. -// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). -// Thus, it will not work for DOS compilers using the medium model. -// It will also probably fail on some DSP systems. -#define FASTDELEGATE_USESTATICFUNCTIONHACK - -// Uncomment the next line to allow function declarator syntax. -// It is automatically enabled for those compilers where it is known to work. -//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Compiler identification for workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Compiler identification. It's not easy to identify Visual C++ because -// many vendors fraudulently define Microsoft's identifiers. -#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) -#define FASTDLGT_ISMSVC - -#if (_MSC_VER <1300) // Many workarounds are required for VC6. -#define FASTDLGT_VC6 -#pragma warning(disable:4786) // disable this ridiculous warning -#endif - -#endif - -// Does the compiler uses Microsoft's member function pointer structure? -// If so, it needs special treatment. -// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's -// identifier, _MSC_VER. We need to filter Metrowerks out. -#if defined(_MSC_VER) && !defined(__MWERKS__) -#define FASTDLGT_MICROSOFT_MFP - -#if !defined(__VECTOR_C) -// CodePlay doesn't have the __single/multi/virtual_inheritance keywords -#define FASTDLGT_HASINHERITANCE_KEYWORDS -#endif -#endif - -// Does it allow function declarator syntax? The following compilers are known to work: -#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. -#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. -#if defined (__MWERKS__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -#ifdef __GNUC__ // Workaround GCC bug #8271 - // At present, GCC doesn't recognize constness of MFPs in templates -#define FASTDELEGATE_GCC_BUG_8271 -#endif - - - -//////////////////////////////////////////////////////////////////////////////// -// General tricks used in this code -// -// (a) Error messages are generated by typdefing an array of negative size to -// generate compile-time errors. -// (b) Warning messages on MSVC are generated by declaring unused variables, and -// enabling the "variable XXX is never used" warning. -// (c) Unions are used in a few compiler-specific cases to perform illegal casts. -// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to -// (char *) first to ensure that the correct number of *bytes* are added. -// -//////////////////////////////////////////////////////////////////////////////// -// Helper templates -// -//////////////////////////////////////////////////////////////////////////////// - - -namespace fastdelegate { -namespace detail { // we'll hide the implementation details in a nested namespace. - -// implicit_cast< > -// I believe this was originally going to be in the C++ standard but -// was left out by accident. It's even milder than static_cast. -// I use it instead of static_cast<> to emphasize that I'm not doing -// anything nasty. -// Usage is identical to static_cast<> -template -inline OutputClass implicit_cast(InputClass input){ - return input; -} - -// horrible_cast< > -// This is truly evil. It completely subverts C++'s type system, allowing you -// to cast from any class to any other class. Technically, using a union -// to perform the cast is undefined behaviour (even in C). But we can see if -// it is OK by checking that the union is the same size as each of its members. -// horrible_cast<> should only be used for compiler-specific workarounds. -// Usage is identical to reinterpret_cast<>. - -// This union is declared outside the horrible_cast because BCC 5.5.1 -// can't inline a function with a nested class, and gives a warning. -template -union horrible_union{ - OutputClass out; - InputClass in; -}; - -template -inline OutputClass horrible_cast(const InputClass input){ - horrible_union u; - // Cause a compile-time error if in, out and u are not the same size. - // If the compile fails here, it means the compiler has peculiar - // unions which would prevent the cast from working. - typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) - && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; - u.in = input; - return u.out; -} - -//////////////////////////////////////////////////////////////////////////////// -// Workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Backwards compatibility: This macro used to be necessary in the virtual inheritance -// case for Intel and Microsoft. Now it just forward-declares the class. -#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; - -// Prevent use of the static function hack with the DOS medium model. -#ifdef __MEDIUM__ -#undef FASTDELEGATE_USESTATICFUNCTIONHACK -#endif - -// DefaultVoid - a workaround for 'void' templates in VC6. -// -// (1) VC6 and earlier do not allow 'void' as a default template argument. -// (2) They also doesn't allow you to return 'void' from a function. -// -// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use -// when we'd like to use 'void'. We convert it into 'void' and back -// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. -// Workaround for (2): On VC6, the code for calling a void function is -// identical to the code for calling a non-void function in which the -// return value is never used, provided the return value is returned -// in the EAX register, rather than on the stack. -// This is true for most fundamental types such as int, enum, void *. -// Const void * is the safest option since it doesn't participate -// in any automatic conversions. But on a 16-bit compiler it might -// cause extra code to be generated, so we disable it for all compilers -// except for VC6 (and VC5). -#ifdef FASTDLGT_VC6 -// VC6 workaround -typedef const void * DefaultVoid; -#else -// On any other compiler, just use a normal void. -typedef void DefaultVoid; -#endif - -// Translate from 'DefaultVoid' to 'void'. -// Everything else is unchanged -template -struct DefaultVoidToVoid { typedef T type; }; - -template <> -struct DefaultVoidToVoid { typedef void type; }; - -// Translate from 'void' into 'DefaultVoid' -// Everything else is unchanged -template -struct VoidToDefaultVoid { typedef T type; }; - -template <> -struct VoidToDefaultVoid { typedef DefaultVoid type; }; - - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1: -// -// Conversion of member function pointer to a standard form -// -//////////////////////////////////////////////////////////////////////////////// - -// GenericClass is a fake class, ONLY used to provide a type. -// It is vitally important that it is never defined, so that the compiler doesn't -// think it can optimize the invocation. For example, Borland generates simpler -// code if it knows the class only uses single inheritance. - -// Compilers using Microsoft's structure need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS - // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP - // (4 bytes), even when the /vmg option is used. Declaring an empty class - // would give 16 byte pointers in this case.... - class __single_inheritance GenericClass; -#endif - // ...but for Codeplay, an empty class *always* gives 4 byte pointers. - // If compiled with the /clr option ("managed C++"), the JIT compiler thinks - // it needs to load GenericClass before it can call any of its functions, - // (compiles OK but crashes at runtime!), so we need to declare an - // empty class to make it happy. - // Codeplay and VC4 can't cope with the unknown_inheritance case either. - class GenericClass {}; -#else - class GenericClass; -#endif - -// The size of a single inheritance member function pointer. -const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); - -// SimplifyMemFunc< >::Convert() -// -// A template function that converts an arbitrary member function pointer into the -// simplest possible form of member function pointer, using a supplied 'this' pointer. -// According to the standard, this can be done legally with reinterpret_cast<>. -// For (non-standard) compilers which use member function pointers which vary in size -// depending on the class, we need to use knowledge of the internal structure of a -// member function pointer, as used by the compiler. Template specialization is used -// to distinguish between the sizes. Because some compilers don't support partial -// template specialisation, I use full specialisation of a wrapper struct. - -// general case -- don't know how to convert it. Force a compile failure -template -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // Unsupported member function type -- force a compile failure. - // (it's illegal to have a array with negative size). - typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; - return 0; - } -}; - -// For compilers where all member func ptrs are the same size, everything goes here. -// For non-standard compilers, only single_inheritance classes go here. -template <> -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { -#if defined __DMC__ - // Digital Mars doesn't allow you to cast between abitrary PMF's, - // even though the standard says you can. The 32-bit compiler lets you - // static_cast through an int, but the DOS compiler doesn't. - bound_func = horrible_cast(function_to_bind); -#else - bound_func = reinterpret_cast(function_to_bind); -#endif - return reinterpret_cast(pthis); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1b: -// -// Workarounds for Microsoft and Intel -// -//////////////////////////////////////////////////////////////////////////////// - - -// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), -// need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) -// at the start of each function for extra safety, but VC6 seems to ICE -// intermittently if you do this inside a template. - -// __multiple_inheritance classes go here -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -template<> -struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // We need to use a horrible_cast to do this conversion. - // In MSVC, a multiple inheritance member pointer is internally defined as: - union { - XFuncType func; - struct { - GenericMemFuncType funcaddress; // points to the actual member function - int delta; // #BYTES to be added to the 'this' pointer - }s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); - } -}; - -// virtual inheritance is a real nuisance. It's inefficient and complicated. -// On MSVC and Intel, there isn't enough information in the pointer itself to -// enable conversion to a closure pointer. Earlier versions of this code didn't -// work for all cases, and generated a compile-time error instead. -// But a very clever hack invented by John M. Dlugosz solves this problem. -// My code is somewhat different to his: I have no asm code, and I make no -// assumptions about the calling convention that is used. - -// In VC++ and ICL, a virtual_inheritance member pointer -// is internally defined as: -struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance -}; -// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the -// m_codeptr member is *always* called, regardless of the values of the other -// members. (This is *not* true for other compilers, eg GCC, which obtain the -// function address from the vtable if a virtual function is being called). -// Dlugosz's trick is to make the codeptr point to a probe function which -// returns the 'this' pointer that was used. - -// Define a generic class that uses virtual inheritance. -// It has a trival member function that returns the value of the 'this' pointer. -struct GenericVirtualClass : virtual public GenericClass -{ - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } -}; - -// __virtual_inheritance classes go here -template <> -struct SimplifyMemFunc -{ - - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - union { - XFuncType func; - GenericClass* (X::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = function_to_bind; - bound_func = reinterpret_cast(u.s.codeptr); - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) - && sizeof(function_to_bind)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - return (pthis->*u.ProbeFunc)(); - } -}; - -#if (_MSC_VER <1300) - -// Nasty hack for Microsoft Visual C++ 6.0 -// unknown_inheritance classes go here -// There is a compiler bug in MSVC6 which generates incorrect code in this case!! -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // There is an apalling but obscure compiler bug in MSVC6 and earlier: - // vtable_index and 'vtordisp' are always set to 0 in the - // unknown_inheritance case! - // This means that an incorrect function could be called!!! - // Compiling with the /vmg option leads to potentially incorrect code. - // This is probably the reason that the IDE has a user interface for specifying - // the /vmg option, but it is disabled - you can only specify /vmg on - // the command line. In VC1.5 and earlier, the compiler would ICE if it ever - // encountered this situation. - // It is OK to use the /vmg option if /vmm or /vms is specified. - - // Fortunately, the wrong function is only called in very obscure cases. - // It only occurs when a derived class overrides a virtual function declared - // in a virtual base class, and the member function - // points to the *Derived* version of that function. The problem can be - // completely averted in 100% of cases by using the *Base class* for the - // member fpointer. Ie, if you use the base class as an interface, you'll - // stay out of trouble. - // Occasionally, you might want to point directly to a derived class function - // that isn't an override of a base class. In this case, both vtable_index - // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. - // We can generate correct code in this case. To prevent an incorrect call from - // ever being made, on MSVC6 we generate a warning, and call a function to - // make the program crash instantly. - typedef char ERROR_VC6CompilerBug[-100]; - return 0; - } -}; - - -#else - -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -// unknown_inheritance classes go here -// This is probably the ugliest bit of code I've ever written. Look at the casts! -// There is a compiler bug in MSVC6 which prevents it from using this code. -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - XFuncType func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - GenericMemFuncType m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - const int * vtable = *reinterpret_cast( - reinterpret_cast(pthis) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - } - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - return reinterpret_cast( - reinterpret_cast(pthis) + u.s.delta + virtual_delta); - }; -}; -#endif // MSVC 7 and greater - -#endif // MS/Intel hacks - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 2: -// -// Define the delegate storage, and cope with static functions -// -//////////////////////////////////////////////////////////////////////////////// - -// DelegateMemento -- an opaque structure which can hold an arbitary delegate. -// It knows nothing about the calling convention or number of arguments used by -// the function pointed to. -// It supplies comparison operators so that it can be stored in STL collections. -// It cannot be set to anything other than null, nor invoked directly: -// it must be converted to a specific delegate. - -// Implementation: -// There are two possible implementations: the Safe method and the Evil method. -// DelegateMemento - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// A static function pointer is stored inside the class. -// Here are the valid values: -// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ -// | 0 | 0 | 0 | Empty | -// | !=0 |(dontcare)| Invoker | Static function| -// | 0 | !=0 | !=0* | Method call | -// +--------------------+----------+------------+----------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// When stored stored inside a specific delegate, the 'dontcare' entries are replaced -// with a reference to the delegate itself. This complicates the = and == operators -// for the delegate class. - -// DelegateMemento - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. In this case the DelegateMemento implementation is simple: -// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ -// | 0 | 0 | Empty | -// | !=0 | !=0* | Static function or method call| -// +----------+------------+-------------------------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - -class DelegateMemento { -protected: - // the data is protected, not private, because many - // compilers have problems with template friends. - typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. - detail::GenericClass *m_pthis; - GenericMemFuncType m_pFunction; - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - typedef void (*GenericFuncPtr)(); // arbitrary code pointer - GenericFuncPtr m_pStaticFunction; -#endif - -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; - void clear() { - m_pthis=0; m_pFunction=0; m_pStaticFunction=0; - } -#else - DelegateMemento() : m_pthis(0), m_pFunction(0) {}; - void clear() { m_pthis=0; m_pFunction=0; } -#endif -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - inline bool IsEqual (const DelegateMemento &x) const{ - // We have to cope with the static function pointers as a special case - if (m_pFunction!=x.m_pFunction) return false; - // the static function ptrs must either both be equal, or both be 0. - if (m_pStaticFunction!=x.m_pStaticFunction) return false; - if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; - else return true; - } -#else // Evil Method - inline bool IsEqual (const DelegateMemento &x) const{ - return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; - } -#endif - // Provide a strict weak ordering for DelegateMementos. - inline bool IsLess(const DelegateMemento &right) const { - // deal with static function pointers first -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) - return m_pStaticFunction < right.m_pStaticFunction; -#endif - if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; - // There are no ordering operators for member function pointers, - // but we can fake one by comparing each byte. The resulting ordering is - // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. - return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; - - } - // BUGFIX (Mar 2005): - // We can't just compare m_pFunction because on Metrowerks, - // m_pFunction can be zero even if the delegate is not empty! - inline bool operator ! () const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } - inline bool empty() const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } -public: - DelegateMemento & operator = (const DelegateMemento &right) { - SetMementoFrom(right); - return *this; - } - inline bool operator <(const DelegateMemento &right) { - return IsLess(right); - } - inline bool operator >(const DelegateMemento &right) { - return right.IsLess(*this); - } - DelegateMemento (const DelegateMemento &right) : - m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - , m_pStaticFunction (right.m_pStaticFunction) -#endif - {} -protected: - void SetMementoFrom(const DelegateMemento &right) { - m_pFunction = right.m_pFunction; - m_pthis = right.m_pthis; -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = right.m_pStaticFunction; -#endif - } -}; - - -// ClosurePtr<> -// -// A private wrapper class that adds function signatures to DelegateMemento. -// It's the class that does most of the actual work. -// The signatures are specified by: -// GenericMemFunc: must be a type of GenericClass member function pointer. -// StaticFuncPtr: must be a type of function pointer with the same signature -// as GenericMemFunc. -// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 -// where it never returns void (returns DefaultVoid instead). - -// An outer class, FastDelegateN<>, handles the invoking and creates the -// necessary typedefs. -// This class does everything else. - -namespace detail { - -template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> -class ClosurePtr : public DelegateMemento { -public: - // These functions are for setting the delegate to a member function. - - // Here's the clever bit: we convert an arbitrary member function into a - // standard form. XMemFunc should be a member function of class X, but I can't - // enforce that here. It needs to be enforced by the wrapper class. - template < class X, class XMemFunc > - inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { - m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(pthis, function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } - // For const member functions, we only need a const class pointer. - // Since we know that the member function is const, it's safe to - // remove the const qualifier from the 'this' pointer with a const_cast. - // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. - template < class X, class XMemFunc> - inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { - m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(const_cast(pthis), function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates - template < class X, class XMemFunc> - inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { - bindconstmemfunc(pthis, function_to_bind); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#endif - // These functions are required for invoking the stored function - inline GenericClass *GetClosureThis() const { return m_pthis; } - inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } - -// There are a few ways of dealing with static function pointers. -// There's a standard-compliant, but tricky method. -// There's also a straightforward hack, that won't work on DOS compilers using the -// medium memory model. It's so evil that I can't recommend it, but I've -// implemented it anyway because it produces very nice asm code. - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - -// ClosurePtr<> - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// I store the function pointer inside the class, and the delegate then -// points to itself. Whenever the delegate is copied, these self-references -// must be transformed, and this complicates the = and == operators. -public: - // The next two functions are for operator ==, =, and the copy constructor. - // We may need to convert the m_pthis pointers, so that - // they remain as self-references. - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { - SetMementoFrom(x); - if (m_pStaticFunction!=0) { - // transform self references... - m_pthis=reinterpret_cast(pParent); - } - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - template < class DerivedClass, class ParentInvokerSig > - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind ) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - bindmemfunc(pParent, static_function_invoker); - } - m_pStaticFunction=reinterpret_cast(function_to_bind); - } - inline UnvoidStaticFuncPtr GetStaticFunction() const { - return reinterpret_cast(m_pStaticFunction); - } -#else - -// ClosurePtr<> - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and -// speeds up comparison and assignment. If C++ provided direct language support -// for delegates, they would produce asm code that was almost identical to this. -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { - SetMementoFrom(right); - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - // ******** EVIL, EVIL CODE! ******* - template < class DerivedClass, class ParentInvokerSig> - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - // We'll be ignoring the 'this' pointer, but we need to make sure we pass - // a valid value to bindmemfunc(). - bindmemfunc(pParent, static_function_invoker); - } - - // WARNING! Evil hack. We store the function in the 'this' pointer! - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; - m_pthis = horrible_cast(function_to_bind); - // MSVC, SunC++ and DMC accept the following (non-standard) code: -// m_pthis = static_cast(static_cast(function_to_bind)); - // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long -// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); - } - // ******** EVIL, EVIL CODE! ******* - // This function will be called with an invalid 'this' pointer!! - // We're just returning the 'this' pointer, converted into - // a function pointer! - inline UnvoidStaticFuncPtr GetStaticFunction() const { - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; - return horrible_cast(this); - } -#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - - // Does the closure contain this static function? - inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ - if (funcptr==0) return empty(); - // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary - // value that is not equal to any valid function pointer. - else return funcptr==reinterpret_cast(GetStaticFunction()); - } -}; - - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 3: -// -// Wrapper classes to ensure type safety -// -//////////////////////////////////////////////////////////////////////////////// - - -// Once we have the member function conversion templates, it's easy to make the -// wrapper classes. So that they will work with as many compilers as possible, -// the classes are of the form -// FastDelegate3 -// They can cope with any combination of parameters. The max number of parameters -// allowed is 8, but it is trivial to increase this limit. -// Note that we need to treat const member functions seperately. -// All this class does is to enforce type safety, and invoke the delegate with -// the correct list of parameters. - -// Because of the weird rule about the class of derived member function pointers, -// you sometimes need to apply a downcast to the 'this' pointer. -// This is the reason for the use of "implicit_cast(pthis)" in the code below. -// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, -// without this trick you'd need to write: -// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); -// but with the trick you can write -// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); - -// RetType is the type the compiler uses in compiling the template. For VC6, -// it cannot be void. DesiredRetType is the real type which is returned from -// all of the functions. It can be void. - -// Implicit conversion to "bool" is achieved using the safe_bool idiom, -// using member data pointers (MDP). This allows "if (dg)..." syntax -// Because some compilers (eg codeplay) don't have a unique value for a zero -// MDP, an extra padding member is added to the SafeBool struct. -// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so -// in that case the static function constructor is not made explicit; this -// allows "if (dg==0) ..." to compile. - -//N=0 -template -class FastDelegate0 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(); - typedef RetType (*UnvoidStaticFunctionPtr)(); - typedef RetType (detail::GenericClass::*GenericMemFn)(); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate0 type; - - // Construction and comparison functions - FastDelegate0() { clear(); } - FastDelegate0(const FastDelegate0 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate0 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate0 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate0 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate0 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate0 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate0(Y *pthis, DesiredRetType (X::* function_to_bind)() ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)()) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate0(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)() const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate0(DesiredRetType (*function_to_bind)() ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)() ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)()) { - m_Closure.bindstaticfunc(this, &FastDelegate0::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() () const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction() const { - return (*(m_Closure.GetStaticFunction()))(); } -}; - -//N=1 -template -class FastDelegate1 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate1 type; - - // Construction and comparison functions - FastDelegate1() { clear(); } - FastDelegate1(const FastDelegate1 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate1 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate1 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate1 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate1 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate1 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate1(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate1(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate1(DesiredRetType (*function_to_bind)(Param1 p1) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1)) { - m_Closure.bindstaticfunc(this, &FastDelegate1::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1) const { - return (*(m_Closure.GetStaticFunction()))(p1); } -}; - -//N=2 -template -class FastDelegate2 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate2 type; - - // Construction and comparison functions - FastDelegate2() { clear(); } - FastDelegate2(const FastDelegate2 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate2 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate2 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate2 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate2 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate2 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate2(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate2(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate2(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2)) { - m_Closure.bindstaticfunc(this, &FastDelegate2::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2); } -}; - -//N=3 -template -class FastDelegate3 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate3 type; - - // Construction and comparison functions - FastDelegate3() { clear(); } - FastDelegate3(const FastDelegate3 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate3 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate3 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate3 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate3 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate3 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate3(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate3(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate3(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3)) { - m_Closure.bindstaticfunc(this, &FastDelegate3::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3); } -}; - -//N=4 -template -class FastDelegate4 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate4 type; - - // Construction and comparison functions - FastDelegate4() { clear(); } - FastDelegate4(const FastDelegate4 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate4 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate4 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate4 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate4 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate4 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate4(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate4(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate4(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - m_Closure.bindstaticfunc(this, &FastDelegate4::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4); } -}; - -//N=5 -template -class FastDelegate5 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate5 type; - - // Construction and comparison functions - FastDelegate5() { clear(); } - FastDelegate5(const FastDelegate5 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate5 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate5 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate5 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate5 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate5 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate5(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate5(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate5(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - m_Closure.bindstaticfunc(this, &FastDelegate5::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5); } -}; - -//N=6 -template -class FastDelegate6 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate6 type; - - // Construction and comparison functions - FastDelegate6() { clear(); } - FastDelegate6(const FastDelegate6 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate6 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate6 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate6 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate6 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate6 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate6(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate6(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate6(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - m_Closure.bindstaticfunc(this, &FastDelegate6::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6); } -}; - -//N=7 -template -class FastDelegate7 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate7 type; - - // Construction and comparison functions - FastDelegate7() { clear(); } - FastDelegate7(const FastDelegate7 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate7 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate7 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate7 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate7 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate7 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate7(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate7(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate7(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - m_Closure.bindstaticfunc(this, &FastDelegate7::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7); } -}; - -//N=8 -template -class FastDelegate8 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate8 type; - - // Construction and comparison functions - FastDelegate8() { clear(); } - FastDelegate8(const FastDelegate8 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate8 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate8 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate8 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate8 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate8 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate8(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate8(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate8(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - m_Closure.bindstaticfunc(this, &FastDelegate8::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8); } -}; - -//N=9 -template -class FastDelegate9 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate9 type; - - // Construction and comparison functions - FastDelegate9() { clear(); } - FastDelegate9(const FastDelegate9 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate9 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate9 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate9 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate9 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate9 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate9(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate9(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate9(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - m_Closure.bindstaticfunc(this, &FastDelegate9::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } -}; - -//N=10 -template -class FastDelegate10 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate10 type; - - // Construction and comparison functions - FastDelegate10() { clear(); } - FastDelegate10(const FastDelegate10 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate10 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate10 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate10 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate10 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate10 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate10(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate10(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate10(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - m_Closure.bindstaticfunc(this, &FastDelegate10::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } -}; - -//N=11 -template -class FastDelegate11 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate11 type; - - // Construction and comparison functions - FastDelegate11() { clear(); } - FastDelegate11(const FastDelegate11 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate11 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate11 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate11 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate11 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate11 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate11(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate11(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate11(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - m_Closure.bindstaticfunc(this, &FastDelegate11::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } -}; - -//N=12 -template -class FastDelegate12 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate12 type; - - // Construction and comparison functions - FastDelegate12() { clear(); } - FastDelegate12(const FastDelegate12 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate12 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate12 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate12 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate12 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate12 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate12(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate12(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate12(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - m_Closure.bindstaticfunc(this, &FastDelegate12::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } -}; - -//N=13 -template -class FastDelegate13 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate13 type; - - // Construction and comparison functions - FastDelegate13() { clear(); } - FastDelegate13(const FastDelegate13 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate13 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate13 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate13 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate13 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate13 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate13(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate13(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate13(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - m_Closure.bindstaticfunc(this, &FastDelegate13::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } -}; - -//N=14 -template -class FastDelegate14 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate14 type; - - // Construction and comparison functions - FastDelegate14() { clear(); } - FastDelegate14(const FastDelegate14 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate14 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate14 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate14 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate14 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate14 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate14(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate14(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate14(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - m_Closure.bindstaticfunc(this, &FastDelegate14::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } -}; - -//N=15 -template -class FastDelegate15 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate15 type; - - // Construction and comparison functions - FastDelegate15() { clear(); } - FastDelegate15(const FastDelegate15 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate15 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate15 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate15 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate15 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate15 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate15(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate15(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate15(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - m_Closure.bindstaticfunc(this, &FastDelegate15::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } -}; - -//N=16 -template -class FastDelegate16 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate16 type; - - // Construction and comparison functions - FastDelegate16() { clear(); } - FastDelegate16(const FastDelegate16 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate16 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate16 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate16 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate16 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate16 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate16(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate16(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate16(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - m_Closure.bindstaticfunc(this, &FastDelegate16::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } -}; - -//N=17 -template -class FastDelegate17 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate17 type; - - // Construction and comparison functions - FastDelegate17() { clear(); } - FastDelegate17(const FastDelegate17 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate17 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate17 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate17 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate17 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate17 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate17(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate17(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate17(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - m_Closure.bindstaticfunc(this, &FastDelegate17::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } -}; - -//N=18 -template -class FastDelegate18 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate18 type; - - // Construction and comparison functions - FastDelegate18() { clear(); } - FastDelegate18(const FastDelegate18 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate18 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate18 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate18 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate18 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate18 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate18(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate18(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate18(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - m_Closure.bindstaticfunc(this, &FastDelegate18::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } -}; - -//N=19 -template -class FastDelegate19 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate19 type; - - // Construction and comparison functions - FastDelegate19() { clear(); } - FastDelegate19(const FastDelegate19 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate19 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate19 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate19 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate19 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate19 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate19(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate19(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate19(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - m_Closure.bindstaticfunc(this, &FastDelegate19::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } -}; - -//N=20 -template -class FastDelegate20 { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef RetType (*UnvoidStaticFunctionPtr)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef RetType (detail::GenericClass::*GenericMemFn)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate20 type; - - // Construction and comparison functions - FastDelegate20() { clear(); } - FastDelegate20(const FastDelegate20 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate20 &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate20 &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate20 &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate20 &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate20 &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate20(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate20(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate20(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - m_Closure.bindstaticfunc(this, &FastDelegate20::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const { - return (*(m_Closure.GetStaticFunction()))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } -}; - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 4: -// -// FastDelegate<> class (Original author: Jody Hagins) -// Allows boost::function style syntax like: -// FastDelegate< double (int, long) > -// instead of: -// FastDelegate2< int, long, double > -// -//////////////////////////////////////////////////////////////////////////////// - -#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -// Declare FastDelegate as a class template. It will be specialized -// later for all number of arguments. -template -class FastDelegate; - -//N=0 -// Specialization to allow use of -// FastDelegate< R ( ) > -// instead of -// FastDelegate0 < R > -template -class FastDelegate< R ( ) > - // Inherit from FastDelegate0 so that it can be treated just like a FastDelegate0 - : public FastDelegate0 < R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate0 < R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=1 -// Specialization to allow use of -// FastDelegate< R ( Param1 ) > -// instead of -// FastDelegate1 < Param1, R > -template -class FastDelegate< R ( Param1 ) > - // Inherit from FastDelegate1 so that it can be treated just like a FastDelegate1 - : public FastDelegate1 < Param1, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate1 < Param1, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=2 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2 ) > -// instead of -// FastDelegate2 < Param1, Param2, R > -template -class FastDelegate< R ( Param1, Param2 ) > - // Inherit from FastDelegate2 so that it can be treated just like a FastDelegate2 - : public FastDelegate2 < Param1, Param2, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate2 < Param1, Param2, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=3 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3 ) > -// instead of -// FastDelegate3 < Param1, Param2, Param3, R > -template -class FastDelegate< R ( Param1, Param2, Param3 ) > - // Inherit from FastDelegate3 so that it can be treated just like a FastDelegate3 - : public FastDelegate3 < Param1, Param2, Param3, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate3 < Param1, Param2, Param3, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=4 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4 ) > -// instead of -// FastDelegate4 < Param1, Param2, Param3, Param4, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4 ) > - // Inherit from FastDelegate4 so that it can be treated just like a FastDelegate4 - : public FastDelegate4 < Param1, Param2, Param3, Param4, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate4 < Param1, Param2, Param3, Param4, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=5 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > -// instead of -// FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5 ) > - // Inherit from FastDelegate5 so that it can be treated just like a FastDelegate5 - : public FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate5 < Param1, Param2, Param3, Param4, Param5, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=6 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > -// instead of -// FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6 ) > - // Inherit from FastDelegate6 so that it can be treated just like a FastDelegate6 - : public FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate6 < Param1, Param2, Param3, Param4, Param5, Param6, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=7 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > -// instead of -// FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7 ) > - // Inherit from FastDelegate7 so that it can be treated just like a FastDelegate7 - : public FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate7 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=8 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > -// instead of -// FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8 ) > - // Inherit from FastDelegate8 so that it can be treated just like a FastDelegate8 - : public FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate8 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=9 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > -// instead of -// FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9 ) > - // Inherit from FastDelegate9 so that it can be treated just like a FastDelegate9 - : public FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate9 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=10 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > -// instead of -// FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 ) > - // Inherit from FastDelegate10 so that it can be treated just like a FastDelegate10 - : public FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate10 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=11 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > -// instead of -// FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11 ) > - // Inherit from FastDelegate11 so that it can be treated just like a FastDelegate11 - : public FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate11 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=12 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > -// instead of -// FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12 ) > - // Inherit from FastDelegate12 so that it can be treated just like a FastDelegate12 - : public FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate12 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=13 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > -// instead of -// FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13 ) > - // Inherit from FastDelegate13 so that it can be treated just like a FastDelegate13 - : public FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate13 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=14 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > -// instead of -// FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14 ) > - // Inherit from FastDelegate14 so that it can be treated just like a FastDelegate14 - : public FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate14 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=15 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > -// instead of -// FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15 ) > - // Inherit from FastDelegate15 so that it can be treated just like a FastDelegate15 - : public FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate15 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=16 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > -// instead of -// FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16 ) > - // Inherit from FastDelegate16 so that it can be treated just like a FastDelegate16 - : public FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate16 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=17 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > -// instead of -// FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17 ) > - // Inherit from FastDelegate17 so that it can be treated just like a FastDelegate17 - : public FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate17 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=18 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > -// instead of -// FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18 ) > - // Inherit from FastDelegate18 so that it can be treated just like a FastDelegate18 - : public FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate18 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=19 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > -// instead of -// FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19 ) > - // Inherit from FastDelegate19 so that it can be treated just like a FastDelegate19 - : public FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate19 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -//N=20 -// Specialization to allow use of -// FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > -// instead of -// FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > -template -class FastDelegate< R ( Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20 ) > - // Inherit from FastDelegate20 so that it can be treated just like a FastDelegate20 - : public FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate20 < Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20 )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - - -#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 5: -// -// MakeDelegate() helper function -// -// MakeDelegate(&x, &X::func) returns a fastdelegate of the type -// necessary for calling x.func() with the correct number of arguments. -// This makes it possible to eliminate many typedefs from user code. -// -//////////////////////////////////////////////////////////////////////////////// - -// Also declare overloads of a MakeDelegate() global function to -// reduce the need for typedefs. -// We need seperate overloads for const and non-const member functions. -// Also, because of the weird rule about the class of derived member function pointers, -// implicit downcasts may need to be applied later to the 'this' pointer. -// That's why two classes (X and Y) appear in the definitions. Y must be implicitly -// castable to X. - -// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. -// GCC 3.2 and later won't compile this unless it's preceded by 'typename', -// but VC6 doesn't allow 'typename' in this context. -// So, I have to use a macro. - -#ifdef FASTDLGT_VC6 -#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type -#else -#define FASTDLGT_RETTYPE RetType -#endif - -//N=0 -template -FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)()) { - return FastDelegate0(x, func); -} - -template -FastDelegate0 MakeDelegate(Y* x, RetType (X::*func)() const) { - return FastDelegate0(x, func); -} - -template -FastDelegate0 MakeDelegate(RetType (*func)()) { - return FastDelegate0(func); -} - -//N=1 -template -FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1)) { - return FastDelegate1(x, func); -} - -template -FastDelegate1 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1) const) { - return FastDelegate1(x, func); -} - -template -FastDelegate1 MakeDelegate(RetType (*func)(Param1 p1)) { - return FastDelegate1(func); -} - -//N=2 -template -FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2)) { - return FastDelegate2(x, func); -} - -template -FastDelegate2 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2) const) { - return FastDelegate2(x, func); -} - -template -FastDelegate2 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2)) { - return FastDelegate2(func); -} - -//N=3 -template -FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3)) { - return FastDelegate3(x, func); -} - -template -FastDelegate3 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3) const) { - return FastDelegate3(x, func); -} - -template -FastDelegate3 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3)) { - return FastDelegate3(func); -} - -//N=4 -template -FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - return FastDelegate4(x, func); -} - -template -FastDelegate4 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const) { - return FastDelegate4(x, func); -} - -template -FastDelegate4 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4)) { - return FastDelegate4(func); -} - -//N=5 -template -FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - return FastDelegate5(x, func); -} - -template -FastDelegate5 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const) { - return FastDelegate5(x, func); -} - -template -FastDelegate5 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5)) { - return FastDelegate5(func); -} - -//N=6 -template -FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - return FastDelegate6(x, func); -} - -template -FastDelegate6 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const) { - return FastDelegate6(x, func); -} - -template -FastDelegate6 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6)) { - return FastDelegate6(func); -} - -//N=7 -template -FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - return FastDelegate7(x, func); -} - -template -FastDelegate7 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const) { - return FastDelegate7(x, func); -} - -template -FastDelegate7 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7)) { - return FastDelegate7(func); -} - -//N=8 -template -FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - return FastDelegate8(x, func); -} - -template -FastDelegate8 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const) { - return FastDelegate8(x, func); -} - -template -FastDelegate8 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8)) { - return FastDelegate8(func); -} - -//N=9 -template -FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - return FastDelegate9(x, func); -} - -template -FastDelegate9 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const) { - return FastDelegate9(x, func); -} - -template -FastDelegate9 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9)) { - return FastDelegate9(func); -} - -//N=10 -template -FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - return FastDelegate10(x, func); -} - -template -FastDelegate10 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const) { - return FastDelegate10(x, func); -} - -template -FastDelegate10 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10)) { - return FastDelegate10(func); -} - -//N=11 -template -FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - return FastDelegate11(x, func); -} - -template -FastDelegate11 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const) { - return FastDelegate11(x, func); -} - -template -FastDelegate11 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11)) { - return FastDelegate11(func); -} - -//N=12 -template -FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - return FastDelegate12(x, func); -} - -template -FastDelegate12 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const) { - return FastDelegate12(x, func); -} - -template -FastDelegate12 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12)) { - return FastDelegate12(func); -} - -//N=13 -template -FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - return FastDelegate13(x, func); -} - -template -FastDelegate13 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const) { - return FastDelegate13(x, func); -} - -template -FastDelegate13 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13)) { - return FastDelegate13(func); -} - -//N=14 -template -FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - return FastDelegate14(x, func); -} - -template -FastDelegate14 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const) { - return FastDelegate14(x, func); -} - -template -FastDelegate14 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14)) { - return FastDelegate14(func); -} - -//N=15 -template -FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - return FastDelegate15(x, func); -} - -template -FastDelegate15 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const) { - return FastDelegate15(x, func); -} - -template -FastDelegate15 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15)) { - return FastDelegate15(func); -} - -//N=16 -template -FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - return FastDelegate16(x, func); -} - -template -FastDelegate16 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const) { - return FastDelegate16(x, func); -} - -template -FastDelegate16 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16)) { - return FastDelegate16(func); -} - -//N=17 -template -FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - return FastDelegate17(x, func); -} - -template -FastDelegate17 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const) { - return FastDelegate17(x, func); -} - -template -FastDelegate17 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17)) { - return FastDelegate17(func); -} - -//N=18 -template -FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - return FastDelegate18(x, func); -} - -template -FastDelegate18 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const) { - return FastDelegate18(x, func); -} - -template -FastDelegate18 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18)) { - return FastDelegate18(func); -} - -//N=19 -template -FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - return FastDelegate19(x, func); -} - -template -FastDelegate19 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const) { - return FastDelegate19(x, func); -} - -template -FastDelegate19 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19)) { - return FastDelegate19(func); -} - -//N=20 -template -FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - return FastDelegate20(x, func); -} - -template -FastDelegate20 MakeDelegate(Y* x, RetType (X::*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const) { - return FastDelegate20(x, func); -} - -template -FastDelegate20 MakeDelegate(RetType (*func)(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20)) { - return FastDelegate20(func); -} - - - // clean up after ourselves... -#undef FASTDLGT_RETTYPE - -} // namespace fastdelegate - -#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/FastDelegate.hxx b/sourcehook/generate/FastDelegate.hxx deleted file mode 100644 index 6f2fe49..0000000 --- a/sourcehook/generate/FastDelegate.hxx +++ /dev/null @@ -1,1054 +0,0 @@ -// FastDelegate.h -// Efficient delegates in C++ that generate only two lines of asm code! -// Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp -// -// - Don Clugston, Mar 2004. -// Major contributions were made by Jody Hagins. -// History: -// 24-Apr-04 1.0 * Submitted to CodeProject. -// 28-Apr-04 1.1 * Prevent most unsafe uses of evil static function hack. -// * Improved syntax for horrible_cast (thanks Paul Bludov). -// * Tested on Metrowerks MWCC and Intel ICL (IA32) -// * Compiled, but not run, on Comeau C++ and Intel Itanium ICL. -// 27-Jun-04 1.2 * Now works on Borland C++ Builder 5.5 -// * Now works on /clr "managed C++" code on VC7, VC7.1 -// * Comeau C++ now compiles without warnings. -// * Prevent the virtual inheritance case from being used on -// VC6 and earlier, which generate incorrect code. -// * Improved warning and error messages. Non-standard hacks -// now have compile-time checks to make them safer. -// * implicit_cast used instead of static_cast in many cases. -// * If calling a const member function, a const class pointer can be used. -// * MakeDelegate() global helper function added to simplify pass-by-value. -// * Added fastdelegate.clear() -// 16-Jul-04 1.2.1* Workaround for gcc bug (const member function pointers in templates) -// 30-Oct-04 1.3 * Support for (non-void) return values. -// * No more workarounds in client code! -// MSVC and Intel now use a clever hack invented by John Dlugosz: -// - The FASTDELEGATEDECLARE workaround is no longer necessary. -// - No more warning messages for VC6 -// * Less use of macros. Error messages should be more comprehensible. -// * Added include guards -// * Added FastDelegate::empty() to test if invocation is safe (Thanks Neville Franks). -// * Now tested on VS 2005 Express Beta, PGI C++ -// 24-Dec-04 1.4 * Added DelegateMemento, to allow collections of disparate delegates. -// * <,>,<=,>= comparison operators to allow storage in ordered containers. -// * Substantial reduction of code size, especially the 'Closure' class. -// * Standardised all the compiler-specific workarounds. -// * MFP conversion now works for CodePlay (but not yet supported in the full code). -// * Now compiles without warnings on _any_ supported compiler, including BCC 5.5.1 -// * New syntax: FastDelegate< int (char *, double) >. -// 14-Feb-05 1.4.1* Now treats =0 as equivalent to .clear(), ==0 as equivalent to .empty(). (Thanks elfric). -// * Now tested on Intel ICL for AMD64, VS2005 Beta for AMD64 and Itanium. -// 30-Mar-05 1.5 * Safebool idiom: "if (dg)" is now equivalent to "if (!dg.empty())" -// * Fully supported by CodePlay VectorC -// * Bugfix for Metrowerks: empty() was buggy because a valid MFP can be 0 on MWCC! -// * More optimal assignment,== and != operators for static function pointers. - -#ifndef FASTDELEGATE_H -#define FASTDELEGATE_H - -#ifdef _MSC_VER -# if _MSC_VER > 1000 -# pragma once -# endif // _MSC_VER > 1000 -#endif // #ifdef _MSC_VER - -#include // to allow <,> comparisons - -//////////////////////////////////////////////////////////////////////////////// -// Configuration options -// -//////////////////////////////////////////////////////////////////////////////// - -// Uncomment the following #define for optimally-sized delegates. -// In this case, the generated asm code is almost identical to the code you'd get -// if the compiler had native support for delegates. -// It will not work on systems where sizeof(dataptr) < sizeof(codeptr). -// Thus, it will not work for DOS compilers using the medium model. -// It will also probably fail on some DSP systems. -#define FASTDELEGATE_USESTATICFUNCTIONHACK - -// Uncomment the next line to allow function declarator syntax. -// It is automatically enabled for those compilers where it is known to work. -//#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Compiler identification for workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Compiler identification. It's not easy to identify Visual C++ because -// many vendors fraudulently define Microsoft's identifiers. -#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__VECTOR_C) && !defined(__ICL) && !defined(__BORLANDC__) -#define FASTDLGT_ISMSVC - -#if (_MSC_VER <1300) // Many workarounds are required for VC6. -#define FASTDLGT_VC6 -#pragma warning(disable:4786) // disable this ridiculous warning -#endif - -#endif - -// Does the compiler uses Microsoft's member function pointer structure? -// If so, it needs special treatment. -// Metrowerks CodeWarrior, Intel, and CodePlay fraudulently define Microsoft's -// identifier, _MSC_VER. We need to filter Metrowerks out. -#if defined(_MSC_VER) && !defined(__MWERKS__) -#define FASTDLGT_MICROSOFT_MFP - -#if !defined(__VECTOR_C) -// CodePlay doesn't have the __single/multi/virtual_inheritance keywords -#define FASTDLGT_HASINHERITANCE_KEYWORDS -#endif -#endif - -// Does it allow function declarator syntax? The following compilers are known to work: -#if defined(FASTDLGT_ISMSVC) && (_MSC_VER >=1310) // VC 7.1 -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// Gcc(2.95+), and versions of Digital Mars, Intel and Comeau in common use. -#if defined (__DMC__) || defined(__GNUC__) || defined(__ICL) || defined(__COMO__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -// It works on Metrowerks MWCC 3.2.2. From boost.Config it should work on earlier ones too. -#if defined (__MWERKS__) -#define FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX -#endif - -#ifdef __GNUC__ // Workaround GCC bug #8271 - // At present, GCC doesn't recognize constness of MFPs in templates -#define FASTDELEGATE_GCC_BUG_8271 -#endif - - - -//////////////////////////////////////////////////////////////////////////////// -// General tricks used in this code -// -// (a) Error messages are generated by typdefing an array of negative size to -// generate compile-time errors. -// (b) Warning messages on MSVC are generated by declaring unused variables, and -// enabling the "variable XXX is never used" warning. -// (c) Unions are used in a few compiler-specific cases to perform illegal casts. -// (d) For Microsoft and Intel, when adjusting the 'this' pointer, it's cast to -// (char *) first to ensure that the correct number of *bytes* are added. -// -//////////////////////////////////////////////////////////////////////////////// -// Helper templates -// -//////////////////////////////////////////////////////////////////////////////// - - -namespace fastdelegate { -namespace detail { // we'll hide the implementation details in a nested namespace. - -// implicit_cast< > -// I believe this was originally going to be in the C++ standard but -// was left out by accident. It's even milder than static_cast. -// I use it instead of static_cast<> to emphasize that I'm not doing -// anything nasty. -// Usage is identical to static_cast<> -template -inline OutputClass implicit_cast(InputClass input){ - return input; -} - -// horrible_cast< > -// This is truly evil. It completely subverts C++'s type system, allowing you -// to cast from any class to any other class. Technically, using a union -// to perform the cast is undefined behaviour (even in C). But we can see if -// it is OK by checking that the union is the same size as each of its members. -// horrible_cast<> should only be used for compiler-specific workarounds. -// Usage is identical to reinterpret_cast<>. - -// This union is declared outside the horrible_cast because BCC 5.5.1 -// can't inline a function with a nested class, and gives a warning. -template -union horrible_union{ - OutputClass out; - InputClass in; -}; - -template -inline OutputClass horrible_cast(const InputClass input){ - horrible_union u; - // Cause a compile-time error if in, out and u are not the same size. - // If the compile fails here, it means the compiler has peculiar - // unions which would prevent the cast from working. - typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) - && sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1]; - u.in = input; - return u.out; -} - -//////////////////////////////////////////////////////////////////////////////// -// Workarounds -// -//////////////////////////////////////////////////////////////////////////////// - -// Backwards compatibility: This macro used to be necessary in the virtual inheritance -// case for Intel and Microsoft. Now it just forward-declares the class. -#define FASTDELEGATEDECLARE(CLASSNAME) class CLASSNAME; - -// Prevent use of the static function hack with the DOS medium model. -#ifdef __MEDIUM__ -#undef FASTDELEGATE_USESTATICFUNCTIONHACK -#endif - -// DefaultVoid - a workaround for 'void' templates in VC6. -// -// (1) VC6 and earlier do not allow 'void' as a default template argument. -// (2) They also doesn't allow you to return 'void' from a function. -// -// Workaround for (1): Declare a dummy type 'DefaultVoid' which we use -// when we'd like to use 'void'. We convert it into 'void' and back -// using the templates DefaultVoidToVoid<> and VoidToDefaultVoid<>. -// Workaround for (2): On VC6, the code for calling a void function is -// identical to the code for calling a non-void function in which the -// return value is never used, provided the return value is returned -// in the EAX register, rather than on the stack. -// This is true for most fundamental types such as int, enum, void *. -// Const void * is the safest option since it doesn't participate -// in any automatic conversions. But on a 16-bit compiler it might -// cause extra code to be generated, so we disable it for all compilers -// except for VC6 (and VC5). -#ifdef FASTDLGT_VC6 -// VC6 workaround -typedef const void * DefaultVoid; -#else -// On any other compiler, just use a normal void. -typedef void DefaultVoid; -#endif - -// Translate from 'DefaultVoid' to 'void'. -// Everything else is unchanged -template -struct DefaultVoidToVoid { typedef T type; }; - -template <> -struct DefaultVoidToVoid { typedef void type; }; - -// Translate from 'void' into 'DefaultVoid' -// Everything else is unchanged -template -struct VoidToDefaultVoid { typedef T type; }; - -template <> -struct VoidToDefaultVoid { typedef DefaultVoid type; }; - - - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1: -// -// Conversion of member function pointer to a standard form -// -//////////////////////////////////////////////////////////////////////////////// - -// GenericClass is a fake class, ONLY used to provide a type. -// It is vitally important that it is never defined, so that the compiler doesn't -// think it can optimize the invocation. For example, Borland generates simpler -// code if it knows the class only uses single inheritance. - -// Compilers using Microsoft's structure need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -#ifdef FASTDLGT_HASINHERITANCE_KEYWORDS - // For Microsoft and Intel, we want to ensure that it's the most efficient type of MFP - // (4 bytes), even when the /vmg option is used. Declaring an empty class - // would give 16 byte pointers in this case.... - class __single_inheritance GenericClass; -#endif - // ...but for Codeplay, an empty class *always* gives 4 byte pointers. - // If compiled with the /clr option ("managed C++"), the JIT compiler thinks - // it needs to load GenericClass before it can call any of its functions, - // (compiles OK but crashes at runtime!), so we need to declare an - // empty class to make it happy. - // Codeplay and VC4 can't cope with the unknown_inheritance case either. - class GenericClass {}; -#else - class GenericClass; -#endif - -// The size of a single inheritance member function pointer. -const int SINGLE_MEMFUNCPTR_SIZE = sizeof(void (GenericClass::*)()); - -// SimplifyMemFunc< >::Convert() -// -// A template function that converts an arbitrary member function pointer into the -// simplest possible form of member function pointer, using a supplied 'this' pointer. -// According to the standard, this can be done legally with reinterpret_cast<>. -// For (non-standard) compilers which use member function pointers which vary in size -// depending on the class, we need to use knowledge of the internal structure of a -// member function pointer, as used by the compiler. Template specialization is used -// to distinguish between the sizes. Because some compilers don't support partial -// template specialisation, I use full specialisation of a wrapper struct. - -// general case -- don't know how to convert it. Force a compile failure -template -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // Unsupported member function type -- force a compile failure. - // (it's illegal to have a array with negative size). - typedef char ERROR_Unsupported_member_function_pointer_on_this_compiler[N-100]; - return 0; - } -}; - -// For compilers where all member func ptrs are the same size, everything goes here. -// For non-standard compilers, only single_inheritance classes go here. -template <> -struct SimplifyMemFunc { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { -#if defined __DMC__ - // Digital Mars doesn't allow you to cast between abitrary PMF's, - // even though the standard says you can. The 32-bit compiler lets you - // static_cast through an int, but the DOS compiler doesn't. - bound_func = horrible_cast(function_to_bind); -#else - bound_func = reinterpret_cast(function_to_bind); -#endif - return reinterpret_cast(pthis); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 1b: -// -// Workarounds for Microsoft and Intel -// -//////////////////////////////////////////////////////////////////////////////// - - -// Compilers with member function pointers which violate the standard (MSVC, Intel, Codeplay), -// need to be treated as a special case. -#ifdef FASTDLGT_MICROSOFT_MFP - -// We use unions to perform horrible_casts. I would like to use #pragma pack(push, 1) -// at the start of each function for extra safety, but VC6 seems to ICE -// intermittently if you do this inside a template. - -// __multiple_inheritance classes go here -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -template<> -struct SimplifyMemFunc< SINGLE_MEMFUNCPTR_SIZE + sizeof(int) > { - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // We need to use a horrible_cast to do this conversion. - // In MSVC, a multiple inheritance member pointer is internally defined as: - union { - XFuncType func; - struct { - GenericMemFuncType funcaddress; // points to the actual member function - int delta; // #BYTES to be added to the 'this' pointer - }s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - return reinterpret_cast(reinterpret_cast(pthis) + u.s.delta); - } -}; - -// virtual inheritance is a real nuisance. It's inefficient and complicated. -// On MSVC and Intel, there isn't enough information in the pointer itself to -// enable conversion to a closure pointer. Earlier versions of this code didn't -// work for all cases, and generated a compile-time error instead. -// But a very clever hack invented by John M. Dlugosz solves this problem. -// My code is somewhat different to his: I have no asm code, and I make no -// assumptions about the calling convention that is used. - -// In VC++ and ICL, a virtual_inheritance member pointer -// is internally defined as: -struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance -}; -// The CRUCIAL feature of Microsoft/Intel MFPs which we exploit is that the -// m_codeptr member is *always* called, regardless of the values of the other -// members. (This is *not* true for other compilers, eg GCC, which obtain the -// function address from the vtable if a virtual function is being called). -// Dlugosz's trick is to make the codeptr point to a probe function which -// returns the 'this' pointer that was used. - -// Define a generic class that uses virtual inheritance. -// It has a trival member function that returns the value of the 'this' pointer. -struct GenericVirtualClass : virtual public GenericClass -{ - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } -}; - -// __virtual_inheritance classes go here -template <> -struct SimplifyMemFunc -{ - - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - union { - XFuncType func; - GenericClass* (X::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = function_to_bind; - bound_func = reinterpret_cast(u.s.codeptr); - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(function_to_bind)==sizeof(u.s) - && sizeof(function_to_bind)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - return (pthis->*u.ProbeFunc)(); - } -}; - -#if (_MSC_VER <1300) - -// Nasty hack for Microsoft Visual C++ 6.0 -// unknown_inheritance classes go here -// There is a compiler bug in MSVC6 which generates incorrect code in this case!! -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // There is an apalling but obscure compiler bug in MSVC6 and earlier: - // vtable_index and 'vtordisp' are always set to 0 in the - // unknown_inheritance case! - // This means that an incorrect function could be called!!! - // Compiling with the /vmg option leads to potentially incorrect code. - // This is probably the reason that the IDE has a user interface for specifying - // the /vmg option, but it is disabled - you can only specify /vmg on - // the command line. In VC1.5 and earlier, the compiler would ICE if it ever - // encountered this situation. - // It is OK to use the /vmg option if /vmm or /vms is specified. - - // Fortunately, the wrong function is only called in very obscure cases. - // It only occurs when a derived class overrides a virtual function declared - // in a virtual base class, and the member function - // points to the *Derived* version of that function. The problem can be - // completely averted in 100% of cases by using the *Base class* for the - // member fpointer. Ie, if you use the base class as an interface, you'll - // stay out of trouble. - // Occasionally, you might want to point directly to a derived class function - // that isn't an override of a base class. In this case, both vtable_index - // and 'vtordisp' are zero, but a virtual_inheritance pointer will be generated. - // We can generate correct code in this case. To prevent an incorrect call from - // ever being made, on MSVC6 we generate a warning, and call a function to - // make the program crash instantly. - typedef char ERROR_VC6CompilerBug[-100]; - return 0; - } -}; - - -#else - -// Nasty hack for Microsoft and Intel (IA32 and Itanium) -// unknown_inheritance classes go here -// This is probably the ugliest bit of code I've ever written. Look at the casts! -// There is a compiler bug in MSVC6 which prevents it from using this code. -template <> -struct SimplifyMemFunc -{ - template - inline static GenericClass *Convert(X *pthis, XFuncType function_to_bind, - GenericMemFuncType &bound_func) { - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - XFuncType func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - GenericMemFuncType m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(XFuncType)==sizeof(u.s)? 1 : -1]; - u.func = function_to_bind; - bound_func = u.s.funcaddress; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - const int * vtable = *reinterpret_cast( - reinterpret_cast(pthis) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - } - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - return reinterpret_cast( - reinterpret_cast(pthis) + u.s.delta + virtual_delta); - }; -}; -#endif // MSVC 7 and greater - -#endif // MS/Intel hacks - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 2: -// -// Define the delegate storage, and cope with static functions -// -//////////////////////////////////////////////////////////////////////////////// - -// DelegateMemento -- an opaque structure which can hold an arbitary delegate. -// It knows nothing about the calling convention or number of arguments used by -// the function pointed to. -// It supplies comparison operators so that it can be stored in STL collections. -// It cannot be set to anything other than null, nor invoked directly: -// it must be converted to a specific delegate. - -// Implementation: -// There are two possible implementations: the Safe method and the Evil method. -// DelegateMemento - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// A static function pointer is stored inside the class. -// Here are the valid values: -// +-- Static pointer --+--pThis --+-- pMemFunc-+-- Meaning------+ -// | 0 | 0 | 0 | Empty | -// | !=0 |(dontcare)| Invoker | Static function| -// | 0 | !=0 | !=0* | Method call | -// +--------------------+----------+------------+----------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// When stored stored inside a specific delegate, the 'dontcare' entries are replaced -// with a reference to the delegate itself. This complicates the = and == operators -// for the delegate class. - -// DelegateMemento - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. In this case the DelegateMemento implementation is simple: -// +--pThis --+-- pMemFunc-+-- Meaning---------------------+ -// | 0 | 0 | Empty | -// | !=0 | !=0* | Static function or method call| -// +----------+------------+-------------------------------+ -// * For Metrowerks, this can be 0. (first virtual function in a -// single_inheritance class). -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - -class DelegateMemento { -protected: - // the data is protected, not private, because many - // compilers have problems with template friends. - typedef void (detail::GenericClass::*GenericMemFuncType)(); // arbitrary MFP. - detail::GenericClass *m_pthis; - GenericMemFuncType m_pFunction; - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - typedef void (*GenericFuncPtr)(); // arbitrary code pointer - GenericFuncPtr m_pStaticFunction; -#endif - -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - DelegateMemento() : m_pthis(0), m_pFunction(0), m_pStaticFunction(0) {}; - void clear() { - m_pthis=0; m_pFunction=0; m_pStaticFunction=0; - } -#else - DelegateMemento() : m_pthis(0), m_pFunction(0) {}; - void clear() { m_pthis=0; m_pFunction=0; } -#endif -public: -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - inline bool IsEqual (const DelegateMemento &x) const{ - // We have to cope with the static function pointers as a special case - if (m_pFunction!=x.m_pFunction) return false; - // the static function ptrs must either both be equal, or both be 0. - if (m_pStaticFunction!=x.m_pStaticFunction) return false; - if (m_pStaticFunction!=0) return m_pthis==x.m_pthis; - else return true; - } -#else // Evil Method - inline bool IsEqual (const DelegateMemento &x) const{ - return m_pthis==x.m_pthis && m_pFunction==x.m_pFunction; - } -#endif - // Provide a strict weak ordering for DelegateMementos. - inline bool IsLess(const DelegateMemento &right) const { - // deal with static function pointers first -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - if (m_pStaticFunction !=0 || right.m_pStaticFunction!=0) - return m_pStaticFunction < right.m_pStaticFunction; -#endif - if (m_pthis !=right.m_pthis) return m_pthis < right.m_pthis; - // There are no ordering operators for member function pointers, - // but we can fake one by comparing each byte. The resulting ordering is - // arbitrary (and compiler-dependent), but it permits storage in ordered STL containers. - return memcmp(&m_pFunction, &right.m_pFunction, sizeof(m_pFunction)) < 0; - - } - // BUGFIX (Mar 2005): - // We can't just compare m_pFunction because on Metrowerks, - // m_pFunction can be zero even if the delegate is not empty! - inline bool operator ! () const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } - inline bool empty() const // Is it bound to anything? - { return m_pthis==0 && m_pFunction==0; } -public: - DelegateMemento & operator = (const DelegateMemento &right) { - SetMementoFrom(right); - return *this; - } - inline bool operator <(const DelegateMemento &right) { - return IsLess(right); - } - inline bool operator >(const DelegateMemento &right) { - return right.IsLess(*this); - } - DelegateMemento (const DelegateMemento &right) : - m_pthis(right.m_pthis), m_pFunction(right.m_pFunction) -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - , m_pStaticFunction (right.m_pStaticFunction) -#endif - {} -protected: - void SetMementoFrom(const DelegateMemento &right) { - m_pFunction = right.m_pFunction; - m_pthis = right.m_pthis; -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = right.m_pStaticFunction; -#endif - } -}; - - -// ClosurePtr<> -// -// A private wrapper class that adds function signatures to DelegateMemento. -// It's the class that does most of the actual work. -// The signatures are specified by: -// GenericMemFunc: must be a type of GenericClass member function pointer. -// StaticFuncPtr: must be a type of function pointer with the same signature -// as GenericMemFunc. -// UnvoidStaticFuncPtr: is the same as StaticFuncPtr, except on VC6 -// where it never returns void (returns DefaultVoid instead). - -// An outer class, FastDelegateN<>, handles the invoking and creates the -// necessary typedefs. -// This class does everything else. - -namespace detail { - -template < class GenericMemFunc, class StaticFuncPtr, class UnvoidStaticFuncPtr> -class ClosurePtr : public DelegateMemento { -public: - // These functions are for setting the delegate to a member function. - - // Here's the clever bit: we convert an arbitrary member function into a - // standard form. XMemFunc should be a member function of class X, but I can't - // enforce that here. It needs to be enforced by the wrapper class. - template < class X, class XMemFunc > - inline void bindmemfunc(X *pthis, XMemFunc function_to_bind ) { - m_pthis = SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(pthis, function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } - // For const member functions, we only need a const class pointer. - // Since we know that the member function is const, it's safe to - // remove the const qualifier from the 'this' pointer with a const_cast. - // VC6 has problems if we just overload 'bindmemfunc', so we give it a different name. - template < class X, class XMemFunc> - inline void bindconstmemfunc(const X *pthis, XMemFunc function_to_bind) { - m_pthis= SimplifyMemFunc< sizeof(function_to_bind) > - ::Convert(const_cast(pthis), function_to_bind, m_pFunction); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#ifdef FASTDELEGATE_GCC_BUG_8271 // At present, GCC doesn't recognize constness of MFPs in templates - template < class X, class XMemFunc> - inline void bindmemfunc(const X *pthis, XMemFunc function_to_bind) { - bindconstmemfunc(pthis, function_to_bind); -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - m_pStaticFunction = 0; -#endif - } -#endif - // These functions are required for invoking the stored function - inline GenericClass *GetClosureThis() const { return m_pthis; } - inline GenericMemFunc GetClosureMemPtr() const { return reinterpret_cast(m_pFunction); } - -// There are a few ways of dealing with static function pointers. -// There's a standard-compliant, but tricky method. -// There's also a straightforward hack, that won't work on DOS compilers using the -// medium memory model. It's so evil that I can't recommend it, but I've -// implemented it anyway because it produces very nice asm code. - -#if !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - -// ClosurePtr<> - Safe version -// -// This implementation is standard-compliant, but a bit tricky. -// I store the function pointer inside the class, and the delegate then -// points to itself. Whenever the delegate is copied, these self-references -// must be transformed, and this complicates the = and == operators. -public: - // The next two functions are for operator ==, =, and the copy constructor. - // We may need to convert the m_pthis pointers, so that - // they remain as self-references. - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &x) { - SetMementoFrom(x); - if (m_pStaticFunction!=0) { - // transform self references... - m_pthis=reinterpret_cast(pParent); - } - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - template < class DerivedClass, class ParentInvokerSig > - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind ) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - bindmemfunc(pParent, static_function_invoker); - } - m_pStaticFunction=reinterpret_cast(function_to_bind); - } - inline UnvoidStaticFuncPtr GetStaticFunction() const { - return reinterpret_cast(m_pStaticFunction); - } -#else - -// ClosurePtr<> - Evil version -// -// For compilers where data pointers are at least as big as code pointers, it is -// possible to store the function pointer in the this pointer, using another -// horrible_cast. Invocation isn't any faster, but it saves 4 bytes, and -// speeds up comparison and assignment. If C++ provided direct language support -// for delegates, they would produce asm code that was almost identical to this. -// Note that the Sun C++ and MSVC documentation explicitly state that they -// support static_cast between void * and function pointers. - - template< class DerivedClass > - inline void CopyFrom (DerivedClass *pParent, const DelegateMemento &right) { - SetMementoFrom(right); - } - // For static functions, the 'static_function_invoker' class in the parent - // will be called. The parent then needs to call GetStaticFunction() to find out - // the actual function to invoke. - // ******** EVIL, EVIL CODE! ******* - template < class DerivedClass, class ParentInvokerSig> - inline void bindstaticfunc(DerivedClass *pParent, ParentInvokerSig static_function_invoker, - StaticFuncPtr function_to_bind) { - if (function_to_bind==0) { // cope with assignment to 0 - m_pFunction=0; - } else { - // We'll be ignoring the 'this' pointer, but we need to make sure we pass - // a valid value to bindmemfunc(). - bindmemfunc(pParent, static_function_invoker); - } - - // WARNING! Evil hack. We store the function in the 'this' pointer! - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(GenericClass *)==sizeof(function_to_bind) ? 1 : -1]; - m_pthis = horrible_cast(function_to_bind); - // MSVC, SunC++ and DMC accept the following (non-standard) code: -// m_pthis = static_cast(static_cast(function_to_bind)); - // BCC32, Comeau and DMC accept this method. MSVC7.1 needs __int64 instead of long -// m_pthis = reinterpret_cast(reinterpret_cast(function_to_bind)); - } - // ******** EVIL, EVIL CODE! ******* - // This function will be called with an invalid 'this' pointer!! - // We're just returning the 'this' pointer, converted into - // a function pointer! - inline UnvoidStaticFuncPtr GetStaticFunction() const { - // Ensure that there's a compilation failure if function pointers - // and data pointers have different sizes. - // If you get this error, you need to #undef FASTDELEGATE_USESTATICFUNCTIONHACK. - typedef int ERROR_CantUseEvilMethod[sizeof(UnvoidStaticFuncPtr)==sizeof(this) ? 1 : -1]; - return horrible_cast(this); - } -#endif // !defined(FASTDELEGATE_USESTATICFUNCTIONHACK) - - // Does the closure contain this static function? - inline bool IsEqualToStaticFuncPtr(StaticFuncPtr funcptr){ - if (funcptr==0) return empty(); - // For the Evil method, if it doesn't actually contain a static function, this will return an arbitrary - // value that is not equal to any valid function pointer. - else return funcptr==reinterpret_cast(GetStaticFunction()); - } -}; - - -} // namespace detail - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 3: -// -// Wrapper classes to ensure type safety -// -//////////////////////////////////////////////////////////////////////////////// - - -// Once we have the member function conversion templates, it's easy to make the -// wrapper classes. So that they will work with as many compilers as possible, -// the classes are of the form -// FastDelegate3 -// They can cope with any combination of parameters. The max number of parameters -// allowed is 8, but it is trivial to increase this limit. -// Note that we need to treat const member functions seperately. -// All this class does is to enforce type safety, and invoke the delegate with -// the correct list of parameters. - -// Because of the weird rule about the class of derived member function pointers, -// you sometimes need to apply a downcast to the 'this' pointer. -// This is the reason for the use of "implicit_cast(pthis)" in the code below. -// If CDerivedClass is derived from CBaseClass, but doesn't override SimpleVirtualFunction, -// without this trick you'd need to write: -// MyDelegate(static_cast(&d), &CDerivedClass::SimpleVirtualFunction); -// but with the trick you can write -// MyDelegate(&d, &CDerivedClass::SimpleVirtualFunction); - -// RetType is the type the compiler uses in compiling the template. For VC6, -// it cannot be void. DesiredRetType is the real type which is returned from -// all of the functions. It can be void. - -// Implicit conversion to "bool" is achieved using the safe_bool idiom, -// using member data pointers (MDP). This allows "if (dg)..." syntax -// Because some compilers (eg codeplay) don't have a unique value for a zero -// MDP, an extra padding member is added to the SafeBool struct. -// Some compilers (eg VC6) won't implicitly convert from 0 to an MDP, so -// in that case the static function constructor is not made explicit; this -// allows "if (dg==0) ..." to compile. - -@VARARGS -template<@CLASSARGS, class RetType=detail::DefaultVoid> -class FastDelegate@NUM { -private: - typedef typename detail::DefaultVoidToVoid::type DesiredRetType; - typedef DesiredRetType (*StaticFunctionPtr)(@FUNCARGS); - typedef RetType (*UnvoidStaticFunctionPtr)(@FUNCARGS); - typedef RetType (detail::GenericClass::*GenericMemFn)(@FUNCARGS); - typedef detail::ClosurePtr ClosureType; - ClosureType m_Closure; -public: - // Typedefs to aid generic programming - typedef FastDelegate@NUM type; - - // Construction and comparison functions - FastDelegate@NUM() { clear(); } - FastDelegate@NUM(const FastDelegate@NUM &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - void operator = (const FastDelegate@NUM &x) { - m_Closure.CopyFrom(this, x.m_Closure); } - bool operator ==(const FastDelegate@NUM &x) const { - return m_Closure.IsEqual(x.m_Closure); } - bool operator !=(const FastDelegate@NUM &x) const { - return !m_Closure.IsEqual(x.m_Closure); } - bool operator <(const FastDelegate@NUM &x) const { - return m_Closure.IsLess(x.m_Closure); } - bool operator >(const FastDelegate@NUM &x) const { - return x.m_Closure.IsLess(m_Closure); } - // Binding to non-const member functions - template < class X, class Y > - FastDelegate@NUM(Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) ) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS)) { - m_Closure.bindmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Binding to const member functions. - template < class X, class Y > - FastDelegate@NUM(const Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - template < class X, class Y > - inline void bind(const Y *pthis, DesiredRetType (X::* function_to_bind)(@FUNCARGS) const) { - m_Closure.bindconstmemfunc(detail::implicit_cast(pthis), function_to_bind); } - // Static functions. We convert them into a member function call. - // This constructor also provides implicit conversion - FastDelegate@NUM(DesiredRetType (*function_to_bind)(@FUNCARGS) ) { - bind(function_to_bind); } - // for efficiency, prevent creation of a temporary - void operator = (DesiredRetType (*function_to_bind)(@FUNCARGS) ) { - bind(function_to_bind); } - inline void bind(DesiredRetType (*function_to_bind)(@FUNCARGS)) { - m_Closure.bindstaticfunc(this, &FastDelegate@NUM::InvokeStaticFunction, - function_to_bind); } - // Invoke the delegate - RetType operator() (@FUNCARGS) const { - return (m_Closure.GetClosureThis()->*(m_Closure.GetClosureMemPtr()))(@INVOKEARGS); } - // Implicit conversion to "bool" using the safe_bool idiom -private: - typedef struct SafeBoolStruct { - int a_data_pointer_to_this_is_0_on_buggy_compilers; - StaticFunctionPtr m_nonzero; - } UselessTypedef; - typedef StaticFunctionPtr SafeBoolStruct::*unspecified_bool_type; -public: - operator unspecified_bool_type() const { - return empty()? 0: &SafeBoolStruct::m_nonzero; - } - // necessary to allow ==0 to work despite the safe_bool idiom - inline bool operator==(StaticFunctionPtr funcptr) { - return m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator!=(StaticFunctionPtr funcptr) { - return !m_Closure.IsEqualToStaticFuncPtr(funcptr); } - inline bool operator ! () const { // Is it bound to anything? - return !m_Closure; } - inline bool empty() const { - return !m_Closure; } - void clear() { m_Closure.clear();} - // Conversion to and from the DelegateMemento storage class - const DelegateMemento & GetMemento() { return m_Closure; } - void SetMemento(const DelegateMemento &any) { m_Closure.CopyFrom(this, any); } - -private: // Invoker for static functions - RetType InvokeStaticFunction(@FUNCARGS) const { - return (*(m_Closure.GetStaticFunction()))(@INVOKEARGS); } -}; - -@ENDVAR - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 4: -// -// FastDelegate<> class (Original author: Jody Hagins) -// Allows boost::function style syntax like: -// FastDelegate< double (int, long) > -// instead of: -// FastDelegate2< int, long, double > -// -//////////////////////////////////////////////////////////////////////////////// - -#ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -// Declare FastDelegate as a class template. It will be specialized -// later for all number of arguments. -template -class FastDelegate; - -@VARARGS -// Specialization to allow use of -// FastDelegate< R ( @SELARGS ) > -// instead of -// FastDelegate@NUM < @SELARGS, R > -template -class FastDelegate< R ( @SELARGS ) > - // Inherit from FastDelegate@NUM so that it can be treated just like a FastDelegate@NUM - : public FastDelegate@NUM < @SELARGS, R > -{ -public: - // Make using the base type a bit easier via typedef. - typedef FastDelegate@NUM < @SELARGS, R > BaseType; - - // Allow users access to the specific type of this delegate. - typedef FastDelegate SelfType; - - // Mimic the base class constructors. - FastDelegate() : BaseType() { } - - template < class X, class Y > - FastDelegate(Y * pthis, - R (X::* function_to_bind)( @FUNCARGS )) - : BaseType(pthis, function_to_bind) { } - - template < class X, class Y > - FastDelegate(const Y *pthis, - R (X::* function_to_bind)( @FUNCARGS ) const) - : BaseType(pthis, function_to_bind) - { } - - FastDelegate(R (*function_to_bind)( @FUNCARGS )) - : BaseType(function_to_bind) { } - void operator = (const BaseType &x) { - *static_cast(this) = x; } -}; - -@ENDVAR - -#endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX - -//////////////////////////////////////////////////////////////////////////////// -// Fast Delegates, part 5: -// -// MakeDelegate() helper function -// -// MakeDelegate(&x, &X::func) returns a fastdelegate of the type -// necessary for calling x.func() with the correct number of arguments. -// This makes it possible to eliminate many typedefs from user code. -// -//////////////////////////////////////////////////////////////////////////////// - -// Also declare overloads of a MakeDelegate() global function to -// reduce the need for typedefs. -// We need seperate overloads for const and non-const member functions. -// Also, because of the weird rule about the class of derived member function pointers, -// implicit downcasts may need to be applied later to the 'this' pointer. -// That's why two classes (X and Y) appear in the definitions. Y must be implicitly -// castable to X. - -// Workaround for VC6. VC6 needs void return types converted into DefaultVoid. -// GCC 3.2 and later won't compile this unless it's preceded by 'typename', -// but VC6 doesn't allow 'typename' in this context. -// So, I have to use a macro. - -#ifdef FASTDLGT_VC6 -#define FASTDLGT_RETTYPE detail::VoidToDefaultVoid::type -#else -#define FASTDLGT_RETTYPE RetType -#endif - -@VARARGS -template -FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(Y* x, RetType (X::*func)(@FUNCARGS)) { - return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(x, func); -} - -template -FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(Y* x, RetType (X::*func)(@FUNCARGS) const) { - return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(x, func); -} - -template <@CLASSARGS, class RetType> -FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE> MakeDelegate(RetType (*func)(@FUNCARGS)) { - return FastDelegate@NUM<@SELARGS, FASTDLGT_RETTYPE>(func); -} - -@ENDVAR - - // clean up after ourselves... -#undef FASTDLGT_RETTYPE - -} // namespace fastdelegate - -#endif // !defined(FASTDELEGATE_H) diff --git a/sourcehook/generate/generate b/sourcehook/generate/generate deleted file mode 100755 index f537ff3..0000000 --- a/sourcehook/generate/generate +++ /dev/null @@ -1,7 +0,0 @@ -#/bin/sh - -./shworker.bin iter sourcehook.hxx sourcehook.h $1 -./shworker.bin iter sh_memfuncinfo.hxx sh_memfuncinfo.h $1 -./shworker.bin hopter FastDelegate.hxx FastDelegate.h $1 - -cp *.h .. diff --git a/sourcehook/generate/generate.bat b/sourcehook/generate/generate.bat deleted file mode 100644 index 53c863a..0000000 --- a/sourcehook/generate/generate.bat +++ /dev/null @@ -1,10 +0,0 @@ -:: Generates everything -:: Usage: -:: generate.bat - - -shworker iter sourcehook.hxx sourcehook.h %1 -shworker iter sh_memfuncinfo.hxx sh_memfuncinfo.h %1 -shworker hopter FastDelegate.hxx FastDelegate.h %1 - -copy *.h .. \ No newline at end of file diff --git a/sourcehook/generate/sh_memfuncinfo.h b/sourcehook/generate/sh_memfuncinfo.h deleted file mode 100644 index fbfddab..0000000 --- a/sourcehook/generate/sh_memfuncinfo.h +++ /dev/null @@ -1,912 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** - * @brief This file provides a way for getting information about a member function. - * @file sh_memfuncinfo.h - */ - -#ifndef __SHINT_MEMFUNC_INFO_H__ -#define __SHINT_MEMFUNC_INFO_H__ - -namespace SourceHook -{ - - // Don Clugston: - // implicit_cast< > - // I believe this was originally going to be in the C++ standard but - // was left out by accident. It's even milder than static_cast. - // I use it instead of static_cast<> to emphasize that I'm not doing - // anything nasty. - // Usage is identical to static_cast<> - template - inline OutputClass implicit_cast(InputClass input){ - return input; - } - - - struct MemFuncInfo - { - bool isVirtual; // Is the function virtual? - int thisptroffs; // The this pointer the function expects to be called with - // If -1, you need to call the GetFuncInfo_GetThisPtr function - int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) - int vtbloffs; // The vtable pointer - }; - - // Ideas by Don Clugston. - // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp - - template struct MFI_Impl - { - template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) - { - static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; - } - }; - -# if SH_COMP == SH_COMP_GCC - - template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 - { - struct GCC_MemFunPtr - { - union - { - void *funcadr; // always even - intptr_t vtable_index_plus1; // = vindex+1, always odd - }; - intptr_t delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; - out.thisptroffs = mfp_detail->delta; - if (mfp_detail->vtable_index_plus1 & 1) - { - out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; - out.vtbloffs = 0; - out.isVirtual = true; - } - else - out.isVirtual = false; - } - }; - -# elif SH_COMP == SH_COMP_MSVC - - namespace - { - int MFI_GetVtblOffset(void *mfp) - { - unsigned char *addr = (unsigned char*)mfp; - if (*addr == 0xE9) // Jmp - { - // May or may not be! - // Check where it'd jump - addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); - } - - // Check whether it's a virtual function call - // They look like this: - // 004125A0 8B 01 mov eax,dword ptr [ecx] - // 004125A2 FF 60 04 jmp dword ptr [eax+4] - // ==OR== - // 00411B80 8B 01 mov eax,dword ptr [ecx] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // However, for vararg functions, they look like this: - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] - // ==OR== - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // With varargs, the this pointer is passed as if it was the first argument - - bool ok = false; - if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && - addr[4] == 0x8B && addr[5] == 0x00) - { - addr += 6; - ok = true; - } - else if (addr[0] == 0x8B && addr[1] == 0x01) - { - addr += 2; - ok = true; - } - if (!ok) - return -1; - - if (*addr++ == 0xFF) - { - if (*addr == 0x60) - { - return *++addr / 4; - } - else if (*addr == 0xA0) - { - return *((unsigned int*)++addr) / 4; - } - else if (*addr == 0x20) - return 0; - else - return -1; - } - return -1; - } - } - - template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = 0; - out.vtbloffs = 0; - } - }; - - template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! - { - struct MSVC_MemFunPtr2 - { - void *funcadr; - int delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = reinterpret_cast(&mfp)->delta; - out.vtbloffs = 0; - } - }; - - // By Don Clugston, adapted - template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG - { - class __single_inheritance GenericClass; - class GenericClass {}; - - struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance - }; - - struct GenericVirtualClass : virtual public GenericClass - { - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } - }; - - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - // This pointer - /* - union { - MFP func; - GenericClass* (T::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = mfp; - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) - && sizeof(mfp)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); - */ - out.thisptroffs = -1; - out.vtbloffs = 0; - } - }; - - // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) - // unknown_inheritance classes go here - // This is probably the ugliest bit of code I've ever written. Look at the casts! - // There is a compiler bug in MSVC6 which prevents it from using this code. - template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - MFP func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - void *m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; - u.func = mfp; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - /* - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - int * vtable = *reinterpret_cast( - reinterpret_cast(thisptr) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - out.thisptr = reinterpret_cast( - reinterpret_cast(thisptr) + u.s.delta + virtual_delta); - */ - out.vtbloffs = u.s.vtordisp; - out.thisptroffs = -1; - } - else - { - out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; - out.thisptroffs = u.s.delta; - } - }; - }; -# else -# error Unsupported compiler -# endif - - // This version does not take a this pointer - // Useful for hookdecls, as they ensure that mfp is correct through a static_cast - template inline void GetFuncInfo(X mfp, MemFuncInfo &out) - { - MFI_Impl::GetFuncInfo(mfp, out); - } - - // Versions which do take a this - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(), MemFuncInfo &out) - { - RetType(Y::*mfp2)() = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)() const, MemFuncInfo &out) - { - RetType(Y::*mfp2)() const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - -#endif - -} - -#endif diff --git a/sourcehook/generate/sh_memfuncinfo.hxx b/sourcehook/generate/sh_memfuncinfo.hxx deleted file mode 100644 index 5ed37ab..0000000 --- a/sourcehook/generate/sh_memfuncinfo.hxx +++ /dev/null @@ -1,332 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** - * @brief This file provides a way for getting information about a member function. - * @file sh_memfuncinfo.h - */ - -#ifndef __SHINT_MEMFUNC_INFO_H__ -#define __SHINT_MEMFUNC_INFO_H__ - -namespace SourceHook -{ - - // Don Clugston: - // implicit_cast< > - // I believe this was originally going to be in the C++ standard but - // was left out by accident. It's even milder than static_cast. - // I use it instead of static_cast<> to emphasize that I'm not doing - // anything nasty. - // Usage is identical to static_cast<> - template - inline OutputClass implicit_cast(InputClass input){ - return input; - } - - - struct MemFuncInfo - { - bool isVirtual; // Is the function virtual? - int thisptroffs; // The this pointer the function expects to be called with - // If -1, you need to call the GetFuncInfo_GetThisPtr function - int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) - int vtbloffs; // The vtable pointer - }; - - // Ideas by Don Clugston. - // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp - - template struct MFI_Impl - { - template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) - { - static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; - } - }; - -# if SH_COMP == SH_COMP_GCC - - template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 - { - struct GCC_MemFunPtr - { - union - { - void *funcadr; // always even - intptr_t vtable_index_plus1; // = vindex+1, always odd - }; - intptr_t delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; - out.thisptroffs = mfp_detail->delta; - if (mfp_detail->vtable_index_plus1 & 1) - { - out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; - out.vtbloffs = 0; - out.isVirtual = true; - } - else - out.isVirtual = false; - } - }; - -# elif SH_COMP == SH_COMP_MSVC - - namespace - { - int MFI_GetVtblOffset(void *mfp) - { - unsigned char *addr = (unsigned char*)mfp; - if (*addr == 0xE9) // Jmp - { - // May or may not be! - // Check where it'd jump - addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); - } - - // Check whether it's a virtual function call - // They look like this: - // 004125A0 8B 01 mov eax,dword ptr [ecx] - // 004125A2 FF 60 04 jmp dword ptr [eax+4] - // ==OR== - // 00411B80 8B 01 mov eax,dword ptr [ecx] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // However, for vararg functions, they look like this: - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] - // ==OR== - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // With varargs, the this pointer is passed as if it was the first argument - - bool ok = false; - if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && - addr[4] == 0x8B && addr[5] == 0x00) - { - addr += 6; - ok = true; - } - else if (addr[0] == 0x8B && addr[1] == 0x01) - { - addr += 2; - ok = true; - } - if (!ok) - return -1; - - if (*addr++ == 0xFF) - { - if (*addr == 0x60) - { - return *++addr / 4; - } - else if (*addr == 0xA0) - { - return *((unsigned int*)++addr) / 4; - } - else if (*addr == 0x20) - return 0; - else - return -1; - } - return -1; - } - } - - template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = 0; - out.vtbloffs = 0; - } - }; - - template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! - { - struct MSVC_MemFunPtr2 - { - void *funcadr; - int delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = reinterpret_cast(&mfp)->delta; - out.vtbloffs = 0; - } - }; - - // By Don Clugston, adapted - template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG - { - class __single_inheritance GenericClass; - class GenericClass {}; - - struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance - }; - - struct GenericVirtualClass : virtual public GenericClass - { - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } - }; - - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - // This pointer - /* - union { - MFP func; - GenericClass* (T::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = mfp; - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) - && sizeof(mfp)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); - */ - out.thisptroffs = -1; - out.vtbloffs = 0; - } - }; - - // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) - // unknown_inheritance classes go here - // This is probably the ugliest bit of code I've ever written. Look at the casts! - // There is a compiler bug in MSVC6 which prevents it from using this code. - template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - MFP func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - void *m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; - u.func = mfp; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - /* - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - int * vtable = *reinterpret_cast( - reinterpret_cast(thisptr) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - out.thisptr = reinterpret_cast( - reinterpret_cast(thisptr) + u.s.delta + virtual_delta); - */ - out.vtbloffs = u.s.vtordisp; - out.thisptroffs = -1; - } - else - { - out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; - out.thisptroffs = u.s.delta; - } - }; - }; -# else -# error Unsupported compiler -# endif - - // This version does not take a this pointer - // Useful for hookdecls, as they ensure that mfp is correct through a static_cast - template inline void GetFuncInfo(X mfp, MemFuncInfo &out) - { - MFI_Impl::GetFuncInfo(mfp, out); - } - - // Versions which do take a this -@[$1,0,$a: - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]), MemFuncInfo &out) - { - RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } -@] - - // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 - -@[$1,0,$a: - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - -@] - -#endif - -} - -#endif diff --git a/sourcehook/generate/shworker.bin b/sourcehook/generate/shworker.bin deleted file mode 100755 index 18d35bd2ec92e780d2384dbf192640497b82ae37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54998 zcmeEve|%KM)%Q)Z3kxppq7kE_u8I{T#spCapbddd0wuTvk|6$wF$59}BqqBM6%gF4 za=9#~N-A3WNG+{YX{AakTEKuQ0ZT1XRBEYW#d_C`ZKM$*qWgZoGxu(Glc0V2em?JC z@51cNnK^ULnKNh3{J3*B54fl0BqSs#<|k1}QV4B)!eSeZ_|WsRWVGT^Y|3!u66GSL zAF^0BdIfM0Lwq%64 ziHcH#K)x(TQb`4VD#{p+0%l-2c`)RGNgjAJxBxSlWuA|{b0<8ZC=)KQ+8Cw*m%%Kb zfpVbt`k3^ut*X51+N!zNR8=nW)u+`}r;UN6(1qe4Gu;KjVAWT3ILNJ4pvsGsyj7Nz5xDCK%#6Lisk1*MQZHQ?l z0}#>?G7zpn$VA{LO-AAy$`>D6&i{+g&=@8|V$!k6b7FwAk-i$?5+iR|Oj&I5Dgfsj z8IG6&S`I%K$w;{nF-OGZ2Fz$2!WaY?lhPj{8{s+x^K%UnsR$Fz48+L@!x6F&dVa1n zlv<7gwq+=+;7F&%#(uaQX7s#K{)JI~13L_#*Aa++w*fCS;Kw1bY1m89)P;snK zV+eSK0UMr5sWjkOh5+vw@K;7J%rW3>!|d}6*l*C|2q67EfGaYsHjcQT|fV ze4`=XaHJ{UDMP+mqkNu0?*XGhhXF4IJ+d8)@weRIZ?^9vl+TLc_kE-OY=d6C!QbrA z>4w6x1U(pw0e{cHzpjV=S`B?HHp=s8W%$sjDF06k`5!mr{l=(oGvMb8d50VL-yr5^ z6$15fiy`k+1K(}%d(J37+mN45g826v^5z+Ef&o_<^*siD&?wI}=-+0*8;x?afB%g3 z439BTC+H-vx7gl-+~oI=f&ZjYf2%?7Uk1Dj<=f7-+UP|&KjdIrGCl7)3=}`IEhd{XAsP8x6TGZpG0D+V9!QQsnbv+V4&Y zD%FTt|9}C{Guk)CpvOspPt&XtE#HYfKgIjUshh@t*l;T6bNph zGt*mDH>GT*HzT7Av`f6TrIlV}xP{K$1t_@guF|^7vXW}_MtSMNDYHsurI)y8jwyix z?wT@lbji%?OJ-%17}}YXF=cuttYDE3?CUeel%VOg3rnj?Dxt#eg4;1Tv!O-mCd6iY=l1wjaaKl`s)kW>$+ptGhV^q`HA;)zk zQ=qh)k+HCPZn@Oscj)Z;GT3^p8X`@PLHyB2wj^Q;~>Ql(rM?d!N0Ll3Vj^?UzqxSTf-4;1nS|qYYjV^)joLB0r z^2*^454I2v&RafZ+Fcp$X_e`2_gK>}xTO#Lk1A!P&n=JE^DH)M_GN~>#h2mFT%h#VN43$Z5llVrYZ=>-?(!|HDKjfYy@qH{ zwCAT|mZOs_y{mF@1}A{J%91k9qb1&ZYsyP17tO1tN0?Or`)+7r{D}gX) z)|8BlnfEU8me#vz8A^U>{dC{LiM8{&EN=Bif z(Nx-X(R8{pY4+@i*;7g~aI_&1JRVdV#YIyhjyRHVVqig>*yEoi3R|P45-$PxNk*v| zvvzk4(v-BBOWNd-h(jF{$BbFOAGXLQf96vz^B<*5z&{7pn_Qc^5Io5MPK znF{0Y;oygH77lC}=PF7TW9+RaGrk$y2*w3+OPO$m+{!Y(6I;v#oG{Hsd4DXCZ)1$5 z_??Wgq@K$dO{rjvC3O{JG@^zv1@|%mZPqi!qJ1f2oRF+w>`;^j#!$;D##p$oVT=WN zBV%md*D=P)#d^j#eR+y8j-@s*##P||L+059bC|ej`t|(g>55r!K@s*0Q zoiR3HEsTdNN-N_Lin5pS)rzv8@ks1P7-O@0i19Uwa+onrp^h*{R~}`Yp(w`~!`5}i zIDu(rj7?DoV{9%u8IM(zF2>jlo@P7_CIH3u$0?bGF%A)IjB$i#XN=9ElQGWyk{M5g z0Wi*n0Wh8f17JKE2Ef=217Ms717JJ_2EceK41h5eXlE#>phS(a^)<1Ls}(r4YBD{g{1_5s-yoqq5fVU9dLU@IMw-Vk)xJJO+2)7Wv zQ^4B^?2*r9;1X>1bmEe3gImR)(N`^ZxC=h;o*cE1>8Y6o$v|)cM={; zxJJNTgtG|WDd5wD^9Xwc%n?=LA)F;(j;xB=gwqAg5ms?0VV8h8(kdzlI|a-US5ZS) z5imzy1&7dw+NUcv|#Wun<0_F&=Xd!&3fH{&Y_7e68m?OI40O2ga8K2#ue&|2e z;h9xX;l(*jMJm2#6jgK_x7hS*bZ}>5BgXzr8h~=^%GdAzAIy82pOgYE-o(fO?e^3A zUKcp<4=Zl02X)0a;-}LPYtFzy@A>Kpe~aa3gd+!|*}m`|D^U~ny{?{+zU8OG@ze!0 zFQ6?eNI3oN_6lZ34)|N0!NqVlf=_YLOn>_@&1Z}F>_w(rAN>SA>0juO*>fU3XOTV{ zqO(?c=dEhT9VPpATa-p^h}ssM+8Oj6-Ujg_9gbburvoj^2Y^qpUdIaUwxSt&2vkrt ztV1sFTG{S`vP?ergHO=@`hUg@@H3orf%0wn;7A zrtTOT&2X<*3pc5O6f;9DTpui4r8Xs-8CsBJf;;Mwq2{krchK_)VrW~?-}Sdh#1mYC1`PLNAjG{<01=HPVqgj;E z!a{$meF}>yrvAM%7E@@w{~3!ZsIJ30`XibX}3{)T)EZhr`)j%he*3^M-G>cKt zzx9X!SfbB9B|0SIgjQ(R635qc)=krzSfV9HYC4NNumimnL_y2n6;bzi-_>@A?&*)7 z)q((KMQ27zrWR$RMQ!LPHPgfOzqqTkxZ*_tUU+IByE{95OD;~#|jFn zk&?X`w^{XN>GQhC~Tb*=_N%3w3C;eyxA3)SrJ9 zBlQ-oiF{zr@lwyiTBnZ&1$PVwcA!Pw!AZ-p)=4zkxV2a&MjQ90Y#fpF54-wk+*p*b zai`h1*91m<X?p^T_SMex+J+rWX% zBC{2=y-2f|!<&Wlzah(fJGv$TeF(F1Jopus&RSESy!VNsK6yWmq5_k5M-1<$PZ}ER z#ryi+yt}Y^Jp=DOqNq>a>rfOOG+)Q?zQW`!TP!6I?S2KrsYkoNzzX^dyk8eZee(Vx zilV#+4U}FSp3p39vRL0r z^6{hJi~Xk7M5JEsC0i8rsSziNq8b?+!~B_l8-sw%rROQuZ|u!>Dfho;;5${8^~pGe zWl_$PVmOa9Im_Wk{>AzpjEf!(Zoo$S42%mzQJ;KWD2lS39>aF)@wibh+1}in?HcU! z&%kz$DC(2#a1=%7sc|uEZxn1f;PdTT0+$E9E$^4oI?Vwe5at%7gmR*#jYgLTYk;gZ ziNZu3xn_EMg!k2+Ju)$0^7el<`|p)Tc5UP!yeV z%3|1N^u=~R8x(Kr9kw&F-6@LtWV;4M(XOwKVf!jPo>&M;i({LM^}^n4yKwe%hSu&8 zMSZeehoUIk`(xNn>Wl6Bu>Kyc<=vMvuzeE`u+PxBPoXHvwmgRI{(rHx-)?bZrB(K@ zI4Y(Oi@ONOT9YXJE{p5HDOyyhhhl^pBZPvlbHy0kK@yHPxZ6PB47#{l6!qB!T{!cJ zvVAOuZOcE6o{wdFE7`^y+*}Yi1KUxes86;yr|o9@(-^i>Ot#YC$h=rT2IKF+wh9MU zXJ9){6!pp0hN7sic_D`F!O!CCT(Vu*o2?h8$7f)hEsFYN>qJr1nKZ?)y;ZR7v8L%U zxwc88G!0H{K#es`@5%K!AZt4)essn^lZ%^+-7l1?C1{UfJV%nUI#-{w3cC|qBqQRp z>08=CL#)X$B6`i6PF8NJN4;J}?_-y*6|U-)|ANS0-z$HG$luf>fB9^!a9hv3bgl4k z&paEC0&o!UIwcodxf!}e7?Cr4EGDl*sye(qChv%mw=O1cugnWoqHQtRzcI4M#b-Zh zWSEV6s801bJhRa}YA=8jm{L)_Yr@|l)k z?y_rN3}wc1I)uJPFNZ!n9VfsJBl`tp_YxpoO7~p?T+p`w6XQ9}G&qI0sqF5@2}btI z+*S2j1Ixni5@0>h`q03XcuohyQUjm!NTOSS-x=Ajad*>m)teSCfLwd@-rk?zw*WKZ zIn6LQeaUl$ZUM#_+4=F=R~XqBA-k7iek2ROOEC`stq;Zgsw+-_S3Z@BDU8p4#>l<` z*}Vif?>`gZ8_?)OfM#wcx-~G?;BLr#_Jy_zM^3-2w!R>}R=t=&6A&S@>NV z_z-A)XdpA5(?tfSzjD3YEr7+yz82Zh#a$}a9l_>2OjMpC{qM&pdGvs@6=gsar?PEk zQ3_CHUZh!^dEO4C+){$|6QM{mHLFiS-W-`W&Nk+M%vO&DMqdku0B8HYjyRXk>En14 zr})?Qz1(`Fm2-S|lL!AJ5()h(KJRNt0vWyn-lH*jZ_B*UT*}-{a;K3!AfD>8 zMz&bHbz?Ug*&{gN8OIyZli(ys2T5e7k2Ku{=j^znk#^9~#1U+-uHPJL=5*7|&t>qN z9iKhG$o?K@ot|PWm4)9WM)|ji@gkjjw-`?dYjK7OKV;=Fsf!!F{qY)P(HDXkYQ!P>%;d8$Mv8;=4?o zF?tHrCObIl%i}TFS;6MvDDeb?vQvXLK&m_v_L$i0KXew0^e`HP2cONPC$kJEeUL4U z-~YFZPOJc8k4|)~ef3QJ>sY%=6j7=kwU*!Br{i5ds!xk>JfhLJbn9{DQL4uo^2TQ` zklEo^V^E8Xyhmd4vW@Dc5G*Epq>+6svc*F*`H*m<%#Jz~@nkTemwOEY&3wQp&;P{! z7blC@677oLlkNII%Kt8gZe#GVKce%Z4_)6ij`VR*=Yk;m+rSMzwg)K2)6sWh9=!r- zD3P`Zq<7AUltLs;ARRa(5^Y1DCy?sTh{Tfvc}b`t#E-$2q+RBV{oYd90UWwz-_L_@c~FNhWu1^pip*T8H7CasieH(L9s zz_bJL^BBacIFh2pl~Kg6Vh|_AQ53Dt0%8tY1lb*Hi@+%8-YdP38W0a~dpt3HWGzQ> zw?TG*JPmRQvJLOGY_GZpRRp!dQ<3rrYre%55G#7 z`)H_~>6uJF6uO1!Tz;|3LsOX=%P)?c(0Has@GFB~m-6do7F^DhlV4c`&t)osUl{}~ zOdY2dgx++df^tl_Q{ zE_~<@{zY^iZh{1cwc{p8Llc}nloRxyO|)XY6bNd-g|c9Pdj{N7!nY=J;2-c1yJ0%2 z!27d)#VT;d<5eW}XWunQI~vXg#w+m6%IV4Oz*u~% zfnXyk)HUDSo9X_0}j)Ih=58xhMMD%O4Ji3L^?C{{j#Z{0%YT1o}a27pZ-8)(0@5( zPy<7O<$<(}G5OXY}sL(-|$Vpitb{z|x-A=I|ioOKGd7lDe-d-e%Is0S%1I;7hlm zovM2y=%^>7l%~vB00Z}J)LRaUCUBM7=4kj7{5AJR&8cOd-lbpK(4y6LIvTbkS3QuF z-Kn~dm<5i8wF37@<^i>EzxR^WS&<1Y@8Agoyn_Z#ILkX=!k~d(E53aF8>dI|kA&YC z@y+=AI+sj^_4zgiecOukFVQ^i03pPiNMhX~$3oDzDQ;$reU^d?le^K!)Oko)(_Nwy zcgjYDpTYXTPJ({~650Vg%^8{l?HT#avH7XU*9tdki3=2*i7ZeG^c$en@H3D^^ki^Z zydZMPBlwHu##loVy;0mM6*oom=nM<(9B`t!iP5e)~6Ix2#n=U#bwYHNd@% z;d4Pl+3Guv1_$7zg3io$d@il9B}TRgm<5t$O%?P!nA59!G#4 zQggSmTRZ(-35zey+~e^7jn2{F>}Yry(28-_IvV&hA_m$;^uN51+KqM!oenhb1OEFu z6KcyBL>44Oe66_TTBMIaC-5N7*Q$T>7Bzd=?9aV%{dsA8yLO}RfhfkjxCGCUI79!d z(WM7DG~qU6N53sw6@HlP7Z;mydB?7}FX3uOU_N>@_|g*CggI)AyQtFITlMp3Xzo^N z7n!DAwCXa1CeLX!MJSEbCBc~26u|x+hzB~^7afA8i@Lrx&8?e5UQQhT_Muo{K^({eJ8yIIkVWa~+)WQO z3DS|%P;gS+$9fD5vRQTv_r7&+fqLRJ7HzT9O*^I=Tmp~y^oZ{miF^VxQcp(Q?dGwA zyv*$)+A-0fW@5OHfo_&>i{@@OMUPH;qv?wZZ9(^@ptw%HK*2f;wt!pen%k}xZZQR4 zy$G{o;r1D-d$Zcab*mb*TWr$;OsLIc>6lt< zn#ZCxO+Z@9v#CKY+O;gZ+I$F0bF)f{8kmfHHPFROqdNC;{+1NA`2aI(ENZiu>FRB) zz9XIZO?;aMSK)!621b)|6Puw0*g!4IrWIJ!;Av61Uwo&CT0>b&-W&=F{24ZFA|CNm zBvqUn;_@qTf_BoB6oO8Xri7}z`x>NRYLE|Xa6Mh5EdodI3hE+X@Cvqzw4{Gnq$T|$ zA}u5g9u;Xx|CmS%`b|6?lCMsv;<1pt^l!WXAkN*@;9h|*W#D;%7L+n<6KN^Kc9E7c zY!YcH!)B3|GHelPDZ^HgmTg=w(vtp0k(TsViL|7@Mx-VEdXX0NoA)EFHns3O(8}-T zr$kPp$XUnl9S6ks27U*Z;@i~u3XzubG>Ej6r$VHqJYJEO^2`=#DbH;pE#=7*X(3N= znn=s`dPG{%pC!_g{#cQg^e2n7q(5Aw1^wnKq}8T7`5l zyi?#%HCle7=39rOc7YSy+EoH)jmU50cYp?=-+{M2vE4~#dM#eD)tZ=8v+Zi~F#Y1I zkl{W$(tSWHJS2SG;aFd{e`H~+@O5zBd5!>oeM?sN?@rZ%q@&$u(Wazo*|y9twF0{; z`ULM9kwZYVzlrU4G_=6ANp<^&TeSSWnoxx1+ph+NF7gj^9Rc4dDv8e4e62uK13Y+8 zo2WNUh^aOUjRl3qeEYTh0~pd|*d$EKeN-zvqBaYS1%<|ZhqU~|m}w2OkS5YB)D@(< zq!X9wQk$qceMAPuC1rd;adUAQ3Ey*ldYo(`5I_N(qM!wY3_CC zeYKel=fc5+kE=m*(MX)Rj*IyH89G*daM(12{UVKCRE<3t9F z0G@(SBK=q!@Pu&K4vSb5^RvGt8Au*|a+;!q|ET5f*L*M|^q6ReAu{@~)odk-V$J^$ z*I9AqPYUtoe?%)h8gKrGG@tBDVf#&^MI+cswOQDHK-hlMI^@WX4PA|txlXcc%WURy zV*ETBzg-)Hz8Ig=S(i1#vmmQjFGq9P{;tTYs2K5Hs+}LqOUT3l{5y*W4P2c(c*Ut( zy#rR98t%2Id&6z&Zebtl0o?5q6~g}#%-BO%AEvL)NtiI)vGahVsm1ZzuABXz?Dx0b z?msnLE$nP_cW}!0&hannyj5((eG|3moe7_-9T^9AVz4P#K2kV$yD0Tu;Xjq-9kANz z*m*E3C#*B^#`yeBZ*u0BzHlVJ!}kyMb6DIR>Rt#Fad(72Q9IP*NjaVBiOk)S#8Jo2 zK?7Om+{`b%N!ekY)w)I;4^B-8|DIK1_pZ001*Wzf1za+gUl}LnY5qsvk3{CF z?!)7K_SOC$0$AmKZ&|i{KM=#Fws_ybm>rHj_M5n(con#~TBnz60;%Mq0 zb;2e_57U2e8M--tE2yGZ$J=~+%<*jQ(O0&o(y_Vmut_X@3X`?`6zqer?J*mF&RjIU zNi39tTso;cbXr`X9pBg&U}!h9P=8!{4D91%Mxxt1Y}2>1B)rvPa=~WNGaYv>dC!rCmRdY`1hTHd|{*Tuqm3O zp$r+=P!D%BJR{y+iMHT=f+)Gw5h#u=X%p{9aUAXmTm=@2qv2AP2Wu0%seXa?9mIK8 z<{s}&tNYsp*^;b8?=)`5e*K?7IpVC7+sh93jfFJ5;{a5O9jFku+BW`&1W3FRX9UM5D#VuPx98jZ#ua!!B4X&=!m{)clI{ySh>t$oG#aUV8VOF|vlELw`aQ>m(a2|&ada*u9r12xa6=)4fJHo6c0hYS$^?)YJ&G#FzMp3FEQ`_kP4B~t>^iL) zPvT>H{$Yt8)AQ&6#S!Qyh}t4AwM(`^|F#c!-u)8rBl^mnY(TO{U%!K+=5Xw2Sw3iB z?{jnx))~6?8mr+PT|E&Idqb%Y!%n{VlBM>T=O(bc)S$;`GF~s&$HhqNXei`MEwQ6= zBr;%NnExT9X^pYQGfoOXYp@J~&PEDMoZ^cL?rq{YwpjNIwB%wv4Of)p`7ln?5`)>D zj=*ZZJ(6V;htwGTfL4qf<_Od=+pvG11Eh=fKMEx|S-;)x*qNQ+(HF=p9&cu|LgBU^ zb)JaUVTGLHq6MjbJzXkDZn^avWE%`Ws?u-A>VQAlDTxN{=Qp&-oo}oTZZKJh;b<9x zMLV?R(ckCAKCB~`BovwB9gAxe>8-Mc!SVc_96!U!anN$U8gK$R+MZYk03$)SLrgjV zawMiluaX?m%S+7`4kf=?-TVUF&$k6^_~ysaa1WSeb~*f&h$Es@-N90h)U3{66Hg^( z`1QmBHNdUCG&7v}cyROpQ19g4L`<$)MlPD0>D#3G);j_Z@N`HtSH7Wyrwihqvg46< z42WPpc1Op);Q$c#lML%^W|lsHyPGDCaxGEwttZhvSdVzm(sG=c;+SOFH1pkDH82)< zcnpYdPf%PxDG27TlJsV%&GpD{3rxT_9kAM5fs}rfGP_rSu!arNm4HV4)zW@ z4^5oc^b+ss-^GikiKCpNpk**0Qwbp(@D4u~AJlZb zKm8d5mCh7W_3-n{@9O&sz?g`rF=9>TZwxdzl4wgiZjMezTO)eH2$Z^J$0TOz`Fd-TqiIXPlcgTi147NLGbJc-UmjgFlirsMO=!uSB)Ith->ZD2UZI zcmJU~x=h{%t*PBrs!&Cmblj}FLN3MR*o3YdTD(gDsPABgORDW`Xo>Y9Uy0V6o;*9D z$fIx4p@$$BH!#%%(^PHJRE3dZCa__lNfiA)5D2B86dE@3ZfHi{P?2Za)nidU;^(fq zRlxcXlDcW=l>KBZ-_m7C=r)mUpP}E33@yMN1}iv2&;MKEclYauG1l@M2q6q~?^Z}N z;iRF*=<4t-bT{aPt^*Z5jx%=_`+&~;zd(&KhWm_x{tIN|*?t=Y?&+8KRJU0Fl8D^~ zzd+Utf7BR$gZ0AivF^4WbsyLgQ)P@%<*D!?;P&-0!2|NjzjRtQ1O1oMVT#`hf{{dT z`#m6E36#ix6;Hg`)XB};j0=m)tp0BXEI*p*b9%34JGwjM*azLt?=qoSEHTHvBs5H&2k81e`Y({9 z`CF0Z!-~g_At8T$!oS<1VfD8jF+6j#b|e%$SxP7A>;?%V-(v zb+?Sr9a?~q)@3F95>TlRCEPa4j zWMzRz|GCh;eL*@rMUnoj6rYRM16W|65X%#*Bk&27bV3}pSse}Ez^%o1=IQs*Mzj_* z*k*r(uraeu79`QR1{bSG+1fN!MOvYR7R|n1WMXt)W6WY z)FYHAj7ln7wG7rY8lif?zsqK&si>=|Kh!t7Rsk!cYbS1@z^1JUdo)3u*AE9B*&J*( zImNcvRB0aQqKD7|7!OeP1TMq3knls&Yhqi1fdfzpxT;Mws6Bx#_{KxZO^onq3vhyx zsr^PuznoeTLr0oce`CB@G7aOW(+mpvA7Rtjg%9&drbl1$0^~C;PMC*WV#2fGE*<3Y zv;{^Z5}#(K+5+kLrT{@9Ax>OGZfX>ZDIBchI~c5BZZp#}aPTb(Qp7j)g6#~_`W7CY zz+Gcy2yj74TYxb+=%;=StbT1-Vg$D_OVRqNc(RBuds~hi*rSJG*Ml0kpM~$Bdz%MO zoAr`*R1G+hqXnkn8*}zeuxU*YkJMPOOdbkq0whI|FgQs7Y9SX`Huj(mQqklGgHm56{}OGy zhvED8*wh2+i?nuW_^4m{D>xFIbtV@5sMRAw%}&g>C>jA>6&i+WieJ!;n$l*hiIbDLmBKIPQ^63 z8TyByhTaO@g&~6(KX#t#c5Sv^u5AI-AQlqThe*se6V+h%-}bW~M0)k}`+{JMYdei0 z@?EZN1Ss{@&;Lu;*2U2%XRZ0qvt9p{Yuk(#^y>TmY*rK7@?W{OJXY`13}RgyCDEbDzV^jElQK(uYICCcc=V+U@k` zxmYOd0MR`Ut)y=V=GM??FOqCPsz`r8roUDAP(6mDq>d$`kShG9$xRGZW6rn9Xb@?nEe9H?bUA{WNLnzBOZi9y{L4D`W@re zqd$pSp?=Xu8I!tDnKA87gy(G_ZLvr()aP%hqWX@YNob5vUlwqX{%+$A9fS%D-TmH( z_nA60h7%Rg@7p}5M?VVQ-_5MsW*!u)g9A~InZ5~144T~`R2Hg=N+vZ)!|4ZEzD<%4 z-zhQ0=dw@y9$USzR|$US%IQjB8OKm1X63X3^1-8<{za^@f`QEfX$`)yvS?t0Pg`JB zG_}b{!QMdN|3*QMXGMpGib2t6UsDCrJ!jBItZa0*>%K}Fg}5Rq>zNbrLRk`i*;JR= zxPE7xA*J#|X)zXRRMMKnES9(@8}m}OoR_lYyp%2HCD_n`&=5#GRr2%BFjp3ihDs@O z%<5u4-ZJ>#tS&;|6D06#{2?gXJnwxLKy)60#gRf`TtgZXMSlm1U@q0~rpQ0)M@#4l#%YmD?9+djB#Q$`06WI7)E^hWi z+Fp+GDmKAb+z1K3!%4CQb*$6ptOl*et!zRCopGb#0$~Ks&|-Lr&}W?XBKVR9sZRje z(0q<5JSY;rNEWEl9c|_WDRV+^VIGvps87KAqonsGzGCj8M_(tH?#2@MSciX^EeSVR z9cy2Lr-0Q2{pWpv#w@Ymrx%_Ae>4C~?R!MYP?R7$U}pO+;hoJ~r^o-Pr697z9$8}3 zSNsd&#{ABad4N#Fq3XYk6ioa7nPLBLn~C;k@Ny$eQVH*9)N*aw61#a&vBasm+w~jK z(Ku+wmC|-R-TDJgKYxTb9}NyR$zcpRfR}^{32FY82qIjJ)$cZ0JqT7}@ZDnO)F20E z2tv#hI1%hRI`r{oX#q-0X3NsqMrmjg$nv~p<_z)^F8Qv#5EBbTS&w`}C9lyCOYwr^}a7xXCqfHtDt_tBpd{WE!H-&>E$R%7 z_)>b+yo5EU^XE`yO;=O~E#JnA0(Kb6#n^{u@i(-cJa4oakngy9f|T3j zw%z+LH6a{^VH3ro4Q764_#fTxti)c^`B^r&-fU^qifx&1>{Ose?-jx91gzQ|J4gAy zae4oNQ!DR>>~?*V)FY021`VVkir?OTJ#w?HE!WA}5Qa5A*W%3pvSTN@<6aZrdx@6o z3|dyabyUrDf)j7a1ScmP$Ofnu+rn)-6TmpU**IbIx8sg*^lD5JB!q?S*XQ$zK2EQp z*uwqLiN9;4qu~Zr^mkn&ug`&T#J67`g5Kigw;Vf9deTwNzbBP-rl#WBj8iFOgM8`nIdS104PC19)5P74Geg7cy`_ zdKTtYh>3$x-0wM!8{S&ZX`G0PH-d}{aoMo4@K41Nda?djye0?yP!-xvpJvuU1$liA zZF3(MQ)jmi5!&J}qIYX6iTdnATdk_ErLP7$8tC25tgXF{hLtheYWa3;jmNdb9@@Il zP;}wmpkiuYwao4eznw}N7zm>QlFO_r#4P~ILd#Lb^ zmWmfNvZABh_kHl|!VQ@3gV>Fc-IHY!I0RA1%T-OS8xhOQ#lmvd%TX;%T(~@ zGt4R|aYGAe4pICbqbU`Iz{YLVbAD`Szg2Y>U~YJ6KZ-p151t}|ZAP&^!jy(DCd)b> zJc)sq&zGQ7Tlf#iV>jM`M|8ZHJJGJ%hv^-JeEc1K|8n~X-#Q=_>ErnnZ+WtKf!Q3( z^ow2B`Z^3MDL_FbR)sO-z!)k_WAHtAMnf3&ord6)4KC7O=AtOaP98lCVT)l1oBK8d z`TGcTuJMMj)zQ!pV+fnS-4Jfl^0)Lb1jA7XL%_vG!?T7u;ohK?VtqRYjc^n(?olh; z(#rt&eisZtqKEGJHUqd$=!5+`Rr>4Do3eY^m5<>N1g$VGgI@`a(KDbc@3oI`1b#2& znxR(_P4qE36*>()2NLX0X%P7+rkYU|T{#h5d6(Ihj=)Rw-DmPU!@sjTCrTNLbR7@= z&d{CPjqcpmcXvK}hH>43R~C&Ka@)6eWu}(Dy+>E3$f}MPd@a)5tG+{_k#unEnSawv z(2+-@!%{2U-m4e!VjFOI5)RzZVsum#y~ilNG1`d%V}3Z?-HC6W5WNHCa4m5s^u!*- zU~~kMq(DXbbHG90p@7}@YIJ~q^CN*BeC)Oluv<7r-zj{-B?gVpr zH8_R-20Sq(@o%Hp@V8Macp*Nrc&NGZJT?~V$Hpf>V*0RPQA%*)X&9Zx@90uN%W+Yu zIVm6-EbqGY4ynAh^e%TBmW>^_8x^ePr#cyRzrEWC${9^gCHS&&i1>$ruDxK6D4 zHuJBfX^)F1>%SKEdCTWYX%y-_-JV*>J-fqYn3`+k=Je zOOk?x9k_{9sH4>x2eC-4)$(<1qGd$aTY7NxgX-Ymgq@yZyz0uodJQzKpMSS4Mnh^X zE|Tj0-6_Fbp+0_hs}J~CahBU3P_r?S+qLYWLCY#NTdGsaF30Syqlq5f+l2A78|{+E zmM7559{q#I(LrdC6RUC*aV3xLBz}SZXOtli#q!yW@pwfKgAnMdd-NaDnCSlZ0u{TH zqM0xRt)Hoq5AkN5u`m~%i%K3XXBaNfcp{6Fi}c3_pwT&!uQtT{mni2sl5@CCF21=R z!fS!iOg`IM_3!-iv>*EKdTw&EPc7J<1 z@1oO8At`F(jqP{5L$qawGzWB+nde+O1~)pm(efS7Jg&l=e24Lly_O9Zd?+(v*Vn~50+)e9#b#^^&-ut&9DRxqMN+uf~TfrW;>UjtG$d@g5F;Ts3es_@VR6-QGIb1g_G1)WW^` zZ0rH(Yw;HqoZz+W`yiqX7>_k){?=uqw5j&MKHsI%N{hKj@wFD|t*8^-%R%!Xht~$S z;(z#qf?{l!faTG@fxp2PhF9_Wg%99eB&|OgydTEJ|5j)owtNs8%Iv?4>zLw#0{k>U zw|BvQGrD{pKbn+m0lc)@;r$*rFE$=;;6UI_xM4hzUxG)6#rp5piSZCPp`P>|F&8=F z%@4T18u>bIk?LL-@vVz_k>LI7cnYu#4j2atc)W>HkN%vY756rXj~k5{k<8t6Ywjcb z%T4aRL0pBTFKWasL*FpGSlg(%kAU`i)JB_erBQ#{P|_W07he5n6vJ?S2S#&YBY*4P znVZ?q_i4CQj!Nvb?xS1un6@HO&NJU#vL?=!8783NnOV~X#ACdX^>0I4C;_xHEa+hm@s{lp{-1dsmLN7=J9GW0q&`EbU1{~wxO?pH_&^&SJ7+25(q zoY~l~@a|Zq&*nQn=Dsw}{Y@6=J06itfLW<0M=rxP6=$)&o#UY+4&;q{9R_KJKV)nyo z^2;p=-t)9`#uqsqPqpA8@=0$!UNsJ!@O_56pD?>+hrK!4L|bMXOwX52UbNFKxJ2*U z>d~(k+m501k(fPk#BNDIi;ULE;aQ;9U=zqr$=`x~x0XP+auyDX)WLfuT9ojgB+VIN zF2KVNMaSXF_QQ13;`cJtz@2Eg+B6s6bWMfHYGAg=xlQDx1e=IZU^X(4j%hY93t719 zAn-i=4ot(h{zq8t9a)iP0*-ZoA29C~xx~qGtZT_QxMBzM@Lt9Ja3gqYB2bAKHlKl) zJK%cbelW=FNHikSOeXpwkh-Ot{8Z-6i6_rIkhdA+JGrJfp3rd6TkMaNEh(Tv3Ux^? zIC`8u6t!37tk8rKa2px}#OKfg`t!ApD zSRen0VO;Xf@ZIu{pZRy&`4f<%fuc_Vh9*kEN*$|-%i5ZJ8%kUcOv<(-jZyudUR zvV$_e>2|GgG_ZPDmTV5){dgodek|vV!W3_R40cHA1-$~!x!d91an#G1VUL)}GTXdA z7+-Jm-lQ(K#9y2N4lr=H4=c(deI#5E)^6}q5v;pLp(Dk>HJ5K{jV-)`?O(#1i8c1{ z7OakPotcSC119T_zkOik<_ z32pB3HDo${H)_i*fd~$>amE_+T%{Jz-6x-fjmrB|a0xIq+@_+nM(6Y<{ zzTM#!-E$orblx!bSADX&cSIMK-&r_U!z{0XLyQ7>@EoZk0|Q^Lrl1tZ-{-x(b|4k zN2~cq@nU?E)4w~h%`JYQLoGb!E7RP^Ms&P|Mf?#d_k(!S=X|9@!3P`E^z!7ORtD;KpUnMF{f!h z{KZsh4_abD#4`+(!$)G*!W^CaDVgq-{m2n8%(gZR2(g*<=3;rrKd-9p@lD`Pd{S=ZaDx!WaHOka&(Zu4HlmbBa2 z`iZ)%%3rKOMO^mNKQTr&CmQUm!_NT|rA7J>3l@D6Q;9l{KNFph?5sAv3g zyZ7>Mqx&xChJRraTL~yiY;TPB8pBgqmO_F4IC~OS(+~y+qJ@W)u*fZ#~gwE z+?L#9SC3}`YPgcnvSVCay{p#ajNRtFTI~v)&>pa;%Z_>nz@>>zB25nt3dW{-undL^ zLV`QdOq-+O&(MkR?MQEDnuP)dn^i2mk7x;)k?^c&FeE^smIzz85S7QLdj|wgc!&CL zO7NbKL_eusa51${7ihyTfi>)c!Zll9pNfYAKV(`w-?RG1Cis?VQ&Hfx`ZE)J7pvd2 zp-GgXWBe$z!n+A{e@6zt4gUmK*8s~qT~X_pNEGD-I-eh4gUn8yY6~~>>sdK)3{+v0f>a8%D^NpR=;47O{#+~Cj<+T_0}AQO z#U9hqz^Av6&CxIp2?%;M1;yW|IkTX(5JddoVqa4JL`W&t=Tq(BZD109j#Hvx{M|B& zH_eNQ7@7ypqVH^>?_)i{q!axb8b!c;3|3KZ@g~tE@Mx{DBQw#vl)ag4$@JK~RhY6c zcrtC?u{aXS95m1oIEVE(*JHW>9W_z>mZz43Nnbq<+miFY?<75^GxRYQ8L%u9TZ73a zhF`|>vufwoI7hD?z6+v?g9(AP#2&H% zL5>~lik;>(aC8`+S*Pfy9u!W`-_?Ov{LjXi!c2kR0KsX%3`{J>Uv?I=ZN9At!&z{` z;sa;QPz>CT*dUHS+v`GVe4fqg#6VD|+SC~qv8aJO9$WaIFc)=5_!G|Bf{smCv!G+^ zi;kUiZ0b~dEFF6+9r43{(GA}@XpR2RO6)uy+lxL3YWyDYM#c&3gfri%bExk&M%KN= z%p5F;IjT` zqLMYeFkkVOFRZC5^_EY_nlx?V%$XAla%bKY&2+`(rgoz!sje8HJDKWIVgO}A)=c*_ zNpgbAOuKGUQq45!7$}OFAPplg6_`1N(og6F&xuDPf)N zlGJExCn%oM+R}v?u9^&`tg5uG&Lv@RuDNn9z6E&Y+;|B2G04EH^(sreN>hYoVCkZ(ysqk+ z@rllt;H*Id5#Lo>S6Nn4=dDHEapUTIcOj`D}dvE>or~T3lLHIoDO`Ew3&0R#q=^)!nD6`Rb1zdaPg5pU`>N);m?;FGR|$@nD;3o> zAg+*uQn;wLysUcuqRRWq=ekM-k#R1?<#N?kEUB)&yS&zQEAg(Cb#8a1rKKr_b*1ym z$0;*~T&{BJ$5pw=RbF3HTV7WOkrk!%uClr1^X6AnF1WjD;iBrAdur>vzQs%G@4atg z_N2+~oV+Phe=se7`puph1v6(A78TFFWll+Y#;EH?Uw^}xv6%`4Uo^LpEh?>wq3c>w z>8+^tiPk_l)wP%53A<7}v0(a?>AB-v)6ve-sw!9M+-Tj>+WEeP<%_&^uA18FGDt_o z;1kzgrn^=z3X6OTuc@AQ4P>di9lT4u z9N=D;x7t;PuJ@L^r1gl_xfc1*f|}~eMeLn1`S%L*Q!>(T_EwbFN&qx4&54kaA$!3r zNVq6zd>#t12vSnu39FE9K)epI3%A_XU}~t8?zvHh=+$elPhxD&Br!}$SX zJDw$MK%9d7Lx?9JK79n+Ys3v7L?W9JC;uZ7IfS?Z@oAPL9)?9S|0>8V#GN7VLEQQ& z@DV46fsc4A;?szgcHm=XUx#=aV#{a1N8E^bBjRcQj6@C~ZvPy3kSqN-@EHFaOLfHU zh@V2d^ovNO74a}U5!VspO&0M;L2COBCgzi|iK5D(DlljR+ebfS!@I zyaXl_&$a~;vj+{d=J>4-SsqTBndVeFQ8*1j2jWwxW%+R|;uMLP_>(ke(zOX`uEZ&6 z&cua?YmE376iiG+#{Dv5IieW=CnNtl<}-0kTw*G6_JGzrpx)Y7RNGgkf%z?ENq+*- zDoM0gl=Oh)nDnJYlG>RJO|8KNzFb(2Wk1v!)sWHfa%hOEq^WL(i55_m2)z*J7>Kmx z!$7*--vpEv^-I*%XLPzd2*IlfE15sr%Dzu^k|DuKE`dCrS?q7v2%e17WC$1M0PlCDxQYVlafrN+1y^-!n za|xsrRNweEUWn?2G|``gQ6jo%0+4FnjYJ+o55%)Gx`>Wq7%1@X;~s!VT?^0FCt@N< z5^)Vm#~$sAZMNU?P!dOr9D!SbI2VZAKlV+rKFvw1rV~E^#9`EDZfu8{W>gGKZcbB7 zS?%!Ftsh1rGkZ}MBHS%RAm!0OtobMs`C~6cgYx1ur&qWnAPhs8iwe$Tc&>7$3Udv0 ztpVa#AZ|DlB1~0K+zP}kK>R^3L?P?asJd_oQaJ>~$9f?evig9^Mp@89SszCtHB9r0 zU(~Z1hV z$q^v7oe2?xP*6+-;#N%IeCE(+>l3r3Vb20$9_IE&njw(88)UFf1W6b2Imz?S4o^oq z9&zGBNu)-k4L}-=nIDVF9!MDH(;*wDc|O|q9*jir^C>-$Fq0xri9{0YL!sNNtP_;k zhyic3{4(Ligf&x?hm)-PvX$qPMjgmjermCHWh<{+tVn-iNj;UVd}Fo#YqGMTpS5$c z(%LU|r5ntwZ{#TN_qQI(QCe))zvL+I*{mPsDBA~E^&I7$0oLO=$~LSZPUa{F5v|Ns zww^@}htC@IP_D89Ss?WkqQ+dMWzfJ;O}WbRXIr1lRsMALsHc(Tux`v%{_3#)Emzs$ zwEjI;Iq0;8KxDA>pSjAu!PYN;e~$GOFwe2B%u}8@*ZNSNvgh1UTAuQ9vb8Z!*`I8E zJWu)cdDf@$l-JL*{wz=V`4H=-Jmu9P))(`Xr_Q&&oTvQeeCw_}<*^j&9@I)1^@luV z(*@Q8dCHCptncM1PhV*LAWzwPp*57J{OBU#b$g!j-uF^}m8bmm zs??w6DMyBEk+ipl!RgnLBRRhNH^!4OQeuIjJ6lK2ot`tPkwcUeK*-_MG_e6q7&l|UW7F2TCl zp)@60SDdYU3@ZWf;91tK4&_MziqeJeHyz5e4k=edf(L8brPi*Cl(qz9y@%REmEDO~ zY#FLV5-&vdGfCF1LzO43e@z6S+N`f$tn9bFn*d}%)c?+;a87<|dmp~_R| z49EB3bF9IOmF9C~B3XL^<7`jk8&Qc)s$)0PE)|%Ao<)7cNXXF~IuE3zT0&0m%BvS=N>d zlt=BXb<}SC;sWLOLO)NOO_~7*X|8dy^oWx*|326Xjz2yJl=q%v{pK9yv1IGXOO=Pu zv+h1m`RIHS`}2jQ|MQE^-gT*R@FMHWmny4=lGT?(t=lhE{&_KpZNG%9uz6e7at>R4 zal(0bS`Q^8yiVnJCS1HOQF%HMNpv?pksqIzV86-JJAK0fdZLF0K*_Fc}n~Zoc0^Mup zV-_3Ja}h%WN+ZI#2ow`1bJd3)wb&qRHEDDpP6dqQfAz`BwEkChQ*nN0GCU*=ugmDN{5#}H)K)4TK zHNuk!&mp{u@CL$r2%jRHLKrk~JqRFNjW7;jD#9Fu1qk;ctVVbe;W>m?5#B&}58+dU zQwW0wJ^=yEl?UPXMFsHyTQI1a1Cx3|0=-}3;VsCsUxw^T_huPB*^6S4A=in*w1 zLZDw(R#IMHR$k*Rfs|F{N?I9C>gphXj24su9ZX6WR+a&~8ietcCb&t;chv#Ata>32 z?o4z1&iEo=(1X$EjE1w~i+c1c=7(kcT!Dbqp1{ik9#6|$fX$CsNCL<}pu;0QI=>3w z-3h=fXUxE@A^jim=oI(Daiyao>yjsN=o@)bNuNeMI?*l+BKl7ALtK7x5$OMjN8gtU zC;1DcO}@-$n1w)p$uxcDA>h%Mk}vs~_+?0w4e{u6=RzsOGs_usJY)3`#iNhrpOT~R zW;xqu;`xxKtegZmOYDc!r(ZWeCfyojn0Uv4cMNzf6wLS#kKuj<6K^B@&qmCSW0`4u zOnNH;n|Pd*j;zB`oQZ_k#CzDlV|%-R*9E+6voHqlkr=!Q@MRO8z??+}#>cGk6Tr+S zy;T=lZL9E8j>l*~#>d2a7O;s|b-C46^^BryG7C{=CSNh|sETCzSXAVUYko|;7G#hf z@m#=j0gwG;eoVYJWSDrvfj1m@W*KqK^nRq-XQapZEfsi2k*2-yLp;)d8^NS!#~g0o zq$pX)Ge5**cn`tE<6J)tcwHuvfkV8HV(=zou9*BwjL#l;1VaeqPxP>QCV<$)W6ZuaKMh-;7cjmU8I+T4a3Tyqh^04o2i7Mk z$TU7CJrj5m8}8C>aiBrG}8zereepdXPixl4Z`VcA>enkY&1s2u;Yygwr`&Lu3! zh&7jl*$O#sB`nr>FlY==nZcos<1Aw#kYscL2b?T7DsW`U44fq5!x1E5hk!X!Buw4G zyI@2}nEfIxU&34iD#F4gEPXaDS;EPTgvCl2ZUi4%ri6zGm=-8u>5FJ-5|&*=i;^%G z-`$@i<-%?NsiZicLYT(`-Jc}b1$%n0p`b)4NVZ7gSd`Brtih4ZoCM_@1y`-2?MuL% z#G^~IeF<0_y8%x#i(RNV|4hY<&Je{#OEC)!%C40UYV^nORq&)por>|0v+(Llzqk-HHEwIjEJ9qCVOO z*xYdp#vaNKc>Na^8~cUyer({c0Zdza(SVN|_0KX~cmQQ=-$(=A2)POKceMGr*uZZv zV2(`Ed)a_F@`(R7V2*FH8I1PwK-39&#sH=~mvS1x=L!Vkk22s&11>ON&JZkL2G|Sx zAic}bzdr7{%rOYw4EX=Fa{VE4Ty=b< zcd*hB6My|7NE0X;Bt3Wb_I^Q;yX?(1leF)5Kq&6Ol!OI3L$NjQlFc6uX8_?lwF z%$-QZL(4|0A5-`QezU?a6n+f9ng25I$(P3RuSt9;_d!fp3xe?sFsc3$aN?;rswarw z8p}Vf^1lbn=Zxy_D)6iC8PA_a8tdOs`G^c;e}@x-S5?AtlE50I$W0RXv62bjWkL%x z_bULl`Ccgbg`bb*`MHxc-9xK{=PP(w!BF^u!VQHJWw{J|0P$ z2#ou4z^~sJ%kvu>$MXU(pKsu0{Wlc;yTb2=d~l0^0!LN33ph<*0k{U$Y02`3a`=y- za)10YwuJDP?LUma(J#mH{ANoW0{`Ujc>XNPbG+XN=5rD+W#(nz#MvK%F8@{K&moWW z{TDciUZm>X!CH7ejF$!8r|`oHe^lWgsTp1XF5EGme-Zg4;AblTGphWH3iH3HWP7hF zoQTX3B&Hc~H}I1wAzTB#3~xczW&7V@BY1v|mp`AwKfi&u^6{JbZ>s#ytNg=pz?7>h ztN~wuYMZKjMdjC2{?`@$m%>jIL!c_E{09(lr3K(Pa1vb|#Y%4m_zMsy6i4jvkGJjx zz7B88bq(qJD)4M>JkO7a#Loirxr~>jzXJS8jGq(4{JA)w%Ux3WpH&!_RAu?cflpv( zHqXyNtZ-EocwQBF2{_H**MR?%a$j$#@(=_mF?S(iJaGi>1ro;gY+ybfUK02@g&S%@ zuP9tn`A;j{Q}~^TV-g8G0ttLS;~MoG!{3hpUwd;b&kwrnZ$agwc}Y(bI8FbjRen$P z|4oJGRr%j3JOfO6{|%gM&e5CYIRQ)6g;iZ7h}|T=cUzUaQgN$w5uf3juzf$59DI{NteMfQ5H8MRVINGal{CRY zMmX}v6cz% z)eJe*&=VVI0GnlE?d-A{YBShttBZz*R+vrmT)zmoSv(OsZnOkwIXr>f% z#cRaGXA%s_M$yT(a{|>l~Ju&f+27kR<{+!k}i^S;Ks_jrmwgKU7t-t)!*0R5d+wWF!q=Y;4QPp@jiMZbMYlI-P5b>YB6|m`<29WsZjV zK}!JZxe<8V0@DZkCjzU}bWmfk=;Fum(V{T{t7P;K%L*9Ijw`Gnuy%ygsSk@si55>v z$AOil>-)pXLTTQY*_aO3yKUbdkrB~y*KJ{kT{#RAKT|g4`SR%{TK0&1yCkRPRx>_j zw;U^=<`;zlsl*HC0O{#tmqiSfuBWiaX#wq*M2H;8pQUuT)&+1#7!Qys04^8KN;T#J1CJdt1qr#1u+z z7dTS%|-I${8;@E%WZaL7ua1$&rqiM*2=kHL}rxY*x5rhk`S%ELm z&4Mu8D%=2~i2{B1oG@nvv~?QlS@+t)vU$or!zn=m$y)?YwDEA8i=*b8GdbwM=lafD zI&KJLitV=}S(2sM42A2U3iPaXcT1z$30)ztkBDf;cOWheZ^U#;{{c=7xsNQ*0k^Hg zS&UdNDYyIadnMl8pw6SeNvX!?kkE!W4o`7f?QTmZ5t~foa*f;UfX!y2F8wG|D+Ug3 zB-xI@13o(K?F2ZEi#r^w_6cD!()hRcL^;81RacS6MOnJ{>@Id=O1D%56D& z=*NB}24){ufJPjPG?d9;-$raWhhW<6AijbJ%I1!_!1$<04r!C|Z6dX_aw)%Lom50P zWr0ZE-WarQTogqfRxTY}e!Zk5gWOU`UC2^ogKMP zOEVe97pfROP$Oa|(U*s}!8|3$aYUUCP?X5-dVRUnOyU~R?DYgo(=a+1D@@pHvEWNc!3CGmol z2j{A0rlK(pXdoK%Th-;nfyXNhO;gfBmlKN$9F9~qt*G~~*0Q6ThYNBrKBiPan4kTJ zq+A9<_hrmidvL(ubHRLbYtKU|ic1-xEJMv4oVe}p46;Bj%`?ntLn`NPS?qNjR57*5 zSS>}j<06LHhp~*c)D7!yGad9nwm=J41?{2fMsg@61I}_a-stdlIJzv+z&*f`IhPTA zV!)N5Z8?ow+SvoGW=quNWECr&9O8ARWH>p-?U_L!H7C}E!59$6%7$yQ+y3rk#th^_ ze^ns#zKCs|pq^=nGy9@Pz!YH73MyNfi@3elrqd#0&Jwo{of=s(V#EirXtNk&?40Qh zCKJaZnItz8a>9`Zx{~d$b4yDmHlb<@r&e_6FoyX57yVeU92B7Sa^j|9SrK?60MxL5W%u3c$akt zZTraf0^AH9_7se<`f`SX*wVE+h$XSp7t7Bc!30Asc!$_Qa91?eW=ir92RPl~jEYh9 z&CO9^&)D#jGIEO@lM>k=gPoCZ!sc>lNZ~}vRfscNU~3cmdrna1&2>ix5$SEJ60+KA zA3_;d3>VuzLEDA5A8CEitnP-oAp^5^m$54bKf)WiD%i*V+R$L6&?n1kxzf*yNYmRc za_c&tq)}r76OkbVH<|j_HWU%ztEit_YW>h(TG+Y+yUbIfl8JMR9wHYmQxGIDhLC%g XRI!`2;db_HgI+>5lKQxTZw>zg{q0Ax diff --git a/sourcehook/generate/shworker.exe b/sourcehook/generate/shworker.exe deleted file mode 100644 index a251da14479b56dd75dd15f925de69e066c036c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352256 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 diff --git a/sourcehook/generate/shworker/Makefile b/sourcehook/generate/shworker/Makefile deleted file mode 100644 index 86ac5bf..0000000 --- a/sourcehook/generate/shworker/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -default: shworker - -bin: - mkdir bin - -fd_hopter.o: fd_hopter.cpp bin - gcc -fPIC -O2 -o bin/$@ -c $< - -main.o: shworker.cpp bin - gcc -fPIC -O2 -o bin/$@ -c $< - -shworker: fd_hopter.o main.o bin - gcc -ldl -lstdc++ bin/fd_hopter.o bin/main.o -o bin/shworker.bin diff --git a/sourcehook/generate/shworker/fd_hopter.cpp b/sourcehook/generate/shworker/fd_hopter.cpp deleted file mode 100644 index 7fc149d..0000000 --- a/sourcehook/generate/shworker/fd_hopter.cpp +++ /dev/null @@ -1,370 +0,0 @@ -// From fastdelegate -// http://www.codeproject.com/cpp/FastDelegate.asp - -// Modified to be run from shworker by PM - - -// HOPTER.EXE -- A simple header generator for vararg templates -/* MOTIVATION - C++ doesn't have a vararg feature for templates. This can be a - nuisance when writing class libraries. There are a few options: - (a) manually repeat code. This is tedious and error prone. - (b) Use macros. Messy, can't cope with template - arguments, and users get hard-to-interpret error messages. - (c) Use the boost preprocessor library. This slows compilation, - and introduces a dependency on boost. - (d) Write a program to automatically generate the code. - I've never seen a general program to do this job, so this is - a very simple command-line program to do it. - - Why is it called Hopter? - I wanted a word that started with h, to be reminiscent of header - files. At the time, my 2yo son kept talking about 'Hopter Copters' - (he couldn't pronounce 'helicopter'). - It also reflects the level of sophistication of this program -- - it was named by a two year old. - - IMPLEMENTATION - - When you analyze the problem, you find that the requirements - are very simple. - Varargs are needed in two places: templates and functions. - You want to use them in two ways: when declaring the template - or function, and when invoking the function / selecting the - template. - - It's a brain-dead implementation, which just does a search-and-replace - of specific strings. It could be done with a few lines using sed on - a *NIX platform. Because I use Windows, I've done a quick and dirty - implementation using CString. - -In a file, @VARARGS at the start of a line indicates the start of the code -to be expanded. @ENDVAR at the start of a line marks the end of the -expansion. - - declare template -- template <@CLASSARGS> class SomeClass - template - class SomeClass - - declare function -- somefunc(@FUNCARGS) - somefunc(Param1 p1, Param2 p2) - - select template -- SomeClass<@SELARGS> - SomeClass - - invoke function -- somefunc(@INVOKEARGS) - somefunc(p1, p2) - - I also provide @NUM which is the number of arguments. - The case where @NUM is zero is a special case: for template declarations, - the entire template<> bit needs to disappear. When other arguments are - involved, either at the beginning or end of the list, there a commas - which might need to be removed. - - I've used .hxx as the extension for these files. This enables C++ - I wanted to use an unusual file extension (.HOH) for these files, because they - aren't real header files. But I also like to use the C++ syntax highlighting - in Visual Studio. I chose .hxx because MSVC treats it as C++, but it - seems to very rarely used. - - Installation (for VC6, if you want to use .HOH as the extension instead): - Go into the registry and change - HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Text Editor\Tabs/Language Settings\C/C++\FileExtensions from cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2 - to cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2;hoh by adding “;hoh” to the end. - Then add this as a custom build step to the main file of your project: - hopter $(InputDir)\*.hoh $(InputDir)\*.h - -*/ - -#include -#include -#include - -// This is a quick-n-dirty implementation of a CString replacement. -// It promises nothing more than to provide enough functionality to get -// this program to run. -// Note that I have really never used CString, so the information to -// implement the members that are used in this program come from -// online documentation at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cstring.asp -// Also, I have only used VC++ a few times, a long time ago, so -// I really do not know what all their alphabet soup is suppoed to -// mean, so I just made a guess... - - -class CString -{ -public: - enum { MAX_FORMAT_STRING_SIZE = 8 * 1044 }; - CString() - : str_() - { - } - - CString( - CString const & rhs) - : str_(rhs.str_) - { - } - - CString( - char ch, - int repeat = 1) - : str_(repeat, ch) - { - } - - CString( - char const * s) - : str_(s) - { - } - - CString & operator=( - CString const & rhs) - { - str_ = rhs.str_; - return *this; - } - - CString & operator=( - char const * s) - { - str_ = s; - return *this; - } - - CString & operator=( - char ch) - { - str_ = ch; - return *this; - } - - void Format( - char const * fmt, - ...) - { - char buffer[ MAX_FORMAT_STRING_SIZE ]; - va_list ap; - va_start(ap, fmt); - vsprintf(buffer, fmt, ap); - va_end(ap); - str_ = buffer; - } - - char operator[]( - int x) const - { - return str_[x]; - } - - CString & operator+=( - CString const & x) - { - str_ += x.str_; return *this; - } - - int Replace( - CString const & lhs, - CString const & rhs) - { - int rval = 0; - std::string::size_type pos = 0; - while (pos < str_.length()) - { - pos = str_.find(lhs.str_, pos); - if (pos != std::string::npos) - { - str_.replace(pos, lhs.GetLength(), rhs.str_); - pos += rhs.GetLength(); - ++rval; - } - } - return rval; - } - - int GetLength() const - { - return str_.length(); - } - - operator char const * () const - { - return str_.c_str(); - } - -private: - std::string str_; -}; - - -CString operator+( - CString const & x, - CString const & y) -{ - CString result(x); - result += y; - return result; -} - - -/* Example: This is an excerpt from boost::function_template.hpp - -#define BOOST_FUNCTION_FUNCTION_INVOKER \ - BOOST_JOIN(function_invoker,BOOST_FUNCTION_NUM_ARGS) -#define BOOST_FUNCTION_VOID_FUNCTION_INVOKER \ - BOOST_JOIN(void_function_invoker,BOOST_FUNCTION_NUM_ARGS) - - template< - typename FunctionPtr, - typename R BOOST_FUNCTION_COMMA - BOOST_FUNCTION_TEMPLATE_PARMS - > - struct BOOST_FUNCTION_GET_FUNCTION_INVOKER - { - typedef typename ct_if<(is_void::value), - BOOST_FUNCTION_VOID_FUNCTION_INVOKER< - FunctionPtr, - R BOOST_FUNCTION_COMMA - BOOST_FUNCTION_TEMPLATE_ARGS - >, - BOOST_FUNCTION_FUNCTION_INVOKER< - FunctionPtr, - R BOOST_FUNCTION_COMMA - BOOST_FUNCTION_TEMPLATE_ARGS - > - >::type type; - }; - -Using HOPTER, this can be written as: - - template< typename FunctionPtr, typename R, @CLASSARGS> - struct get_function_invoker@NUM - { - typedef typename ct_if<(is_void::value), - void_function_invoker@NUM, - function_invoker@NUM - >::type type; - }; -*/ - -int MaxNumArgs; - -/// Makes the necessary subsititutions in 'bigblock', and writes to fout. -void PrintVarArgs(FILE *fout, CString bigblock, int num) { - CString numstr; - CString invokelist; - CString funclist; - CString selectlist; - CString classlist; - CString commastr; - numstr.Format("%d", num); - if (num==0) { - invokelist=""; - funclist=""; - selectlist=""; - commastr=""; - classlist=""; - }else { - invokelist="p1"; - funclist="Param1 p1"; - selectlist = "Param1"; - classlist = "class Param1"; - commastr=", "; - CString str; - for (int k=2; k<=num; k++) { - str.Format(", p%d", k); - invokelist+=str; - str.Format(", Param%d p%d", k, k); - funclist+=str; - str.Format(", Param%d", k); - selectlist += str; - str.Format(", class Param%d", k); - classlist += str; - } - } - - // Simple replacement of number of arguments - bigblock.Replace("@NUM", numstr); - - // Template declarations - if (num==0) bigblock.Replace("template<@CLASSARGS>", ""); - else bigblock.Replace("template<@CLASSARGS>", - (CString)"template<" + classlist+">"); - if (num==0) bigblock.Replace("template <@CLASSARGS>", ""); - else bigblock.Replace("template <@CLASSARGS>", - (CString)"template<" + classlist+">"); - bigblock.Replace(",@CLASSARGS", commastr + classlist); - bigblock.Replace(", @CLASSARGS", commastr + classlist); - bigblock.Replace("@CLASSARGS, ", classlist + commastr); - bigblock.Replace("@CLASSARGS,", classlist + commastr); - bigblock.Replace("@CLASSARGS", classlist); - - // Template selections - CString selargstr; - if (num==0) selargstr = ""; - else selargstr = (CString)"<"+selectlist+">"; - - bigblock.Replace("<@SELARGS>", selargstr); - bigblock.Replace("< @SELARGS >", selargstr); - bigblock.Replace(",@SELARGS", commastr + selectlist); - bigblock.Replace(", @SELARGS", commastr + selectlist); - bigblock.Replace("@SELARGS, ", selectlist + commastr); - bigblock.Replace("@SELARGS,", selectlist + commastr); - bigblock.Replace("@SELARGS", selectlist); - - // Function declarations - bigblock.Replace(",@FUNCARGS", commastr + funclist); - bigblock.Replace(", @FUNCARGS", commastr + funclist); - bigblock.Replace("@FUNCARGS, ", funclist + commastr); - bigblock.Replace("@FUNCARGS,", funclist + commastr); - bigblock.Replace("@FUNCARGS", funclist); - - // Function invocation - bigblock.Replace(",@INVOKEARGS", commastr + invokelist); - bigblock.Replace(", @INVOKEARGS", commastr + invokelist); - bigblock.Replace("@INVOKEARGS, ", invokelist + commastr); - bigblock.Replace("@INVOKEARGS,", invokelist + commastr); - bigblock.Replace("@INVOKEARGS", invokelist); - - fprintf(fout, bigblock); -} - -int action_hopter(int numargs, const char *filenamein, const char *filenameout) -{ - - MaxNumArgs = numargs; - - FILE * fin; - FILE *fout; - - fin =fopen(filenamein,"rt"); - if (!fin) { printf("Error, can't open %s\n", filenamein); return 1; }; - fout = fopen (filenameout, "wt"); - if (!fout) { printf("Error, can't open %s\n", filenameout); return 1; }; - char buf[5000]; - for (;;) { - if (!fgets(buf, 5000, fin)) break; - if (!strncmp(buf, "@VARARGS", 8)) { - // found a match... - CString bigblock; - for (;;) { - if (feof(fin)) { printf("No matching @ENDVAR !!??\n"); return 1; }; - fgets(buf, 5000, fin); - if (!strncmp(buf, "@ENDVAR", 7)) break; - bigblock+=buf; - } -// fprintf(fout, "// Auto-generated code [[[\n"); - for (int k=0; k<=MaxNumArgs; k++) { - fprintf(fout, "//N=%d\n", k); - PrintVarArgs(fout, bigblock, k); - } -// fprintf(fout, "// ]]] End auto-generated code\n"); - } else { - fprintf(fout, "%s", buf); - } - } - fclose(fin); - fclose(fout); - return 0; -} diff --git a/sourcehook/generate/shworker/msvc7/shworker.vcproj b/sourcehook/generate/shworker/msvc7/shworker.vcproj deleted file mode 100644 index 159bd19..0000000 --- a/sourcehook/generate/shworker/msvc7/shworker.vcproj +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcehook/generate/shworker/msvc8/shworker.vcproj b/sourcehook/generate/shworker/msvc8/shworker.vcproj deleted file mode 100644 index 997949d..0000000 --- a/sourcehook/generate/shworker/msvc8/shworker.vcproj +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcehook/generate/shworker/shworker.cpp b/sourcehook/generate/shworker/shworker.cpp deleted file mode 100644 index 5e0047c..0000000 --- a/sourcehook/generate/shworker/shworker.cpp +++ /dev/null @@ -1,767 +0,0 @@ -// SHWorker -// Inspired by "Hopter" that comes with FastDelegate (http://www.codeproject.com/cpp/FastDelegate.asp) -// Much more powerful (and ugly) though - -/* - - INPUT FILE DIRECTIVES - - $a is the first additional argument, $b the second, ... - - --- - ITERATION - - @[variable,min,max:code|separator@] - - variable: this will be replaced in code by its current value. - vars are always $ and a number. - min: first value to be used for variable - max: last value to be used for variable - code: the code that will be inserted on each iteration. - separator: optional. this will be inserted between iterations. - If you don't use a separator, you may leave out the | - IMPORTANT: iterations will only be performed if max >= min - - --- ARITHMETIC EXPRESSION - - @(expr) - - expr may contain: - variables - constants - operators (currently only + and * are supported) - - --- CONDITION - - @[expr operator expr:code@] - - Example: @[$1!=0:hello@] - - Currently only != and == are supported operators. - - - Yes, error handling in here is weird, some stuff uses return values, other code uses exceptions. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include "stdio.h" - -#ifdef __linux__ -# define stricmp strcasecmp -#endif - -// Ensure that the template version is being used! -#ifdef min -#undef min -#endif - -using namespace std; - -extern int action_hopter(int numargs, const char *filenamein, const char *filenameout); - -typedef map varmap; - -struct MyError -{ - const char *m_desc; - - MyError(const char *desc) : m_desc(desc) - { - } - - void Print() - { - cout << m_desc << endl; - } -}; - -struct SyntaxError : MyError -{ - SyntaxError() : MyError("Syntax error in expression") - { - } -}; -struct OtherError : MyError -{ - OtherError() : MyError("WTF") - { - } -}; - -void trim_string(std::string &str) -{ - size_t first = str.find_first_not_of(" \t\v\n\r"); - if (first == std::string::npos) - { - str.clear(); - return; - } - - size_t last = str.length(); - for (std::string::reverse_iterator riter = str.rbegin(); riter != str.rend(); ++riter) - { - char ch = *riter; - if (ch != ' ' && - ch != '\t' && - ch != '\v' && - ch != '\n' && - ch != '\r') - break; - --last; - } - str = str.substr(first, last - first); -} - -// unused -bool ExtractToken(std::string &strin, std::string &strout) -{ - trim_string(strin); - if (strin.begin() == strin.end()) - { - strout.clear(); - return false; - } - size_t first = strin.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFHIJKLMNOPQRSTUVWXYZ_0123456789"); - if (first == 0) - { - if (strin.size() > 1 && strin.at(0) == '/' && strin.at(1) == '/') - { - // One-line comment, find its end - first = strin.find('\n') + 1; - } - else if (strin.size() > 1 && strin.at(0) == '/' && strin.at(1) == '*') - { - // Multi-line comment, find its end - first = strin.find("*/") + 2; - } - strin = strin.substr(1); - strout.clear(); - return true; - } - strout = strin.substr(0, first); - strin = strin.substr(first); - return true; -} - -// Returns the number of occurencies replaced -int DoReplace(string &str, const string &what, const string &with) -{ - int cnt=0; - size_t where = str.find(what); - - while (where != string::npos) - { - str.replace(where, what.size(), with); - ++cnt; - where = str.find(what, where); - } - return cnt; -} - -int DoReplace(string &str, const char *what, const char *with) -{ - int cnt=0; - size_t where = str.find(what); - size_t whatsize = strlen(what); - while (where != string::npos) - { - str.replace(where, whatsize, with); - ++cnt; - where = str.find(what, where); - } - return cnt; -} - - -class ExprParser -{ - // grammar: - /* - expr -> expr + term { do_add } - | expr - term { do_sub } - | term - - term -> term * factor { do_mul } - | term / factor { do_div } - | term % factor { do_mod } - - factor -> (expr) - | numeric constant { push } - - - equivalent to: - - expr -> term moreterms - moreterms -> + term { do_add } moreterms - moreterms -> - term { do_sub } moreterms - moreterms -> epsilon - - term -> factor morefactors - morefactors -> * factor { do_mul } morefactors - morefactors -> / factor { do_div } morefactors - morefactors -> % factor { do_mod } morefactors - morefactors -> epsilon - - factor -> (expr) - factor -> numeric constant { push } - - */ - - string::const_iterator m_begin; - string::const_iterator m_end; - string::const_iterator m_iter; - - int m_lookahead; - int m_tokenval; - - stack m_stack; - static const int DONE = 256; - static const int NUM = 257; - - int lexan() - { - while (1) - { - if (m_iter == m_end) - return DONE; - - int t = *m_iter++; - - if (t == ' ' || t == '\t') - ; // Remove whitespace - else if (isdigit(t)) - { - --m_iter; - - m_tokenval = 0; - while (m_iter != m_end && isdigit(*m_iter)) - { - m_tokenval *= 10; - m_tokenval += *m_iter - '0'; - ++m_iter; - } - return NUM; - } - else - return t; - } - } - - void match(int t) - { - if (m_lookahead == t) - m_lookahead = lexan(); - else - throw SyntaxError(); - } - void factor() - { - switch (m_lookahead) - { - case '(': - match('('); expr(); match(')'); - break; - case NUM: - m_stack.push(m_tokenval); match(NUM); - break; - default: - throw SyntaxError(); - } - } - void term() - { - factor(); - while (1) - { - switch (m_lookahead) - { - case '*': - match('*'); factor(); do_mul(); - continue; - case '/': - match('/'); factor(); do_div(); - continue; - case '%': - match('%'); factor(); do_mod(); - continue; - default: - return; - } - - } - } - - void expr() - { - term(); - while (1) - { - switch (m_lookahead) - { - case '+': - match('+'); term(); do_add(); - continue; - case '-': - match('-'); term(); do_sub(); - continue; - default: - return; - } - } - } - - void do_add() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 + a2); - } - - void do_sub() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 - a2); - } - - void do_mul() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 * a2); - } - - void do_div() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 / a2); - } - - void do_mod() - { - int a2 = m_stack.top(); m_stack.pop(); - int a1 = m_stack.top(); m_stack.pop(); - m_stack.push(a1 % a2); - } - -public: - ExprParser(string::const_iterator begin, string::const_iterator end) : - m_begin(begin), m_end(end), m_iter(begin) - { - m_lookahead = lexan(); - expr(); - } - - operator int() - { - if (m_stack.size() != 1) - throw OtherError(); - - return m_stack.top(); - } -}; - -int parse_expr(string::const_iterator begin, string::const_iterator end) -{ - return ExprParser(begin, end); -} - -size_t find_first_directive(const string &buf, size_t begin=0) -{ - for (;;) - { - if (begin >= buf.size()) - return string::npos; - - size_t firstdirpos = buf.find('@', begin); - if (firstdirpos == string::npos) - return firstdirpos; - - if (buf.size() > firstdirpos+1) - { - if (buf[firstdirpos+1] == '[' || buf[firstdirpos+1] == '(') - return firstdirpos; - } - begin = firstdirpos+1; - } -} - -// buf begins with a section. Find its end! -size_t find_section_end(const string &buf) -{ - int starttype = buf[1]; - int endtype = (buf[1] == '(') ? ')' : ']'; - - int nestlevel = 0; - - if (starttype == '(') - { - for (string::const_iterator iter = buf.begin(); iter != buf.end(); ++iter) - { - if (*iter == starttype) - ++nestlevel; - if (*iter == endtype) - { - if (--nestlevel == 0) - return iter - buf.begin() + 1; - } - } - return string::npos; - } - else if (starttype == '[') - { - int lastchar = 0; - for (string::const_iterator iter = buf.begin(); iter != buf.end(); ++iter) - { - if (lastchar == '@' && *iter == starttype) - ++nestlevel; - if (lastchar == '@' && *iter == endtype) - { - if (--nestlevel == 0) - return iter - buf.begin() + 1; - } - lastchar = *iter; - } - return string::npos; - } - - return string::npos; -} - -// replaces variables and additional arguments -void replace_vars(string &buf, int argc, int *argv, const varmap &vars) -{ - char varname[] = "$ "; - char value[32]; - - for (int i = 0; i < argc; ++i) - { - varname[1] = 'a' + i; - sprintf(value, "%d", argv[i]); - DoReplace(buf, varname, value); - } - - for (varmap::const_iterator iter = vars.begin(); iter != vars.end(); ++iter) - { - varname[1] = '0' + iter->first; - sprintf(value, "%d", iter->second); - DoReplace(buf, varname, value); - } -} - -// do_input -// params: -// argc: number of additional arguments -// argv: additional arguments -// outfile: output file -// buf: string to be processed. IMPORTANT: buf is modified! -// curvars: variables buffer. -// retval: -// 0 on success, non-zero on error - -int do_input(int argc, int *argv, ofstream &outfile, string &buf, varmap &curvars) -{ - for (;;) - { - // Find the next directive. - size_t firstdirpos = find_first_directive(buf); - - // Output everything that came before, and remove it from buf - outfile << buf.substr(0, firstdirpos); - if (firstdirpos == string::npos) - return 0; - buf = buf.substr(firstdirpos); - - // Now find the matching end. - size_t sectionend = find_section_end(buf); - if (sectionend == string::npos) - { - cout << "ERROR: Section not closed!" << endl; - return 1; - } - - // Place the section in its own buffer and remove it from the input string. - string sect(buf.begin(), buf.begin() + sectionend); - buf = buf.substr(sectionend); - - // CASE1: Arithmetic expression - if (sect[1] == '(') - { - replace_vars(sect, argc, argv, curvars); - outfile << parse_expr(sect.begin()+1, sect.end()); - } - else if (sect[1] == '[') - { - int is_iter = 0; // 0 -> no; 1 -> maybe (only used in check); 2 -> yes - char lastchar = 0; - // This could be an iteration OR a conditional thing. - // Pretty braindead check: iterations begin with a variable, then a comma. - for (string::iterator iter = sect.begin() + 2; iter != sect.end(); ++iter) - { - if (*iter == ' ' || *iter == '\t') - ; - else if (is_iter == 0 && lastchar == '$' && isdigit(*iter)) - is_iter = 1; - else if (is_iter == 1 && *iter == ',') - { - is_iter = 2; - break; - } - else if (*iter == '$') - ; - else - break; - lastchar = *iter; - } - if (is_iter == 2) - { - // CASE2: iteration - // Looks like: @[var,min,max:code|sep@] - // Replace known variables / additional arguments - replace_vars(sect, argc, argv, curvars); - - // get the parts! - string varname; - int varnum; - int expr_min; - int expr_max; - - // varname - size_t comma = sect.find(','); - if (comma == string::npos) - { - cout << "Invalid iteration syntax" << endl; - return 1; - } - varname.assign(sect.begin() + 2, sect.begin() + comma); - trim_string(varname); - if (varname.size() != 2 || varname[0] != '$' || !isdigit(varname[1])) - { - cout << "Invalid variable name" << endl; - return 1; - } - varnum = varname[1] - '0'; - - // min - ++comma; - size_t nextcomma = sect.find(',', comma); - if (nextcomma == string::npos) - { - cout << "Invalid iteration syntax" << endl; - return 1; - } - expr_min = parse_expr(sect.begin() + comma, sect.begin() + nextcomma); - - // max - comma = nextcomma + 1; - nextcomma = sect.find(':', comma); - if (nextcomma == string::npos) - { - cout << "Invalid iteration syntax" << endl; - return 1; - } - - expr_max = parse_expr(sect.begin() + comma, sect.begin() + nextcomma); - - // separator - size_t sepbegin = sect.find('|'); - size_t sepend = string::npos; - if (sepbegin != string::npos && sepbegin < nextcomma) - { - // There's a separator! - ++sepbegin; - sepend = nextcomma; - } - else - sepbegin = string::npos; - - - ++nextcomma; // nextcomma is now where code begins! - - size_t codeend = sect.size() - 2; - - // Check whether the var is already taken - if (curvars.find(varnum) != curvars.end()) - { - cout << "Variable $" << varnum << "already taken!" << endl; - return 1; - } - - // Do iterations!! - for (int i = expr_min; i <= expr_max; ++i) - { - curvars[varnum] = i; - - string code(sect.begin() + nextcomma, sect.begin() + codeend); - replace_vars(code, argc, argv, curvars); - - // Feed it through the input routine (RECURSE!!!!!! YEAH!) - do_input(argc, argv, outfile, code, curvars); - - // Add separator if required - if (sepbegin != string::npos && i != expr_max) - { - string tmp(sect.begin() + sepbegin, sect.begin() + sepend); - do_input(argc, argv, outfile, tmp, curvars); - } - } - // Remove the var! - curvars.erase(varnum); - } - else - { - // CASE3: conditional thing. - // Looks like: @[expr1 operator expr2:code@] - - // Find the operator position - - enum OP_TYPE - { - OP_EQ, - OP_NEQ - }; - - OP_TYPE op; - size_t oppos = sect.find("=="); - if (oppos != string::npos) - op = OP_EQ; - else - { - oppos = sect.find("!="); - if (oppos != string::npos) - op = OP_NEQ; - else - { - cout << "Conditional expression without operator!?" << endl; - return 1; - } - } - size_t colon = sect.find(':'); - - // Now we've got everything. Parse first expr: - int expr1 = parse_expr(sect.begin() + 2, sect.begin() + oppos); - int expr2 = parse_expr(sect.begin() + oppos + 2, sect.begin() + colon); - if ((op == OP_EQ && expr1 == expr2) || - (op == OP_NEQ && expr1 != expr2)) - { - // Condition is true, process it! - // The text may still contain arithmetic exprs or other cond. exprs - // so send it through do_input - string tmp(sect.substr(colon+1, sect.size() - colon - 3)); - do_input(argc, argv, outfile, tmp, curvars); - } - } - } - else - { - cout << "WTF" << endl; - return 1; - } - } - - return 0; -} - - - -// action_iter -// params: -// filenamein: input file name -// filenameout: output file name -// argc: number of additional arguments -// argv: additional arguments -// retval: 0 on success, non-zero on error - -// Convert additional arguments -// Read whole input file to memory and open output file -// Pass to do_input() -int action_iter(const char *filenamein, const char *filenameout, int argc, const char *argv[]) -{ - // Convert additional arguments - const int MAX_ARGC = 10; - int converted_argv[MAX_ARGC]; - - int i; - for (i = 0; i < argc && i < MAX_ARGC; ++i) - converted_argv[i] = atoi(argv[i]); - - if (argc != i) - cout << "WARNING: Not all additional arguments processed!" << endl; - - - // Read whole input file to memory and open output file - ifstream fin(filenamein); - ofstream fout(filenameout); - - if (!fin) - { - cout << "Could not open file \"" << filenamein << "\"." << endl; - return 1; - } - if (!fout) - { - cout << "Could not open file \"" << filenameout << "\"." << endl; - return 1; - } - string input_str( - istreambuf_iterator (fin.rdbuf()), - istreambuf_iterator ()); - - - // Begin processing input - varmap vars; - try - { - return do_input(argc, converted_argv, fout, input_str, vars); - } - catch (MyError err) - { - err.Print(); - return 1; - } -} - -// MAIN -// Prints usage if required -// Calls action_hopter OR action_iter -int main(int argc, const char **argv) -{ - if (argc < 4) - { - cout << "Usage:" << endl << " shworker [iter/hopter] ..." << endl; - cout << " shworker iter filename.in filename.out [param1, param2, ...]" << endl; - cout << " shworker hopter filename.in filename.out [num-of-args]" << endl; - return 1; - } - - const char *action = argv[1]; - - if (stricmp(action, "hopter") == 0) - { - const char *filenamein = argv[2]; - const char *filenameout = argv[3]; - int argsnum = atoi(argv[4]); - - return action_hopter(argsnum, filenamein, filenameout); - } - else if (stricmp(action, "iter") == 0) - { - const char *filenamein = argv[2]; - const char *filenameout = argv[3]; - int additional_argc = argc - 4; - const char ** additional_argv = argv + 4; - return action_iter(filenamein, filenameout, additional_argc, additional_argv); - } - else - { - cout << "Unrecognized action: " << argv[1] << endl; - return 1; - } -} diff --git a/sourcehook/generate/sourcehook.h b/sourcehook/generate/sourcehook.h deleted file mode 100644 index 49e6813..0000000 --- a/sourcehook/generate/sourcehook.h +++ /dev/null @@ -1,6104 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** -* @file sourcehook.h -* @brief Contains the public SourceHook API -*/ - -#ifndef __SOURCEHOOK_H__ -#define __SOURCEHOOK_H__ - -// Interface revisions: -// 1 - Initial revision -// 2 - Changed to virtual functions for iterators and all queries -// 3 - Added "hook loop status variable" -// 4 - Reentrant -#define SH_IFACE_VERSION 4 -#define SH_IMPL_VERSION 3 - -// Hookman version: -// 1 - Support for recalls, performance optimisations -#define SH_HOOKMAN_VERSION 1 - -// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook -// It's used in various macros -#ifndef SH_GLOB_SHPTR -#define SH_GLOB_SHPTR g_SHPtr -#endif - -// Used to identify the current plugin -#ifndef SH_GLOB_PLUGPTR -#define SH_GLOB_PLUGPTR g_PLID -#endif - -#ifdef SH_DEBUG -# include -# include - -# define SH_ASSERT(x, info) \ - do { \ - if (!(x)) \ - { \ - printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ - printf info; \ - putchar('\n'); \ - abort(); \ - } \ - } while(0) - -#else -# define SH_ASSERT(x, info) -#endif - -// System -#define SH_SYS_WIN32 1 -#define SH_SYS_LINUX 2 - -#ifdef _WIN32 -# define SH_SYS SH_SYS_WIN32 -#elif defined __linux__ -# define SH_SYS SH_SYS_LINUX -#else -# error Unsupported system -#endif - -// Compiler -#define SH_COMP_GCC 1 -#define SH_COMP_MSVC 2 - -#ifdef _MSC_VER -# define SH_COMP SH_COMP_MSVC -#elif defined __GNUC__ -# define SH_COMP SH_COMP_GCC -#else -# error Unsupported compiler -#endif - -#if SH_COMP==SH_COMP_MSVC -# define vsnprintf _vsnprintf -#endif - -#if SH_SYS != SH_SYS_WIN32 -# include -#endif - -#define SH_PTRSIZE sizeof(void*) - -#include "FastDelegate.h" -#include "sh_memfuncinfo.h" - -// Good old metamod! - -// Flags returned by a plugin's api function. -// NOTE: order is crucial, as greater/less comparisons are made. -enum META_RES -{ - MRES_IGNORED=0, // plugin didn't take any action - MRES_HANDLED, // plugin did something, but real function should still be called - MRES_OVERRIDE, // call real function, but use my return value - MRES_SUPERCEDE // skip real function; use my return value -}; - - -namespace SourceHook -{ - /** - * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers - */ - const int STRBUF_LEN=4096; - - /** - * @brief An empty class. No inheritance used. Used for original-function-call hacks - */ - class EmptyClass - { - }; - - /** - * @brief Implicit cast. - */ - template - inline Out implicit_cast(In input) - { - return input; - } - - /** - * @brief A plugin typedef - * - * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every - * plugin has a unique identifier, everything is ok. - * It should also be possible to set it to 0. - */ - typedef int Plugin; - - struct ProtoInfo - { - ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) - { - } - int beginningNull; //!< To distinguish from old protos (which never begin with 0) - int retTypeSize; //!< 0 if void - int numOfParams; //!< number of parameters - const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... - }; - - /** - * @brief Specifies the actions for hook managers - */ - enum HookManagerAction - { - HA_GetInfo = 0, //!< Store info about the hook manager - HA_Register, //!< Save the IHookManagerInfo pointer for future reference - HA_Unregister //!< Clear the saved pointer - }; - - struct IHookManagerInfo; - - /** - * @brief Pointer to hook manager interface function - * - * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. - * - * @param ha What the hook manager should do - * @param hi A pointer to IHookManagerInfo - */ - typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); - - class ISHDelegate - { - public: - virtual void DeleteThis() = 0; // Ugly, I know - virtual bool IsEqual(ISHDelegate *other) = 0; - }; - - template class CSHDelegate : public ISHDelegate - { - T m_Deleg; - public: - CSHDelegate(T deleg) : m_Deleg(deleg) - { - } - - CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) - { - } - - void DeleteThis() - { - delete this; - } - - bool IsEqual(ISHDelegate *other) - { - return static_cast* >(other)->GetDeleg() == GetDeleg(); - } - - T &GetDeleg() - { - return m_Deleg; - } - }; - - struct IHookList - { - struct IIter - { - virtual bool End() = 0; - virtual void Next() = 0; - virtual ISHDelegate *Handler() = 0; - virtual int ThisPtrOffs() = 0; - }; - virtual IIter *GetIter() = 0; - virtual void ReleaseIter(IIter *pIter) = 0; - }; - - struct IIface - { - virtual void *GetPtr() = 0; - virtual IHookList *GetPreHooks() = 0; - virtual IHookList *GetPostHooks() = 0; - }; - - struct IVfnPtr - { - virtual void *GetVfnPtr() = 0; - virtual void *GetOrigEntry() = 0; - - virtual IIface *FindIface(void *ptr) = 0; - }; - - struct IHookManagerInfo - { - virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; - - virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; - virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; - - // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) - // If the hookman doesn't set this, it defaults 0 - // SourceHook prefers hookmans with higher version numbers - virtual void SetVersion(int version) = 0; - }; - - class AutoHookIter - { - IHookList *m_pList; - IHookList::IIter *m_pIter; - public: - AutoHookIter(IHookList *pList) - : m_pList(pList), m_pIter(pList->GetIter()) - { - } - - ~AutoHookIter() - { - if (m_pList) - m_pList->ReleaseIter(m_pIter); - } - - bool End() - { - return m_pIter->End(); - } - - void Next() - { - m_pIter->Next(); - } - - ISHDelegate *Handler() - { - return m_pIter->Handler(); - } - - int ThisPtrOffs() - { - return m_pIter->ThisPtrOffs(); - } - - void SetToZero() - { - m_pList = 0; - } - }; - - template struct CallClass - { - virtual B *GetThisPtr() = 0; - virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; - }; - - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) - // - Today is an important day. - // I'm adding support for functions which return references. - - // How it works: - // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, - // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type - // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class - // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. - // special cases were needed for getoverrideret / getorigret; these are implemented through the - // SourceHook::MacroRefHelpers structs. - // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. - template struct ReferenceCarrier - { - typedef T type; - }; - - template struct ReferenceCarrier - { - class type - { - T *m_StoredRef; - public: - type() : m_StoredRef(NULL) - { - } - type(T& ref) : m_StoredRef(&ref) - { - } - - T& operator= (T& ref) - { - m_StoredRef = &ref; - return ref; - } - - operator T& () const - { - return *m_StoredRef; - } - }; - }; - - /** - * @brief The main SourceHook interface - */ - class ISourceHook - { - public: - /** - * @brief Return interface version - */ - virtual int GetIfaceVersion() = 0; - - /** - * @brief Return implementation version - */ - virtual int GetImplVersion() = 0; - - /** - * @brief Add a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Removes a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins - * - * @param plug The unique identifier of the plugin in question - */ - virtual bool IsPluginInUse(Plugin plug) = 0; - - /** - * @brief Return a pointer to a callclass. Generate a new one if required. - * - * @param iface The interface pointer - * @param size Size of the class instance - */ - virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; - - /** - * @brief Release a callclass - * - * @param ptr Pointer to the callclass - */ - virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; - - virtual void SetRes(META_RES res) = 0; //!< Sets the meta result - virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the - //!< previously calledhandler - virtual META_RES GetStatus() = 0; //!< Gets the highest meta result - virtual const void *GetOrigRet() = 0; //!< Gets the original result. - //!< If not in post function, undefined - virtual const void *GetOverrideRet() = 0; //!< Gets the override result. - //!< If none is specified, NULL - virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer - ////////////////////////////////////////////////////////////////////////// - // For hook managers - virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins - virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits - virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result - virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result - virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable - virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer - virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer - virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer - virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit - - /** - * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. - * - * @param plug The owner of the hook manager - * @param pubFunc The hook manager's info function - */ - virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; - - virtual void DoRecall() = 0; //!< Initiates a recall sequence - /* - HOW RECALLS WORK: - - The problem: - Users want the ability to change parameters of the called function - from inside their handler. - The solution: - 1) Mark as "recall" - 2) Recall the function - 3) => SH's hook func gets called: - 4) The first iterator points at the first hook the last hookfunc didn't execute yet - 5) does all iteration and returns normally - 6) The user's handler returns immediately - 7) The hook func returns immediately as well - - Also note that the recalled hookfunc starts with the status the recalling hookfunc - ended with. The last handler (doing the recall) is also able to specify its own - META_RES. - */ - - virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr - - /** - * @brief Set up the hook loop. Equivalent to calling: - * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr - * - * @param statusPtr pointer to status variable - * @param prevResPtr pointer to previous result variable - * @param curResPtr pointer to current result variable - * @param ifacePtrPtr pointer to interface this pointer variable - * @param origRetPr pointer to original return value variable. NULL for void funcs - * @param overrideRetPtr pointer to override return value variable. NULL for void funcs - * - * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr - * when the hook func is being called as part of a recall - */ - virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - - //!< - }; - - // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: - // These have to be able to return references. If T is a reference, the pointers returned - // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. - template struct MacroRefHelpers - { - inline static const T* GetOrigRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOrigRet()); - } - inline static const T* GetOverrideRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOverrideRet()); - } - }; - - template struct MacroRefHelpers - { - inline static T* GetOrigRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); - return &ref; - } - inline static T* GetOverrideRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); - return &ref; - } - }; -} - -/************************************************************************/ -/* High level interface */ -/************************************************************************/ -#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() -#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() -#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) -#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) -#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) - -#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) -#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) -#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) - -// If a hook on a function which returns a reference does not want to specify a return value, -// it can use this macro. -// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) - -// only call these from the hook handlers directly! -// :TODO: enforce it ? - -// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? -// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE - -// SourceHook::SetOverrideRet is defined later. -#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* meh, set the override result here because we don't get a chance to return */ \ - /* before continuing the hook loop through the recall */ \ - SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ - } \ - RETURN_META_VALUE(MRES_SUPERCEDE, \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ - } while (0) - -// :TODO: thisptroffs in MNEWPARAMS ?? - -#if SH_COMP == SH_COMP_MSVC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - void *addr; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; - -#elif SH_COMP == SH_COMP_GCC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ - u.s.adjustor = 0; - -#endif - -#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - (thisptr->*(u.mfp)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* see RETURN_META_VALUE_NEWPARAMS */ \ - SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ - } \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ - } while (0) - -/** -* @brief Get/generate callclass for an interface pointer -* -* @param ifaceptr The interface pointer -*/ -template -inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); -} - -template -inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); -} - -template -inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) -{ - shptr->ReleaseCallClass(reinterpret_cast(ptr)); -} - -#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ - do { \ - SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ - SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ - SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ - SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ - } while (0) - -#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) -#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) -#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) - -#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - -#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - - -#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - -#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - - -#define SH_NOATTRIB - - - - -#if SH_COMP == SH_COMP_MSVC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; -#elif SH_COMP == SH_COMP_GCC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ - reinterpret_cast(&mfp)[1] = 0; -#else -# error Not supported yet. -#endif - -////////////////////////////////////////////////////////////////////////// -#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov -#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname - -#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ - SH_FHCls(ifacetype,ifacefunc,overload)() \ - { \ - GetFuncInfo(funcptr, ms_MFI); \ - } \ - \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - GetFuncInfo(funcptr, ms_MFI); \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -// It has to be possible to use the macros in namespaces -// -> So we need to access and extend the global SourceHook namespace -// We use a namespace alias for this -#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ - struct SH_FHCls(ifacetype,ifacefunc,overload) \ - { \ - static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) - -#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ - }; \ - SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0) \ - return false; /* No virtual inheritance supported */ \ - \ - CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ - } \ - -#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - struct SH_MFHCls(hookname) \ - { \ - static SH_MFHCls(hookname) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - \ - SH_MFHCls(hookname)() \ - { \ - ms_MFI.isVirtual = true; \ - ms_MFI.thisptroffs = pthisptroffs; \ - ms_MFI.vtblindex = pvtblidx; \ - ms_MFI.vtbloffs = pvtbloffs; \ - } \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ - /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ - /* which is construced before SH_MFHCls(hookname)() gets called? */ \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - }; \ - SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - ::SourceHook::CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ - } \ - - -#define SH_SETUPCALLS(rettype, paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - return (reinterpret_cast(this)->*mfp)params; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - typedef ReferenceCarrier::type my_rettype; \ - my_rettype orig_ret; \ - my_rettype override_ret; \ - my_rettype plugin_ret; \ - void* ifptr; \ - my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ - &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); - -#define SH_CALL_HOOKS(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (cur_res >= MRES_OVERRIDE) \ - *pOverrideRet = plugin_ret; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG(rettype, paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - orig_ret = (reinterpret_cast(this)->*mfp)params; \ - } \ - else \ - orig_ret = override_ret; \ - -#define SH_RETURN() \ - SH_GLOB_SHPTR->HookLoopEnd(); \ - return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; - -#define SH_HANDLEFUNC(paramtypes, params, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params) \ - SH_CALL_HOOKS(pre, params) \ - SH_CALL_ORIG(rettype, paramtypes, params) \ - SH_CALL_HOOKS(post, params) \ - SH_RETURN() - -////////////////////////////////////////////////////////////////////////// -#define SH_SETUPCALLS_void(paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - return; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - void* ifptr; \ - SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ - -#define SH_CALL_HOOKS_void(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG_void(paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - } - -#define SH_RETURN_void() \ - SH_GLOB_SHPTR->HookLoopEnd(); - -#define SH_HANDLEFUNC_void(paramtypes, params) \ - SH_SETUPCALLS_void(paramtypes, params) \ - SH_CALL_HOOKS_void(pre, params) \ - SH_CALL_ORIG_void(paramtypes, params) \ - SH_CALL_HOOKS_void(post, params) \ - SH_RETURN_void() - - -// Special vafmt handlers -// :TODO: what -#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(pre, params_plug) \ - SH_CALL_ORIG(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(post, params_plug) \ - SH_RETURN() - -#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ - SH_SETUPCALLS_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(pre, params_plug) \ - SH_CALL_ORIG_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(post, params_plug) \ - SH_RETURN_void() - -////////////////////////////////////////////////////////////////////////// - -// :FIXME: -// sizeof on references returns the size of the datatype, NOT the pointer size or something -// -> one should probably flag references in __SourceHook_ParamSizes_* ! -// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template - - -// ********* Support for 0 arguments ********* -#define SH_DECL_HOOK0(ifacetype, ifacefunc, attr, overload, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate0 FD; \ - virtual rettype Func() \ - { SH_HANDLEFUNC((), (), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_void(ifacetype, ifacefunc, attr, overload) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate0<> FD; \ - virtual void Func() \ - { SH_HANDLEFUNC_void((), ()); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_vafmt(ifacetype, ifacefunc, attr, overload, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((...), ("%s", buf), (buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_void_vafmt(ifacetype, ifacefunc, attr, overload) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((...), ("%s", buf), (buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK0(hookname, vtblidx, vtbloffs, thisptroffs, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate0 FD; \ - virtual rettype Func() \ - { SH_HANDLEFUNC((), (), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK0_void(hookname, vtblidx, vtbloffs, thisptroffs) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate0<> FD; \ - virtual void Func() \ - { SH_HANDLEFUNC_void((), ()); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 0, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 1 arguments ********* -#define SH_DECL_HOOK1(ifacetype, ifacefunc, attr, overload, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(param1 p1) \ - { SH_HANDLEFUNC((param1), (p1), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_void(ifacetype, ifacefunc, attr, overload, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(param1 p1) \ - { SH_HANDLEFUNC_void((param1), (p1)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, ...), (p1, "%s", buf), (p1, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_void_vafmt(ifacetype, ifacefunc, attr, overload, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, ...), (p1, "%s", buf), (p1, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK1(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(param1 p1) \ - { SH_HANDLEFUNC((param1), (p1), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK1_void(hookname, vtblidx, vtbloffs, thisptroffs, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(param1 p1) \ - { SH_HANDLEFUNC_void((param1), (p1)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 1, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 2 arguments ********* -#define SH_DECL_HOOK2(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_void(ifacetype, ifacefunc, attr, overload, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK2(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK2_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 2, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 3 arguments ********* -#define SH_DECL_HOOK3(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK3(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK3_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 3, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 4 arguments ********* -#define SH_DECL_HOOK4(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK4(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK4_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 4, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 5 arguments ********* -#define SH_DECL_HOOK5(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK5(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK5_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 5, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 6 arguments ********* -#define SH_DECL_HOOK6(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK6(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK6_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 6, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 7 arguments ********* -#define SH_DECL_HOOK7(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK7(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK7_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 7, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 8 arguments ********* -#define SH_DECL_HOOK8(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK8(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK8_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 8, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 9 arguments ********* -#define SH_DECL_HOOK9(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK9(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK9_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 9, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 10 arguments ********* -#define SH_DECL_HOOK10(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK10(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK10_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 10, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 11 arguments ********* -#define SH_DECL_HOOK11(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK11(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK11_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 11, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 12 arguments ********* -#define SH_DECL_HOOK12(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK12(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK12_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 12, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 13 arguments ********* -#define SH_DECL_HOOK13(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK13(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK13_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 13, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 14 arguments ********* -#define SH_DECL_HOOK14(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK14(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK14_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 14, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 15 arguments ********* -#define SH_DECL_HOOK15(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK15(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK15_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 15, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 16 arguments ********* -#define SH_DECL_HOOK16(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK16(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK16_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 16, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 17 arguments ********* -#define SH_DECL_HOOK17(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK17(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK17_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 17, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 18 arguments ********* -#define SH_DECL_HOOK18(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK18(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK18_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 18, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 19 arguments ********* -#define SH_DECL_HOOK19(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK19(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK19_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 19, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 20 arguments ********* -#define SH_DECL_HOOK20(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate21 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate21 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK20(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK20_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 20, __SourceHook_ParamSizesM_##hookname); \ - - - - -////////////////////////////////////////////////////////////////////////// -// SH_CALL - -#if SH_COMP == SH_COMP_MSVC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = origfunc; \ - \ - void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.addr) \ - u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ - \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ -} - -#elif SH_COMP == SH_COMP_GCC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = origfunc; \ - u.s.adjustor = mfi.thisptroffs; \ - \ - return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.s.addr) \ - u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ - \ - u.s.adjustor = m_ThisPtrOffs; \ - return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ -} - -#endif - -namespace SourceHook -{ - - // Support for 0 arguments - template class ExecutableClass0 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass0(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()() const - SH_MAKE_EXECUTABLECLASS_OB((), ()) - - - template RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass0 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass0(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()() const - SH_MAKE_MEXECUTABLECLASS_OB((), ()) - - - template RetType operator()(Param1 p1) const - SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 1 arguments - template class ExecutableClass1 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass1 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1) const - SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) - - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 2 arguments - template class ExecutableClass2 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass2(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass2 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass2(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 3 arguments - template class ExecutableClass3 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass3(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass3 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass3(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 4 arguments - template class ExecutableClass4 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass4(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass4 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass4(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 5 arguments - template class ExecutableClass5 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass5(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass5 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass5(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 6 arguments - template class ExecutableClass6 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass6(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass6 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass6(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 7 arguments - template class ExecutableClass7 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass7(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass7 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass7(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 8 arguments - template class ExecutableClass8 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass8(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass8 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass8(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 9 arguments - template class ExecutableClass9 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass9(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass9 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass9(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 10 arguments - template class ExecutableClass10 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass10(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass10 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass10(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 11 arguments - template class ExecutableClass11 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass11(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass11 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass11(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 12 arguments - template class ExecutableClass12 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass12(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass12 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass12(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 13 arguments - template class ExecutableClass13 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass13(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass13 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass13(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 14 arguments - template class ExecutableClass14 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass14(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass14 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass14(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 15 arguments - template class ExecutableClass15 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass15(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass15 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass15(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 16 arguments - template class ExecutableClass16 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass16(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass16 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass16(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 17 arguments - template class ExecutableClass17 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass17(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass17 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass17(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 18 arguments - template class ExecutableClass18 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass18(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass18 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass18(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 19 arguments - template class ExecutableClass19 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass19(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass19 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass19(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 20 arguments - template class ExecutableClass20 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass20(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - - }; - - template class MExecutableClass20 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass20(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - - }; - - -} - -// SH_CALL needs to deduce the return type -> it uses templates and function overloading -// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP -// The only purpose of the mfp2 parameter is to extract the return type - - -// Support for 0 arguments -template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()) -{ - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); -} - -template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()const) -{ - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); -} - -template -SourceHook::MExecutableClass0 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass0(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 1 arguments -template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)) -{ - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); -} - -template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const) -{ - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); -} - -template -SourceHook::MExecutableClass1 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass1(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 2 arguments -template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)) -{ - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); -} - -template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const) -{ - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); -} - -template -SourceHook::MExecutableClass2 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass2(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 3 arguments -template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)) -{ - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); -} - -template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const) -{ - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); -} - -template -SourceHook::MExecutableClass3 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass3(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 4 arguments -template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)) -{ - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); -} - -template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const) -{ - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); -} - -template -SourceHook::MExecutableClass4 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass4(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 5 arguments -template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)) -{ - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); -} - -template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const) -{ - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); -} - -template -SourceHook::MExecutableClass5 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass5(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 6 arguments -template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)) -{ - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); -} - -template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const) -{ - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); -} - -template -SourceHook::MExecutableClass6 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass6(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 7 arguments -template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) -{ - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); -} - -template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const) -{ - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); -} - -template -SourceHook::MExecutableClass7 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass7(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 8 arguments -template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) -{ - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); -} - -template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const) -{ - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); -} - -template -SourceHook::MExecutableClass8 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass8(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 9 arguments -template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) -{ - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); -} - -template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const) -{ - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); -} - -template -SourceHook::MExecutableClass9 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass9(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 10 arguments -template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) -{ - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); -} - -template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const) -{ - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); -} - -template -SourceHook::MExecutableClass10 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass10(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 11 arguments -template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) -{ - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); -} - -template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const) -{ - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); -} - -template -SourceHook::MExecutableClass11 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass11(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 12 arguments -template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) -{ - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); -} - -template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const) -{ - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); -} - -template -SourceHook::MExecutableClass12 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass12(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 13 arguments -template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) -{ - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); -} - -template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const) -{ - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); -} - -template -SourceHook::MExecutableClass13 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass13(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 14 arguments -template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) -{ - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); -} - -template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const) -{ - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); -} - -template -SourceHook::MExecutableClass14 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass14(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 15 arguments -template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) -{ - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); -} - -template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const) -{ - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); -} - -template -SourceHook::MExecutableClass15 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass15(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 16 arguments -template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) -{ - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); -} - -template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const) -{ - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); -} - -template -SourceHook::MExecutableClass16 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass16(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 17 arguments -template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) -{ - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); -} - -template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const) -{ - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); -} - -template -SourceHook::MExecutableClass17 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass17(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 18 arguments -template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) -{ - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); -} - -template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const) -{ - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); -} - -template -SourceHook::MExecutableClass18 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass18(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 19 arguments -template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) -{ - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); -} - -template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const) -{ - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); -} - -template -SourceHook::MExecutableClass19 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass19(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 20 arguments -template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) -{ - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); -} - -template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const) -{ - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); -} - -template -SourceHook::MExecutableClass20 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass20(ptr, vtbloffs, vtblidx, thisptroffs); -} - - -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 -// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it - - -// Support for 0 arguments -template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)) -{ - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); -} - -template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)const) -{ - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); -} - - -// Support for 1 arguments -template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)) -{ - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); -} - -template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const) -{ - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); -} - - -// Support for 2 arguments -template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)) -{ - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); -} - -template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const) -{ - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); -} - - -// Support for 3 arguments -template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)) -{ - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); -} - -template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const) -{ - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); -} - - -// Support for 4 arguments -template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)) -{ - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); -} - -template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const) -{ - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); -} - - -// Support for 5 arguments -template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)) -{ - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); -} - -template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const) -{ - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); -} - - -// Support for 6 arguments -template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)) -{ - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); -} - -template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const) -{ - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); -} - - -// Support for 7 arguments -template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)) -{ - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); -} - -template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const) -{ - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); -} - - -// Support for 8 arguments -template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)) -{ - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); -} - -template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const) -{ - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); -} - - -// Support for 9 arguments -template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)) -{ - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); -} - -template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const) -{ - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); -} - - -// Support for 10 arguments -template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)) -{ - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); -} - -template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const) -{ - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); -} - - -// Support for 11 arguments -template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)) -{ - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); -} - -template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const) -{ - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); -} - - -// Support for 12 arguments -template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)) -{ - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); -} - -template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const) -{ - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); -} - - -// Support for 13 arguments -template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)) -{ - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); -} - -template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const) -{ - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); -} - - -// Support for 14 arguments -template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)) -{ - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); -} - -template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const) -{ - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); -} - - -// Support for 15 arguments -template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)) -{ - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); -} - -template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const) -{ - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); -} - - -// Support for 16 arguments -template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)) -{ - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); -} - -template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const) -{ - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); -} - - -// Support for 17 arguments -template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)) -{ - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); -} - -template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const) -{ - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); -} - - -// Support for 18 arguments -template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)) -{ - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); -} - -template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const) -{ - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); -} - - -// Support for 19 arguments -template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)) -{ - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); -} - -template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const) -{ - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); -} - - -// Support for 20 arguments -template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)) -{ - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); -} - -template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const) -{ - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); -} - - - -#endif - -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) -#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ - SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) - -#undef SH_MAKE_EXECUTABLECLASS_OB - -////////////////////////////////////////////////////////////////////////// -// SetOverrideRet and RecallGetIface for recalls -// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly -// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros -// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. - -namespace SourceHook -{ - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - - // SetOverrideResult used to be implemented like this: - // SetOverrideResult(shptr, memfuncptr, return); - // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference - // (it thought it was ambigous - the ref and non-ref type) - // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work - // new syntax: SetOverrideResult(memfuncptr)(shptr, return) - // This also allows us to create a special version for references which respects ReferenceCarrier. - - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - }; - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T &res) - { - // overrideretptr points to ReferenceCarrier - *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; - } - }; - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)()) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)()) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - -} - -#endif - // The pope is dead. -> :( diff --git a/sourcehook/generate/sourcehook.hxx b/sourcehook/generate/sourcehook.hxx deleted file mode 100755 index 1431c12..0000000 --- a/sourcehook/generate/sourcehook.hxx +++ /dev/null @@ -1,1370 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** -* @file sourcehook.h -* @brief Contains the public SourceHook API -*/ - -#ifndef __SOURCEHOOK_H__ -#define __SOURCEHOOK_H__ - -// Interface revisions: -// 1 - Initial revision -// 2 - Changed to virtual functions for iterators and all queries -// 3 - Added "hook loop status variable" -// 4 - Reentrant -#define SH_IFACE_VERSION 4 -#define SH_IMPL_VERSION 3 - -// Hookman version: -// 1 - Support for recalls, performance optimisations -#define SH_HOOKMAN_VERSION 1 - -// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook -// It's used in various macros -#ifndef SH_GLOB_SHPTR -#define SH_GLOB_SHPTR g_SHPtr -#endif - -// Used to identify the current plugin -#ifndef SH_GLOB_PLUGPTR -#define SH_GLOB_PLUGPTR g_PLID -#endif - -#ifdef SH_DEBUG -# include -# include - -# define SH_ASSERT(x, info) \ - do { \ - if (!(x)) \ - { \ - printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ - printf info; \ - putchar('\n'); \ - abort(); \ - } \ - } while(0) - -#else -# define SH_ASSERT(x, info) -#endif - -// System -#define SH_SYS_WIN32 1 -#define SH_SYS_LINUX 2 - -#ifdef _WIN32 -# define SH_SYS SH_SYS_WIN32 -#elif defined __linux__ -# define SH_SYS SH_SYS_LINUX -#else -# error Unsupported system -#endif - -// Compiler -#define SH_COMP_GCC 1 -#define SH_COMP_MSVC 2 - -#ifdef _MSC_VER -# define SH_COMP SH_COMP_MSVC -#elif defined __GNUC__ -# define SH_COMP SH_COMP_GCC -#else -# error Unsupported compiler -#endif - -#if SH_COMP==SH_COMP_MSVC -# define vsnprintf _vsnprintf -#endif - -#if SH_SYS != SH_SYS_WIN32 -# include -#endif - -#define SH_PTRSIZE sizeof(void*) - -#include "FastDelegate.h" -#include "sh_memfuncinfo.h" - -// Good old metamod! - -// Flags returned by a plugin's api function. -// NOTE: order is crucial, as greater/less comparisons are made. -enum META_RES -{ - MRES_IGNORED=0, // plugin didn't take any action - MRES_HANDLED, // plugin did something, but real function should still be called - MRES_OVERRIDE, // call real function, but use my return value - MRES_SUPERCEDE // skip real function; use my return value -}; - - -namespace SourceHook -{ - /** - * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers - */ - const int STRBUF_LEN=4096; - - /** - * @brief An empty class. No inheritance used. Used for original-function-call hacks - */ - class EmptyClass - { - }; - - /** - * @brief Implicit cast. - */ - template - inline Out implicit_cast(In input) - { - return input; - } - - /** - * @brief A plugin typedef - * - * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every - * plugin has a unique identifier, everything is ok. - * It should also be possible to set it to 0. - */ - typedef int Plugin; - - struct ProtoInfo - { - ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) - { - } - int beginningNull; //!< To distinguish from old protos (which never begin with 0) - int retTypeSize; //!< 0 if void - int numOfParams; //!< number of parameters - const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... - }; - - /** - * @brief Specifies the actions for hook managers - */ - enum HookManagerAction - { - HA_GetInfo = 0, //!< Store info about the hook manager - HA_Register, //!< Save the IHookManagerInfo pointer for future reference - HA_Unregister //!< Clear the saved pointer - }; - - struct IHookManagerInfo; - - /** - * @brief Pointer to hook manager interface function - * - * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. - * - * @param ha What the hook manager should do - * @param hi A pointer to IHookManagerInfo - */ - typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); - - class ISHDelegate - { - public: - virtual void DeleteThis() = 0; // Ugly, I know - virtual bool IsEqual(ISHDelegate *other) = 0; - }; - - template class CSHDelegate : public ISHDelegate - { - T m_Deleg; - public: - CSHDelegate(T deleg) : m_Deleg(deleg) - { - } - - CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) - { - } - - void DeleteThis() - { - delete this; - } - - bool IsEqual(ISHDelegate *other) - { - return static_cast* >(other)->GetDeleg() == GetDeleg(); - } - - T &GetDeleg() - { - return m_Deleg; - } - }; - - struct IHookList - { - struct IIter - { - virtual bool End() = 0; - virtual void Next() = 0; - virtual ISHDelegate *Handler() = 0; - virtual int ThisPtrOffs() = 0; - }; - virtual IIter *GetIter() = 0; - virtual void ReleaseIter(IIter *pIter) = 0; - }; - - struct IIface - { - virtual void *GetPtr() = 0; - virtual IHookList *GetPreHooks() = 0; - virtual IHookList *GetPostHooks() = 0; - }; - - struct IVfnPtr - { - virtual void *GetVfnPtr() = 0; - virtual void *GetOrigEntry() = 0; - - virtual IIface *FindIface(void *ptr) = 0; - }; - - struct IHookManagerInfo - { - virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; - - virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; - virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; - - // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) - // If the hookman doesn't set this, it defaults 0 - // SourceHook prefers hookmans with higher version numbers - virtual void SetVersion(int version) = 0; - }; - - class AutoHookIter - { - IHookList *m_pList; - IHookList::IIter *m_pIter; - public: - AutoHookIter(IHookList *pList) - : m_pList(pList), m_pIter(pList->GetIter()) - { - } - - ~AutoHookIter() - { - if (m_pList) - m_pList->ReleaseIter(m_pIter); - } - - bool End() - { - return m_pIter->End(); - } - - void Next() - { - m_pIter->Next(); - } - - ISHDelegate *Handler() - { - return m_pIter->Handler(); - } - - int ThisPtrOffs() - { - return m_pIter->ThisPtrOffs(); - } - - void SetToZero() - { - m_pList = 0; - } - }; - - template struct CallClass - { - virtual B *GetThisPtr() = 0; - virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; - }; - - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) - // - Today is an important day. - // I'm adding support for functions which return references. - - // How it works: - // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, - // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type - // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class - // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. - // special cases were needed for getoverrideret / getorigret; these are implemented through the - // SourceHook::MacroRefHelpers structs. - // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. - template struct ReferenceCarrier - { - typedef T type; - }; - - template struct ReferenceCarrier - { - class type - { - T *m_StoredRef; - public: - type() : m_StoredRef(NULL) - { - } - type(T& ref) : m_StoredRef(&ref) - { - } - - T& operator= (T& ref) - { - m_StoredRef = &ref; - return ref; - } - - operator T& () const - { - return *m_StoredRef; - } - }; - }; - - /** - * @brief The main SourceHook interface - */ - class ISourceHook - { - public: - /** - * @brief Return interface version - */ - virtual int GetIfaceVersion() = 0; - - /** - * @brief Return implementation version - */ - virtual int GetImplVersion() = 0; - - /** - * @brief Add a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Removes a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins - * - * @param plug The unique identifier of the plugin in question - */ - virtual bool IsPluginInUse(Plugin plug) = 0; - - /** - * @brief Return a pointer to a callclass. Generate a new one if required. - * - * @param iface The interface pointer - * @param size Size of the class instance - */ - virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; - - /** - * @brief Release a callclass - * - * @param ptr Pointer to the callclass - */ - virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; - - virtual void SetRes(META_RES res) = 0; //!< Sets the meta result - virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the - //!< previously calledhandler - virtual META_RES GetStatus() = 0; //!< Gets the highest meta result - virtual const void *GetOrigRet() = 0; //!< Gets the original result. - //!< If not in post function, undefined - virtual const void *GetOverrideRet() = 0; //!< Gets the override result. - //!< If none is specified, NULL - virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer - ////////////////////////////////////////////////////////////////////////// - // For hook managers - virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins - virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits - virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result - virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result - virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable - virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer - virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer - virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer - virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit - - /** - * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. - * - * @param plug The owner of the hook manager - * @param pubFunc The hook manager's info function - */ - virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; - - virtual void DoRecall() = 0; //!< Initiates a recall sequence - /* - HOW RECALLS WORK: - - The problem: - Users want the ability to change parameters of the called function - from inside their handler. - The solution: - 1) Mark as "recall" - 2) Recall the function - 3) => SH's hook func gets called: - 4) The first iterator points at the first hook the last hookfunc didn't execute yet - 5) does all iteration and returns normally - 6) The user's handler returns immediately - 7) The hook func returns immediately as well - - Also note that the recalled hookfunc starts with the status the recalling hookfunc - ended with. The last handler (doing the recall) is also able to specify its own - META_RES. - */ - - virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr - - /** - * @brief Set up the hook loop. Equivalent to calling: - * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr - * - * @param statusPtr pointer to status variable - * @param prevResPtr pointer to previous result variable - * @param curResPtr pointer to current result variable - * @param ifacePtrPtr pointer to interface this pointer variable - * @param origRetPr pointer to original return value variable. NULL for void funcs - * @param overrideRetPtr pointer to override return value variable. NULL for void funcs - * - * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr - * when the hook func is being called as part of a recall - */ - virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - - //!< - }; - - // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: - // These have to be able to return references. If T is a reference, the pointers returned - // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. - template struct MacroRefHelpers - { - inline static const T* GetOrigRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOrigRet()); - } - inline static const T* GetOverrideRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOverrideRet()); - } - }; - - template struct MacroRefHelpers - { - inline static T* GetOrigRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); - return &ref; - } - inline static T* GetOverrideRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); - return &ref; - } - }; -} - -/************************************************************************/ -/* High level interface */ -/************************************************************************/ -#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() -#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() -#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) -#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) -#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) - -#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) -#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) -#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) - -// If a hook on a function which returns a reference does not want to specify a return value, -// it can use this macro. -// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) - -// only call these from the hook handlers directly! -// :TODO: enforce it ? - -// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? -// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE - -// SourceHook::SetOverrideRet is defined later. -#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* meh, set the override result here because we don't get a chance to return */ \ - /* before continuing the hook loop through the recall */ \ - SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ - } \ - RETURN_META_VALUE(MRES_SUPERCEDE, \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ - } while (0) - -// :TODO: thisptroffs in MNEWPARAMS ?? - -#if SH_COMP == SH_COMP_MSVC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - void *addr; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; - -#elif SH_COMP == SH_COMP_GCC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ - u.s.adjustor = 0; - -#endif - -#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - (thisptr->*(u.mfp)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* see RETURN_META_VALUE_NEWPARAMS */ \ - SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ - } \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ - } while (0) - -/** -* @brief Get/generate callclass for an interface pointer -* -* @param ifaceptr The interface pointer -*/ -template -inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); -} - -template -inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); -} - -template -inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) -{ - shptr->ReleaseCallClass(reinterpret_cast(ptr)); -} - -#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ - do { \ - SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ - SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ - SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ - SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ - } while (0) - -#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) -#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) -#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) - -#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - -#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - - -#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - -#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - - -#define SH_NOATTRIB - - - - -#if SH_COMP == SH_COMP_MSVC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; -#elif SH_COMP == SH_COMP_GCC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ - reinterpret_cast(&mfp)[1] = 0; -#else -# error Not supported yet. -#endif - -////////////////////////////////////////////////////////////////////////// -#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov -#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname - -#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ - SH_FHCls(ifacetype,ifacefunc,overload)() \ - { \ - GetFuncInfo(funcptr, ms_MFI); \ - } \ - \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - GetFuncInfo(funcptr, ms_MFI); \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -// It has to be possible to use the macros in namespaces -// -> So we need to access and extend the global SourceHook namespace -// We use a namespace alias for this -#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ - struct SH_FHCls(ifacetype,ifacefunc,overload) \ - { \ - static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) - -#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ - }; \ - SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0) \ - return false; /* No virtual inheritance supported */ \ - \ - CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ - } \ - -#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - struct SH_MFHCls(hookname) \ - { \ - static SH_MFHCls(hookname) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - \ - SH_MFHCls(hookname)() \ - { \ - ms_MFI.isVirtual = true; \ - ms_MFI.thisptroffs = pthisptroffs; \ - ms_MFI.vtblindex = pvtblidx; \ - ms_MFI.vtbloffs = pvtbloffs; \ - } \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ - /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ - /* which is construced before SH_MFHCls(hookname)() gets called? */ \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - }; \ - SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - ::SourceHook::CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ - } \ - - -#define SH_SETUPCALLS(rettype, paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - return (reinterpret_cast(this)->*mfp)params; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - typedef ReferenceCarrier::type my_rettype; \ - my_rettype orig_ret; \ - my_rettype override_ret; \ - my_rettype plugin_ret; \ - void* ifptr; \ - my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ - &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); - -#define SH_CALL_HOOKS(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (cur_res >= MRES_OVERRIDE) \ - *pOverrideRet = plugin_ret; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG(rettype, paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - orig_ret = (reinterpret_cast(this)->*mfp)params; \ - } \ - else \ - orig_ret = override_ret; \ - -#define SH_RETURN() \ - SH_GLOB_SHPTR->HookLoopEnd(); \ - return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; - -#define SH_HANDLEFUNC(paramtypes, params, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params) \ - SH_CALL_HOOKS(pre, params) \ - SH_CALL_ORIG(rettype, paramtypes, params) \ - SH_CALL_HOOKS(post, params) \ - SH_RETURN() - -////////////////////////////////////////////////////////////////////////// -#define SH_SETUPCALLS_void(paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - return; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - void* ifptr; \ - SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ - -#define SH_CALL_HOOKS_void(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG_void(paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - } - -#define SH_RETURN_void() \ - SH_GLOB_SHPTR->HookLoopEnd(); - -#define SH_HANDLEFUNC_void(paramtypes, params) \ - SH_SETUPCALLS_void(paramtypes, params) \ - SH_CALL_HOOKS_void(pre, params) \ - SH_CALL_ORIG_void(paramtypes, params) \ - SH_CALL_HOOKS_void(post, params) \ - SH_RETURN_void() - - -// Special vafmt handlers -// :TODO: what -#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(pre, params_plug) \ - SH_CALL_ORIG(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(post, params_plug) \ - SH_RETURN() - -#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ - SH_SETUPCALLS_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(pre, params_plug) \ - SH_CALL_ORIG_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(post, params_plug) \ - SH_RETURN_void() - -////////////////////////////////////////////////////////////////////////// - -// :FIXME: -// sizeof on references returns the size of the datatype, NOT the pointer size or something -// -> one should probably flag references in __SourceHook_ParamSizes_* ! -// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template - -@[$1,0,$a: -// ********* Support for $1 arguments ********* -#define SH_DECL_HOOK$1(ifacetype, ifacefunc, attr, overload, rettype@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]@[$1!=0:, @]rettype> FD; \ - virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]) \ - { SH_HANDLEFUNC((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@]), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK$1_void(ifacetype, ifacefunc, attr, overload@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]> FD; \ - virtual void Func(@[$2,1,$1|, :param$2 p$2@]) \ - { SH_HANDLEFUNC_void((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@])); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK$1_vafmt(ifacetype, ifacefunc, attr, overload, rettype@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate@($1+1)<@[$2,1,$1|, :param$2@]@[$1!=0:, @]const char *, rettype> FD; \ - virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]@[$1!=0:, @]const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((@[$2,1,$1|, :param$2@]@[$1!=0:, @]...), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]"%s", buf), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK$1_void_vafmt(ifacetype, ifacefunc, attr, overload@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate@($1+1)<@[$2,1,$1|, :param$2@]@[$1!=0:, @]const char *> FD; \ - virtual void Func(@[$2,1,$1|, :param$2 p$2@]@[$1!=0:, @]const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((@[$2,1,$1|, :param$2@]@[$1!=0:, @]...), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]"%s", buf), (@[$2,1,$1|, :p$2@]@[$1!=0:, @]buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - $1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK$1(hookname, vtblidx, vtbloffs, thisptroffs, rettype@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]@[$1!=0:, @]rettype> FD; \ - virtual rettype Func(@[$2,1,$1|, :param$2 p$2@]) \ - { SH_HANDLEFUNC((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@]), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(@[$2,1,$1|, :param$2@]); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - $1, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK$1_void(hookname, vtblidx, vtbloffs, thisptroffs@[$2,1,$1:, param$2@]) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate$1<@[$2,1,$1|, :param$2@]> FD; \ - virtual void Func(@[$2,1,$1|, :param$2 p$2@]) \ - { SH_HANDLEFUNC_void((@[$2,1,$1|, :param$2@]), (@[$2,1,$1|, :p$2@])); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(@[$2,1,$1|, :param$2@]); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0@[$2,1,$1:, sizeof(param$2)@] }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - $1, __SourceHook_ParamSizesM_##hookname); \ - -@] - - -////////////////////////////////////////////////////////////////////////// -// SH_CALL - -#if SH_COMP == SH_COMP_MSVC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = origfunc; \ - \ - void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.addr) \ - u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ - \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ -} - -#elif SH_COMP == SH_COMP_GCC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = origfunc; \ - u.s.adjustor = mfi.thisptroffs; \ - \ - return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.s.addr) \ - u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ - \ - u.s.adjustor = m_ThisPtrOffs; \ - return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ -} - -#endif - -namespace SourceHook -{ -@[$1,0,$a: - // Support for $1 arguments - template class ExecutableClass$1 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass$1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(@[$2,1,$1|, :Param$2 p$2@]) const - SH_MAKE_EXECUTABLECLASS_OB((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) - - @[$2,$1+1,$a: - template <@[$3,$1+1,$2|, :class Param$3@]> RetType operator()(@[$3,1,$2|, :Param$3 p$3@]) const - SH_MAKE_EXECUTABLECLASS_OB((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) - @] - }; - - template class MExecutableClass$1 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass$1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(@[$2,1,$1|, :Param$2 p$2@]) const - SH_MAKE_MEXECUTABLECLASS_OB((@[$2,1,$1|, :p$2@]), (@[$2,1,$1|, :Param$2@])) - - @[$2,$1+1,$a: - template <@[$3,$1+1,$2|, :class Param$3@]> RetType operator()(@[$3,1,$2|, :Param$3 p$3@]) const - SH_MAKE_MEXECUTABLECLASS_OB((@[$3,1,$2|, :p$3@]), (@[$3,1,$2|, :Param$3@])) - @] - }; -@] - -} - -// SH_CALL needs to deduce the return type -> it uses templates and function overloading -// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP -// The only purpose of the mfp2 parameter is to extract the return type - -@[$1,0,$a: -// Support for $1 arguments -template -SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@])) -{ - return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); -} - -template -SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@])const) -{ - return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); -} - -template -SourceHook::MExecutableClass$1 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(@[$2,1,$1|, :Param$2@]), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass$1(ptr, vtbloffs, vtblidx, thisptroffs); -} -@] - -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 -// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it - -@[$1,0,$a: -// Support for $1 arguments -template -SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...)) -{ - return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); -} - -template -SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]...)const) -{ - return SourceHook::ExecutableClass$1, MFP, RetType@[$2,1,$1:, Param$2@]>(ptr, mfp); -} - -@] - -#endif - -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) -#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ - SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) - -#undef SH_MAKE_EXECUTABLECLASS_OB - -////////////////////////////////////////////////////////////////////////// -// SetOverrideRet and RecallGetIface for recalls -// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly -// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros -// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. - -namespace SourceHook -{ - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - - // SetOverrideResult used to be implemented like this: - // SetOverrideResult(shptr, memfuncptr, return); - // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference - // (it thought it was ambigous - the ref and non-ref type) - // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work - // new syntax: SetOverrideResult(memfuncptr)(shptr, return) - // This also allows us to create a special version for references which respects ReferenceCarrier. - - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - }; - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T &res) - { - // overrideretptr points to ReferenceCarrier - *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; - } - }; -@[$1,0,$a: - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(@[$2,1,$1|, :Param$2@])) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(@[$2,1,$1|, :Param$2@])) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } -@] -} - -#endif - // The pope is dead. -> :( diff --git a/sourcehook/sh_list.h b/sourcehook/sh_list.h deleted file mode 100644 index 12a56f2..0000000 --- a/sourcehook/sh_list.h +++ /dev/null @@ -1,291 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -#ifndef _INCLUDE_SMM_LIST_H -#define _INCLUDE_SMM_LIST_H - -#include -#include - -namespace SourceHook -{ - - //This class is from CSDM for AMX Mod X - /* - A circular, doubly-linked list with one sentinel node - - Empty: - m_Head = sentinel - m_Head->next = m_Head; - m_Head->prev = m_Head; - One element: - m_Head = sentinel - m_Head->next = node1 - m_Head->prev = node1 - node1->next = m_Head - node1->prev = m_Head - Two elements: - m_Head = sentinel - m_Head->next = node1 - m_Head->prev = node2 - node1->next = node2 - node1->prev = m_Head - node2->next = m_Head - node2->prev = node1 - */ - template - class List - { - public: - class iterator; - friend class iterator; - class ListNode - { - public: - ListNode(const T & o) : obj(o) { }; - ListNode() { }; - T obj; - ListNode *next; - ListNode *prev; - }; - private: - // Initializes the sentinel node. - // BAIL used malloc instead of new in order to bypass the need for a constructor. - ListNode *_Initialize() - { - ListNode *n = (ListNode *)malloc(sizeof(ListNode)); - n->next = n; - n->prev = n; - return n; - } - public: - List() : m_Head(_Initialize()), m_Size(0) - { - } - List(const List &src) : m_Head(_Initialize()), m_Size(0) - { - iterator iter; - for (iter=src.begin(); iter!=src.end(); iter++) - push_back( (*iter) ); - } - ~List() - { - clear(); - - // Don't forget to free the sentinel - if (m_Head) - { - free(m_Head); - m_Head = NULL; - } - } - void push_back(const T &obj) - { - ListNode *node = new ListNode(obj); - - node->prev = m_Head->prev; - node->next = m_Head; - m_Head->prev->next = node; - m_Head->prev = node; - - m_Size++; - } - size_t size() const - { - return m_Size; - } - - void clear() - { - ListNode *node = m_Head->next; - ListNode *temp; - m_Head->next = m_Head; - m_Head->prev = m_Head; - - // Iterate through the nodes until we find g_Head (the sentinel) again - while (node != m_Head) - { - temp = node->next; - delete node; - node = temp; - } - m_Size = 0; - } - bool empty() const - { - return (m_Size == 0); - } - T & back() - { - return m_Head->prev->obj; - } - private: - ListNode *m_Head; - size_t m_Size; - public: - class iterator - { - friend class List; - public: - iterator() - { - m_This = NULL; - } - iterator(const List &src) - { - m_This = src.m_Head; - } - iterator(ListNode *n) : m_This(n) - { - } - iterator(const iterator &where) - { - m_This = where.m_This; - } - //pre decrement - iterator & operator--() - { - if (m_This) - m_This = m_This->prev; - return *this; - } - //post decrement - iterator operator--(int) - { - iterator old(*this); - if (m_This) - m_This = m_This->prev; - return old; - } - - //pre increment - iterator & operator++() - { - if (m_This) - m_This = m_This->next; - return *this; - } - //post increment - iterator operator++(int) - { - iterator old(*this); - if (m_This) - m_This = m_This->next; - return old; - } - - const T & operator * () const - { - return m_This->obj; - } - T & operator * () - { - return m_This->obj; - } - - T * operator -> () - { - return &(m_This->obj); - } - const T * operator -> () const - { - return &(m_This->obj); - } - - bool operator != (const iterator &where) const - { - return (m_This != where.m_This); - } - bool operator ==(const iterator &where) const - { - return (m_This == where.m_This); - } - private: - ListNode *m_This; - }; - public: - iterator begin() const - { - return iterator(m_Head->next); - } - iterator end() const - { - return iterator(m_Head); - } - iterator erase(iterator &where) - { - ListNode *pNode = where.m_This; - iterator iter(where); - iter++; - - - // Works for all cases: empty list, erasing first element, erasing tail, erasing in the middle... - pNode->prev->next = pNode->next; - pNode->next->prev = pNode->prev; - - delete pNode; - m_Size--; - - return iter; - } - - iterator insert(iterator where, const T &obj) - { - // Insert obj right before where - - ListNode *node = new ListNode(obj); - ListNode *pWhereNode = where.m_This; - - pWhereNode->prev->next = node; - node->prev = pWhereNode->prev; - pWhereNode->prev = node; - node->next = pWhereNode; - - m_Size++; - - return iterator(node); - } - - public: - void remove(const T & obj) - { - iterator b; - for (b=begin(); b!=end(); b++) - { - if ( (*b) == obj ) - { - erase( b ); - break; - } - } - } - template - iterator find(const U & equ) const - { - iterator iter; - for (iter=begin(); iter!=end(); iter++) - { - if ( (*iter) == equ ) - return iter; - } - return end(); - } - List & operator =(const List &src) - { - clear(); - iterator iter; - for (iter=src.begin(); iter!=src.end(); iter++) - push_back( (*iter) ); - return *this; - } - }; -}; //NAMESPACE - -#endif //_INCLUDE_CSDM_LIST_H diff --git a/sourcehook/sh_memfuncinfo.h b/sourcehook/sh_memfuncinfo.h deleted file mode 100644 index fbfddab..0000000 --- a/sourcehook/sh_memfuncinfo.h +++ /dev/null @@ -1,912 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** - * @brief This file provides a way for getting information about a member function. - * @file sh_memfuncinfo.h - */ - -#ifndef __SHINT_MEMFUNC_INFO_H__ -#define __SHINT_MEMFUNC_INFO_H__ - -namespace SourceHook -{ - - // Don Clugston: - // implicit_cast< > - // I believe this was originally going to be in the C++ standard but - // was left out by accident. It's even milder than static_cast. - // I use it instead of static_cast<> to emphasize that I'm not doing - // anything nasty. - // Usage is identical to static_cast<> - template - inline OutputClass implicit_cast(InputClass input){ - return input; - } - - - struct MemFuncInfo - { - bool isVirtual; // Is the function virtual? - int thisptroffs; // The this pointer the function expects to be called with - // If -1, you need to call the GetFuncInfo_GetThisPtr function - int vtblindex; // The function's index in the vtable (0-based, 1=second entry, 2=third entry, ...) - int vtbloffs; // The vtable pointer - }; - - // Ideas by Don Clugston. - // Check out his excellent paper: http://www.codeproject.com/cpp/FastDelegate.asp - - template struct MFI_Impl - { - template static inline void GetFuncInfo(MFP *mfp, MemFuncInfo &out) - { - static char weird_memfunc_pointer_exclamation_mark_arrow_error[N-1000]; - } - }; - -# if SH_COMP == SH_COMP_GCC - - template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16 - { - struct GCC_MemFunPtr - { - union - { - void *funcadr; // always even - intptr_t vtable_index_plus1; // = vindex+1, always odd - }; - intptr_t delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - GCC_MemFunPtr *mfp_detail = (GCC_MemFunPtr*)&mfp; - out.thisptroffs = mfp_detail->delta; - if (mfp_detail->vtable_index_plus1 & 1) - { - out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE; - out.vtbloffs = 0; - out.isVirtual = true; - } - else - out.isVirtual = false; - } - }; - -# elif SH_COMP == SH_COMP_MSVC - - namespace - { - int MFI_GetVtblOffset(void *mfp) - { - unsigned char *addr = (unsigned char*)mfp; - if (*addr == 0xE9) // Jmp - { - // May or may not be! - // Check where it'd jump - addr += 5 /*size of the instruction*/ + *(unsigned long*)(addr + 1); - } - - // Check whether it's a virtual function call - // They look like this: - // 004125A0 8B 01 mov eax,dword ptr [ecx] - // 004125A2 FF 60 04 jmp dword ptr [eax+4] - // ==OR== - // 00411B80 8B 01 mov eax,dword ptr [ecx] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // However, for vararg functions, they look like this: - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] - // ==OR== - // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] - // 0048F0B4 8B 00 mov eax,dword ptr [eax] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - - // With varargs, the this pointer is passed as if it was the first argument - - bool ok = false; - if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && - addr[4] == 0x8B && addr[5] == 0x00) - { - addr += 6; - ok = true; - } - else if (addr[0] == 0x8B && addr[1] == 0x01) - { - addr += 2; - ok = true; - } - if (!ok) - return -1; - - if (*addr++ == 0xFF) - { - if (*addr == 0x60) - { - return *++addr / 4; - } - else if (*addr == 0xA0) - { - return *((unsigned int*)++addr) / 4; - } - else if (*addr == 0x20) - return 0; - else - return -1; - } - return -1; - } - } - - template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = 0; - out.vtbloffs = 0; - } - }; - - template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones! - { - struct MSVC_MemFunPtr2 - { - void *funcadr; - int delta; - }; - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - out.thisptroffs = reinterpret_cast(&mfp)->delta; - out.vtbloffs = 0; - } - }; - - // By Don Clugston, adapted - template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG - { - class __single_inheritance GenericClass; - class GenericClass {}; - - struct MicrosoftVirtualMFP { - void (GenericClass::*codeptr)(); // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtable_index; // or 0 if no virtual inheritance - }; - - struct GenericVirtualClass : virtual public GenericClass - { - typedef GenericVirtualClass * (GenericVirtualClass::*ProbePtrType)(); - GenericVirtualClass * GetThis() { return this; } - }; - - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - // This pointer - /* - union { - MFP func; - GenericClass* (T::*ProbeFunc)(); - MicrosoftVirtualMFP s; - } u; - u.func = mfp; - union { - GenericVirtualClass::ProbePtrType virtfunc; - MicrosoftVirtualMFP s; - } u2; - - // Check that the horrible_cast<>s will work - typedef int ERROR_CantUsehorrible_cast[sizeof(mfp)==sizeof(u.s) - && sizeof(mfp)==sizeof(u.ProbeFunc) - && sizeof(u2.virtfunc)==sizeof(u2.s) ? 1 : -1]; - // Unfortunately, taking the address of a MF prevents it from being inlined, so - // this next line can't be completely optimised away by the compiler. - u2.virtfunc = &GenericVirtualClass::GetThis; - u.s.codeptr = u2.s.codeptr; - out.thisptroffs = (reinterpret_cast(NULL)->*u.ProbeFunc)(); - */ - out.thisptroffs = -1; - out.vtbloffs = 0; - } - }; - - // Don: Nasty hack for Microsoft and Intel (IA32 and Itanium) - // unknown_inheritance classes go here - // This is probably the ugliest bit of code I've ever written. Look at the casts! - // There is a compiler bug in MSVC6 which prevents it from using this code. - template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN - { - template static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out) - { - out.vtblindex = MFI_GetVtblOffset(*(void**)&mfp); - out.isVirtual = out.vtblindex >= 0 ? true : false; - - // The member function pointer is 16 bytes long. We can't use a normal cast, but - // we can use a union to do the conversion. - union { - MFP func; - // In VC++ and ICL, an unknown_inheritance member pointer - // is internally defined as: - struct { - void *m_funcaddress; // points to the actual member function - int delta; // #bytes to be added to the 'this' pointer - int vtordisp; // #bytes to add to 'this' to find the vtable - int vtable_index; // or 0 if no virtual inheritance - } s; - } u; - // Check that the horrible_cast will work - typedef int ERROR_CantUsehorrible_cast[sizeof(u.func)==sizeof(u.s)? 1 : -1]; - u.func = mfp; - int virtual_delta = 0; - if (u.s.vtable_index) { // Virtual inheritance is used - /* - // First, get to the vtable. - // It is 'vtordisp' bytes from the start of the class. - int * vtable = *reinterpret_cast( - reinterpret_cast(thisptr) + u.s.vtordisp ); - - // 'vtable_index' tells us where in the table we should be looking. - virtual_delta = u.s.vtordisp + *reinterpret_cast( - reinterpret_cast(vtable) + u.s.vtable_index); - // The int at 'virtual_delta' gives us the amount to add to 'this'. - // Finally we can add the three components together. Phew! - out.thisptr = reinterpret_cast( - reinterpret_cast(thisptr) + u.s.delta + virtual_delta); - */ - out.vtbloffs = u.s.vtordisp; - out.thisptroffs = -1; - } - else - { - out.vtbloffs = out.vtblindex < 0 ? 0 : u.s.delta; - out.thisptroffs = u.s.delta; - } - }; - }; -# else -# error Unsupported compiler -# endif - - // This version does not take a this pointer - // Useful for hookdecls, as they ensure that mfp is correct through a static_cast - template inline void GetFuncInfo(X mfp, MemFuncInfo &out) - { - MFI_Impl::GetFuncInfo(mfp, out); - } - - // Versions which do take a this - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(), MemFuncInfo &out) - { - RetType(Y::*mfp2)() = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)() const, MemFuncInfo &out) - { - RetType(Y::*mfp2)() const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - // GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...), MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - template - inline void GetFuncInfo(Y *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const, MemFuncInfo &out) - { - RetType(Y::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...) const = mfp; - MFI_Impl::GetFuncInfo(mfp2, out); - } - - - -#endif - -} - -#endif diff --git a/sourcehook/sh_memory.h b/sourcehook/sh_memory.h deleted file mode 100644 index d626bb9..0000000 --- a/sourcehook/sh_memory.h +++ /dev/null @@ -1,186 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko, Scott "Damaged Soul" Ehlert -* Contributors: lancevorgin, XAD, theqizmo -* ============================ -*/ - -#ifndef __SHINT_MEMORY_H__ -#define __SHINT_MEMORY_H__ - -// Feb 17 / 2005: -// Unprotect now sets to readwrite -// The vtable doesn't need to be executable anyway - -# if /********/ defined _WIN32 -# include -# define SH_MEM_READ 1 -# define SH_MEM_WRITE 2 -# define SH_MEM_EXEC 4 -# elif /******/ defined __linux__ -# include -# include -# include -# include -// http://www.die.net/doc/linux/man/man2/mprotect.2.html -# include -# ifndef PAGESIZE -# define PAGESIZE 4096 -# endif -# define SH_MEM_READ PROT_READ -# define SH_MEM_WRITE PROT_WRITE -# define SH_MEM_EXEC PROT_EXEC - -// We need to align addr down to pagesize on linux -// We assume PAGESIZE is a power of two -# define SH_LALIGN(x) (void*)((intptr_t)(x) & ~(PAGESIZE-1)) -# define SH_LALDIF(x) ((intptr_t)(x) & (PAGESIZE-1)) -# else -# error Unsupported OS/Compiler -# endif - - -namespace SourceHook -{ - inline bool SetMemAccess(void *addr, size_t len, int access) - { -# ifdef __linux__ - return mprotect(SH_LALIGN(addr), len + SH_LALDIF(addr), access)==0 ? true : false; -# else - DWORD tmp; - DWORD prot; - switch (access) - { - case SH_MEM_READ: - prot = PAGE_READONLY; break; - case SH_MEM_READ | SH_MEM_WRITE: - prot = PAGE_READWRITE; break; - case SH_MEM_READ | SH_MEM_EXEC: - prot = PAGE_EXECUTE_READ; break; - default: - case SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC: - prot = PAGE_EXECUTE_READWRITE; break; - } - return VirtualProtect(addr, len, prot, &tmp) ? true : false; -# endif - } - -#ifdef __linux__ - namespace - { - bool g_BadReadCalled; - jmp_buf g_BadReadJmpBuf; - - static void BadReadHandler(int sig) - { - if (g_BadReadCalled) - longjmp(g_BadReadJmpBuf, 1); - } - } -#endif - - /** - * @brief Checks whether the specified memory region is (still) accessible - * - * @param addr The lower boundary - * @param len Length of the region to be checked - */ - namespace - { - bool ModuleInMemory(char *addr, size_t len) - { -#ifdef __linux__ - // On linux, first check /proc/self/maps - long lower = reinterpret_cast(addr); - long upper = lower + len; - - FILE *pF = fopen("/proc/self/maps", "r"); - if (pF) - { - // Linux /proc/self/maps -> parse - // Format: - // lower upper prot stuff path - // 08048000-0804c000 r-xp 00000000 03:03 1010107 /bin/cat - long rlower, rupper; - while (fscanf(pF, "%lx-%lx", &rlower, &rupper) != EOF) - { - // Check whether we're IN THERE! - if (lower >= rlower && upper <= rupper) - { - fclose(pF); - return true; - } - // Read to end of line - int c; - while ((c = fgetc(pF)) != '\n') - { - if (c == EOF) - break; - } - if (c == EOF) - break; - } - fclose(pF); - return false; - } - pF = fopen("/proc/curproc/map", "r"); - if (pF) - { - // FreeBSD /proc/curproc/map -> parse - // 0x804800 0x805500 13 15 0xc6e18960 r-x 21 0x0 COW NC vnode - long rlower, rupper; - while (fscanf(pF, "0x%lx 0x%lx", &rlower, &rupper) != EOF) - { - // Check whether we're IN THERE! - if (lower >= rlower && upper <= rupper) - { - fclose(pF); - return true; - } - // Read to end of line - int c; - while ((c = fgetc(pF)) != '\n') - { - if (c == EOF) - break; - } - if (c == EOF) - break; - } - fclose(pF); - return false; - } - - // Both of the above failed, try to actually read and trap sigsegv (implemented by Damaged Soul) - void(*prevHandler)(int sig); - g_BadReadCalled = true; - - if (setjmp(g_BadReadJmpBuf)) - return true; - - prevHandler = signal(SIGSEGV, BadReadHandler); - - volatile const char *p = reinterpret_cast(addr); - char dummy; - - for (size_t i = 0; i < len; i++) - dummy = p[i]; - - g_BadReadCalled = false; - - signal(SIGSEGV, prevHandler); - - return false; -#else - // On Win32, simply use IsBadReadPtr - return !IsBadReadPtr(addr, len); -#endif - } - } -} - -#endif diff --git a/sourcehook/sh_stack.h b/sourcehook/sh_stack.h deleted file mode 100644 index ffbeecf..0000000 --- a/sourcehook/sh_stack.h +++ /dev/null @@ -1,237 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -#ifndef __SH_STACK_H__ -#define __SH_STACK_H__ - -#include - -#define SH_STACK_DEFAULT_SIZE 4 - -namespace SourceHook -{ - // Vector - template class CStack - { - T *m_Elements; - size_t m_AllocatedSize; - size_t m_UsedSize; - public: - friend class iterator; - class iterator - { - CStack *m_pParent; - size_t m_Index; - public: - iterator(CStack *pParent, size_t id) : m_pParent(pParent), m_Index(id) - { - } - - iterator(CStack *pParent) : m_pParent(pParent), m_Index(0) - { - } - - iterator() : m_pParent(NULL), m_Index(0) - { - } - - T &operator *() - { - return m_pParent->m_Elements[m_Index]; - } - const T &operator *() const - { - return m_pParent->m_Elements[m_Index]; - } - - T * operator->() - { - return m_pParent->m_Elements + m_Index; - } - - const T * operator->() const - { - return m_pParent->m_Elements + m_Index; - } - - iterator & operator++() // preincrement - { - ++m_Index; - return (*this); - } - - iterator operator++(int) // postincrement - { - iterator tmp = *this; - ++m_Index; - return tmp; - } - - iterator & operator--() // predecrement - { - --m_Index; - return (*this); - } - - iterator operator--(int) // postdecrememnt - { - iterator tmp = *this; - --m_Index; - return tmp; - } - - bool operator==(const iterator & right) const - { - return (m_pParent == right.m_pParent && m_Index == right.m_Index); - } - - bool operator!=(const iterator & right) const - { - return !(*this == right); - } - }; - CStack() : m_Elements(new T[SH_STACK_DEFAULT_SIZE]), - m_AllocatedSize(SH_STACK_DEFAULT_SIZE), - m_UsedSize(0) - { - } - CStack(size_t size) : m_Elements(new T[size]), - m_AllocatedSize(size), - m_UsedSize(0) - { - } - - CStack(const CStack &other) : m_Elements(NULL), - m_AllocatedSize(0), - m_UsedSize(0) - { - reserve(other.m_AllocatedSize); - m_UsedSize = other.m_UsedSize; - for (size_t i = 0; i < m_UsedSize; ++i) - m_Elements[i] = other.m_Elements[i]; - } - - ~CStack() - { - if (m_Elements) - delete [] m_Elements; - } - - void operator=(const CStack &other) - { - if (m_AllocatedSize < other.m_AllocatedSize) - { - if (m_Elements) - delete [] m_Elements; - m_Elements = new T[other.m_AllocatedSize]; - m_AllocatedSize = other.m_AllocatedSize; - } - m_UsedSize = other.m_UsedSize; - for (size_t i = 0; i < m_UsedSize; ++i) - m_Elements[i] = other.m_Elements[i]; - } - - bool push(const T &val) - { - if (m_UsedSize + 1 == m_AllocatedSize) - { - // zOHNOES! REALLOCATE! - m_AllocatedSize *= 2; - T *newElements = new T[m_AllocatedSize]; - if (!newElements) - { - m_AllocatedSize /= 2; - return false; - } - if (m_Elements) - { - for (size_t i = 0; i < m_UsedSize; ++i) - newElements[i] = m_Elements[i]; - delete [] m_Elements; - } - m_Elements = newElements; - } - m_Elements[m_UsedSize++] = val; - return true; - } - - void pop() - { - --m_UsedSize; - } - - void popall() - { - m_UsedSize = 0; - } - - T &front() - { - return m_Elements[m_UsedSize - 1]; - } - - const T &front() const - { - return m_Elements[m_UsedSize - 1]; - } - - T &second() - { - return m_Elements[m_UsedSize - 2]; - } - - const T &second() const - { - return m_Elements[m_UsedSize - 2]; - } - - iterator begin() - { - return iterator(this, 0); - } - iterator end() - { - return iterator(this, m_UsedSize); - } - - size_t size() - { - return m_UsedSize; - } - size_t capacity() - { - return m_AllocatedSize; - } - bool empty() - { - return m_UsedSize == 0 ? true : false; - } - bool reserve(size_t size) - { - if (size > m_AllocatedSize) - { - T *newElements = new T[size]; - if (!newElements) - return false; - if (m_Elements) - { - for (size_t i = 0; i < m_UsedSize; ++i) - newElements[i] = m_Elements[i]; - delete [] m_Elements; - } - m_Elements = newElements; - m_AllocatedSize = size; - } - return true; - } - }; -}; //namespace SourceHook - -#endif diff --git a/sourcehook/sh_string.h b/sourcehook/sh_string.h deleted file mode 100755 index 220b4ee..0000000 --- a/sourcehook/sh_string.h +++ /dev/null @@ -1,401 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -/* AMX Mod X - * - * by the AMX Mod X Development Team - */ - -#ifndef _INCLUDE_CSTRING_H -#define _INCLUDE_CSTRING_H - -#include -#include - -namespace SourceHook -{ -class String -{ -public: - String() - { - v = NULL; - a_size = 0; - //assign(""); - } - - ~String() - { - if (v) - delete [] v; - } - - String(const char *src) - { - v = NULL; - a_size = 0; - assign(src); - } - - String(const String &src) - { - v = NULL; - a_size = 0; - assign(src.c_str()); - } - - bool operator ==(const String &other) - { - return (compare(other.c_str()) == 0); - } - - bool operator ==(const char *other) - { - return (compare(other) == 0); - } - - const char *c_str() { return v?v:""; } - - const char *c_str() const { return v?v:""; } - - void append(const char *t) - { - Grow(size() + strlen(t) + 1); - strcat(v, t); - } - - void append(const char c) - { - size_t len = size(); - Grow(len + 2); - v[len] = c; - v[len + 1] = '\0'; - } - - void append(String &d) - { - append(d.c_str()); - } - - void assign(const String &src) - { - assign(src.c_str()); - } - - void assign(const char *d) - { - if (!d) - { - clear(); - } else { - Grow(strlen(d) + 1, false); - strcpy(v, d); - } - } - - void clear() - { - if (v) - v[0] = '\0'; - } - - int compare (const char *d) const - { - if (!v) - return strcmp("", d); - else - return strcmp(v, d); - } - - //Added this for amxx inclusion - bool empty() const - { - if (!v) - return true; - - if (v[0] == '\0') - return true; - - return false; - } - - size_t size() const - { - if (v) - return strlen(v); - else - return 0; - } - - int find(const char c, int index = 0) const - { - int len = static_cast(size()); - if (len < 1) - return npos; - if (index >= len || index < 0) - return npos; - int i = 0; - for (i=index; i(size()); - if (len < 1) - return npos; - if (index >= len || index < npos) - return npos; - int i; - if (index == npos) - i = len - 1; - else - i = index; - - for (; i>=0; i--) - { - if (v[i] == c) - { - return i; - } - } - - return npos; - } - - bool is_space(int c) const - { - if (c == '\f' || c == '\n' || - c == '\t' || c == '\r' || - c == '\v' || c == ' ') - { - return true; - } - - return false; - } - - void trim() - { - if (!v) - return; - - unsigned int i = 0; - unsigned int j = 0; - size_t len = strlen(v); - - if (len == 1) - { - if (is_space(v[i])) - { - clear(); - return; - } - } - - unsigned char c0 = v[0]; - - if (is_space(c0)) - { - for (i=0; i=0; i--) - { - if (!is_space(v[i]) - || (is_space(v[i]) && i==0)) - { - erase(i+1, j); - break; - } - j++; - } - } - - if (len == 1) - { - if (is_space(v[0])) - { - clear(); - return; - } - } - } - - void erase(unsigned int start, int num = npos) - { - if (!v) - return; - unsigned int i = 0; - size_t len = size(); - //check for bounds - if (num == npos || start+num > len-start) - num = len - start; - //do the erasing - bool copyflag = false; - for (i=0; i=start && i= len || !v) - return ns; - - if (num == npos) - { - num = len - index; - } else if (index+num >= len) { - num = len - index; - } - - unsigned int i = 0; - unsigned int nslen = num + 2; - - ns.Grow(nslen); - - for (i=index; i= 65 && v[i] <= 90) - v[i] &= ~(1<<5); - } - } - - String & operator = (const String &src) - { - assign(src); - return *this; - } - - String & operator = (const char *src) - { - assign(src); - return *this; - - } - - char operator [] (unsigned int index) const - { - if (index > size() || !v) - { - return -1; - } else { - return v[index]; - } - } - - int at(int a) const - { - if (a < 0 || a >= (int)size() || !v) - return -1; - - return v[a]; - } - - bool at(int at, char c) - { - if (at < 0 || at >= (int)size() || !v) - return false; - - v[at] = c; - - return true; - } - -private: - void Grow(unsigned int d, bool copy=true) - { - if (d <= a_size) - return; - char *n = new char[d + 1]; - if (copy && v) - strcpy(n, v); - if (v) - delete [] v; - else - strcpy(n, ""); - v = n; - a_size = d + 1; - } - - char *v; - unsigned int a_size; -public: - static const int npos = -1; -}; - -}; //NAMESPACE - -#endif //_INCLUDE_CSTRING_H diff --git a/sourcehook/sh_tinyhash.h b/sourcehook/sh_tinyhash.h deleted file mode 100644 index 634b253..0000000 --- a/sourcehook/sh_tinyhash.h +++ /dev/null @@ -1,534 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -#ifndef _INCLUDE_SH_TINYHASH_H_ -#define _INCLUDE_SH_TINYHASH_H_ - -#include "sh_list.h" - -#define _T_INIT_HASH_SIZE 32 - -namespace SourceHook -{ - template - int HashFunction(const K & k); - - template - int HashAlt(const U &u); - - template - int CompareAlt(const U &k1, const K &k2); - - template - int Compare(const K & k1, const K & k2); - - /** - * This is a tiny, growable hash class. - * Meant for quick and dirty dictionaries only! - */ - template - class THash - { - public: - struct THashNode - { - THashNode(const K & k, const V & v) : - key(k), val(v) - { - }; - THashNode & operator =(const THashNode &other) - { - key = other.key; - val = other.val; - } - K key; - V val; - }; - typedef List * NodePtr; - public: - class const_iterator; - THash() : m_Buckets(NULL), m_numBuckets(0), m_percentUsed(0.0f) - { - _Refactor(); - } - THash(const THash &other) : m_Buckets(new NodePtr[other.m_numBuckets]), - m_numBuckets(other.m_numBuckets), m_percentUsed(other.m_percentUsed) - { - for (size_t i=0; ikey)->val = iter->val; - } - void operator=(const THash &other) - { - clear(); - for (const_iterator iter = other.begin(); iter != other.end(); ++iter) - _FindOrInsert(iter->key)->val = iter->val; - } - - ~THash() - { - _Clear(); - } - void clear() - { - _Clear(); - _Refactor(); - } - size_t GetBuckets() - { - return m_numBuckets; - } - float PercentUsed() - { - return m_percentUsed; - } - V & operator [](const K & key) - { - THashNode *pNode = _FindOrInsert(key); - return pNode->val; - } - private: - void _Clear() - { - typename List::iterator iter, end; - for (size_t i=0; iend(); - iter = m_Buckets[i]->begin(); - while (iter != end) - { - delete (*iter); - iter++; - } - delete m_Buckets[i]; - m_Buckets[i] = NULL; - } - } - if (m_Buckets) - delete [] m_Buckets; - m_Buckets = NULL; - m_numBuckets = 0; - } - public: - template - V & AltFindOrInsert(const U & ukey) - { - size_t place = HashAlt(ukey) % m_numBuckets; - THashNode *pNode = NULL; - if (!m_Buckets[place]) - { - m_Buckets[place] = new List; - pNode = new THashNode(ukey, V()); - m_Buckets[place]->push_back(pNode); - m_percentUsed += (1.0f / (float)m_numBuckets); - } else { - typename List::iterator iter; - for (iter=m_Buckets[place]->begin(); iter!=m_Buckets[place]->end(); iter++) - { - if (CompareAlt(ukey, (*iter)->key) == 0) - { - return (*iter)->val; - } - } - //node does not exist - pNode = new THashNode(ukey, V()); - m_Buckets[place]->push_back(pNode); - } - if (PercentUsed() > 0.75f) - { - _Refactor(); - } - return pNode->val; - } - private: - THashNode *_FindOrInsert(const K & key) - { - size_t place = HashFunction(key) % m_numBuckets; - THashNode *pNode = NULL; - if (!m_Buckets[place]) - { - m_Buckets[place] = new List; - pNode = new THashNode(key, V()); - m_Buckets[place]->push_back(pNode); - m_percentUsed += (1.0f / (float)m_numBuckets); - } else { - typename List::iterator iter; - for (iter=m_Buckets[place]->begin(); iter!=m_Buckets[place]->end(); iter++) - { - if (Compare((*iter)->key, key) == 0) - return (*iter); - } - //node does not exist - pNode = new THashNode(key, V()); - m_Buckets[place]->push_back(pNode); - } - if (PercentUsed() > 0.75f) - { - _Refactor(); - } - return pNode; - } - void _Refactor() - { - m_percentUsed = 0.0f; - if (!m_numBuckets) - { - m_numBuckets = _T_INIT_HASH_SIZE; - m_Buckets = new NodePtr[m_numBuckets]; - for (size_t i=0; i::iterator iter; - size_t place; - THashNode *pHashNode; - NodePtr *temp = new NodePtr[m_numBuckets]; - for (size_t i=0; ibegin(); iter != m_Buckets[i]->end(); iter++) - { - pHashNode = (*iter); - //rehash it with the new bucket filter - place = HashFunction(pHashNode->key) % m_numBuckets; - //add it to the new hash table - if (!temp[place]) - { - temp[place] = new List; - m_percentUsed += (1.0f / (float)m_numBuckets); - } - temp[place]->push_back(pHashNode); - } - //delete that bucket! - delete m_Buckets[i]; - m_Buckets[i] = NULL; - } - } - //reassign bucket table - delete [] m_Buckets; - m_Buckets = temp; - } - } - public: - friend class iterator; - friend class const_iterator; - class iterator - { - friend class THash; - public: - iterator() : curbucket(-1), hash(NULL), end(true) - { - }; - iterator(THash *h) : curbucket(-1), hash(h), end(false) - { - if (!h->m_Buckets) - end = true; - else - _Inc(); - }; - //pre increment - iterator & operator++() - { - _Inc(); - return *this; - } - //post increment - iterator operator++(int) - { - iterator old(*this); - _Inc(); - return old; - } - const THashNode & operator * () const - { - return *(*iter); - } - THashNode & operator * () - { - return *(*iter); - } - const THashNode * operator ->() const - { - return (*iter); - } - THashNode * operator ->() - { - return (*iter); - } - bool operator ==(const iterator &where) const - { - if (where.hash == this->hash - && where.end == this->end - && - (this->end || - ((where.curbucket == this->curbucket) - && (where.iter == iter)) - )) - return true; - return false; - } - bool operator !=(const iterator &where) const - { - return !( (*this) == where ); - } - - void erase() - { - if (end || !hash || curbucket < 0 || curbucket >= static_cast(hash->m_numBuckets)) - return; - - // Remove this element and move to the next one - iterator tmp = *this; - ++tmp; - delete (*iter); - hash->m_Buckets[curbucket]->erase(iter); - *this = tmp; - - // :TODO: Maybe refactor to a lower size if required - } - private: - void _Inc() - { - if (end || !hash || curbucket >= static_cast(hash->m_numBuckets)) - return; - if (curbucket < 0) - { - for (int i=0; i<(int)hash->m_numBuckets; i++) - { - if (hash->m_Buckets[i]) - { - iter = hash->m_Buckets[i]->begin(); - if (iter == hash->m_Buckets[i]->end()) - continue; - curbucket = i; - break; - } - } - if (curbucket < 0) - end = true; - } else { - if (iter != hash->m_Buckets[curbucket]->end()) - iter++; - if (iter == hash->m_Buckets[curbucket]->end()) - { - int oldbucket = curbucket; - for (int i=curbucket+1; i<(int)hash->m_numBuckets; i++) - { - if (hash->m_Buckets[i]) - { - iter = hash->m_Buckets[i]->begin(); - if (iter == hash->m_Buckets[i]->end()) - continue; - curbucket = i; - break; - } - } - if (curbucket == oldbucket) - end = true; - } - } - } - private: - int curbucket; - typename SourceHook::List::iterator iter; - THash *hash; - bool end; - }; - class const_iterator - { - friend class THash; - public: - const_iterator() : curbucket(-1), hash(NULL), end(true) - { - }; - const_iterator(const THash *h) : curbucket(-1), hash(h), end(false) - { - if (!h->m_Buckets) - end = true; - else - _Inc(); - }; - //pre increment - const_iterator & operator++() - { - _Inc(); - return *this; - } - //post increment - const_iterator operator++(int) - { - iterator old(*this); - _Inc(); - return old; - } - const THashNode & operator * () const - { - return *(*iter); - } - const THashNode * operator ->() const - { - return (*iter); - } - bool operator ==(const const_iterator &where) const - { - if (where.hash == this->hash - && where.end == this->end - && - (this->end || - ((where.curbucket == this->curbucket) - && (where.iter == iter)) - )) - return true; - return false; - } - bool operator !=(const const_iterator &where) const - { - return !( (*this) == where ); - } - private: - void _Inc() - { - if (end || !hash || curbucket >= static_cast(hash->m_numBuckets)) - return; - if (curbucket < 0) - { - for (int i=0; i<(int)hash->m_numBuckets; i++) - { - if (hash->m_Buckets[i]) - { - iter = hash->m_Buckets[i]->begin(); - if (iter == hash->m_Buckets[i]->end()) - continue; - curbucket = i; - break; - } - } - if (curbucket < 0) - end = true; - } else { - if (iter != hash->m_Buckets[curbucket]->end()) - iter++; - if (iter == hash->m_Buckets[curbucket]->end()) - { - int oldbucket = curbucket; - for (int i=curbucket+1; i<(int)hash->m_numBuckets; i++) - { - if (hash->m_Buckets[i]) - { - iter = hash->m_Buckets[i]->begin(); - if (iter == hash->m_Buckets[i]->end()) - continue; - curbucket = i; - break; - } - } - if (curbucket == oldbucket) - end = true; - } - } - } - private: - int curbucket; - typename SourceHook::List::iterator iter; - const THash *hash; - bool end; - }; - public: - iterator begin() - { - return iterator(this); - } - iterator end() - { - iterator iter; - iter.hash = this; - return iter; - } - - const_iterator begin() const - { - return const_iterator(this); - } - const_iterator end() const - { - const_iterator iter; - iter.hash = this; - return iter; - } - - template - iterator find(const U & u) const - { - iterator b = begin(); - iterator e = end(); - for (iterator iter = b; iter != e; iter++) - { - if ( (*iter).key == u ) - return iter; - } - return end(); - } - template - iterator find(const U & u) - { - iterator b = begin(); - iterator e = end(); - for (iterator iter = b; iter != e; iter++) - { - if ( (*iter).key == u ) - return iter; - } - return end(); - } - template - iterator FindAlt(const U & u) - { - iterator b = begin(); - iterator e = end(); - for (iterator iter = b; iter != e; iter++) - { - if (CompareAlt(u, (*iter).key) == 0) - { - return iter; - } - } - return e; - } - iterator erase(iterator where) - { - where.erase(); - return where; - } - template - void erase(const U & u) - { - iterator iter = find(u); - if (iter == end()) - return; - iter.erase(); - } - private: - NodePtr *m_Buckets; - size_t m_numBuckets; - float m_percentUsed; - }; -}; - -#endif //_INCLUDE_SH_TINYHASH_H_ diff --git a/sourcehook/sh_vector.h b/sourcehook/sh_vector.h deleted file mode 100755 index 26b16b9..0000000 --- a/sourcehook/sh_vector.h +++ /dev/null @@ -1,519 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -#ifndef __CVECTOR_H__ -#define __CVECTOR_H__ - -#include - -//This file originally from AMX Mod X -namespace SourceHook -{ -// Vector -template class CVector -{ - bool Grow(size_t amount) - { - // automatic grow - size_t newSize = m_Size * 2; - - if (newSize == 0) - { - newSize = 8; - } - - while (m_CurrentUsedSize + amount > newSize) - { - newSize *= 2; - } - - T *newData = new T[newSize]; - - if (m_Data) - { - for (size_t i=0; i= m_Size) - { - return Grow(amount); - } - else - { - return true; - } - } - - bool ChangeSize(size_t size) - { - // change size - if (size == m_Size) - { - return true; - } - - if (!size) - { - if (m_Data) - { - delete [] m_Data; - m_Data = NULL; - m_Size = 0; - } - return true; - } - - T *newData = new T[size]; - - if (m_Data) - { - size_t end = (m_CurrentUsedSize < size) ? (m_CurrentUsedSize) : size; - for (size_t i=0; i m_Size) - { - m_CurrentUsedSize = m_Size; - } - - return true; - } - - void FreeMemIfPossible() - { - if (!m_Data) - { - return; - } - - if (!m_CurrentUsedSize) - { - ChangeSize(0); - return; - } - - size_t newSize = m_Size; - while (m_CurrentUsedSize <= newSize / 2) - { - newSize /= 2; - } - - if (newSize != m_Size) - { - ChangeSize(newSize); - } - } -protected: - T *m_Data; - size_t m_Size; - size_t m_CurrentUsedSize; -public: - class iterator - { - protected: - T *m_Ptr; - public: - // constructors / destructors - iterator() - { - m_Ptr = NULL; - } - - iterator(T * ptr) - { - m_Ptr = ptr; - } - - // member functions - T * base() - { - return m_Ptr; - } - - const T * base() const - { - return m_Ptr; - } - - // operators - T & operator*() - { - return *m_Ptr; - } - - T * operator->() - { - return m_Ptr; - } - - iterator & operator++() // preincrement - { - ++m_Ptr; - return (*this); - } - - iterator operator++(int) // postincrement - { - iterator tmp = *this; - ++m_Ptr; - return tmp; - } - - iterator & operator--() // predecrement - { - --m_Ptr; - return (*this); - } - - iterator operator--(int) // postdecrememnt - { - iterator tmp = *this; - --m_Ptr; - return tmp; - } - - bool operator==(T * right) const - { - return (m_Ptr == right); - } - - bool operator==(const iterator & right) const - { - return (m_Ptr == right.m_Ptr); - } - - bool operator!=(T * right) const - { - return (m_Ptr != right); - } - - bool operator!=(const iterator & right) const - { - return (m_Ptr != right.m_Ptr); - } - - iterator & operator+=(size_t offset) - { - m_Ptr += offset; - return (*this); - } - - iterator & operator-=(size_t offset) - { - m_Ptr -= offset; - return (*this); - } - - iterator operator+(size_t offset) const - { - iterator tmp(*this); - tmp.m_Ptr += offset; - return tmp; - } - - iterator operator-(size_t offset) const - { - iterator tmp(*this); - tmp.m_Ptr -= offset; - return tmp; - } - - T & operator[](size_t offset) - { - return (*(*this + offset)); - } - - const T & operator[](size_t offset) const - { - return (*(*this + offset)); - } - - bool operator<(const iterator & right) const - { - return m_Ptr < right.m_Ptr; - } - - bool operator>(const iterator & right) const - { - return m_Ptr > right.m_Ptr; - } - - bool operator<=(const iterator & right) const - { - return m_Ptr <= right.m_Ptr; - } - - bool operator>=(const iterator & right) const - { - return m_Ptr >= right.m_Ptr; - } - - size_t operator-(const iterator & right) const - { - return m_Ptr - right.m_Ptr; - } - }; - - // constructors / destructors - CVector() - { - m_Size = 0; - m_CurrentUsedSize = 0; - m_Data = NULL; - } - - CVector(const CVector & other) - { - // copy data - m_Data = new T [other.m_CurrentUsedSize]; - m_Size = other.m_CurrentUsedSize; - m_CurrentUsedSize = other.m_CurrentUsedSize; - for (size_t i=0; i() - { - clear(); - } - - CVector & operator =(const CVector & other) - { - clear(); - ChangeSize(other.size()); - m_CurrentUsedSize = other.size(); - for (size_t i=0; i m_CurrentUsedSize) - assert(0); - return iterator(m_Data + pos); - } - - bool reserve(size_t newSize) - { - if (newSize > m_Size) - return ChangeSize(newSize); - return true; - } - - bool push_back(const T & elem) - { - if (!GrowIfNeeded(1)) - { - return false; - } - - m_Data[m_CurrentUsedSize++] = elem; - - return true; - } - - void pop_back() - { - --m_CurrentUsedSize; - if (m_CurrentUsedSize < 0) - m_CurrentUsedSize = 0; - - FreeMemIfPossible(); - } - - bool resize(size_t newSize) - { - return resize(newSize, T()); - } - - bool resize(size_t newSize, T defval) - { - if (!ChangeSize(newSize)) - return false; - for (size_t i = m_CurrentUsedSize; i < newSize; ++i) - m_Data[i] = defval; - m_CurrentUsedSize = newSize; - return true; - } - - bool empty() const - { - return (m_CurrentUsedSize == 0); - } - - T & at(size_t pos) - { - if (pos > m_CurrentUsedSize) - { - assert(0); - } - return m_Data[pos]; - } - - const T & at(size_t pos) const - { - if (pos > m_CurrentUsedSize) - { - assert(0); - } - return m_Data[pos]; - } - - T & operator[](size_t pos) - { - return at(pos); - } - - const T & operator[](size_t pos) const - { - return at(pos); - } - - T & front() - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[0]; - } - - const T & front() const - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[0]; - } - - T & back() - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[m_CurrentUsedSize - 1]; - } - - const T & back() const - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[m_CurrentUsedSize - 1]; - } - - iterator insert(iterator where, const T & value) - { - // validate iter - if (where < m_Data || where > (m_Data + m_CurrentUsedSize)) - return iterator(0); - - size_t ofs = where - begin(); - - if (!GrowIfNeeded(1)) - { - return false; - } - - ++m_CurrentUsedSize; - - where = begin() + ofs; - - // Move subsequent entries - for (T *ptr = m_Data + m_CurrentUsedSize - 2; ptr >= where.base(); --ptr) - *(ptr + 1) = *ptr; - - *where.base() = value; - - return where; - } - - iterator erase(iterator where) - { - // validate iter - if (where < m_Data || where >= (m_Data + m_CurrentUsedSize)) - return iterator(0); - - size_t ofs = where - begin(); - - if (m_CurrentUsedSize > 1) - { - // move - T *theend = m_Data + m_CurrentUsedSize; - for (T *ptr = where.base() + 1; ptr < theend; ++ptr) - *(ptr - 1) = *ptr; - } - - --m_CurrentUsedSize; - - FreeMemIfPossible(); - - return begin() + ofs; - } - - void clear() - { - m_Size = 0; - m_CurrentUsedSize = 0; - if (m_Data) - { - delete [] m_Data; - m_Data = NULL; - } - } -}; -}; //namespace SourceHook - -#endif // __CVECTOR_H__ diff --git a/sourcehook/sourcehook.cpp b/sourcehook/sourcehook.cpp deleted file mode 100644 index d7f8e7f..0000000 --- a/sourcehook/sourcehook.cpp +++ /dev/null @@ -1,1231 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* Contributors: Scott "Damaged Soul" Ehlert -* ============================ -*/ - -/** - * @file sourcehook.cpp - * @brief Contains the implementation of the SourceHook API -*/ - -#if defined __GNUC__ -#include -#endif - -#include "sourcehook_impl.h" -#include "sh_memory.h" - -namespace SourceHook -{ - template<> - int HashFunction(const int & k) - { - return k; - } - template<> - int Compare(const int & k1, const int & k2) - { - if (k1 == k2) - return 0; - if (k1 > k2) - return 1; - if (k1 < k2) - return -1; - return 0; - } - CSourceHookImpl::CSourceHookImpl() - { - } - CSourceHookImpl::~CSourceHookImpl() - { - } - - int CSourceHookImpl::GetIfaceVersion() - { - return SH_IFACE_VERSION; - } - - int CSourceHookImpl::GetImplVersion() - { - return SH_IMPL_VERSION; - } - - bool CSourceHookImpl::IsPluginInUse(Plugin plug) - { - // Iterate through all hook managers which are in this plugin - // Iterate through their vfnptrs, ifaces, hooks - // If a hook from an other plugin is found, return true - // Return false otherwise -#define TMP_CHECK_LIST(name) \ - for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ - if (hook_iter->plug == plug) \ - return true; - - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); - hmil_iter != hmcl_iter->end(); ++hmil_iter) - { - if (hmil_iter->m_Plug != plug) - continue; - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - List::iterator hook_iter; - TMP_CHECK_LIST(m_PreHooks); - TMP_CHECK_LIST(m_PostHooks); - } - } - } - } - -#undef TMP_CHECK_LIST - return false; - } - - void CSourceHookImpl::UnloadPlugin(Plugin plug) - { - // 1) Manually remove all hooks by this plugin - // 2) Manually remove all hook mans by this plugin - - List hookstoremove; - List hookmanstoremove; - HookManInfoList::iterator hmil_iter; - -#define TMP_CHECK_LIST(name, ispost) \ - for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ - if (hook_iter->plug == plug) \ - hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ - hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)); \ - - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); - hmil_iter != hmcl_iter->end(); ++hmil_iter) - { - if (hmil_iter->m_Plug == plug) - hookmanstoremove.push_back(RemoveHookManInfo(plug, hmil_iter->m_Func)); - - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - List::iterator hook_iter; - TMP_CHECK_LIST(m_PreHooks, false); - TMP_CHECK_LIST(m_PostHooks, true); - } - } - } - } -#undef TMP_CHECK_LIST - - for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) - RemoveHook(*rmiter); - - for (List::iterator rmiter = hookmanstoremove.begin(); rmiter != hookmanstoremove.end(); ++rmiter) - RemoveHookManager(*rmiter); - } - - void CSourceHookImpl::RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) - { - // Moo! - - CHookManagerInfo tmp; - if (pubFunc(HA_GetInfo, &tmp) != 0) - return; - - - HookManContList::iterator hmcl_iter = m_HookMans.find( - CHookManagerContainer::HMCI(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx)); - - if (hmcl_iter == m_HookMans.end()) - { - // Moo? - return; - } - - CHookManagerContainer::iterator hmil_iter = hmcl_iter->find( - CHookManagerInfo::Descriptor(plug, pubFunc)); - - if (hmil_iter == hmcl_iter->end()) - { - // Moo? - return; - } - - bool stillInUse = false; - List hookstoremove; - - // Iterate through all of the hook manager's hooks. Remove all hooks from the hookman's plugin. -#define TMP_CHECK_LIST(name, ispost) \ - for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ - if (hook_iter->plug == plug) \ - hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ - hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)); \ - else \ - stillInUse = true; \ - - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - List::iterator hook_iter; - TMP_CHECK_LIST(m_PreHooks, false); - TMP_CHECK_LIST(m_PostHooks, true); - } - } -#undef TMP_CHECK_LIST - - for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) - RemoveHook(*rmiter); - - CHookManagerInfo info = *hmil_iter; - - // Unlink the hook manager from the list - hmcl_iter->erase(hmil_iter); - - // If there were any hooks from other plugins, find a new suitable hook manager. - if (stillInUse) - { - // Find a suitable hook manager in an other plugin - hmil_iter = hmcl_iter->begin(); - - // This should _never_ happen. - // If there is a hook from an other plugin, the plugin must have provided a hook manager as well. - SH_ASSERT(hmil_iter != hmcl_iter->end(), - ("Could not find a suitable hook manager in an other plugin!")); - - // AddHook should make sure that every plugin only has _one_ hook manager for _one_ proto/vi/vo - SH_ASSERT(hmil_iter->m_Plug != plug, ("New hook manager from same plugin!")); - - // The first hook manager should be always used - so the new hook manager has to be empty - SH_ASSERT(hmil_iter->m_VfnPtrs.empty(), ("New hook manager not empty!")); - - // Move the vfnptrs from the old hook manager to the new one - hmil_iter->m_VfnPtrs = info.m_VfnPtrs; - - // Unregister the old one, register the new one - info.m_Func(HA_Unregister, NULL); - hmil_iter->m_Func(HA_Register, &(*hmil_iter)); - - // Go through all vfnptrs in this hookman and patch them to point to the new manager's handler! - // or whatever - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - // And DEREFERENCE newHookMan->m_HookfuncVfnptr! - // otherwise it will be executing the vtable... had to find out the hard way - *reinterpret_cast(vfnptr_iter->m_Ptr) = *reinterpret_cast(hmil_iter->m_HookfuncVfnptr); - } - } - } - - void CSourceHookImpl::RemoveHookManager(RemoveHookManInfo info) - { - RemoveHookManager(info.plug, info.hookman); - } - - void CSourceHookImpl::CompleteShutdown() - { - // Remove all hooks - - List hookstoremove; - -#define TMP_CHECK_LIST(name, ispost) \ - for (hook_iter = iface_iter->name.m_List.begin(); hook_iter != iface_iter->name.m_List.end(); ++hook_iter) \ - hookstoremove.push_back(RemoveHookInfo(hook_iter->plug, iface_iter->m_Ptr, \ - hook_iter->thisptr_offs, hmil_iter->m_Func, hook_iter->handler, ispost)) - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hmil_iter = hmcl_iter->begin(); - hmil_iter != hmcl_iter->end(); ++hmil_iter) - { - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hmil_iter->m_VfnPtrs.begin(); - vfnptr_iter != hmil_iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - List::iterator hook_iter; - TMP_CHECK_LIST(m_PreHooks, false); - TMP_CHECK_LIST(m_PostHooks, true); - } - } - } - } -#undef TMP_CHECK_LIST - - for (List::iterator rmiter = hookstoremove.begin(); rmiter != hookstoremove.end(); ++rmiter) - RemoveHook(*rmiter); - - m_HookMans.clear(); - } - - bool CSourceHookImpl::AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post) - { - void *adjustediface = reinterpret_cast(reinterpret_cast(iface) + thisptr_offs); - - // 1) Get info about the hook manager - CHookManagerInfo tmp; - if (myHookMan(HA_GetInfo, &tmp) != 0) - return false; - - tmp.m_Func = myHookMan; - tmp.m_Plug = plug; - - CHookManagerContainer::HMCI hmci(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx); - - void **cur_vtptr = *reinterpret_cast( - reinterpret_cast(adjustediface) + tmp.m_VtblOffs); - void *cur_vfnptr = reinterpret_cast(cur_vtptr + tmp.m_VtblIdx); - - // Add the container if not already added - HookManContList::iterator hmcl_iter = m_HookMans.find(hmci); - if (hmcl_iter == m_HookMans.end()) - { - m_HookMans.push_back(CHookManagerContainer(hmci)); - hmcl_iter = m_HookMans.end(); - --hmcl_iter; - } - - hmcl_iter->AddHookManager(plug, tmp); - - CHookManagerContainer::iterator hookman = hmcl_iter->begin(); - SH_ASSERT(hookman != hmcl_iter->end(), ("No hookman found - but we've just added one!")); - - // Check whether any other container holds a hook manager which holds this vfnptr - // If yes, it means that the two are incompatible, so return false. - for (HookManContList::iterator hmcl_iter2 = m_HookMans.begin(); - hmcl_iter2 != m_HookMans.end(); ++hmcl_iter2) - { - if (hmcl_iter2 != hmcl_iter) - { - for (CHookManagerContainer::iterator hmil_iter = hmcl_iter2->begin(); - hmil_iter != hmcl_iter2->end(); ++hmil_iter) - { - if (hmil_iter->m_VfnPtrs.find(cur_vfnptr) != hmil_iter->m_VfnPtrs.end()) - return false; - } - } - } - - // Tell it to store the pointer if it's not already active - if (hookman->m_VfnPtrs.empty()) - hookman->m_Func(HA_Register, &(*hookman)); - - CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(cur_vfnptr); - - if (vfnptr_iter == hookman->m_VfnPtrs.end()) - { - // Add a new one - CVfnPtr vfp(cur_vfnptr); - - // Alter vtable entry - if (!SetMemAccess(cur_vtptr, sizeof(void*) * (tmp.m_VtblIdx + 1), SH_MEM_READ | SH_MEM_WRITE)) - return false; - - *reinterpret_cast(cur_vfnptr) = *reinterpret_cast(hookman->m_HookfuncVfnptr); - - hookman->m_VfnPtrs.push_back(vfp); - - // Make vfnptr_iter point to the new element - vfnptr_iter = hookman->m_VfnPtrs.end(); - --vfnptr_iter; - - // Now that it is done, check whether we have to update any callclasses - ApplyCallClassPatches(adjustediface, tmp.m_VtblOffs, tmp.m_VtblIdx, vfp.m_OrigEntry); - } - - CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.find(adjustediface); - if (iface_iter == vfnptr_iter->m_Ifaces.end()) - { - // Add a new one - vfnptr_iter->m_Ifaces.push_back(CIface(adjustediface)); - - // Make iface_iter point to the new element - iface_iter = vfnptr_iter->m_Ifaces.end(); - --iface_iter; - } - - // Add the hook - HookInfo hookinfo; - hookinfo.handler = handler; - hookinfo.plug = plug; - hookinfo.paused = false; - hookinfo.thisptr_offs = thisptr_offs; - if (post) - iface_iter->m_PostHooks.m_List.push_back(hookinfo); - else - iface_iter->m_PreHooks.m_List.push_back(hookinfo); - - return true; - } - - bool CSourceHookImpl::RemoveHook(RemoveHookInfo info) - { - return RemoveHook(info.plug, info.iface, info.thisptr_offs, info.hookman, info.handler, info.post); - } - - bool CSourceHookImpl::RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post) - { - void *adjustediface = reinterpret_cast(reinterpret_cast(iface)+thisptr_offs); - CHookManagerInfo tmp; - if (myHookMan(HA_GetInfo, &tmp) != 0) - return false; - - // Find the hook manager and the hook - - HookManContList::iterator hmcl_iter = m_HookMans.find( - CHookManagerContainer::HMCI(tmp.m_Proto, tmp.m_VtblOffs, tmp.m_VtblIdx)); - if (hmcl_iter == m_HookMans.end() || hmcl_iter->empty()) - return false; - - CHookManagerContainer::iterator hookman = hmcl_iter->begin(); - - if (!ModuleInMemory(reinterpret_cast(adjustediface) + tmp.m_VtblOffs, - sizeof(void*) * (tmp.m_VtblIdx + 1))) - { - // The module the vtable was in is already unloaded. - hookman->m_VfnPtrs.clear(); - hookman->m_Func(HA_Unregister, NULL); - return true; - } - - void **cur_vtptr = *reinterpret_cast( - reinterpret_cast(adjustediface) + tmp.m_VtblOffs); - void *cur_vfnptr = reinterpret_cast(cur_vtptr + tmp.m_VtblIdx); - - CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.find(cur_vfnptr); - - if (vfnptr_iter == hookman->m_VfnPtrs.end()) - return false; - - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end();) - { - if (iface_iter->m_Ptr != adjustediface) - { - iface_iter++; - continue; - } - List &hooks = - post ? iface_iter->m_PostHooks.m_List : iface_iter->m_PreHooks.m_List; - - bool erase; - for (List::iterator hookiter = hooks.begin(); - hookiter != hooks.end(); ) - { - erase = hookiter->plug == plug && hookiter->handler->IsEqual(handler) && - hookiter->thisptr_offs == thisptr_offs; - if (erase) - { - hookiter->handler->DeleteThis(); // Make the _plugin_ delete the handler object - - // Move all iterators pointing at this - List::iterator oldhookiter = hookiter; - hookiter = hooks.erase(hookiter); - List::iterator newhookiter = hookiter; - --newhookiter; // The hook loop will ++ it then - CHookList::CIter *pItIter; - for (pItIter = iface_iter->m_PreHooks.m_UsedIters; pItIter; pItIter = pItIter->m_pNext) - if (pItIter->m_Iter == oldhookiter) - pItIter->m_Iter = newhookiter; - } - else - ++hookiter; - } - if (iface_iter->m_PostHooks.m_List.empty() && iface_iter->m_PreHooks.m_List.empty()) - { - // There are no hooks on this iface anymore... - for (HookLoopInfoStack::iterator hli_iter = m_HLIStack.begin(); - hli_iter != m_HLIStack.end(); ++hli_iter) - { - if (hli_iter->pCurIface == static_cast(&(*iface_iter))) - hli_iter->shouldContinue = false; - } - - iface_iter = vfnptr_iter->m_Ifaces.erase(iface_iter); - if (vfnptr_iter->m_Ifaces.empty()) - { - // No ifaces at all -> Deactivate the hook - *reinterpret_cast(vfnptr_iter->m_Ptr) = vfnptr_iter->m_OrigEntry; - - hookman->m_VfnPtrs.erase(vfnptr_iter); - - // Remove callclass patch - for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) - if (cciter->m_Ptr == adjustediface) - cciter->RemoveCallClassPatch(tmp.m_VtblOffs, tmp.m_VtblIdx); - - if (hookman->m_VfnPtrs.empty()) - { - // Unregister the hook manager - hookman->m_Func(HA_Unregister, NULL); - } - - // Don't try to continue looping through ifaces - // - the list is already invalid - return true; - } - } - else - ++iface_iter; - } - return true; - } - - GenericCallClass *CSourceHookImpl::GetCallClass(void *iface, size_t size) - { - for (Impl_CallClassList::iterator cciter = m_CallClasses.begin(); cciter != m_CallClasses.end(); ++cciter) - { - if (cciter->m_Ptr == iface && cciter->m_ObjSize == size) - { - ++cciter->m_RefCounter; - return &(*cciter); - } - } - - // Make a new one - - CCallClassImpl tmp(iface, size); - ApplyCallClassPatches(tmp); - m_CallClasses.push_back(tmp); - return &m_CallClasses.back(); - } - - void CSourceHookImpl::ReleaseCallClass(GenericCallClass *ptr) - { - Impl_CallClassList::iterator iter = m_CallClasses.find(ptr); - if (iter == m_CallClasses.end()) - return; - --iter->m_RefCounter; - if (iter->m_RefCounter < 1) - m_CallClasses.erase(iter); - } - - void CSourceHookImpl::ApplyCallClassPatches(CCallClassImpl &cc) - { - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hookman = hmcl_iter->begin(); - hookman != hmcl_iter->end(); ++hookman) - { - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookman->m_VfnPtrs.begin(); - vfnptr_iter != hookman->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter iface_iter = vfnptr_iter->m_Ifaces.begin(); - iface_iter != vfnptr_iter->m_Ifaces.end(); ++iface_iter) - { - if (iface_iter->m_Ptr >= cc.m_Ptr && - iface_iter->m_Ptr < (reinterpret_cast(cc.m_Ptr) + cc.m_ObjSize)) - { - cc.ApplyCallClassPatch(static_cast(reinterpret_cast(iface_iter->m_Ptr) - - reinterpret_cast(cc.m_Ptr)) + hookman->m_VtblOffs, - hookman->m_VtblIdx, vfnptr_iter->m_OrigEntry); - } - } - } - } - } - } - - void CSourceHookImpl::ApplyCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx, void *orig_entry) - { - for (Impl_CallClassList::iterator cc_iter = m_CallClasses.begin(); cc_iter != m_CallClasses.end(); - ++cc_iter) - { - if (ifaceptr >= cc_iter->m_Ptr && - ifaceptr < (reinterpret_cast(cc_iter->m_Ptr) + cc_iter->m_ObjSize)) - { - cc_iter->ApplyCallClassPatch(static_cast(reinterpret_cast(ifaceptr) - - reinterpret_cast(cc_iter->m_Ptr)) + vtbl_offs, vtbl_idx, orig_entry); - } - } - } - - void CSourceHookImpl::RemoveCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx) - { - for (Impl_CallClassList::iterator cc_iter = m_CallClasses.begin(); cc_iter != m_CallClasses.end(); - ++cc_iter) - { - if (ifaceptr >= cc_iter->m_Ptr && - ifaceptr < (reinterpret_cast(cc_iter->m_Ptr) + cc_iter->m_ObjSize)) - { - cc_iter->RemoveCallClassPatch(vtbl_offs, vtbl_idx); - } - } - } - - void CSourceHookImpl::SetPluginPaused(Plugin plug, bool paused) - { - // Go through all hook managers, all interfaces, and set the status of all hooks of this plugin to paused - for (HookManContList::iterator hmcl_iter = m_HookMans.begin(); - hmcl_iter != m_HookMans.end(); ++hmcl_iter) - { - for (CHookManagerContainer::iterator hookmaniter = hmcl_iter->begin(); - hookmaniter != hmcl_iter->end(); ++hookmaniter) - { - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = hookmaniter->m_VfnPtrs.begin(); - vfnptr_iter != hookmaniter->m_VfnPtrs.end(); ++vfnptr_iter) - { - for (CVfnPtr::IfaceListIter ifaceiter = vfnptr_iter->m_Ifaces.begin(); - ifaceiter != vfnptr_iter->m_Ifaces.end(); ++ifaceiter) - { - for (List::iterator hookiter = ifaceiter->m_PreHooks.m_List.begin(); - hookiter != ifaceiter->m_PreHooks.m_List.end(); ++hookiter) - if (plug == hookiter->plug) - hookiter->paused = paused; - - for (List::iterator hookiter = ifaceiter->m_PostHooks.m_List.begin(); - hookiter != ifaceiter->m_PostHooks.m_List.end(); ++hookiter) - if (plug == hookiter->plug) - hookiter->paused = paused; - } - } - } - } - } - void CSourceHookImpl::PausePlugin(Plugin plug) - { - SetPluginPaused(plug, true); - } - - void CSourceHookImpl::UnpausePlugin(Plugin plug) - { - SetPluginPaused(plug, false); - } - - void CSourceHookImpl::HookLoopBegin(IIface *pIface) - { - HookLoopInfo hli; - hli.pCurIface = pIface; - hli.shouldContinue = true; - hli.recall = HookLoopInfo::Recall_No; - - static_cast(pIface)->m_PreHooks.RQFlagReset(); - static_cast(pIface)->m_PostHooks.RQFlagReset(); - - m_HLIStack.push(hli); - } - - void CSourceHookImpl::HookLoopEnd() - { - // When in a post recall... make sure status is high enough so that it returns the orig ret. - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) - *m_HLIStack.front().pStatus = MRES_SUPERCEDE; // THAT'LL TEACH THEM! - m_HLIStack.pop(); - } - - void CSourceHookImpl::SetRes(META_RES res) - { - *m_HLIStack.front().pCurRes = res; - } - - META_RES CSourceHookImpl::GetPrevRes() - { - return *m_HLIStack.front().pPrevRes; - } - - META_RES CSourceHookImpl::GetStatus() - { - return *m_HLIStack.front().pStatus; - } - - const void *CSourceHookImpl::GetOrigRet() - { - // When in a post recall... return the orig ret of the previous hookloop. - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) - return m_HLIStack.second().pOrigRet; - - return m_HLIStack.front().pOrigRet; - } - - const void *CSourceHookImpl::GetOverrideRet() - { - // pOverrideRet is always set since recalls were introduced - // GetOverrideRetPtr was added; a function which always returns pOverrideRet - // so that RETURN_META_VALUE_NEWPARAMS can provide an override result - - // This means that we have to filter GetOverrideRet: - // If the status variable is < MRES_OVERRIDE, return NULL. - - return (*m_HLIStack.front().pStatus < MRES_OVERRIDE) ? - NULL : m_HLIStack.front().pOverrideRet; - } - - void *CSourceHookImpl::GetOverrideRetPtr() - { - // As described in the comment above: always return pOverrideRet - return m_HLIStack.front().pOverrideRet; - } - - void *CSourceHookImpl::GetIfacePtr() - { - return *m_HLIStack.front().pIfacePtrPtr; - } - - void CSourceHookImpl::SetCurResPtr(META_RES *mres) - { - m_HLIStack.front().pCurRes = mres; - } - - void CSourceHookImpl::SetPrevResPtr(META_RES *mres) - { - m_HLIStack.front().pPrevRes = mres; - - // If we're recalling, drag the previous mres value to the new hookfunc - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) - *mres = *m_HLIStack.second().pPrevRes; - } - - void CSourceHookImpl::SetStatusPtr(META_RES *mres) - { - m_HLIStack.front().pStatus = mres; - - // If we're recalling, drag the previous mres value to the new hookfunc - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) - *mres = *m_HLIStack.second().pStatus; - } - - void CSourceHookImpl::SetIfacePtrPtr(void **pp) - { - m_HLIStack.front().pIfacePtrPtr = pp; - } - - void CSourceHookImpl::SetOrigRetPtr(const void *ptr) - { - m_HLIStack.front().pOrigRet = ptr; - } - void CSourceHookImpl::SetOverrideRetPtr(void *ptr) - { - m_HLIStack.front().pOverrideRet = ptr; - } - - // New function which does all of the above + more :) - void *CSourceHookImpl::SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) - { - HookLoopInfo &hli = m_HLIStack.front(); - hli.pStatus = statusPtr; - hli.pPrevRes = prevResPtr; - hli.pCurRes = curResPtr; - hli.pIfacePtrPtr = ifacePtrPtr; - hli.pOrigRet = origRetPtr; - - // Handle some recall stuff - if (m_HLIStack.size() > 1 && m_HLIStack.second().recall) - { - HookLoopInfo &other = m_HLIStack.second(); - *statusPtr = *other.pStatus; - *prevResPtr = *other.pStatus; - - // When the status is low so there's no override return value and we're in a post recall, - // give it the orig return value as override return value. - if (*statusPtr < MRES_OVERRIDE && other.recall == HookLoopInfo::Recall_Post1) - hli.pOverrideRet = const_cast(other.pOrigRet); - else // Otherwise, transfer override ret normally - hli.pOverrideRet = other.pOverrideRet; - } - else - hli.pOverrideRet = overrideRetPtr; - - // Tell the hook func which override ret ptr to use - return hli.pOverrideRet; - } - - bool CSourceHookImpl::ShouldContinue() - { - // Post-recalls: - // The second element on the stack has recall set to Recall_Post1. - // This means that we want to skip this part and the original function calling thing, so - // we store the status mres value, set status to MRES_SUPERCEDE, and return false. - // We also set the recall flag to Recall_Post2, so the next time the thing calls us, we - // can return true (so that the thing goes into post hooks). - if (m_HLIStack.size() > 1) - { - if (m_HLIStack.second().recall == HookLoopInfo::Recall_Post1) - { - m_HLIStack.front().temporaryStatus = *m_HLIStack.front().pStatus; - *m_HLIStack.front().pStatus = MRES_SUPERCEDE; - m_HLIStack.second().recall = HookLoopInfo::Recall_Post2; - return false; - } - else if (m_HLIStack.second().recall == HookLoopInfo::Recall_Post2) - { - *m_HLIStack.front().pStatus = m_HLIStack.front().temporaryStatus; - return m_HLIStack.front().shouldContinue; - } - } - - // 16.01.2008: We used to return false for recalls here. - // This caused the hook funcs to think that the whole iface has been destroyed - // (the original purpose of shouldcontinue was to notify the hookfuncs that everything has been - // invalidated by RemoveHook) so they did not release their iterator. -> Leaks - // Now, GetIter sets the iterator to END so it still gets released but the hooks don't continue. - - // But: we have to return false in the post phase of pre recalls (ie. a pre hook made a recall). - if (m_HLIStack.front().recall == HookLoopInfo::Recall_Pre && - static_cast(m_HLIStack.front().pCurIface)->m_PreHooks.RelFlagGet()) - { - return false; - } - - return m_HLIStack.front().shouldContinue; - } - - void CSourceHookImpl::DoRecall() - { - if (!m_HLIStack.empty()) - { - // Also watch out for post recalls! Described at the beginning of sourcehook_impl.h - m_HLIStack.front().recall = - static_cast(m_HLIStack.front().pCurIface)->m_PostHooks.RQFlagGet() ? - HookLoopInfo::Recall_Post1 : HookLoopInfo::Recall_Pre; - - CHookList *mlist = static_cast(m_HLIStack.front().recall == HookLoopInfo::Recall_Pre ? - m_HLIStack.front().pCurIface->GetPreHooks() : m_HLIStack.front().pCurIface->GetPostHooks()); - mlist->m_Recall = true; - - // The hookfunc usually does this, but it won't have a chance to see it, - // so for recalls, we update status here if it's required - if (*m_HLIStack.front().pCurRes > *m_HLIStack.front().pStatus) - *m_HLIStack.front().pStatus = *m_HLIStack.front().pCurRes; - - } - } - - //////////////////////////// - // CCallClassImpl - //////////////////////////// - CSourceHookImpl::CCallClassImpl::CCallClassImpl(void *ptr, size_t size) - : m_Ptr(ptr), m_ObjSize(size), m_RefCounter(1) - { - } - CSourceHookImpl::CCallClassImpl::~CCallClassImpl() - { - } - - void *CSourceHookImpl::CCallClassImpl::GetThisPtr() - { - return m_Ptr; - } - void *CSourceHookImpl::CCallClassImpl::GetOrigFunc(int vtbloffs, int vtblidx) - { - OrigVTables::iterator iter = m_VT.find(vtbloffs); - if (iter != m_VT.end() && iter->val.size() > (size_t)vtblidx) - { - return iter->val[vtblidx]; - } - return NULL; - } - - void CSourceHookImpl::CCallClassImpl::ApplyCallClassPatch(int vtbl_offs, int vtbl_idx, void *orig_entry) - { - OrigFuncs &tmpvec = m_VT[vtbl_offs]; - if (tmpvec.size() <= (size_t)vtbl_idx) - tmpvec.resize(vtbl_idx+1, NULL); - tmpvec[vtbl_idx] = orig_entry; - } - void CSourceHookImpl::CCallClassImpl::RemoveCallClassPatch(int vtbl_offs, int vtbl_idx) - { - OrigVTables::iterator iter = m_VT.find(vtbl_offs); - if (iter != m_VT.end()) - { - if (iter->val.size() > (size_t)vtbl_idx) - { - iter->val[vtbl_idx] = 0; - - OrigFuncs &of = iter->val; - OrigFuncs::iterator lastused = of.end(); - for (OrigFuncs::iterator viter = of.begin(); viter != of.end(); ++viter) - { - if (*viter) - lastused = viter; - } - if (lastused == of.end()) - { - // No used element => Remove the whole vector - m_VT.erase(iter); - return; - } - of.resize(lastused - of.begin() + 1); - } - } - } - - //////////////////////////// - // CHookManagerInfo - //////////////////////////// - CSourceHookImpl::CHookManagerInfo::CHookManagerInfo() : m_HookManVersion(0) - { - } - CSourceHookImpl::CHookManagerInfo::~CHookManagerInfo() - { - } - - IVfnPtr *CSourceHookImpl::CHookManagerInfo::FindVfnPtr(void *vfnptr) - { - VfnPtrListIter iter = m_VfnPtrs.find(vfnptr); - return iter == m_VfnPtrs.end() ? NULL : &(*iter); - } - void CSourceHookImpl::CHookManagerInfo::SetInfo(int vtbl_offs, int vtbl_idx, const char *proto) - { - m_VtblOffs = vtbl_offs; - m_VtblIdx = vtbl_idx; - m_Proto = proto; - } - void CSourceHookImpl::CHookManagerInfo::SetHookfuncVfnptr(void *hookfunc_vfnptr) - { - m_HookfuncVfnptr = hookfunc_vfnptr; - } - void CSourceHookImpl::CHookManagerInfo::SetVersion(int version) - { - m_HookManVersion = version; - } - //////////////////////////// - // CVfnPtr - //////////////////////////// - - - // If you get a crash here, the ptr passed is invalid - // This usually means a SH_DECL_MANUALHOOK* with wrong thisptroffs/vtbloffs/vtblidx - CSourceHookImpl::CVfnPtr::CVfnPtr(void *ptr) : m_Ptr(ptr), m_OrigEntry(*reinterpret_cast(ptr)) - { - } - CSourceHookImpl::CVfnPtr::~CVfnPtr() - { - } - - void *CSourceHookImpl::CVfnPtr::GetVfnPtr() - { - return m_Ptr; - } - - void *CSourceHookImpl::CVfnPtr::GetOrigEntry() - { - return m_OrigEntry; - } - - IIface *CSourceHookImpl::CVfnPtr::FindIface(void *ptr) - { - IfaceListIter iter = m_Ifaces.find(ptr); - return iter == m_Ifaces.end() ? NULL : &(*iter); - } - - //////////////////////////// - // CIface - //////////////////////////// - CSourceHookImpl::CIface::CIface(void *ptr) : m_Ptr(ptr) - { - } - CSourceHookImpl::CIface::~CIface() - { - } - - void *CSourceHookImpl::CIface::GetPtr() - { - return m_Ptr; - } - - IHookList *CSourceHookImpl::CIface::GetPreHooks() - { - return &m_PreHooks; - } - IHookList *CSourceHookImpl::CIface::GetPostHooks() - { - return &m_PostHooks; - } - - //////////////////////////// - // CHookList - //////////////////////////// - - CSourceHookImpl::CHookList::CHookList() : m_FreeIters(NULL), m_UsedIters(NULL), - m_Recall(false) - { - } - CSourceHookImpl::CHookList::CHookList(const CHookList &other) : m_List(other.m_List), - m_FreeIters(NULL), m_UsedIters(NULL), m_Recall(false) - { - } - - CSourceHookImpl::CHookList::~CHookList() - { - while (m_FreeIters) - { - CIter *iter = m_FreeIters->m_pNext; - delete m_FreeIters; - m_FreeIters = iter; - } - while (m_UsedIters) - { - CIter *iter = m_UsedIters->m_pNext; - delete m_UsedIters; - m_UsedIters = iter; - } - } - IHookList::IIter *CSourceHookImpl::CHookList::GetIter() - { - m_RQFlag = true; - - CIter *ret; - if (m_FreeIters) - { - ret = m_FreeIters; - m_FreeIters = ret->m_pNext; - ret->GoToBegin(); - } - else - { - ret = new CIter(this); - } - - // Muuuh, if we're recalling, it shall be a copy of the last iterator, incremented by one - if (m_Recall && m_UsedIters) - { - ret->Set(m_UsedIters); // m_UsedIters is the last returned and not released iterator - ret->Next(); // Use next instead of directly incrementing its m_Iter: - // skips paused plugins - - // Set the last iterator to END! - m_UsedIters->GoToEnd(); - } - - ret->m_pNext = m_UsedIters; - ret->m_pPrev = NULL; - if (m_UsedIters) - m_UsedIters->m_pPrev = ret; - m_UsedIters = ret; - - m_Recall = false; - - return ret; - } - void CSourceHookImpl::CHookList::ReleaseIter(IIter *pIter) - { - m_RelFlag = true; - - CIter *pIter2 = static_cast(pIter); - - // Unlink from m_UsedIters - - if (pIter2->m_pNext) - pIter2->m_pNext->m_pPrev = pIter2->m_pPrev; - if (pIter2->m_pPrev) - pIter2->m_pPrev->m_pNext = pIter2->m_pNext; - if (pIter2 == m_UsedIters) - m_UsedIters = m_UsedIters->m_pNext; - - // Link to m_FreeIters - - pIter2->m_pNext = m_FreeIters; - - m_FreeIters = pIter2; - - // Reset recall state. - m_Recall = false; - } - - CSourceHookImpl::CHookList::CIter::CIter(CHookList *pList) : m_pList(pList), m_pNext(NULL) - { - GoToBegin(); - } - CSourceHookImpl::CHookList::CIter::~CIter() - { - } - - void CSourceHookImpl::CHookList::CIter::Set(CIter *pOther) - { - m_Iter = pOther->m_Iter; - } - - void CSourceHookImpl::CHookList::CIter::GoToBegin() - { - m_Iter = m_pList->m_List.begin(); - SkipPaused(); - } - - void CSourceHookImpl::CHookList::CIter::GoToEnd() - { - m_Iter = m_pList->m_List.end(); - } - - bool CSourceHookImpl::CHookList::CIter::End() - { - if (!m_pList) - return false; - return m_Iter == m_pList->m_List.end(); - } - void CSourceHookImpl::CHookList::CIter::Next() - { - if (!m_pList || m_Iter == m_pList->m_List.end()) - return; - ++m_Iter; - SkipPaused(); - } - void CSourceHookImpl::CHookList::CIter::Clear() - { - m_pList = NULL; - } - void CSourceHookImpl::CHookList::CIter::SkipPaused() - { - while (m_Iter != m_pList->m_List.end() && m_Iter->paused) - ++m_Iter; - } - - ISHDelegate *CSourceHookImpl::CHookList::CIter::Handler() - { - return m_Iter->handler; - } - int CSourceHookImpl::CHookList::CIter::ThisPtrOffs() - { - return m_Iter->thisptr_offs; - } - - ////////////////////////////////////////////////////////////////////////// - // CProto - ////////////////////////////////////////////////////////////////////////// - char *CSourceHookImpl::CProto::DupProto(const char *p) - { - char *newproto; - if (*p) - { - size_t len = strlen(p); - newproto = new char[len+1]; - memcpy(newproto, p, len+1); - } else { - const ProtoInfo *pi1 = reinterpret_cast(p); - int *ar_copy = new int[pi1->numOfParams + 1]; - for (int i = 0; i <= pi1->numOfParams; i++) - ar_copy[i] = pi1->params[i]; - ProtoInfo *copy = new ProtoInfo(pi1->retTypeSize, pi1->numOfParams, ar_copy); - newproto = reinterpret_cast(copy); - } - - return newproto; - } - - void CSourceHookImpl::CProto::FreeProto(char *prot) - { - if (*prot) - { - delete [] prot; - } else { - ProtoInfo *pi = reinterpret_cast(prot); - delete [] pi->params; - delete pi; - } - } - - bool CSourceHookImpl::CProto::Equal(const char *p1, const char *p2) - { - if (*p1 && *p2) // Case1: Both old - { - // As in old versions - return strcmp(p1, p2) == 0; - } - else if (!*p1 && !*p2) // Case2: Both new - { - const ProtoInfo *pi1 = reinterpret_cast(p1); - const ProtoInfo *pi2 = reinterpret_cast(p2); - - if (pi1->retTypeSize == pi2->retTypeSize && - pi1->numOfParams == pi2->numOfParams) - { - // params[0] is 0 for "normal" functions and -1 for vararg functions - // params[1] is size of first parameter - // params[2] is size of second parameter ... - for (int i = 0; i <= pi1->numOfParams; ++i) - { - if (pi1->params[i] != pi2->params[i]) - return false; - } - return true; - } - else - { - return false; - } - } - else // Case3: Mixed old/new - { - // Trust the user - return true; - } - } - - - ////////////////////////////////////////////////////////////////////////// - // CHookManagerContainer - ////////////////////////////////////////////////////////////////////////// - void CSourceHookImpl::CHookManagerContainer::AddHookManager(Plugin plug, const CHookManagerInfo &hookman) - { - iterator iter; - // Check whether such a hook manager already exists; if yes, ignore. - for (iter = begin(); iter != end(); ++iter) - { - if (iter->m_Plug == plug && iter->m_Func == hookman.m_Func) - return; - } - - // It doesn't -> add it. Add it to the end of its version group. - for (iter = begin(); iter != end(); ++iter) - { - if (iter->m_HookManVersion < hookman.m_HookManVersion) - break; - } - - bool isBeginning = iter == begin(); - - insert(iter, hookman); - - // If we inserted it at the beginning and if the dam breaks open many years too soon - // and if there is more than one hookman and if the second one isn't empty, transfer - // hooks from second to first - - if (isBeginning && size() > 1) - { - iter = begin(); - iterator second = iter; - ++second; - - if (!second->m_VfnPtrs.empty()) - { - // Move the vfnptrs from the old hook manager to the new one - iter->m_VfnPtrs = second->m_VfnPtrs; - second->m_VfnPtrs.clear(); - - // Unregister the old one, register the new one - second->m_Func(HA_Unregister, NULL); - iter->m_Func(HA_Register, &(*iter)); - - // Go through all vfnptrs in this hookman and patch them to point to the new manager's handler! - // or whatever - for (CHookManagerInfo::VfnPtrListIter vfnptr_iter = iter->m_VfnPtrs.begin(); - vfnptr_iter != iter->m_VfnPtrs.end(); ++vfnptr_iter) - { - // And DEREFERENCE newHookMan->m_HookfuncVfnptr! - // otherwise it will be executing the vtable... had to find out the hard way - *reinterpret_cast(vfnptr_iter->m_Ptr) = *reinterpret_cast(iter->m_HookfuncVfnptr); - } - } - } - } -} diff --git a/sourcehook/sourcehook.h b/sourcehook/sourcehook.h deleted file mode 100644 index 49e6813..0000000 --- a/sourcehook/sourcehook.h +++ /dev/null @@ -1,6104 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -/** -* @file sourcehook.h -* @brief Contains the public SourceHook API -*/ - -#ifndef __SOURCEHOOK_H__ -#define __SOURCEHOOK_H__ - -// Interface revisions: -// 1 - Initial revision -// 2 - Changed to virtual functions for iterators and all queries -// 3 - Added "hook loop status variable" -// 4 - Reentrant -#define SH_IFACE_VERSION 4 -#define SH_IMPL_VERSION 3 - -// Hookman version: -// 1 - Support for recalls, performance optimisations -#define SH_HOOKMAN_VERSION 1 - -// The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook -// It's used in various macros -#ifndef SH_GLOB_SHPTR -#define SH_GLOB_SHPTR g_SHPtr -#endif - -// Used to identify the current plugin -#ifndef SH_GLOB_PLUGPTR -#define SH_GLOB_PLUGPTR g_PLID -#endif - -#ifdef SH_DEBUG -# include -# include - -# define SH_ASSERT(x, info) \ - do { \ - if (!(x)) \ - { \ - printf("SOURCEHOOK DEBUG ASSERTION FAILED: %s:%u(%s): %s: ", __FILE__, __LINE__, __FUNCTION__, #x); \ - printf info; \ - putchar('\n'); \ - abort(); \ - } \ - } while(0) - -#else -# define SH_ASSERT(x, info) -#endif - -// System -#define SH_SYS_WIN32 1 -#define SH_SYS_LINUX 2 - -#ifdef _WIN32 -# define SH_SYS SH_SYS_WIN32 -#elif defined __linux__ -# define SH_SYS SH_SYS_LINUX -#else -# error Unsupported system -#endif - -// Compiler -#define SH_COMP_GCC 1 -#define SH_COMP_MSVC 2 - -#ifdef _MSC_VER -# define SH_COMP SH_COMP_MSVC -#elif defined __GNUC__ -# define SH_COMP SH_COMP_GCC -#else -# error Unsupported compiler -#endif - -#if SH_COMP==SH_COMP_MSVC -# define vsnprintf _vsnprintf -#endif - -#if SH_SYS != SH_SYS_WIN32 -# include -#endif - -#define SH_PTRSIZE sizeof(void*) - -#include "FastDelegate.h" -#include "sh_memfuncinfo.h" - -// Good old metamod! - -// Flags returned by a plugin's api function. -// NOTE: order is crucial, as greater/less comparisons are made. -enum META_RES -{ - MRES_IGNORED=0, // plugin didn't take any action - MRES_HANDLED, // plugin did something, but real function should still be called - MRES_OVERRIDE, // call real function, but use my return value - MRES_SUPERCEDE // skip real function; use my return value -}; - - -namespace SourceHook -{ - /** - * @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers - */ - const int STRBUF_LEN=4096; - - /** - * @brief An empty class. No inheritance used. Used for original-function-call hacks - */ - class EmptyClass - { - }; - - /** - * @brief Implicit cast. - */ - template - inline Out implicit_cast(In input) - { - return input; - } - - /** - * @brief A plugin typedef - * - * SourceHook doesn't really care what this is. As long as the ==, != and = operators work on it and every - * plugin has a unique identifier, everything is ok. - * It should also be possible to set it to 0. - */ - typedef int Plugin; - - struct ProtoInfo - { - ProtoInfo(int rtsz, int nop, const int *p) : beginningNull(0), retTypeSize(rtsz), numOfParams(nop), params(p) - { - } - int beginningNull; //!< To distinguish from old protos (which never begin with 0) - int retTypeSize; //!< 0 if void - int numOfParams; //!< number of parameters - const int *params; //!< params[0]=0 (or -1 for vararg), params[1]=size of first param, ... - }; - - /** - * @brief Specifies the actions for hook managers - */ - enum HookManagerAction - { - HA_GetInfo = 0, //!< Store info about the hook manager - HA_Register, //!< Save the IHookManagerInfo pointer for future reference - HA_Unregister //!< Clear the saved pointer - }; - - struct IHookManagerInfo; - - /** - * @brief Pointer to hook manager interface function - * - * A "hook manager" is a the only thing that knows the actual protoype of the function at compile time. - * - * @param ha What the hook manager should do - * @param hi A pointer to IHookManagerInfo - */ - typedef int (*HookManagerPubFunc)(HookManagerAction ha, IHookManagerInfo *hi); - - class ISHDelegate - { - public: - virtual void DeleteThis() = 0; // Ugly, I know - virtual bool IsEqual(ISHDelegate *other) = 0; - }; - - template class CSHDelegate : public ISHDelegate - { - T m_Deleg; - public: - CSHDelegate(T deleg) : m_Deleg(deleg) - { - } - - CSHDelegate(const CSHDelegate &other) : m_Deleg(other.m_Deleg) - { - } - - void DeleteThis() - { - delete this; - } - - bool IsEqual(ISHDelegate *other) - { - return static_cast* >(other)->GetDeleg() == GetDeleg(); - } - - T &GetDeleg() - { - return m_Deleg; - } - }; - - struct IHookList - { - struct IIter - { - virtual bool End() = 0; - virtual void Next() = 0; - virtual ISHDelegate *Handler() = 0; - virtual int ThisPtrOffs() = 0; - }; - virtual IIter *GetIter() = 0; - virtual void ReleaseIter(IIter *pIter) = 0; - }; - - struct IIface - { - virtual void *GetPtr() = 0; - virtual IHookList *GetPreHooks() = 0; - virtual IHookList *GetPostHooks() = 0; - }; - - struct IVfnPtr - { - virtual void *GetVfnPtr() = 0; - virtual void *GetOrigEntry() = 0; - - virtual IIface *FindIface(void *ptr) = 0; - }; - - struct IHookManagerInfo - { - virtual IVfnPtr *FindVfnPtr(void *vfnptr) = 0; - - virtual void SetInfo(int vtbloffs, int vtblidx, const char *proto) = 0; - virtual void SetHookfuncVfnptr(void *hookfunc_vfnptr) = 0; - - // Added 23.12.2005 (yup! I'm coding RIGHT BEFORE CHRISTMAS!) - // If the hookman doesn't set this, it defaults 0 - // SourceHook prefers hookmans with higher version numbers - virtual void SetVersion(int version) = 0; - }; - - class AutoHookIter - { - IHookList *m_pList; - IHookList::IIter *m_pIter; - public: - AutoHookIter(IHookList *pList) - : m_pList(pList), m_pIter(pList->GetIter()) - { - } - - ~AutoHookIter() - { - if (m_pList) - m_pList->ReleaseIter(m_pIter); - } - - bool End() - { - return m_pIter->End(); - } - - void Next() - { - m_pIter->Next(); - } - - ISHDelegate *Handler() - { - return m_pIter->Handler(); - } - - int ThisPtrOffs() - { - return m_pIter->ThisPtrOffs(); - } - - void SetToZero() - { - m_pList = 0; - } - }; - - template struct CallClass - { - virtual B *GetThisPtr() = 0; - virtual void *GetOrigFunc(int vtbloffs, int vtblidx) = 0; - }; - - typedef CallClass GenericCallClass; - typedef CallClass ManualCallClass; - - // 09.08.2008 (6 AM, I just woke up, the others are still sleeping so i finally can use this notebook !!) - // - Today is an important day. - // I'm adding support for functions which return references. - - // How it works: - // SH_SETUPCALLS doesn't use plain rettype to store the temporary return values (plugin ret, orig ret, - // override ret) anymore; instead, it uses SourceHook::ReferenceCarrier::type - // this is typedefed to the original rettype normally, but if the rettype is a reference, it's a special class - // which stores the reference as a pointer, and implements constructors, operator= and a conversion operator. - // special cases were needed for getoverrideret / getorigret; these are implemented through the - // SourceHook::MacroRefHelpers structs. - // Furthermore, SetOverrideRet had to be changed a bit; see SourceHook::OverrideFunctor somewhere down in this file. - template struct ReferenceCarrier - { - typedef T type; - }; - - template struct ReferenceCarrier - { - class type - { - T *m_StoredRef; - public: - type() : m_StoredRef(NULL) - { - } - type(T& ref) : m_StoredRef(&ref) - { - } - - T& operator= (T& ref) - { - m_StoredRef = &ref; - return ref; - } - - operator T& () const - { - return *m_StoredRef; - } - }; - }; - - /** - * @brief The main SourceHook interface - */ - class ISourceHook - { - public: - /** - * @brief Return interface version - */ - virtual int GetIfaceVersion() = 0; - - /** - * @brief Return implementation version - */ - virtual int GetImplVersion() = 0; - - /** - * @brief Add a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Removes a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - virtual bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, - ISHDelegate *handler, bool post) = 0; - - /** - * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins - * - * @param plug The unique identifier of the plugin in question - */ - virtual bool IsPluginInUse(Plugin plug) = 0; - - /** - * @brief Return a pointer to a callclass. Generate a new one if required. - * - * @param iface The interface pointer - * @param size Size of the class instance - */ - virtual GenericCallClass *GetCallClass(void *iface, size_t size) = 0; - - /** - * @brief Release a callclass - * - * @param ptr Pointer to the callclass - */ - virtual void ReleaseCallClass(GenericCallClass *ptr) = 0; - - virtual void SetRes(META_RES res) = 0; //!< Sets the meta result - virtual META_RES GetPrevRes() = 0; //!< Gets the meta result of the - //!< previously calledhandler - virtual META_RES GetStatus() = 0; //!< Gets the highest meta result - virtual const void *GetOrigRet() = 0; //!< Gets the original result. - //!< If not in post function, undefined - virtual const void *GetOverrideRet() = 0; //!< Gets the override result. - //!< If none is specified, NULL - virtual void *GetIfacePtr() = 0; //!< Gets the interface pointer - ////////////////////////////////////////////////////////////////////////// - // For hook managers - virtual void HookLoopBegin(IIface *pIface) = 0; //!< Should be called when a hook loop begins - virtual void HookLoopEnd() = 0; //!< Should be called when a hook loop exits - virtual void SetCurResPtr(META_RES *mres) = 0; //!< Sets pointer to the current meta result - virtual void SetPrevResPtr(META_RES *mres) = 0; //!< Sets pointer to previous meta result - virtual void SetStatusPtr(META_RES *mres) = 0; //!< Sets pointer to the status variable - virtual void SetIfacePtrPtr(void **pp) = 0; //!< Sets pointer to the interface this pointer - virtual void SetOrigRetPtr(const void *ptr) = 0; //!< Sets the original return pointer - virtual void SetOverrideRetPtr(void *ptr) = 0; //!< Sets the override result pointer - virtual bool ShouldContinue() = 0; //!< Returns false if the hook loop should exit - - /** - * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. - * - * @param plug The owner of the hook manager - * @param pubFunc The hook manager's info function - */ - virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc) = 0; - - virtual void DoRecall() = 0; //!< Initiates a recall sequence - /* - HOW RECALLS WORK: - - The problem: - Users want the ability to change parameters of the called function - from inside their handler. - The solution: - 1) Mark as "recall" - 2) Recall the function - 3) => SH's hook func gets called: - 4) The first iterator points at the first hook the last hookfunc didn't execute yet - 5) does all iteration and returns normally - 6) The user's handler returns immediately - 7) The hook func returns immediately as well - - Also note that the recalled hookfunc starts with the status the recalling hookfunc - ended with. The last handler (doing the recall) is also able to specify its own - META_RES. - */ - - virtual void *GetOverrideRetPtr() = 0; //!< Returns the pointer set by SetOverrideRetPtr - - /** - * @brief Set up the hook loop. Equivalent to calling: - * SetStatusPtr, SetPrevResPtr, SetCurResPtr, SetIfacePtrPtr, SetOrigRetPtr, Get/SetOverrideRetPtr - * - * @param statusPtr pointer to status variable - * @param prevResPtr pointer to previous result variable - * @param curResPtr pointer to current result variable - * @param ifacePtrPtr pointer to interface this pointer variable - * @param origRetPr pointer to original return value variable. NULL for void funcs - * @param overrideRetPtr pointer to override return value variable. NULL for void funcs - * - * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr - * when the hook func is being called as part of a recall - */ - virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr) = 0; - - //!< - }; - - // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: - // These have to be able to return references. If T is a reference, the pointers returned - // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. - template struct MacroRefHelpers - { - inline static const T* GetOrigRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOrigRet()); - } - inline static const T* GetOverrideRet(ISourceHook *shptr) - { - return reinterpret_cast(shptr->GetOverrideRet()); - } - }; - - template struct MacroRefHelpers - { - inline static T* GetOrigRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOrigRet()); - return &ref; - } - inline static T* GetOverrideRet(ISourceHook *shptr) - { - T &ref = *reinterpret_cast::type *>(shptr->GetOverrideRet()); - return &ref; - } - }; -} - -/************************************************************************/ -/* High level interface */ -/************************************************************************/ -#define META_RESULT_STATUS SH_GLOB_SHPTR->GetStatus() -#define META_RESULT_PREVIOUS SH_GLOB_SHPTR->GetPrevRes() -#define META_RESULT_ORIG_RET(type) *SourceHook::MacroRefHelpers::GetOrigRet(SH_GLOB_SHPTR) -#define META_RESULT_OVERRIDE_RET(type) *SourceHook::MacroRefHelpers::GetOverrideRet(SH_GLOB_SHPTR) -#define META_IFACEPTR(type) reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()) - -#define SET_META_RESULT(result) SH_GLOB_SHPTR->SetRes(result) -#define RETURN_META(result) do { SET_META_RESULT(result); return; } while(0) -#define RETURN_META_VALUE(result, value) do { SET_META_RESULT(result); return (value); } while(0) - -// If a hook on a function which returns a reference does not want to specify a return value, -// it can use this macro. -// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) - -// only call these from the hook handlers directly! -// :TODO: enforce it ? - -// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? -// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE - -// SourceHook::SetOverrideRet is defined later. -#define RETURN_META_NEWPARAMS(result, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_NEWPARAMS(result, value, memfuncptr, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* meh, set the override result here because we don't get a chance to return */ \ - /* before continuing the hook loop through the recall */ \ - SourceHook::SetOverrideResult(memfuncptr)(SH_GLOB_SHPTR, value); \ - } \ - RETURN_META_VALUE(MRES_SUPERCEDE, \ - (SourceHook::RecallGetIface(SH_GLOB_SHPTR, memfuncptr)->*(memfuncptr)) newparams); \ - } while (0) - -// :TODO: thisptroffs in MNEWPARAMS ?? - -#if SH_COMP == SH_COMP_MSVC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - void *addr; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; - -#elif SH_COMP == SH_COMP_GCC - -#define SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname) \ - union \ - { \ - SH_MFHCls(hookname)::ECMFP mfp; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - SourceHook::EmptyClass *thisptr = reinterpret_cast(SH_GLOB_SHPTR->GetIfacePtr()); \ - u.s.addr = (*reinterpret_cast(reinterpret_cast(thisptr) + SH_MFHCls(hookname)::ms_MFI.vtbloffs))[ \ - SH_MFHCls(hookname)::ms_MFI.vtblindex]; \ - u.s.adjustor = 0; - -#endif - -#define RETURN_META_MNEWPARAMS(result, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - (thisptr->*(u.mfp)) newparams; \ - RETURN_META(MRES_SUPERCEDE); \ - } while (0) - -#define RETURN_META_VALUE_MNEWPARAMS(result, value, hookname, newparams) \ - do { \ - SET_META_RESULT(result); \ - SH_GLOB_SHPTR->DoRecall(); \ - if ((result) >= MRES_OVERRIDE) \ - { \ - /* see RETURN_META_VALUE_NEWPARAMS */ \ - SourceHook::SetOverrideResult(SH_GLOB_SHPTR, value); \ - } \ - SOUREHOOK__MNEWPARAMS_PREPAREMFP(hookname); \ - RETURN_META_VALUE(MRES_SUPERCEDE, (thisptr->*(u.mfp)) newparams); \ - } while (0) - -/** -* @brief Get/generate callclass for an interface pointer -* -* @param ifaceptr The interface pointer -*/ -template -inline SourceHook::CallClass *SH_GET_CALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), sizeof(ifacetype))); -} - -template -inline SourceHook::CallClass *SH_GET_MCALLCLASS_R(SourceHook::ISourceHook *shptr, ifacetype *ptr, int ifacesize) -{ - return reinterpret_cast*>( - shptr->GetCallClass(reinterpret_cast(ptr), ifacesize)); -} - -template -inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::CallClass *ptr) -{ - shptr->ReleaseCallClass(reinterpret_cast(ptr)); -} - -#define SH_MANUALHOOK_RECONFIGURE(hookname, pvtblindex, pvtbloffs, pthisptroffs) \ - do { \ - SH_GLOB_SHPTR->RemoveHookManager(SH_GLOB_PLUGPTR, SH_MFHCls(hookname)::HookManPubFunc); \ - SH_MFHCls(hookname)::ms_MFI.thisptroffs = pthisptroffs; \ - SH_MFHCls(hookname)::ms_MFI.vtblindex = pvtblindex; \ - SH_MFHCls(hookname)::ms_MFI.vtbloffs = pvtbloffs; \ - } while (0) - -#define SH_GET_CALLCLASS(ptr) SH_GET_CALLCLASS_R(SH_GLOB_SHPTR, ptr) -#define SH_GET_MCALLCLASS(ptr, size) SH_GET_MCALLCLASS_R(SH_GLOB_SHPTR, reinterpret_cast(ptr), size) -#define SH_RELEASE_CALLCLASS(ptr) SH_RELEASE_CALLCLASS_R(SH_GLOB_SHPTR, ptr) - -#define SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHAdd##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_ADD_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - -#define SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, handler, post) \ - __SourceHook_FHRemove##ifacetype##ifacefunc((void*)SourceHook::implicit_cast(ifaceptr), \ - post, handler) -#define SH_REMOVE_HOOK_STATICFUNC(ifacetype, ifacefunc, ifaceptr, handler, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_HOOK_MEMFUNC(ifacetype, ifacefunc, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_HOOK(ifacetype, ifacefunc, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - - -#define SH_ADD_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMAdd##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_ADD_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_ADD_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_ADD_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - -#define SH_REMOVE_MANUALHOOK(hookname, ifaceptr, handler, post) \ - __SourceHook_FHMRemove##hookname(reinterpret_cast(ifaceptr), post, handler) -#define SH_REMOVE_MANUALHOOK_STATICFUNC(hookname, ifaceptr, handler, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler), post) -#define SH_REMOVE_MANUALHOOK_MEMFUNC(hookname, ifaceptr, handler_inst, handler_func, post) \ - SH_REMOVE_MANUALHOOK(hookname, ifaceptr, fastdelegate::MakeDelegate(handler_inst, handler_func), post) - - -#define SH_NOATTRIB - - - - -#if SH_COMP == SH_COMP_MSVC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; -#elif SH_COMP == SH_COMP_GCC -# define SH_SETUP_MFP(mfp) \ - reinterpret_cast(&mfp)[0] = vfnptr_origentry; \ - reinterpret_cast(&mfp)[1] = 0; -#else -# error Not supported yet. -#endif - -////////////////////////////////////////////////////////////////////////// -#define SH_FHCls(ift, iff, ov) __SourceHook_FHCls_##ift##iff##ov -#define SH_MFHCls(hookname) __SourceHook_MFHCls_##hookname - -#define SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) \ - SH_FHCls(ifacetype,ifacefunc,overload)() \ - { \ - GetFuncInfo(funcptr, ms_MFI); \ - } \ - \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - GetFuncInfo(funcptr, ms_MFI); \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_FHCls(ifacetype,ifacefunc,overload)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -// It has to be possible to use the macros in namespaces -// -> So we need to access and extend the global SourceHook namespace -// We use a namespace alias for this -#define SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, funcptr) \ - struct SH_FHCls(ifacetype,ifacefunc,overload) \ - { \ - static SH_FHCls(ifacetype,ifacefunc,overload) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - SHINT_MAKE_HOOKMANPUBFUNC(ifacetype, ifacefunc, overload, funcptr) - -#define SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, funcptr) \ - }; \ - SH_FHCls(ifacetype,ifacefunc,overload) SH_FHCls(ifacetype,ifacefunc,overload)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_FHCls(ifacetype,ifacefunc,overload)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_FHCls(ifacetype,ifacefunc,overload)::ms_HI; \ - bool __SourceHook_FHAdd##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0 || !mfi.isVirtual) \ - return false; /* No non-virtual functions / virtual inheritance supported */ \ - \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, \ - new CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHRemove##ifacetype##ifacefunc(void *iface, bool post, \ - SH_FHCls(ifacetype,ifacefunc,overload)::FD handler) \ - { \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(funcptr, mfi); \ - if (mfi.thisptroffs < 0) \ - return false; /* No virtual inheritance supported */ \ - \ - CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, mfi.thisptroffs, \ - SH_FHCls(ifacetype,ifacefunc,overload)::HookManPubFunc, &tmp, post); \ - } \ - -#define SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - struct SH_MFHCls(hookname) \ - { \ - static SH_MFHCls(hookname) ms_Inst; \ - static ::SourceHook::MemFuncInfo ms_MFI; \ - static ::SourceHook::IHookManagerInfo *ms_HI; \ - static ::SourceHook::ProtoInfo ms_Proto; \ - \ - SH_MFHCls(hookname)() \ - { \ - ms_MFI.isVirtual = true; \ - ms_MFI.thisptroffs = pthisptroffs; \ - ms_MFI.vtblindex = pvtblidx; \ - ms_MFI.vtbloffs = pvtbloffs; \ - } \ - static int HookManPubFunc(::SourceHook::HookManagerAction action, ::SourceHook::IHookManagerInfo *param) \ - { \ - using namespace ::SourceHook; \ - /* we don't set ms_MFI here because manual hookmans can be reconfigured */ \ - /* :FIXME: possible problem: someone adding a hook from a constructor of a global entity */ \ - /* which is construced before SH_MFHCls(hookname)() gets called? */ \ - /* Verify interface version */ \ - if (SH_GLOB_SHPTR->GetIfaceVersion() != SH_IFACE_VERSION) \ - return 1; \ - \ - if (action == HA_GetInfo) \ - { \ - param->SetVersion(SH_HOOKMAN_VERSION); \ - param->SetInfo(ms_MFI.vtbloffs, ms_MFI.vtblindex, \ - reinterpret_cast(&ms_Proto)); \ - \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(&SH_MFHCls(hookname)::Func, mfi); \ - param->SetHookfuncVfnptr( \ - reinterpret_cast(reinterpret_cast(&ms_Inst) + mfi.vtbloffs)[mfi.vtblindex]); \ - return 0; \ - } \ - else if (action == HA_Register) \ - { \ - ms_HI = param; \ - return 0; \ - } \ - else if (action == HA_Unregister) \ - { \ - ms_HI = NULL; \ - return 0; \ - } \ - else \ - return 1; \ - } - -#define SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, pvtbloffs, pvtblidx, pthisptroffs) \ - }; \ - SH_MFHCls(hookname) SH_MFHCls(hookname)::ms_Inst; \ - ::SourceHook::MemFuncInfo SH_MFHCls(hookname)::ms_MFI; \ - ::SourceHook::IHookManagerInfo *SH_MFHCls(hookname)::ms_HI; \ - bool __SourceHook_FHMAdd##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - return SH_GLOB_SHPTR->AddHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, \ - new ::SourceHook::CSHDelegate(handler), post); \ - } \ - bool __SourceHook_FHMRemove##hookname(void *iface, bool post, \ - SH_MFHCls(hookname)::FD handler) \ - { \ - ::SourceHook::CSHDelegate tmp(handler); \ - return SH_GLOB_SHPTR->RemoveHook(SH_GLOB_PLUGPTR, iface, pthisptroffs, \ - SH_MFHCls(hookname)::HookManPubFunc, &tmp, post); \ - } \ - - -#define SH_SETUPCALLS(rettype, paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - return (reinterpret_cast(this)->*mfp)params; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - typedef ReferenceCarrier::type my_rettype; \ - my_rettype orig_ret; \ - my_rettype override_ret; \ - my_rettype plugin_ret; \ - void* ifptr; \ - my_rettype *pOverrideRet = reinterpret_cast(SH_GLOB_SHPTR->SetupHookLoop( \ - &status, &prev_res, &cur_res, &ifptr, &orig_ret, &override_ret)); - -#define SH_CALL_HOOKS(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - plugin_ret = reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (cur_res >= MRES_OVERRIDE) \ - *pOverrideRet = plugin_ret; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG(rettype, paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - rettype (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - orig_ret = (reinterpret_cast(this)->*mfp)params; \ - } \ - else \ - orig_ret = override_ret; \ - -#define SH_RETURN() \ - SH_GLOB_SHPTR->HookLoopEnd(); \ - return status >= MRES_OVERRIDE ? *pOverrideRet : orig_ret; - -#define SH_HANDLEFUNC(paramtypes, params, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params) \ - SH_CALL_HOOKS(pre, params) \ - SH_CALL_ORIG(rettype, paramtypes, params) \ - SH_CALL_HOOKS(post, params) \ - SH_RETURN() - -////////////////////////////////////////////////////////////////////////// -#define SH_SETUPCALLS_void(paramtypes, params) \ - /* 1) Find the vfnptr */ \ - using namespace ::SourceHook; \ - void *ourvfnptr = reinterpret_cast( \ - *reinterpret_cast(reinterpret_cast(this) + ms_MFI.vtbloffs) + ms_MFI.vtblindex); \ - IVfnPtr *vfnptr = ms_HI->FindVfnPtr(ourvfnptr); \ - SH_ASSERT(vfnptr, ("Called with vfnptr 0x%p which couldn't be found in the list", ourvfnptr)); \ - \ - void *vfnptr_origentry = vfnptr->GetOrigEntry(); \ - /* ... and the iface */ \ - IIface *ifinfo = vfnptr->FindIface(reinterpret_cast(this)); \ - if (!ifinfo) \ - { \ - /* The iface info was not found. Redirect the call to the original function. */ \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - return; \ - } \ - /* 2) Declare some vars and set it up */ \ - SH_GLOB_SHPTR->HookLoopBegin(ifinfo); \ - IHookList *prelist = ifinfo->GetPreHooks(); \ - IHookList *postlist = ifinfo->GetPostHooks(); \ - META_RES status = MRES_IGNORED; \ - META_RES prev_res; \ - META_RES cur_res; \ - void* ifptr; \ - SH_GLOB_SHPTR->SetupHookLoop(&status, &prev_res, &cur_res, &ifptr, NULL, NULL); \ - -#define SH_CALL_HOOKS_void(post, params) \ - if (SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - prev_res = MRES_IGNORED; \ - for (AutoHookIter iter(post##list); !iter.End(); iter.Next()) \ - { \ - cur_res = MRES_IGNORED; \ - ifptr = reinterpret_cast(reinterpret_cast(this) - iter.ThisPtrOffs()); \ - reinterpret_cast*>(iter.Handler())->GetDeleg() params; \ - prev_res = cur_res; \ - if (cur_res > status) \ - status = cur_res; \ - if (!SH_GLOB_SHPTR->ShouldContinue()) \ - { \ - iter.SetToZero(); \ - break; \ - } \ - } \ - } - -#define SH_CALL_ORIG_void(paramtypes, params) \ - if (status != MRES_SUPERCEDE) \ - { \ - void (EmptyClass::*mfp)paramtypes; \ - SH_SETUP_MFP(mfp); \ - (reinterpret_cast(this)->*mfp)params; \ - } - -#define SH_RETURN_void() \ - SH_GLOB_SHPTR->HookLoopEnd(); - -#define SH_HANDLEFUNC_void(paramtypes, params) \ - SH_SETUPCALLS_void(paramtypes, params) \ - SH_CALL_HOOKS_void(pre, params) \ - SH_CALL_ORIG_void(paramtypes, params) \ - SH_CALL_HOOKS_void(post, params) \ - SH_RETURN_void() - - -// Special vafmt handlers -// :TODO: what -#define SH_HANDLEFUNC_vafmt(paramtypes, params_orig, params_plug, rettype) \ - SH_SETUPCALLS(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(pre, params_plug) \ - SH_CALL_ORIG(rettype, paramtypes, params_orig) \ - SH_CALL_HOOKS(post, params_plug) \ - SH_RETURN() - -#define SH_HANDLEFUNC_void_vafmt(paramtypes, params_orig, params_plug) \ - SH_SETUPCALLS_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(pre, params_plug) \ - SH_CALL_ORIG_void(paramtypes, params_orig) \ - SH_CALL_HOOKS_void(post, params_plug) \ - SH_RETURN_void() - -////////////////////////////////////////////////////////////////////////// - -// :FIXME: -// sizeof on references returns the size of the datatype, NOT the pointer size or something -// -> one should probably flag references in __SourceHook_ParamSizes_* ! -// or simply assume that their size is sizeof(void*)=SH_PTRSIZE... could be doable through a simple template - - -// ********* Support for 0 arguments ********* -#define SH_DECL_HOOK0(ifacetype, ifacefunc, attr, overload, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate0 FD; \ - virtual rettype Func() \ - { SH_HANDLEFUNC((), (), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_void(ifacetype, ifacefunc, attr, overload) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate0<> FD; \ - virtual void Func() \ - { SH_HANDLEFUNC_void((), ()); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_vafmt(ifacetype, ifacefunc, attr, overload, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((...), ("%s", buf), (buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK0_void_vafmt(ifacetype, ifacefunc, attr, overload) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((...), ("%s", buf), (buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1 }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 0, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK0(hookname, vtblidx, vtbloffs, thisptroffs, rettype) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate0 FD; \ - virtual rettype Func() \ - { SH_HANDLEFUNC((), (), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 0, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK0_void(hookname, vtblidx, vtbloffs, thisptroffs) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate0<> FD; \ - virtual void Func() \ - { SH_HANDLEFUNC_void((), ()); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0 }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 0, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 1 arguments ********* -#define SH_DECL_HOOK1(ifacetype, ifacefunc, attr, overload, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(param1 p1) \ - { SH_HANDLEFUNC((param1), (p1), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_void(ifacetype, ifacefunc, attr, overload, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(param1 p1) \ - { SH_HANDLEFUNC_void((param1), (p1)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, ...), (p1, "%s", buf), (p1, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK1_void_vafmt(ifacetype, ifacefunc, attr, overload, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, ...), (p1, "%s", buf), (p1, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 1, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK1(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual rettype Func(param1 p1) \ - { SH_HANDLEFUNC((param1), (p1), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 1, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK1_void(hookname, vtblidx, vtbloffs, thisptroffs, param1) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(param1 p1) \ - { SH_HANDLEFUNC_void((param1), (p1)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 1, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 2 arguments ********* -#define SH_DECL_HOOK2(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_void(ifacetype, ifacefunc, attr, overload, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK2_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, ...), (p1, p2, "%s", buf), (p1, p2, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 2, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK2(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual rettype Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC((param1, param2), (p1, p2), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 2, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK2_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, param2 p2) \ - { SH_HANDLEFUNC_void((param1, param2), (p1, p2)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 2, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 3 arguments ********* -#define SH_DECL_HOOK3(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK3_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, ...), (p1, p2, p3, "%s", buf), (p1, p2, p3, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 3, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK3(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC((param1, param2, param3), (p1, p2, p3), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 3, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK3_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3) \ - { SH_HANDLEFUNC_void((param1, param2, param3), (p1, p2, p3)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 3, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 4 arguments ********* -#define SH_DECL_HOOK4(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK4_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, ...), (p1, p2, p3, p4, "%s", buf), (p1, p2, p3, p4, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 4, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK4(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC((param1, param2, param3, param4), (p1, p2, p3, p4), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 4, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK4_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4), (p1, p2, p3, p4)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 4, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 5 arguments ********* -#define SH_DECL_HOOK5(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK5_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, ...), (p1, p2, p3, p4, p5, "%s", buf), (p1, p2, p3, p4, p5, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 5, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK5(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 5, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK5_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5), (p1, p2, p3, p4, p5)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 5, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 6 arguments ********* -#define SH_DECL_HOOK6(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK6_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, ...), (p1, p2, p3, p4, p5, p6, "%s", buf), (p1, p2, p3, p4, p5, p6, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 6, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK6(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 6, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK6_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6), (p1, p2, p3, p4, p5, p6)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 6, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 7 arguments ********* -#define SH_DECL_HOOK7(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK7_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, ...), (p1, p2, p3, p4, p5, p6, p7, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 7, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK7(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 7, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK7_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7), (p1, p2, p3, p4, p5, p6, p7)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 7, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 8 arguments ********* -#define SH_DECL_HOOK8(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK8_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, ...), (p1, p2, p3, p4, p5, p6, p7, p8, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 8, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK8(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 8, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK8_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8), (p1, p2, p3, p4, p5, p6, p7, p8)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 8, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 9 arguments ********* -#define SH_DECL_HOOK9(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK9_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 9, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK9(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 9, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK9_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9), (p1, p2, p3, p4, p5, p6, p7, p8, p9)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 9, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 10 arguments ********* -#define SH_DECL_HOOK10(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK10_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 10, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK10(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 10, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK10_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 10, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 11 arguments ********* -#define SH_DECL_HOOK11(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK11_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 11, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK11(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 11, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK11_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 11, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 12 arguments ********* -#define SH_DECL_HOOK12(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK12_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 12, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK12(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 12, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK12_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 12, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 13 arguments ********* -#define SH_DECL_HOOK13(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK13_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 13, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK13(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 13, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK13_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 13, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 14 arguments ********* -#define SH_DECL_HOOK14(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK14_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 14, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK14(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 14, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK14_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 14, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 15 arguments ********* -#define SH_DECL_HOOK15(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK15_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 15, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK15(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 15, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK15_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 15, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 16 arguments ********* -#define SH_DECL_HOOK16(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK16_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 16, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK16(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 16, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK16_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 16, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 17 arguments ********* -#define SH_DECL_HOOK17(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK17_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 17, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK17(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 17, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK17_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 17, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 18 arguments ********* -#define SH_DECL_HOOK18(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK18_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 18, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK18(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 18, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK18_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate18 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 18, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 19 arguments ********* -#define SH_DECL_HOOK19(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK19_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 19, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK19(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 19, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK19_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate19 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 19, __SourceHook_ParamSizesM_##hookname); \ - - -// ********* Support for 20 arguments ********* -#define SH_DECL_HOOK20(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_void(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate21 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf), rettype); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_HOOK20_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ - (&ifacetype::ifacefunc))) \ - typedef fastdelegate::FastDelegate21 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20, const char *fmt, ...) \ - { \ - char buf[::SourceHook::STRBUF_LEN]; \ - va_list ap; \ - va_start(ap, fmt); \ - vsnprintf(buf, sizeof(buf), fmt, ap); \ - va_end(ap); \ - SH_HANDLEFUNC_void_vafmt((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20, ...), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, "%s", buf), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, buf)); \ - } \ - SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, \ - (static_cast(&ifacetype::ifacefunc))) \ - \ - const int __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload[] = { -1, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_FHCls(ifacetype, ifacefunc, overload)::ms_Proto(0, \ - 20, __SourceHook_ParamSizes_##ifacetype##ifacefunc##overload); - -#define SH_DECL_MANUALHOOK20(hookname, vtblidx, vtbloffs, thisptroffs, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), rettype); } \ - typedef rettype(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ - typedef rettype RetType; \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(sizeof(rettype), \ - 20, __SourceHook_ParamSizesM_##hookname); \ - -#define SH_DECL_MANUALHOOK20_void(hookname, vtblidx, vtbloffs, thisptroffs, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) \ - SHINT_MAKE_GENERICSTUFF_BEGIN_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - typedef fastdelegate::FastDelegate20 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, param17 p17, param18 p18, param19 p19, param20 p20) \ - { SH_HANDLEFUNC_void((param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20)); } \ - typedef void(::SourceHook::EmptyClass::*ECMFP)(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20); \ - SHINT_MAKE_GENERICSTUFF_END_MANUAL(hookname, vtbloffs, vtblidx, thisptroffs) \ - \ - const int __SourceHook_ParamSizesM_##hookname[] = { 0, sizeof(param1), sizeof(param2), sizeof(param3), sizeof(param4), sizeof(param5), sizeof(param6), sizeof(param7), sizeof(param8), sizeof(param9), sizeof(param10), sizeof(param11), sizeof(param12), sizeof(param13), sizeof(param14), sizeof(param15), sizeof(param16), sizeof(param17), sizeof(param18), sizeof(param19), sizeof(param20) }; \ - ::SourceHook::ProtoInfo SH_MFHCls(hookname)::ms_Proto(0, \ - 20, __SourceHook_ParamSizesM_##hookname); \ - - - - -////////////////////////////////////////////////////////////////////////// -// SH_CALL - -#if SH_COMP == SH_COMP_MSVC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = origfunc; \ - \ - void *adjustedthisptr = reinterpret_cast(reinterpret_cast(m_CC->GetThisPtr()) + mfi.thisptroffs); \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *adjustedthisptr = reinterpret_cast(m_CC->GetThisPtr()) + m_ThisPtrOffs; \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - void *addr; \ - } u; \ - u.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.addr) \ - u.addr = (*reinterpret_cast(adjustedthisptr + m_VtblOffs))[m_VtblIdx]; \ - \ - return (reinterpret_cast(adjustedthisptr)->*u.mfpnew)call; \ -} - -#elif SH_COMP == SH_COMP_GCC - -# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - MemFuncInfo mfi = {true, -1, 0, 0}; \ - GetFuncInfo(m_CC->GetThisPtr(), m_MFP, mfi); \ - void *origfunc = m_CC->GetOrigFunc(mfi.thisptroffs + mfi.vtbloffs, mfi.vtblindex); \ - if (!origfunc) \ - return (m_CC->GetThisPtr()->*m_MFP)call; \ - \ - /* It's hooked. Call the original function. */ \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct \ - { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = origfunc; \ - u.s.adjustor = mfi.thisptroffs; \ - \ - return (reinterpret_cast(m_CC->GetThisPtr())->*u.mfpnew)call; \ -} - -# define SH_MAKE_MEXECUTABLECLASS_OB(call, prms) \ -{ \ - using namespace ::SourceHook; \ - char *thisptr = reinterpret_cast(m_CC->GetThisPtr()); \ - union \ - { \ - RetType(EmptyClass::*mfpnew)prms; \ - struct { \ - void *addr; \ - intptr_t adjustor; \ - } s; \ - } u; \ - u.s.addr = m_CC->GetOrigFunc(m_ThisPtrOffs + m_VtblOffs, m_VtblIdx); \ - if (!u.s.addr) \ - u.s.addr = (*reinterpret_cast(thisptr + m_ThisPtrOffs + m_VtblOffs))[m_VtblIdx]; \ - \ - u.s.adjustor = m_ThisPtrOffs; \ - return (reinterpret_cast(thisptr)->*u.mfpnew)call; \ -} - -#endif - -namespace SourceHook -{ - - // Support for 0 arguments - template class ExecutableClass0 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass0(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()() const - SH_MAKE_EXECUTABLECLASS_OB((), ()) - - - template RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass0 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass0(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()() const - SH_MAKE_MEXECUTABLECLASS_OB((), ()) - - - template RetType operator()(Param1 p1) const - SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 1 arguments - template class ExecutableClass1 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass1(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1) const - SH_MAKE_EXECUTABLECLASS_OB((p1), (Param1)) - - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass1 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass1(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1) const - SH_MAKE_MEXECUTABLECLASS_OB((p1), (Param1)) - - - template RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 2 arguments - template class ExecutableClass2 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass2(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass2 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass2(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2), (Param1, Param2)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 3 arguments - template class ExecutableClass3 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass3(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass3 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass3(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3), (Param1, Param2, Param3)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 4 arguments - template class ExecutableClass4 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass4(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass4 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass4(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4), (Param1, Param2, Param3, Param4)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 5 arguments - template class ExecutableClass5 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass5(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass5 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass5(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5), (Param1, Param2, Param3, Param4, Param5)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 6 arguments - template class ExecutableClass6 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass6(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass6 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass6(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6), (Param1, Param2, Param3, Param4, Param5, Param6)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 7 arguments - template class ExecutableClass7 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass7(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass7 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass7(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7), (Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 8 arguments - template class ExecutableClass8 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass8(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass8 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass8(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 9 arguments - template class ExecutableClass9 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass9(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass9 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass9(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 10 arguments - template class ExecutableClass10 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass10(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass10 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass10(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 11 arguments - template class ExecutableClass11 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass11(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass11 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass11(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 12 arguments - template class ExecutableClass12 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass12(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass12 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass12(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 13 arguments - template class ExecutableClass13 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass13(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass13 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass13(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 14 arguments - template class ExecutableClass14 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass14(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass14 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass14(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 15 arguments - template class ExecutableClass15 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass15(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass15 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass15(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 16 arguments - template class ExecutableClass16 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass16(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass16 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass16(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 17 arguments - template class ExecutableClass17 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass17(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass17 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass17(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 18 arguments - template class ExecutableClass18 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass18(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass18 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass18(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 19 arguments - template class ExecutableClass19 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass19(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - template class MExecutableClass19 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass19(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - - - template RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - }; - - // Support for 20 arguments - template class ExecutableClass20 - { - CCType *m_CC; - MFPType m_MFP; - public: - ExecutableClass20(CCType *cc, MFPType mfp) : m_CC(cc), m_MFP(mfp) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_EXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - - }; - - template class MExecutableClass20 - { - ManualCallClass *m_CC; - int m_ThisPtrOffs; - int m_VtblIdx; - int m_VtblOffs; - public: - MExecutableClass20(ManualCallClass *cc, int vtbloffs, int vtblidx, int thisptroffs) : m_CC(cc), - m_ThisPtrOffs(thisptroffs), m_VtblIdx(vtblidx), m_VtblOffs(vtbloffs) { } - - RetType operator()(Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8, Param9 p9, Param10 p10, Param11 p11, Param12 p12, Param13 p13, Param14 p14, Param15 p15, Param16 p16, Param17 p17, Param18 p18, Param19 p19, Param20 p20) const - SH_MAKE_MEXECUTABLECLASS_OB((p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20), (Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - - - }; - - -} - -// SH_CALL needs to deduce the return type -> it uses templates and function overloading -// That's why SH_CALL takes two parameters: "mfp2" of type RetType(X::*mfp)(params), and "mfp" of type MFP -// The only purpose of the mfp2 parameter is to extract the return type - - -// Support for 0 arguments -template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()) -{ - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); -} - -template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)()const) -{ - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); -} - -template -SourceHook::MExecutableClass0 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass0(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 1 arguments -template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)) -{ - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); -} - -template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1)const) -{ - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); -} - -template -SourceHook::MExecutableClass1 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass1(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 2 arguments -template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)) -{ - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); -} - -template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2)const) -{ - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); -} - -template -SourceHook::MExecutableClass2 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass2(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 3 arguments -template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)) -{ - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); -} - -template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3)const) -{ - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); -} - -template -SourceHook::MExecutableClass3 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass3(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 4 arguments -template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)) -{ - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); -} - -template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4)const) -{ - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); -} - -template -SourceHook::MExecutableClass4 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass4(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 5 arguments -template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)) -{ - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); -} - -template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5)const) -{ - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); -} - -template -SourceHook::MExecutableClass5 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass5(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 6 arguments -template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)) -{ - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); -} - -template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6)const) -{ - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); -} - -template -SourceHook::MExecutableClass6 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass6(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 7 arguments -template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) -{ - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); -} - -template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)const) -{ - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); -} - -template -SourceHook::MExecutableClass7 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass7(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 8 arguments -template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) -{ - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); -} - -template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)const) -{ - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); -} - -template -SourceHook::MExecutableClass8 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass8(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 9 arguments -template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) -{ - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); -} - -template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)const) -{ - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); -} - -template -SourceHook::MExecutableClass9 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass9(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 10 arguments -template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) -{ - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); -} - -template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)const) -{ - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); -} - -template -SourceHook::MExecutableClass10 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass10(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 11 arguments -template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) -{ - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); -} - -template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)const) -{ - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); -} - -template -SourceHook::MExecutableClass11 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass11(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 12 arguments -template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) -{ - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); -} - -template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)const) -{ - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); -} - -template -SourceHook::MExecutableClass12 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass12(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 13 arguments -template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) -{ - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); -} - -template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)const) -{ - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); -} - -template -SourceHook::MExecutableClass13 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass13(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 14 arguments -template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) -{ - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); -} - -template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)const) -{ - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); -} - -template -SourceHook::MExecutableClass14 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass14(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 15 arguments -template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) -{ - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); -} - -template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)const) -{ - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); -} - -template -SourceHook::MExecutableClass15 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass15(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 16 arguments -template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) -{ - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); -} - -template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)const) -{ - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); -} - -template -SourceHook::MExecutableClass16 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass16(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 17 arguments -template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) -{ - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); -} - -template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)const) -{ - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); -} - -template -SourceHook::MExecutableClass17 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass17(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 18 arguments -template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) -{ - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); -} - -template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)const) -{ - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); -} - -template -SourceHook::MExecutableClass18 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass18(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 19 arguments -template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) -{ - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); -} - -template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)const) -{ - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); -} - -template -SourceHook::MExecutableClass19 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass19(ptr, vtbloffs, vtblidx, thisptroffs); -} - -// Support for 20 arguments -template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) -{ - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); -} - -template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)const) -{ - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); -} - -template -SourceHook::MExecutableClass20 -SH_MCALL2(SourceHook::ManualCallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20), int vtblidx, int vtbloffs, int thisptroffs) -{ - return SourceHook::MExecutableClass20(ptr, vtbloffs, vtblidx, thisptroffs); -} - - -#if SH_COMP != SH_COMP_MSVC || _MSC_VER > 1300 -// GCC & MSVC 7.1 need this, MSVC 7.0 doesn't like it - - -// Support for 0 arguments -template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)) -{ - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); -} - -template -SourceHook::ExecutableClass0, MFP, RetType> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(...)const) -{ - return SourceHook::ExecutableClass0, MFP, RetType>(ptr, mfp); -} - - -// Support for 1 arguments -template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)) -{ - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); -} - -template -SourceHook::ExecutableClass1, MFP, RetType, Param1> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, ...)const) -{ - return SourceHook::ExecutableClass1, MFP, RetType, Param1>(ptr, mfp); -} - - -// Support for 2 arguments -template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)) -{ - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); -} - -template -SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, ...)const) -{ - return SourceHook::ExecutableClass2, MFP, RetType, Param1, Param2>(ptr, mfp); -} - - -// Support for 3 arguments -template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)) -{ - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); -} - -template -SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, ...)const) -{ - return SourceHook::ExecutableClass3, MFP, RetType, Param1, Param2, Param3>(ptr, mfp); -} - - -// Support for 4 arguments -template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)) -{ - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); -} - -template -SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, ...)const) -{ - return SourceHook::ExecutableClass4, MFP, RetType, Param1, Param2, Param3, Param4>(ptr, mfp); -} - - -// Support for 5 arguments -template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)) -{ - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); -} - -template -SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, ...)const) -{ - return SourceHook::ExecutableClass5, MFP, RetType, Param1, Param2, Param3, Param4, Param5>(ptr, mfp); -} - - -// Support for 6 arguments -template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)) -{ - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); -} - -template -SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const) -{ - return SourceHook::ExecutableClass6, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6>(ptr, mfp); -} - - -// Support for 7 arguments -template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)) -{ - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); -} - -template -SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const) -{ - return SourceHook::ExecutableClass7, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7>(ptr, mfp); -} - - -// Support for 8 arguments -template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)) -{ - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); -} - -template -SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const) -{ - return SourceHook::ExecutableClass8, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8>(ptr, mfp); -} - - -// Support for 9 arguments -template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)) -{ - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); -} - -template -SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const) -{ - return SourceHook::ExecutableClass9, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9>(ptr, mfp); -} - - -// Support for 10 arguments -template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)) -{ - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); -} - -template -SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const) -{ - return SourceHook::ExecutableClass10, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10>(ptr, mfp); -} - - -// Support for 11 arguments -template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)) -{ - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); -} - -template -SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const) -{ - return SourceHook::ExecutableClass11, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11>(ptr, mfp); -} - - -// Support for 12 arguments -template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)) -{ - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); -} - -template -SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const) -{ - return SourceHook::ExecutableClass12, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12>(ptr, mfp); -} - - -// Support for 13 arguments -template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)) -{ - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); -} - -template -SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const) -{ - return SourceHook::ExecutableClass13, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13>(ptr, mfp); -} - - -// Support for 14 arguments -template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)) -{ - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); -} - -template -SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const) -{ - return SourceHook::ExecutableClass14, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14>(ptr, mfp); -} - - -// Support for 15 arguments -template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)) -{ - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); -} - -template -SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const) -{ - return SourceHook::ExecutableClass15, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15>(ptr, mfp); -} - - -// Support for 16 arguments -template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)) -{ - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); -} - -template -SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const) -{ - return SourceHook::ExecutableClass16, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16>(ptr, mfp); -} - - -// Support for 17 arguments -template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)) -{ - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); -} - -template -SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, ...)const) -{ - return SourceHook::ExecutableClass17, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17>(ptr, mfp); -} - - -// Support for 18 arguments -template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)) -{ - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); -} - -template -SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, ...)const) -{ - return SourceHook::ExecutableClass18, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18>(ptr, mfp); -} - - -// Support for 19 arguments -template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)) -{ - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); -} - -template -SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, ...)const) -{ - return SourceHook::ExecutableClass19, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19>(ptr, mfp); -} - - -// Support for 20 arguments -template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)) -{ - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); -} - -template -SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20> -SH_CALL2(SourceHook::CallClass *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20, ...)const) -{ - return SourceHook::ExecutableClass20, MFP, RetType, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20>(ptr, mfp); -} - - - -#endif - -#define SH_CALL(ptr, mfp) SH_CALL2((ptr), (mfp), (mfp)) -#define SH_MCALL(ptr, mhookname) SH_MCALL2((ptr), SH_MFHCls(mhookname)::ECMFP(), SH_MFHCls(mhookname)::ms_MFI.vtblindex, \ - SH_MFHCls(mhookname)::ms_MFI.vtbloffs, SH_MFHCls(mhookname)::ms_MFI.thisptroffs) - -#undef SH_MAKE_EXECUTABLECLASS_OB - -////////////////////////////////////////////////////////////////////////// -// SetOverrideRet and RecallGetIface for recalls -// These take a ISourceHook pointer instead of using SH_GLOB_SHPTR directly -// The reason is that the user may want to redefine SH_GLOB_SHPTR - then the macros -// (META_RETURN_VALUE_NEWPARAMS) should obey the new pointer. - -namespace SourceHook -{ - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - - // SetOverrideResult used to be implemented like this: - // SetOverrideResult(shptr, memfuncptr, return); - // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference - // (it thought it was ambigous - the ref and non-ref type) - // so now SetOverrideResult(memfuncptr) deduces the ret type, and returns a functor which does the work - // new syntax: SetOverrideResult(memfuncptr)(shptr, return) - // This also allows us to create a special version for references which respects ReferenceCarrier. - - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - }; - template struct OverrideFunctor - { - void operator()(ISourceHook *shptr, T &res) - { - // overrideretptr points to ReferenceCarrier - *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; - } - }; - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)()) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)()) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - - template - OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - { - return OverrideFunctor(); - } - - template - Iface *RecallGetIface(ISourceHook *shptr, RetType (Iface::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, Param17, Param18, Param19, Param20)) - { - return reinterpret_cast(shptr->GetIfacePtr()); - } - -} - -#endif - // The pope is dead. -> :( diff --git a/sourcehook/sourcehook_impl.h b/sourcehook/sourcehook_impl.h deleted file mode 100644 index 2c30900..0000000 --- a/sourcehook/sourcehook_impl.h +++ /dev/null @@ -1,659 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -#ifndef __SOURCEHOOK_IMPL_H__ -#define __SOURCEHOOK_IMPL_H__ - -#include "sourcehook.h" -#include "sh_list.h" -#include "sh_vector.h" -#include "sh_tinyhash.h" -#include "sh_stack.h" - -/* - -IMPLEMENTATION INFO - ---------------------------------------- -Protos ("Prototypes") - The purpose of protos is to provide the amount of type information about a function - which is required to be able to execute a function call without corrupting the stack. - Our protos do not fully do this, but they provide the size of the return value, the number of - parameters, and the size of each parameter, which is enough for most situations. - - There are two version of protos: - OLD: - C-Style strings. - - 0_void: - "attrib" - 1_void: - "attrib|param1_type" - 2_void: - "attrib|param1_type|param2_type - 0: - "attrib|ret_type" - 1: - "attrib|ret_type|param1_type" - 2: - "attrib|ret_type|param2_type" - - Old protos are deprecated. - - NEW: - New protos are in fact pointers to the ProtoInfo structure (see sourcehook.h) - - Old protos begin with a non-zero byte, new protos begin with a zero byte. - - Protos are usually stored in a CProto instance. - ---------------------------------------- -Hook managers and hook manager containers - Each hookman container is tied to _one_ proto/vtable index/vtable offset info. - Hookman containers then contain a list of hook managers provided by plugins, sorted by version. - (higher versions come first) - - Duplicate hook managers are ignored (ie. hook managers where proto, vtable index, vtable offset, - plugin, version are the same as in an already exisiting hook manager) - - A new hook manager is always added to the end of the version group in the corresponding - hook container. - - If the new hook manager was added to the beginning of the container (which only happens if - it is the first one or if it has a higher version than the previously first hook manager), - the now second hook manager is shut down and the new hook manager takes its job. - - A "hook manager container id" (HMCI) consits of three values: proto, vtbl index, vtbl offset. ---------------------------------------- -Hooks - When adding a hook, first the proposed hook manager is added to the corresponding - hook manager container as described above. - - Then the first hook manager in the the manhook container is chosen to handle the function. - - Removing a hook does not neccessarily unreigster the plugin's hook manager. In order to do this, - use RemoveHookManager or UnloadPlugin/ - - Hooks can be paused - they remain in memory but they are not called. In SH, the hook iterator - classes handle pausing transparently. - - The hook loop is supposed to call ShouldContinue before each iteration. This makes hook handlers - able to remove themselves. - ---------------------------------------- -Call classes - Call classes are identified by a this pointer and an instance size - - We use the instance size because a derived class instance and a base class instance could - have the same this pointers, and we want to avoid that the derived class - (which could be bigger) gets the same callclass as the base class (mainly if the - base class' callclass was requested first). - - Call classes are reference counted. - - The original function pointers are stored in a vector (in order to allow fast random access). - These vectors are stored as the value type of a hash. The key type is int and represents the - vtable offset. - - If the hash key doesn't exist or the vtblidx is out of range or the corresponding element in the - vector is NULL, there is no hook on that function. - ---------------------------------------- -Recalls - Recalls are used for the META_RETURN_(VALUE_)NEWPARAMS macros, ie. to change the parameters - in the hook loop on the fly. - - First, the macro calls DoRecall(), then it calls the function the hook is attached to -> it - calls the hookfunc. SourceHook makes sure that the newly invoked hook loop starts where the last - one left off and that status variables like status, previous result, override return are kept. - When this recurisvely called hookfunc returns, the macro returns what it returned - (using MRES_SUPERCEDE). CSourceHookImpl returns false from ShouldContinue so the original hook loop - is abandonned. - -Post Recalls - People wanted to be able to use META_RETURN_(VALUE_)NEWPARAMS from post hooks as well. Crazy people! - Anyway, for this, we have to know where a hook handler is. Is it executing pre or post hooks at the moment? - The only way we can know this is watching when it calls CHookList::GetIter(). So CHookList gets a new variable: - m_RequestedFlag. It also gets two new functions: RQFlagReset() and RQFlagGet(). - HookLoopBegin() calls RQFlagReset on both hooklists of the iface; then DoRecall() checks whether the postlist's - RQ flag is set. if yes, the hook loop is in post mode. - - So, what a about a recall in post mode? The first ShouldContinue returns false and sets Status to supercede. - This way the pre hooks and the function call will be skipped. Then, then next ShouldContinue returns true, so we get - into the post hooks. HA! - -Return Values in Post Recalls - The easy case is when we already have an override return value. In this case, the status register gets transferred, - and so does the override return pointer. So, basically, everything is ok. - - However, what happens if we don't? ie. the status register is on MRES_IGNORED? In this case we'd have to transfer the - orig ret value. But we can't: There's no way to tell the hookfunc: "Use this as orig ret pointer". It uses its own. - So, we emulate it. GetOrigRet will return the orig ret pointer from the old hook loop. If still no one overrides it, - we'd have to return it. BUT! HOW TO DO THIS? Check out SH_RETURN(). First calls HookLoopEnd(), then decides whether - to return the override retval or the orig retval. But it doesn't ask for a new override return. So we give the function - the last orig return value as its new override return value; but leave status where it is so everything works, and in - HookLoopEnd we make sure that status is high enough so that the override return will be returned. crazy. - - All this stuff could be much less complicated if I didn't try to preserve binary compatibility :) -*/ - -namespace SourceHook -{ - /** - * @brief The SourceHook implementation class - */ - class CSourceHookImpl : public ISourceHook - { - private: - class CProto - { - char *m_Proto; - - static bool Equal(const char *p1, const char *p2); - char *DupProto(const char *src); - void FreeProto(char *prot); - public: - CProto(const char *szProto) : m_Proto(DupProto(szProto)) - { - } - - CProto(const CProto &other) : m_Proto(DupProto(other.m_Proto)) - { - } - - ~CProto() - { - FreeProto(m_Proto); - m_Proto = NULL; - } - - void operator = (const char *szProto) - { - m_Proto = DupProto(szProto); - } - - void operator = (const CProto &other) - { - m_Proto = DupProto(other.m_Proto); - } - - bool operator == (const char *szProto) const - { - return Equal(szProto, m_Proto); - } - bool operator == (const CProto &other) const - { - return Equal(other.m_Proto, m_Proto); - } - }; - - - /** - * @brief A hook can be removed if you have this information - */ - struct RemoveHookInfo - { - RemoveHookInfo(Plugin pplug, void *piface, int tpo, HookManagerPubFunc phookman, - ISHDelegate *phandler, bool ppost) - : plug(pplug), iface(piface), thisptr_offs(tpo), - hookman(phookman), handler(phandler), post(ppost) - { - } - - Plugin plug; - void *iface; - int thisptr_offs; - HookManagerPubFunc hookman; - ISHDelegate *handler; - bool post; - }; - - struct RemoveHookManInfo - { - RemoveHookManInfo(Plugin pplug, HookManagerPubFunc phookman) - : plug(pplug), hookman(phookman) - { - } - - Plugin plug; - HookManagerPubFunc hookman; - }; - - struct HookInfo - { - ISHDelegate *handler; //!< Pointer to the handler - bool paused; //!< If true, the hook should not be executed - Plugin plug; //!< The owner plugin - int thisptr_offs; //!< This pointer offset - }; - - class CHookList : public IHookList - { - public: - List m_List; - - friend class CIter; - - class CIter : public IHookList::IIter - { - friend class CHookList; - - CHookList *m_pList; - - void SkipPaused(); - public: - - List::iterator m_Iter; - - CIter(CHookList *pList); - - virtual ~CIter(); - - void GoToBegin(); - void GoToEnd(); - void Set(CIter *pOther); - - bool End(); - void Next(); - ISHDelegate *Handler(); - int ThisPtrOffs(); - - void Clear(); - - CIter *m_pNext; // When stored in m_FreeIters and m_UsedIters - CIter *m_pPrev; // Only used when stored in m_UsedIters - }; - - CIter *m_FreeIters; - CIter *m_UsedIters; // The last returned and not-yet-released iter is always m_UsedIters - - // For recalls - bool m_Recall; - bool m_RQFlag; - bool m_RelFlag; - - void SetRecallState(); // Sets the list into a state where the next returned - // iterator (from GetIter) will be a copy of the last - // returned iterator, incremented by one. This is used in Recalls. - // The hook resets this state automatically on: - // GetIter, ReleaseIter - - void RQFlagReset() { m_RQFlag = false; m_RelFlag = false; } - bool RQFlagGet() { return m_RQFlag; } - bool RelFlagGet() { return m_RelFlag; } - CHookList(); - CHookList(const CHookList &other); - virtual ~CHookList(); - - void operator=(const CHookList &other); - - IIter *GetIter(); - void ReleaseIter(IIter *pIter); - }; - - // I know, data hiding... But I'm a lazy bastard! - - class CIface : public IIface - { - public: - void *m_Ptr; - CHookList m_PreHooks; - CHookList m_PostHooks; - public: - CIface(void *ptr); - virtual ~CIface(); - - void *GetPtr(); - IHookList *GetPreHooks(); - IHookList *GetPostHooks(); - - bool operator==(void *ptr) - { - return m_Ptr == ptr; - } - }; - - class CVfnPtr : public IVfnPtr - { - public: - typedef List IfaceList; - typedef IfaceList::iterator IfaceListIter; - - void *m_Ptr; - void *m_OrigEntry; - - IfaceList m_Ifaces; - - public: - CVfnPtr(void *ptr); - virtual ~CVfnPtr(); - - void *GetVfnPtr(); - void *GetOrigEntry(); - - virtual IIface *FindIface(void *ptr); - - bool operator==(void *ptr) - { - return m_Ptr == ptr; - } - }; - - class CHookManagerInfo : public IHookManagerInfo - { - public: - typedef List VfnPtrList; - typedef VfnPtrList::iterator VfnPtrListIter; - - Plugin m_Plug; - HookManagerPubFunc m_Func; - - int m_VtblOffs; - int m_VtblIdx; - const char *m_Proto; - void *m_HookfuncVfnptr; - - VfnPtrList m_VfnPtrs; - - int m_HookManVersion; - public: - CHookManagerInfo(); - virtual ~CHookManagerInfo(); - - IVfnPtr *FindVfnPtr(void *vfnptr); - - void SetInfo(int vtbl_offs, int vtbl_idx, const char *proto); - void SetHookfuncVfnptr(void *hookfunc_vfnptr); - - void SetVersion(int version); - - bool operator < (const CHookManagerInfo &other) - { - return m_HookManVersion < other.m_HookManVersion; - } - - struct Descriptor - { - Descriptor(Plugin pplug, HookManagerPubFunc ppubFunc) : plug(pplug), pubFunc(ppubFunc) - { - } - - Plugin plug; - HookManagerPubFunc pubFunc; - }; - - bool operator == (const Descriptor desc) - { - return m_Func == desc.pubFunc && m_Plug == desc.plug; - } - }; - - typedef List HookManInfoList; - - class CHookManagerContainer : public HookManInfoList - { - public: - // HMCI (Hook Manager Container Identification) - class HMCI - { - CProto m_Proto; - int m_VtableOffset; - int m_VtableIndex; - public: - HMCI(const char *proto, int vtbloffs, int vtblidx) : - m_Proto(proto), m_VtableOffset(vtbloffs), m_VtableIndex(vtblidx) - { - } - ~HMCI() - { - } - - bool operator==(const HMCI &other) const - { - return - other.m_VtableIndex == m_VtableIndex && - other.m_Proto == m_Proto && - other.m_VtableOffset == m_VtableOffset; - } - - const CProto &GetProto() const - { - return m_Proto; - } - int GetVtableOffset() const - { - return m_VtableOffset; - } - int GetVtableIndex() const - { - return m_VtableIndex; - } - }; - HMCI m_HCMI; - - public: - CHookManagerContainer(const HMCI &hmci) : m_HCMI(hmci) - { - } - bool operator == (const HMCI &other) const - { - return m_HCMI == other; - } - void AddHookManager(Plugin plug, const CHookManagerInfo &hookman); - }; - - class CCallClassImpl : public GenericCallClass - { - public: - - typedef SourceHook::CVector OrigFuncs; - typedef SourceHook::THash OrigVTables; - - void *m_Ptr; //!< Pointer to the actual object - size_t m_ObjSize; //!< Size of the instance - OrigVTables m_VT; //!< Info about vtables & functions - - int m_RefCounter; - - CCallClassImpl(void *ptr, size_t size); - virtual ~CCallClassImpl(); - - bool operator==(void *other) - { - return m_Ptr == other; - } - - void *GetThisPtr(); - void *GetOrigFunc(int vtbloffs, int vtblidx); - - void ApplyCallClassPatch(int vtbl_offs, int vtbl_idx, void *orig_entry); - void RemoveCallClassPatch(int vtbl_offs, int vtbl_idx); - }; - - /** - * @brief A list of CallClass structures - */ - typedef List Impl_CallClassList; - - Impl_CallClassList m_CallClasses; //!< A list of already generated callclasses - - /** - * @brief A list of CHookManagerContainers - */ - typedef List HookManContList; - - HookManContList m_HookMans; //!< A list of hook managers - - struct HookLoopInfo - { - enum RecallType - { - Recall_No=0, - Recall_Pre, - Recall_Post1, - Recall_Post2 - }; - - META_RES *pStatus; - META_RES *pPrevRes; - META_RES *pCurRes; - - META_RES temporaryStatus; //!< Stored during Post1 recall phase - bool shouldContinue; - RecallType recall; //!< Specifies which kind of recall we're in. - - IIface *pCurIface; - const void *pOrigRet; - void *pOverrideRet; - void **pIfacePtrPtr; - }; - typedef CStack HookLoopInfoStack; - - void ApplyCallClassPatches(CCallClassImpl &cc); - void ApplyCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx, void *orig_entry); - void RemoveCallClassPatches(void *ifaceptr, int vtbl_offs, int vtbl_idx); - - void SetPluginPaused(Plugin plug, bool paused); - - HookLoopInfoStack m_HLIStack; - public: - CSourceHookImpl(); - virtual ~CSourceHookImpl(); - - /** - * @brief Returns the interface version - */ - int GetIfaceVersion(); - - /** - * @brief Returns the implemnetation version - */ - int GetImplVersion(); - - /** - * @brief Make sure that a plugin is not used by any other plugins anymore, and unregister all its hook managers - */ - void UnloadPlugin(Plugin plug); - - /** - * @brief Shut down the whole system, unregister all hook managers - */ - void CompleteShutdown(); - - /** - * @brief Add a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param ifacesize The size of the class iface points to - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - bool AddHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post); - - /** - * @brief Removes a hook. - * - * @return True if the function succeeded, false otherwise - * - * @param plug The unique identifier of the plugin that calls this function - * @param iface The interface pointer - * @param thisptr_offs This pointer adjuster - * @param myHookMan A hook manager function that should be capable of handling the function - * @param handler A pointer to a FastDelegate containing the hook handler - * @param post Set to true if you want a post handler - */ - bool RemoveHook(Plugin plug, void *iface, int thisptr_offs, HookManagerPubFunc myHookMan, ISHDelegate *handler, bool post); - - /** - * @brief Removes a hook. - * - * @ return True if the function succeeded, false otherwise - * - * @param info A RemoveHookInfo structure, describing the hook - */ - bool RemoveHook(RemoveHookInfo info); - - /** - * @brief Checks whether a plugin has (a) hook manager(s) that is/are currently used by other plugins - * - * @param plug The unique identifier of the plugin in question - */ - bool IsPluginInUse(Plugin plug); - - /** - * @brief Pauses all hooks of a plugin - * - * @param plug The unique identifier of the plugin - */ - void PausePlugin(Plugin plug); - - /** - * @brief Unpauses all hooks of a plugin - * - * @param plug The unique identifier of the plugin - */ - void UnpausePlugin(Plugin plug); - - /** - * @brief Return a pointer to a callclass. Generate a new one if required. - * - * @param iface The interface pointer - * @param size Size of the class instance - */ - GenericCallClass *GetCallClass(void *iface, size_t size); - - /** - * @brief Release a callclass - * - * @param ptr Pointer to the callclass - */ - virtual void ReleaseCallClass(GenericCallClass *ptr); - - virtual void SetRes(META_RES res); //!< Sets the meta result - virtual META_RES GetPrevRes(); //!< Gets the meta result of the previously called handler - virtual META_RES GetStatus(); //!< Gets the highest meta result - virtual const void *GetOrigRet(); //!< Gets the original result. If not in post function, undefined - virtual const void *GetOverrideRet(); //!< Gets the override result. If none is specified, NULL - virtual void *GetIfacePtr(); //!< Gets the interface pointer - - ////////////////////////////////////////////////////////////////////////// - // For hook managers - void HookLoopBegin(IIface *pIface); //!< Should be called when a hook loop begins - void HookLoopEnd(); //!< Should be called when a hook loop exits - void SetCurResPtr(META_RES *mres); //!< Sets pointer to the current meta result - void SetPrevResPtr(META_RES *mres); //!< Sets pointer to previous meta result - void SetStatusPtr(META_RES *mres); //!< Sets pointer to the status variable - void SetIfacePtrPtr(void **pp); //!< Sets pointer to the interface this pointer - void SetOrigRetPtr(const void *ptr); //!< Sets the original return pointer - void SetOverrideRetPtr(void *ptr); //!< Sets the override result pointer - bool ShouldContinue(); //!< Returns false if the hook loop should exit - - /** - * @brief Remove a hook manager. Auto-removes all hooks attached to it from plugin plug. - * - * @param plug The owner of the hook manager - * @param pubFunc The hook manager's info function - */ - virtual void RemoveHookManager(Plugin plug, HookManagerPubFunc pubFunc); - virtual void RemoveHookManager(RemoveHookManInfo info); - - virtual void DoRecall(); //!< Initiates a recall sequence - virtual void *GetOverrideRetPtr(); //!< Returns the pointer set by SetOverrideRetPtr - - virtual void *SetupHookLoop(META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, - void **ifacePtrPtr, const void *origRetPtr, void *overrideRetPtr); - }; -} - -#endif diff --git a/sourcehook/test/Makefile b/sourcehook/test/Makefile deleted file mode 100644 index 6c859b0..0000000 --- a/sourcehook/test/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson and Pavol Marko - -OPT_FLAGS = -O3 -funroll-loops -s -pipe -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc -LINK = -lstdc++ -INCLUDE = -I. -I.. -MAX_PARAMS=20 - -BINARY = sourcehook_test -OBJECTS = main.cpp sourcehook.cpp $(shell ls -t test*.cpp) -HEADERS = ../sh_list.h ../sh_tinyhash.h ../sh_memory.h ../sh_string.h ../sh_vector.h ../sourcehook_impl.h ../FastDelegate.h ../sourcehook.h ../sh_memfuncinfo.h - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -CFLAGS += -Wall -# Also, enable SH_ASSERT -CFLAGS += -DSH_DEBUG - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - - -default: all - -$(BIN_DIR)/%.o: %.cpp $(HEADERS) - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -../sourcehook.h: ../generate/sourcehook.hxx - (cd ../generate; ./shworker.bin iter sourcehook.hxx sourcehook.h $(MAX_PARAMS); cp sourcehook.h ..) - -../sourcehook.hxx: ../generate/sh_memfuncinfo.hxx - (cd ../generate; ./shworker.bin iter sh_memfuncinfo.hxx sh_memfuncinfo.h $(MAX_PARAMS); cp sh_memfuncino.h ..) - -../FastDelegate.hxx: ../generate/FastDelegate.hxx - (cd ../generate; ./shworker.bin iter FastDelegate.hxx FastDelegate.h $(MAX_PARAMS); cp FastDelegate.h ..) - -debug: - $(MAKE) all DEBUG=true - -all: - mkdir -p $(BIN_DIR) - ln -sf ../sourcehook.cpp sourcehook.cpp - $(MAKE) $(BINARY) - rm -f $(BINARY) - rm -f sourcehook.cpp - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - - -$(BINARY): $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -o$(BIN_DIR)/$(BINARY) - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/sourcehook/test/main.cpp b/sourcehook/test/main.cpp deleted file mode 100644 index 12a4706..0000000 --- a/sourcehook/test/main.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// Hello BAIL! -// hello pm how are you -// I'm fine, what about you? -// not bad, just looking for mem leaks -// mem leaks in my code!? never! I have to preserve binary compatibility :( -// This is a test file - -#include -#include -#include -#include -#include -#include "sh_tinyhash.h" -#include "sh_list.h" -#include "sourcehook_impl.h" -#include "sourcehook.h" - -using namespace std; - -bool g_Verbose; - -class Test -{ - typedef bool (*TestProto)(std::string&); - TestProto m_Func; - std::string m_Name; - - static SourceHook::List ms_Tests; -public: - Test(TestProto func, const char *name) : m_Func(func), m_Name(name) - { - ms_Tests.push_back(this); - } - - bool operator()() - { - std::string error; - if (!m_Func(error)) - { - cout << "Test" << m_Name << " FAILED: " << error << endl; - return false; - } - else - { - cout << "Test" << m_Name << " passed" << endl; - return true; - } - } - - static void DoTests() - { - int passed=0, failed=0; - for (SourceHook::List::iterator iter = ms_Tests.begin(); iter != ms_Tests.end(); ++iter) - { - if ((**iter)()) - ++passed; - else - ++failed; - } - cout << endl << "----" << endl << "Passed: " << passed << endl << "Failed: " << failed << endl; - cout << "Total: " << passed + failed << endl; - } -}; - -SourceHook::List Test::ms_Tests; - -#define DO_TEST(x) \ - bool Test##x(std::string &error); \ - Test g_Test##x(Test##x, #x); - -DO_TEST(List); -DO_TEST(Basic); -DO_TEST(VafmtAndOverload); -DO_TEST(ThisPtrOffs); -DO_TEST(PlugSys); -DO_TEST(Bail); -DO_TEST(Reentr); -DO_TEST(Manual); -DO_TEST(Recall); -DO_TEST(Multi); -DO_TEST(Ref); -DO_TEST(RefRet); - -int main(int argc, char *argv[]) -{ - std::string error; - - g_Verbose = argc > 1 && strcmp(argv[1], "-v") == 0; - - Test::DoTests(); - - cout << "Press enter to continue" << endl; - - char x; - cin.read(&x, 1); -} - -SourceHook::ISourceHook *Test_Factory() -{ - return new SourceHook::CSourceHookImpl(); -} - -void Test_Delete(SourceHook::ISourceHook *shptr) -{ - delete static_cast(shptr); -} - -void Test_CompleteShutdown(SourceHook::ISourceHook *shptr) -{ - static_cast(shptr)->CompleteShutdown(); -} - -bool Test_IsPluginInUse(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - return static_cast(shptr)->IsPluginInUse(plug); -} - -void Test_UnloadPlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - static_cast(shptr)->UnloadPlugin(plug); -} - -void Test_PausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - static_cast(shptr)->PausePlugin(plug); -} - -void Test_UnpausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) -{ - static_cast(shptr)->UnpausePlugin(plug); -} diff --git a/sourcehook/test/msvc7/test.vcproj b/sourcehook/test/msvc7/test.vcproj deleted file mode 100644 index 364a956..0000000 --- a/sourcehook/test/msvc7/test.vcproj +++ /dev/null @@ -1,362 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcehook/test/msvc8/test.vcproj b/sourcehook/test/msvc8/test.vcproj deleted file mode 100644 index ae768e5..0000000 --- a/sourcehook/test/msvc8/test.vcproj +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcehook/test/sourcehook_test.h b/sourcehook/test/sourcehook_test.h deleted file mode 100644 index 9d914b4..0000000 --- a/sourcehook/test/sourcehook_test.h +++ /dev/null @@ -1,27 +0,0 @@ -// This file is used for backwards compatibility testing -// It allows us to test binary backwards compatibility by using an older include file HERE: -#include "sourcehook.h" // <-- here -// There. main.cpp which implements all of the following function is always usign sourcehook.h -// and the up-to-date sourcehook_impl.h/sourcehook.cpp. The tests use this file however. -// If the test needs an up-to-date version (like the recall test), it can simply -// #include "sourcehook.h" before including this, thus overriding our decision. - - -SourceHook::ISourceHook *Test_Factory(); -void Test_Delete(SourceHook::ISourceHook *shptr); - -struct CSHPtrAutoDestruction -{ - SourceHook::ISourceHook *m_SHPtr; - CSHPtrAutoDestruction(SourceHook::ISourceHook *shptr) : m_SHPtr(shptr) {} - ~CSHPtrAutoDestruction() { Test_Delete(m_SHPtr); } -}; - -#define GET_SHPTR(var) var = Test_Factory(); CSHPtrAutoDestruction ___autodestruction(var); - -// Access to CSourceHookImpl functions -void Test_CompleteShutdown(SourceHook::ISourceHook *shptr); -bool Test_IsPluginInUse(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); -void Test_UnloadPlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); -void Test_PausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); -void Test_UnpausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); diff --git a/sourcehook/test/test1.cpp b/sourcehook/test/test1.cpp deleted file mode 100644 index 6b99ea4..0000000 --- a/sourcehook/test/test1.cpp +++ /dev/null @@ -1,700 +0,0 @@ -#include -#include "sourcehook_test.h" -#include "testevents.h" - -#include "sh_memory.h" - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - // TEST1 - // Basic tests - // Hooking and callclass - - MAKE_STATE_1(State_ModuleInMemory, bool); - MAKE_STATE(State_F1_Called); - MAKE_STATE_1(State_F1_PreHandler_Called, void*); - MAKE_STATE_1(State_F1_PostHandler_Called, void*); - MAKE_STATE_1(State_F1_HookAdded, bool); - MAKE_STATE(State_F1_HookRemoved); - MAKE_STATE(State_F1_CallClassGenerated); - MAKE_STATE(State_F1_CallClassReleased); - MAKE_STATE_1(State_F299_Called, std::string); - MAKE_STATE_1(State_F299_PreHandlerCalled, std::string); - MAKE_STATE_1(State_F299_PostHandlerCalled, std::string); - MAKE_STATE_1(State_F299Ret, bool); - - class Test - { - public: - virtual void F1() - { - ADD_STATE(State_F1_Called); - } - virtual void F2(){} - virtual void F3(){} - virtual void F4(){} - virtual void F5(){} - virtual void F6(){} - virtual void F7(){} - virtual void F8(){} - virtual void F9(){} - virtual void F10(){} - virtual void F11(){} - virtual void F12(){} - virtual void F13(){} - virtual void F14(){} - virtual void F15(){} - virtual void F16(){} - virtual void F17(){} - virtual void F18(){} - virtual void F19(){} - virtual float F20() const { return 1.0f; } // Look! F20 is const-ed and returns a float - virtual void F21(){} - virtual void F22(){} - virtual void F23(){} - virtual void F24(){} - virtual void F25(){} - virtual void F26(){} - virtual void F27(){} - virtual void F28(){} - virtual void F29(){} - virtual void F30(){} - virtual void F31(){} - virtual void F32(){} - virtual void F33(){} - virtual void F34(){} - virtual void F35(){} - virtual void F36(){} - virtual void F37(){} - virtual void F38(){} - virtual void F39(){} - virtual void F40(){} - virtual void F41(){} - virtual void F42(){} - virtual void F43(){} - virtual void F44(){} - virtual void F45(){} - virtual void F46(){} - virtual void F47(){} - virtual void F48(){} - virtual void F49(){} - virtual void F50(){} - virtual void F51(){} - virtual void F52(){} - virtual void F53(){} - virtual void F54(){} - virtual void F55(){} - virtual void F56(){} - virtual void F57(){} - virtual void F58(){} - virtual void F59(){} - virtual void F60(int &hello){} - virtual void F61(){} - virtual void F62(){} - virtual void F63(){} - virtual void F64(){} - virtual void F65(){} - virtual void F66(){} - virtual void F67(){} - virtual void F68(){} - virtual void F69(){} - virtual void F70(){} - virtual void F71(){} - virtual void F72(){} - virtual void F73(){} - virtual void F74(){} - virtual void F75(){} - virtual void F76(){} - virtual void F77(){} - virtual void F78(){} - virtual void F79(){} - virtual void F80(){} - virtual void F81(){} - virtual void F82(){} - virtual void F83(){} - virtual void F84(){} - virtual void F85(){} - virtual void F86(){} - virtual void F87(){} - virtual void F88(){} - virtual void F89(){} - virtual void F90(){} - virtual void F91(){} - virtual void F92(){} - virtual void F93(){} - virtual void F94(){} - virtual void F95(){} - virtual void F96(){} - virtual void F97(){} - virtual void F98(){} - virtual void F99(){} - virtual void F100(){} - virtual void F101(){} - virtual void F102(){} - virtual void F103(){} - virtual void F104(){} - virtual void F105(){} - virtual void F106(){} - virtual void F107(){} - virtual void F108(){} - virtual void F109(){} - virtual void F110(){} - virtual void F111(){} - virtual void F112(){} - virtual void F113(){} - virtual void F114(){} - virtual void F115(){} - virtual void F116(){} - virtual void F117(){} - virtual void F118(){} - virtual void F119(){} - virtual void F120(){} - virtual void F121(){} - virtual void F122(){} - virtual void F123(){} - virtual void F124(){} - virtual void F125(){} - virtual void F126(){} - virtual void F127(){} - virtual void F128(){} - virtual void F129(){} - virtual void F130(){} - virtual void F131(){} - virtual void F132(){} - virtual void F133(){} - virtual void F134(){} - virtual void F135(){} - virtual void F136(){} - virtual void F137(){} - virtual void F138(){} - virtual void F139(){} - virtual void F140(){} - virtual void F141(){} - virtual void F142(){} - virtual void F143(){} - virtual void F144(){} - virtual void F145(){} - virtual void F146(){} - virtual void F147(){} - virtual void F148(){} - virtual void F149(){} - virtual void F150(){} - virtual void F151(){} - virtual void F152(){} - virtual void F153(){} - virtual void F154(){} - virtual void F155(){} - virtual void F156(){} - virtual void F157(){} - virtual void F158(){} - virtual void F159(){} - virtual void F160(){} - virtual void F161(){} - virtual void F162(){} - virtual void F163(){} - virtual void F164(){} - virtual void F165(){} - virtual void F166(){} - virtual void F167(){} - virtual void F168(){} - virtual void F169(){} - virtual void F170(){} - virtual void F171(){} - virtual void F172(){} - virtual void F173(){} - virtual void F174(){} - virtual void F175(){} - virtual void F176(){} - virtual void F177(){} - virtual void F178(){} - virtual void F179(){} - virtual void F180(){} - virtual void F181(){} - virtual void F182(){} - virtual void F183(){} - virtual void F184(){} - virtual void F185(){} - virtual void F186(){} - virtual void F187(){} - virtual void F188(){} - virtual void F189(){} - virtual void F190(){} - virtual void F191(){} - virtual void F192(){} - virtual void F193(){} - virtual void F194(){} - virtual void F195(){} - virtual void F196(){} - virtual void F197(){} - virtual void F198(){} - virtual void F199(){} - virtual void F200(){} - virtual void F201(){} - virtual void F202(){} - virtual void F203(){} - virtual void F204(){} - virtual void F205(){} - virtual void F206(){} - virtual void F207(){} - virtual void F208(){} - virtual void F209(){} - virtual void F210(){} - virtual void F211(){} - virtual void F212(){} - virtual void F213(){} - virtual void F214(){} - virtual void F215(){} - virtual void F216(){} - virtual void F217(){} - virtual void F218(){} - virtual void F219(){} - virtual void F220(){} - virtual void F221(){} - virtual void F222(){} - virtual void F223(){} - virtual void F224(){} - virtual void F225(){} - virtual void F226(){} - virtual void F227(){} - virtual void F228(){} - virtual void F229(){} - virtual void F230(){} - virtual void F231(){} - virtual void F232(){} - virtual void F233(){} - virtual void F234(){} - virtual void F235(){} - virtual void F236(){} - virtual void F237(){} - virtual void F238(){} - virtual void F239(){} - virtual void F240(){} - virtual void F241(){} - virtual void F242(){} - virtual void F243(){} - virtual void F244(){} - virtual void F245(){} - virtual void F246(){} - virtual void F247(){} - virtual void F248(){} - virtual void F249(){} - virtual void F250(){} - virtual void F251(){} - virtual void F252(){} - virtual void F253(){} - virtual void F254(){} - virtual void F255(){} - virtual void F256(){} - virtual void F257(){} - virtual void F258(){} - virtual void F259(){} - virtual void F260(){} - virtual void F261(){} - virtual void F262(){} - virtual void F263(){} - virtual void F264(){} - virtual void F265(){} - virtual void F266(){} - virtual void F267(){} - virtual void F268(){} - virtual void F269(){} - virtual void F270(){} - virtual void F271(){} - virtual void F272(){} - virtual void F273(){} - virtual void F274(){} - virtual void F275(){} - virtual void F276(){} - virtual void F277(){} - virtual void F278(){} - virtual void F279(){} - virtual void F280(){} - virtual void F281(){} - virtual void F282(){} - virtual void F283(){} - virtual void F284(){} - virtual void F285(){} - virtual void F286(){} - virtual void F287(){} - virtual void F288(){} - virtual void F289(){} - virtual void F290(){} - virtual void F291(){} - virtual void F292(){} - virtual void F293(){} - virtual void F294(){} - virtual void F295(){} - virtual void F296(){} - virtual void F297(){} - virtual void F298(){} - virtual bool F299(const char *mwah) - { - ADD_STATE(State_F299_Called(mwah)); - return true; - } - }; - - SH_DECL_HOOK1(Test, F299, SH_NOATTRIB, 0, bool, const char *); - SH_DECL_HOOK0_void(Test, F1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F2, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F3, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F4, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F5, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F6, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F7, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F8, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F9, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, F10, SH_NOATTRIB, 0); - - SH_DECL_HOOK0(Test, F20, const, 0, float); - SH_DECL_HOOK1_void(Test, F60, SH_NOATTRIB, 0, int&); - - META_RES g_F1Pre_WhatToDo; - META_RES g_F1Post_WhatToDo; - - struct HandlersF1 - { - void Pre() - { - ADD_STATE(State_F1_PreHandler_Called(reinterpret_cast(this))); - RETURN_META(g_F1Pre_WhatToDo); - } - - void Post() - { - ADD_STATE(State_F1_PostHandler_Called(reinterpret_cast(this))); - RETURN_META(g_F1Post_WhatToDo); - } - }; - - META_RES g_F299Pre_WhatToDo; - bool g_F299Pre_WhatToRet; - - bool F299_Pre(const char *mwah) - { - ADD_STATE(State_F299_PreHandlerCalled(mwah)); - RETURN_META_VALUE(g_F299Pre_WhatToDo, g_F299Pre_WhatToRet); - } - - bool F299_Post(const char *mwah) - { - ADD_STATE(State_F299_PostHandlerCalled(mwah)); - RETURN_META_VALUE(MRES_OVERRIDE, META_RESULT_STATUS >= MRES_OVERRIDE ? !META_RESULT_OVERRIDE_RET(bool) : - !META_RESULT_ORIG_RET(bool)); - } - - void F60_Pre(int &hello) - { - hello = 10; - } -} - -template T func(T a) -{ - return a; -} - - -bool TestBasic(std::string &error) -{ - // Simple test for ModuleInMemory - // 1) &error should on the stack - // 2) 0 should not be mapped - ADD_STATE(State_ModuleInMemory(SourceHook::ModuleInMemory(reinterpret_cast(&error), sizeof(error)))); - ADD_STATE(State_ModuleInMemory(SourceHook::ModuleInMemory(0, 1))); - - CHECK_STATES((&g_States, - new State_ModuleInMemory(true), - new State_ModuleInMemory(false), - NULL), "ModuleInMemory"); - - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - HandlersF1 f1_handlers; - Test test; - Test *pTest = &test; - - // 1) Get a call class and call the member through it and normally - SourceHook::CallClass *cc = SH_GET_CALLCLASS(pTest); - - ADD_STATE(State_F1_CallClassGenerated); - - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_CallClassGenerated, - new State_F1_Called, - new State_F1_Called, - NULL), "Part 1"); - - // 2) Request a call class again - SourceHook::CallClass *cc2 = SH_GET_CALLCLASS(pTest); - ADD_STATE(State_F1_CallClassGenerated); - - SH_CALL(cc, &Test::F1)(); - SH_CALL(cc2, &Test::F1)(); - pTest->F1(); - - SH_RELEASE_CALLCLASS(cc2); - ADD_STATE(State_F1_CallClassReleased); - - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_CallClassGenerated, - new State_F1_Called, - new State_F1_Called, - new State_F1_Called, - new State_F1_CallClassReleased, - new State_F1_Called, - new State_F1_Called, - NULL), "Part 2"); - - // 3) Add a pre hook - g_F1Pre_WhatToDo = MRES_SUPERCEDE; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false))); - - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookAdded(true), - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - NULL), "Part 3"); - - // 4) Rerequest the callclass - SH_RELEASE_CALLCLASS(cc); - - ADD_STATE(State_F1_CallClassReleased); - cc2 = SH_GET_CALLCLASS(pTest); - ADD_STATE(State_F1_CallClassGenerated); - - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_CallClassReleased, - new State_F1_CallClassGenerated, - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - NULL), "Part 4"); - - // 5) Check ignore / supercede - g_F1Pre_WhatToDo = MRES_SUPERCEDE; - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - g_F1Pre_WhatToDo = MRES_IGNORED; - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_Called, - NULL), "Part 5"); - - // 6) remove the hook again - SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false); - ADD_STATE(State_F1_HookRemoved); - - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookRemoved, - new State_F1_Called, - new State_F1_Called, - NULL), "Part 6"); - - // 7) add a post hook now - g_F1Post_WhatToDo = MRES_IGNORED; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Post, true))); - - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookAdded(true), - new State_F1_Called, - new State_F1_Called, - new State_F1_PostHandler_Called(&f1_handlers), - NULL), "Part 7"); - - // 8) And a pre hook again - g_F1Pre_WhatToDo = MRES_IGNORED; - ADD_STATE(State_F1_HookAdded(SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false))); - - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - g_F1Pre_WhatToDo = MRES_SUPERCEDE; - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookAdded(true), - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_Called, - new State_F1_PostHandler_Called(&f1_handlers), - new State_F1_Called, - new State_F1_PreHandler_Called(&f1_handlers), - new State_F1_PostHandler_Called(&f1_handlers), - NULL), "Part 8"); - - // 9) Remove all hooks - SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, false); - ADD_STATE(State_F1_HookRemoved); - SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Post, true); - ADD_STATE(State_F1_HookRemoved); - - SH_CALL(cc, &Test::F1)(); - pTest->F1(); - - CHECK_STATES((&g_States, - new State_F1_HookRemoved, - new State_F1_HookRemoved, - new State_F1_Called, - new State_F1_Called, - NULL), "Part 9"); - - // 10) Some checks on F299 - g_F299Pre_WhatToDo = MRES_IGNORED; - g_F299Pre_WhatToRet = false; - - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_Called("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.1"); - - SH_ADD_HOOK_STATICFUNC(Test, F299, pTest, F299_Pre, false); - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_PreHandlerCalled("hi"), - new State_F299_Called("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.2"); - - SH_ADD_HOOK_STATICFUNC(Test, F299, pTest, F299_Post, true); - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_PreHandlerCalled("hi"), - new State_F299_Called("hi"), - new State_F299_PostHandlerCalled("hi"), - new State_F299Ret(false), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.3"); - - g_F299Pre_WhatToDo = MRES_OVERRIDE; - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_PreHandlerCalled("hi"), - new State_F299_Called("hi"), - new State_F299_PostHandlerCalled("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.4"); - - g_F299Pre_WhatToDo = MRES_SUPERCEDE; - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_PreHandlerCalled("hi"), - new State_F299_PostHandlerCalled("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.5"); - - SH_REMOVE_HOOK_STATICFUNC(Test, F299, pTest, F299_Pre, false); - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_Called("hi"), - new State_F299_PostHandlerCalled("hi"), - new State_F299Ret(false), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.6"); - - SH_REMOVE_HOOK_STATICFUNC(Test, F299, pTest, F299_Post, true); - ADD_STATE(State_F299Ret(pTest->F299("hi"))); - ADD_STATE(State_F299Ret(SH_CALL(cc, &Test::F299)("hi"))); - - CHECK_STATES((&g_States, - new State_F299_Called("hi"), - new State_F299Ret(true), - new State_F299_Called("hi"), - new State_F299Ret(true), - NULL), "Part 10.7"); - - // 11) Release callclass - SH_RELEASE_CALLCLASS(cc); - ADD_STATE(State_F1_CallClassReleased); - - - CHECK_STATES((&g_States, - new State_F1_CallClassReleased, - NULL), "Part 11"); - - // 12) Test? Test. - SH_ADD_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_ADD_HOOK_MEMFUNC(Test, F2, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_ADD_HOOK_MEMFUNC(Test, F3, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F4, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_ADD_HOOK_MEMFUNC(Test, F5, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F6, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_ADD_HOOK_MEMFUNC(Test, F7, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F8, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F9, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_ADD_HOOK_MEMFUNC(Test, F10, pTest, &f1_handlers, &HandlersF1::Pre, false); - - SH_REMOVE_HOOK_MEMFUNC(Test, F1, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_REMOVE_HOOK_MEMFUNC(Test, F2, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_REMOVE_HOOK_MEMFUNC(Test, F3, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F4, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_REMOVE_HOOK_MEMFUNC(Test, F5, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F6, pTest, &f1_handlers, &HandlersF1::Pre, true); - SH_REMOVE_HOOK_MEMFUNC(Test, F7, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F8, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F9, pTest, &f1_handlers, &HandlersF1::Pre, false); - SH_REMOVE_HOOK_MEMFUNC(Test, F10, pTest, &f1_handlers, &HandlersF1::Pre, false); - - SH_ADD_HOOK_STATICFUNC(Test, F60, pTest, F60_Pre, false); - - int a = 0; - pTest->F60(a); - Test_CompleteShutdown(g_SHPtr); - - CHECK_COND(a == 10, "Part12.a"); - - return true; -} diff --git a/sourcehook/test/test2.cpp b/sourcehook/test/test2.cpp deleted file mode 100644 index 1164e0f..0000000 --- a/sourcehook/test/test2.cpp +++ /dev/null @@ -1,171 +0,0 @@ -#include -#include "sourcehook_test.h" -#include "testevents.h" -#include - -// TEST2 -// Vafmt and Overloaded functions -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_EatYams_Called, int); - MAKE_STATE_1(State_EatYams_Handler_Called, int); - MAKE_STATE_2(State_Vafmt_Called, int, std::string); - MAKE_STATE_2(State_Vafmt_PreHandler_Called, int, std::string); - MAKE_STATE_2(State_Vafmt_PostHandler_Called, int, std::string); - - class IGaben - { - public: - virtual void EatYams() - { - ADD_STATE(State_EatYams_Called(0)); - } - virtual bool EatYams(const char *location) const - { - ADD_STATE(State_EatYams_Called(1)); - return true; - } - virtual void Vafmt1(bool param1, int x, const char *fmt, ...) - { - va_list ap; - va_start(ap, fmt); - char buffer[512]; - vsprintf(buffer, fmt, ap); - va_end(ap); - ADD_STATE(State_Vafmt_Called(1, std::string(buffer))); - } - virtual float Vafmt2(const char *fmt, ...) - { - va_list ap; - va_start(ap, fmt); - char buffer[512]; - vsprintf(buffer, fmt, ap); - va_end(ap); - ADD_STATE(State_Vafmt_Called(2, std::string(buffer))); - return 0.0f; - } - }; - - SH_DECL_HOOK0_void(IGaben, EatYams, SH_NOATTRIB, 0); - SH_DECL_HOOK1(IGaben, EatYams, const, 1, bool, const char *); - SH_DECL_HOOK2_void_vafmt(IGaben, Vafmt1, SH_NOATTRIB, 0, bool, int); - SH_DECL_HOOK0_vafmt(IGaben, Vafmt2, SH_NOATTRIB, 0, float); - - void EatYams0_Handler() - { - ADD_STATE(State_EatYams_Handler_Called(0)); - } - - bool EatYams1_Handler(const char *loc) - { - ADD_STATE(State_EatYams_Handler_Called(1)); - return true; - } - - void Vafmt1_PreHandler(bool param1, int x, const char *in) - { - ADD_STATE(State_Vafmt_PreHandler_Called(1, std::string(in))); - } - void Vafmt1_PostHandler(bool param1, int x, const char *in) - { - ADD_STATE(State_Vafmt_PostHandler_Called(1, std::string(in))); - } - float Vafmt2_PreHandler(const char *in) - { - ADD_STATE(State_Vafmt_PreHandler_Called(2, std::string(in))); - return 0.0f; - } - float Vafmt2_PostHandler(const char *in) - { - ADD_STATE(State_Vafmt_PostHandler_Called(2, std::string(in))); - return 0.0f; - } -} - - -bool TestVafmtAndOverload(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - IGaben gabgab; - IGaben *pGab = &gabgab; - - SourceHook::CallClass *cc = SH_GET_CALLCLASS(pGab); - - // Part 1 - SH_CALL(cc, static_cast(&IGaben::EatYams))(); - SH_CALL(cc, static_cast(&IGaben::EatYams))("Here!"); - - SH_ADD_HOOK(IGaben, EatYams, pGab, EatYams0_Handler, false); - SH_ADD_HOOK(IGaben, EatYams, pGab, EatYams1_Handler, false); - - pGab->EatYams(); - pGab->EatYams("Here!"); - - SH_REMOVE_HOOK(IGaben, EatYams, pGab, EatYams0_Handler, false); - SH_REMOVE_HOOK(IGaben, EatYams, pGab, EatYams1_Handler, false); - - CHECK_STATES((&g_States, - new State_EatYams_Called(0), - new State_EatYams_Called(1), - new State_EatYams_Handler_Called(0), - new State_EatYams_Called(0), - new State_EatYams_Handler_Called(1), - new State_EatYams_Called(1), - NULL),"Part 1"); - - // Part 2 - pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); - SH_CALL(cc, &IGaben::Vafmt1)(true, 55, "Hello %s%d%s", "BA", 1, "L"); - pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); - SH_CALL(cc, &IGaben::Vafmt2)("Hello %s%d%s", "BA", 1, "LOPAN"); - - CHECK_STATES((&g_States, - new State_Vafmt_Called(1, "Hello BA1L"), - new State_Vafmt_Called(1, "Hello BA1L"), - new State_Vafmt_Called(2, "Hello BA1LOPAN"), - new State_Vafmt_Called(2, "Hello BA1LOPAN"), - NULL), "Part 2"); - - // Part 3 - SH_ADD_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PreHandler, false); - SH_ADD_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PostHandler, true); - SH_ADD_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PreHandler, false); - SH_ADD_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PostHandler, true); - - pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); - pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); - - CHECK_STATES((&g_States, - new State_Vafmt_PreHandler_Called(1, std::string("Hello BA1L")), - new State_Vafmt_Called(1, std::string("Hello BA1L")), - new State_Vafmt_PostHandler_Called(1, std::string("Hello BA1L")), - - new State_Vafmt_PreHandler_Called(2, std::string("Hello BA1LOPAN")), - new State_Vafmt_Called(2, std::string("Hello BA1LOPAN")), - new State_Vafmt_PostHandler_Called(2, std::string("Hello BA1LOPAN")), - NULL), "Part 3"); - - // Part 4 - SH_REMOVE_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PreHandler, false); - SH_REMOVE_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PostHandler, true); - SH_REMOVE_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PreHandler, false); - SH_REMOVE_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PostHandler, true); - - pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); - pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); - - CHECK_STATES((&g_States, - new State_Vafmt_Called(1, "Hello BA1L"), - new State_Vafmt_Called(2, "Hello BA1LOPAN"), - NULL), "Part 4"); - - SH_RELEASE_CALLCLASS(cc); - - return true; -} diff --git a/sourcehook/test/test3.cpp b/sourcehook/test/test3.cpp deleted file mode 100644 index 97d04c2..0000000 --- a/sourcehook/test/test3.cpp +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include "sourcehook_test.h" -#include "testevents.h" - -// TEST3 -// Tests with inheritance / thisptroffsets - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Func1_Called, void*); // param1: This pointer - MAKE_STATE_1(State_Func2_Called, void*); // param1: This pointer - MAKE_STATE_1(State_Func3_Called, void*); // param1: This pointer - - MAKE_STATE_1(State_Func1H_Called, void*); - MAKE_STATE_1(State_Func2H_Called, void*); - MAKE_STATE_1(State_Func3H_Called, void*); - - class Base1 - { - int a; - public: - virtual void Func1() - { - ADD_STATE(State_Func1_Called(reinterpret_cast(this))); - } - }; - class Base2 - { - int b; - public: - virtual void Func2() - { - ADD_STATE(State_Func2_Called(reinterpret_cast(this))); - } - }; - class Derived : public Base1, public Base2 - { - int c; - public: - virtual void Func3() - { - ADD_STATE(State_Func3_Called(reinterpret_cast(this))); - } - }; - - SH_DECL_HOOK0_void(Derived, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Derived, Func2, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Derived, Func3, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Base1, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Base2, Func2, SH_NOATTRIB, 0); - - void Handler_Func1() - { - ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); - } - void Handler_Func2() - { - ADD_STATE(State_Func2H_Called(META_IFACEPTR(void))); - } - void Handler_Func3() - { - ADD_STATE(State_Func3H_Called(META_IFACEPTR(void))); - } -} - -bool TestThisPtrOffs(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - Derived inst; - Derived *pD = &inst; - Base1 *pB1 = pD; - Base2 *pB2 = pD; - - // It should be: - // pB1 = pD - // pB2 > pB1 - - // 1) - // Get a callclass for pD - // Verify whether the this pointers are correct - // Also call them normally to make sure that we aren't messing it up ;) - SourceHook::CallClass *pD_CC = SH_GET_CALLCLASS(pD); - - SH_CALL(pD_CC, &Derived::Func1)(); - SH_CALL(pD_CC, &Derived::Func2)(); - SH_CALL(pD_CC, &Derived::Func3)(); - pD->Func1(); - pD->Func2(); - pD->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - new State_Func3_Called(pD), - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - new State_Func3_Called(pD), - NULL), "Part 1"); - - SH_CALL(pD_CC, &Base1::Func1)(); - SH_CALL(pD_CC, &Base2::Func2)(); - - CHECK_STATES((&g_States, - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - NULL), "Part 1.1"); - - // 2) - // Get callclasses for the other ones and verify it as well - - SourceHook::CallClass *pB1_CC = SH_GET_CALLCLASS(pB1); - SourceHook::CallClass *pB2_CC = SH_GET_CALLCLASS(pB2); - - SH_CALL(pB1_CC, &Base1::Func1)(); - SH_CALL(pB2_CC, &Base2::Func2)(); - - CHECK_STATES((&g_States, - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - NULL), "Part 2"); - - - // 3) Add hooks on them (referring to them through pD1 / Derived) - // Check whether the hooks are called with the correct this pointer - - SH_ADD_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); - - pD->Func1(); - pD->Func2(); - pD->Func3(); - pB1->Func1(); - pB2->Func2(); - - // The handlers should always be called with the pointer to Derived - CHECK_STATES((&g_States, - new State_Func1H_Called(pD), - new State_Func1_Called(pB1), - new State_Func2H_Called(pD), - new State_Func2_Called(pB2), - new State_Func3H_Called(pD), - new State_Func3_Called(pD), - new State_Func1H_Called(pD), - new State_Func1_Called(pB1), - new State_Func2H_Called(pD), - new State_Func2_Called(pB2), - NULL), "Part 3"); - - SH_REMOVE_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); - - // 4) - // Now add the hooks on Base1 and Base2 and check again - - // Note that the new implicit_cast should convert the pD to Base1*/Base2* :) - SH_ADD_HOOK_STATICFUNC(Base1, Func1, pD, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Base2, Func2, pD, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); - - pD->Func1(); - pD->Func2(); - pD->Func3(); - pB1->Func1(); - pB2->Func2(); - - // This time, the handlers for Func1 should be called with pB1 and the handlers - // for Func2 should be called with pB2 - CHECK_STATES((&g_States, - new State_Func1H_Called(pB1), - new State_Func1_Called(pB1), - new State_Func2H_Called(pB2), - new State_Func2_Called(pB2), - new State_Func3H_Called(pD), - new State_Func3_Called(pD), - new State_Func1H_Called(pB1), - new State_Func1_Called(pB1), - new State_Func2H_Called(pB2), - new State_Func2_Called(pB2), - NULL), "Part 4"); - - SH_REMOVE_HOOK_STATICFUNC(Base1, Func1, pD, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(Base2, Func2, pD, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); - - - // 5) - // Add some hooks, and use callclasses - - // 5.1) First off, add all of them on pD - SH_ADD_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); - - pD->Func1(); - pD->Func2(); - pD->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called(pD), - new State_Func1_Called(pB1), - new State_Func2H_Called(pD), - new State_Func2_Called(pB2), - new State_Func3H_Called(pD), - new State_Func3_Called(pD), - NULL), "Part 5.1"); - - SH_CALL(pD_CC, &Derived::Func1)(); - SH_CALL(pD_CC, &Derived::Func2)(); - SH_CALL(pD_CC, &Derived::Func3)(); - SH_CALL(pB1_CC, &Base1::Func1)(); - SH_CALL(pB2_CC, &Base2::Func2)(); - - CHECK_STATES((&g_States, - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - new State_Func3_Called(pD), - new State_Func1_Called(pB1), - new State_Func2_Called(pB2), - NULL), "Part 5.2"); - - SH_REMOVE_HOOK_STATICFUNC(Derived, Func1, pD, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func2, pD, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(Derived, Func3, pD, Handler_Func3, false); - - SH_RELEASE_CALLCLASS(pB1_CC); - SH_RELEASE_CALLCLASS(pB2_CC); - SH_RELEASE_CALLCLASS(pD_CC); - - return true; -} diff --git a/sourcehook/test/test4.cpp b/sourcehook/test/test4.cpp deleted file mode 100644 index f2b0a88..0000000 --- a/sourcehook/test/test4.cpp +++ /dev/null @@ -1,420 +0,0 @@ -#include -#include "sourcehook_test.h" -#include "testevents.h" - -// TEST4 -// Tests of plugin management system - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE(State_Func1_Called); - MAKE_STATE(State_Func2_Called); - MAKE_STATE(State_Func3_Called); - - MAKE_STATE(State_Func1H_Called); - MAKE_STATE(State_Func2H_Called); - MAKE_STATE(State_Func3H_Called); - - MAKE_STATE_2(State_PluginInUse, int, bool); - - class Test - { - public: - virtual void Func1() - { - ADD_STATE(State_Func1_Called); - } - - virtual void Func2() - { - ADD_STATE(State_Func2_Called); - } - - virtual void Func3() - { - ADD_STATE(State_Func3_Called); - } - }; - - SH_DECL_HOOK0_void(Test, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, Func2, SH_NOATTRIB, 0); - SH_DECL_HOOK0_void(Test, Func3, SH_NOATTRIB, 0); - - void Handler_Func1() - { - ADD_STATE(State_Func1H_Called); - } - void Handler_Func2() - { - ADD_STATE(State_Func2H_Called); - } - void Handler_Func3() - { - ADD_STATE(State_Func3H_Called); - } -} - -bool TestPlugSys(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - Test inst; - Test *pInst = &inst; - - // 1) - // Add hooks, then issue a complete shutdown - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 1.1"); - - Test_CompleteShutdown(g_SHPtr); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called, - new State_Func2_Called, - new State_Func3_Called, - NULL), "Part 1.2"); - - // 2) - // Add hooks from "different plugins", then shutdown the plugins - - g_PLID = 1; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - g_PLID = 3; - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); - - g_PLID = 1; - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); - - g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); - - g_PLID = 3; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 2.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 2.2"); - - // Unload plugins one by one - Test_UnloadPlugin(g_SHPtr, 3); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 2.3.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, false), - new State_PluginInUse(4, false), - NULL), "Part 2.3.2"); - - Test_UnloadPlugin(g_SHPtr, 2); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 2.4.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, false), - new State_PluginInUse(3, false), - new State_PluginInUse(4, false), - NULL), "Part 2.4.2"); - - Test_UnloadPlugin(g_SHPtr, 1); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called, - new State_Func2_Called, - new State_Func3_Called, - NULL), "Part 2.5.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, false), - new State_PluginInUse(2, false), - new State_PluginInUse(3, false), - new State_PluginInUse(4, false), - NULL), "Part 2.5.2"); - - - // 3) - // Add hooks from "different plugins", then pause the plugins - - g_PLID = 1; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - g_PLID = 3; - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); - - g_PLID = 1; - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); - - g_PLID = 2; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func3, pInst, Handler_Func3, false); - - g_PLID = 3; - SH_ADD_HOOK_STATICFUNC(Test, Func1, pInst, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, pInst, Handler_Func2, true); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 3.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.2"); - - // Unload plugins one by one - Test_PausePlugin(g_SHPtr, 3); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 3.3.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.3.2"); - - Test_PausePlugin(g_SHPtr, 2); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 3.4.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.4.2"); - - Test_PausePlugin(g_SHPtr, 1); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called, - new State_Func2_Called, - new State_Func3_Called, - NULL), "Part 3.5.1"); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.5.2"); - - Test_UnpausePlugin(g_SHPtr, 1); - Test_UnpausePlugin(g_SHPtr, 2); - Test_UnpausePlugin(g_SHPtr, 3); - - ADD_STATE(State_PluginInUse(1, Test_IsPluginInUse(g_SHPtr, 1))); - ADD_STATE(State_PluginInUse(2, Test_IsPluginInUse(g_SHPtr, 2))); - ADD_STATE(State_PluginInUse(3, Test_IsPluginInUse(g_SHPtr, 3))); - ADD_STATE(State_PluginInUse(4, Test_IsPluginInUse(g_SHPtr, 4))); - - CHECK_STATES((&g_States, - new State_PluginInUse(1, true), - new State_PluginInUse(2, true), - new State_PluginInUse(3, true), - new State_PluginInUse(4, false), - NULL), "Part 3.6"); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1H_Called, - new State_Func1_Called, - new State_Func2_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func2H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3H_Called, - new State_Func3_Called, - NULL), "Part 3.7"); - - // 4) Shutdown :) - Test_CompleteShutdown(g_SHPtr); - - pInst->Func1(); - pInst->Func2(); - pInst->Func3(); - - CHECK_STATES((&g_States, - new State_Func1_Called, - new State_Func2_Called, - new State_Func3_Called, - NULL), "Part 4"); - - return true; -} diff --git a/sourcehook/test/testbail.cpp b/sourcehook/test/testbail.cpp deleted file mode 100644 index ebb6d92..0000000 --- a/sourcehook/test/testbail.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// TESTBAIL -// This test used to be a test for a bug BAIL found. -// That bug is now fixed so I've granted BAIL the pleasure of being a test for -// the correct priority ordering of hook managers based on their version. - -/* - THE PROBLEM: - Old hook funcs don't work right when you combine override returns and recalls. - THE SOLUTION: - Always use a new hook func when possible. For this, hook funcs have to be able to say - " HELLO I'M NEW! " - - This file tests that functionality. - - How it works: - testbail.cpp compiles with old version of sourcehook.h. - It sets everything up, adds a hook on a function - Then testbail2.cpp which has the new version adds a hook on the same function and - does a recall and overrides the value in it. -*/ -#include "sourcehook_test.h" -#include "testbail.h" - -namespace N_TestBail -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - IGaben *g_Gabgab; -} - -namespace -{ - int EatYams_Handler1(int a) - { - ADD_STATE(State_EatYams_Handler1_Called(a)); - RETURN_META_VALUE(MRES_IGNORED, 0); - } -} - -bool TestBail(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - g_Gabgab = new IGaben; - - SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); - - ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); - - CHECK_STATES((&g_States, - new State_EatYams_Handler1_Called(0xDEAD), - new State_EatYams_Called(0xDEAD), - new State_EatYams_Return(5), - NULL), "Part 1"); - - if (!TestBail2(error)) - return false; - - CHECK_STATES((&g_States, - new State_EatYams_Handler1_Called(0xDEAD), - new State_EatYams_Handler2_Called(0xDEAD), - new State_EatYams_Handler3_Called(0xBEEF), - new State_EatYams_Called(0xBEEF), - NULL), "Part 2.1"); - - // WHAT IF NOW SOMEONE UNLOADS PLUGIN 2 !?!?!?!? - Test_UnloadPlugin(g_SHPtr, 2); - - ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); - - CHECK_STATES((&g_States, - new State_EatYams_Handler1_Called(0xDEAD), - new State_EatYams_Called(0xDEAD), - new State_EatYams_Return(5), - NULL), "Part 3"); - - SH_REMOVE_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); - - ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); - - CHECK_STATES((&g_States, - new State_EatYams_Called(0xDEAD), - new State_EatYams_Return(5), - NULL), "Part 4"); - - // Now, heh, try it the other way round. - - Test_CompleteShutdown(g_SHPtr); - - if (!TestBail2(error)) - return false; - - CHECK_STATES((&g_States, - new State_EatYams_Handler2_Called(0xDEAD), - new State_EatYams_Handler3_Called(0xBEEF), - new State_EatYams_Called(0xBEEF), - NULL), "Part 5"); - - SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); - - ADD_STATE(State_EatYams_Return(g_Gabgab->EatYams(0xDEAD))); - - CHECK_STATES((&g_States, - new State_EatYams_Handler2_Called(0xDEAD), - new State_EatYams_Handler3_Called(0xBEEF), - new State_EatYams_Handler1_Called(0xBEEF), - new State_EatYams_Called(0xBEEF), - new State_EatYams_Return(6), - NULL), "Part 6"); - - SH_REMOVE_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler1, false); - - UntestBail2(); - - delete g_Gabgab; - - return true; -} diff --git a/sourcehook/test/testbail.h b/sourcehook/test/testbail.h deleted file mode 100644 index f0eed7c..0000000 --- a/sourcehook/test/testbail.h +++ /dev/null @@ -1,40 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// Shared data for testbail - -#include -#include "testevents.h" - -namespace N_TestBail -{ - extern StateList g_States; - extern SourceHook::ISourceHook *g_SHPtr; - - MAKE_STATE_1(State_EatYams_Called, int); - MAKE_STATE_1(State_EatYams_Handler1_Called, int); - MAKE_STATE_1(State_EatYams_Handler2_Called, int); - MAKE_STATE_1(State_EatYams_Handler3_Called, int); - MAKE_STATE_1(State_EatYams_Return, int); - - class IGaben - { - public: - virtual int EatYams(int a) - { - ADD_STATE(State_EatYams_Called(a)); - return 5; - } - }; - - extern IGaben *g_Gabgab; - - bool TestBail2(std::string &error); - void UntestBail2(); -} - -using namespace N_TestBail; - -namespace -{ - SourceHook::Plugin g_PLID; - SH_DECL_HOOK1(IGaben, EatYams, SH_NOATTRIB, 0, int, int); -} diff --git a/sourcehook/test/testbail2.cpp b/sourcehook/test/testbail2.cpp deleted file mode 100644 index d1d6d3c..0000000 --- a/sourcehook/test/testbail2.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// TESTBAIL -// Different compilation unit - -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testbail.h" - -static unsigned int n_calls = 0; - -int EatYams_Handler2(int a) -{ - ADD_STATE(State_EatYams_Handler2_Called(a)); - RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 6, &IGaben::EatYams, (0xBEEF)); -} - -int EatYams_Handler3(int a) -{ - ADD_STATE(State_EatYams_Handler3_Called(a)); - RETURN_META_VALUE(MRES_IGNORED, 0); -} - -namespace N_TestBail -{ - bool TestBail2(std::string &error) - { - g_PLID = 2; - - SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler2, false); - SH_ADD_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler3, false); - - int ret = g_Gabgab->EatYams(0xDEAD); - - CHECK_COND(ret == 6, "Part 2.1"); - - n_calls++; - - return true; - } - - void UntestBail2() - { - while (n_calls) - { - SH_REMOVE_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler3, false); - SH_REMOVE_HOOK_STATICFUNC(IGaben, EatYams, g_Gabgab, EatYams_Handler2, false); - n_calls--; - } - } -} diff --git a/sourcehook/test/testevents.h b/sourcehook/test/testevents.h deleted file mode 100644 index ef7c891..0000000 --- a/sourcehook/test/testevents.h +++ /dev/null @@ -1,153 +0,0 @@ -/* ======== SourceHook ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): Pavol "PM OnoTo" Marko -* ============================ -*/ - -#ifndef __TESTEVENTS_H__ -#define __TESTEVENTS_H__ - -#include -#include -#include -#include -#include - -extern bool g_Verbose; - -struct State -{ - virtual ~State() - { - - } - - virtual bool IsEqual(State *other) - { - return (typeid(other) == typeid(this)) ? true : false; - } - - virtual void Dump() = 0; -}; - -typedef std::list StateList; -namespace -{ - void DumpStates(StateList *sl) - { - for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) - (*iter)->Dump(); - } - - bool StatesOk(StateList *sl, ...) - { - StateList requiredstates; - va_list argptr; - va_start(argptr, sl); - while (true) - { - State *cs = va_arg(argptr, State*); - if (!cs) - break; - requiredstates.push_back(cs); - } - va_end(argptr); - - if (requiredstates.size() != sl->size()) - { - if (g_Verbose) - { - std::cout << std::endl << "FAIL: Should be:" << std::endl; - DumpStates(&requiredstates); - std::cout << std::endl << "FAIL: Is:" << std::endl; - DumpStates(sl); - } - - for (StateList::iterator iter = requiredstates.begin(); iter != requiredstates.end(); ++iter) - delete *iter; - for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) - delete *iter; - sl->clear(); - return false; - } - - bool ok = true; - StateList::iterator req_iter = requiredstates.begin(); - for (StateList::iterator o_iter = sl->begin(); o_iter != sl->end(); ++o_iter, ++req_iter) - { - if (!(*o_iter)->IsEqual(*req_iter)) - { - ok = false; - break; - } - } - - for (StateList::iterator iter = requiredstates.begin(); iter != requiredstates.end(); ++iter) - delete *iter; - for (StateList::iterator iter = sl->begin(); iter != sl->end(); ++iter) - delete *iter; - sl->clear(); - - return ok; - } -} - -#define ADD_STATE(name) g_States.push_back(new name) -#define ADD_STATE_PTR(statesptr, name) statesptr->push_back(new name) - -#define CHECK_STATES(mwah, myerr) if (!StatesOk mwah) { error=myerr; return false; } else if (g_Verbose) { std::cout << "No error: " << myerr << std::endl; } - -#define MAKE_STATE(name) struct name : State { \ - virtual void Dump() { \ - std::cout << " " << #name << std::endl; } \ - }; - -#define MAKE_STATE_1(name, p1_type) struct name : State { \ - p1_type m_Param1; \ - name(p1_type param1) : m_Param1(param1) {} \ - virtual bool IsEqual(State *other) { \ - name *other2 = dynamic_cast(other); \ - if (!other2) \ - return false; \ - return other2->m_Param1 == m_Param1;\ - } \ - virtual void Dump() { \ - std::cout << " " << #name << "; Param1=" << m_Param1 << std::endl; } \ - } - -#define MAKE_STATE_2(name, p1_type, p2_type) struct name : State { \ - p1_type m_Param1; \ - p2_type m_Param2; \ - name(p1_type param1, p2_type param2) : m_Param1(param1), m_Param2(param2) {} \ - virtual bool IsEqual(State *other) { \ - name *other2 = dynamic_cast(other); \ - if (!other2) \ - return false; \ - return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2;\ - } \ - virtual void Dump() { \ - std::cout << " " << #name << "; Param1=" << m_Param1 << "; Param2=" << m_Param2 << std::endl; } \ - } - -#define MAKE_STATE_3(name, p1_type, p2_type, p3_type) struct name : State { \ - p1_type m_Param1; \ - p2_type m_Param2; \ - p3_type m_Param3; \ - name(p1_type param1, p2_type param2, p3_type param3) : m_Param1(param1), m_Param2(param2), m_Param3(param3) {} \ - virtual bool IsEqual(State *other) { \ - name *other2 = dynamic_cast(other); \ - if (!other2) \ - return false; \ - return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2 && other2->m_Param3 == m_Param3;\ - } \ - virtual void Dump() { \ - std::cout << " " << #name << "; Param1=" << m_Param1 << "; Param2=" << m_Param2 << "; Param3=" << m_Param3 << std::endl; } \ - } - -#define CHECK_COND(c, err) if (!(c)) { error = err; return false; } - -#endif diff --git a/sourcehook/test/testlist.cpp b/sourcehook/test/testlist.cpp deleted file mode 100644 index bbaa4d3..0000000 --- a/sourcehook/test/testlist.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include -#include "sh_list.h" -#include "sh_stack.h" -#include "sh_tinyhash.h" -#include "sh_vector.h" -#include "testevents.h" - -// TEST LIST -// Tests sh_list, sh_tinyhash, sh_vector - -// :TODO: vector test, list insert test - -namespace -{ - struct Hmm - { - Hmm *m_This; - int m_Int; - Hmm(const Hmm &other) : m_Int(other.m_Int) - { - m_This = this; - } - Hmm(int i) : m_Int(i) - { - m_This = this; - } - Hmm() : m_Int(0) - { - m_This = this; - } - void operator = (const Hmm &other) - { - m_Int = other.m_Int; - } - operator int () const - { - return m_Int; - } - }; - - #define LIST_THIS_CHECK(lst, err) \ - for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) \ - CHECK_COND(&(*iter) == iter->m_This, err); - - bool DoTestList(std::string &error) - { - typedef SourceHook::List ListType; - ListType lst; - - CHECK_COND(lst.empty(), "Part1"); - - for (int i = 1; i <= 100; ++i) - lst.push_back(i); - - LIST_THIS_CHECK(lst, "PartA1"); - - CHECK_COND(!lst.empty(), "Part2"); - - lst.clear(); - - CHECK_COND(lst.empty(), "Part3"); - - for (int i = 1; i <= 100; ++i) - lst.push_back(i); - - CHECK_COND(lst.back() == 100, "Part4"); - LIST_THIS_CHECK(lst, "PartA2"); - - int ver = 1; - for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) - CHECK_COND(*iter == ver++, "Part5"); - - CHECK_COND(ver == 101, "Part 6"); - - ListType::iterator iter50 = lst.find(50); - CHECK_COND(*iter50 == 50, "Part7"); - - iter50 = lst.erase(iter50); - CHECK_COND(*iter50 == 51, "Part8"); - CHECK_COND(*--iter50 == 49, "Part8.2"); - - lst.remove(80); - - ver = 1; - for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) - { - CHECK_COND(*iter == ver++, "Part9"); - if (ver == 50 || ver == 80) - ++ver; - } - CHECK_COND(ver == 101, "Part10"); - LIST_THIS_CHECK(lst, "PartA3"); - - ListType lst2; - lst = lst2; - CHECK_COND(lst.empty(), "Part11"); - - for (int i = 1; i <= 100; ++i) - lst.push_back(i); - lst2 = lst; - CHECK_COND(lst2.size() == 100, "Part11.2"); - - LIST_THIS_CHECK(lst, "PartA4"); - LIST_THIS_CHECK(lst2, "PartA5"); - - ver = 1; - for (ListType::iterator iter = lst2.begin(); iter != lst2.end(); ++iter) - CHECK_COND(*iter == ver++, "Part12"); - - lst.clear(); - for (int i = 401; i <= 500; ++i) - lst.push_back(i); - lst = lst2; - CHECK_COND(lst2.size() == 100, "Part13"); - - ver = 1; - for (ListType::iterator iter = lst.begin(); iter != lst.end(); ++iter) - CHECK_COND(*iter == ver++, "Part14"); - - LIST_THIS_CHECK(lst, "PartA6"); - LIST_THIS_CHECK(lst2, "PartA7"); - - return true; - } - - bool DoTestTinyHash(std::string &error) - { - const int mymax = 5000; - - typedef SourceHook::THash HashType; - HashType hash; - - for (int i = 1; i <= mymax; ++i) - hash[i] = i + 5000; - - for (int i = 1; i <= mymax; ++i) - CHECK_COND(hash[i] == i + 5000, "Part1"); - - // Find - int ver = 1; - HashType::iterator iter; - for (iter = hash.begin(); iter != hash.end(); ++iter) - CHECK_COND(iter->key == ver && iter->val == (ver++) + 5000, "Part2"); - - CHECK_COND(ver == mymax+1, "Part2.1"); - - iter = hash.find(300); - CHECK_COND(iter != hash.end() && iter->val == 300+5000, "Part3.1"); - iter = hash.find(mymax+200); - CHECK_COND(iter == hash.end(), "Part3.2"); - - HashType hash2; - for (int i = 1; i <= mymax; ++i) - hash2[i] = i + 5000; - - hash2.erase(mymax - 100); - CHECK_COND(hash2.find(mymax - 101) != hash2.end(), "Part 4.1"); - CHECK_COND(hash2.find(mymax - 99) != hash2.end(), "Part 4.2"); - CHECK_COND(hash2.find(mymax - 100) == hash2.end(), "Part 4.3"); - hash2.erase(mymax - 99); - CHECK_COND(hash2.find(mymax - 101) != hash2.end(), "Part 4.4"); - CHECK_COND(hash2.find(mymax - 99) == hash2.end(), "Part 4.5"); - CHECK_COND(hash2.find(mymax - 100) == hash2.end(), "Part 4.6"); - - return true; - } - - bool DoTestStack(std::string &error) - { - typedef SourceHook::CStack IntStack; - IntStack stk; - int i; - - CHECK_COND(stk.size() == 0 && stk.empty(), "A0"); - - for (i = 0; i < 5000; ++i) - stk.push(i); - - CHECK_COND(stk.front() == 4999, "1"); - CHECK_COND(stk.size() == 5000 && !stk.empty(), "A1"); - - IntStack::iterator iter; - i = 0; - for (iter = stk.begin(); iter != stk.end(); ++iter, ++i) - CHECK_COND(*iter == i, "2"); - - i = 0; - for (iter = stk.begin(); iter != stk.end(); iter++, ++i) - CHECK_COND(*iter == i, "3"); - - --iter; - iter--; - *iter = 'g'+'a'+'b'+'e'+'n'; - stk.pop(); - - CHECK_COND(stk.size() == 4999 && !stk.empty(), "A2"); - CHECK_COND(stk.front() == 'g'+'a'+'b'+'e'+'n', "4"); - - IntStack stk2(stk); - CHECK_COND(stk2.size() == 4999 && !stk2.empty(), "A3"); - - IntStack::iterator iter2 = stk2.begin(); - for (iter = stk.begin(); iter != stk.end(); ++iter, iter2++) - CHECK_COND(*iter == *iter2, "5"); - - while (!stk2.empty()) - stk2.pop(); - CHECK_COND(stk2.size() == 0 && stk2.empty(), "A4"); - stk = stk2; - CHECK_COND(stk.size() == 0 && stk.empty(), "A5"); - - return true; - } - - bool DoTestVec(std::string &error) - { - typedef SourceHook::CVector IntVector; - IntVector vec1; - IntVector::iterator iter; - int i; - - CHECK_COND(vec1.size() == 0 && vec1.empty(), "V1"); - for (i = 0; i < 500; ++i) - vec1.push_back(i); - - CHECK_COND(vec1.size() == 500 && !vec1.empty(), "V2"); - - for (i = 0; i < 500; ++i) - CHECK_COND(vec1[i] == i, "V3"); - - for (i = 0, iter = vec1.begin(); iter != vec1.end(); ++iter, ++i) - CHECK_COND(*iter == i, "V4"); - - vec1.resize(1000); - for (i = 0; i < 500; ++i) - CHECK_COND(vec1[i] == i, "V5.1"); - for (i = 500; i < 1000; ++i) - CHECK_COND(vec1[i] == 0, "V5.2"); - - vec1.resize(200); - for (i = 0; i < 200; ++i) - CHECK_COND(vec1[i] == i, "V6"); - - vec1.resize(500, 0x12345678); - for (i = 0; i < 200; ++i) - CHECK_COND(vec1[i] == i, "V7.1"); - for (i = 200; i < 500; ++i) - CHECK_COND(vec1[i] == 0x12345678, "V7.2"); - - IntVector vec2(vec1); - CHECK_COND(vec2.size() == vec1.size() && vec2.empty() == vec1.empty(), "V8.0"); - for (i = 0; i < 200; ++i) - CHECK_COND(vec2[i] == i, "V8.1"); - for (i = 200; i < 500; ++i) - CHECK_COND(vec2[i] == 0x12345678, "V8.2"); - - - vec1.clear(); - CHECK_COND(vec1.size() == 0 && vec1.empty() && vec1.begin() == vec1.end(), "V9"); - vec2 = vec1; - CHECK_COND(vec2.size() == 0 && vec2.empty() && vec2.begin() == vec2.end(), "V9"); - - return true; - } -} - -bool TestList(std::string &error) -{ - if (!DoTestList(error)) - return false; - - if (!DoTestTinyHash(error)) - return false; - - if (!DoTestStack(error)) - return false; - - if (!DoTestVec(error)) - return false; - - return true; -} diff --git a/sourcehook/test/testmanual.cpp b/sourcehook/test/testmanual.cpp deleted file mode 100644 index 0d1013a..0000000 --- a/sourcehook/test/testmanual.cpp +++ /dev/null @@ -1,355 +0,0 @@ -#include -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testevents.h" - -// TESTMANUAL -// Test manual hooks -// :TODO: test more extensively - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Func1_Called, void*); // param1: This pointer - MAKE_STATE_2(State_Func2_Called, void*, int); // param1: This pointer; param2: parameter - MAKE_STATE_1(State_Func3_Called, void*); // param1: This pointer - MAKE_STATE_2(State_Func4_Called, void*, int); // param1: This pointer; param2: parameter - MAKE_STATE_1(State_Func5_Called, void*); // param1: This pointer - - MAKE_STATE_1(State_Func1H_Called, void*); - MAKE_STATE_2(State_Func2H_Called, void*, int); - MAKE_STATE_1(State_Func3H_Called, void*); - MAKE_STATE_2(State_Func4H_Called, void*, int); - - MAKE_STATE_1(State_Return, short); - - class TheWall - { - public: - virtual void Func1() - { - ADD_STATE(State_Func1_Called(reinterpret_cast(this))); - } - virtual void Func2(int x) - { - ADD_STATE(State_Func2_Called(reinterpret_cast(this), x)); - } - - virtual short Func3() - { - ADD_STATE(State_Func3_Called(reinterpret_cast(this))); - return 3; - } - virtual short Func4(int x) - { - ADD_STATE(State_Func4_Called(reinterpret_cast(this), x)); - return 4; - } - virtual void Func5() - { - ADD_STATE(State_Func5_Called(reinterpret_cast(this))); - } - }; - - SH_DECL_HOOK0_void(TheWall, Func1, SH_NOATTRIB, 0); - SH_DECL_HOOK1_void(TheWall, Func2, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0(TheWall, Func3, SH_NOATTRIB, 0, short); - SH_DECL_HOOK1(TheWall, Func4, SH_NOATTRIB, 0, short, int); - - SH_DECL_MANUALHOOK0_void(TheWall_Func1, 0, 0, 0); - SH_DECL_MANUALHOOK1_void(TheWall_Func2, 1, 0, 0, int); - SH_DECL_MANUALHOOK0(TheWall_Func3, 2, 0, 0, short); - SH_DECL_MANUALHOOK1(TheWall_Func4, 3, 0, 0, short, int); - - typedef void (SourceHook::EmptyClass::*MFP_Func1)(); - typedef void (SourceHook::EmptyClass::*MFP_Func2)(int); - typedef short (SourceHook::EmptyClass::*MFP_Func3)(); - typedef short (SourceHook::EmptyClass::*MFP_Func4)(int); - - void Handler_Func1() - { - ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); - } - void Handler_Func2(int x) - { - ADD_STATE(State_Func2H_Called(META_IFACEPTR(void), x)); - RETURN_META_MNEWPARAMS(MRES_IGNORED, TheWall_Func2, (0x87654321)); - } - short Handler_Func3() - { - ADD_STATE(State_Func3H_Called(META_IFACEPTR(void))); - return 0; - } - short Handler_Func4(int x) - { - ADD_STATE(State_Func4H_Called(META_IFACEPTR(void), x)); - - // newparams (recall) using the manual hook declaration! - RETURN_META_VALUE_MNEWPARAMS(MRES_IGNORED, 0, TheWall_Func4, (0x12345678)); - } - - struct AnotherBrick - { - void Handler_Func1() - { - ADD_STATE(State_Func1H_Called(META_IFACEPTR(void))); - RETURN_META(MRES_SUPERCEDE); - } - }; -} - -bool TestManual(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - TheWall inst; - TheWall *p = &inst; - - SourceHook::ManualCallClass *cc = SH_GET_MCALLCLASS(p, sizeof(void*)); - - // 1) - // Call each function - p->Func1(); - p->Func2(200); - ADD_STATE(State_Return(p->Func3())); - ADD_STATE(State_Return(p->Func4(400))); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func2_Called(p, 200), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4_Called(p, 400), - new State_Return(4), - NULL), "Part 1"); - - // 1.1) - // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(cc, TheWall_Func1)(); - SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(cc, TheWall_Func2)(200); - SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func1_Called(p), - new State_Func2_Called(p, 200), - new State_Func2_Called(p, 200), - new State_Func3_Called(p), - new State_Return(3), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4_Called(p, 400), - new State_Return(4), - new State_Func4_Called(p, 400), - new State_Return(4), - NULL), "Part 1.1"); - - // 2) - // Hook each function normally, call them - SH_ADD_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); - - p->Func1(); - p->Func2(200); - ADD_STATE(State_Return(p->Func3())); - ADD_STATE(State_Return(p->Func4(400))); - - CHECK_STATES((&g_States, - new State_Func1H_Called(p), - new State_Func1_Called(p), - new State_Func2H_Called(p, 200), - new State_Func2_Called(p, 0x87654321), - new State_Func3H_Called(p), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4H_Called(p, 400), - new State_Func4_Called(p, 0x12345678), - new State_Return(4), - NULL), "Part 2"); - - // Call them through the mcallclass - // 2.1) - // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(cc, TheWall_Func1)(); - SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(cc, TheWall_Func2)(200); - SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func1_Called(p), - new State_Func2_Called(p, 200), - new State_Func2_Called(p, 200), - new State_Func3_Called(p), - new State_Return(3), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4_Called(p, 400), - new State_Return(4), - new State_Func4_Called(p, 400), - new State_Return(4), - NULL), "Part 2.1"); - - // Unhook them - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); - - // 3) - // Hook each function manually, call them - - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); - - p->Func1(); - p->Func2(200); - ADD_STATE(State_Return(p->Func3())); - ADD_STATE(State_Return(p->Func4(400))); - - CHECK_STATES((&g_States, - new State_Func1H_Called(p), - new State_Func1_Called(p), - new State_Func2H_Called(p, 200), - new State_Func2_Called(p, 0x87654321), - new State_Func3H_Called(p), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4H_Called(p, 400), - new State_Func4_Called(p, 0x12345678), - new State_Return(4), - NULL), "Part 3"); - - // Now through the mcallclass - - // Call them through the mcallclass - // 3.1) - // Now call each function through the manual call class, using the hook decl and manually - SH_MCALL(cc, TheWall_Func1)(); - SH_MCALL2(cc, MFP_Func1(), 0, 0, 0)(); - SH_MCALL(cc, TheWall_Func2)(200); - SH_MCALL2(cc, MFP_Func2(), 1, 0, 0)(200); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func3)())); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func3(), 2, 0, 0)())); - ADD_STATE(State_Return(SH_MCALL(cc, TheWall_Func4)(400))); - ADD_STATE(State_Return(SH_MCALL2(cc, MFP_Func4(), 3, 0, 0)(400))); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func1_Called(p), - new State_Func2_Called(p, 200), - new State_Func2_Called(p, 200), - new State_Func3_Called(p), - new State_Return(3), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4_Called(p, 400), - new State_Return(4), - new State_Func4_Called(p, 400), - new State_Return(4), - NULL), "Part 3.1"); - - // Unhook them - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); - - // 4) - // Hook each function manually, then normally, call, unhook - - AnotherBrick handler_inst; - - // Why this? - // 1) tests sh_add_manualhook_memfunc - // 2) in my tests, the proto of the manual hook was not equal to the proto of the auto hook - // (because there are no attribs for manual hooks). - // sourcehook.cpp did a !strcmp(..), so it assigned a new hook manager even though there - // already was one for this vfnptr. This hook manager stored the pointer of the original - // hook manager's hookfunc as the orig pointer - everything seemingly worked. - // The problem with this is that returning MRES_SUPERCEDE (as AnotherBrick::Handler_Func1 - // does) will supercede the second hook func from being called - thus bypassing the call - // of the auto hook here. - SH_ADD_MANUALHOOK_MEMFUNC(TheWall_Func1, p, &handler_inst, &AnotherBrick::Handler_Func1, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); - - SH_ADD_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); - SH_ADD_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); - - p->Func1(); - p->Func2(200); - ADD_STATE(State_Return(p->Func3())); - ADD_STATE(State_Return(p->Func4(400))); - - CHECK_STATES((&g_States, - new State_Func1H_Called(p), - new State_Func1H_Called(p), - //new State_Func1_Called(p), - new State_Func2H_Called(p, 200), - new State_Func2H_Called(p, 0x87654321), - new State_Func2_Called(p, 0x87654321), - new State_Func3H_Called(p), - new State_Func3H_Called(p), - new State_Func3_Called(p), - new State_Return(3), - new State_Func4H_Called(p, 400), - new State_Func4H_Called(p, 0x12345678), - new State_Func4_Called(p, 0x12345678), - new State_Return(4), - NULL), "Part 4"); - - SH_REMOVE_MANUALHOOK_MEMFUNC(TheWall_Func1, p, &handler_inst, &AnotherBrick::Handler_Func1, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func2, p, Handler_Func2, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func3, p, Handler_Func3, false); - SH_REMOVE_MANUALHOOK_STATICFUNC(TheWall_Func4, p, Handler_Func4, false); - - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func1, p, Handler_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func2, p, Handler_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func3, p, Handler_Func3, false); - SH_REMOVE_HOOK_STATICFUNC(TheWall, Func4, p, Handler_Func4, false); - - // 5) Reconfigure TheWall_Func1 to actually hook Func5: - SH_MANUALHOOK_RECONFIGURE(TheWall_Func1, 4, 0, 0); - SH_ADD_MANUALHOOK_STATICFUNC(TheWall_Func1, p, Handler_Func1, false); - - p->Func5(); - - CHECK_STATES((&g_States, - new State_Func1H_Called(p), - new State_Func5_Called(p), - NULL), "Part 5"); - - // 6) Test auto-remove on reconfig - SH_MANUALHOOK_RECONFIGURE(TheWall_Func1, 0, 0, 0); - - p->Func1(); - p->Func5(); - - CHECK_STATES((&g_States, - new State_Func1_Called(p), - new State_Func5_Called(p), - NULL), "Part 6"); - - return true; -} diff --git a/sourcehook/test/testmulti.cpp b/sourcehook/test/testmulti.cpp deleted file mode 100644 index 95e7490..0000000 --- a/sourcehook/test/testmulti.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testevents.h" - -// This should probably be done the other way round! -#ifdef __linux__ -#define _snprintf snprintf -#endif - -namespace -{ - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - unsigned int g_callcount[10]; - - class VMultiTest - { - public: - VMultiTest(unsigned int index) : m_idx(index) - { - } - public: - virtual void HookTarget() - { - } - virtual void Notify() - { - g_callcount[this->m_idx]++; - } - private: - unsigned int m_idx; - }; - - void HookFunction() - { - VMultiTest *pv = META_IFACEPTR(VMultiTest); - pv->Notify(); - } - - SH_DECL_HOOK0_void(VMultiTest, HookTarget, SH_NOATTRIB, false); -}; - -bool TestMulti(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - VMultiTest **pv = new VMultiTest *[10]; - for (unsigned int i=0; i<10; i++) - pv[i] = new VMultiTest(i); - - - for (unsigned int i=0; i<10; i++) - SH_ADD_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[i], HookFunction, false); - - pv[0]->HookTarget(); - - if (g_callcount[0] != 1) - { - error.assign("g_callcount[0] != 0"); - return false; - } - - for (unsigned int i=1; i<10; i++) - { - if (g_callcount[i]) - { - error.assign("g_callcount[n] != 0"); - return false; - } - } - - SH_REMOVE_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[0], HookFunction, false); - - for (unsigned int i=1; i<10; i++) - pv[i]->HookTarget(); - - if (g_callcount[0] != 1) - { - error.assign("g_callcount[0] != 0"); - return false; - } - - for (unsigned int i=1; i<10; i++) - { - if (g_callcount[i] != 1) - { - char err[256]; - _snprintf(err, sizeof(err)-1, "g_callcount[%d] != 1", i); - error.assign(err); - return false; - } - } - - for (unsigned int i=0; i<10; i++) - { - SH_REMOVE_HOOK_STATICFUNC(VMultiTest, HookTarget, pv[i], HookFunction, false); - delete pv[i]; - } - - delete [] pv; - - return true; -} - diff --git a/sourcehook/test/testrecall.cpp b/sourcehook/test/testrecall.cpp deleted file mode 100644 index 25eede5..0000000 --- a/sourcehook/test/testrecall.cpp +++ /dev/null @@ -1,232 +0,0 @@ -#include -#include "sourcehook.h" -#include "sourcehook_test.h" -#include "testevents.h" - -// TESTRECALL -// Test modifying parameters from hook handlers - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Func1, int); - MAKE_STATE_1(State_H1_Func1, int); - MAKE_STATE_1(State_H2_Func1, int); - MAKE_STATE_2(State_HP_Func1, int, void*); - - MAKE_STATE_1(State_Func2, int); - MAKE_STATE_1(State_H1_Func2, int); - MAKE_STATE_1(State_H2_Func2, int); - MAKE_STATE_2(State_HP_Func2, int, int); - - MAKE_STATE_2(State_Func22, int, int); - MAKE_STATE_2(State_H1_Func22, int, int); - MAKE_STATE_2(State_HP1_Func22, int, int); - MAKE_STATE_2(State_HP2_Func22, int, int); - - struct Test - { - virtual void Func1(int a) - { - ADD_STATE(State_Func1(a)); - } - - virtual int Func2(int a) - { - ADD_STATE(State_Func2(a)); - return 1000; - } - - // Overloaded version - virtual int Func2(int a, int b) - { - ADD_STATE(State_Func22(a, b)); - return 0xDEADFC; - } - }; - - void Handler1_Func1(int a) - { - ADD_STATE(State_H1_Func1(a)); - RETURN_META_NEWPARAMS(MRES_IGNORED, &Test::Func1, (5)); - } - void Handler2_Func1(int a) - { - ADD_STATE(State_H2_Func1(a)); - RETURN_META_NEWPARAMS(MRES_IGNORED, &Test::Func1, (a - 5)); - } - void HandlerPost_Func1(int a) - { - ADD_STATE(State_HP_Func1(a, META_IFACEPTR(void))); - } - - - int Handler1_Func2(int a) - { - ADD_STATE(State_H1_Func2(a)); - // Pfeeehhh, ugly, I know, but I had to test it :) - RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 500, - static_cast(&Test::Func2), (a - 10)); - } - - int Handler2_Func2(int a) - { - ADD_STATE(State_H2_Func2(a)); - RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, 0, - static_cast(&Test::Func2), (a - 10)); - } - - int HandlerPost_Func2(int a) - { - ADD_STATE(State_HP_Func2(a, META_RESULT_ORIG_RET(int))); - RETURN_META_VALUE(MRES_IGNORED, 0); - } - - int Handler1_Func22(int a, int b) - { - ADD_STATE(State_H1_Func22(a, b)); - RETURN_META_VALUE(MRES_IGNORED, 0); - } - - int HandlerPost1_Func22(int a, int b) - { - ADD_STATE(State_HP1_Func22(a, b)); - RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, 0, static_cast(&Test::Func2), (1, 2)); - } - - int HandlerPost1A_Func22(int a, int b) - { - ADD_STATE(State_HP1_Func22(a, b)); - RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, 0, static_cast(&Test::Func2), (1, 2)); - } - - int HandlerPost2_Func22(int a, int b) - { - ADD_STATE(State_HP2_Func22(a, b)); - RETURN_META_VALUE(MRES_IGNORED, 0); - } - - SH_DECL_HOOK1_void(Test, Func1, SH_NOATTRIB, 0, int); - SH_DECL_HOOK1(Test, Func2, SH_NOATTRIB, 0, int, int); - SH_DECL_HOOK2(Test, Func2, SH_NOATTRIB, 1, int, int, int); -} - -bool TestRecall(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - Test inst; - Test *ptr = &inst; - - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler1_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, HandlerPost_Func1, true); - - ptr->Func1(77); - - CHECK_STATES((&g_States, - new State_H1_Func1(77), - new State_H2_Func1(5), - new State_Func1(0), - new State_HP_Func1(0, ptr), - NULL), "Part 1"); - - SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, Handler1_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - SH_ADD_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - - ptr->Func1(77); - - CHECK_STATES((&g_States, - new State_H2_Func1(77), - new State_H2_Func1(72), - new State_H2_Func1(67), - new State_H2_Func1(62), - new State_Func1(57), - new State_HP_Func1(57, ptr), - NULL), "Part 2"); - - SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, Handler2_Func1, false); - SH_REMOVE_HOOK_STATICFUNC(Test, Func1, ptr, HandlerPost_Func1, true); - - ptr->Func1(77); - - CHECK_STATES((&g_States, - new State_Func1(77), - NULL), "Part 3"); - - // Func2 - - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func2, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost_Func2, true); - - int a = ptr->Func2(77); - CHECK_STATES((&g_States, - new State_H1_Func2(77), - new State_Func2(67), - new State_HP_Func2(67, 1000), // 1000 because it's the ORIG_RET - NULL), "Part 4"); - - CHECK_COND(a == 500, "Part 4.1"); - - // Func2, with other handler - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func2, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler2_Func2, false); - - a = ptr->Func2(77); - CHECK_STATES((&g_States, - new State_H2_Func2(77), - new State_Func2(67), - new State_HP_Func2(67, 1000), // 1000 because it's the ORIG_RET - NULL), "Part 4.2"); - - CHECK_COND(a == 1000, "Part 4.2.1"); // Should return 1000 as well. - - // Func22 -> post recalls - - // 1) WITH OVERRIDE - - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func22, false); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1A_Func22, true); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); - - a = ptr->Func2(10, 11); - CHECK_STATES((&g_States, - new State_H1_Func22(10, 11), - new State_Func22(10, 11), - new State_HP1_Func22(10, 11), - new State_HP2_Func22(1, 2), - NULL), "Part 5"); - - CHECK_COND(a == 0, "Part 5.1"); - - // 2) WITH IGNORE - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1A_Func22, true); - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); - - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1_Func22, true); - SH_ADD_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); - - a = ptr->Func2(10, 11); - CHECK_STATES((&g_States, - new State_H1_Func22(10, 11), - new State_Func22(10, 11), - new State_HP1_Func22(10, 11), - new State_HP2_Func22(1, 2), - NULL), "Part 5"); - - CHECK_COND(a == 0xDEADFC, "Part 5.1"); - - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost_Func2, true); - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, Handler2_Func2, false); - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, Handler1_Func22, false); - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost1_Func22, true); - SH_REMOVE_HOOK_STATICFUNC(Test, Func2, ptr, HandlerPost2_Func22, true); - - return true; -} diff --git a/sourcehook/test/testreentr.cpp b/sourcehook/test/testreentr.cpp deleted file mode 100644 index b4f0ec5..0000000 --- a/sourcehook/test/testreentr.cpp +++ /dev/null @@ -1,599 +0,0 @@ -// Reentrancy test -// = calling hooks from hook handlers, etc - -#include -#include "sourcehook_test.h" -#include "testevents.h" - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - struct C1; - struct C2; - struct C3; - struct C4; - struct C5; - struct C6; - struct C7; - struct C8; - - C1 *g_pC1; - C2 *g_pC2; - C3 *g_pC3; - C4 *g_pC4; - C5 *g_pC5; - C6 *g_pC6; - C7 *g_pC7; - C8 *g_pC8; - - // param1: This pointer - MAKE_STATE_1(State_C1_F, C1*); - MAKE_STATE_1(State_C2_F, C2*); - MAKE_STATE_1(State_C3_F, C3*); - MAKE_STATE_1(State_C4_F, C4*); - MAKE_STATE_1(State_C5_F, C5*); - MAKE_STATE_1(State_C6_F, C6*); - MAKE_STATE_1(State_C7_F, C7*); - MAKE_STATE_1(State_C8_F, C8*); - - MAKE_STATE_1(State_C1_G, C1*); - MAKE_STATE_1(State_C2_G, C2*); - MAKE_STATE_1(State_C3_G, C3*); - MAKE_STATE_1(State_C4_G, C4*); - MAKE_STATE_1(State_C5_G, C5*); - MAKE_STATE_1(State_C6_G, C6*); - MAKE_STATE_1(State_C7_G, C7*); - MAKE_STATE_1(State_C8_G, C8*); - - MAKE_STATE_1(State_H_C1_F, C1*); - MAKE_STATE_1(State_H_C2_F, C2*); - MAKE_STATE_1(State_H_C3_F, C3*); - MAKE_STATE_1(State_H_C4_F, C4*); - MAKE_STATE_1(State_H_C5_F, C5*); - MAKE_STATE_1(State_H_C6_F, C6*); - MAKE_STATE_1(State_H_C7_F, C7*); - MAKE_STATE_1(State_H_C8_F, C8*); - - MAKE_STATE_1(State_H_C1_G, C1*); - MAKE_STATE_1(State_H_C2_G, C2*); - MAKE_STATE_1(State_H_C3_G, C3*); - MAKE_STATE_1(State_H_C4_G, C4*); - MAKE_STATE_1(State_H_C5_G, C5*); - MAKE_STATE_1(State_H_C6_G, C6*); - MAKE_STATE_1(State_H_C7_G, C7*); - MAKE_STATE_1(State_H_C8_G, C8*); - - MAKE_STATE_1(State_H2_C4_G, C4*); - - int g_TestID; - - struct C1 - { - virtual void F() - { - ADD_STATE(State_C1_F(this)); - } - virtual int G() - { - ADD_STATE(State_C1_G(this)); - return 1; - } - }; - struct C2 - { - virtual void F() - { - ADD_STATE(State_C2_F(this)); - } - virtual int G() - { - ADD_STATE(State_C2_G(this)); - return 2; - } - }; - struct C3 - { - virtual void F() - { - ADD_STATE(State_C3_F(this)); - } - virtual int G() - { - ADD_STATE(State_C3_G(this)); - return 3; - } - }; - struct C4 - { - virtual void F() - { - ADD_STATE(State_C4_F(this)); - } - virtual int G() - { - ADD_STATE(State_C4_G(this)); - return 4; - } - }; - struct C5 - { - virtual void F() - { - ADD_STATE(State_C5_F(this)); - } - virtual int G() - { - ADD_STATE(State_C5_G(this)); - return 5; - } - }; - struct C6 - { - virtual void F() - { - ADD_STATE(State_C6_F(this)); - } - virtual int G() - { - ADD_STATE(State_C6_G(this)); - return 6; - } - }; - struct C7 - { - virtual void F() - { - ADD_STATE(State_C7_F(this)); - } - virtual int G() - { - ADD_STATE(State_C7_G(this)); - return 7; - } - }; - struct C8 - { - virtual void F() - { - ADD_STATE(State_C8_F(this)); - } - virtual int G() - { - ADD_STATE(State_C8_G(this)); - return 8; - } - }; - - SH_DECL_HOOK0_void(C1, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C1, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C2, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C2, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C3, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C3, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C4, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C4, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C5, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C5, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C6, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C6, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C7, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C7, G, SH_NOATTRIB, 0, int); - SH_DECL_HOOK0_void(C8, F, SH_NOATTRIB, 0); - SH_DECL_HOOK0(C8, G, SH_NOATTRIB, 0, int); - - void Handler_C1_F() - { - ADD_STATE(State_H_C1_F(META_IFACEPTR(C1))); - g_pC1->G(); - } - int Handler_C1_G() - { - ADD_STATE(State_H_C1_G(META_IFACEPTR(C1))); - g_pC2->F(); - return 1; - } - void Handler_C2_F() - { - ADD_STATE(State_H_C2_F(META_IFACEPTR(C2))); - g_pC2->G(); - } - int Handler_C2_G() - { - ADD_STATE(State_H_C2_G(META_IFACEPTR(C2))); - g_pC3->F(); - return 2; - } - void Handler_C3_F() - { - ADD_STATE(State_H_C3_F(META_IFACEPTR(C3))); - g_pC3->G(); - } - int Handler_C3_G() - { - ADD_STATE(State_H_C3_G(META_IFACEPTR(C3))); - g_pC4->F(); - return 3; - } - void Handler_C4_F() - { - ADD_STATE(State_H_C4_F(META_IFACEPTR(C4))); - g_pC4->G(); - } - int Handler_C4_G() - { - ADD_STATE(State_H_C4_G(META_IFACEPTR(C4))); - g_pC5->F(); - return 4; - } - int Handler2_C4_G() - { - ADD_STATE(State_H2_C4_G(META_IFACEPTR(C4))); - return 4; - } - void Handler_C5_F() - { - ADD_STATE(State_H_C5_F(META_IFACEPTR(C5))); - g_pC5->G(); - } - int Handler_C5_G() - { - ADD_STATE(State_H_C5_G(META_IFACEPTR(C5))); - g_pC6->F(); - return 5; - } - void Handler_C6_F() - { - ADD_STATE(State_H_C6_F(META_IFACEPTR(C6))); - g_pC6->G(); - } - int Handler_C6_G() - { - ADD_STATE(State_H_C6_G(META_IFACEPTR(C6))); - g_pC7->F(); - return 6; - } - void Handler_C7_F() - { - if (g_TestID == 1 || g_TestID == 2) - SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); - if (g_TestID == 2) - SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); - - ADD_STATE(State_H_C7_F(META_IFACEPTR(C7))); - g_pC7->G(); - } - int Handler_C7_G() - { - ADD_STATE(State_H_C7_G(META_IFACEPTR(C7))); - g_pC8->F(); - return 7; - } - void Handler_C8_F() - { - ADD_STATE(State_H_C8_F(META_IFACEPTR(C8))); - g_pC8->G(); - } - int Handler_C8_G() - { - ADD_STATE(State_H_C8_G(META_IFACEPTR(C8))); - return 8; - } - - C1 g_C1; - C2 g_C2; - C3 g_C3; - C4 g_C4; - C5 g_C5; - C6 g_C6; - C7 g_C7; - C8 g_C8; -} - -bool TestReentr(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1337; - - g_pC1 = &g_C1; - g_pC2 = &g_C2; - g_pC3 = &g_C3; - g_pC4 = &g_C4; - g_pC5 = &g_C5; - g_pC6 = &g_C6; - g_pC7 = &g_C7; - g_pC8 = &g_C8; - - SH_ADD_HOOK_STATICFUNC(C1, F, g_pC1, Handler_C1_F, false); - SH_ADD_HOOK_STATICFUNC(C1, G, g_pC1, Handler_C1_G, false); - SH_ADD_HOOK_STATICFUNC(C2, F, g_pC2, Handler_C2_F, false); - SH_ADD_HOOK_STATICFUNC(C2, G, g_pC2, Handler_C2_G, false); - SH_ADD_HOOK_STATICFUNC(C3, F, g_pC3, Handler_C3_F, false); - SH_ADD_HOOK_STATICFUNC(C3, G, g_pC3, Handler_C3_G, false); - SH_ADD_HOOK_STATICFUNC(C4, F, g_pC4, Handler_C4_F, false); - SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); - SH_ADD_HOOK_STATICFUNC(C5, F, g_pC5, Handler_C5_F, false); - SH_ADD_HOOK_STATICFUNC(C5, G, g_pC5, Handler_C5_G, false); - SH_ADD_HOOK_STATICFUNC(C6, F, g_pC6, Handler_C6_F, false); - SH_ADD_HOOK_STATICFUNC(C6, G, g_pC6, Handler_C6_G, false); - SH_ADD_HOOK_STATICFUNC(C7, F, g_pC7, Handler_C7_F, false); - SH_ADD_HOOK_STATICFUNC(C7, G, g_pC7, Handler_C7_G, false); - SH_ADD_HOOK_STATICFUNC(C8, F, g_pC8, Handler_C8_F, false); - SH_ADD_HOOK_STATICFUNC(C8, G, g_pC8, Handler_C8_G, false); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "1"); - - - SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_H2_C4_G(g_pC4), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "2"); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_H2_C4_G(g_pC4), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "3"); - - g_TestID = 1; - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "4"); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "5"); - - - - SH_ADD_HOOK_STATICFUNC(C4, G, g_pC4, Handler2_C4_G, false); - - g_TestID = 2; - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_H_C4_G(g_pC4), - new State_H_C5_F(g_pC5), - new State_H_C5_G(g_pC5), - new State_H_C6_F(g_pC6), - new State_H_C6_G(g_pC6), - new State_H_C7_F(g_pC7), - new State_H_C7_G(g_pC7), - new State_H_C8_F(g_pC8), - new State_H_C8_G(g_pC8), - new State_C8_G(g_pC8), - new State_C8_F(g_pC8), - new State_C7_G(g_pC7), - new State_C7_F(g_pC7), - new State_C6_G(g_pC6), - new State_C6_F(g_pC6), - new State_C5_G(g_pC5), - new State_C5_F(g_pC5), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "6"); - - g_pC1->F(); - - CHECK_STATES((&g_States, - new State_H_C1_F(g_pC1), - new State_H_C1_G(g_pC1), - new State_H_C2_F(g_pC2), - new State_H_C2_G(g_pC2), - new State_H_C3_F(g_pC3), - new State_H_C3_G(g_pC3), - new State_H_C4_F(g_pC4), - new State_C4_G(g_pC4), - new State_C4_F(g_pC4), - new State_C3_G(g_pC3), - new State_C3_F(g_pC3), - new State_C2_G(g_pC2), - new State_C2_F(g_pC2), - new State_C1_G(g_pC1), - new State_C1_F(g_pC1), - NULL), "7"); - - SH_REMOVE_HOOK_STATICFUNC(C1, F, g_pC1, Handler_C1_F, false); - SH_REMOVE_HOOK_STATICFUNC(C1, G, g_pC1, Handler_C1_G, false); - SH_REMOVE_HOOK_STATICFUNC(C2, F, g_pC2, Handler_C2_F, false); - SH_REMOVE_HOOK_STATICFUNC(C2, G, g_pC2, Handler_C2_G, false); - SH_REMOVE_HOOK_STATICFUNC(C3, F, g_pC3, Handler_C3_F, false); - SH_REMOVE_HOOK_STATICFUNC(C3, G, g_pC3, Handler_C3_G, false); - SH_REMOVE_HOOK_STATICFUNC(C4, F, g_pC4, Handler_C4_F, false); - SH_REMOVE_HOOK_STATICFUNC(C4, G, g_pC4, Handler_C4_G, false); - SH_REMOVE_HOOK_STATICFUNC(C5, F, g_pC5, Handler_C5_F, false); - SH_REMOVE_HOOK_STATICFUNC(C5, G, g_pC5, Handler_C5_G, false); - SH_REMOVE_HOOK_STATICFUNC(C6, F, g_pC6, Handler_C6_F, false); - SH_REMOVE_HOOK_STATICFUNC(C6, G, g_pC6, Handler_C6_G, false); - SH_REMOVE_HOOK_STATICFUNC(C7, F, g_pC7, Handler_C7_F, false); - SH_REMOVE_HOOK_STATICFUNC(C7, G, g_pC7, Handler_C7_G, false); - SH_REMOVE_HOOK_STATICFUNC(C8, F, g_pC8, Handler_C8_F, false); - SH_REMOVE_HOOK_STATICFUNC(C8, G, g_pC8, Handler_C8_G, false); - - return true; -} diff --git a/sourcehook/test/testref.cpp b/sourcehook/test/testref.cpp deleted file mode 100644 index 1727bf5..0000000 --- a/sourcehook/test/testref.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#include "testevents.h" -#include "sourcehook_test.h" - -// References and private copy constructors and stuff like that! - -/* -BAILOPAN, 29.04.2006 21:51 : -onoto-san, interesting error from VS -we have this function: -void GabHaben(ISomething &sth); - -SomethingDerived sth; -and SH_CALL(cc, &WHAT::GabHaben)(sth); -"No copy constructor available for class 'SomethingDerived'" -*/ - - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Result, int); - MAKE_STATE_1(State_Result_InHook, int); - - class CBase - { - // Private copy constructor! - CBase(CBase &other) - { - } - public: - CBase() - { - } - - virtual int Func() - { - return 0; - } - }; - - class CDerived : public CBase - { - virtual int Func() - { - return 10; - } - }; - - // Complicated derived shit ! - class COtherWeirdBase - { - int member; - }; - class CDerived2 : private COtherWeirdBase, public CBase - { - int m_Return; - public: - CDerived2(int a) : m_Return(a) - { - } - - virtual int Func() - { - return m_Return; - } - }; - - class CHello - { - public: - virtual int Func(CBase &sth) - { - return sth.Func(); - } - }; - - class CHook - { - public: - virtual int Func(CBase &sth) - { - ADD_STATE(State_Result_InHook(sth.Func())); - RETURN_META_VALUE(MRES_SUPERCEDE, 20); - } - }; - SH_DECL_HOOK1(CHello, Func, SH_NOATTRIB, 0, int, CBase&); -} - - -bool TestRef(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - CBase base; - CDerived der; - CDerived2 der2(11); - CDerived2 der3(12); - CHello hello; - CHello *pHello = &hello; - CHook hook; - - SourceHook::CallClass *cc = SH_GET_CALLCLASS(&hello); - - ADD_STATE(State_Result(pHello->Func(base))); - ADD_STATE(State_Result(pHello->Func(der))); - ADD_STATE(State_Result(pHello->Func(der2))); - ADD_STATE(State_Result(pHello->Func(der3))); - - CHECK_STATES((&g_States, - new State_Result(0), - new State_Result(10), - new State_Result(11), - new State_Result(12), - NULL), "Part 1"); - - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(base))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der2))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der3))); - - CHECK_STATES((&g_States, - new State_Result(0), - new State_Result(10), - new State_Result(11), - new State_Result(12), - NULL), "Part 2"); - - SH_ADD_HOOK_MEMFUNC(CHello, Func, &hello, &hook, &CHook::Func, false); - - ADD_STATE(State_Result(pHello->Func(base))); - ADD_STATE(State_Result(pHello->Func(der))); - ADD_STATE(State_Result(pHello->Func(der2))); - ADD_STATE(State_Result(pHello->Func(der3))); - - CHECK_STATES((&g_States, - new State_Result_InHook(0), - new State_Result(20), - new State_Result_InHook(10), - new State_Result(20), - new State_Result_InHook(11), - new State_Result(20), - new State_Result_InHook(12), - new State_Result(20), - NULL), "Part 3"); - - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(base))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der2))); - ADD_STATE(State_Result(SH_CALL(cc, &CHello::Func)(der3))); - - CHECK_STATES((&g_States, - new State_Result(0), - new State_Result(10), - new State_Result(11), - new State_Result(12), - NULL), "Part 4"); - - SH_REMOVE_HOOK_MEMFUNC(CHello, Func, &hello, &hook, &CHook::Func, false); - - return true; -} diff --git a/sourcehook/test/testrefret.cpp b/sourcehook/test/testrefret.cpp deleted file mode 100644 index b2f9291..0000000 --- a/sourcehook/test/testrefret.cpp +++ /dev/null @@ -1,208 +0,0 @@ -#include "testevents.h" -#include "sourcehook_test.h" - -// Tests support for functions which return references - -namespace -{ - StateList g_States; - SourceHook::ISourceHook *g_SHPtr; - SourceHook::Plugin g_PLID; - - MAKE_STATE_1(State_Func1_Pre1, int*); // p1: the ref Func1_Pre1 is going to return - MAKE_STATE_3(State_Func1_Pre2, META_RES, int*, int*); // p1: current status - // p2: override ret - // p3: what this handler is going to supercede with - MAKE_STATE_1(State_Func1, int*); // p1: the ref Func1 is going to return - MAKE_STATE_2(State_Func1_Post1, int*, int*); // p1: orig_ret; p2: override_ret - MAKE_STATE_1(State_Func1_Post2, int*); // p1: what it's going to return - MAKE_STATE_1(State_Func1_Ret, int*); // p1: the ref it returned - - - MAKE_STATE_2(State_Func2_Pre1, int, const int*); // p1: func's p1; p2: what it's going to ret - MAKE_STATE_2(State_Func2, int, const int*); // p1: func's p1; p2: what it's going to ret - MAKE_STATE_3(State_Func2_Post1, int, const int*, const int*); // p1: func's p1; p2: orig ret; p3: override ret - MAKE_STATE_1(State_Func2_Ret, const int*); // p1: ret - - int g_Var; - - class Test - { - public: - int m_Var1; - int m_Var2; - - Test() : m_Var1(87) - { - } - - virtual int& Func1() - { - ADD_STATE(State_Func1(&m_Var1)); - return m_Var1; - } - virtual const int& Func2(int p1) - { - ADD_STATE(State_Func2(p1, &m_Var2)); - m_Var2 = p1; - return m_Var2; - } - }; - - class CHook - { - public: - int m_Var; - virtual int& Func1_Pre1() - { - ADD_STATE(State_Func1_Pre1(&m_Var)); - RETURN_META_VALUE(MRES_OVERRIDE, m_Var); - } - virtual int &Func1_Pre2() - { - int &overrideret = META_RESULT_OVERRIDE_RET(int&); - overrideret = 1337; - ADD_STATE(State_Func1_Pre2(META_RESULT_STATUS, &overrideret, &g_Var)); - RETURN_META_VALUE(MRES_SUPERCEDE, g_Var); - } - virtual int& Func1_Post1() - { - ADD_STATE(State_Func1_Post1(&META_RESULT_ORIG_RET(int&), &META_RESULT_OVERRIDE_RET(int&))); - RETURN_META_NOREF(MRES_IGNORED, int&); - } - virtual int& Func1_Post2() - { - ADD_STATE(State_Func1_Post2(&m_Var)); - RETURN_META_VALUE(MRES_OVERRIDE, m_Var); - } - - virtual const int& Func2_Pre1(int p1) - { - ADD_STATE(State_Func2_Pre1(p1, &m_Var)); - RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, m_Var, static_cast(&Test::Func2), (1337)); - } - - virtual const int& Func2_Post1(int p1) - { - ADD_STATE(State_Func2_Post1(p1, &META_RESULT_ORIG_RET(int&), &META_RESULT_OVERRIDE_RET(int&))); - RETURN_META_NOREF(MRES_IGNORED, const int&); - } - }; - - SH_DECL_HOOK0(Test, Func1, SH_NOATTRIB, 0, int&); - SH_DECL_HOOK1(Test, Func2, SH_NOATTRIB, 0, const int&, int); -} - -bool TestRefRet(std::string &error) -{ - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - Test test; - Test *pTest = &test; - CHook hook; - - int &ret1 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret1)); - - CHECK_STATES((&g_States, - new State_Func1(&test.m_Var1), - new State_Func1_Ret(&test.m_Var1), - NULL), "Part 1"); - - // Now add Func1_Pre1, which supercedes and returns hook.m_Var - SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Pre1, false); - - int &ret2 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret2)); - - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1(&test.m_Var1), // Function says that it's going to return test.m_Var1 - new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned - NULL), "Part 2"); - - // Now add Func1_Post1, which only reports orig ret and override ret - SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Post1, true); - - int &ret3 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret3)); - - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1(&test.m_Var1), // Function says that it's going to return test.m_Var1 - new State_Func1_Post1(&test.m_Var1, &hook.m_Var), // origret(=p1) is what it wanted to - // return, overrideret(=p2) is pre1's var - new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned - NULL), "Part 3"); - - // Now add Func1_Pre2, which supercedes and returns g_Var (it also sets the override ret from pre1 to 1337) - // and add Func1_Post2, which overrides and returns hook.m_Var again. - - SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Pre2, false); - SH_ADD_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Post2, true); - - int &ret4 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret4)); - - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1_Pre2(MRES_OVERRIDE, // current status - &hook.m_Var, // override ret (which it set to 1337) - &g_Var), // what it's going to ret, AND supercede with - - new State_Func1_Post1(&g_Var, &g_Var), // origret(=p1) is what pre2 superceded with, - // so overrideret(=p2) has to be the same - new State_Func1_Post2(&hook.m_Var), // post2 is going to override with hook.m_Var again - new State_Func1_Ret(&hook.m_Var), // ==>>> hook.m_Var is returned - NULL), "Part 4"); - - CHECK_COND(hook.m_Var == 1337, "Part 4.1"); - - // Through a callclass - SourceHook::CallClass *cc1 = SH_GET_CALLCLASS(&test); - int &ret5 = SH_CALL(cc1, &Test::Func1)(); - ADD_STATE(State_Func1_Ret(&ret5)); - - CHECK_STATES((&g_States, - new State_Func1(&test.m_Var1), - new State_Func1_Ret(&test.m_Var1), - NULL), "Part 5"); - - SH_RELEASE_CALLCLASS(cc1); - - //////////////////////////////////////////////////////////////////////////////////////// - // Func2 tests - const int &ret21 = pTest->Func2(500); - ADD_STATE(State_Func2_Ret(&ret21)); - - CHECK_STATES((&g_States, - new State_Func2(500, &test.m_Var2), - new State_Func2_Ret(&test.m_Var2), - NULL), "Part 6"); - - SH_ADD_HOOK_MEMFUNC(Test, Func2, &test, &hook, &CHook::Func2_Pre1, false); - SH_ADD_HOOK_MEMFUNC(Test, Func2, &test, &hook, &CHook::Func2_Post1, true); - - const int &ret22 = pTest->Func2(500); - ADD_STATE(State_Func2_Ret(&ret22)); - - CHECK_STATES((&g_States, - new State_Func2_Pre1(500, &hook.m_Var), // p1 was 500; it's going to override with hook.m_Var; and also change p1 to 1337 - new State_Func2(1337, &test.m_Var2), // p1 was 1337; it's going to ret test.m_Var2 - new State_Func2_Post1(1337, // p1 was 1337 - &test.m_Var2, // orig ret was test.m_Var2 - &hook.m_Var), // override ret was hook.m_Var - new State_Func2_Ret(&hook.m_Var), // really returned hook.m_Var - NULL), "Part 7"); - - SH_REMOVE_HOOK_MEMFUNC(Test, Func2, &test, &hook, &CHook::Func2_Post1, true); - SH_REMOVE_HOOK_MEMFUNC(Test, Func2, &test, &hook, &CHook::Func2_Pre1, false); - SH_REMOVE_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Pre1, false); - SH_REMOVE_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Post1, true); - SH_REMOVE_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Pre2, false); - SH_REMOVE_HOOK_MEMFUNC(Test, Func1, &test, &hook, &CHook::Func1_Post2, true); - - return true; -} - diff --git a/sourcemm/CPlugin.cpp b/sourcemm/CPlugin.cpp deleted file mode 100644 index ee4077d..0000000 --- a/sourcemm/CPlugin.cpp +++ /dev/null @@ -1,698 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include "CPlugin.h" -#include "CSmmAPI.h" -#include "sourcemm.h" -#include "concommands.h" -#include "vsp_listener.h" - -/** - * @brief Implements functions from CPlugin.h - * @file CPlugin.cpp - */ - -using namespace SourceMM; - -#define ITER_PLEVENT(evn, plid) \ - CPluginManager::CPlugin *_Xpl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - _Xpl = (*iter); \ - if (_Xpl->m_Id == plid) \ - continue; \ - for (event=_Xpl->m_Events.begin(); event!=_Xpl->m_Events.end(); event++) { \ - api = (*event).event; \ - api->evn(plid); \ - } \ - } - -CPluginManager g_PluginMngr; - -CPluginManager::CPluginManager() -{ - m_LastId = Pl_MinId; - m_AllLoaded = false; -} - -CPluginManager::~CPluginManager() -{ - SourceHook::List::iterator iter; - - for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) - { - delete (*iter); - } - - m_Aliases.clear(); -} - -const char *CPluginManager::LookupAlias(const char *alias) -{ - SourceHook::List::iterator iter; - CNameAlias *p; - - for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) - { - p = (*iter); - if (p->alias.compare(alias) == 0) - { - return p->value.c_str(); - } - } - - return NULL; -} - -SourceHook::List::iterator CPluginManager::_alias_begin() -{ - return m_Aliases.begin(); -} - -SourceHook::List::iterator CPluginManager::_alias_end() -{ - return m_Aliases.end(); -} - -void CPluginManager::SetAlias(const char *alias, const char *value) -{ - SourceHook::List::iterator iter; - CNameAlias *p; - - for (iter=m_Aliases.begin(); iter!=m_Aliases.end(); iter++) - { - p = (*iter); - if (p->alias.compare(alias) == 0) - { - if (value[0] == '\0') - { - iter = m_Aliases.erase(iter); - return; - } else { - p->value.assign(value); - return; - } - } - } - - if (value[0] != '\0') - { - p = new CNameAlias; - - p->alias.assign(alias); - p->value.assign(value); - - m_Aliases.push_back(p); - } -} - -CPluginManager::CPlugin::CPlugin() : m_Id(0), m_Source(0), m_API(NULL), m_Lib(NULL) -{ - -} - -PluginId CPluginManager::Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen) -{ - already = false; - //Check if we're about to reload an old plugin - PluginIter i = m_Plugins.begin(); - while (i != m_Plugins.end()) - { - if ( (*i) && UTIL_PathCmp(file, (*i)->m_File.c_str()) ) - { - if ( (*i)->m_Status < Pl_Paused ) - { - //Attempt to load the plugin again - already = true; - i = m_Plugins.erase(i); - continue; - } else { - //No need to load it - already = true; - return (*i)->m_Id; - } - } - i++; - } - - CPlugin *pl = _Load(file, source, error, maxlen); - - if (!pl) - return Pl_BadLoad; - - ITER_PLEVENT(OnPluginLoad, pl->m_Id); - - return pl->m_Id; -} - -CPluginManager::CPlugin *CPluginManager::FindById(PluginId id) -{ - PluginIter i; - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == id ) - return (*i); - } - - return NULL; -} - -void CPluginManager::SetAllLoaded() -{ - m_AllLoaded = true; - PluginIter i; - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i) && (*i)->m_Status == Pl_Running && (*i)->m_API ) - { - //API 4 is when we added this callback - //Min version is now 5, so we ignore this check - //if ( (*i)->m_API->GetApiVersion() >= 004 ) - (*i)->m_API->AllPluginsLoaded(); - } - } -} - -void CPluginManager::SetVSPAsLoaded() -{ - PluginIter i; - CPlugin *pPlugin; - SourceHook::List::iterator event; - - for (i = m_Plugins.begin(); i != m_Plugins.end(); i++) - { - pPlugin = (*i); - if (pPlugin->m_Status < Pl_Paused) - { - continue; - } - /* Only valid for plugins >= 10 (v1:5, SourceMM 1.4) */ - if (pPlugin->m_API->GetApiVersion() < 10) - { - continue; - } - for (event = pPlugin->m_Events.begin(); - event != pPlugin->m_Events.end(); - event++) - { - if ((*event).got_vsp) - { - continue; - } - (*event).got_vsp = true; - (*event).event->OnVSPListening(&g_VspListener); - } - } -} - -bool CPluginManager::Pause(PluginId id, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin id not found"); - return false; - } - - bool ret; - - if ( (ret=_Pause(pl, error, maxlen)) == true ) - { - ITER_PLEVENT(OnPluginPause, pl->m_Id); - } - - return ret; -} - -bool CPluginManager::Unpause(PluginId id, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin id not found"); - return false; - } - - bool ret; - - if ( (ret=_Unpause(pl, error, maxlen)) == true ) - { - ITER_PLEVENT(OnPluginUnpause, pl->m_Id); - } - - return ret; -} - -bool CPluginManager::Unload(PluginId id, bool force, char *error, size_t maxlen) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - UTIL_Format(error, maxlen, "Plugin %d not found", id); - return false; - } - - bool ret; - PluginId old_id = pl->m_Id; - if ( (ret=_Unload(pl, force, error, maxlen)) == true ) - { - ITER_PLEVENT(OnPluginUnload, old_id); - } - - return ret; -} - -bool CPluginManager::Retry(PluginId id, char *error, size_t len) -{ - PluginIter i; - char buffer[64]; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i) && (*i)->m_Id == id ) - { - if ( (*i)->m_Status >= Pl_Paused) - { - UTIL_Format(error, len, "Plugin %d is already running.", id); - return false; - } - CPlugin *pl = _Load((*i)->m_File.c_str(), Pl_Console, error, len); - if (!pl) - return false; - if (pl->m_Status >= Pl_Paused) - { - //Now it gets crazy... unload the original copy. - _Unload( (*i), true, buffer, sizeof(buffer)-1 ); - - //Set the new copy's id - pl->m_Id = id; - - //We just wasted an id... reclaim it - m_LastId--; - - return true; - } else { - //don't really care about the buffer here - _Unload(pl, true, buffer, sizeof(buffer)-1); - - //We just wasted an id... reclaim it - m_LastId--; - return false; - } - } - } - - UTIL_Format(error, len, "Plugin %d not found,", id); - return false; -} - -CPluginManager::CPlugin *CPluginManager::FindByAPI(ISmmPlugin *api) -{ - PluginIter i; - - //don't find bad plugins! - if (!api) - return NULL; - - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_API == api ) - return (*i); - } - - return NULL; -} - -CPluginManager::CPlugin *CPluginManager::_Load(const char *file, PluginId source, char *error, size_t maxlen) -{ - FILE *fp; - CPlugin *pl; - - pl = new CPlugin(); - *error = '\0'; - - //Add plugin to list - pl->m_Id = m_LastId; - pl->m_File.assign(file); - m_Plugins.push_back(pl); - m_LastId++; - - //Check if the file even exists - fp = fopen(file, "r"); - if (!fp) - { - if (error) - UTIL_Format(error, maxlen, "File not found: %s", file); - pl->m_Status = Pl_NotFound; - } - - if (fp) - { - fclose(fp); - fp = NULL; - - //Load the file - pl->m_Lib = dlmount(file); - if (!pl->m_Lib) - { - if (error) - UTIL_Format(error, maxlen, "[%d]", GetLastError()); - pl->m_Status = Pl_Error; - } else { - CreateInterfaceFn pfn = (CreateInterfaceFn)(dlsym(pl->m_Lib, PL_EXPOSURE_C)); - if (!pfn) - { - if (error) - UTIL_Format(error, maxlen, "Function %s not found", PL_EXPOSURE_C); - pl->m_Status = Pl_Error; - } else { - pl->m_API = static_cast((pfn)(PLAPI_NAME, NULL)); - if (!pl->m_API) - { - if (error) - UTIL_Format(error, maxlen, "Failed to get API"); - pl->m_Status = Pl_Error; - } else { - int api = pl->m_API->GetApiVersion(); - if (api < PLAPI_MIN_VERSION) - { - if (error) - UTIL_Format(error, maxlen, "Plugin API %d is out of date with required minimum (%d)", api, PLAPI_MIN_VERSION); - pl->m_Status = Pl_Error; - } else if (api > PLAPI_VERSION) { - if (error) - UTIL_Format(error, maxlen, "Plugin API %d is newer than internal version (%d)", api, PLAPI_VERSION); - pl->m_Status = Pl_Error; - } else { - if (pl->m_API->Load(pl->m_Id, static_cast(&g_SmmAPI), error, maxlen, m_AllLoaded)) - { - pl->m_Status = Pl_Running; - if (m_AllLoaded) - { - //API 4 is when we added this callback - //Removing this code as the min version is now 5 - //if (pl->m_API->GetApiVersion() >= 4) - pl->m_API->AllPluginsLoaded(); - } - if (g_VspListener.IsRootLoadMethod() - || (g_VspListener.IsLoaded() && g_SmmAPI.VSPEnabled())) - { - SourceHook::List::iterator event; - for (event = pl->m_Events.begin(); - event != pl->m_Events.end(); - event++) - { - if ((*event).got_vsp) - { - continue; - } - (*event).got_vsp = true; - (*event).event->OnVSPListening(&g_VspListener); - } - } - } else { - pl->m_Status = Pl_Refused; - } - } - } - } - } - } - - if (pl->m_Lib && (pl->m_Status < Pl_Paused)) - { - pl->m_Events.clear(); - g_SourceHook.UnloadPlugin(pl->m_Id); - UnregAllConCmds(pl); - - dlclose(pl->m_Lib); - pl->m_Lib = NULL; - pl->m_API = NULL; - } - - return pl; -} - -bool CPluginManager::_Unload(CPluginManager::CPlugin *pl, bool force, char *error, size_t maxlen) -{ - if (error) - *error = '\0'; - if (pl->m_API && pl->m_Lib) - { - //Note, we'll always tell the plugin it will be unloading... - if (pl->m_API->Unload(error, maxlen) || force) - { - //Make sure to detach it from sourcehook! - g_SourceHook.UnloadPlugin(pl->m_Id); - - UnregAllConCmds(pl); - - //Clean up the DLL - dlclose(pl->m_Lib); - pl->m_Lib = NULL; - pl->m_API = NULL; - - //Remove the plugin from the list - PluginIter i; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == pl->m_Id ) - { - i = m_Plugins.erase(i); - break; - } - } - //Free its memory - delete pl; - - return true; - } - } else { - //The plugin is not valid, and let's just remove it from the list anyway - PluginIter i; - for (i=m_Plugins.begin(); i!=m_Plugins.end(); i++) - { - if ( (*i)->m_Id == pl->m_Id ) - { - i = m_Plugins.erase(i); - break; - } - } - delete pl; - - return true; - } - - return false; -} - -bool CPluginManager::_Pause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) -{ - if (error) - *error = '\0'; - if (pl->m_Status != Pl_Running || !pl->m_API) - { - if (error) - UTIL_Format(error, maxlen, "Plugin cannot be paused"); - } else { - if (pl->m_API->Pause(error, maxlen)) - { - g_SourceHook.PausePlugin(pl->m_Id); - pl->m_Status = Pl_Paused; - - return true; - } - } - - return false; -} - -bool CPluginManager::_Unpause(CPluginManager::CPlugin *pl, char *error, size_t maxlen) -{ - if (error) - *error = '\0'; - - if (pl->m_Status != Pl_Paused || !pl->m_API) - { - if (error) - UTIL_Format(error, maxlen, "Plugin cannot be unpaused"); - } else { - if (pl->m_API->Unpause(error, maxlen)) - { - g_SourceHook.UnpausePlugin(pl->m_Id); - pl->m_Status = Pl_Running; - - return true; - } - } - - return false; -} - -bool CPluginManager::UnloadAll() -{ - PluginIter i; - - char error[128]; - bool status = true; - - while ((i = m_Plugins.begin()) != m_Plugins.end()) - { - if ( !_Unload( (*i), true, error, sizeof(error)) ) - { - status = false; - } - } - - return status; -} - -bool CPluginManager::Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source) -{ - CPlugin *pl = FindById(id); - - if (!pl) - return false; - - file = pl->m_File.c_str(); - status = pl->m_Status; - source = pl->m_Source; - - return true; -} - -bool CPluginManager::QueryRunning(PluginId id, char *error, size_t maxlength) -{ - CPlugin *pl = FindById(id); - - if (!pl || !pl->m_API) - { - if (error) - UTIL_Format(error, maxlength, "Plugin not valid"); - return false; - } - - return pl->m_API->QueryRunning(error, maxlength); -} - -bool CPluginManager::QueryHandle(PluginId id, void *&handle) -{ - CPlugin *pl = FindById(id); - - if (!pl) - { - return false; - } - - handle = static_cast(pl->m_Lib); - - return true; -} - -PluginIter CPluginManager::_begin() -{ - return m_Plugins.begin(); -} - -PluginIter CPluginManager::_end() -{ - return m_Plugins.end(); -} - -void CPluginManager::AddPluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - return; - - pl->m_Cvars.push_back(pCvar); -} - -void CPluginManager::AddPluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - return; - - pl->m_Cmds.push_back(pCmd); -} - -void CPluginManager::RemovePluginCvar(ISmmPlugin *api, ConCommandBase *pCvar) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - return; - - pl->m_Cvars.remove(pCvar); -} - -void CPluginManager::RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd) -{ - CPlugin *pl = FindByAPI(api); - - if (!pl) - return; - - pl->m_Cmds.remove(pCmd); -} - -void CPluginManager::UnregAllConCmds(CPlugin *pl) -{ - SourceHook::List::iterator i; - - for (i=pl->m_Cvars.begin(); i!=pl->m_Cvars.end(); i++) - g_SMConVarAccessor.Unregister( (*i) ); - - pl->m_Cvars.clear(); - - for (i=pl->m_Cmds.begin(); i!=pl->m_Cmds.end(); i++) - g_SMConVarAccessor.Unregister( (*i) ); - - pl->m_Cmds.clear(); -} - -const char *CPluginManager::GetStatusText(CPlugin *pl) -{ - switch (pl->m_Status) - { - case Pl_NotFound: - return "NOFILE"; - case Pl_Error: - return "ERROR"; - case Pl_Refused: - return "FAILED"; - case Pl_Paused: - return "PAUSED"; - case Pl_Running: - { - if (pl->m_API && pl->m_API->QueryRunning(NULL, 0)) - { - return "STOPPED"; - } else { - return "RUNNING"; - } - } - default: - return "-"; - } -} - -unsigned int CPluginManager::GetPluginCount() -{ - return (unsigned int)m_Plugins.size(); -} diff --git a/sourcemm/CPlugin.h b/sourcemm/CPlugin.h deleted file mode 100644 index 9b8335b..0000000 --- a/sourcemm/CPlugin.h +++ /dev/null @@ -1,157 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -#ifndef _INCLUDE_CPLUGIN_H -#define _INCLUDE_CPLUGIN_H - -/** - * @brief Implementation of Plugin API and Management routines - * @file CPlugin.cpp - */ - -#include -#include -#include "convar_smm.h" -#include "IPluginManager.h" -#include "oslink.h" -#include "sh_list.h" -#include "sh_string.h" - -/** - * History of plugin versions: (M=min, C=current) - * 1: Initial interface - * 2: Added GetLogTag() - * 3: Moved GetApiVersion() to top (2005-04-16) - * 4: Added AllPluginsLoaded() callback (2005-04-18) - * 5: Bumped version for SourceHook V4 (2005-05-01) - * 6: Added functions for console printing (2005-05-26) - * M 7: Changed template libraries (2005-08-11) - * New loading structure mechanism - * New SourceHook version - * 8: New SourceHook version (2005-12-23) - * New ISmmAPI additions - * 9: New ISmmPluginManager additions - * C 10: Added VSP listen functions to ISmmAPI and IMetamodListener (2007-02-09) - */ - -#define PLAPI_MIN_VERSION 7 - -namespace SourceMM -{ - struct CNameAlias - { - SourceHook::String alias; - SourceHook::String value; - }; - - struct CPluginEventHandler - { - bool got_vsp; - IMetamodListener *event; - }; - - /** - * @brief Implements Plugin Manager API - */ - class CPluginManager : public ISmmPluginManager - { - public: - /** - * @brief Internal structure for holding plugin data - */ - class CPlugin - { - public: - CPlugin(); - public: - PluginId m_Id; - SourceHook::String m_File; - Pl_Status m_Status; - PluginId m_Source; - ISmmPlugin *m_API; - HINSTANCE m_Lib; - SourceHook::List m_Cvars; - SourceHook::List m_Cmds; - SourceHook::List m_Events; - }; - public: - CPluginManager(); - ~CPluginManager(); - void SetAllLoaded(); - public: - PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen); - bool Unload(PluginId id, bool force, char *error, size_t maxlen); - bool Pause(PluginId id, char *error, size_t maxlen); - bool Unpause(PluginId id, char *error, size_t maxlen); - bool UnloadAll(); - void SetAlias(const char *alias, const char *value); - public: - bool Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source); - bool QueryRunning(PluginId id, char *error, size_t maxlength); - bool QueryHandle(PluginId id, void *&handle); - - void AddPluginCvar(ISmmPlugin *api, ConCommandBase *pCvar); - void AddPluginCmd(ISmmPlugin *api, ConCommandBase *pCmd); - void RemovePluginCvar(ISmmPlugin *api, ConCommandBase *pCvar); - void RemovePluginCmd(ISmmPlugin *api, ConCommandBase *pCmd); - - /** - * @brief Finds a plugin by Id - * - * @param id Id of plugin - * @return CPlugin on success, NULL otherwise - */ - CPlugin *FindById(PluginId id); - - CPlugin *FindByAPI(ISmmPlugin *api); - - /** - * @brief Attempts to reload a failed plugin - * - * @param id Id of plugin - * @param error Error message buffer - * @param len Maximum length of buffer - * @return True on success, false otherwise - */ - bool Retry(PluginId id, char *error, size_t len); - - //get alias info - const char *LookupAlias(const char *alias); - SourceHook::List::iterator _alias_begin(); - SourceHook::List::iterator _alias_end(); - - //Internal iterators - SourceHook::List::iterator _begin(); - SourceHook::List::iterator _end(); - - void SetVSPAsLoaded(); - unsigned int GetPluginCount(); - const char *GetStatusText(CPlugin *pl); - private: - //These are identical internal functions for the wrappers above. - CPlugin *_Load(const char *file, PluginId source, char *error, size_t maxlen); - bool _Unload(CPlugin *pl, bool force, char *error, size_t maxlen); - bool _Pause(CPlugin *pl, char *error, size_t maxlen); - bool _Unpause(CPlugin *pl, char *error, size_t maxlen); - void UnregAllConCmds(CPlugin *pl); - private: - PluginId m_LastId; - SourceHook::List m_Plugins; - SourceHook::List m_Aliases; - bool m_AllLoaded; - }; -}; - -typedef SourceHook::List::iterator PluginIter; - -/** @brief Singleton for plugin manager */ -extern SourceMM::CPluginManager g_PluginMngr; - -#endif //_INCLUDE_CPLUGIN_H diff --git a/sourcemm/CSmmAPI.cpp b/sourcemm/CSmmAPI.cpp deleted file mode 100644 index 7538f15..0000000 --- a/sourcemm/CSmmAPI.cpp +++ /dev/null @@ -1,672 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include "convar_smm.h" -#include "CSmmAPI.h" -#include "sourcemm.h" -#include "concommands.h" -#include "CPlugin.h" -#include "vsp_listener.h" - -/** - * @brief Implementation of main API interface - * @file CSmmAPI.cpp - */ - -using namespace SourceMM; - -CSmmAPI g_SmmAPI; - -CSmmAPI::CSmmAPI() -{ - m_ConPrintf = NULL; - m_CmdCache = false; - m_MsgCount = -1; - m_VSP = false; -} - -CSmmAPI::~CSmmAPI() -{ - m_UserMessages.RemoveAll(); -} - -void CSmmAPI::LogMsg(ISmmPlugin *pl, const char *msg, ...) -{ - va_list ap; - static char buffer[2048]; - - va_start(ap, msg); - UTIL_FormatArgs(buffer, sizeof(buffer), msg, ap); - va_end(ap); - - LogMessage("[%s] %s", pl->GetLogTag(), buffer); -} - -CreateInterfaceFn CSmmAPI::engineFactory(bool syn) -{ - if (syn) - return EngineFactory; - return g_Engine.engineFactory; -} - -CreateInterfaceFn CSmmAPI::physicsFactory(bool syn) -{ - if (syn) - return PhysicsFactory; - return g_Engine.physicsFactory; -} - -CreateInterfaceFn CSmmAPI::fileSystemFactory(bool syn) -{ - if (syn) - return FileSystemFactory; - return g_Engine.fileSystemFactory; -} - -CreateInterfaceFn CSmmAPI::serverFactory(bool syn) -{ - if (syn) - return CreateInterface; - return g_GameDll.factory; -} - -CGlobalVars *CSmmAPI::pGlobals() -{ - return g_Engine.pGlobals; -} - -void CSmmAPI::SetLastMetaReturn(META_RES res) -{ - m_Res = res; -} - -META_RES CSmmAPI::GetLastMetaReturn() -{ - return m_Res; -} - -IConCommandBaseAccessor *CSmmAPI::GetCvarBaseAccessor() -{ - return static_cast(&g_SMConVarAccessor); -} - -bool CSmmAPI::RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) -{ - if (pCommand->IsCommand()) - { - g_PluginMngr.AddPluginCmd(plugin, pCommand); - } else { - g_PluginMngr.AddPluginCvar(plugin, pCommand); - } - - return g_SMConVarAccessor.Register(pCommand); -} - -void CSmmAPI::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) -{ - if (pCommand->IsCommand()) - { - g_PluginMngr.RemovePluginCmd(plugin, pCommand); - } else { - g_PluginMngr.RemovePluginCvar(plugin, pCommand); - } - - g_SMConVarAccessor.Unregister(pCommand); -} - -void CSmmAPI::ConPrint(const char *fmt) -{ - (m_ConPrintf)("%s", fmt); -} - -void CSmmAPI::ConPrintf(const char *fmt, ...) -{ - va_list ap; - static char buffer[4096]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - (m_ConPrintf)("%s", buffer); -} - -void CSmmAPI::AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) -{ - CPluginManager::CPlugin *pl = g_PluginMngr.FindByAPI(plugin); - CPluginEventHandler cpeh; - - cpeh.event = pListener; - cpeh.got_vsp = false; - - pl->m_Events.push_back(cpeh); -} - -void *CSmmAPI::MetaFactory(const char *iface, int *_ret, PluginId *id) -{ - if (id) - { - *id = 0; - } - - if (!iface) - { - return NULL; - } - - //first check ours... we get first chance! - if (strcmp(iface, MMIFACE_SOURCEHOOK) == 0) - { - if (_ret) - { - *_ret = IFACE_OK; - } - return static_cast(static_cast(&g_SourceHook)); - } else if (strcmp(iface, MMIFACE_PLMANAGER) == 0) { - if (_ret) - { - *_ret = IFACE_OK; - } - return static_cast(static_cast(&g_PluginMngr)); - } - - CPluginManager::CPlugin *pl; - SourceHook::List::iterator event; - IMetamodListener *api; - int ret = 0; - void *val = NULL; - - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) - { - pl = (*iter); - for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) - { - api = (*event).event; - ret = IFACE_FAILED; - if ( (val=api->OnMetamodQuery(iface, &ret)) != NULL ) - { - if (_ret) - *_ret = ret; - if (id) - *id = pl->m_Id; - return val; - } - } - } - - if (_ret) - *_ret = IFACE_FAILED; - - return NULL; -} - -////////////////////////////////////////////////////////////////////////// -//THERE BE HAX HERE!!!! DON'T TELL ALFRED, BUT GABE WANTED IT THAT WAY. // -// (note: you can find the offset by looking for the text // -// "Echo text to console", you'll find the callback cmd pushed on the // -// stack.) // -////////////////////////////////////////////////////////////////////////// - -#define SIGLEN 8 -#define ENGINE486_SIG "\x55\x89\xE5\x53\x83\xEC\x14\xBB" -#define ENGINE486_OFFS 40 -#define ENGINE686_SIG "\x53\x83\xEC\x08\xBB\x01\x00\x00" -#define ENGINE686_OFFS 50 -#define ENGINEAMD_SIG "\x53\x51\xBB\x01\x00\x00\x00\x51" -#define ENGINEAMD_OFFS 47 -#define ENGINEW32_SIG "\xA1\x2A\x2A\x2A\x2A\x56\xBE\x01" -#define ENGINEW32_OFFS 38 -#define IA32_CALL 0xE8 - -bool vcmp(const void *_addr1, const void *_addr2, size_t len) -{ - unsigned char *addr1 = (unsigned char *)_addr1; - unsigned char *addr2 = (unsigned char *)_addr2; - - for (size_t i=0; iGetCommands(); - unsigned char *ptr = NULL; - FnCommandCallback callback = NULL; - int offs = 0; - - while (pBase) - { - if ( strcmp(pBase->GetName(), "echo") == 0 ) - { - //callback = //*((FnCommandCallback *)((char *)pBase + offsetof(ConCommand, m_fnCommandCallback))); - callback = ((ConCommand *)pBase)->GetCallback(); - ptr = (unsigned char *)callback; - #ifdef OS_LINUX - if (vcmp(ptr, ENGINE486_SIG, SIGLEN)) - { - offs = ENGINE486_OFFS; - } - else if (vcmp(ptr, ENGINE686_SIG, SIGLEN)) - { - offs = ENGINE686_OFFS; - } - else if (vcmp(ptr, ENGINEAMD_SIG, SIGLEN)) - { - offs = ENGINEAMD_OFFS; - } - #elif defined OS_WIN32 // Only one Windows engine binary so far... - if (vcmp(ptr, ENGINEW32_SIG, SIGLEN)) - { - offs = ENGINEW32_OFFS; - } - #endif - - if (!offs || ptr[offs - 1] != IA32_CALL) - { - m_ConPrintf = (CONPRINTF_FUNC)Msg; - return false; - } - //get the relative offset - m_ConPrintf = *((CONPRINTF_FUNC *)(ptr + offs)); - //add the base offset, to the ip (which is the address+offset + 4 bytes for next instruction) - m_ConPrintf = (CONPRINTF_FUNC)((unsigned long)m_ConPrintf + (unsigned long)(ptr + offs) + 4); - - m_CmdCache = true; - - return true; - } - pBase = const_cast(pBase->GetNext()); - } - - m_ConPrintf = (CONPRINTF_FUNC)Msg; - - return false; -} - -bool CSmmAPI::CmdCacheSuccessful() -{ - return m_CmdCache; -} - -void CSmmAPI::GetApiVersions(int &major, int &minor, int &plvers, int &plmin) -{ - major = SM_VERS_API_MAJOR; - minor = SM_VERS_API_MINOR; - plvers = PLAPI_VERSION; - plmin = PLAPI_MIN_VERSION; -} - -void CSmmAPI::GetShVersions(int &shvers, int &shimpl) -{ - shvers = SH_IFACE_VERSION; - shimpl = SH_IMPL_VERSION; -} - -int CSmmAPI::FormatIface(char iface[], unsigned int maxlength) -{ - int length = (int)strlen(iface); - int i; - int num = 0; - - for (i = length - 1; i >= 0; i--) - { - if (!isdigit(iface[i])) - { - if (i != length - 1) - { - num = 1; - } - break; - } - } - - if ( (num && ((int)maxlength <= length)) || (!num && ((int)maxlength <= length + 3)) ) - { - return -1; - } - - if (i != length - 1) - num = atoi(&(iface[++i])); - - num++; - - snprintf(&(iface[i]), 4, "%03d", num); - - return num; -} - -void *CSmmAPI::InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret) -{ - char _if[256]; /* assume no interface goes beyond this */ - size_t len = strlen(iface); - int num = 0; - void *pf = NULL; - - if (max > 999) - max = 999; - - if (len + 4 > sizeof(_if)) - { - if (ret) - { - *ret = IFACE_FAILED; - } - return NULL; - } - - strcpy(_if, iface); - - do - { - if ( (pf = (fn)(_if, ret)) != NULL ) - break; - if (num > max) - break; - } while (( num = FormatIface(_if, len+1) )); - - return pf; -} - -void *CSmmAPI::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min) -{ - char buffer[256]; /* assume no interface will go beyond this */ - size_t len = strlen(iface); - int ret; /* just in case something doesn't handle NULL properly */ - - if (len > sizeof(buffer) - 4) - { - return NULL; - } - - strcpy(buffer, iface); - - if (min != -1) - { - char *ptr = &buffer[len - 1]; - int digits = 0; - while (isdigit(*ptr) && digits <=3) - { - *ptr = '\0'; - digits++; - ptr--; - } - if (digits != 3) - { - /* for now, assume this is an error */ - strcpy(buffer, iface); - } else { - char num[4]; - min = (min == 0) ? 1 : min; - snprintf(num, sizeof(num), "%03d", min); - strcat(buffer, num); - } - } - - return InterfaceSearch(fn, buffer, IFACE_MAXNUM, &ret); -} - -const char *CSmmAPI::GetBaseDir() -{ - return g_ModPath.c_str(); -} - -void CSmmAPI::PathFormat(char *buffer, size_t len, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - size_t mylen = UTIL_FormatArgs(buffer, len, fmt, ap); - va_end(ap); - - for (size_t i = 0; i < mylen; i++) - { - if (buffer[i] == ALT_SEP_CHAR) - { - buffer[i] = PATH_SEP_CHAR; - } - } -} - -void CSmmAPI::ClientConPrintf(edict_t *client, const char *fmt, ...) -{ - va_list ap; - static char buffer[4096]; - - va_start(ap, fmt); - UTIL_FormatArgs(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - g_Engine.engine->ClientPrintf(client, buffer); -} - -void CSmmAPI::LoadAsVSP() -{ - size_t len; - char engine_file[PATH_SIZE]; - char rel_path[PATH_SIZE * 2]; - - GetFileOfAddress(g_Engine.engine, engine_file, sizeof(engine_file)); - - /* Chop off the "engine" file part */ - len = strlen(engine_file); - for (size_t i = len - 1; i >= 0 && i < len; i--) - { - if (engine_file[i] == '/' - || engine_file[i] == '\\') - { - engine_file[i] = '\0'; - break; - } - } - - const char *usepath = g_SmmPath.c_str(); - if (UTIL_Relatize(rel_path, sizeof(rel_path), engine_file, g_SmmPath.c_str())) - { - usepath = rel_path; - } - - char command[PATH_SIZE * 2]; - g_VspListener.SetLoadable(true); - UTIL_Format(command, sizeof(command), "plugin_load \"%s\"\n", usepath); - g_Engine.engine->ServerCommand(command); -} - -void CSmmAPI::EnableVSPListener() -{ - /* If GameInit already passed and we're not already enabled or loaded, go ahead and LoadAsVSP load */ - if (bGameInit && !m_VSP && !g_VspListener.IsLoaded() && !g_VspListener.IsRootLoadMethod()) - { - LoadAsVSP(); - } - m_VSP = true; -} - -int CSmmAPI::GetGameDLLVersion() -{ - return g_GameDllVersion; -} - -////////////////////////////////////////////////////////////////////// -// EVEN MORE HACKS HERE! YOU HAVE BEEN WARNED! // -// Signatures necessary in finding the pointer to the CUtlDict that // -// stores user message information. // -// IServerGameDLL::GetUserMessageInfo() normally crashes with bad // -// message indices. This is our answer to it. Yuck! <:-( // -////////////////////////////////////////////////////////////////////// -#ifdef OS_WIN32 - /* General Windows sig */ - #define MSGCLASS_SIGLEN 7 - #define MSGCLASS_SIG "\x8B\x0D\x2A\x2A\x2A\x2A\x56" - #define MSGCLASS_OFFS 2 - - /* Dystopia Wimdows hack */ - #define MSGCLASS2_SIGLEN 16 - #define MSGCLASS2_SIG "\x56\x8B\x74\x24\x2A\x85\xF6\x7C\x2A\x3B\x35\x2A\x2A\x2A\x2A\x7D" - #define MSGCLASS2_OFFS 11 - - /* Windows frame pointer sig */ - #define MSGCLASS3_SIGLEN 18 - #define MSGCLASS3_SIG "\x55\x8B\xEC\x51\x89\x2A\x2A\x8B\x2A\x2A\x50\x8B\x0D\x2A\x2A\x2A\x2A\xE8" - #define MSGCLASS3_OFFS 13 -#elif defined OS_LINUX - /* No frame pointer sig */ - #define MSGCLASS_SIGLEN 14 - #define MSGCLASS_SIG "\x53\x83\xEC\x2A\x8B\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" - #define MSGCLASS_OFFS 9 - - /* Frame pointer sig */ - #define MSGCLASS2_SIGLEN 16 - #define MSGCLASS2_SIG "\x55\x89\xE5\x53\x83\xEC\x2A\x8B\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x89" - #define MSGCLASS2_OFFS 11 -#endif - -/* This is the ugliest function in all of SourceMM */ -/* :TODO: Make this prettier */ -bool CSmmAPI::CacheUserMessages() -{ - SourceHook::MemFuncInfo info = {true, -1, 0, 0}; - SourceHook::GetFuncInfo(&IServerGameDLL::GetUserMessageInfo, info); - - /* Get address of original GetUserMessageInfo() */ - char *vfunc = reinterpret_cast(g_GameDllPatch->GetOrigFunc(info.vtbloffs, info.vtblindex)); - - /* If we can't get original function, that means there's no hook */ - if (vfunc == NULL) - { - /* Get virtual function address 'manually' then */ - char *adjustedptr = reinterpret_cast(g_GameDll.pGameDLL) + info.thisptroffs + info.vtbloffs; - char **vtable = *reinterpret_cast(adjustedptr); - - vfunc = vtable[info.vtblindex]; - } - - /* Oh dear, we have a relative jump on our hands - * PVK II on Windows made me do this, but I suppose it doesn't hurt to check this on Linux too... - */ - if (*vfunc == '\xE9') - { - /* Get address from displacement... - * - * Add 5 because it's relative to next instruction: - * Opcode <1 byte> + 32-bit displacement <4 bytes> - */ - vfunc = vfunc + *reinterpret_cast(vfunc + 1) + 5; - } - - UserMsgDict *dict = NULL; - - if (vcmp(vfunc, MSGCLASS_SIG, MSGCLASS_SIGLEN)) - { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - } else if (vcmp(vfunc, MSGCLASS2_SIG, MSGCLASS2_SIGLEN)) { - #ifdef OS_WIN32 - /* If we get here, the code is possibly inlined like in Dystopia */ - - /* Get the address of the CUtlRBTree */ - char *rbtree = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* CUtlDict should be 8 bytes before the CUtlRBTree (hacktacular!) */ - dict = reinterpret_cast(rbtree - 8); - #elif defined OS_LINUX - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS2_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - #ifdef OS_WIN32 - } else if (vcmp(vfunc, MSGCLASS3_SIG, MSGCLASS3_SIGLEN)) { - /* Get address of CUserMessages instance */ - char **userMsgClass = *reinterpret_cast(vfunc + MSGCLASS3_OFFS); - - /* Get address of CUserMessages::m_UserMessages */ - dict = reinterpret_cast(*userMsgClass); - #endif - } - - if (dict) - { - m_MsgCount = dict->Count(); - - /* Ensure that count is within bounds of an unsigned byte, because that's what engine supports */ - if (m_MsgCount < 0 || m_MsgCount > 255) - { - m_MsgCount = -1; - return false; - } - - UserMessage *msg; - - /* Cache messages in our CUtlDict */ - for (int i = 0; i < m_MsgCount; i++) - { - msg = dict->Element(i); - m_UserMessages.Insert(msg->name, msg); - } - - return true; - } - - return false; -} - -bool CSmmAPI::MsgCacheSuccessful() -{ - return m_MsgCount > -1; -} - -int CSmmAPI::GetUserMessageCount() -{ - return m_MsgCount; -} - -int CSmmAPI::FindUserMessage(const char *name, int *size) -{ - int index = m_UserMessages.Find(name); - - if (size && index > -1) - { - UserMessage *msg = m_UserMessages.Element(index); - *size = msg->size; - } - - return index; -} - -const char *CSmmAPI::GetUserMessage(int index, int *size) -{ - if (m_MsgCount <= 0 || index < 0 || index >= m_MsgCount) - { - return NULL; - } - - UserMessage *msg = m_UserMessages.Element(index); - - if (size) - { - *size = msg->size; - } - - return msg->name; -} diff --git a/sourcemm/CSmmAPI.h b/sourcemm/CSmmAPI.h deleted file mode 100644 index 914fb7f..0000000 --- a/sourcemm/CSmmAPI.h +++ /dev/null @@ -1,98 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_CSMM_API_H -#define _INCLUDE_CSMM_API_H - -/** - * @brief Header for CSmmAPI implementation - * @file CSmmAPI.h - */ - -#include "ISmmAPI.h" -#include - -struct UserMessage -{ - int size; - const char *name; -}; - -typedef CUtlDict UserMsgDict; - -typedef void (*CONPRINTF_FUNC)(const char *, ...); - -namespace SourceMM -{ - class CSmmAPI : public ISmmAPI - { - public: - CSmmAPI(); - ~CSmmAPI(); - public: - void LogMsg(ISmmPlugin *pl, const char *msg, ...); - public: - CreateInterfaceFn engineFactory(bool syn=true); - CreateInterfaceFn physicsFactory(bool syn=true); - CreateInterfaceFn fileSystemFactory(bool syn=true); - CreateInterfaceFn serverFactory(bool syn=true); - CGlobalVars *pGlobals(); - void SetLastMetaReturn(META_RES res); - META_RES GetLastMetaReturn(); - IConCommandBaseAccessor *GetCvarBaseAccessor(); - bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); - void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand); - void ConPrint(const char *fmt); - void ConPrintf(const char *fmt, ...); - bool RemotePrintingAvailable() - { - return CmdCacheSuccessful(); - } - virtual void GetApiVersions(int &major, int &minor, int &plvers, int &plmin); - virtual void GetShVersions(int &shvers, int &shimpl); - virtual void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener); - virtual void *MetaFactory(const char *iface, int *ret, PluginId *id); - virtual int FormatIface(char buffer[], unsigned int maxlength); - virtual void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret); - virtual const char *GetBaseDir(); - virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...); - void ClientConPrintf(edict_t *client, const char *fmt, ...); - void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1); - void EnableVSPListener(); - int GetGameDLLVersion(); - int GetUserMessageCount(); - int FindUserMessage(const char *name, int *size=NULL); - const char *GetUserMessage(int index, int *size=NULL); - public: - bool CacheCmds(); - bool CmdCacheSuccessful(); - void LoadAsVSP(); - bool VSPEnabled() - { - return m_VSP; - } - bool CacheUserMessages(); - bool MsgCacheSuccessful(); - private: - META_RES m_Res; - CONPRINTF_FUNC m_ConPrintf; - bool m_CmdCache; - bool m_VSP; - int m_MsgCount; - UserMsgDict m_UserMessages; - }; -}; - -extern SourceMM::CSmmAPI g_SmmAPI; - -#define CONMSG g_SmmAPI.ConPrintf -#define CLIENT_CONMSG g_SmmAPI.ClientConPrintf - -#endif //_INCLUDE_CSMM_API_H diff --git a/sourcemm/IPluginManager.h b/sourcemm/IPluginManager.h deleted file mode 100644 index fd0662f..0000000 --- a/sourcemm/IPluginManager.h +++ /dev/null @@ -1,137 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -#ifndef _INCLUDE_PLUGINMANAGER_H -#define _INCLUDE_PLUGINMANAGER_H - -/** - * @brief Plugin Manager interface - * @file IPluginManager.h - */ - -typedef int PluginId; - -#include "ISmmPlugin.h" - -/** - * @brief Load sources - */ -enum -{ - Pl_BadLoad=0, - Pl_Console=-1, - Pl_File=-2, - Pl_MinId=1, -}; - -/** - * @brief Status of a plugin at runtime - */ -enum Pl_Status -{ - Pl_NotFound=-4, - Pl_Error=-3, - Pl_Refused=-2, - Pl_Paused=-1, - Pl_Running=0, -}; - -typedef int PluginId; -struct factories; - -class ISmmPluginManager -{ -public: - /** - * @brief Loads a plugin and returns its id. If this is called before DLLInit(), - * then the plugin is considered to be "hot" - it might refuse its own load later! - * Also, a hot plugin might not have an error message. - * - * @param file String containing file name - * @param source Specifies who loaded the plugin - * @param status Status of the plugin - * @param ismm Pointer to Smm API - * @param error String buffer for error messages - * @param maxlen Maximum length of buffer - * @return Id of plugin - */ - virtual PluginId Load(const char *file, PluginId source, bool &already, char *error, size_t maxlen) =0; - - /** - * @brief Unloads a plugin - * - * @param id Id of plugin - * @param error String buffer for error messages - * @param maxlen Maximum length of buffer - * @return True on success, false otherwise - */ - virtual bool Unload(PluginId id, bool force, char *error, size_t maxlen) =0; - - /** - * @brief Pauses a plugin - * - * @param id Id of plugin - * @param error String buffer for error messages - * @param maxlen Maximum length of buffer - * @return True on success, false otherwise - */ - virtual bool Pause(PluginId id, char *error, size_t maxlen) =0; - - /** - * @brief Unpauses a plugin - * - * @param id Id of plugin - * @param force If true, forces the plugin to unload - * @param error String buffer for error messages - * @param maxlen Maximum length of buffer - * @return True on success, false otherwise - */ - virtual bool Unpause(PluginId id, char *error, size_t maxlen) =0; - - /** - * @brief Unloads all plugins forcefully - * - * @return True on success, false otherwise - */ - virtual bool UnloadAll() =0; - - /** - * @brief Returns information about a plugin - * - * @param id Id of plugin - * @param file Pointer to file string by reference - * @param list Pointer to factories by reference - * @param status By reference status of plugin - * @param source By reference source of plugin - * @return True on success, false if not found - */ - virtual bool Query(PluginId id, const char *&file, Pl_Status &status, PluginId &source) =0; - - /** - * @brief Checks another plugin's QueryRunning() status. - * - * @param id Id of plugin - * @param error Message buffer - * @param maxlen Size of error buffer - * @return Status value - */ - virtual bool QueryRunning(PluginId id, char *error, size_t maxlength) =0; - - /** - * @brief Returns the handle of a plugin (OS dependent meaning) - * - * @param id Id of plugin - * @param handle By reference handle of plugin, if any - * @return True if plugin id is valid, false otherwise - */ - virtual bool QueryHandle(PluginId id, void *&handle) =0; -}; - -#endif //_INCLUDE_PLUGINMANAGER_H diff --git a/sourcemm/ISmmAPI.h b/sourcemm/ISmmAPI.h deleted file mode 100644 index e6e90a7..0000000 --- a/sourcemm/ISmmAPI.h +++ /dev/null @@ -1,320 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -#ifndef _INCLUDE_ISMM_API_H -#define _INCLUDE_ISMM_API_H - -/** - * @brief External API interface - * @file ISmmAPI.h - */ - -#include -#include -#include -#include "IPluginManager.h" - -#if defined __GNUC__ -#if ((__GNUC__ == 3) && (__GNUC_MINOR__ < 4)) || (__GNUC__ < 3) -#error "You must compile with at least GCC 3.4! If you know what you are doing, you can remove this message." -#endif //version check -#endif //__GNUC__ - -class IMetamodListener; -class ISmmPluginManager; -class ISmmPlugin; - -#define MMIFACE_SOURCEHOOK "ISourceHook" /**< ISourceHook Pointer */ -#define MMIFACE_PLMANAGER "IPluginManager" /**< SourceMM Plugin Functions */ -#define IFACE_MAXNUM 999 - -class ISmmAPI -{ -public: - /** - * @brief Logs a message through the HL2 log system. - * Note: Newlines are appended automatically. - * - * @param pl Plugin API pointer (used for tagging message) - * @param msg Formatted string. - */ - virtual void LogMsg(ISmmPlugin *pl, const char *msg, ...) =0; -public: - /** - * @brief Returns an interface factory for the HL2 engine. - * - * @param syn If syn is true, the synthetic wrapper is returned. - * If syn is false, the true function is returned. - * @return CreateInterfaceFn function pointer. - */ - virtual CreateInterfaceFn engineFactory(bool syn=true) =0; - - /** - * @brief Returns an interface factory for the HL2 physics engine. - * - * @param syn If syn is true, the synthetic wrapper is returned. - * If syn is false, the true function is returned. - * @return CreateInterfaceFn function pointer. - */ - virtual CreateInterfaceFn physicsFactory(bool syn=true) =0; - - /** - * @brief Returns an interface factory for the HL2 file system. - * - * @param syn If syn is true, the synthetic wrapper is returned. - * If syn is false, the true function is returned. - * @return CreateInterfaceFn function pointer. - */ - virtual CreateInterfaceFn fileSystemFactory(bool syn=true) =0; - - /** - * @brief Returns an interface factory for the GameDLL. - * - * @param syn If syn is true, the synthetic wrapper is returned. - * If syn is false, the true function is returned. - * @return CreateInterfaceFn function pointer. - */ - virtual CreateInterfaceFn serverFactory(bool syn=true) =0; - - /** - * @brief Returns a CGlobalVars pointer from the HL2 Engine. - * - * @return CGlobalVars pointer. - */ - virtual CGlobalVars *pGlobals() =0; - - /** - * @brief Used with SourceHook, sets teh last meta return value. - * Note: Do not call this directly, use the Metamod macros. - * - * @param res META_RETURN value to set. - */ - virtual void SetLastMetaReturn(META_RES res) =0; - - /** - * @brief Used with SourceHook, returns the last meta return value. - * Note: This is only valid inside a hook function. - * - * @return Last META_RETURN value set by a plugin. - */ - virtual META_RES GetLastMetaReturn() =0; - -public: // Added in 1.00-RC2 (0:0) - /** - * @brief Allows access to Metamod's ConCommandBaseAccessor. - * - * @return Returns IConCommandBaseAccessor pointer. - */ - virtual IConCommandBaseAccessor *GetCvarBaseAccessor() =0; - - /** - * @brief Registers a ConCommandBase. - * - * @param plugin Parent plugin API pointer. - * @param pCommand ConCommandBase to register. - * @return True if successful, false otherwise. Does not return false yet. - */ - virtual bool RegisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) =0; - - /** - * @brief Unregisters a ConCommandBase. - * - * @param plugin Parent plugin API pointer. - * @param pCommand ConCommandBase to unlink. - */ - virtual void UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) =0; - - /** - * @brief Prints an unformatted string to the remote server console. - * Note: Newlines are not added automatically. - * - * @param str Message string. - */ - virtual void ConPrint(const char *str) =0; - - /** - * @brief Prints a formatted message to the remote server console. - * Note: Newlines are not added automatically. - * - * @param fmt Formatted message. - */ - virtual void ConPrintf(const char *fmt, ...) =0; - -public: // Added in 1.1.0 (1:0) - /** - * @brief Checks if ConPrint/ConPrintf will mirror to rcon. - * - * @return True if remote printing available, false otherwise. - */ - virtual bool RemotePrintingAvailable() =0; - - /** - * @brief Returns the Metamod Version numbers as major version and minor (API) version. - * Changes to minor version are guaranteed to be backwards compatible. - * Changes to major version are not. - * - * @param major Filled with the major API version number. - * @param minor Filled with the minor API version number. - * @param plvers Filled with the current plugin API version number. - * @param plmin Filled with the minimum plugin API version number supported. - */ - virtual void GetApiVersions(int &major, int &minor, int &plvers, int &plmin) =0; - - /** - * @brief Returns sourcehook API version and implementation version. - * - * @param shvers Filled with the SourceHook API version number. - * @param shimpl Filled with the SourceHook implementation number. - */ - virtual void GetShVersions(int &shvers, int &shimpl) =0; - - /** - * @brief Adds a Metamod listener. - * - * @param plugin Plugin interface pointer. - * @param pListener Listener interface pointer to add. - */ - virtual void AddListener(ISmmPlugin *plugin, IMetamodListener *pListener) =0; - - /** - * @brief Queries the metamod factory - * - * @param iface String containing interface name - * @param ret Optional pointer to store return status - * @param id Optional pointer to store id of plugin that overrode interface, 0 if none - * @return Returned pointer - */ - virtual void *MetaFactory(const char *iface, int *ret, PluginId *id) =0; - -public: // Added in 1.1.2 (1:1) - /** - * @brief Given a base interface name, such as ServerGameDLL or ServerGameDLL003, - * reformats the string to increase the number, then returns the new number. - * This is the base function to InterfaceSearch() and VInterfaceMatch(). - * - * @param iface Input/output interface name. Must be writable. - * @param maxlength Maximum length of iface buffer. Must be at least strlen(iface)+4 chars. - * @return The newly incremented iface version number. - */ - virtual int FormatIface(char iface[], unsigned int maxlength) =0; - -public: // Added in 1.2 (1:2) - /** - * @brief Searches for an interface for you. - * - * @param fn InterfaceFactory function. - * @param iface Interface string name. - * @param max Maximum version to look up. - * @param ret Last return code from interface factory function. - * @return Interface pointer, or NULL if not found. - */ - virtual void *InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max, int *ret) =0; - - /** - * @brief Returns the base directory of the game/server, equivalent to - * IVEngineServer::GetGameDir(), except the path is absolute. - * - * @return Static pointer to game's absolute basedir. - */ - virtual const char *GetBaseDir() =0; - - /** - * @brief Formats a file path to the local OS. Does not include any base directories. - * Note that all slashes and black slashes are reverted to the local OS's expectancy. - * - * @param buffer Destination buffer to store path. - * @param len Maximum length of buffer, including null terminator. - * @param fmt Formatted string. - */ - virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...) =0; - -public: // Added in 1.2.2 (1:3) - /** - * @brief Prints text in the specified client's console. Same as IVEngineServer::ClientPrintf - * except that it allows for string formatting. - * - * @param client Client edict pointer. - * @param fmt Formatted string to print to the client. - */ - virtual void ClientConPrintf(edict_t *client, const char *fmt, ...) =0; - -public: // Added in 1.3 (1:4) - /** - * @brief Wrapper around InterfaceSearch(). Assumes no maximum. - * This is designed to replace the fact that searches only went upwards. - * The "V" is intended to convey that this is for Valve formatted interface strings. - * - * @param fn Interface factory function. - * @param iface Interface string. - * @param min Minimum value to search from. If zero, searching begins from the - * first available version regardless of the interface. - * Note that this can return interfaces EARLIER than the version specified. - * A value of -1 (default) specifies the string version as the minimum. - * Any other value specifices the minimum value to search from. - * @return Interface pointer, or NULL if not found. - */ - virtual void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1) =0; - -public: // Added in 1.4 (1:5) - /** - * @brief Tells SourceMM to add VSP hooking capability to plugins. - * - * Since this potentially uses more resources than it would otherwise, plugins have to - * explicitly enable the feature. Whether requested or not, if it is enabled, all plugins - * will get a pointer to the VSP listener through IMetamodListener. - */ - virtual void EnableVSPListener() =0; - - /** - * @brief Returns the interface version of the GameDLL's IServerGameDLL implementation. - * - * @return Interface version of the loaded IServerGameDLL. - */ - virtual int GetGameDLLVersion() =0; - - /** - * @brief Returns the number of user messages in the GameDLL. - * - * @return Number of user messages, or -1 if SourceMM has failed to get user message list. - */ - virtual int GetUserMessageCount() =0; - - /** - * @brief Returns the index of the specified user message. - * - * @param name User message name. - * @param size Optional pointer to store size of user message. - * @return Message index, or -1 on failure. - */ - virtual int FindUserMessage(const char *name, int *size=NULL) =0; - - /** - * @brief Returns the name of the specified user message. - * - * @param index User message index. - * @param size Optional pointer to store size of user message. - * @return Message name, or NULL on failure. - */ - virtual const char *GetUserMessage(int index, int *size=NULL) =0; -}; - - -/** - * Version History - * - * 1.1.0 Bumped API to 1:0. The breaking changes occurred in SourceHook and the plugin API. - * 1.1.2 Added API call for generating iface names. - * 1.2 Added API more helper functions and new SourceHook version. - * 1.2.2 Added API for printing to client console (with string formatting). - * 1.3 Added new interface search API. - * 1.4 Added VSP listener and user message API. - */ - -#endif //_INCLUDE_ISMM_API_H diff --git a/sourcemm/ISmmPlugin.h b/sourcemm/ISmmPlugin.h deleted file mode 100644 index dea7700..0000000 --- a/sourcemm/ISmmPlugin.h +++ /dev/null @@ -1,409 +0,0 @@ -/* ======== SourceMM ======== -* Copyright (C) 2004-2007 Metamod:Source Development Team -* No warranties of any kind -* -* License: zlib/libpng -* -* Author(s): David "BAILOPAN" Anderson -* ============================ -*/ - -#ifndef _INCLUDE_ISMM_PLUGIN_H -#define _INCLUDE_ISMM_PLUGIN_H - -/** - * @brief Plugin API interface - * @file ISmmPlugin.h - */ - -#include -#include -#include "ISmmAPI.h" - -#define PLAPI_VERSION 10 -#define PLAPI_NAME "ISmmPlugin" - -class ISmmAPI; - -class ISmmPlugin -{ -public: - virtual int GetApiVersion() { return PLAPI_VERSION; } - virtual ~ISmmPlugin() { } -public: - /** - * @brief Called on plugin load. - * NOTE - As of API 7, this is called as DLLInit() executes - after the parameters are known, but before - * the original GameDLL function is called. Therefore, you cannot hook it, but you don't need to - - * Load() is basically your hook. - * NOTE - As of API 7, you can override factories before the engine and gamedll exchange them. - * However, take care to note that if your plugin is unloaded, and the gamedll/engine have cached - * an interface you've passed, something will definitely crash. Be careful. - * - * @param id Internal id of plugin. Saved globally by PLUGIN_SAVEVARS() - * @param ismm External API for SourceMM. Saved globally by PLUGIN_SAVEVARS() - * @param list Contains a list of factories. Hook a factory call by setting one equal to your own function. - * @param late Set to true if your plugin was loaded late (not at server load). - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True if successful, return false to reject the load. - */ - virtual bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlength, bool late) =0; - - /** - * @brief Called when your plugin is "queried". This is useful for rejecting a loaded - * state. For example, if your plugin wants to stop operating, it can simply return - * false and copy an error message. This will notify other plugins or MM:S of something - * bad that happened. NOTE - MM:S will not cache the return state, so if you return false, - * your plugin will not actually be paused or unloaded. This callback will be called when: - * - Another plugin requests it - * - Someone types "meta list", it will show up as "REFUSED" - * - When Metamod need to re-check the plugin's status - * - If the plugin does something like overload a factory, Metamod will make sure the Query() returns true - * before calling it. - * Also note that this query will only override Metamod when the plugin is running and not paused. - * - * @param error Buffer for error message. This can be NULL! - * @param maxlen Maximum length of error buffer. - * @return Status code - true for okay, false for badness. - */ - virtual bool QueryRunning(char *error, size_t maxlen) - { - return true; - } - - /** - * @brief Called on plugin unload. You can return false if you know your plugin - * is not capable of restoring critical states it modifies. - * - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True on success, return false to request no unload. - */ - virtual bool Unload(char *error, size_t maxlen) - { - return true; - } - - /** @brief Called on plugin pause. - * - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True on success, return false to request no pause. - */ - virtual bool Pause(char *error, size_t maxlen) - { - return true; - } - - /** @brief Called on plugin unpause. - * - * @param error Error message buffer - * @param maxlen Size of error message buffer - * @return True on success, return false to request no unpause. - */ - virtual bool Unpause(char *error, size_t maxlen) - { - return true; - } -public: - /** @brief Return author as string */ - virtual const char *GetAuthor() =0; - - /** @brief Return plugin name as string */ - virtual const char *GetName() =0; - - /** @brief Return a description as string */ - virtual const char *GetDescription() =0; - - /** @brief Return a URL as string */ - virtual const char *GetURL() =0; - - /** @brief Return quick license code as string */ - virtual const char *GetLicense() =0; - - /** @brief Return version as string */ - virtual const char *GetVersion() =0; - - /** @brief Return author as string */ - virtual const char *GetDate() =0; - - /** @brief Return author as string */ - virtual const char *GetLogTag() =0; -public: - /** - * @brief Called when all plugins have been loaded - API version 4 - * - * This is useful for knowing when it's safe to request things another plugin might have. - * NOTE for API 7 - This is called after DLLInit(). - */ - virtual void AllPluginsLoaded() - { - } -}; - -/** - * @brief Added in 1.1 so plugins could listen to specific events - */ -class IMetamodListener -{ -public: - virtual ~IMetamodListener() { } -public: - /** - * @brief Called when a plugin is loaded. - * - * @param id Id of the plugin. - */ - virtual void OnPluginLoad(PluginId id) { } - - /** - * @brief Called when a plugin is unloaded. - * - * @param id Id of the plugin. - */ - virtual void OnPluginUnload(PluginId id) { } - - /** - * @brief Called when a plugin is paused. - * - * @param id Id of the plugin. - */ - virtual void OnPluginPause(PluginId id) { } - - /** - * @brief Called when a plugin is unpaused. - * - * @param id Id of the plugin. - */ - virtual void OnPluginUnpause(PluginId id) { } - - /** - * @brief Called when the level is loaded (after GameInit, before ServerActivate). - * - * To override this, hook IServerGameDLL::LevelInit(). - * - * @param pMapName Name of the map. - * @param pMapEntities Lump string of the map entities, in KeyValue format. - * @param pOldLevel Unknown. - * @param pLandmarkName Unknown. - * @param loadGame Unknown. - * @param background Unknown. - */ - virtual void OnLevelInit(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) { } - - /** - * @brief Called when the level is shut down. May be called more than once. - */ - virtual void OnLevelShutdown() { } - - /** - * @brief Called when engineFactory() is used through Metamod:Source's wrapper. - * This can be used to provide interfaces to other plugins or the GameDLL. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnEngineQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when the physics factory is used through Metamod:Source's wrapper. - * This can be used to provide interfaces to other plugins. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnPhysicsQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when the filesystem factory is used through Metamod:Source's wrapper. - * This can be used to provide interfaces to other plugins. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnFileSystemQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when the server DLL's factory is used through Metamod:Source's wrapper. - * This can be used to provide interfaces to other plugins. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnGameDLLQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when Metamod's own factory is invoked. - * This can be used to provide interfaces to other plugins. - * - * If ret is passed, you should fill it with IFACE_OK or IFACE_FAILED. - * - * @param iface Interface string. - * @param ret Optional pointer to store return code. - * @return Generic pointer to the interface, or NULL if not found. - */ - virtual void *OnMetamodQuery(const char *iface, int *ret) - { - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /** - * @brief Called when Metamod:Source acquires a valid IServerPluginCallbacks - * pointer to be used for hooking by plugins. - * - * This will only be called after a call to ISmmAPI::EnableVSPListener(). - * If called before GameInit, this callback will occur before LevelInit. - * Otherwise, it will be called on the first call after that. - * - * This callback is provided to all plugins regardless of which (or how many) - * called EnableVSPListener(), but only if at least one did in fact enable it. - * - * This callback is only available for plugins using API v1:5 (SourceMM 1.4+). - * - * @param iface Interface pointer. If NULL, then the VSP listening construct - * failed to initialize and is not available. - */ - virtual void OnVSPListening(IServerPluginCallbacks *iface) - { - } -}; - -#define PL_EXPOSURE CreateInterface -#define PL_EXPOSURE_C "CreateInterface" - -#define PLUGIN_EXPOSE(name, var) \ - ISmmAPI *g_SMAPI = NULL; \ - ISmmPlugin *g_PLAPI = NULL; \ - PluginId g_PLID = (PluginId)0; \ - SourceHook::ISourceHook *g_SHPtr = NULL; \ - SMM_API void *PL_EXPOSURE(const char *name, int *code) { \ - if (name && !strcmp(name, PLAPI_NAME)) { \ - return static_cast(&var); \ - } \ - return NULL; \ - } - -#define PLUGIN_GLOBALVARS() \ - extern SourceHook::ISourceHook *g_SHPtr; \ - extern ISmmAPI *g_SMAPI; \ - extern ISmmPlugin *g_PLAPI; \ - extern PluginId g_PLID; - -#define PLUGIN_SAVEVARS() \ - g_SMAPI = ismm; \ - g_SHPtr = static_cast(ismm->MetaFactory(MMIFACE_SOURCEHOOK, NULL, NULL)); \ - g_PLAPI = static_cast(this); \ - g_PLID = id; - -#define META_LOG g_SMAPI->LogMsg -#define META_REGCMD(name) g_SMAPI->RegisterConCmdBase(g_PLAPI, name##_command) -#define META_REGCVAR(var) g_SMAPI->RegisterConCmdBase(g_PLAPI, var) -#define META_UNREGCMD(name) g_SMAPI->UnregisterConCmdBase(g_PLAPI, name##_command) -#define META_UNREGCVAR(var) g_SMAPI->UnregisterConCmdBase(g_PLAPI, var) -#define META_CONPRINT g_SMAPI->ConPrint -#define META_CONPRINTF g_SMAPI->ConPrintf - -/* Probably should use this up above someday */ -#define CONCMD_VARNAME(name) name##_command - -#if !defined SMM_API -#if defined __WIN32__ || defined _WIN32 || defined WIN32 - #define SMM_API extern "C" __declspec(dllexport) -#elif defined __GNUC__ - #if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1) - #define SMM_API extern "C" __attribute__ ((visibility("default"))) - #else - #define SMM_API extern "C" - #endif -#endif -#endif //!defined SMM_API - -/** - * @brief Macro for automatically getting a current or newer Valve interface. - * - * @param v_factory Factory method to use from ISmmAPI (such as engineFactory). - * @param v_var Variable name to store into. - * @param v_type Interface type (do not include the pointer/asterisk). - * @param v_name Interface name. - */ -#define GET_V_IFACE_CURRENT(v_factory, v_var, v_type, v_name) \ - v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name); \ - if (!v_var) \ - { \ - if (error && maxlen) \ - { \ - snprintf(error, maxlen, "Could not find interface: %s", v_name); \ - } \ - return false; \ - } - - /** - * @brief Same as GET_V_IFACE, except searches for any. - * - * @param v_factory Factory method to use from ISmmAPI (such as engineFactory). - * @param v_var Variable name to store into. - * @param v_type Interface type (do not include the pointer/asterisk). - * @param v_name Interface name. - */ -#define GET_V_IFACE_ANY(v_factory, v_var, v_type, v_name) \ - v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name, 0); \ - if (!v_var) \ - { \ - if (error && maxlen) \ - { \ - snprintf(error, maxlen, "Could not find interface: %s", v_name); \ - } \ - return false; \ - } - -#endif //_INCLUDE_ISMM_PLUGIN_H diff --git a/sourcemm/LICENSE.txt b/sourcemm/LICENSE.txt deleted file mode 100644 index bf9f1fd..0000000 --- a/sourcemm/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -The software is Copyright (C) 2004-2007, Metamod:Source Development Team. - -Metamod:Source is distributed under the "zLib/libpng" license, which is reproduced -below: - ------------------------------------------------------------------------------ - -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. - ------------------------------------------------------------------------------ - -The zLib/libpng license has been approved by the "Open Source Initiative" -organization. diff --git a/sourcemm/Makefile b/sourcemm/Makefile deleted file mode 100644 index ff2cd6b..0000000 --- a/sourcemm/Makefile +++ /dev/null @@ -1,69 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../../hl2sdk -SMM_ROOT = .. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O2 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = server_i486.so - -HL2PUB = $(HL2SDK)/public -HL2LIB = $(HL2SDK)/linux_sdk - -OBJECTS = oslink.cpp util.cpp concommands.cpp CSmmAPI.cpp \ - sourcemm.cpp CPlugin.cpp sourcehook.cpp vsp_listener.cpp - -LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse -Wno-uninitialized - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - ln -sf $(SMM_ROOT)/sourcehook/sourcehook.cpp sourcehook.cpp - $(MAKE) sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true - -default: all - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/sourcemm/SourceMM.Doxyfile b/sourcemm/SourceMM.Doxyfile deleted file mode 100644 index b7f2df7..0000000 --- a/sourcemm/SourceMM.Doxyfile +++ /dev/null @@ -1,257 +0,0 @@ -# Doxyfile 1.4.2 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = SourceMM -PROJECT_NUMBER = 1.00 -OUTPUT_DIRECTORY = c:\temp\smm-dox -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = YES -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = "C:/Documents and Settings/dvander.WHITENIGHT/Desktop/code/" -STRIP_FROM_INC_PATH = -SHORT_NAMES = YES -JAVADOC_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -DISTRIBUTE_GROUP_DOC = NO -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 8 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = YES -EXTRACT_PRIVATE = YES -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = NO -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 38 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = YES -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = "C:/Documents and Settings/dvander.WHITENIGHT/Desktop/code/sourcemm" -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = test \ - sample_mm -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = NO -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -VERBATIM_HEADERS = NO -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = NO -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = NO -USE_PDFLATEX = NO -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = NO -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 1000 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = YES diff --git a/sourcemm/changelog.txt b/sourcemm/changelog.txt deleted file mode 100644 index 6f80841..0000000 --- a/sourcemm/changelog.txt +++ /dev/null @@ -1,133 +0,0 @@ -2008/01/23 1.4.3: - - Metamod:Source can now be loaded via a .vdf instead of gameinfo.txt. - - Added new plugin loading mechanism via .vdf files in the metamod folder. - - Changed "meta list" output to look similar to Metamod:Source 1.6. - - Plugins which need a VSP pointer can now receive it on late load. - - Fixed a small memory leak when using recalls (RETURN_META_NEWPARAMS). - - Fixed a rare memory corruption bug in the CVector class. - -2007/06/26 1.4.2: - - Fixed a bug where unloading all plugins could crash if one plugin had child plugins. - -2007/05/16 1.4.1: - - The client version of the "meta" command should now work with games using the latest - Source beta (srcds0407). - - Fixed amb233 (VSP listener didn't work with Steam dedicated version). - - Fixed amb277 (failed to get user message list in Kreedz Climbing). - -2007/04/05 1.4.0: - - Added API functions for retrieving User Message info without potentially crashing. - - Added API functions for letting SourceMM plugins use Valve Server Plugin callbacks. - - Added plugin status to client version of "meta list" command. Previously, it did not - differentiate between running and paused plugins. - - An experimental automatic gameinfo.txt fixer is now available. - - Changed version numbering to include the build number (SVN revision). - - Fixed amb93 (improved mod path detection). - - Fixed various rare string inconsistencies. - -2006/11/29 1.3d: - - Updated Metamod:Source to recognize the latest Source Engine version (ServerGameDLL006) - -2006/09/06 1.3a: - - Fixed a building issue on Linux which caused unresolved symbol errors when trying to - load Metamod:Source on a game using an older set of engine libraries. This fix should - now allow Metamod:Source to run with The Ship on Linux. - -2006/08/16 1.3: - - Added SourceHook support for functions that return references. - - Added some extra information to the "meta game" command: Description and Interface. For - example, CS:S would display "Counter-Strike: Source" and "ServerGameDLL004." - - Added some extra functionality to ISmmPluginManager. - - Added compiling support for MSVC 8.0 (Visual Studio 2005) and GCC 4.x - - Added another API helper function for formatting and searching for interfaces. - - Updated project files and source tree to use the latest HL2SDK. - - Updated the sample plugins to be a bit cleaner and use newer API. - - Fixed bug where Metamod:Source could load the wrong GameDLL and/or load more than one - GameDLL. This issue occured in HL2 CTF, SourceForts, or any other mod that relied on - files from another mod directory. - - Fixed bug where ISmmAPI::MetaFactory() would return the wrong interface when trying to - retrieve ISmmPluginManager. - - Fixed bug where returning false in Load() after adding a Metamod event listener or - hooking a function could cause a crash instead of rejecting the plugin. - - Fixed bug where trying to load Metamod:Source a second time as a SourceMM or Valve - server plugin could cause a crash. - - Fixed a bug in FormatIface() that caused InterfaceSearch() to infinite loop. - -2006/06/14 1.2.3: - - Added SourceHook API for manual recalls: RETURN_META_(VALUE_)MNEWPARAMS - - Added support for ServerGameDLL005 (latest HL2DM update) - -2006/05/25 1.2.2: - - Added the ability to "alias" plugin names in metaplugins.ini. - - Added "meta alias" command. - - Added SourceHook API for manual callclasses. - - Added support for the latest Source engine (ServerGameDLL005). - - Added API for printing text in a client's console with ClientConPrintf. This does the - same thing as IVEngineServer::ClientPrintf except that it allows string formatting. - - Added client version of "meta" command in order to allow clients to view version - information and a list of loaded plugins. - - Fixed a bug causing old mods on newer engines to fail loading. - - Fixed issues with SourceHook's SH_CALL and reference parameters. - - Fixed a bug where the mm_pluginsfile cvar was being ignored. - - Fixed a memory leak when using ISmmAPI::InterfaceSearch. - -2006/02/15 1.2.1: - - Fixed bug where returning newparams in a post hook would cause infinite recursion. - - Fixed bug where "meta load" could load the same plugin multiple times. - - Fixed bug where unloading a plugin could crash internal hook states. - - Fixed bug where unhooking a single hook would clear the hook chain. - -2006/01/07 1.2: - - Added SourceHook API for modifying parameters in the hook chain. - - Added SourceHook API for declaring and hooking manual vtable hooks. - - Added better API for querying an interface factory. - - Added API for formatting an OS-independent path. - - Added Listen Server Launcher to the graphical installer. - - Fixed bug where failed plugins could crash the plugin list. - - NOTE: SourceHook changes may require plugins to be recompiled against - the new API. - -2005/12/06 1.1.2: - - Added interface overriding/sharing examples to sample plugins. - - Added API to help guessing at Valve interface versions. - - Fixed various memory leaks. - - Fixed memory corruption bug on vector copying. - - Fixed other various template bugs. - -2005/10/21 1.1.1: - - Fixed a bug where AllPluginsLoaded() was not called after DLLInit(). - -2005/10/21 1.1: - - Rewrote GameDLL loading code to be API version generic. - As such, SourceMM will now easily support new API releases without - an SDK release, such as the case with Day of Defeat:Source - - Added more flexibility to plugin control by supplying an event system. - - Removed dependency on libstdc++.so by supplying a small template library. - - SourceHook internal API is now interface-based, meaning that future - updates to the API will not break older plugins. This update, however, - breaks older plugins. - - SourceHook is now re-entrant. - - Added a basic automated installer (by Basic-Master). - - Fixed a bug where games with changing game names would not work. - - Fixed various bugs, including a cvarlist corruption bug on unloading plugins. - -2005/07/07 1.00-RC2: - - Added API for dealing with ConCommandBase registration (cvars/concmds). - This is to fix the fact that Valve API provides no way to unlist a cvar/cmd. - - Added two new commands - "meta cmds" and "meta cvars". - - Added API calls for correctly printing to the console such that rcon - will also receive messages that a plugin prints. - This problem was mentioned on hlcoders and Valve offered no reply. - - Added event hooking and cvar samples to sample_mm. - - Added new cvar, mm_pluginsfile, which defaults to "addons/metamod/metaplugins.ini". - - Fixed a bug where multiple vtable patches on the same hook were not re-patched when removed. - This caused a crash when two hooks were declared on one function, the first was removed, and - the original function was then called. - - Fixed "meta clear" not unloading all plugins. - - Fixed Metamod:Source loading plugins with a higher current API version. - - Fixed whitespace being parsed in metaplugins.ini. - - Fixed bug where SourceHook tried to patch already destroyed/unavailable memory. - - Bumped Plugin API version to 6. - -2005/05/06 1.00-RC1: - - Initial release. diff --git a/sourcemm/concommands.cpp b/sourcemm/concommands.cpp deleted file mode 100644 index 6ef18a1..0000000 --- a/sourcemm/concommands.cpp +++ /dev/null @@ -1,802 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include -#include "CSmmAPI.h" -#include "concommands.h" -#include "CPlugin.h" -#include "sh_string.h" -#include "sh_list.h" -#include "vsp_listener.h" - -/** - * @brief Console Command Implementations - * @file concommands.cpp - */ - -CAlwaysRegisterableCommand g_EternalCommand; -SMConVarAccessor g_SMConVarAccessor; - -bool SMConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) -{ - // Add the FCVAR_GAMEDLL flag - // => No crash on exit! - // UPDATE: Do _not_ add the FCVAR_GAMEDLL flag here, as it - // causes the command to be unusable on listenservers until you load a map - // We will set the FCVAR_GAMEDLL flag on all commands we have registered once we are being unloaded - //pCommand->AddFlags(FCVAR_GAMEDLL); - m_RegisteredCommands.push_back(pCommand); - - pCommand->SetNext( NULL ); - g_Engine.icvar->RegisterConCommandBase(pCommand); - - return true; -} - -bool SMConVarAccessor::Register(ConCommandBase *pCommand) -{ - //simple, don't mark as part of sourcemm! - pCommand->SetNext( NULL ); - g_Engine.icvar->RegisterConCommandBase(pCommand); - - return true; -} - -void SMConVarAccessor::MarkCommandsAsGameDLL() -{ - for (SourceHook::List::iterator iter = m_RegisteredCommands.begin(); - iter != m_RegisteredCommands.end(); ++iter) - { - (*iter)->AddFlags(FCVAR_GAMEDLL); - } -} - -void SMConVarAccessor::Unregister(ConCommandBase *pCommand) -{ - ICvar *cv = g_Engine.icvar; - ConCommandBase *ptr = cv->GetCommands(); - - if (ptr == pCommand) - { - //first in list - g_EternalCommand.BringToFront(); - g_EternalCommand.SetNext(const_cast(pCommand->GetNext())); - } else { - //find us and unregister us - ConCommandBase *pPrev = NULL; - while (ptr) - { - if (ptr == pCommand) - break; - pPrev = ptr; - ptr = const_cast(ptr->GetNext()); - } - if (pPrev && ptr == pCommand) - { - pPrev->SetNext(const_cast(pCommand->GetNext())); - } - } -} - -void SMConVarAccessor::UnregisterGameDLLCommands() -{ - ConCommandBase *begin = g_Engine.icvar->GetCommands(); - ConCommandBase *iter = begin; - ConCommandBase *prev = NULL; - while (iter) - { - // watch out for the ETERNAL COMMAND! - if (iter != &g_EternalCommand && iter->IsBitSet(FCVAR_GAMEDLL)) - { - // Remove it! - if (iter == begin) - { - g_EternalCommand.BringToFront(); - iter = const_cast(iter->GetNext()); - g_EternalCommand.SetNext(iter); - prev = &g_EternalCommand; - continue; - } - else - { - iter = const_cast(iter->GetNext()); - prev->SetNext(iter); - continue; - } - } - prev = iter; - iter = const_cast(iter->GetNext()); - } -} - -ConVar metamod_version("metamod_version", SOURCEMM_VERSION, FCVAR_REPLICATED | FCVAR_SPONLY | FCVAR_NOTIFY, "Metamod:Source Version"); -#if defined WIN32 || defined _WIN32 -ConVar mm_pluginsfile("mm_pluginsfile", "addons\\metamod\\metaplugins.ini", FCVAR_SPONLY, "Metamod:Source Plugins File"); -ConVar mm_basedir("mm_basedir", "addons\\metamod", FCVAR_SPONLY, "Metamod:Source base folder"); -#else -ConVar mm_pluginsfile("mm_pluginsfile", "addons/metamod/metaplugins.ini", FCVAR_SPONLY, "Metamod:Source Plugins File"); -ConVar mm_basedir("mm_basedir", "addons/metamod", FCVAR_SPONLY, "Metamod:Source base folder"); -#endif - -CON_COMMAND(meta, "Metamod:Source Menu") -{ - IVEngineServer *e = g_Engine.engine; - - int args = e->Cmd_Argc(); - - if (g_VspListener.IsRootLoadMethod() && !g_bLevelChanged) - { - CONMSG("WARNING: You must change the map to activate Metamod:Source.\n"); - return; - } - - if (args >= 2) - { - const char *command = e->Cmd_Argv(1); - if (strcmp(command, "credits") == 0) - { - CONMSG("Metamod:Source was developed by:\n"); - CONMSG(" SourceHook: Pavol \"PM OnoTo\" Marko\n"); - CONMSG(" GameDLL/Plugins: David \"BAILOPAN\" Anderson\n"); - CONMSG(" GameDLL: Scott \"Damaged Soul\" Ehlert\n"); - CONMSG("For more information, see the official website\n"); - CONMSG("http://www.metamodsource.net/\n"); - - return; - } else if (strcmp(command, "version") == 0) { - CONMSG("Metamod:Source version %s\n", SOURCEMM_VERSION); - if (g_VspListener.IsRootLoadMethod()) - { - CONMSG("Loaded As: Valve Server Plugin\n"); - } - else - { - CONMSG("Loaded As: GameDLL (gameinfo.txt)\n"); - } - CONMSG("Compiled on: %s\n", SOURCEMM_DATE); - CONMSG("Plugin interface version: %d:%d\n", PLAPI_VERSION, PLAPI_MIN_VERSION); - CONMSG("SourceHook version: %d:%d\n", g_SourceHook.GetIfaceVersion(), g_SourceHook.GetImplVersion()); - CONMSG("http://www.metamodsource.net/\n"); - - return; - } else if (strcmp(command, "game") == 0) { - CONMSG("GameDLL Information\n"); - CONMSG(" Description: %s\n", g_GameDll.pGameDLL->GetGameDescription()); - CONMSG(" Mod Path: %s\n", g_ModPath.c_str()); - CONMSG(" DLL Path: %s\n", g_BinPath.c_str()); - CONMSG(" Interface: ServerGameDLL%03d\n", g_GameDllVersion); - - // Display user messages - if (g_SmmAPI.MsgCacheSuccessful()) - { - const char *msgname; - int msgsize; - int msgcount = g_SmmAPI.GetUserMessageCount(); - - if (msgcount > 0) - { - CONMSG(" User Messages: %-32.31s %-5s %-5s\n", "Name", "Index", "Size"); - - for (int i = 0; i < msgcount; i++) - { - msgname = g_SmmAPI.GetUserMessage(i, &msgsize); - - CONMSG(" %-32.31s %-5d %-5d\n", msgname, i, msgsize); - } - - CONMSG(" %d user message%s in total\n", msgcount, (msgcount > 1) ? "s" : ""); - } else { - CONMSG(" User Messages: None\n"); - } - } else { - CONMSG(" User Messages: Failed to get list of user messages\n"); - } - - return; - } else if (strcmp(command, "refresh") == 0) { - char full_path[255]; - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), GetPluginsFile()); - - LoadPluginsFromFile(full_path); - - return; - } else if (strcmp(command, "list") == 0) { - size_t len; - PluginIter i; - char buffer[255]; - ISmmPlugin *plapi; - const char *plname; - SourceMM::CPluginManager::CPlugin *pl; - unsigned int plnum = g_PluginMngr.GetPluginCount(); - -#define IS_STR_FILLED(var) (var != NULL && var[0] != '\0') - - if (!plnum) - { - CONMSG("No plugins loaded.\n"); - return; - } - else - { - CONMSG("Listing %d plugin%s:\n", plnum, (plnum > 1) ? "s" : ""); - } - - for (i=g_PluginMngr._begin(); i!=g_PluginMngr._end(); i++) - { - pl = (*i); - if (!pl) - { - break; - } - - len = 0; - - if (pl->m_Status != Pl_Running) - { - len += UTIL_Format(buffer, sizeof(buffer), " [%02d] <%s>", pl->m_Id, g_PluginMngr.GetStatusText(pl)); - } - else - { - len += UTIL_Format(buffer, sizeof(buffer), " [%02d]", pl->m_Id); - } - - if ((plapi = pl->m_API)) - { - plname = IS_STR_FILLED(plapi->GetName()) ? plapi->GetName() : pl->m_File.c_str(); - len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " %s", plname); - - if (IS_STR_FILLED(plapi->GetVersion())) - { - len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " (%s)", plapi->GetVersion()); - } - if (IS_STR_FILLED(plapi->GetAuthor())) - { - UTIL_Format(&buffer[len], sizeof(buffer)-len, " by %s", plapi->GetAuthor()); - } - } - - CONMSG("%s\n", buffer); - } - - return; - } else if (strcmp(command, "cmds") == 0) { - if (args >= 3) - { - int id = atoi(e->Cmd_Argv(2)); - SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); - - if (!pl) - { - CONMSG("Plugin %d not found.\n", id); - return; - } - - if (!pl->m_API) - { - CONMSG("Plugin %d is not loaded.\n", id); - } else { - CONMSG("Console commands for %s:\n", pl->m_API->GetName()); - SourceHook::List::iterator ci; - size_t count = 0; - - for (ci=pl->m_Cmds.begin(); ci!=pl->m_Cmds.end(); ci++) - { - count++; - CONMSG(" [%5d] %-s\n", count, (*ci)->GetName()); - } - } - } else { - CONMSG("Usage: meta cmds \n"); - } - - return; - } else if (strcmp(command, "cvars") == 0) { - if (args >= 3) - { - int id = atoi(e->Cmd_Argv(2)); - SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); - - if (!pl) - { - CONMSG("Plugin %d not found.\n", id); - return; - } - - if (!pl->m_API) - { - CONMSG("Plugin %d is not loaded.\n", id); - } else { - CONMSG("Registered cvars for %s:\n", pl->m_API->GetName()); - SourceHook::List::iterator ci; - size_t count = 0; - - for (ci=pl->m_Cvars.begin(); ci!=pl->m_Cvars.end(); ci++) - { - count++; - CONMSG(" [%5d] %-s\n", count, (*ci)->GetName()); - } - } - } else { - CONMSG("Usage: meta cvars \n"); - } - - return; - } else if (strcmp(command, "info") == 0) { - if (args >= 3) - { - int id = atoi(e->Cmd_Argv(2)); - SourceMM::CPluginManager::CPlugin *pl = g_PluginMngr.FindById(id); - if (!pl) - { - CONMSG("Plugin %d not found.\n", id); - return; - } - - if (!pl->m_API) - { - CONMSG("Plugin %d is not loaded.\n", id); - } else { - if (pl->m_Status == Pl_Paused) - { - CONMSG("Plugin %d is paused.\n", id); - } else if (pl->m_Status == Pl_Running) { - char run_msg[255]; - bool run = false; - if (pl->m_API && pl->m_API->QueryRunning(run_msg, sizeof(run_msg)-1)) - run = true; - if (run) - { - CONMSG("Plugin %d is running.\n", id); - } else { - CONMSG("Plugin %d is stopped: %s\n", id, run_msg); - } - } - CONMSG(" Name: \"%s\" by %s\n", pl->m_API->GetName(), pl->m_API->GetAuthor()); - CONMSG(" Version: %s\n", pl->m_API->GetVersion()); - CONMSG(" Description: %s\n", pl->m_API->GetDescription()); - CONMSG(" License: %s\n", pl->m_API->GetLicense()); - CONMSG(" URL: %s\n", pl->m_API->GetURL()); - CONMSG(" Details: API %03d, Date: %s\n", pl->m_API->GetApiVersion(), pl->m_API->GetDate()); - } - CONMSG("File: %s\n\n", pl->m_File.c_str()); - - return; - } else { - CONMSG("Usage: meta info \n"); - - return; - } - } else if (strcmp(command, "pause") == 0) { - if (args >= 3) - { - int id = atoi(e->Cmd_Argv(2)); - - char error[255]; - - if (!g_PluginMngr.Pause(id, error, sizeof(error))) - { - CONMSG("Pause failed: %s\n", error); - return; - } - - CONMSG("Plugin %d has been paused.\n", id); - - return; - } else { - CONMSG("Usage: meta pause \n"); - - return; - } - } else if (strcmp(command, "unpause") == 0) { - if (args >= 3) - { - int id = atoi(e->Cmd_Argv(2)); - char error[255]; - - if (!g_PluginMngr.Unpause(id, error, sizeof(error))) - { - CONMSG("Unpause failed: %s\n", error); - return; - } - - CONMSG("Plugin %d has been unpaused.\n", id); - - return; - } else { - CONMSG("Usage: meta unpause \n"); - - return; - } - } else if (strcmp(command, "load") == 0) { - if (args >= 3) - { - const char *file = e->Cmd_Argv(2); - char full_path[255]; - - const char *alias = g_PluginMngr.LookupAlias(file); - if (alias) - { - file = alias; - } - - if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0) - { - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s", file); - } else { - const char *ext = UTIL_GetExtension(file); -#if defined WIN32 || defined _WIN32 - ext = ext ? "" : ".dll"; -#else - ext = ext ? "" : "_i486.so"; -#endif - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); - } - - char error[255]={0}; - bool already; - SourceMM::CPluginManager::CPlugin *pl; - - PluginId id = g_PluginMngr.Load(full_path, Pl_Console, already, error, sizeof(error)); - pl = g_PluginMngr.FindById(id); - if (!pl || id < Pl_MinId || (pl->m_Status < Pl_Paused)) - { - CONMSG("Failed to load plugin %s (%s).\n", file, error); - return; - } - - if (!already) - { - CONMSG("Plugin \"%s\" loaded with id %d.\n", pl->m_API->GetName(), pl->m_Id); - } else { - CONMSG("Plugin \"%s\" is already loaded as %d.\n", pl->m_API->GetName(), pl->m_Id); - } - - return; - } else { - CONMSG("Usage: meta load \n"); - - return; - } - } else if ( (strcmp(command, "alias") == 0) || - (strcmp(command, "aliases") == 0) ) { - if (args >= 4) - { - const char *alias = e->Cmd_Argv(2); - const char *value = e->Cmd_Argv(3); - - g_PluginMngr.SetAlias(alias, value); - if (value[0] == '\0') - { - CONMSG("Deleted alias: %s.\n", alias); - } else { - CONMSG("Set alias \"%s\" to: %s\n", alias, value); - } - } else if (args >= 3) { - const char *alias = e->Cmd_Argv(2); - const char *value = g_PluginMngr.LookupAlias(alias); - if (value) - { - CONMSG("Alias \"%s\" is set to: %s\n", alias, value); - } else { - CONMSG("Alias \"%s\" was not found.\n", alias); - } - } else { - SourceHook::List::iterator iter, end; - SourceMM::CNameAlias *p; - - iter = g_PluginMngr._alias_begin(); - end = g_PluginMngr._alias_end(); - size_t total = 0; - if (iter != end) - { - CONMSG("%-10.9s %s\n", "Alias", "File"); - CONMSG(" --- \n"); - for (; iter!=end; iter++) - { - p = (*iter); - CONMSG("%-10.9s %s\n", p->alias.c_str(), p->value.c_str()); - total++; - } - CONMSG(" --- \n"); - CONMSG("%d aliases total.\n", total); - } else { - CONMSG("No aliases found.\n"); - } - } - return; - } else if (strcmp(command, "unload") == 0) { - if (args >= 3) - { - const char *file = e->Cmd_Argv(2); - int id = atoi(file); - char error[255]={0}; - - if (id == 0 && isalpha(file[0])) - { - char full_path[255]; - const char *alias = g_PluginMngr.LookupAlias(file); - - if (alias) - { - file = alias; - } - - /* first check if it's a known filename */ - if (file[0] == '/' || strcmp(&(file[1]), ":\\") == 0) - { - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s", file); - } else { - const char *ext = UTIL_GetExtension(file); -#if defined WIN32 || defined _WIN32 - ext = ext ? "" : ".dll"; -#else - ext = ext ? "" : "_i486.so"; -#endif - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); - } - - SourceHook::List::iterator iter, end; - SourceMM::CPluginManager::CPlugin *pl; - iter = g_PluginMngr._begin(); - end = g_PluginMngr._end(); - for (; iter!=end; iter++) - { - pl = (*iter); - if (strcmp(pl->m_File.c_str(), full_path) == 0) - { - id = pl->m_Id; - break; - } - } - if (id == 0) - { - CONMSG("Plugin \"%s\" not found.\n", full_path); - return; - } - } - - if (!g_PluginMngr.Unload(id, false, error, sizeof(error))) - { - CONMSG("Unload failed: %s\n", error); - return; - } - - CONMSG("Plugin %d unloaded.\n", id); - } else { - CONMSG("Usage: meta unload \n"); - } - return; - } else if (strcmp(command, "force_unload") == 0) { - if (args >= 3) - { - int id = atoi(e->Cmd_Argv(2)); - char error[255]={0}; - - if (!g_PluginMngr.Unload(id, false, error, sizeof(error))) - { - CONMSG("Force unload failed: %s\n", error); - return; - } - - CONMSG("Plugin %d force unloaded.\n", id); - - return; - } else { - CONMSG("Usage: meta force_unload \n"); - - return; - } - } else if (strcmp(command, "clear") == 0) { - if (!g_PluginMngr.UnloadAll()) - { - CONMSG("One or more plugins resisted removal (cleaned anyway).\n"); - return; - } - - CONMSG("All plugins unloaded.\n"); - - return; - } else if (strcmp(command, "retry") == 0) { - if (args >= 3) - { - int id = atoi(e->Cmd_Argv(2)); - char error[255]; - - if (!g_PluginMngr.Retry(id, error, sizeof(error))) - { - CONMSG("Error reloading plugin: %s\n", error); - return; - } - - CONMSG("Plugin %d successfully reloaded.\n", id); - - return; - } else { - CONMSG("Usage: meta retry \n"); - - return; - } - } - } - - CONMSG("Metamod:Source Menu\n"); - CONMSG("usage: meta [arguments]\n"); - CONMSG(" alias - List or set an alias\n"); - CONMSG(" clear - Unload all plugins forcefully\n"); - CONMSG(" cmds - Show plugin commands\n"); - CONMSG(" cvars - Show plugin cvars\n"); - CONMSG(" credits - About Metamod:Source\n"); - CONMSG(" force_unload - Forcefully unload a plugin\n"); - CONMSG(" game - Information about GameDLL\n"); - CONMSG(" info - Information about a plugin\n"); - CONMSG(" list - List plugins\n"); - CONMSG(" load - Load a plugin\n"); - CONMSG(" pause - Pause a running plugin\n"); - CONMSG(" refresh - Reparse plugins file\n"); - CONMSG(" retry - Attempt to reload a plugin\n"); - CONMSG(" unload - Unload a loaded plugin\n"); - CONMSG(" unpause - Unpause a paused plugin\n"); - CONMSG(" version - Version information\n"); -} - -CAlwaysRegisterableCommand::CAlwaysRegisterableCommand() -{ - Create("", NULL, FCVAR_UNREGISTERED|FCVAR_GAMEDLL); - m_pICvar = NULL; -} - -bool CAlwaysRegisterableCommand::IsRegistered( void ) const -{ - return false; -} - -void CAlwaysRegisterableCommand::BringToFront() -{ - if (!m_pICvar) - m_pICvar = g_Engine.icvar; - - // First, let's try to find us! - ConCommandBase *pPtr = m_pICvar->GetCommands(); - - if (pPtr == this) - { - // We are already at the beginning; Nothing to do - return; - } - - while (pPtr) - { - if (pPtr == this && pPtr->IsCommand() && stricmp(GetName(), pPtr->GetName()) == 0) - break; - ConCommandBase *pPrev = NULL; - while (pPtr) - { - if (pPtr == this) - break; - pPrev = pPtr; - pPtr = const_cast(pPtr->GetNext()); - } - if (pPrev && pPtr == this) - { - pPrev->SetNext(m_pNext); // Remove us from the list - } - // Now, register us - SetNext(NULL); - m_pICvar->RegisterConCommandBase(this); - } -} - -void ClientCommand_handler(edict_t *client) -{ - IVEngineServer *e = g_Engine.engine; - const char *cmd = e->Cmd_Argv(0); - - if (strcmp(cmd, "meta") == 0) - { - int args = e->Cmd_Argc(); - if (args == 2) - { - const char *subcmd = e->Cmd_Argv(1); - - if (strcmp(subcmd, "credits") == 0) - { - CLIENT_CONMSG(client, "Metamod:Source was developed by:\n"); - CLIENT_CONMSG(client, " SourceHook: Pavol \"PM OnoTo\" Marko\n"); - CLIENT_CONMSG(client, " Core: David \"BAILOPAN\" Anderson\n"); - CLIENT_CONMSG(client, " Core: Scott \"Damaged Soul\" Ehlert\n"); - CLIENT_CONMSG(client, "For more information, see the official website\n"); - CLIENT_CONMSG(client, "http://www.metamodsource.net/\n"); - - RETURN_META(MRES_SUPERCEDE); - } else if(strcmp(subcmd, "version") == 0) { - CLIENT_CONMSG(client, "Metamod:Source version %s\n", SOURCEMM_VERSION); - CLIENT_CONMSG(client, "Compiled on: %s\n", SOURCEMM_DATE); - CLIENT_CONMSG(client, "Plugin interface version: %d:%d\n", PLAPI_VERSION, PLAPI_MIN_VERSION); - CLIENT_CONMSG(client, "SourceHook version: %d:%d\n", g_SourceHook.GetIfaceVersion(), g_SourceHook.GetImplVersion()); - CLIENT_CONMSG(client, "http://www.metamodsource.net/\n"); - - RETURN_META(MRES_SUPERCEDE); - } else if(strcmp(subcmd, "list") == 0) { - SourceMM::CPluginManager::CPlugin *pl; - ISmmPlugin *plapi; - const char *plname; - PluginIter i; - char buffer[256]; - int len = 0; - int plnum = 0; - - for (i = g_PluginMngr._begin(); i != g_PluginMngr._end(); i++, len=0) - { - pl = (*i); - if (pl && pl->m_Status == Pl_Running) - { - plapi = pl->m_API; - if (!plapi || !plapi->QueryRunning(NULL, 0)) - { - continue; - } - plnum++; - - len += UTIL_Format(buffer, sizeof(buffer), " [%02d]", plnum); - - plname = IS_STR_FILLED(plapi->GetName()) ? plapi->GetName() : pl->m_File.c_str(); - len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " %s", plname); - - if (IS_STR_FILLED(plapi->GetVersion())) - { - len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " (%s)", plapi->GetVersion()); - } - if (IS_STR_FILLED(plapi->GetAuthor())) - { - UTIL_Format(&buffer[len], sizeof(buffer)-len, " by %s", plapi->GetAuthor()); - } - - CLIENT_CONMSG(client, "%s\n", buffer); - } - } - - if (!plnum) - { - CLIENT_CONMSG(client, "No active plugins loaded.\n"); - } - - RETURN_META(MRES_SUPERCEDE); - } - } - - CLIENT_CONMSG(client, "Metamod:Source Menu\n"); - CLIENT_CONMSG(client, "usage: meta \n"); - CLIENT_CONMSG(client, " credits - About Metamod:Source\n"); - CLIENT_CONMSG(client, " list - List plugins\n"); - CLIENT_CONMSG(client, " version - Version information\n"); - - RETURN_META(MRES_SUPERCEDE); - } - - RETURN_META(MRES_IGNORED); -} - -void SMConVarAccessor::UnloadMetamodCommands() -{ - Unregister(&metamod_version); - Unregister(&mm_pluginsfile); - Unregister(&mm_basedir); - Unregister(&meta_command); -} - -const char *GetPluginsFile() -{ - return mm_pluginsfile.GetString(); -} - -const char *GetMetamodBaseDir() -{ - return mm_basedir.GetString(); -} diff --git a/sourcemm/concommands.h b/sourcemm/concommands.h deleted file mode 100644 index 6256186..0000000 --- a/sourcemm/concommands.h +++ /dev/null @@ -1,55 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_CONCOMMANDS_H -#define _INCLUDE_CONCOMMANDS_H - -/** - * @brief Header for console commands - * @file concommands.h - */ - -#include -#include -#include "sourcemm.h" -#include "convar_smm.h" -#include "sh_list.h" - -class SMConVarAccessor : public IConCommandBaseAccessor -{ - SourceHook::List m_RegisteredCommands; -public: - virtual bool RegisterConCommandBase(ConCommandBase *pCommand); - bool Register(ConCommandBase *pCommand); - void MarkCommandsAsGameDLL(); - void Unregister(ConCommandBase *pCommand); - void UnregisterGameDLLCommands(); - void UnloadMetamodCommands(); -}; - -class CAlwaysRegisterableCommand : public ConCommandBase -{ - ICvar *m_pICvar; -public: - CAlwaysRegisterableCommand(); - bool IsRegistered( void ) const; - // If already registered, removes us - // Then it registers us again - void BringToFront(); -}; - -void ClientCommand_handler(edict_t *client); - -const char *GetPluginsFile(); -const char *GetMetamodBaseDir(); - -extern SMConVarAccessor g_SMConVarAccessor; - -#endif //_INCLUDE_CONCOMMANDS_H diff --git a/sourcemm/convar_smm.h b/sourcemm/convar_smm.h deleted file mode 100644 index 26abce9..0000000 --- a/sourcemm/convar_smm.h +++ /dev/null @@ -1,523 +0,0 @@ -//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// -// -// Purpose: -// -// $Workfile: $ -// $Date$ -// -//----------------------------------------------------------------------------- -// $NoKeywords: $ -//=============================================================================// - -#ifndef CONVAR_H -#define CONVAR_H -#if _WIN32 -#pragma once -#endif - -#include "tier0/dbg.h" - -#ifdef _WIN32 -#define FORCEINLINE_CVAR FORCEINLINE -#elif _LINUX -#define FORCEINLINE_CVAR __inline__ FORCEINLINE -#else -#error "implement me" -#endif - -// The default, no flags at all -#define FCVAR_NONE 0 - -// Command to ConVars and ConCommands -// ConVar Systems -#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. -#define FCVAR_LAUNCHER (1<<1) // defined by launcher -#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL -#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL -#define FCVAR_MATERIAL_SYSTEM (1<<4) // Defined by the material system. -#define FCVAR_DATACACHE (1<<19) // Defined by the datacache system. -#define FCVAR_STUDIORENDER (1<<15) // Defined by the studiorender system. -#define FCVAR_FILESYSTEM (1<<21) // Defined by the file system. -#define FCVAR_PLUGIN (1<<18) // Defined by a 3rd party plugin. -#define FCVAR_TOOLSYSTEM (1<<20) // Defined by an IToolSystem library -#define FCVAR_SOUNDSYSTEM (1<<23) // Defined by the soundsystem library -#define FCVAR_INPUTSYSTEM (1<<25) // Defined by the inputsystem dll -#define FCVAR_NETWORKSYSTEM (1<<26) // Defined by the network system -// NOTE!! if you add a cvar system, add it here too!!!! -// the engine lacks a cvar flag, but needs it for xbox -// an engine cvar is thus a cvar not marked with any other system -#define FCVAR_NON_ENGINE ((FCVAR_LAUNCHER|FCVAR_GAMEDLL|FCVAR_CLIENTDLL|FCVAR_MATERIAL_SYSTEM|FCVAR_DATACACHE|FCVAR_STUDIORENDER|FCVAR_FILESYSTEM|FCVAR_PLUGIN|FCVAR_TOOLSYSTEM|FCVAR_SOUNDSYSTEM|FCVAR_INPUTSYSTEM|FCVAR_NETWORKSYSTEM)) - -// ConVar only -#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value -#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. -#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc -#define FCVAR_NOTIFY (1<<8) // notifies players when changed -#define FCVAR_USERINFO (1<<9) // changes the client's info string -#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats - -#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). -#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log -#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar - -// It's a ConVar that's shared between the client and the server. -// At signon, the values of all such ConVars are sent from the server to the client (skipped for local -// client, of course ) -// If a change is requested it must come from the console (i.e., no remote client changes) -// If a value is changed while a server is active, it's replicated to all connected clients -#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time -#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file -#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles - -#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server - -#define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox - - -// #define FCVAR_AVAILABLE (1<<27) -// #define FCVAR_AVAILABLE (1<<28) -// #define FCVAR_AVAILABLE (1<<29) -// #define FCVAR_AVAILABLE (1<<30) -// #define FCVAR_AVAILABLE (1<<31) - - -class ConVar; -class ConCommand; -class ConCommandBase; - -// Any executable that wants to use ConVars need to implement one of -// these to hook up access to console variables. -class IConCommandBaseAccessor -{ -public: - // Flags is a combination of FCVAR flags in cvar.h. - // hOut is filled in with a handle to the variable. - virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0; -}; - - -// You don't have to instantiate one of these, just call its -// OneTimeInit function when your executable is initializing. -class ConCommandBaseMgr -{ -public: - // Call this ONCE when the executable starts up. - static void OneTimeInit( IConCommandBaseAccessor *pAccessor ); -#ifdef _XBOX - static bool Fixup( ConCommandBase* pConCommandBase ); -#ifndef _RETAIL - static void PublishCommands( bool bForce ); -#endif -#endif -}; - -// Called when a ConVar changes value -typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString ); - -// Called when a ConCommand needs to execute -typedef void ( *FnCommandCallback )( void ); - -#define COMMAND_COMPLETION_MAXITEMS 64 -#define COMMAND_COMPLETION_ITEM_LENGTH 64 - -// Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings -typedef int ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); - -//----------------------------------------------------------------------------- -// Purpose: The base console invoked command/cvar interface -//----------------------------------------------------------------------------- -class ConCommandBase -{ - friend class ConCommandBaseMgr; - friend class CCvar; - friend class ConVar; - friend class ConCommand; - -public: - ConCommandBase( void ); - ConCommandBase( char const *pName, char const *pHelpString = 0, - int flags = 0 ); - - virtual ~ConCommandBase( void ); - - virtual bool IsCommand( void ) const; - - // Check flag - virtual bool IsBitSet( int flag ) const; - // Set flag - virtual void AddFlags( int flags ); - - // Return name of cvar - virtual char const *GetName( void ) const; - - // Return help text for cvar - virtual char const *GetHelpText( void ) const; - - // Deal with next pointer - const ConCommandBase *GetNext( void ) const; - void SetNext( ConCommandBase *next ); - - virtual bool IsRegistered( void ) const; - - // Global methods - static ConCommandBase const *GetCommands( void ); - static void AddToList( ConCommandBase *var ); - static void RemoveFlaggedCommands( int flag ); - static void RevertFlaggedCvars( int flag ); - static ConCommandBase const *FindCommand( char const *name ); - -protected: - virtual void Create( char const *pName, char const *pHelpString = 0, - int flags = 0 ); - - // Used internally by OneTimeInit to initialize. - virtual void Init(); - - // Internal copy routine ( uses new operator from correct module ) - char *CopyString( char const *from ); - - // Next ConVar in chain - ConCommandBase *m_pNext; - -private: - // Has the cvar been added to the global list? - bool m_bRegistered; - - // Static data - char const *m_pszName; - char const *m_pszHelpString; - - // ConVar flags - int m_nFlags; - -protected: - - // ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through - // all the console variables and registers them. - static ConCommandBase *s_pConCommandBases; - - // ConVars in this executable use this 'global' to access values. - static IConCommandBaseAccessor *s_pAccessor; -}; - -//----------------------------------------------------------------------------- -// Purpose: The console invoked command -//----------------------------------------------------------------------------- -class ConCommand : public ConCommandBase -{ -friend class ConCommandBaseMgr; -friend class CCvar; -#ifdef _STATIC_LINKED -friend class G_ConCommand; -friend class C_ConCommand; -friend class M_ConCommand; -friend class S_ConCommand; -friend class D_ConCommand; -#endif - -public: - typedef ConCommandBase BaseClass; - - ConCommand( void ); - ConCommand( char const *pName, FnCommandCallback callback, - char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); - - virtual ~ConCommand( void ); - - virtual bool IsCommand( void ) const; - - virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); - - virtual bool CanAutoComplete( void ); - - // Invoke the function - virtual void Dispatch( void ); -private: - virtual void Create( char const *pName, FnCommandCallback callback, - char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); - - // Call this function when executing the command - FnCommandCallback m_fnCommandCallback; - - FnCommandCompletionCallback m_fnCompletionCallback; - bool m_bHasCompletionCallback; -public: - FnCommandCallback GetCallback() { return m_fnCommandCallback; } -}; - -//----------------------------------------------------------------------------- -// Purpose: A console variable -//----------------------------------------------------------------------------- -class ConVar : public ConCommandBase -{ -friend class ConCommandBaseMgr; -friend class CCvar; -friend class CDefaultCvar; -#ifdef _STATIC_LINKED -friend class G_ConVar; -friend class C_ConVar; -friend class M_ConVar; -friend class S_ConVar; -friend class D_ConVar; -#endif - -public: - typedef ConCommandBase BaseClass; - - ConVar( char const *pName, char const *pDefaultValue, int flags = 0); - - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, FnChangeCallback callback ); - ConVar( char const *pName, char const *pDefaultValue, int flags, - char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, - FnChangeCallback callback ); - - virtual ~ConVar( void ); - - virtual bool IsBitSet( int flag ) const; - virtual char const* GetHelpText( void ) const; - virtual bool IsRegistered( void ) const; - virtual char const *GetName( void ) const; - virtual void AddFlags( int flags ); - virtual bool IsCommand( void ) const; - - // Install a change callback (there shouldn't already be one....) - void InstallChangeCallback( FnChangeCallback callback ); - - // Retrieve value - FORCEINLINE_CVAR float GetFloat( void ) const; - FORCEINLINE_CVAR int GetInt( void ) const; - FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } - FORCEINLINE_CVAR char const *GetString( void ) const; - - // Any function that allocates/frees memory needs to be virtual or else you'll have crashes - // from alloc/free across dll/exe boundaries. - - // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). - virtual void SetValue( char const *value ); - virtual void SetValue( float value ); - virtual void SetValue( int value ); - - // Reset to default value - void Revert( void ); - - // True if it has a min/max setting - bool GetMin( float& minVal ) const; - bool GetMax( float& maxVal ) const; - char const *GetDefault( void ) const; - - static void RevertAll( void ); -private: - // Called by CCvar when the value of a var is changing. - virtual void InternalSetValue(char const *value); - // For CVARs marked FCVAR_NEVER_AS_STRING - virtual void InternalSetFloatValue( float fNewValue ); - virtual void InternalSetIntValue( int nValue ); - - virtual bool ClampValue( float& value ); - virtual void ChangeStringValue( char const *tempVal ); - - virtual void Create( char const *pName, char const *pDefaultValue, int flags = 0, - char const *pHelpString = 0, bool bMin = false, float fMin = 0.0, - bool bMax = false, float fMax = false, FnChangeCallback callback = 0 ); - - // Used internally by OneTimeInit to initialize. - virtual void Init(); - -private: - - // This either points to "this" or it points to the original declaration of a ConVar. - // This allows ConVars to exist in separate modules, and they all use the first one to be declared. - // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). - ConVar *m_pParent; - - // Static data - char const *m_pszDefaultValue; - - // Value - // Dynamically allocated - char *m_pszString; - int m_StringLength; - - // Values - float m_fValue; - int m_nValue; - - // Min/Max values - bool m_bHasMin; - float m_fMinVal; - bool m_bHasMax; - float m_fMaxVal; - - // Call this function when ConVar changes - FnChangeCallback m_fnChangeCallback; -}; - - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as a float -// Output : float -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR float ConVar::GetFloat( void ) const -{ - return m_pParent->m_fValue; -} - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as an int -// Output : int -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR int ConVar::GetInt( void ) const -{ - return m_pParent->m_nValue; -} - - -//----------------------------------------------------------------------------- -// Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. -// Output : char const * -//----------------------------------------------------------------------------- -FORCEINLINE_CVAR char const *ConVar::GetString( void ) const -{ - if ( m_nFlags & FCVAR_NEVER_AS_STRING ) - { - return "FCVAR_NEVER_AS_STRING"; - } - - return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; -} - - -#ifdef _STATIC_LINKED -// identifies subsystem via piggybacking constructors with flags -class G_ConCommand : public ConCommand -{ -public: - G_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_GAMEDLL, completionFunc) {} -}; - -class C_ConCommand : public ConCommand -{ -public: - C_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_CLIENTDLL, completionFunc) {} -}; - -class M_ConCommand : public ConCommand -{ -public: - M_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_MATERIAL_SYSTEM, completionFunc) {} -}; - -class S_ConCommand : public ConCommand -{ -public: - S_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_STUDIORENDER, completionFunc) {} -}; - -class D_ConCommand : public ConCommand -{ -public: - D_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_DATACACHE, completionFunc) {} -}; - -typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString ); -typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString ); -typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString ); -typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString ); -typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString ); - -class G_ConVar : public ConVar -{ -public: - G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, (FnChangeCallback)callback ) {} - G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class C_ConVar : public ConVar -{ -public: - C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, (FnChangeCallback)callback ) {} - C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class M_ConVar : public ConVar -{ -public: - M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, (FnChangeCallback)callback ) {} - M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class S_ConVar : public ConVar -{ -public: - S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, (FnChangeCallback)callback ) {} - S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, S_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -class D_ConVar : public ConVar -{ -public: - D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, (FnChangeCallback)callback ) {} - D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, D_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} -}; - -// redirect these declarations to their specific subsystem -#ifdef GAME_DLL -#define ConCommand G_ConCommand -#define ConVar G_ConVar -#endif -#ifdef CLIENT_DLL -#define ConCommand C_ConCommand -#define ConVar C_ConVar -#endif -#ifdef MATERIALSYSTEM_DLL -#define ConCommand M_ConCommand -#define ConVar M_ConVar -#endif -#ifdef STUDIORENDER_DLL -#define ConCommand S_ConCommand -#define ConVar S_ConVar -#endif -#ifdef DATACACHE_DLL -#define ConCommand D_ConCommand -#define ConVar D_ConVar -#endif -#endif // _STATIC_LINKED - -//----------------------------------------------------------------------------- -// Purpose: Utility to quicky generate a simple console command -//----------------------------------------------------------------------------- -#define CON_COMMAND( name, description ) \ - static void name(); \ - static ConCommand name##_command( #name, name, description ); \ - static void name() - -//----------------------------------------------------------------------------- -// Purpose: Utility to quicky generate a simple console command -//----------------------------------------------------------------------------- -#define CON_COMMAND_F( name, description, flags ) \ - static void name(); \ - static ConCommand name##_command( #name, name, description, flags ); \ - static void name() - - -#endif // CONVAR_H diff --git a/sourcemm/msvc7/sourcemm.sln b/sourcemm/msvc7/sourcemm.sln deleted file mode 100644 index fa8eb75..0000000 --- a/sourcemm/msvc7/sourcemm.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug.ActiveCfg = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug.Build.0 = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release.ActiveCfg = Release|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/sourcemm/msvc7/sourcemm.vcproj b/sourcemm/msvc7/sourcemm.vcproj deleted file mode 100644 index 556c859..0000000 --- a/sourcemm/msvc7/sourcemm.vcproj +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/msvc8/sourcemm.sln b/sourcemm/msvc8/sourcemm.sln deleted file mode 100644 index b338452..0000000 --- a/sourcemm/msvc8/sourcemm.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemm", "sourcemm.vcproj", "{F7D47743-73B3-49B5-9D76-2333C5DFD565}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.ActiveCfg = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Debug|Win32.Build.0 = Debug|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.ActiveCfg = Release|Win32 - {F7D47743-73B3-49B5-9D76-2333C5DFD565}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/sourcemm/msvc8/sourcemm.vcproj b/sourcemm/msvc8/sourcemm.vcproj deleted file mode 100644 index 6430d55..0000000 --- a/sourcemm/msvc8/sourcemm.vcproj +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/oslink.cpp b/sourcemm/oslink.cpp deleted file mode 100644 index 9c8ec16..0000000 --- a/sourcemm/oslink.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -/** - * @brief Implements OS-dependant functions from oslink.h - * @file oslink.cpp - */ - -#include "oslink.h" -#ifdef __linux -#include -#endif -#include - -#if defined __WIN32__ || defined _WIN32 || defined WIN32 -const char *dlerror() -{ - static char buf[1024]; - DWORD num; - - num = GetLastError(); - - if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - num, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - buf, - sizeof(buf), - NULL) - == 0) - { - _snprintf(buf, sizeof(buf), "unknown error %x", num); - } - - return buf; -} -#endif - -#if defined __linux__ -int GetLastError() -{ - return errno; -} - -extern "C" void __cxa_guard_acquire(void) -{ -} - -extern "C" void __cxa_guard_release(void) -{ -} -#endif - -bool GetFileOfAddress(void *pAddr, char *buffer, size_t maxlength) -{ -#if defined WIN32 || defined _WIN32 - MEMORY_BASIC_INFORMATION mem; - if (!VirtualQuery(pAddr, &mem, sizeof(mem))) - return false; - if (mem.AllocationBase == NULL) - return false; - HMODULE dll = (HMODULE)mem.AllocationBase; - GetModuleFileName(dll, (LPTSTR)buffer, maxlength); -#elif defined __linux__ - Dl_info info; - if (!dladdr(pAddr, &info)) - return false; - if (!info.dli_fbase || !info.dli_fname) - return false; - const char *dllpath = info.dli_fname; - snprintf(buffer, maxlength, "%s", dllpath); -#endif - return true; -} diff --git a/sourcemm/oslink.h b/sourcemm/oslink.h deleted file mode 100644 index 7c317ed..0000000 --- a/sourcemm/oslink.h +++ /dev/null @@ -1,91 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_OSLINK_H -#define _INCLUDE_OSLINK_H - -/** - * @brief Defines OS-independent information - * @file oslink.h - */ - -#if defined __WIN32__ || defined _WIN32 || defined WIN32 - #define WIN32_LEAN_AND_MEAN - #define OS_WIN32 - #if defined _MSC_VER && _MSC_VER >= 1400 - #undef ARRAYSIZE - #else - #define mkdir(a) _mkdir(a) - #endif - #include - #include - #include - #define dlmount(x) LoadLibrary(x) - #define dlsym(x, s) GetProcAddress(x, s) - #define dlclose(x) FreeLibrary(x) - const char* dlerror(); - #define abspath(x, s) _fullpath(x, s, sizeof(x)) - #define PATH_SEP_STR "\\" - #define PATH_SEP_CHAR '\\' - #define ALT_SEP_CHAR '/' - #define PATH_SIZE MAX_PATH - #define SERVER_DLL "server.dll" -#elif defined __linux__ - #define OS_LINUX - #include - #include - #include - #include - typedef void* HINSTANCE; - #define dlmount(x) dlopen(x,RTLD_NOW) - #define abspath(x, s) realpath(s, x) - #define PATH_SEP_STR "/" - #define PATH_SEP_CHAR '/' - #define ALT_SEP_CHAR '\\' - #define PATH_SIZE PATH_MAX - #define stricmp strcasecmp - #define strnicmp strncasecmp - #define SERVER_DLL "server_i486.so" -#endif - -#if defined __linux__ - #include - int GetLastError(); -#endif - -bool GetFileOfAddress(void *pAddr, char *buffer, size_t maxlength); - -#if defined __WIN32__ || defined _WIN32 || defined WIN32 - #define SMM_API extern "C" __declspec(dllexport) -#elif defined __GNUC__ - #if (__GNUC__ == 4) - #define SMM_API extern "C" __attribute__ ((visibility("default"))) - #else - #define SMM_API extern "C" - #endif -#endif - -#if defined __WIN32__ || defined _WIN32 || defined WIN32 - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; -#elif defined __GNUC__ -#include -#if !__GLIBC_HAVE_LONG_LONG - typedef long long int64_t; - typedef unsigned long long uint64_t; -#endif -#endif - -#ifndef __linux__ - #define snprintf _snprintf - #define vsnprintf _vsnprintf -#endif - -#endif //_INCLUDE_OSLINK_H diff --git a/sourcemm/sample_mm/LICENSE.txt b/sourcemm/sample_mm/LICENSE.txt deleted file mode 100644 index bf9f1fd..0000000 --- a/sourcemm/sample_mm/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -The software is Copyright (C) 2004-2007, Metamod:Source Development Team. - -Metamod:Source is distributed under the "zLib/libpng" license, which is reproduced -below: - ------------------------------------------------------------------------------ - -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. - ------------------------------------------------------------------------------ - -The zLib/libpng license has been approved by the "Open Source Initiative" -organization. diff --git a/sourcemm/sample_mm/Makefile b/sourcemm/sample_mm/Makefile deleted file mode 100644 index 8d6f411..0000000 --- a/sourcemm/sample_mm/Makefile +++ /dev/null @@ -1,67 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../../hl2sdk -SMM_ROOT = ../.. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O3 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = sample_mm_i486.so - -HL2PUB = $(HL2SDK)/public -HL2LIB = $(HL2SDK)/linux_sdk - -OBJECTS = SamplePlugin.cpp cvars.cpp - -LINK = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook -I$(SMM_ROOT)/sourcemm - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - $(MAKE) sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true - -default: all - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/sourcemm/sample_mm/SamplePlugin.cpp b/sourcemm/sample_mm/SamplePlugin.cpp deleted file mode 100644 index 62c874e..0000000 --- a/sourcemm/sample_mm/SamplePlugin.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* ======== sample_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include -#include "SamplePlugin.h" -#include "cvars.h" - -//Declare the hooks we will be using in this file. Hooking will not compile without these. -//The macro naming scheme is SH_DECL_HOOKn[_void]. -//If you have 5 parameters, it would be HOOK5. If the function is void, add _void. -//It stands for "SourceHook, Declare Hook". -SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, 0, bool, char const *, char const *, char const *, char const *, bool, bool); -SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int); -SH_DECL_HOOK1_void(IServerGameDLL, GameFrame, SH_NOATTRIB, 0, bool); -SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, 0); -SH_DECL_HOOK2_void(IServerGameClients, ClientActive, SH_NOATTRIB, 0, edict_t *, bool); -SH_DECL_HOOK1_void(IServerGameClients, ClientDisconnect, SH_NOATTRIB, 0, edict_t *); -SH_DECL_HOOK2_void(IServerGameClients, ClientPutInServer, SH_NOATTRIB, 0, edict_t *, char const *); -SH_DECL_HOOK1_void(IServerGameClients, SetCommandClient, SH_NOATTRIB, 0, int); -SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *); -SH_DECL_HOOK5(IServerGameClients, ClientConnect, SH_NOATTRIB, 0, bool, edict_t *, const char*, const char *, char *, int); -SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); -SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent *, bool); - -SamplePlugin g_SamplePlugin; -MyListener g_Listener; - -PLUGIN_EXPOSE(SamplePlugin, g_SamplePlugin); - -bool SamplePlugin::LevelInit(const char *pMapName, const char *pMapEntities, const char *pOldLevel, const char *pLandmarkName, bool loadGame, bool background) -{ - META_LOG(g_PLAPI, "LevelInit() called: pMapName=%s", pMapName); - RETURN_META_VALUE(MRES_IGNORED, true); -} - -void SamplePlugin::OnLevelShutdown() -{ - META_LOG(g_PLAPI, "OnLevelShutdown() called from listener"); -} - -void SamplePlugin::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) -{ - META_LOG(g_PLAPI, "ServerActivate() called: edictCount=%d, clientMax=%d", edictCount, clientMax); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::GameFrame(bool simulating) -{ - //don't log this, it just pumps stuff to the screen ;] - //META_LOG(g_PLAPI, "GameFrame() called: simulating=%d", simulating); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::LevelShutdown( void ) -{ - META_LOG(g_PLAPI, "LevelShutdown() called"); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::ClientActive(edict_t *pEntity, bool bLoadGame) -{ - META_LOG(g_PLAPI, "ClientActive called: pEntity=%d", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::ClientDisconnect(edict_t *pEntity) -{ - META_LOG(g_PLAPI, "ClientDisconnect called: pEntity=%d", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::ClientPutInServer(edict_t *pEntity, char const *playername) -{ - META_LOG(g_PLAPI, "ClientPutInServer called: pEntity=%d, playername=%s", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, playername); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::SetCommandClient(int index) -{ - META_LOG(g_PLAPI, "SetCommandClient() called: index=%d", index); - RETURN_META(MRES_IGNORED); -} - -void SamplePlugin::ClientSettingsChanged(edict_t *pEdict) -{ - META_LOG(g_PLAPI, "ClientSettingsChanged called: pEdict=%d", pEdict ? m_Engine->IndexOfEdict(pEdict) : 0); - RETURN_META(MRES_IGNORED); -} - -bool SamplePlugin::ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) -{ - META_LOG(g_PLAPI, "ClientConnect called: pEntity=%d, pszName=%s, pszAddress=%s", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, pszName, pszAddress); - RETURN_META_VALUE(MRES_IGNORED, true); -} - -void SamplePlugin::ClientCommand(edict_t *pEntity) -{ - META_LOG(g_PLAPI, "ClientCommand called: pEntity=%d (commandString=%s)", pEntity ? m_Engine->IndexOfEdict(pEntity) : 0, m_Engine->Cmd_Args() ? m_Engine->Cmd_Args() : ""); - RETURN_META(MRES_IGNORED); -} - -bool FireEvent_Handler(IGameEvent *event, bool bDontBroadcast) -{ - if (!event || !event->GetName()) - RETURN_META_VALUE(MRES_IGNORED, false); - - /** - * Note that this will only fire on game events that are already being listened to. - * For events that are not firing (such as item_pickup), you must actually - * register an event listener in the event manager. This hook is provided - * as an example for non-eiface hooks only. - */ - - const char *name = event->GetName(); - - META_LOG(g_PLAPI, "FireGameEvent called: name=%s", name); - - RETURN_META_VALUE(MRES_IGNORED, true); -} - -bool SamplePlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) -{ - PLUGIN_SAVEVARS(); - - GET_V_IFACE_ANY(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); - GET_V_IFACE_CURRENT(engineFactory, m_Engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); - GET_V_IFACE_ANY(serverFactory, m_ServerClients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS); - GET_V_IFACE_CURRENT(engineFactory, m_GameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2); - - META_LOG(g_PLAPI, "Starting plugin.\n"); - - ismm->AddListener(this, &g_Listener); - - //Init our cvars/concmds - ConCommandBaseMgr::OneTimeInit(&g_Accessor); - - //We're hooking the following things as POST, in order to seem like Server Plugins. - //However, I don't actually know if Valve has done server plugins as POST or not. - //Change the last parameter to 'false' in order to change this to PRE. - //SH_ADD_HOOK_MEMFUNC means "SourceHook, Add Hook, Member Function". - - //Hook LevelInit to our function - SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelInit, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelInit, true); - //Hook ServerActivate to our function - SH_ADD_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, m_ServerDll, &g_SamplePlugin, &SamplePlugin::ServerActivate, true); - //Hook GameFrame to our function - SH_ADD_HOOK_MEMFUNC(IServerGameDLL, GameFrame, m_ServerDll, &g_SamplePlugin, &SamplePlugin::GameFrame, true); - //Hook LevelShutdown to our function -- this makes more sense as pre I guess - SH_ADD_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelShutdown, false); - //Hook ClientActivate to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientActive, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientActive, true); - //Hook ClientDisconnect to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientDisconnect, true); - //Hook ClientPutInServer to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientPutInServer, true); - //Hook SetCommandClient to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, m_ServerClients, &g_SamplePlugin, &SamplePlugin::SetCommandClient, true); - //Hook ClientSettingsChanged to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientSettingsChanged, true); - - //The following functions are pre handled, because that's how they are in IServerPluginCallbacks - - //Hook ClientConnect to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientConnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientConnect, false); - //Hook ClientCommand to our function - SH_ADD_HOOK_MEMFUNC(IServerGameClients, ClientCommand, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientCommand, false); - - //This hook is a static hook, no member function - SH_ADD_HOOK_STATICFUNC(IGameEventManager2, FireEvent, m_GameEventManager, FireEvent_Handler, false); - - //Get the call class for IVServerEngine so we can safely call functions without - // invoking their hooks (when needed). - m_Engine_CC = SH_GET_CALLCLASS(m_Engine); - - SH_CALL(m_Engine_CC, &IVEngineServer::LogPrint)("All hooks started!\n"); - - return true; -} - -bool SamplePlugin::Unload(char *error, size_t maxlen) -{ - //IT IS CRUCIAL THAT YOU REMOVE CVARS. - //As of Metamod:Source 1.00-RC2, it will automatically remove them for you. - //But this is only if you've registered them correctly! - - //Make sure we remove any hooks we did... this may not be necessary since - //SourceHook is capable of unloading plugins' hooks itself, but just to be safe. - - SH_REMOVE_HOOK_STATICFUNC(IGameEventManager2, FireEvent, m_GameEventManager, FireEvent_Handler, false); - SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelInit, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelInit, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, ServerActivate, m_ServerDll, &g_SamplePlugin, &SamplePlugin::ServerActivate, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, GameFrame, m_ServerDll, &g_SamplePlugin, &SamplePlugin::GameFrame, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameDLL, LevelShutdown, m_ServerDll, &g_SamplePlugin, &SamplePlugin::LevelShutdown, false); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientActive, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientActive, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientDisconnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientDisconnect, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientPutInServer, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientPutInServer, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, m_ServerClients, &g_SamplePlugin, &SamplePlugin::SetCommandClient, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientSettingsChanged, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientSettingsChanged, true); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientConnect, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientConnect, false); - SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, ClientCommand, m_ServerClients, &g_SamplePlugin, &SamplePlugin::ClientCommand, false); - - //this, sourcehook does not keep track of. we must do this. - SH_RELEASE_CALLCLASS(m_Engine_CC); - - return true; -} - -void SamplePlugin::AllPluginsLoaded() -{ - //we don't really need this for anything other than interplugin communication - //and that's not used in this plugin. - //If we really wanted, we could override the factories so other plugins can request - // interfaces we make. In this callback, the plugin could be assured that either - // the interfaces it requires were either loaded in another plugin or not. -} - -void *MyListener::OnMetamodQuery(const char *iface, int *ret) -{ - if (strcmp(iface, "SamplePlugin")==0) - { - if (ret) - *ret = IFACE_OK; - return static_cast(&g_SamplePlugin); - } - - if (ret) - *ret = IFACE_FAILED; - - return NULL; -} diff --git a/sourcemm/sample_mm/SamplePlugin.h b/sourcemm/sample_mm/SamplePlugin.h deleted file mode 100644 index 74f5af1..0000000 --- a/sourcemm/sample_mm/SamplePlugin.h +++ /dev/null @@ -1,132 +0,0 @@ -/* ======== sample_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_SAMPLEPLUGIN_H -#define _INCLUDE_SAMPLEPLUGIN_H - -#include -#include -#include - -#define SAMPLE_VERSION "1.10" - -class SamplePlugin : public ISmmPlugin, public IMetamodListener -{ -public: - bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late); - bool Unload(char *error, size_t maxlen); - void AllPluginsLoaded(); - bool Pause(char *error, size_t maxlen) - { - return true; - } - bool Unpause(char *error, size_t maxlen) - { - return true; - } -public: - int GetApiVersion() { return PLAPI_VERSION; } -public: - const char *GetAuthor() - { - return "BAILOPAN"; - } - const char *GetName() - { - return "Sample Plugin"; - } - const char *GetDescription() - { - return "Sample plugin that hooks basic things"; - } - const char *GetURL() - { - return "http://www.sourcemm.net/"; - } - const char *GetLicense() - { - return "zlib/libpng"; - } - const char *GetVersion() - { - return SAMPLE_VERSION; - } - const char *GetDate() - { - return __DATE__; - } - const char *GetLogTag() - { - return "SAMPLE"; - } -public: - //These functions are from IServerPluginCallbacks - //Note, the parameters might be a little different to match the actual calls! - - //Called on LevelInit. Server plugins only have pMapName - bool LevelInit(const char *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background); - - //Called on ServerActivate. Same definition as server plugins - void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); - - //Called on a game tick. Same definition as server plugins - void GameFrame(bool simulating); - - //Called on level shutdown. Same definition as server plugins - void LevelShutdown(void); - - //Client is activate (whatever that means). We get an extra parameter... - // "If bLoadGame is true, don't spawn the player because its state is already setup." - void ClientActive(edict_t *pEntity, bool bLoadGame); - - //Client disconnects - same as server plugins - void ClientDisconnect(edict_t *pEntity); - - //Client is put in server - same as server plugins - void ClientPutInServer(edict_t *pEntity, char const *playername); - - //Sets the client index - same as server plugins - void SetCommandClient(int index); - - //Called on client settings changed (duh) - same as server plugins - void ClientSettingsChanged(edict_t *pEdict); - - //Called on client connect. Unlike server plugins, we return whether the - // connection is allowed rather than set it through a pointer in the first parameter. - // You can still supercede the GameDLL through RETURN_META_VALUE(MRES_SUPERCEDE, true/false) - bool ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); - - //Called when a client uses a command. Unlike server plugins, it's void. - // You can still supercede the gamedll through RETURN_META(MRES_SUPERCEDE). - void ClientCommand(edict_t *pEntity); - - //From IMetamodListener - virtual void OnLevelShutdown(); - -private: - IGameEventManager2 *m_GameEventManager; - IVEngineServer *m_Engine; - IServerGameDLL *m_ServerDll; - IServerGameClients *m_ServerClients; - SourceHook::CallClass *m_Engine_CC; -}; - -class MyListener : public IMetamodListener -{ -public: - virtual void *OnMetamodQuery(const char *iface, int *ret); -}; - -extern SamplePlugin g_SamplePlugin; -PLUGIN_GLOBALVARS(); - -bool FireEvent_Handler(IGameEvent *event, bool bDontBroadcast); - -#endif //_INCLUDE_SAMPLEPLUGIN_H diff --git a/sourcemm/sample_mm/cvars.cpp b/sourcemm/sample_mm/cvars.cpp deleted file mode 100644 index 4a6c16a..0000000 --- a/sourcemm/sample_mm/cvars.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* ======== sample_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include "SamplePlugin.h" -#include "cvars.h" - -SampleAccessor g_Accessor; - -ConVar g_MyConVar("sample_version", SAMPLE_VERSION, FCVAR_SPONLY, "Sample Plugin version"); - -bool SampleAccessor::RegisterConCommandBase(ConCommandBase *pVar) -{ - //this will work on any type of concmd! - return META_REGCVAR(pVar); -} - -CON_COMMAND(sample_cmd, "Sample Plugin command") -{ - META_LOG(g_PLAPI, "This sentence is in Spanish when you're not looking."); -} diff --git a/sourcemm/sample_mm/cvars.h b/sourcemm/sample_mm/cvars.h deleted file mode 100644 index 9bc6286..0000000 --- a/sourcemm/sample_mm/cvars.h +++ /dev/null @@ -1,24 +0,0 @@ -/* ======== sample_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_CVARS_H -#define _INCLUDE_CVARS_H - -#include - -class SampleAccessor : public IConCommandBaseAccessor -{ -public: - virtual bool RegisterConCommandBase(ConCommandBase *pVar); -}; - -extern SampleAccessor g_Accessor; - -#endif //_INCLUDE_CVARS_H diff --git a/sourcemm/sample_mm/msvc7/sample_mm.sln b/sourcemm/sample_mm/msvc7/sample_mm.sln deleted file mode 100644 index b885d6b..0000000 --- a/sourcemm/sample_mm/msvc7/sample_mm.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_mm", "sample_mm.vcproj", "{FAFF34FB-FE14-47B5-81BD-70D237392FB2}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug.ActiveCfg = Debug|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug.Build.0 = Debug|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release.ActiveCfg = Release|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/sourcemm/sample_mm/msvc7/sample_mm.vcproj b/sourcemm/sample_mm/msvc7/sample_mm.vcproj deleted file mode 100644 index 57c68a7..0000000 --- a/sourcemm/sample_mm/msvc7/sample_mm.vcproj +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/sample_mm/msvc8/sample_mm.sln b/sourcemm/sample_mm/msvc8/sample_mm.sln deleted file mode 100644 index df4b2fb..0000000 --- a/sourcemm/sample_mm/msvc8/sample_mm.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_mm", "sample_mm.vcproj", "{FAFF34FB-FE14-47B5-81BD-70D237392FB2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug|Win32.ActiveCfg = Debug|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Debug|Win32.Build.0 = Debug|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release|Win32.ActiveCfg = Release|Win32 - {FAFF34FB-FE14-47B5-81BD-70D237392FB2}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/sourcemm/sample_mm/msvc8/sample_mm.vcproj b/sourcemm/sample_mm/msvc8/sample_mm.vcproj deleted file mode 100644 index 0e10bef..0000000 --- a/sourcemm/sample_mm/msvc8/sample_mm.vcproj +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/sourcemm.cpp b/sourcemm/sourcemm.cpp deleted file mode 100644 index d1f3210..0000000 --- a/sourcemm/sourcemm.cpp +++ /dev/null @@ -1,979 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * Contributor(s): Scott "Damaged Soul" Ehlert - * : Pavol "PM OnoTo" Marko - * ============================ - */ - -#include -#include -#include -#include "sourcemm.h" -#include "concommands.h" -#include "CSmmAPI.h" -#include "CPlugin.h" -#include "util.h" -#include "vsp_listener.h" -#include "iplayerinfo.h" -#include - -using namespace SourceMM; - -/** - * @brief Implementation of main SourceMM GameDLL functionality - * @file sourcemm.cpp - */ - -#undef CommandLine -DLL_IMPORT ICommandLine *CommandLine(); - -SH_DECL_HOOK4(IServerGameDLL, DLLInit, SH_NOATTRIB, false, bool, CreateInterfaceFn, CreateInterfaceFn, CreateInterfaceFn, CGlobalVars *); -SH_DECL_HOOK0_void(IServerGameDLL, DLLShutdown, SH_NOATTRIB, false); -SH_DECL_HOOK0_void(IServerGameDLL, LevelShutdown, SH_NOATTRIB, false); -SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, false, bool, const char *, const char *, const char *, const char *, bool, bool); -SH_DECL_HOOK1_void(IServerGameClients, ClientCommand, SH_NOATTRIB, 0, edict_t *); -SH_DECL_HOOK0(IServerGameDLL, GameInit, SH_NOATTRIB, false, bool); - -bool DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); -bool DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals); -void DLLShutdown_handler(); -void LevelShutdown_handler(); -bool LevelInit_handler(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background); -bool GameInit_handler(); -void LookForVDFs(const char *dir); - -GameDllInfo g_GameDll = {false, NULL, NULL, NULL, NULL}; -EngineInfo g_Engine; -SourceHook::CSourceHookImpl g_SourceHook; -SourceHook::ISourceHook *g_SHPtr = &g_SourceHook; -SourceHook::String g_ModPath; -SourceHook::String g_BinPath; -SourceHook::String g_SmmPath; -PluginId g_PLID = Pl_Console; /* Technically, SourceMM is the "Console" plugin... :p */ -bool bInFirstLevel = true; -bool gParsedGameInfo = false; -bool bGameInit = false; -SourceHook::List gamedll_list; -SourceHook::CallClass *g_GameDllPatch; -int g_GameDllVersion = 0; -const char VSPIFACE_001[] = "ISERVERPLUGINCALLBACKS001"; -const char VSPIFACE_002[] = "ISERVERPLUGINCALLBACKS002"; -const char GAMEINFO_PATH[] = "|gameinfo_path|"; -IFileSystem *baseFs = NULL; -bool g_bLevelChanged = false; - - -void ClearGamedllList(); - -/* Helper Macro */ -#define IFACE_MACRO(orig,nam) \ - CPluginManager::CPlugin *pl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - int mret = 0; \ - void *val = NULL; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - pl = (*iter); \ - for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ - api = (*event).event; \ - mret = IFACE_FAILED; \ - if ( (val=api->On##nam##Query(iface, &mret)) != NULL ) { \ - if (ret) *ret = mret; \ - return val; \ - } \ - } \ - } \ - return (orig)(iface, ret); - -#define ITER_EVENT(evn, args) \ - CPluginManager::CPlugin *pl; \ - SourceHook::List::iterator event; \ - IMetamodListener *api; \ - for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) { \ - pl = (*iter); \ - for (event=pl->m_Events.begin(); event!=pl->m_Events.end(); event++) { \ - api = (*event).event; \ - api->evn args; \ - } \ - } - -/////////////////////////////////// -// Main code for HL2 Interaction // -/////////////////////////////////// - -/* Initialize everything here */ -void InitMainStates() -{ - char full_path[PATH_SIZE] = {0}; - GetFileOfAddress((void *)g_GameDll.factory, full_path, sizeof(full_path)); - g_BinPath.assign(full_path); - - /* Like Metamod, reload plugins at the end of the map. - * This is so plugins can hook everything on load, BUT, new plugins will be reloaded - * if the server is shut down (silly, but rare case). - */ - bInFirstLevel = true; - - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLInit, g_GameDll.pGameDLL, DLLInit, false); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLInit, g_GameDll.pGameDLL, DLLInit_Post, true); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, DLLShutdown, g_GameDll.pGameDLL, DLLShutdown_handler, false); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, LevelShutdown, g_GameDll.pGameDLL, LevelShutdown_handler, true); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, LevelInit, g_GameDll.pGameDLL, LevelInit_handler, true); - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, GameInit, g_GameDll.pGameDLL, GameInit_handler, false); -} - -void DoInitialPluginLoads() -{ - const char *pluginFile = g_Engine.icvar->GetCommandLineValue("mm_pluginsfile"); - const char *mmBaseDir = g_Engine.icvar->GetCommandLineValue("mm_basedir"); - - if (!pluginFile) - { - pluginFile = GetPluginsFile(); - } - if (!mmBaseDir) - { - mmBaseDir = GetMetamodBaseDir(); - } - - char full_path[260]; - - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), pluginFile); - LoadPluginsFromFile(full_path); - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), mmBaseDir); - LookForVDFs(full_path); -} - -bool StartupMetamod(CreateInterfaceFn engineFactory, bool bWaitForGameInit) -{ - g_Engine.engine = (IVEngineServer *)((engineFactory)(INTERFACEVERSION_VENGINESERVER, NULL)); - - if (!g_Engine.engine) - { - Error("Could not find IVEngineServer! Metamod cannot load."); - return false; - } - g_Engine.icvar = (ICvar *)((engineFactory)(VENGINE_CVAR_INTERFACE_VERSION , NULL)); - if (!g_Engine.icvar) - { - Error("Could not find ICvar! Metamod cannot load."); - return false; - } - - g_Engine.loaded = true; - - ConCommandBaseMgr::OneTimeInit(static_cast(&g_SMConVarAccessor)); - - g_GameDllPatch = SH_GET_CALLCLASS(g_GameDll.pGameDLL); - - if (g_GameDll.pGameClients) - { - SH_ADD_HOOK_STATICFUNC(IServerGameClients, ClientCommand, g_GameDll.pGameClients, ClientCommand_handler, false); - } - else - { - /* If IServerGameClients isn't found, this really isn't a fatal error so... */ - LogMessage("[META] Warning: Could not find IServerGameClients!"); - LogMessage("[META] Warning: The 'meta' command will not be available to clients."); - } - - if (!g_SmmAPI.CacheCmds()) - { - LogMessage("[META] Warning: Failed to initialize Con_Printf. Defaulting to Msg()."); - LogMessage("[META] Warning: Console messages will not be redirected to rcon console."); - } - - if (!g_SmmAPI.CacheUserMessages()) - { - /* Don't know of a mod that has stripped out user messages completely, - * but perhaps should do something different here? - */ - LogMessage("[META] Warning: Failed to get list of user messages."); - LogMessage("[META] Warning: The 'meta game' command will not display user messages."); - } - - baseFs = (IFileSystem *)((engineFactory)(FILESYSTEM_INTERFACE_VERSION, NULL)); - if (baseFs == NULL) - { - LogMessage("[META] Failed to find filesystem interface, .vdf files will not be parsed."); - } - - if (!bWaitForGameInit) - { - DoInitialPluginLoads(); - bInFirstLevel = true; - } - - return true; -} - -bool DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) -{ - g_Engine.engineFactory = engineFactory; - g_Engine.fileSystemFactory = filesystemFactory; - g_Engine.physicsFactory = physicsFactory; - g_Engine.pGlobals = pGlobals; - - StartupMetamod(engineFactory, false); - - RETURN_META_VALUE(MRES_IGNORED, true); -} - -bool AlternatelyLoadMetamod(CreateInterfaceFn ifaceFactory, CreateInterfaceFn serverFactory) -{ - g_Engine.engineFactory = ifaceFactory; - g_Engine.fileSystemFactory = ifaceFactory; - g_Engine.physicsFactory = ifaceFactory; - - IPlayerInfoManager *playerInfoManager = (IPlayerInfoManager *)serverFactory("PlayerInfoManager002", NULL); - if (playerInfoManager == NULL) - { - Error("Metamod:Source requires gameinfo.txt modification to load on this game."); - return false; - } - - g_Engine.pGlobals = playerInfoManager->GetGlobalVars(); - - /* Now find the server */ - g_GameDll.factory = serverFactory; - g_GameDll.lib = NULL; - - char gamedll_iface[] = "ServerGameDLL000"; - for (unsigned int i = 3; i <= 50; i++) - { - gamedll_iface[15] = '0' + i; - g_GameDll.pGameDLL = (IServerGameDLL *)serverFactory(gamedll_iface, NULL); - if (g_GameDll.pGameDLL != NULL) - { - g_GameDllVersion = i; - break; - } - } - - if (g_GameDll.pGameDLL == NULL) - { - Error("Metamod:Source requires gameinfo.txt modification to load on this game."); - return false; - } - - char gameclients_iface[] = "ServerGameClients000"; - for (unsigned int i = 3; i <= 4; i++) - { - gameclients_iface[19] = '0' + i; - g_GameDll.pGameClients = (IServerGameClients *)serverFactory(gameclients_iface, NULL); - if (g_GameDll.pGameClients != NULL) - { - break; - } - } - - char smm_path[PATH_SIZE]; - const char *game_dir; - GetFileOfAddress((void *)AlternatelyLoadMetamod, smm_path, sizeof(smm_path)); - g_SmmPath.assign(smm_path); - - game_dir = CommandLine()->ParmValue("-game", "hl2"); - abspath(smm_path, game_dir); - g_ModPath.assign(smm_path); - - InitMainStates(); - - if (!StartupMetamod(ifaceFactory, true)) - { - return false; - } - - g_PluginMngr.SetAllLoaded(); - - return true; -} - -bool GameInit_handler() -{ - if (bGameInit) - { - RETURN_META_VALUE(MRES_IGNORED, true); - } - - if (g_SmmAPI.VSPEnabled() && !g_VspListener.IsRootLoadMethod()) - { - g_SmmAPI.LoadAsVSP(); - } - - if (g_VspListener.IsRootLoadMethod()) - { - DoInitialPluginLoads(); - //gaben - } - - bGameInit = true; - - RETURN_META_VALUE(MRES_IGNORED, true); -} - -bool DLLInit_Post(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn filesystemFactory, CGlobalVars *pGlobals) -{ - g_PluginMngr.SetAllLoaded(); - RETURN_META_VALUE(MRES_IGNORED, true); -} - -/* This is where the magic happens */ -SMM_API void *CreateInterface(const char *iface, int *ret) -{ - /* Prevent loading of self as a SourceMM plugin or Valve server plugin :x */ - if (strcmp(iface, PLAPI_NAME) == 0) - { - Warning("Do not try loading Metamod:Source as a Metamod:Source plugin"); - - if (ret) - { - *ret = IFACE_FAILED; - } - - return NULL; - } - - /* We check these separately because we can't reply - * unless our interface version really matches. - */ - if ((strcmp(iface, VSPIFACE_002) == 0) - || strcmp(iface, VSPIFACE_001) == 0) - { - if (ret) - { - *ret = IFACE_OK; - } - return &g_VspListener; - } - - /* If we're a VSP, bypass this by default */ - if (g_VspListener.IsRootLoadMethod()) - { - IFACE_MACRO(g_GameDll.factory, GameDLL); - } - - if (!gParsedGameInfo) - { - gParsedGameInfo = true; - const char *gameDir = NULL; - char gamePath[PATH_SIZE]; - char smmPath[PATH_SIZE]; - - /* Get path to SourceMM DLL */ - if (!GetFileOfAddress((void *)CreateInterface, smmPath, sizeof(smmPath))) - { - Error("GetFileOfAddress() failed! Metamod cannot load.\n"); - return NULL; - } - - g_SmmPath.assign(smmPath); - - /* Get value of -game from command line, defaulting to hl2 as engine seems to do */ - gameDir = CommandLine()->ParmValue("-game", "hl2"); - - /* Get absolute path */ - abspath(gamePath, gameDir); - g_ModPath.assign(gamePath); - - char tempPath[PATH_SIZE]; - - /* Path to gameinfo.txt */ - g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s", g_ModPath.c_str(), "gameinfo.txt"); - - FILE *fp = fopen(tempPath, "rt"); - - if (!fp) - { - Error("Unable to open gameinfo.txt! Metamod cannot load.\n"); - return NULL; - } - - char buffer[255]; - char key[128], val[128]; - size_t len = 0; - bool search = false; - bool gamebin = false; - char *ptr; - const char *lptr; - char curPath[PATH_SIZE]; - - getcwd(curPath, PATH_SIZE); - - while (!feof(fp)) - { - buffer[0] = '\0'; - fgets(buffer, sizeof(buffer), fp); - len = strlen(buffer); - if (buffer[len-1] == '\n') - buffer[--len] = '\0'; - UTIL_TrimComments(buffer); - UTIL_TrimLeft(buffer); - UTIL_TrimRight(buffer); - if (stricmp(buffer, "SearchPaths") == 0) - search = true; - if (!search) - continue; - UTIL_KeySplit(buffer, key, sizeof(key) - 1, val, sizeof(val) - 1); - if (stricmp(key, "Game") == 0 || stricmp(key, "GameBin") == 0) - { - if (stricmp(key, "Game") == 0) - gamebin = false; - else - gamebin = true; - - if (strncmp(val, GAMEINFO_PATH, sizeof(GAMEINFO_PATH) - 1) == 0) - { - ptr = &(val[sizeof(GAMEINFO_PATH) - 1]); - if (ptr[0] == '.') - ptr++; - lptr = g_ModPath.c_str(); - } else { - ptr = val; - lptr = curPath; - } - - size_t ptr_len = strlen(ptr); - if (ptr[ptr_len] == '/' || ptr[ptr_len] == '\\') - ptr[--ptr_len] = '\0'; - - /* No need to append "bin" if key is GameBin */ - if (gamebin) - { - g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s", lptr, ptr, SERVER_DLL); - } else if (!ptr[0]) { - g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s", lptr, "bin", SERVER_DLL); - } else { - g_SmmAPI.PathFormat(tempPath, PATH_SIZE, "%s/%s/%s/%s", lptr, ptr, "bin", SERVER_DLL); - } - - /* If not path to SourceMM... */ - if (!UTIL_PathCmp(smmPath, tempPath)) - { - FILE *fp = fopen(tempPath, "rb"); - if (!fp) - continue; - //:TODO: Optimize this a bit! - SourceHook::List::iterator iter; - GameDllInfo *pCheck; - bool found = false; - for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) - { - pCheck = (*iter); - if (GetFileOfAddress((void *)pCheck->factory, buffer, sizeof(buffer))) - { - if (UTIL_PathCmp(tempPath, buffer)) - { - found = true; - break; - } - } - } - if (found) - continue; - fclose(fp); - HINSTANCE gamedll = dlmount(tempPath); - if (gamedll == NULL) - continue; - CreateInterfaceFn fn = (CreateInterfaceFn)dlsym(gamedll, "CreateInterface"); - if (fn == NULL) - { - dlclose(gamedll); - continue; - } - GameDllInfo *pInfo = new GameDllInfo; - pInfo->factory = fn; - pInfo->lib = gamedll; - pInfo->loaded = true; - pInfo->pGameDLL = NULL; - gamedll_list.push_back(pInfo); - break; - } - } - } - fclose(fp); - } - - if (!g_GameDll.loaded) - { - const char *str = "ServerGameDLL"; - size_t len = strlen(str); - - if (strncmp(iface, str, len) == 0) - { - /* This is the interface we want! Right now we support versions 3 through 8 */ - g_GameDllVersion = atoi(&(iface[len])); - int sizeTooBig = 0; //rename this to sizeWrong in the future! - if (g_GameDllVersion < MIN_GAMEDLL_VERSION || g_GameDllVersion > MAX_GAMEDLL_VERSION) - { - /* Maybe this will get used in the future */ - sizeTooBig = g_GameDllVersion; - if (ret) - { - *ret = IFACE_FAILED; - } - } - SourceHook::List::iterator iter; - GameDllInfo *pInfo = NULL; - void *ptr; - for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) - { - pInfo = (*iter); - ptr = (pInfo->factory)(iface, ret); - if (ptr) - { - /* This is our GameDLL. Unload the others. */ - gamedll_list.erase(iter); - ClearGamedllList(); - pInfo->pGameDLL = static_cast(ptr); - g_GameDll = *pInfo; - delete pInfo; - break; - } - } - if (g_GameDll.loaded) - { - if (sizeTooBig) - { - Error("This mod version requires a SourceMM update (ServerGameDLL%03d)!\n", sizeTooBig); - if (ret) - { - *ret = IFACE_FAILED; - } - return NULL; - } else { - InitMainStates(); - } - } else { - sizeTooBig = 0; - if (ret) - *ret = IFACE_FAILED; - return NULL; - } - } else { - /* wtf do we do... */ - /* :TODO: .. something a bit more intelligent? */ - Error("Engine requested unknown interface before GameDLL was known!\n"); - return NULL; - } - } - - /* We use this interface for responding to the meta client command */ - if (strncmp(iface, "ServerGameClients", 17) == 0) - { - void *ptr = (g_GameDll.factory)(iface, ret); - g_GameDll.pGameClients = static_cast(ptr); - - return ptr; - } - - /* If we got here, there's definitely a GameDLL */ - IFACE_MACRO(g_GameDll.factory, GameDLL); -} - -void ClearGamedllList() -{ - SourceHook::List::iterator iter; - - GameDllInfo *pInfo; - for (iter=gamedll_list.begin(); iter!=gamedll_list.end(); iter++) - { - pInfo = (*iter); - dlclose(pInfo->lib); - delete pInfo; - } - - gamedll_list.clear(); -} - -void UnloadMetamod(bool shutting_down) -{ - /* Unload plugins */ - g_PluginMngr.UnloadAll(); - - if (shutting_down) - { - /* Add the FCVAR_GAMEDLL flag to our cvars so the engine removes them properly */ - g_SMConVarAccessor.MarkCommandsAsGameDLL(); - g_SMConVarAccessor.UnregisterGameDLLCommands(); - - SH_CALL(g_GameDllPatch, &IServerGameDLL::DLLShutdown)(); - } - - SH_RELEASE_CALLCLASS(g_GameDllPatch); - g_GameDllPatch = NULL; - - g_SourceHook.CompleteShutdown(); - - if (g_GameDll.lib && g_GameDll.loaded) - { - dlclose(g_GameDll.lib); - } - memset(&g_GameDll, 0, sizeof(GameDllInfo)); -} - -void DLLShutdown_handler() -{ - UnloadMetamod(true); - RETURN_META(MRES_SUPERCEDE); -} - -void LoadFromVDF(const char *file) -{ - PluginId id; - bool already; - KeyValues *pValues; - const char *plugin_file, *alias; - char full_path[256], error[256]; - - pValues = new KeyValues("Metamod Plugin"); - - if (!pValues->LoadFromFile(baseFs, file)) - { - pValues->deleteThis(); - return; - } - - if ((plugin_file = pValues->GetString("file", NULL)) == NULL) - { - pValues->deleteThis(); - return; - } - - if ((alias = pValues->GetString("alias", NULL)) != NULL) - { - g_PluginMngr.SetAlias(alias, plugin_file); - } - - /* Attempt to find a file extension */ - if (UTIL_GetExtension(plugin_file) == NULL) - { - g_SmmAPI.PathFormat(full_path, - sizeof(full_path), - "%s/%s%s", - g_ModPath.c_str(), - plugin_file, -#if defined WIN32 || defined _WIN32 - ".dll" -#else - "_i486.so" -#endif - ); - } - else - { - g_SmmAPI.PathFormat(full_path, - sizeof(full_path), - "%s/%s", - g_ModPath.c_str(), - plugin_file); - } - - id = g_PluginMngr.Load(full_path, Pl_File, already, error, sizeof(error)); - if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) - { - LogMessage("[META] Failed to load plugin %s: %s", plugin_file, error); - } - - pValues->deleteThis(); -} - -void LookForVDFs(const char *dir) -{ - char path[MAX_PATH]; - -#if defined _MSC_VER - HANDLE hFind; - WIN32_FIND_DATA fd; - char error[255]; - - g_SmmAPI.PathFormat(path, sizeof(path), "%s\\*.*", dir); - if ((hFind = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE) - { - DWORD dw = GetLastError(); - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - dw, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - error, - sizeof(error), - NULL); - LogMessage("[META] Could not open folder \"%s\" (%s)", dir, error); - return; - } - - do - { - if (strcmp(fd.cFileName, ".") == 0 - || strcmp(fd.cFileName, "..") == 0) - { - continue; - } - if (strstr(fd.cFileName, ".vdf") == NULL) - { - continue; - } - g_SmmAPI.PathFormat(path, sizeof(path), "%s\\%s", dir, fd.cFileName); - LoadFromVDF(path); - } while (FindNextFile(hFind, &fd)); - - FindClose(hFind); -#else - DIR *pDir; - struct dirent *pEnt; - - if ((pDir = opendir(dir)) == NULL) - { - LogMessage("[META] Could not open folder \"%s\" (%s)", dir, strerror(errno)); - return; - } - - while ((pEnt = readdir(pDir)) != NULL) - { - if (strcmp(pEnt->d_name, ".") == 0 - || strcmp(pEnt->d_name, "..") == 0) - { - continue; - } - if (strstr(pEnt->d_name, ".vdf") == NULL) - { - continue; - } - g_SmmAPI.PathFormat(path, sizeof(path), "%s/%s", dir, pEnt->d_name); - LoadFromVDF(path); - } - - closedir(pDir); -#endif -} - -int LoadPluginsFromFile(const char *_file) -{ - FILE *fp; - int total = 0, skipped=0; - PluginId id; - bool already; - - fp = fopen(_file, "rt"); - if (!fp) - { - LogMessage("[META] Could not open plugins file %s\n", _file); - return -1; - } - - char buffer[255], error[255], full_path[255]; - const char *ptr, *ext, *file; - size_t length; - while (!feof(fp)) - { - buffer[0] = '\0'; - fgets(buffer, sizeof(buffer), fp); - length = strlen(buffer); - if (!length) - continue; - if (buffer[length-1] == '\n') - buffer[--length] = '\0'; - - UTIL_TrimLeft(buffer); - UTIL_TrimRight(buffer); - - if (buffer[0] == '\0' || buffer[0] == ';' || strncmp(buffer, "//", 2) == 0) - continue; - file = buffer; - if (buffer[0] == '"') - { - char *cptr = buffer; - file = ++cptr; - - while (*cptr) - { - if (*cptr == '"') - { - *cptr = '\0'; - break; - } - cptr++; - } - } else { - char *cptr = buffer; - while (*cptr) - { - if (isspace(*cptr)) - { - char *optr = cptr; - while (*cptr && isspace(*cptr)) - cptr++; - *optr = '\0'; - UTIL_TrimRight(cptr); - if (*cptr && isalpha(*cptr)) - { - g_PluginMngr.SetAlias(buffer, cptr); - file = cptr; - } - break; - } - cptr++; - } - } - if (!file[0]) - { - continue; - } - /* First find if it's an absolute path or not... */ - if (file[0] == '/' || strncmp(&(file[1]), ":\\", 2) == 0) - { - /* If we're in an absolute path, ignore our normal heuristics */ - id = g_PluginMngr.Load(file, Pl_File, already, error, sizeof(error)); - if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) - { - LogMessage("[META] Failed to load plugin %s. %s", buffer, error); - } else { - if (already) - skipped++; - else - total++; - } - } else { - /* Attempt to find a file extension */ - ptr = UTIL_GetExtension(file); - /* Add an extension if there's none there */ - if (!ptr) - { -#if defined WIN32 || defined _WIN32 - ext = ".dll"; -#else - ext = "_i486.so"; -#endif - } else { - ext = ""; - } - /* Format the new path */ - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s%s", g_ModPath.c_str(), file, ext); - id = g_PluginMngr.Load(full_path, Pl_File, already, error, sizeof(error)); - if (id < Pl_MinId || g_PluginMngr.FindById(id)->m_Status < Pl_Paused) - { - LogMessage("[META] Failed to load plugin %s. %s", buffer, error); - } else { - if (already) - skipped++; - else - total++; - } - } - } - fclose(fp); - - if (skipped) - { - LogMessage("[META] Loaded %d plugins from file (%d already loaded)", total, skipped); - } else { - LogMessage("[META] Loaded %d plugins from file.", total); - } - - return total; -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real engineFactory. - */ -void *EngineFactory(const char *iface, int *ret) -{ - IFACE_MACRO(g_Engine.engineFactory, Engine); -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real physicsFactory. - */ -void *PhysicsFactory(const char *iface, int *ret) -{ - IFACE_MACRO(g_Engine.physicsFactory, Physics); -} - -/* Wrapper function. This is called when the GameDLL thinks it's using - * the engine's real fileSystemFactory. - */ -void *FileSystemFactory(const char *iface, int *ret) -{ - IFACE_MACRO(g_Engine.fileSystemFactory, FileSystem); -} - -void LogMessage(const char *msg, ...) -{ - va_list ap; - static char buffer[2048]; - - va_start(ap, msg); - size_t len = vsnprintf(buffer, sizeof(buffer) - 2, msg, ap); - va_end(ap); - - buffer[len++] = '\n'; - buffer[len] = '\0'; - - if (!g_Engine.engine) - { - fprintf(stdout, "%s", buffer); - } else { - g_Engine.engine->LogPrint(buffer); - } -} - -void LevelShutdown_handler(void) -{ - if (!bInFirstLevel) - { - char full_path[255]; - - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), GetPluginsFile()); - LoadPluginsFromFile(full_path); - - g_SmmAPI.PathFormat(full_path, sizeof(full_path), "%s/%s", g_ModPath.c_str(), GetMetamodBaseDir()); - LookForVDFs(full_path); - } - else - { - bInFirstLevel = false; - } - - g_bLevelChanged = true; - - ITER_EVENT(OnLevelShutdown, ()); - - RETURN_META(MRES_IGNORED); -} - -bool LevelInit_handler(char const *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background) -{ - if (!g_SmmAPI.CmdCacheSuccessful()) - { - LogMessage("[META] Warning: Failed to initialize Con_Printf. Defaulting to Msg()."); - LogMessage("[META] Warning: Console messages will not be redirected to rcon console."); - } - - ITER_EVENT(OnLevelInit, (pMapName, pMapEntities, pOldLevel, pLandmarkName, loadGame, background)); - - RETURN_META_VALUE(MRES_IGNORED, false); -} - -#if defined __GNUC__ && (__GNUC__ == 3 || __GNUC__ == 4) -void * operator new(size_t size) { - return(calloc(1, size)); -} - -void * operator new[](size_t size) { - return(calloc(1, size)); -} - -void operator delete(void * ptr) { - if(ptr) - free(ptr); -} - -void operator delete[](void * ptr) { - if(ptr) - free(ptr); -} -#endif diff --git a/sourcemm/sourcemm.h b/sourcemm/sourcemm.h deleted file mode 100644 index 05fd0b6..0000000 --- a/sourcemm/sourcemm.h +++ /dev/null @@ -1,127 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_SOURCEMM_H -#define _INCLUDE_SOURCEMM_H - -/** - * @brief SourceMM main functionality for GameDLL interception - * @file sourcemm.h - */ - -#include -#include -#include -#include -#include -#include "ISmmAPI.h" -#include "CPlugin.h" -#include "oslink.h" -#include "util.h" -#include "svn_version.h" - -/** - * Versioning - * increase api_major when API breaks - * increase api_minor when new functions are added (non-breaking) - */ -#define SOURCEMM_VERSION SVN_FILE_VERSION_STRING -#define SOURCEMM_DATE __DATE__ -#define SM_VERS_API_MAJOR 1 //increase this on a breaking change -#define SM_VERS_API_MINOR 5 //increase this on a non-breaking API change - -//We need a good CServerGameDLL version to work properly. We support these inclusively. -#define MIN_GAMEDLL_VERSION 3 -#define MAX_GAMEDLL_VERSION 8 - -/** - * @brief Entry point for HL2 Engine - */ -SMM_API void *CreateInterface(const char *name, int *code); - -/** @brief Wrapper to catch GameDLL calls */ -void *EngineFactory(const char *name, int *code); - -/** @brief Wrapper to catch GameDLL calls */ -void *PhysicsFactory(const char *name, int *code); - -/** @brief Wrapper to catch GameDLL calls */ -void *FileSystemFactory(const char *name, int *code); - -/** @brief Loads all plugins found in a file */ -int LoadPluginsFromFile(const char *file); - -/** @brief Logs a message to the standard log file */ -void LogMessage(const char *msg, ...); - -/** @brief Stores information about the GameDLL */ -struct GameDllInfo -{ - bool loaded; - HINSTANCE lib; - CreateInterfaceFn factory; - IServerGameDLL *pGameDLL; - IServerGameClients *pGameClients; -}; - -/** @brief Stores information about the HL2 Engine pointers */ -struct EngineInfo -{ - EngineInfo() : loaded(false), - engineFactory(NULL), physicsFactory(NULL), fileSystemFactory(NULL), - pGlobals(NULL), icvar(NULL), engine(NULL) - { }; - bool loaded; - CreateInterfaceFn engineFactory; - CreateInterfaceFn physicsFactory; - CreateInterfaceFn fileSystemFactory; - CGlobalVars *pGlobals; - ICvar *icvar; - IVEngineServer *engine; -}; - -bool AlternatelyLoadMetamod(CreateInterfaceFn ifaceFactory, CreateInterfaceFn serverFactory); - -/** @brief Global variable for GameDLL info */ -extern GameDllInfo g_GameDll; - -/** @brief Global variable for Engine info */ -extern EngineInfo g_Engine; - -/** @brief Global singleton for SourceHook */ -extern SourceHook::CSourceHookImpl g_SourceHook; - -/** @brief Mod path (important!)*/ -extern SourceHook::String g_ModPath; - -/** @brief Path to server binary */ -extern SourceHook::String g_BinPath; - -/** @brief Path to SourceMM binary */ -extern SourceHook::String g_SmmPath; - -/** @brief Global variable for SourceHook macros */ -extern SourceHook::ISourceHook *g_SHPtr; - -/** @brief We have our own internal plugin id... */ -extern PluginId g_PLID; - -/** @brief ServerGameDLL version that is currently loaded */ -extern int g_GameDllVersion; - -extern bool bGameInit; -extern bool g_bLevelChanged; - -void UnloadMetamod(bool shutting_down); - -/** @brief Global CallClass for IServerGameDLL */ -extern SourceHook::CallClass *g_GameDllPatch; - -#endif //_INCLUDE_SOURCEMM_H diff --git a/sourcemm/stub_mm/LICENSE.txt b/sourcemm/stub_mm/LICENSE.txt deleted file mode 100644 index bf9f1fd..0000000 --- a/sourcemm/stub_mm/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -The software is Copyright (C) 2004-2007, Metamod:Source Development Team. - -Metamod:Source is distributed under the "zLib/libpng" license, which is reproduced -below: - ------------------------------------------------------------------------------ - -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. - ------------------------------------------------------------------------------ - -The zLib/libpng license has been approved by the "Open Source Initiative" -organization. diff --git a/sourcemm/stub_mm/Makefile b/sourcemm/stub_mm/Makefile deleted file mode 100644 index eec1eb9..0000000 --- a/sourcemm/stub_mm/Makefile +++ /dev/null @@ -1,66 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../../hl2sdk -SMM_ROOT = ../.. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O3 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = stub_mm_i486.so - -HL2PUB = $(HL2SDK)/public - -OBJECTS = stub_mm.cpp - -LINK = vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook -I$(SMM_ROOT)/sourcemm - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - $(MAKE) sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true - -default: all - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/sourcemm/stub_mm/msvc7/stub_mm.sln b/sourcemm/stub_mm/msvc7/stub_mm.sln deleted file mode 100644 index 0567903..0000000 --- a/sourcemm/stub_mm/msvc7/stub_mm.sln +++ /dev/null @@ -1,21 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stub_mm", "stub_mm.vcproj", "{836E726E-AB80-43AB-9A8F-0E6EE680B0F6}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug.ActiveCfg = Debug|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug.Build.0 = Debug|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release.ActiveCfg = Release|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/sourcemm/stub_mm/msvc7/stub_mm.vcproj b/sourcemm/stub_mm/msvc7/stub_mm.vcproj deleted file mode 100644 index aaed89b..0000000 --- a/sourcemm/stub_mm/msvc7/stub_mm.vcproj +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/stub_mm/msvc8/stub_mm.sln b/sourcemm/stub_mm/msvc8/stub_mm.sln deleted file mode 100644 index 4e0655b..0000000 --- a/sourcemm/stub_mm/msvc8/stub_mm.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stub_mm", "stub_mm.vcproj", "{836E726E-AB80-43AB-9A8F-0E6EE680B0F6}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug|Win32.ActiveCfg = Debug|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Debug|Win32.Build.0 = Debug|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release|Win32.ActiveCfg = Release|Win32 - {836E726E-AB80-43AB-9A8F-0E6EE680B0F6}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/sourcemm/stub_mm/msvc8/stub_mm.vcproj b/sourcemm/stub_mm/msvc8/stub_mm.vcproj deleted file mode 100644 index ed30615..0000000 --- a/sourcemm/stub_mm/msvc8/stub_mm.vcproj +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sourcemm/stub_mm/stub_mm.cpp b/sourcemm/stub_mm/stub_mm.cpp deleted file mode 100644 index f43ed53..0000000 --- a/sourcemm/stub_mm/stub_mm.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* ======== stub_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include -#include "stub_mm.h" - -SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int); - -StubPlugin g_StubPlugin; - -PLUGIN_EXPOSE(SamplePlugin, g_StubPlugin); - -void ServerActivate_handler(edict_t *pEdictList, int edictCount, int clientMax) -{ - META_LOG(g_PLAPI, "ServerActivate() called: edictCount=%d, clientMax=%d", edictCount, clientMax); - RETURN_META(MRES_IGNORED); -} - -bool StubPlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) -{ - PLUGIN_SAVEVARS(); - - GET_V_IFACE_ANY(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); - - SH_ADD_HOOK_STATICFUNC(IServerGameDLL, ServerActivate, m_ServerDll, ServerActivate_handler, true); - - return true; -} - -bool StubPlugin::Unload(char *error, size_t maxlen) -{ - SH_REMOVE_HOOK_STATICFUNC(IServerGameDLL, ServerActivate, m_ServerDll, ServerActivate_handler, true); - - return true; -} - -bool StubPlugin::Pause(char *error, size_t maxlen) -{ - return true; -} - -bool StubPlugin::Unpause(char *error, size_t maxlen) -{ - return true; -} - -void StubPlugin::AllPluginsLoaded() -{ - //This is an example of inter-plugin communication - PluginId id; - void *ptr = g_SMAPI->MetaFactory("SamplePlugin", NULL, &id); - if (ptr) - { - META_LOG(g_PLAPI, "Found Sample Plugin[%d] at (%p)!", id, ptr); - } else { - META_LOG(g_PLAPI, "Did not find Sample Plugin!"); - } -} - -const char *StubPlugin::GetAuthor() -{ - return "AUTHOR"; -} - -const char *StubPlugin::GetName() -{ - return "Stub Plugin"; -} - -const char *StubPlugin::GetDescription() -{ - return "Stub Plugin"; -} - -const char *StubPlugin::GetURL() -{ - return "http://www.mysite.com/"; -} - -const char *StubPlugin::GetLicense() -{ - return "zlib/libpng"; -} - -const char *StubPlugin::GetVersion() -{ - return "1.00"; -} - -const char *StubPlugin::GetDate() -{ - return __DATE__; -} - -const char *StubPlugin::GetLogTag() -{ - return "STUB"; -} diff --git a/sourcemm/stub_mm/stub_mm.h b/sourcemm/stub_mm/stub_mm.h deleted file mode 100644 index fec6701..0000000 --- a/sourcemm/stub_mm/stub_mm.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ======== stub_mm ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_SAMPLEPLUGIN_H -#define _INCLUDE_SAMPLEPLUGIN_H - -#include - -class StubPlugin : public ISmmPlugin -{ -public: - bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late); - bool Unload(char *error, size_t maxlen); - bool Pause(char *error, size_t maxlen); - bool Unpause(char *error, size_t maxlen); - void AllPluginsLoaded(); -public: - const char *GetAuthor(); - const char *GetName(); - const char *GetDescription(); - const char *GetURL(); - const char *GetLicense(); - const char *GetVersion(); - const char *GetDate(); - const char *GetLogTag(); -private: - IServerGameDLL *m_ServerDll; - IServerGameDLL *m_ServerDll_CC; -}; - -extern StubPlugin g_StubPlugin; - -PLUGIN_GLOBALVARS(); - -//Called on ServerActivate. Same definition as server plugins -void ServerActivate_handler(edict_t *pEdictList, int edictCount, int clientMax); - -#endif //_INCLUDE_SAMPLEPLUGIN_H diff --git a/sourcemm/svn_version.h b/sourcemm/svn_version.h deleted file mode 100644 index 0d4023c..0000000 --- a/sourcemm/svn_version.h +++ /dev/null @@ -1,13 +0,0 @@ -/** This file is autogenerated by build scripts */ - -#ifndef _INCLUDE_SVN_VERSION_H_ -#define _INCLUDE_SVN_VERSION_H_ - -#define SVN_PRODUCT_VERSION "1.4.3" - -#define SVN_REVISION 656 -#define SVN_REVISION_STRING "656" -#define SVN_FILE_VERSION 1,4,3,656 -#define SVN_FILE_VERSION_STRING "1.4.3.656" - -#endif //_INCLUDE_SVN_VERSION_H_ diff --git a/sourcemm/svn_version.tpl b/sourcemm/svn_version.tpl deleted file mode 100644 index 9b93d57..0000000 --- a/sourcemm/svn_version.tpl +++ /dev/null @@ -1,13 +0,0 @@ -/** This file is autogenerated by build scripts */ - -#ifndef _INCLUDE_SVN_VERSION_H_ -#define _INCLUDE_SVN_VERSION_H_ - -#define SVN_PRODUCT_VERSION "$PMAJOR$.$PMINOR$.$PREVISION$" - -#define SVN_REVISION $GLOBAL_BUILD$ -#define SVN_REVISION_STRING "$GLOBAL_BUILD$" -#define SVN_FILE_VERSION $PMAJOR$,$PMINOR$,$PREVISION$,$GLOBAL_BUILD$ -#define SVN_FILE_VERSION_STRING "$PMAJOR$.$PMINOR$.$PREVISION$.$GLOBAL_BUILD$" - -#endif //_INCLUDE_SVN_VERSION_H_ diff --git a/sourcemm/util.cpp b/sourcemm/util.cpp deleted file mode 100644 index fadcf26..0000000 --- a/sourcemm/util.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include -#include -#include -#include "util.h" -#include "oslink.h" - -/** - * @brief Utility functions - * @file util.cpp - */ - -const char *UTIL_GetExtension(const char *file) -{ - int len = strlen(file); - int i = 0; - - for (i = len - 1; i >= 0; i--) - { - if (file[i] == '/' || file[i] == '\\') - { - return NULL; - } - - if ((file[i] == '.') && (i != len - 1)) - { - return (const char *)&(file[i + 1]); - } - } - - return NULL; -} - -void UTIL_TrimLeft(char *buffer) -{ - /* Let's think of this as our iterator */ - char *i = buffer; - - /* Make sure the buffer isn't null */ - if (i && *i) - { - /* Add up number of whitespace characters */ - while(isspace((unsigned char) *i)) - { - i++; - } - - /* If whitespace chars in buffer then adjust string so first non-whitespace char is at start of buffer */ - if (i != buffer) - { - memmove(buffer, i, (strlen(i) + 1) * sizeof(char)); - } - } -} - -void UTIL_TrimRight(char *buffer) -{ - /* Make sure buffer isn't null */ - if (buffer) - { - size_t len = strlen(buffer); - - /* Loop through buffer backwards while replacing whitespace chars with null chars */ - for (size_t i = len - 1; i >= 0; i--) - { - if (isspace((unsigned char) buffer[i])) - { - buffer[i] = '\0'; - } else { - break; - } - } - } -} - -/* :TODO: this should skip string literals */ -void UTIL_TrimComments(char *buffer) -{ - int num_sc = 0; - size_t len = strlen(buffer); - if (buffer) - { - for (int i = len - 1; i >= 0; i--) - { - if (buffer[i] == '/') - { - if (++num_sc >= 2 && i==0) - { - buffer[i] = '\0'; - return; - } - } else { - if (num_sc >= 2) - { - buffer[i] = '\0'; - return; - } - num_sc = 0; - } - /* size_t won't go below 0, manually break out */ - if (i == 0) - { - break; - } - } - } -} - -void UTIL_KeySplit(const char *str, char *buf1, size_t len1, char *buf2, size_t len2) -{ - size_t start; - size_t len = strlen(str); - - for (start = 0; start < len; start++) - { - if (!isspace(str[start])) - { - break; - } - } - - size_t end; - for (end = start; end < len; end++) - { - if (isspace(str[end])) - { - break; - } - } - - size_t i, c = 0; - for (i = start; i < end; i++, c++) - { - if (c >= len1) - { - break; - } - buf1[c] = str[i]; - } - buf1[c] = '\0'; - - for (start = end; start < len; start++) - { - if (!isspace(str[start])) - { - break; - } - } - - for (c = 0; start < len; start++, c++) - { - if (c >= len2) - { - break; - } - buf2[c] = str[start]; - } - buf2[c] = '\0'; -} - -bool UTIL_PathCmp(const char *path1, const char *path2) -{ - size_t pos1 = 0, pos2 = 0; - - while (true) - { - if (path1[pos1] == '\0' || path2[pos2] == '\0') - { - return (path1[pos1] == path2[pos2]); - } - - if (path1[pos1] == PATH_SEP_CHAR) - { - if (path2[pos2] != PATH_SEP_CHAR) - { - return false; - } - - /* Look for extra path chars */ - while (path1[++pos1]) - { - if (path1[pos1] != PATH_SEP_CHAR) - { - break; - } - } - while (path2[++pos2]) - { - if (path2[pos2] != PATH_SEP_CHAR) - { - break; - } - } - continue; - } - - /* If we're at a different non-alphanumeric, the next character MUST match */ - if (!isalpha(path1[pos1]) && (path1[pos1] != path2[pos2])) - { - return false; - } - - #ifdef WIN32 - if (toupper(path1[pos1]) != toupper(path2[pos2])) - #else - if (path1[pos1] != path2[pos2]) - #endif - { - return false; - } - - pos1++; - pos2++; - } -} - -size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - size_t len = vsnprintf(buffer, maxlength, fmt, ap); - va_end(ap); - - if (len >= maxlength) - { - len = maxlength - 1; - buffer[len] = '\0'; - } - - return len; -} - -inline bool pathchar_isalpha(char a) -{ - return (((a & 1<<7) == 0) && isalpha(a)); -} - -inline bool pathchar_sep(char a) -{ -#if defined WIN32 - return (a == '/' || a == '\\'); -#elif defined __linux__ - return (a == '/'); -#endif -} - -inline bool pathstr_isabsolute(const char *str) -{ -#if defined WIN32 - return (pathchar_isalpha(str[0]) - && str[1] == ':' - && pathchar_sep(str[2])); -#elif defined __linux__ - return (str[0] == '/'); -#endif -} - -inline bool pathchar_cmp(char a, char b) -{ -#if defined WIN32 - if (pathchar_isalpha(a) && pathchar_isalpha(b)) - { - return (tolower(a) == tolower(b)); - } - /* Either path separator is acceptable */ - if (pathchar_sep(a)) - { - return pathchar_sep(b); - } -#endif - return (a == b); -} - -/** - * @brief Forms a relative path given two absolute paths. - * - * @param buffer Buffer to store relative path in. - * @param maxlength Maximum length of the output buffer. - * @param relTo Destination folder to use as a working directory. - * Final folder name should not be pathchar-terminated. - * @param relFrom Source file or folder to use as a target. - * @return True on success, false on failure. - */ -bool UTIL_Relatize(char buffer[], - size_t maxlength, - const char *relTo, - const char *relFrom) -{ - /* We don't allow relative paths in here, force - * the user to resolve these himself! - */ - if (!pathstr_isabsolute(relTo) - || !pathstr_isabsolute(relFrom)) - { - return false; - } - -#if defined WIN32 - /* Relative paths across drives are not possible */ - if (!pathchar_cmp(relTo[0], relFrom[0])) - { - return false; - } - /* Get rid of the drive and semicolon part */ - relTo = &relTo[2]; - relFrom = &relFrom[2]; -#endif - - /* Eliminate the common root between the paths */ - const char *rootTo = NULL; - const char *rootFrom = NULL; - while (*relTo != '\0' && *relFrom != '\0') - { - /* If we get to a new path sequence, start over */ - if (pathchar_sep(*relTo) - && pathchar_sep(*relFrom)) - { - rootTo = relTo; - rootFrom = relFrom; - /* If the paths don't compare, stop looking for a common root */ - } else if (!pathchar_cmp(*relTo, *relFrom)) { - break; - } - relTo++; - relFrom++; - } - - /* NULLs shouldn't happen! */ - if (rootTo == NULL - || rootFrom == NULL) - { - return false; - } - - size_t numLevels = 0; - - /* The root case is special! - * Don't count anything from it. - */ - if (*(rootTo + 1) != '\0') - { - /* Search for how many levels we need to go up. - * Since the root pointer points to a '/', we increment - * the initial pointer by one. - */ - while (*rootTo != '\0') - { - if (pathchar_sep(*rootTo)) - { - /* Check for an improper trailing slash, - * just to be nice even though the user - * should NOT have done this! - */ - if (*(rootTo + 1) == '\0') - { - break; - } - numLevels++; - } - rootTo++; - } - } - - /* Now build the new relative path. */ - size_t len, total = 0; - while (numLevels--) - { - len = _snprintf(&buffer[total], maxlength - total, ".." PATH_SEP_STR); - if (len >= maxlength - total) - { - /* Not enough space in the buffer */ - return false; - } - total += len; - } - - /* Add the absolute path. */ - len = _snprintf(&buffer[total], maxlength - total, "%s", &rootFrom[1]); - if (len >= maxlength - total) - { - return false; - } - - return true; -} - -size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params) -{ - size_t len = vsnprintf(buffer, maxlength, fmt, params); - - if (len >= maxlength) - { - len = maxlength - 1; - buffer[len] = '\0'; - } - - return len; -} diff --git a/sourcemm/util.h b/sourcemm/util.h deleted file mode 100644 index ed053bd..0000000 --- a/sourcemm/util.h +++ /dev/null @@ -1,76 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_UTIL_H -#define _INCLUDE_UTIL_H - -#include - -/** - * @brief Utility functions - * @file util.h - */ - -/** - * @brief Returns a pointer to the extension in a file name. - */ -const char *UTIL_GetExtension(const char *file); - -/** - * @brief Removes C-style comments from string. - */ -void UTIL_TrimComments(char *buffer); - -/** - * @brief Removes whitespace characters from left side of string. - */ -void UTIL_TrimLeft(char *buffer); - -/** - * @brief Removes whitespace characters from right side of string. - */ -void UTIL_TrimRight(char *buffer); - -/** - * @brief Breaks a string at the first space until it reaches a non-space. - */ -void UTIL_KeySplit(const char *str, char *buf1, size_t len1, char *buf2, size_t len2); - -/** - * @brief Compares two file paths. - */ -bool UTIL_PathCmp(const char *path1, const char *path2); - -/** - * @brief Same as snprintf except that it ensures the string buffer is null terminated. - */ -size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...); - -/** - * @brief Same as vsnprintf except that it ensures the string buffer is null terminated. - */ -size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params); - -/** - * @brief Forms a relative path given two absolute paths. - * - * @param buffer Buffer to store relative path in. - * @param maxlength Maximum length of the output buffer. - * @param relTo Destination folder to use as a working directory. - * Final folder name should not be pathchar-terminated. - * @param relFrom Source file or folder to use as a target. - * @return True on success, false on failure. - */ -bool UTIL_Relatize(char buffer[], - size_t maxlength, - const char *relTo, - const char *relFrom); - -#endif //_INCLUDE_UTIL_H diff --git a/sourcemm/version.rc b/sourcemm/version.rc deleted file mode 100755 index 67529d4..0000000 --- a/sourcemm/version.rc +++ /dev/null @@ -1,101 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" -#include "svn_version.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION SVN_FILE_VERSION - PRODUCTVERSION SVN_FILE_VERSION - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "000004b0" - BEGIN - VALUE "Comments", "Metamod: Source" - VALUE "FileDescription", "Metamod: Source" - VALUE "FileVersion", SVN_FILE_VERSION_STRING - VALUE "InternalName", "sourcemm" - VALUE "LegalCopyright", "Copyright (c) 2004-2007, Metamod: Source Development Team" - VALUE "OriginalFilename", "server.dll" - VALUE "ProductName", "Metamod: Source" - VALUE "ProductVersion", SVN_PRODUCT_VERSION - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1200 - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/sourcemm/vsp_listener.cpp b/sourcemm/vsp_listener.cpp deleted file mode 100644 index 87cbc91..0000000 --- a/sourcemm/vsp_listener.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#include "vsp_listener.h" -#include "CPlugin.h" -#include "concommands.h" - -SH_DECL_HOOK0_void(ConCommand, Dispatch, SH_NOATTRIB, false); - -using namespace SourceMM; - -VSPListener g_VspListener; -ConCommand *g_plugin_unload = NULL; -bool g_bIsTryingToUnload; - -void InterceptPluginUnloads() -{ - g_bIsTryingToUnload = true; -} - -void InterceptPluginUnloads_Post() -{ - g_bIsTryingToUnload = false; -} - -VSPListener::VSPListener() -{ - m_Loaded = false; - m_Loadable = false; - m_bIsRootLoadMethod = false; -} - -void VSPListener::ClientActive(edict_t *pEntity) -{ -} - -PLUGIN_RESULT VSPListener::ClientCommand(edict_t *pEntity) -{ - return PLUGIN_CONTINUE; -} - -PLUGIN_RESULT VSPListener::ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::ClientDisconnect(edict_t *pEntity) -{ -} - -void VSPListener::ClientPutInServer(edict_t *pEntity, char const *playername) -{ -} - -void VSPListener::ClientSettingsChanged(edict_t *pEdict) -{ -} - -void VSPListener::SetCommandClient(int index) -{ -} - -void VSPListener::GameFrame(bool simulating) -{ -} - -const char *VSPListener::GetPluginDescription() -{ - return "Metamod:Source Interface v" SOURCEMM_VERSION; -} - -bool VSPListener::IsLoaded() -{ - return m_Loaded; -} - -void VSPListener::LevelInit(char const *pMapName) -{ -} - -void VSPListener::LevelShutdown() -{ -} - -PLUGIN_RESULT VSPListener::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) -{ - return PLUGIN_CONTINUE; -} - -void VSPListener::Pause() -{ -} - -void VSPListener::UnPause() -{ -} - -void VSPListener::ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) -{ -} - -void VSPListener::Unload() -{ - if (g_bIsTryingToUnload) - { - Error("Metamod:Source cannot be unloaded from VSP mode. Use \"meta unload\" to unload specific plugins.\n"); - return; - } - if (IsRootLoadMethod()) - { - if (g_plugin_unload != NULL) - { - SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, g_plugin_unload, InterceptPluginUnloads, false); - SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, g_plugin_unload, InterceptPluginUnloads_Post, true); - g_plugin_unload = NULL; - } - g_SMConVarAccessor.UnloadMetamodCommands(); - UnloadMetamod(false); - } - m_Loadable = true; - m_Loaded = false; - m_bIsRootLoadMethod = false; -} - -void VSPListener::SetLoadable(bool set) -{ - m_Loadable = set; -} - -bool VSPListener::IsRootLoadMethod() -{ - return m_bIsRootLoadMethod; -} - -bool VSPListener::Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) -{ - if (m_Loaded) - { - return false; - } - - if (!m_Loadable && !g_GameDll.loaded) - { - /* New loading mechanism, do a bunch o' stuff! */ - m_bIsRootLoadMethod = true; - m_Loaded = true; - SetLoadable(false); - if (!AlternatelyLoadMetamod(interfaceFactory, gameServerFactory)) - { - return false; - } - - ConCommandBase *pBase = g_Engine.icvar->GetCommands(); - while (pBase != NULL) - { - if (pBase->IsCommand() && strcmp(pBase->GetName(), "plugin_unload") == 0) - { - g_plugin_unload = (ConCommand *)pBase; - break; - } - pBase = const_cast(pBase->GetNext()); - } - - if (g_plugin_unload != NULL) - { - SH_ADD_HOOK_STATICFUNC(ConCommand, Dispatch, g_plugin_unload, InterceptPluginUnloads, false); - SH_ADD_HOOK_STATICFUNC(ConCommand, Dispatch, g_plugin_unload, InterceptPluginUnloads_Post, true); - } - - /* Ho ho ho... if we get here, set a new cvar version. */ - extern ConVar metamod_version; - char buffer[255]; - - UTIL_Format(buffer, sizeof(buffer), "%sV", metamod_version.GetString()); - metamod_version.SetValue(buffer); - } - - m_Loaded = true; - SetLoadable(false); - - if (!m_bIsRootLoadMethod) - { - g_PluginMngr.SetVSPAsLoaded(); - } - - return true; -} diff --git a/sourcemm/vsp_listener.h b/sourcemm/vsp_listener.h deleted file mode 100644 index f907855..0000000 --- a/sourcemm/vsp_listener.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ======== SourceMM ======== - * Copyright (C) 2004-2007 Metamod:Source Development Team - * No warranties of any kind - * - * License: zlib/libpng - * - * Author(s): David "BAILOPAN" Anderson - * ============================ - */ - -#ifndef _INCLUDE_SOURCEMM_VSPLISTENER_H_ -#define _INCLUDE_SOURCEMM_VSPLISTENER_H_ - -#include "sourcemm.h" -#include "iserverplugin.h" - -class VSPListener : public IServerPluginCallbacks -{ -public: - VSPListener(); -public: - virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory); - virtual void Unload(); - virtual void Pause(); - virtual void UnPause(); - virtual const char *GetPluginDescription(); - virtual void LevelInit(char const *pMapName); - virtual void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); - virtual void GameFrame(bool simulating); - virtual void LevelShutdown(void); - virtual void ClientActive(edict_t *pEntity); - virtual void ClientDisconnect(edict_t *pEntity); - virtual void ClientPutInServer(edict_t *pEntity, char const *playername); - virtual void SetCommandClient(int index); - virtual void ClientSettingsChanged(edict_t *pEdict); - virtual PLUGIN_RESULT ClientConnect(bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen); - virtual PLUGIN_RESULT ClientCommand(edict_t *pEntity); - virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID); -public: - bool IsLoaded(); - void SetLoadable(bool loadable); - bool IsRootLoadMethod(); -private: - bool m_Loaded; - bool m_Loadable; - bool m_bIsRootLoadMethod; -}; - -extern VSPListener g_VspListener; - -#endif //_INCLUDE_SOURCEMM_VSPLISTENER_H_ diff --git a/update_tool/Makefile b/update_tool/Makefile deleted file mode 100644 index 02273b2..0000000 --- a/update_tool/Makefile +++ /dev/null @@ -1,68 +0,0 @@ -#(C)2004-2007 SourceMM Development Team -# Makefile written by David "BAILOPAN" Anderson - -HL2SDK = ../../hl2sdk -SMM_ROOT = .. -SRCDS = ~/srcds - -### EDIT BELOW FOR OTHER PROJECTS ### - -OPT_FLAGS = -O2 -funroll-loops -s -pipe -GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden -DEBUG_FLAGS = -g -ggdb3 -CPP = gcc-4.1 -BINARY = sourcemm_update_tool_i486.so - -HL2PUB = $(HL2SDK)/public -HL2LIB = $(HL2SDK)/linux_sdk - -OBJECTS = update_tool.cpp - -LINK = vstdlib_i486.so tier0_i486.so -static-libgcc - -INCLUDE = -I. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ - -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_ROOT) -I$(SMM_ROOT)/sourcehook - -ifeq "$(DEBUG)" "true" - BIN_DIR = Debug - CFLAGS = $(DEBUG_FLAGS) -else - BIN_DIR = Release - CFLAGS = $(OPT_FLAGS) -endif - -GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) - -CFLAGS += -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Wno-non-virtual-dtor -Werror -fPIC -fno-exceptions -fno-rtti -msse - -ifeq "$(GCC_VERSION)" "4" - CFLAGS += $(GCC4_FLAGS) -endif - -OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) - -$(BIN_DIR)/%.o: %.cpp - $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< - -all: - mkdir -p $(BIN_DIR) - ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so - ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so - nasm api_link.asm -f elf -o $(BIN_DIR)/api_link.o -DLINUX - $(MAKE) sourcemm - rm -rf $(BINARY) - ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) - -sourcemm: $(OBJ_LINUX) - $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(BIN_DIR)/api_link.o $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) - -debug: - $(MAKE) all DEBUG=true - -default: all - -clean: - rm -rf Release/*.o - rm -rf Release/$(BINARY) - rm -rf Debug/*.o - rm -rf Debug/$(BINARY) diff --git a/update_tool/README.txt b/update_tool/README.txt deleted file mode 100644 index 9c974a4..0000000 --- a/update_tool/README.txt +++ /dev/null @@ -1,90 +0,0 @@ -This is the README file for sourcemm_update_tool. - -This tool will automatically correct gameinfo.txt when your server gets updated, and Valve's updater overwrites Metamod:Source's changes. This tool is experimental, and is thus a separate download for now. - -1. INSTALLATION - - a. Extract the entire package to your mod folder. The structure should look like: - - /addons/metamod/bin/sourcemm_update_tool.dll - /addons/metamod/bin/sourcemm_update_tool_i486.so - /addons/metamod/README.txt - /addons/sourcemm_update_tool.vdf - /sourcemm_updater.conf - - b. Open /sourcemm_updater.conf with your favorite text editor. Change the - "cstrike" folder to match your mod folder. - -2. CONFIGURATION - - The sourcemm_updater.conf file has two configuration options. - - mmpath - Set this to the path Metamod:Source is located in. - This defaults to addons/metamod/bin - restart - Set this to how the server should be restarted when - gameinfo.txt is patched. There are three options: - - quit - Execute "quit" in the console. Currently does not work. - never - Do not restart. - error - Generate an error message. Because of a bug in SourceDS, - this will generate a crash dump on Windows, but the server - will successfully quit. - -3. USAGE - - You do not need to do anything to use the updater tool. When your server starts, - it silently checks to see if Metamod:Source is loaded. If not, it will make sure - gameinfo.txt is correctly set. Then, depending on how it's configured, it will - kill the server. Most game server provides have auto-restart functionality on their - servers; if not, you will need to manually restart the server. - - The update tool unloads itself immediately after the server starts, so it will not - use any resources, and will not display when you type 'plugin_print'. - -4. TROUBLESHOOTING - - This tool is currently experimental. There are two possible problems. For - any issue you encounter, you should post a report here: - - http://bugs.alliedmods.net/index.php?project=4 - - a. The updater tool does not patch gameinfo.txt - - Verify that the tool is loading. You can do this by opening up the - sourcemm_update_tool.vdf file and copying its file path. Then, enter - the following command in your server console: - - plugin_load - - Example: - - plugin_load cstrike\addons\metamod\bin\sourcemm_update_tool - - If you get the following reply: - - Failed to load plugin "cstrike\addons\sourcemm_update_tool" - Unable to load plugin "cstrike\addons\sourcemm_update_tool" - - Then the tool is working, and you should post a bug report. If instead, - you get: - - Unable to load plugin "cstrike\addons\sourcemm_update_tool" - Unable to load plugin "cstrike\addons\sourcemm_update_tool" - - Then the tool is not loading properly, and the path you are trying to use - is not correct. - - b. The server always dies, and you can't start it at all - - The updater tool is either crashing or not repairing Metamod:Source - correctly. First, try changing the 'restart' line in sourcemm_updater.conf - to the following line: - - restart = never - - If that does not fix the problem, remove the .vdf file so the updater tool - will not be loaded. - - In either case, you should post a bug report containing your mod name and - your gameinfo.txt as an attachment. - \ No newline at end of file diff --git a/update_tool/api_link.asm b/update_tool/api_link.asm deleted file mode 100644 index 6f94053..0000000 --- a/update_tool/api_link.asm +++ /dev/null @@ -1,138 +0,0 @@ -;;;; -;; (C)2005-2007 AlliedModders LLC -;; By the Metamod:Source Development Team -;; This software is licensed under the zlib/libpng free software license. -;; -;; This assembly file is a short thunk wrapper to let us load as a VSP and exit quietly, -;; without any overhead of the rest of the interface, and also to prevent linking against -;; tierX or vstdlib -;;;; - -;;Exports: -;; void GetBaseDir(char *buffer, maxlength); -;; void *GetThisPointer(); -;;Imports: -;; void LoadFunction(); - -section .text - -global GetThisPointer, GetGameDir, ServerCommand -global _GetThisPointer, _GetGameDir, _ServerCommand -global _GetICvar, GetICvar -extern _LoadFunction - -GetICvar: -_GetICvar: - mov eax, [icvar] - ret - -GetThisPointer: -_GetThisPointer: - mov eax, GLOBAL_POINTER - ret - -GetGameDir: -_GetGameDir: - push ebp - mov ebp, esp - - mov ecx, [engine] ;get this pointer - mov edx, [ecx] ;get the vtable - push dword [ebp+12] ;push maxlenth - push dword [ebp+8] ;push buffer - %ifdef LINUX - push ecx ;push this pointer - %endif - call dword [edx+216] ;call IVEngineServer::GetGameDir - %ifdef LINUX - add esp, 12 ;correct stack - %endif - - pop ebp - ret - -ServerCommand -_ServerCommand: - push ebp - mov ebp, esp - - mov ecx, [engine] ;get this pointer - mov edx, [ecx] ;get the vtable - push dword [ebp+8] ;push string - %ifdef LINUX - push ecx ;push this pointer - %endif - call dword [edx+144] ;call IVEngineServer::ServerCommand - %ifdef LINUX - add esp, 8 ;correct stack - %endif - - pop ebp - ret - -thisLoadFunction: - push ebp - mov ebp, esp - - push edi - - ;get factory - %ifdef LINUX - mov edi, [ebp+12] - %else - mov edi, [ebp+8] - %endif - - push dword 0 ;NULL - push dword VENGINESERVER ;iface name - call edi ;call factory - add esp, 8 ;correct stack - - test eax, eax ;do we have a valid pointer? - jz .end ;no, bail out - - mov [engine], eax ;store the engine pointer - - push dword 0 ;NULL - push dword VENGINECVAR ;iface name - call edi ;call factory - add esp, 8 ;correct stack - - test eax, eax ;do we have a valid pointer? - jz .end ;no, bail out - - mov [icvar], eax ;store the icvar pointer - - call _LoadFunction - -.end: - ;We never load, never ever ever! - xor eax, eax - - pop edi - - pop ebp - %ifdef LINUX - ret - %else - retn 8 - %endif - -thisUnloadFunction: - ret - -section .data - INTERFACE_NAME DB "ISERVERPLUGINCALLBACKS001", 0 - VENGINESERVER DB "VEngineServer021", 0 - VENGINECVAR DB "VEngineCvar003", 0 - - VIRTUAL_TABLE DD thisLoadFunction - DD thisUnloadFunction - ;We don't need any more of the vtable here - - GLOBAL_POINTER DD VIRTUAL_TABLE - - temp_ret DD 0 - temp_ptr DD temp_ret - engine DD 0 - icvar DD 0 diff --git a/update_tool/msvc8/update_tool.sln b/update_tool/msvc8/update_tool.sln deleted file mode 100644 index 5250f8a..0000000 --- a/update_tool/msvc8/update_tool.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "update_tool", "update_tool.vcproj", "{DDD1563F-7EE2-4E76-BE57-ED84A2664A51}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Debug|Win32.ActiveCfg = Debug|Win32 - {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Debug|Win32.Build.0 = Debug|Win32 - {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Release|Win32.ActiveCfg = Release|Win32 - {DDD1563F-7EE2-4E76-BE57-ED84A2664A51}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/update_tool/msvc8/update_tool.vcproj b/update_tool/msvc8/update_tool.vcproj deleted file mode 100644 index 825e521..0000000 --- a/update_tool/msvc8/update_tool.vcproj +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/update_tool/sourcemm_update_tool.vdf b/update_tool/sourcemm_update_tool.vdf deleted file mode 100644 index 79a505c..0000000 --- a/update_tool/sourcemm_update_tool.vdf +++ /dev/null @@ -1,6 +0,0 @@ -//This is a sample VDF file. You need to edit "cstrike" to point to the mod you use. - -"Plugin" -{ - "file" "cstrike/addons/metamod/bin/sourcemm_update_tool" -} diff --git a/update_tool/sourcemm_updater.conf b/update_tool/sourcemm_updater.conf deleted file mode 100644 index bdf1eea..0000000 --- a/update_tool/sourcemm_updater.conf +++ /dev/null @@ -1,9 +0,0 @@ -;Use this to configure where Metamod resides, if you have -;changed its location -;mmpath = addons/metamod/bin - -;Use this to specify how the updater tool restarts SourceDS -; never - don't restart -; error - restart by generating a fatal error message -; quit - restart by issuing a "quit" server command -restart = error diff --git a/update_tool/update_tool.cpp b/update_tool/update_tool.cpp deleted file mode 100644 index ef6dbfe..0000000 --- a/update_tool/update_tool.cpp +++ /dev/null @@ -1,366 +0,0 @@ -#include -#include -#include -#include - -#if defined _MSC_VER -#define SEPCHAR "\\" -#define MMPATH "addons\\metamod\\bin" -#define WINDOWS_LEAN_AND_MEAN -#include -#elif defined __linux__ -#define SEPCHAR "/" -#define MMPATH "addons/metamod/bin" -#include -#endif - -#include - -extern "C" void GetGameDir(char *buffer, int maxlength); -extern "C" void *GetThisPointer(); -extern "C" void ServerCommand(const char *command); -extern "C" ICvar *GetICvar(); - -size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...); -bool s_isspace(char c); -bool RenameFile(const char *old, const char *newf); -bool RemoveFile(const char *file); - -/* This will be called by the thunk */ -#if defined _MSC_VER -extern "C" void LoadFunction() -#elif defined __linux__ -extern "C" void _LoadFunction() -#endif -{ - ICvar *pCvar = GetICvar(); - if (pCvar->FindVar("metamod_version") != NULL) - { - /* Already exists, bail out */ - return; - } - - char gamedir[260]; - char mmpath[260]; - - enum RestartMode - { - Restart_Never, - Restart_Error, - Restart_Quit, - }; - - RestartMode mode = Restart_Error; - - GetGameDir(gamedir, sizeof(gamedir)); - - /* Defaults */ - UTIL_Format(mmpath, sizeof(mmpath), "|gameinfo_path|%s", MMPATH); - - /* Read config */ - char config[260]; - UTIL_Format(config, sizeof(config), "%s" SEPCHAR "sourcemm_updater.conf", gamedir); - FILE *fpCfg = fopen(config, "rt"); - if (fpCfg) - { - char cfgLine[512]; - while (!feof(fpCfg) && fgets(cfgLine, sizeof(cfgLine), fpCfg) != NULL) - { - char key[255]; - - size_t keyLen = 0; - - /* Strip whitespace */ - char *input = cfgLine; - while (*input != '\0' && s_isspace(*input)) - { - input++; - } - - /* Strip ending whitespace */ - size_t len = strlen(input); - for (size_t i = len - 1; - i >= 0 && i < len; - i--) - { - if (s_isspace(input[i])) - { - input[i] = '\0'; - len--; - } else { - break; - } - } - - /* Eat stuff until we find a key */ - while (*input != '\0' && !s_isspace(*input)) - { - if (keyLen < sizeof(key)) - { - key[keyLen++] = *input; - } - input++; - } - key[keyLen] = '\0'; - - /* Eat spaces until we hit an = sign */ - while (*input != '\0' && *input != '=') - { - input++; - } - - if (*input == '=') - { - input++; - } - - /* Eat spaces again */ - while (*input != '\0' && s_isspace(*input)) - { - input++; - } - - /* Ignore comments */ - if (key[0] == ';') - { - continue; - } - - /* The rest is our key */ - if (strcmp(key, "mmpath") == 0) - { - UTIL_Format(mmpath, sizeof(mmpath), "%s", input); - } else if (strcmp(key, "restart") == 0) { - if (strcmp(input, "never") == 0) - { - mode = Restart_Never; - } else if (strcmp(input, "error") == 0) { - mode = Restart_Error; - } else if (strcmp(input, "quit") == 0) { - mode = Restart_Quit; - } - } - } - fclose(fpCfg); - } - - char old_path[260]; - char new_path[260]; - - UTIL_Format(old_path, sizeof(old_path), "%s" SEPCHAR "gameinfo.txt", gamedir); - UTIL_Format(new_path, sizeof(new_path), "%s" SEPCHAR "gameinfo.new.txt", gamedir); - - FILE *fp = fopen(old_path, "rt"); - - if (!fp) - { - return; - } - - FILE *op = fopen(new_path, "wt"); - if (!op) - { - fclose(fp); - return; - } - - enum ParseState - { - Parse_None, - Parse_Root, - Parse_GameInfo, - Parse_FileSystem, - Parse_SearchPaths, - }; - - ParseState ps = Parse_Root; - - char input[1024]; - char backup[1024]; - - bool bWroteOutput = false; - - while (!feof(fp) && fgets(input, sizeof(input), fp) != NULL) - { - UTIL_Format(backup, sizeof(backup), "%s", input); - - if (ps != Parse_None) - { - char *inbuf = input; - - /* Strip beginning whitespace */ - while (*inbuf != '\0' && s_isspace(*inbuf)) - { - inbuf++; - } - - /* Strip ending whitespace */ - size_t len = strlen(inbuf); - for (size_t i = len - 1; - i >= 0 && i < len; - i--) - { - if (s_isspace(inbuf[i])) - { - inbuf[i] = '\0'; - len--; - } else { - break; - } - } - - /* Strip quotation marks */ - if (inbuf[0] == '"' - && inbuf[len-1] == '"') - { - inbuf[len - 1] = '\0'; - inbuf = &inbuf[1]; - len -= 2; - } - - /* Do tests */ - if (ps == Parse_Root && strcmp(inbuf, "GameInfo") == 0) - { - ps = Parse_GameInfo; - } else if (ps == Parse_GameInfo && strcmp(inbuf, "FileSystem") == 0) { - ps = Parse_FileSystem; - } else if (ps == Parse_FileSystem && strcmp(inbuf, "SearchPaths") == 0) { - ps = Parse_SearchPaths; - } else if (ps == Parse_SearchPaths) { - const char *game = strstr(inbuf, "Game"); - if (game) - { - if (strstr(game, "GameBin") != NULL - && strstr(game, mmpath) != NULL) - { - fclose(op); - op = NULL; - break; /* Nothing more to do! */ - } else { - fputs("\t\t\tGameBin\t\t\t", op); - fputs(mmpath, op); - fputs("\n", op); - ps = Parse_None; - bWroteOutput = true; - } - } - } - } - - fputs(backup, op); - } - - if (!op) - { - /* Well, we can't really do anything else. Give up. */ - fclose(fp); - return; - } - - /* Close all streams */ - fclose(op); - fclose(fp); - - /* If we didn't change anything, abort here */ - if (!bWroteOutput) - { - RemoveFile(new_path); - return; - } - - /* Move the old file to a backup name */ - char backup_name[260]; - UTIL_Format(backup_name, sizeof(backup_name), "%s" SEPCHAR "gameinfo.backup.txt", gamedir); - - if (!RenameFile(old_path, backup_name)) - { - /* If we can't rename, just bail out. - * We don't want to overwrite the client's default - * without backing it up first! - */ - return; - } - if (!RenameFile(new_path, old_path)) - { - /* Since this failed, we really have no choice. - * Try and rename the old back. - */ - RenameFile(backup_name, old_path); - return; - } - RemoveFile(new_path); - - if (mode == Restart_Error) - { - Error("Server is restarting to load Metamod:Source"); - } else if (mode == Restart_Quit) { - ServerCommand("quit\n"); - } -} - -bool RemoveFile(const char *file) -{ -#if defined _MSC_VER - return (_unlink(file) == 0); -#else - return (unlink(file) == 0); -#endif -} - -bool s_isspace(char c) -{ - if ((unsigned)c & 0x80) - { - return false; - } else { - return isspace(c) ? true : false; - } -} - -size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - size_t len = vsnprintf(buffer, maxlength, fmt, ap); - va_end(ap); - - if (len >= maxlength) - { - len = maxlength - 1; - buffer[len] = '\0'; - } - - return len; -} - -bool RenameFile(const char *old, const char *newf) -{ -#if defined __linux__ - return (rename(old, newf) == 0); -#elif defined WIN32 - return (MoveFileA(old, newf) != 0); -#endif -} - -#if defined _MSC_VER -extern "C" __declspec(dllexport) void *CreateInterface(const char *iface, int *ret) -#elif defined __linux__ -extern "C" __attribute__((visibility("default"))) void *CreateInterface(const char *iface, int *ret) -#endif -{ - if (strcmp(iface, "ISERVERPLUGINCALLBACKS001") == 0) - { - if (ret) - { - *ret = 0; - } - return GetThisPointer(); - } - - if (ret) - { - *ret = 1; - } - return NULL; -}

    `t^ko`Xyd>iTD3}S9oq^az1B2ai3P$!~|LoJQb5{>`r|?niS;LRb0CQtsWfRfn0j#<1 zckpyhKlK~~b~l#t8i`4<@glE%45JHU{M^`Nf$GeGXzkpnK&rQj6bMF2wTB5_KgEH~ zF!CkyURAYJY(NZd1FTXQE2rF|K4PVgm)#()Z>*lf#ex-$YQx83&t$H-Nc)vWkHTqk zcFlB`kyZ$t1QK#aiy4bwHkb~~T`6b@sCYmbD#!`0jD7MosD)?*sty{)BGI-2)YbC| zx)^a{OzjA2^)N0p0O0OO7px^ubgEkqbK`**i4Q|gq6S8;SNeweGar0F8AgvYWlBIa z6~Ix78IX|vPdFJC_<^unoBeC9KV&-m4BlvowA=Gr^tLm=JrVfX+KZ0{JKZ?A7P_32 z=Qx8XAo%gB#Oot#`(~xy7=zJs`=S^1Te#bT1rLp$&cHJ?q|xPQ(M25Q_2ne^M3WlkcRse|6lwY*L+j@vz!D&sD>i0UIa1 zb+L~ayMX`|1UW43Vx6$`nktTq9uYmdcA@tQckT8C!&HxyH}qTcem_t4*)N# z9z7k}m28VMj@)9e!62QmjinfGG5oH~B6wlnr(bn(Dd$Hk6w z$Gj6`v-TM%>umXul{b%!HMq;3YdL0LK85|vF>@lUG=nWkWDX0?0!R5t^r1ed_@^lDFRR<+L@ zs`v!EIKA4}Fz=JlA*f*Ppo}qdqhnCSg)ddH*&c8mcqn{WZMeERJT^XILCkx9bY`_D zTIY={y5H?;-Xl~3F^EmS-=n6W*x;=DJ&7mg-Z+ePz_SBjK*PDQ5qxg>o|_Fd`>^m3 zYxGVEdYXp`Y)_mVe0c2i&P)dZNd=qZfEj`__&usR(ZJ{kgpkjI*?(`HR3> ziI(P#!}zX5ErHpK2x?e0IGsBm)=|h5Qw?G!`!jP2^Z2ku6%-WnfB(?fb(q7u=1mM$ zGEu6Y1S>{1_-R&_JR=^K{X-s|XOflY=k`1hDEjC)$N$6oEK5IuINOW?pmv9uXL)IH zu0LEK>S9cGg{K&Oo(W?<-0;1?e+b3{aWlYcoPzE2&`b^gZg$vAA17+~&$ROVUEnl* zgaLs7Mp(^PqYs@^z0<%5^i?xZ7+MJPGEa0AM{6hys9N0EUMm7Y3ybxKXK?CM=f?T& z_^O>3Jdu3S0W3UfW2tL=#~4mcdF(UamPVEK@;K{rw zbpFWgTgo=TwcF~tIp%73A{d9fw)F7Rq5RWYqO&Dyx?&qzOJc7f(q@XgAs3fOe=*?q z>q!q#h*1U(WQhsf1K31|2t6mPKjtr|yeXc)EOdtEnZNua10h&@@s44DX!u*GEvViX z`iLhQt~>Ri=5o@CC-vQ^zhcrcIUK8!jy)N z{IercU}00_;nY)3#=!c`fr^z=gC~SWUYcvzesc+RUATiHO7nt)rLYEV|Vu2FvdB28mq@xd9KdP z<8@uln994@b+e@5jl7M`3EuLh*J^xNQUtdj{nR2wUnD_C;ciqTL$Dk1EHX5J?d2Gj zL7}7mMQ}hN48KVo13TEvxGcEW={wP3pa&%&l6~z>y=|yZf-B?%m%d2h`VU5`n-nC&ibanu9?~C6ty~8ROUB{jV{r-Mf zLn4O#@=Wit8ZFZn4AzcVO3RO-@iSUW9u?})kUS>MT3WK+Q~u~EI862r-L3O|&B}L+ zJ)apdR_HtvtvvJXd0?-Co-m^J4=vI8CRzDTwC7X%z+4baVT4A$Rxdy1XiS?rAL7SIkNa}OHJ6oj4OX`{ zOoE+M9iNHM%kaAikIT-+pX>2|75*RiT>CCAaGwB(kwI(pgFnev!(xOxG9LSV90hafzGf^0w4h)G;1_RN;RG{`>IXga0o4 z?*}Zs_#c~o!?x)38@J(C;aA}|iQgoCd-2gJ(4aa^gApIU|MLN~ zyQLPb3~qlBm~KN7by+m|K+~j#G}#JRkb{|*C6V?aF%kdUk1IRyxwhlWBJT+H-WBZq z&Q>*HGkMaqdZ#qg)ya)iyD)n5Z&2M^@XUp~Btta!hn_17{yE~~R+Li)?pJrhmL!v8bye=h!Ci2q^yUxfcR;y-Bf8R#!I78|@9e^=pu2mWv78*6O& zKmC=VC*V|p{|z(RS=DYhU*3x?s`l;v0!)|i#9z@{86MR>^62vB*{~RBE~t|5e(fXM z_n!D%bD;gClJ-+ekgBDb0b@gzHor0FtS4e!FmAvO;hOhQv9 z_xRSo?ZZ>)#D7X0^cOnjM79i`^#owp5ZfzOKJlsMx7bSM#CMusVPemg*QgI$UguwU z*q+2oG?LMY9e7}WPex;n=&)z}OYLV=d$&I>>U*#D;h19_`E>YlHhZLg+x&J!xi8=2 z)YwPs-|&>Z${%0ZtBEhn!DKc((kd|pC7R#+))UP8_t^09Pd_F){)5Or2FL#?^0*sa zppx&7%@{!a2OgOS?*l|2=|!?M(KRPNZSY%9;OdDv{QI%|9l+lm=$Dlh`dzOdm+}@x zPeh5YpEG2C%j;ZOjC|-0PnD^bzXWFvW_&4?&HIss{<84?p`n-Q(IVa@y`mA`P zucRxp;*GYvQnV%wU}k+fp5%o$tiq{ylD3_z4|8aA_Bwlg+&>mn6L+S*y+TVsB&l*j zx=O!(%UWN5*#g`l{xC}gd~XRS(RG9VauqA6Rur!(7yf)w-!1m~d{STC&eXS8XjhA0 zrl+g)>$imRy{$Xc-@QVoTJ`n4W|aj0$y?TU$Bx#ww^iR=_WI;4>ucPx`u3bxCHOlv zUD+tSVojdnHKpi*wL$X97jV>|ZK9l(N3;>?zS?{e`S(~6d^QRFbGHpcBDaKN$xGH- zIW>y`f^)(t_YR`i`+*U#s3YG8LCS7FMe#;^`|_6UyZ#OBn|RAkR~@t;6fn=1z)}b` zsvBFT-(-*7xwVnNFXa)da1me=++rV__{826rl%i`s&Z&-rs=<|bZb9`m ztqA3;$oysVm*1|{3(IfcQm_K*KQ0IN&>#y7sYQ2NsQM^`thlUwFR@1x( zFk8MFajw`miVJJ8O`Se#uqqtVed895!rw_(BlNj1(ld@B@8INK@o01VDEF5S@{;8K z3p$3Ev1&$-XH}P24T(6knP>fO-;%(L+_4CdjH!R`u4PWFiwC_euk+Z;aF~H63!yMBkmd4$+MpZT3Ap{Cn>Pp}Cqn7F z-);D=>oX~Qtuc624e+oD%z+u7K8+H(_0f582{((&E6g^!h(^x0Ipv_6b5P@=b0;r z^Baib9+;-B5(u6IDHR|E3J@XF@&Z{5{&I#M4mM*ofZdNg1$n^T@?LurjM_$3H4HGs zeu-4QuwKlWFm zKIQ*MT#6g(HSmVZ;VxbdREu!9i#JxAIi816Cd0^5G$#j z=4sv^4`NYB5gw_;Po+?~_z(qobX!xxN3hf=p)Z!z?kAr&ci3&l?3FGK7UM{7x-pR}qI2-u+} zZF$lIs_FW9l)ZlE!ZJ;&P1G8#t00iz8rhIU&POy50!vVqbly2b+eWiON$Lj%V0aNF zbT%z0>}o$+s5(c_?qFug-T>@%h5o`&;hKV>0-G8T)Qs2^B`UjcB&YBAsEYiF}wzsMKV;R-*we21_((m#tQWb^FQ)O zVSXO<2K$ZGnIR4KH>;D7aBTbXCU9(-ym%6NmoET`%!BZj<>W|IoT_S2pT|j;vuFAx z<)cK2zQ{O-%qo)6e=`*^(!rSFewnH;)~$9#RrB$#^7xJ9fu{bI-RFSMj#=gkFJg$- zXgNyR6q$N3E2-CnF3$L@#kotvN+{^VuoP+(%@g41m&pb8u z0er@nAF=(#$ZKU`Z_RUUyK*I@>~0l9@$7(vH$29X3x=atA6z5$JzXI?Nd9zKYBk=|DPPTM|ulPX!t}H8rl^* z{;mG}*B?y%TZ{K+>=Vdqmxt9)?r?v`TKy^39{VGC(4X%^7>e`b@t}oml3F9tVc?LG8pi}U?{6%a*7&AlX3FJ5J zfsl$3Fi>7Mmzr>gbg?`RE!`e>omd;FU@-10+DeCrBk&F`OiW;9K*4D& zfPX!x4#kQ1JswqAns_uHHAR0}@Sx)LqHpY$DB6dA)z}-6$#Z98C*6XkmHdTkWzw)& zNHia%CO!T!4ue53bN{29!i7$U4h-)0?kO)tr<9=af|=Q9mKNiWiIw*vejoM> z_Uj=rNGEw;?Fgn3=MHZZj21={_CY)HU~L|kGp_`TjW}BX+h@>vqnNocv^1(h_X;f1 zJ(s!(l806ZS0q6J!T30a81iGnmUSG8|;a<^x*Eu z-pqn`vuMMd+FILZ*t!?6Yf#hA1Hf1irCeG*O+M+b-_n1a>Ft+YnL2x&bh+mx@M>f+ zHWlD>6ewgIDsQ#~?jf^Y4|K{JX348X-$zAuEjkw($kL+Ei*y@bZ*eV}v}w_#O^a55 z<>^1?N`vfML>jkQmuBfvzblNhc68>@rVg8yJW=3C>(RULF;kBoBstQ0bORIz5b_eV zBb>~k3)8igsE;2b>e6{vNM5*)CIdW6^SW_QWxzK^6lQ;E_)9s|;_vPCBm(o??V}$w z@*U~MA^?o<$Fa`@vXA-rm)Yfz&kjeky*%jT0~}NYDy)^NP-WX=GPd1fqsn9{XL;bU zn#OZU7~jsI9NRDft&7;5{+91~saSEZ2o%ee6|V3Bp=G+#m9|RNqeP0Sl!s*TATA3T zrOnWE7BXZc@}a2aJD#V7k%(%mQH>SI=^)^$jtmD!BWL13P$AM$O`RB2vma(t8JR{S zQ*5*h7Ie#4qee4!Y4^oOP|?@a`J$4DjTZe6^(zU$q-Y$-mPH zP6w~X!8;my4dDIR!SE2s5~$OH*Q6t@Bo3xFA;$~V^_bvQh@ZkDe%#4Y`uJZ;?oD&} z|JbJ)sqlIuZ7d^Ss%1;IxX&V`&){-_YDmy?~i^J=uZ|yKergV-`nI(;GszJVSqEqcbgTAXNpkp@82j!fv{JT+P1I-HU8_4 zLf9pG-14vh;GpM^opc`2I>*&ko~+h-N}{(49?P(52y}bIY4O#r!apjiu>If)O-?Op zuJHwyTkw@f)BO&XuJWuAj^U924zm%Ne@Bn8_t>P^yQ|`>MOB`(gqmcS8dks$~WUA6!&kr01>U5)M5Ai??hORjlTw`Py zR_gr&{q()Oq8o<+$#&u^(T(3XMuJC|XMR^l5k82RiWSk%m@f?7Kvw*`cp4U!_y^0m&gjI2{Sdz~J zJ#mJwhl{|<&$k{`4B@8L|7cUZNWO=>#u>o6euk26)4ry;t4_jN3W-2@R~DeZMbiiY z6Caya=R)2~Un?45zooizBH1Pg+`^eS*P0`nFBsOI9i81-4B{IG!tbnQmTAN9$!K%@ z3&okciZcg8eU`cZ*5O2ekYC#)`G0(s^=XBn%L<*HZ>nyP<498JZF_*ex!r@Qx;-wP;|VTuXTT~C z*E99URxt7l{sWN3+M{0l)`Qe9G=`@6sePBbQcEAi%b+6p+fLv#d;jY%Md}2>Fz&$~ zw8>?WYLoYmf2D7c{EBS#PVmhUv<(=^k2e0BCp5SuH~~?6?gJ!|)b`SLoH0z2Y1LDw zbdFvr{Z*i8R#G1!Z3F~%d@-6}(Z^K@)UCO8SLR`fxf&OTHm zZ$@eI@$MaKyjF&|Rx@qYpq-0(pn%M8sFuCyp37{g@YZEbqU6jRMVxhR*Gh;efkgy4 z;Grbo!}_a?;;h|2+Wd6gS7ct9`YGy0#2=+??N$=va%kLQ>RoN~NQ|PCEWtVN-sPabMI?z0s>(BY6 ziCf9APuP`&@)L?~{3DI{^mwjYW204=qLuBfhI(I}q=xLuF6UM{ZLg%J%*xMUx+;)` z+Iw|}My;X=5j2rq?ypwKNqYWN^0vey^xUoL6$ALsiaUKR9yHcz84feeiy0kfmdvbL zGTSH|GOVvT!Hv%~KB|q=m@AuXfyCH3Cw{{rV|HS3^TGbe4iG!-v!tylR5&?jRkp7e zrli+RC}zpk_sw5)^=FO39d-`-8s;nRAZ&>VcZOv+(YpKQTi8KnDKA|Z5OD{buw99X z@+1aNeuJ&d8q*KO^heejURm5$WtT5rv|_PT=#)qOS{P1+f4#kmc&)n<%L0)aifBJmc@ zh(L2oyjfzYz}vuAw%UvU`)ZPvBM+*$)H(#rjnF5SG*d~uON~2-^JB20Jo_BC(e?rf z*A+KA{}w-w$vn(kHxy@m{;TStzrkWT=Ch?-oMWfuDC_|j_a>aY*_xz{Cv~H5!fh1< zk~BWQ7|=Zi$k&@vOU0T(i4&&*$gVV1r({Vc78l5=n?V6G%r5_xcxJtne5X~W&3UKa zdBwB$q>}y!#5oQ`9`;|{_VT1GXYz`irR|RtgMI2NLQ|mg3G6e_q+0e03TOPjL#E;9 ztw4aaBWo_NnMJ&z1#Ldu;KyhULh;Mf5$)EUY{3n_rluW9XxHAy9@gsNVfjvj-G;`8 zqq&rxTO$>%lU*z7J7Zr94s)Jh2V1$Y;A_oZ*yxjepoj8xesb&ATD-sR5t5ahYJVt{ zIEEVzzLtqSs45<;cU5$?KG=D6^`rXI6n_lrqS~8xRphR&-rnMcP1mj(X%ugXP3~A( z`6v;ow-X-w(U$mw#iTgCsf6k$yq+)5?zHndFl_j|Fc;h1?mR{kN@wY$&mjWam41uE%8usp3hsJfc}+ZNlSdNcnoeU$?@7| z2>o+RFHpa|4;s|k+5MXWcd8&FGOFjUldx*(dqmd>L7oxSt9t;Ti#x~(e}Y* zeE7&TM--YFkW(Ma4vbK zu74T!f!XK~im>sjH~pFu3=1f9kpIdfR)DS~m$tT29Q#Ovw2YPktm zv`~*mFPgKc&*-Q|G>Pw4tGnmXXfifz$1-a!*tLj*nfod-I>ovG_BNkuKA_kNLTtCz zMeTz7Aiay*r!I9b2^E%gJPGJ82 zBH9U?i^)G0L~V*>{rhYh8mrVuPD~B?m#q(F8;5N2L*Y%{FOB6_scoLT%U3vQDb4#0 zC+Ne_`fK?Fz1w{FkXydaG#>(abiWN{fv~|`!CdGFd&5XT*i0P=ds%-$1eJLgJWxcI z`S%vlG@1%DeML}sCYt_*F`huCnpO=#{lExnrl=l) zQ=8<4D8<*u?^mzNy^mXy{ApwS;*_`_WA(#9p395#IHw5|oqJ%J+yT16(217`k**;w z98e;H>aKdriPB@O+3CGjT@qt2`u9ZS9>5-4ns>ll!sL*68Q z&}Inl2T=u?o1xC)jJWZUfry-vH<{~`}^K>iM-S$^{JbmyyJ&p3D5+$%^qDtU5 z_uM8+g`{94Q>|x7#90^z`LDU4x5@txQc;Yz@;SYUWAKxX{zZ6U{-@bwB(-abbnFIQ zN7<(xWzkLHg=_yk+sBgV!?Oktrh&lkSxCs*py9l8AN+&ReEgxaR)pM*4o!Xp_tf?w zBD`mA@-~Y%ctc;An#$ZXzaS>*qG59iR$)|pzW>>L)&)|u(^X_-DV_S~b=I_ zcN1gm_CV*fE%5faWuDWdp9%1i2FRJ?akhwJY<=t>V|0NriCnOy|X?C&8!p5 z0iG;h#Jj`g^Il*wS<*4y$6XQ!(>`l63=8hCU1W_v8G#5^y3g6VVL)Z-Jbruh*p#i_ z%b(_K-5`HjyhJeH2W`#4B5sg4>p=8Y|DiRR*)o;C908b}C(HOA=cc)*#fw@Ek*Bgk zJyS6N&^UC&Eon?id5yG{|A#-CF7N%RdzrDgA3wW|T0F==lQPCFPLYlm8$Td( zJNlhz7t#$TD^^@4R)pK;B~3BDN*}%j-6FMZz6FXIry#0JNBihpNG~y0571`f^!!Q~ za_W;GI`&Q#xdh(EvEt1GbS}iv;%r}@a{^q3ib_3}y6YB~i(4nhF6d1?G30XDY0%l2 zL(Vhe+#C2YiXAq!*3SJN7+e)#-}rM}_F=zA7Q4-x%89&dHW}`g>KA|B z&9dg_PqfbZveeq|+B(}&V(Q<#td#%b@28`(oMG;-vJlcD{D0enZL2i^|+vTqbLWa+|%f84AtWd=gnlbY6GbDx#I74&5@= zwe7M@_6=25s{JyM*dg9bxGO(6T_CWFQJ|uICAs=utkimR|Ebw9m4Qyks!1O z|0h;*Sq0>nnmV=P#rn!WIFYU2O7B+4*vyn+U9t2wmfjZlWPv$fzp0IH!RZ9fk^HMQ z)3t8o^YopssZUn1FSS80u}H_oA76XxP_hyJ)NyyMD!F61L0_Q#LFuV%E58k=n1v{p za%s>NVnGGdmI7mK^-kqvpS7``Tnk#dVsel#H4T^@U^SJaV;Rz3H#1;34PWQ%i2af- z>C!OQ@TqmxwzE0eup-#LqY+&JD;qnh^B3y4t(5YNYJr4A>=e+ zouvqwaB#mPwe)_-i&KIl^O)W}dLhPHw)zWtXsn?DTufs<{QPH)KA=QZ{6yA7tdDHQ zOy=f_qz<}ud@`ueDz^$HEmC(=VWoGEN|NhR*W{0zu_2PWOHIB;FNJZFN2Q<%LNt9T z-*l&Cj&NbjTz~N9H+v78lEC_YTn-9j#uyNx;}&*;b=Fuz<7hPXe+@Nw%Hu+55!--4 z(5?05`EQX|%Be0n!#AIGmj|Fm&+KDfwsjcUftf-V!bU&qBbAFm6kA~%LAv%rbM95T z*^r73SLf1svKxmO;~A{hMs*70JI7bN+(#t|abz0oiN8 zc_`U?f8z+5AwGryeI(it4&TTF~{ zQZ!LHqRk=&uFcuygklXEhxtw33RH0xvFH~XVSjH{5@Z{9+@lo|t86@)GKQpW^#u*{ z)~%3!)wrNxRrnsa6DDJD-%waG3J2zOo+JJuB`p5)G|B#=9v&hfwV@`frN0`&Y z*}4Z{n091Y4}}&CH^geA8$YW#)jmA6o=gAWX~Xax*rk1MF+`yczwr=1$Y7bATt*x~tq<5x`;j^%n+3Gdv07u69bPk)(Ab`O| z^l4(iTqjr*NNO-IxYpU)O#8hXGA~aZNgE5`!QIgS>O%y8@d8DW}(*2f$sC93o4n3_4dcMtF1bow%z<=w(C=Dd&7#V zweKeF=3TYf*4}K4yHw_c*I#f@O5~o?rc=mZd*x4N8-c$$8-6+ydy=RKU*VnMsWoN` z1tdOWW7{9Ih5B?SZ2}>ILnCSRL3hbh?vz$Wi)tQ6p)Pho%i^-s;| zN%|{1L64Fb!EAQgUlQJqD=&KEIZO#(TSrlCo%FRn)?Lbg-sn3#9&sN%Xp*D<`8#K^ zUycX#UtvbiG>E>JmxomTb30m#$n}h2OU}lAvd`OQA?|8=>gZ%z^en`(TyqhK}9yhEgcSj z*D3(fe``9O=E;ZYnlyxPVi9nHUKs+s9maEL2#B;Re6iZDqSpM`2W9-@88V)M$fcEE zTR&~1J+`oD_P#|+e?#YDFh>se*Ug`EW|=>M{lNBAVn$92Y|Va2f%dh=aUrWj(M{f$ zK`S4{H1o&f6;$Pdj7vT7zTEM;apm}n*0>c;VW`p(>2+tD1VOQmWW%VG2smcZWJMLL zJ(LQl9%HWju6a1Tk_>#Tuue~kc9&coY-r>=_hHx`n2g1DYIZty$ElYpjKI|9E65*W zZRr;5Ne&cwTC9r^dPNI$FIcGKI86rlUrn%37xWW>-ea0tZ`mgOHL@EiSET{$X!@s2 z5FdUtJ*=1MI^bDB9ntj8AS3n6FRtgW`QVFv59C>-be6&_uE(^6utC?wvh&@%fK@Y_ zxiG`Rs~G*L*5hoqW2nQpIqY%}A3U@k&-Y>ZW)9IL*3NLEAy!=6F8h@ig018WeO(kE zSf`ZA5n+Cik!emLj}V|Qsem&F<-_^kKaw7JIGTSw-)#JehcpIWK(y3M2n`-?NF#~? zmI9Q#2zIKCmLrn7*kTTvkE$^0s|BbmW2P3cR39r+3&tQ1Go`TlBm+ZrOxCn7Hy-{O z-xlwCju#qD6PLjZI`Hj@9<%7M(LClf5{=Dxf4Sx(i`RZLY96Hi-;IqoP_o}J!V=zRL1`n-He7taRuN z^cLb)3EP3{a+YP(xOm4PB7lZ4(mgYltHt}2$vKn=f7DRNTUT+(7QBHX>x$F2Pl2*6Uhz6dTXfO|{KS$B(Pv1hKT1cd|oSwCgat~YdT6xd=vfTpE z;@9YM-Mp(R`?;NTyT#jPTCBX%H{N@Ioqv{wRm53iY5~=nziB40?-~DunI$5#*mmb%-eOh zEt>uaX4ljf8|*~2cl^%g^bzzaoKbPAMXilWbgxMZqC}Tw1L|4Q5~Cca3k$ zzNig~=*FK>$_7laOk* zw|UuawcnuYK}{DO`&E~sYUFp7b&GvZoavo@l-w>Rxi7og>h&&Tc>>t}O1&C{w@jmF zoCR|xz1pusf0ZNKttafL`H1(dayX5wal-pQ(8sUN4QJwz|GCnPU+rdqe13(78fnTI z6*02nI4!|wih3@vbx|!dQp~KwSj{w}qM%I!?}R&jTF}yV`uj)|1>*ae9PxF`&9-tM zwD;&8$}clXllS@msppy!wqvy&ui6?T#vhC=cCVs&66saxogaWr<}|o%M_G+Wb!;0a zjm9ry+OTvpc2PydWXq|^4bg8H1|-dEt%|mza>j+5OX~1G z=zzo5iPZ5UO+1^Bn^ae}`j%B{+l4yeTX&nDyD#RsWX>6LGahjZ4f7dLG`B@0YmDk)9ZxZ}!y=3b2?0>h~Gkz|sKI8J{ub&Y@PLnQU zbM;6NvNnM;Y3pB3lRA@A|3=O(>PdPlJ&{T>pfTxDU!av$WNU7_Cw|>7XratI{Zkrv zZI86~r!V81W~>;Jo{eSL!xsJCvvy(D@=oWE@0!fLtxC&pkG}$l_;qLp zxwKN6ysw(VC6R)+fiOg=5Nybvt-_*bpIQu`S;Hq`Syp3zSE%l}{vZ!)kd0`jJ~sf- z(EclYqECxJGbY1fTP8T!iLh>>Do3)$pEBWYQLp3t8KX~B)wgtPQQ=jz5M{1BYqZ|t zt?~=UA`*ogM5L(y-uNy5|KwhW@>=+ryRSgwnp$e20Vkd7#dsXgi8u4?Exy^f%qC?B zvWcZ>joPC`oM2E?jXJOav%=zxr1l32T3J*4Ug;M)Z4@XhZ539u$@{xc2zo6NwzBg)}>Al0T2{D4J!bnnp?au%dmx@)hdeWR@qm!DOiV^v1O`lD?qSV8!hdXyq+Yxt$qpNjE6SK?E73c4lrbl& zcC094?r;?ZAt`Fs^aBNx=9>QH2n39nYx)%m)(!&TnpmsPf><^3K0(&bN#-`8HN5oG zd{}!vHE_g;?s^YfI<`nZ8i<_3@1l9$?@xc|qs+9jA#ge4Z!O-F|3gq^$y7J?kuPV8 zNK^bFmRULDY0ciBnOG9zP_DltSM(co50ilqh05j^vGzRgs-+TCOSV@}kx=!%Wf1(< zD`;=V*leH!eVbUoJ1SqI*`c^PnC%u5ZgCwMa%{_xcYNDX)-vtzctdN|c#Z&LwK%>l z99LUpwD9`f2SX63Z}I-Zs*h||3&k^fu03zSe8)Hg7CzQU44w`5 za-(e$pzZT?+>}Src4Bc`l#DP3X#^eHHUOr@yTG&`83A@|kULojf{`%u+oe4vpP$6< z6ARJkynLfI-ru3a!p<$I^AZH?pD?{% zlfnC2Q(>y|w~)0gd5&d0J-Rh^AT{w3`J7GAN((-b>Rs04-RtLOB|2H2ynx&_YtQ9A zrvvF-oV2tG7AF@JRS@*=D!-rwB6y2~znCT10#}$Pmam-6(mn-TvudOYLjHebFk?Ka z7?i*+o5& ze~f)&;ge#NV9wAM#A$^va`OureV zGac)3%(QvLzOT8eTe){b=q5B_obh;M>ZV8S48Wr}qU)TLKn=3z3qykyQUr3F$}cceqS^ib51gUUZTqUzwaHlgt6(7h zfIq@RxG}jAHV1by;Ob#}vH5$7s(Ji(tQ!2_ZC4j3`5~G=NLNaa0G4*A0P4cP5il1U zqU-X_lIPFfCa{Tbm7i4z)ae=vsw+p@$n83( z-S}QI2XT8e5i_x!srH>A@}awkRkJAz6(=sYK-(8)V>=sS3)WYTEVMec!ywm-C#kNN z=OEILo6-PznI4TuqtlLk<7PUiiJXmXE@0=Ew+lND8+IPfwC5uKE;52r2 z%N1R&iv{cevdN3x;A3ZZs+}z5qU6U+mwgOZ1X{YAmd?~~P*a}gLIdpoZxMD3Lw*V7 zn~nF*BK(x+&&;3UGA#hCyx%s1fZgWYAbb}xKju^NZo=U^%`4Tu-KBwjZ;eX>vAT~c zchdv^i8nV76%W7hDNg@l4xouhMb(-|$E@wZ>;$?jP79MxtJQUr#sVkvKcK)O%XFkQ z2k?6qa(Jz1|DdP7^c}qkuuCQR?l>hrHeiQ5FOCoEq1=1#$3)S=A-~p$m5zQR+{Eek z0B8}Gtv^!50+4so0U{QuPD))#DR<%~7U`RCS4~DA-#PvL%+Lm%sG&^Xi~bdlosHvN zt&z^wpYMqMf(baG8JwTj6^nGn#&^Vit|Xc+b4RtLD#x#6?_l3i{$CTgJB_zs?YPjm zJ=PA3)pd0A8?i~+awPN>^~^n5|IYCjV`F|exztisjB)oG+Ll_X>d_qI`Wp|kdlUUe zW$1$}A34G{?j#=iM&(E)x!Z1z*E}Oc$3t2sSANLnAA@bT1|P(Oz0nW)A2_N{pb9oP zi1A)IvW;WUm$yz5X5TeEVi)0noSu}pR~PIRJ}`KK%LKgb~fowWry68f~oORF47 zkR7F?@{Y=pPw*K11{VO=EoS6`5F%IQV*6PI_!@P&TcLB4Gu^pZbozL686b(Tta3z36k>l( z|EFbR5}MVpvh^RBy-Al(HwnRU*d{pz8t5CFOat7I|6cyD%$kJ?(9tLL5AKT6Gjx;2 z0Rnf;-6XnBE#31`Mm%u>lD}Gy9V2REvp2`g65xHXW1CVq5Xo0^>G12nS?9PUBL6;L z(fEN&k^V5=;{AhrGp#DWh!Zx{H1sWzN{^tND}YVjpSoQAmDU83(EA(5ysJL&o3PkC zWcD06LHtSs8?Y9=YaSK9%K}*RzFFqHqIb?W?IkQlD1qB$M4|I|!HN;zcrnxQmWwb` zd`8n$n!D}EB$=3t|5BSBCV3f?bU@ zoz;`9YiuWcH5NIe;J3TOaD=tsI4&tY`e~@t$J^`NSvon9!O!(!>bU&3z(4lN_=WJ?!jVud^b@DX>q&!6fU7ES75MHRtwq@sGTBy4 zc2MeYb`IdvYC>$R#Su9oWN{oVGIbn@W^n0HGo(mJJc zaW&anC%s#d{?}YPHSm!SXMcD-X|36O$BP=WWaSgg3wWILgX@3$gS)tHWhR`fJyY>j zpmwJ9dBNXoX}u^Uah8vYsXDy}s`w#C*1Wg0!rp!rw}nE}XisYCG8hapbgE7d-iz?c z0%BZyuRCIUR~m@v_Ue81_Wq&R@oR0bhGrt%eone~-9onBR#Q{z#i?v<`a?V=qAj>r zMw&Uu!f=?iBwKe2A6j(v5G%!4ZhJ=tCS#U)9p&T@7ejkEs9H`J9D*v@HFLM9W6P zAb8)$%tCT(a~Oj2Rs%abF5NDNZWotez9#k5FR$`G3Y(B;u56SO*S4@0jNh{7U7@Dt zYg(o_oV|UC0_ZU0HO%eYP2L-IO5V}S7pQ4Q`d;YlPZ#ud#(vBavJ6Bru?gsrYyEMi zbr178*SNd6?Wm@B=kd2L;}(k!b`y@q80jDH&{73;ImskXo!&=C7;8Mt`+n%?@jqE3;vXhziF#=viH-1yZ zNYo$y7swdsfK>~0gV$5!nkMg~&fc55X~-XWKx+OdEKCsAZ1yy~3*%HW%}TYs+&KRCeO&UecVw%L1!&8Bd6;J#`2+YW`F{aJAhuKfZ0 zy3K-nLeG=>^X~APY;`YBYclVTbk%KBRo8MvYa%;PQUU!fZh!V?NH0|(7PhbADmv0Q z+SJ_Q{oyaMFm11y9*r3|(SJ-5^asIQmF~SJ`oL399LospsJv9N$;bZ}w`vp*yz-t6 z+m@tzJ3qIWZ^`FByzvJgOhn$ZqeHLf=Il>Fq?B|7_{}|6i-k{2i8rt;*{JQk?DbXI zr-~^t)q9ofuOGs5BD?2_qsg*${y(9hyp(-PhRZX=jn^&@KVs&KaYQG19$ zk&p4ThRY$lsvqa6bJelg9mRM#%zOejrSs_t!tRB(-UXN!zOv>k59N=2qDl#uk&u1q zg|C1hbf~LZyuA}X<&J}rnTNP!ypQzKvkZ!XO`T@?J`cwd3MhV2S*X_ugZ@foU^<7U z&OC>wgW-YSYvOxo3@nr8fUafO6P- zc3FLJ@#Bp>^T`mr?cQx#%k-<{7xNL-=UC}L$7I9lyP&1(pDNkJEUH@h8zbpm>*jOU zDy9$40)%st9hqADbNy2Y*P?NA`FmE%m}FomoX5+oJzVW#MS_Ww})#D3ts_+x32n;vp0UujxH%7KbD!@U2l6*)K0k zyUc`GVDpv3dy|4&$HA_Q_&HpgS}Dqf;nEpO_@`gLde1yV2Fbt!W3N^I>q9+852_SfZMb zs{UG4-FnJ&_o|Y#{pQq~=+^uDc2cPCrEsQO3E8xMGwJL2#oL(QqobdB2Hum+>1AqR z&imJuEYQXUHTt-<+P7p^HTichd?44YRjg5y9t~G4a)UF87XqZxIpXa)OKnG1AgyP@24_q6T?nF^%kx+1_xragT+O z801PF4$!cZ>z_MeS5gas;PR3eQ9*p9W^z{pINPmXUHRl5w&=Cy&ehqp9-@zT*8g~A z2pmNCqevQ0b7*CZ;3tHm+R3nu<*~PqrFLP@9n&H6v5u!VfF|X^F^D`^%Em@g)3v5v zd~5QY9Km(Hzcl=?S?wu|Mmr`avhzB|fuRH6iPF%y6s_$e$R`3=HKWSeuNGyF^8462UyV&sK5!tTuAV?06664i zv{9h~9RewD27Fa6NOB91U*LRQ2#l*rP+0klK7hl92xH7q?w=LI(7=9{YLOq9U3`{-Y{&!e7yz}hA`H#OF_06&yn5y^|6)d zUQJfKAo)#sSKzL#hb{WODEgUiv(C=u^b&pibB`Kox)VZ8Z0yV>0AUqY1Xn27Uqf=@ zG8?aPRAueB`Y((#l-u%4E_HlP$GHzadT-=j`?FaEQ^WyH{f01W1#&)nt^sD)Q_K zjWOlb_Or6xDv)(&1+8%On`K{IwC$M*ax&knm8bd>Z>G!~cH290Kd$XFqY2`j!t*t~ zidy*Z9&LyWWV-d5wZu&NL7s_B+U$L_+E6H4Ujex{nK3ZZbDz2*4=rnvWJK-(!RS`$ ztijNZp*@%boPCadL*8)nvT5Z_^_FMsA-^kYUl%n_KJ#Lxac};ERtZii(+JC?9}?i4 zfwxL@+|M5H*EuC?pCNf(IAfr^<}j=Wz}weFu}N?^au;SO>)xj&7q|>3{RKgW3+=Bb z0;Ih`F5-`CGLbxITkN}upG-MkBpQN|^ML}F)N>$C`s$qw5~!z_F|l&#od5w##xdm6 z0kMSgcF;aq7ZiK(cg)?x2DYXH-h%8~FZQAb-ZxQZ{X1+o&S&L}SjV>ODZpm=GSM-< zazpZ&(MfR`L=>6C%3&_ClYyv0HQ5yt*()bA>HE~C-2K+)J;;`UCch;}gUObheMeze zNK&*$Bh3voA#uEVkt8hCq(W`lSI)7U@JLPk4p)hZh?O(Qqfn;O09a9q6`jjz8)H*6 z9ORJf_Kr2?8ysERP-Q2y57;YNDKL_r;RlpbgmD)&h}pRLr`1Z>(! ze*=FLC+vugF3INfIn~$P+4yg`Kmk6KKbf2YqZaMAtZZg;)|8JXD>NTTPMmB)&mRO$JqPNgJ7q2@ewMBJ@)}EWSMjRN-TF%rn zA;e(%F1}@Q>s(PphZ~dpe3#jMcLk<%?H5Ma2e86fE1cTL8JlTX1v)okMk%CK2N>&v zsoH^zVC(s4)8R%QsGTbt|zG)q#84 z(MBdmeg{rT^WaZ#CnkVxXR{6%J5vP1{VnDZk$P!Kl5Oz4oNX=?<;#w;B^IBH9dLxr zU?`gY8t5_7S(aF4vqtDoR70!hf(yglIflD3OI#ErvTqK(l_%zsv))fcty$E#cM(2y zxdg4YVpYinIb&A{7D798>qARhz4zC!9~rrdzTp?9P-ou1x=%)g5h5sQm<1 zyxQ=OZhVN5Q=g-s{Sr^~JCnXm?P%P~Nk2Vw+izOGCJ^+147fF$Q@%CXd22G=On#oy z`qPxl-M}AiV7|gh=yaUdY_~F}wv}hx!xklm?kUfoRot0wrNY4kpvgPlHFM;X3|{`t zMGCKc?TqRC6e(%TM0GYXGtSyw9^(`@5zudM-F zFB@{zKUf+13jYTA_rAR=L;s6^f6Bk-`B(YRD??}V_k8{>;NLv{E#u#N_!p|IEUR?? zl~-0&R)#P7;mXhm|IX&$IR8Qv4uucM zcP7vKNl)|dGdwTj-#z4cCx5Tv-^;^Pb!-{`Pybi0$BJXaK}zLOM<0Fku}A4Oa?G4# zkDYsL)v?D`zm}Ekf0y}h4E#3+UM~h@4`R8dP=BZ-#IYbg3AVeab~htf)X)SobMm)Y zmN3x($&k4cC9O*FiPoLPnl5XuY~}d!`~GewmK82f;r^?L48#(;ss*=yoFP0@+Y+Ru-+1u*@hu7-)L~2u) zx?|u2f$4Hauns?j!VBF0F*B6w?x0G8x7 zd#~Gr_A3;AWbL((1r_V;h{t6(<*;hR4u!e<0o3|D7gB@2iG+RTv;-fz^#N@OY>1|6 zb9zT1I07OLs_*E{;B+egacX=isPSRd*etlUIX$z4=JRB-w(aLrb@SO|;8P}SpYm8i ztA5FsasLY_3wIj;IbVrIN)seL^U;audpmZ{eBVM>!<_pd9$gMvP=#ZQYu z$>XMPOVY`nze3CFdCWmI=S6~oS+{WfVX7)pCwIbNS1Hf$7nEo^g{q-tapHH(*2;aa zOhzoTAR8Ml6VM|2C5gPnm3TyQ)Itq20kSD6_V!hbh}4>5j5d;zX{?8B~9S9p<2Kajbu?^B>BA28)#916_uZ>1uR8e z2cxoYAQ1nM_#s7H)6MNFtuPuPr%D@hqZ?E?i`r3T)5;i%;FL-&% zw~>!uyCXgJBQ)YCrtsOtX@1L3d3)h6*8Ihv^Wi5YA9xEse7ocWZ}uS}em*qi%oj-=Gmt8Fi4Mf}F^1)G1F^e9kMTl7l=+W2*R z$>#KildpW*HmOWd((0Ll9uOSZCAh(I0r_(|b%6YqmDNkP-Z4Qe)b65dM?H_;ADjnC zFtxS-!S3dji!F-&{N{Kb(>CR(x5c~loklt7-uBwK2RY@^N^kOV?=ZSoACu=>d8}l+ z`7}T#*%D6|A1-2e{6R9>E*BquqK1ESv8v+KP|zWVFz-nRCI2QLY>@vUAG$vi zZeZ7%DUr!}^h$^A^;h=Cv>sAh^vmXuoSOjj6S}PJh^%FwA~LmZgHN1jXq#I!9L$)J z3z$s#ze+6?#|$Md%5kr*-v}5sBdYYnm45-UD#abw5=Pkd69b=0yq&lv-NQ65far!UCFB-gamuQS^v%AvU@Ya{7cBDst!YIYV z3`8#Hv7yOv!Ku2%kOO`rBe}F*?feT7a_cNHoSIm6$6MG@=1x(U zzy@^g>at$WHMCX4cLN2I=R7{ke^UwZO*7fVzA6?|@7pG@d?@fGZ>vi{#5gFE1t@&{ z*`)@>hyyk>M01u=gJ@3A+TVwKs-t^?^jSmqayL1vi z^gSlKg0ox-{D@mSH?^bKjWNIEO0oabFjx`!gui5CKbRa<>@AW5&jiVQ8BP6UB$=NWt=aYPPCdH`wHA`v|nDO{UQY z-YZpolwfk<)V}&eOVzJ~TTRMvy4wOk;;!9g9ln7#ohx^?vc=qgJtaEmK; zbT|p~B#ut{PsFDIrbvtTQDZKMjj6;^7|J?=##@#G8)WX@3&QQfJ-m=Y~Dt6BHU0~xc)KHzsxv9U}t%?N{aC_!mSkh!>x(m=9>I9LsDTf;#cqd z;i}HGc1yMy<5`xl#m+sn$`-?PrJSMDV%#w{xm<}5w96YLyT!IVvE;L5?1c+4ShAn# zR0+45*V@`Sr)5{@5H=O+f&o(5(O-X>O>aPCFb%NE!{(Q;Xe4)sr;_IxXuA?DHB^)8 zg=I|6HPp+n6x6 z!3Atvo5QYr$4g@K$>Xe{RXB^(TfZ|`s@@I)f1~2z%HpFhf?ZQRg3E?zQnJ()Pd9#y zVAq^9yXIt8F?c%mOHnuOOoEv~CuK_;f5Yhb)zZ(w`HY?x_IMn}Md(GYwp^qlc z=lAwRgx@<8wfT1h?k4i+G50LCB*)9J2p}_jFRc?vImU<;=ZA8670H)VM-_vON}cDD zOCA-O;u_u9O@2kFh;GcPq`55F2J7C`^NVb^bnknjpK3|ch$4(SfpvFsbH_NVr_{bzEEw{%+n9+jyg$Z97O1AiaR{duMp7uxtQrqIsK!SQ z01|*_9-N1AyF$yLqsH-(=g1=$vuPL@p%hzH@()nThBMY9hh#f0$j0{Z)Hk)x7#sOL z%QadAj0n%828{0Ps;9y{o;NdQ025E+D2BkcCgcAw-6W8$CX*%zxPpPTWz(N=rUPrs zB<+J;_>rrzzs4UjEXm?94)1`s#!nZ?1@^Xf#ZqoQ#7UR?i8xk*zA}ajJX%Hn3gZ_f z_0vD$9kone7odob3+zexCo`+CP@0MDUFEURx{6rnQvRLDzYp>+McQuuy}-YR`S%6V zLdVSVUs*|dc}2M7z4EB(*Q4z*a`1%wFaB=)hP`WZ!S)qbc~wq(<1|$3V#W4P!a;lN zQpL;eb3P8lF~DMz4R;yml|xFf3uN|8@{`E=;gTC zEq#zdsYoufIllf>4Hh1W&TfJ9myV9@;tA8`+0&4vU0KobtM8*EHoS|e!-7>4=cPw! z)T^{tjsEP_3&Yvf3nK@%Ax}cd%d+K{mL<=d)0;T!(vOxU&zv)yIJwWOxpaAX@5?1V~``+BE=s9Ii9Z>WMg7K#V_3~myQh=V&%P}sJ4ki*FHOM(a#$G2(0MEq_WP*#Ft`FSL1xAdbY39gb5 ziLZK$4#mQBN_OSK2;)~XcPGD9+!e5LVfetlZ8f2*4(#LbB3}>OxUjauJ?*P_?t^@q zE`8_|`0W^7%(M^UOVX9swU+uD=^$y3)c`ohSfr;+_aMKrZrNzuM;5B-o2Udyrm&{9 z&W&ze`E)pigWqvl)+*=`82p!dVGzD|$cibt_3A#<*$vbZ-S}QfP#M5Rsi;3a98{mv z`=Um6_iCc4g=ETgkCBq;-pem0EPk9*0F;AOk5SZh^7Yt7o*vj$X09=@wW z_RYLql?j(jrKTq4B+tecrbqUs?ICNG>?p5x^++AF3bQ#?+tsadxV>3g;iEafVQJ3| z@fBm4wJ>ch9B6S(g-aZQjBITmdo(h-!|WDk4gVEs!C+&7UstE={Gz8XG3Z=XSC>E5 zU!WSwkOxnrkL0gW2y+!?LF4v8W*9E+)q?r>Rn9NQxmBA}wfU-I@a%4ohDV-c8Fo0m zBrb9fmC5;?AA5EYxoRS&(%8lCEB$INR0jQwoCoI z?wnWrcsCb=O=x*?V6n2LVQQCl#@zyvb6wJb^W1J|>+h$v_BF#m$w{#3<6lx(oS{%B z!5FAlFVBj)YL6x_&bg-4VDPc{W3J2VPf!nnF6$tE!2mjn{-d4zc2>86Dy=vx@F96@ zUcbQlj_0>s89N-h=Xkkn429Otg&IK$4>^UWZ9(l#DUiJ?=csm6N%P<2M?bGtKOQ7GN2KdTgfisRPn5 zDK>hD6bsAFGiCz>M#i+wIJD?#0z1@epLyf#dk4>lU-!GsH)+?e zOKJErGy%&Yyp|0GWF+^RsU#tSHp7-=u@&3LA-zW0umv!kK;T`5z;g;TzHou5)mGQ0 zrpafT^C^n9^__VI;c?OI!sF!<(dz7Io!rAJ9{0vLq!_*yl(MHAz8;2L+^3yjmq_5%|6WRYqOsKwu2_590)l73_no6Qc zkB?lT#%bnbr-l2R=h`awrfKe@tJ0K*nW)Vg9xIx3s`2m)G`exn=RP*^Cu@Z7ssfFB7wS~UlL9^?B+Ta&-)uZpj`Vg!Q>>o84=)m{ zgtrV={07)sUk&fE`M}-0#rFN1;{$F!d^>vZd?>N+v)5i5N}R%PSzL0~c zd?Plyh|)onIVq!gv$y$VV+j?qk=7iKv7G%-?0~ftVs5Yy&$$em{IY#-ARTVvb`6Hu z?$fS8-dXXH-erj+8q96oQyjI}Z4;E$sv%hW#%0lK9Y2GZi7!nV9mu*OW8s)J>J3^$ z7LN<~$A9@%aqokeF)oKN?6;va%Lj;9TDJI@X2W(YZc^$TZ+3nTge;YaVtPO%COUwfcW#*D=AU1bPdf<`TM3CW-Ez3gwNUU_AG#XxFo z>Vj=pGX5-7R@Ra5@X#gW85@TaC;b`WFo=iCAH1B(^Z$^$8*l2|-LK>$xw~H`D9+uJ zT59`soZK}}bv&C`(|JOwzs#@b`Fv%D*Ra)h!-BkJ;;a)_C`PNCqogUjKeX!)LqKGmALoXLb(V zAsci|Pj@0vv3B$vZ38b=6#ASVXXk%wAr;X_S-~%K6vE!SK$PeI?y!>7>htYnXBuH{ zz{+(eXRiVE&nE_TilkiJ#*2)1&;)ZSbtbkl-8IZkd^ELxj3Dc3FMK$#p{@K?>}9ma zLP`XNJ>JdVxN7JQ?YQVB&A_a8kKyG{=lX3l2jRpLA2;YM4b|3_Qvzo-WEXK8EW4cg zbdQqxBy;Zw9+5b3&?#*@BInr4iKd3e+;)!E|1E7bf%$Kh(}D75m6q{?ydRS9b*eJf zf3^b^uh=j@PuiHb#poz(cPU#th`a)Kc&Dux8TXMoc%P4`X!_6TRe@%zhN7Rb^@gbG z6LWm*jo}V~UB_-!3s4vROqa0X`}(0?H+%ov@(X<|KZU-08*OXy9YKbYE!~E|4Sx#%xLU==a`^LqCs@|7ViWjX=kDRR4LjI z8Y;-HPG(wkRgqm_?6r$AS54X(3zmQ5T(UuX;Quj?_Q)}Z<&I~2K_;r&{PuuT42ezN zADYCV0b>MdFKvKA4n$M?Py?6)&MUHr_I+Y8j(kjNsTcvF9HEK)oyzUq>C|L@vVMHz z8q7gOBXy_z{Ywbba8}gI*(+d?#=yL(q=NGN|2`}?cs-o%jVUXB1OjwQBADkj-p}EE zIHrm3Nq)&l5X{EC9p>nGj$4fA0tw=oO6c7M={mu84o}82RrW~Jk@~%rOs*pS6T}Nm zE!_^>a$O-jz(eKjM;oWgS8kRxoCUAI!=p*&8C@#CwYB&6BDc3O{Zyj&pK*^z4&xj zV(FM{sJn}=?eC3;mf@5Yq9bmlAdhug5D#s@x?oG26;*UhX}0jFIe5baYfm3eqZ9d_ zY@I4R_%#y z(-bZ~wn-REE!D51m5Zr2WAe>mGgG(G>P#pH|MgdD*xXYmPtc!h$C27#^ikEL(l__k zR#ZCLV1LsdSpDgSqRF+W3akYqi&nup$2(Z|Q^Q*L+Jw%<5f5E^<@x7cMGR+G9|(sF z8#L9>_k0x5vY9q-fE_>QQPUaABb?0#^!}(e=_byc;?Tp48%2jF9;@#%)wil9)3}G> zf=w=3fp{IlV$?ShMMSas`^2+h1Sof)<#)i<#xAF;D#dbS zdAMOkB%0nq3ZLuOe&BB%8pfV`{=l;cO@bDkadpQ^_mt67>z<0%v91;2#btcMcGtNa zhc~5hhZ8iJd{Zfe$Qd;vo_YB-GMJ6j+t(uC_jhbpYpkY>|8k@%h@N~9sK^;jxO+x2 z&9p`Sm&O#rIA)4)bY4n{I^NZ|y`piqLuKDfVbd6PawCc1WvAfm=1#1I?&L%GrH0Df(l1W=bmRy&UKVooF;moTSD*oj~^KCtu_(eo;7nrE6hG&gAT9t6p^ZZLImD4MIzpH_e4;Bg|HhWgmDJ9DntubMe6RzR5blL-~}Swhf|Q^mJL{k2x^lJyJ{;; zB)IBf_=}!ywi;5s7+kDuv$wxOs(e+}bO=ptdtf*kD%H(9FxkUM(F*9U$rqDieBY$c zOt*}6{_q@qR#E!jAKm~An7q9Bnu8Sr{19<7J;ByJaEzS+GuAas^+YV+$p-K4=RDR| z1T>P#DPQONev;12WCQQH=QFJXJyKh+qhm^KXdGXQjdmDLat8Bmm@rUhG>7MI!$idK zh+*i8eEILVoYC|TY$_PlsLXIfr9c5eCA~8+ngDd*j8);e&lm)lowSnS{BwoO(X;|f z`&F~`G;ABJCDrYBUz1n*1X^4b=9Xcmk?v673{e37M+NZ7I?sD$5(h}zB`{A6IRR0s z+57n~CS}G`cdu0V0RFD1NnPx&pL@XN%2caI?vvdFHz=(Fck)rWAxl0Fs;2>S9Ly#M z&Unm(_uTI!FYtYA(PhN98oe`C-?!3#QNH`cPUiljA{va^uGwfFWvHO{3>NerqO$3r z2JI*U1WQYv#E1H#4+Cf1Ye4y?a2|N!l1X1ImLhWt@Tpu>}g!?t%_8IE@phAPrWu?)C-gAlilr zQl%ZFAo&o6r63JE1xd78svr%XQ6w$~3kuQ^sz6pB1Zvn6q~RkfNV*y?kj?B%>^0du zWXj@D)|bsFjzcD!m2R>b?FyO8GqSlDYrPDZ)XH{bGfg%X5jsL^3}myOOJy^fCp0bD z3{rgAY-ysvf@~fXswJC`1Qyv`q$>)tWV0cn^n-z)0oit0V6F9Qk0kU&h4lD6CZQ)P zVg&g|1K$ZzlSP7hC)8)Tc4n5dpRqSfnZ4MGrHSm#%tKDrGszlE{t?72Hrh}r5w4pk zC5H5$O|{VsOl5*wMgH^d9=`zs;SC0Xd}%h}(om^&DvY*Te^Y%mH}4`8$-$TZ6W!7YT`*If6=vcD3V8AfLw9bmKRm)isyyavuzoRW257qm| z4xOdF&TJame1fB;K8ZaJPZQfoDzd}LDU`yO@I}iAYgOP|qu9a`2|;TS)VN716wOAv z>Mz#^!FvPuyBDKE+4^=!>suX`+v8sks<{JaZrt#Z!4i;V@0;wWun=huwy^@XW#;T`(;L{Xu{SzE{tM< zFin&77N{3anRvEy{x+>UIG?aBbej$pATO}X`e9Z3RL(YJ$1pqGc|F!x9Hb3pjbr^C zlNbT)MNTNxBv#iS8Y7jKaE%y+#RRlAn>g3rbf!`~v18jPx#R*v+)*o$|9!YnN8bdk zvBl9i5Ya`XF|+tl{1RiN{(^@fdG0GKSiWKkFMLI+4-!bNf8~8E9U&m5hx#{mN#X*W zCBP7i#4AYbT5&}fE;ZDNw!TX-j2N|WY8Ocn+Uzev2i+o677(Sglt!MvF~sr)%w^LL zm*6Lo>OH}BOwhV8{c~ai%z_(d)R9TWj5^v32i|Q| z8XF6~CJKrVI2~??4MactfOLVzL7gx}?;5CR9lWGM zW_F2vWn$XCGU3z*6x+Q{ebAFrANF#2p07Uat>9um*;kZykow?5C|>GMl&TK~JdkJx z-+wW1hp7Vf;UG}OOMN->88>lDeOMC>G!H-7R|YB?2NxkHLEOB1@BvJni7l#L^SMcF7qoFGpd0!ls@_!)QSKgR z(;74j*xNO7je~(%>mc$jLA}$C|NlbX-0yT440tHyiql2Bu4RlSJ08upUxf8?RvjvORo*4+)(q<)Oz^W0d zplE*VamqM^yl0x3loE2uhuH~v3`3s?d91?F1tHtc#BYu)c>~1Je>xD-e+%}*6PVyV zWIvZNWa&{()&4>6&IrE{@4xIVWbD8JD?rjwV0h=uj9gra7=$ic-KNpw}gAZNJ zS8RB`EO_f|zM^1AlyZVPQWqqIQ$w$~3dH}d0t_Wn$&aO$N{=mD|Jwl+-BcfJze^!5 z)xaGLb^#alHTht+)wWpKChr?RkwK&?TP={X+S^0X3hdXU@qqu1QMp3|ZN+#gqY^sm zo(?CG;%a*b=ijy*60mqq#p*sn(s@75JKMw$+Dj z4KF~RW5EDN(m^hU8veAoqtER)J!wTFgoX!X;Xd?7Rc~-E7z3(=3R_HgbJj<5#{#O~ z`HTCzxxNP9pZ>yhle_gS#os+_(d#nq?y)@m8`BR5S^p`uMRkXw_kJ9cl&`*z6?Z^e z>Lc4_uWH5fXVACtX}#dtdcoriaU_~kbUUeReHg>{BDFiVNk=y&Z*S_Z$tnC$*~_?O zDlum>XG5k&Za0Xm)ZIo-CifuCAoxDN+Hd1H^mf}p+up&|>hyX2oXsz(+@)qY3k+J9 zvpwfa)S{kVzMe2Y>avMed&=HxeU^B(jG248g#+$wuUW^Me|u^unk2%>b~T!+xTR}q zXE2Hrhv(d)8kZVPDckLgS{vnYGpcPPebbjksVo6?_s-S-z$hSmYVs0wl71;Ih%hj znD+@Lh8m6)g*DxCMw3R0r2}LG($K9YgOqWVz1lCkD$>xnmqY?oPmNrzMAmv*cRXUW z_sGc0!czMqp~UqmLs5PEInI7%XnXGYxvhABjyq23lDxUG-I>_#{9>+bP~n30Z!UHM zG^`-i$~;HzM>DZUk=ZB?;Fkao2jQ01{YQPScg8z5N~ekL{M`GVI>1))Bgoxr#KVB-@jUT^YE}9gPVL zH@`~n_y2YBRfOzv@X=2Ryw>ck9kp$a)Wl7R6&Nqf*o5=ZVnUFWt$$M+O0>)OFAgtQ zZu7OIwvt-jk4Gf*XKQWDU)H74Nfk2R_COnU*3kNC!q;1JBp>= z_DFt(TMf2k%bL6g_xp6n+G-q+)EY>R+{J(jP%55o_TK$H<)<&w-6@i~dJxdzxmk}s$%Pq z-y{HWCgUjJ?g+(-VBqON92!wibmLb=hD2^#;oOcU?k29%gl-GN#B)%iCT?8!7RKO< zPuxhE120Cm4geWA6&$6Tgr259$>51OTu1+C!^9lF9QVJ>R?dAYE=P=Y%*Q%IS)qD5 z8Mms#4Q^pp{`ww_erk<=#;56LRX{&7@|Mz1wl2=VaBw}zp6p~rrQVz&({4ub4@aU^ zVUo#n386f4jH<2-hENuCs0z?E6)VC`yg^NuK%v_z z?U<7^cc2GD#YPoN3RJ-fY}GPJEymp;`_Ib5n?gFDv)nIKpua*vis>|1`wh{pl{TY# ziF*z8G=~p-Khs*1KMSm&XCC<8C5<)h@MNsNquR80iO!>re46i8(|1u<)I8>Q+Y%bo zSD<8R|FR%^S4>XHr4UpmpVNn9gaZNJUtoMxllqlAOWKxuFVzl&G=lk1T2 z9XInXG1`be(AQagi@+9r+9aw;E!FSjy1ChEBdNxkb*R&|KFlge1P_1djGSG{H!u`} z0!v>2PMJdB(XkeSrk3aPB<@)L3iI9tn?^V^dtbJ~Z|D>Qf6Y6LD6oPRAGP9e!C(JK zIAHBN>2jc59C4eg1fFo|_q)wtiJ=}Imd3Na<|YLatchu(PC?>yr-2`^_+;0n{Dpj9 zlSB{~eLKq4f#4ykw!?fCr9s>;j2vo;^tRbJkkwxmN}K^nHF=xAFARhk7lXqH+LV6U zz*Wrzj`H{xe|+t&Ly8vXSAW~T2u$Q4*JW#h>KhfmYVzjUta4ME(>mA&2$gSlW6=4j zx(}h$jofZaCpJ4Hm3W8gBG?Et;ar19T5So%7AIl-&FUdLgvLy#=Et&iw?S{V&sDWa zj|M*+iKbry0$+)hsW@FIB>qwOY_-xVsuTQP(m3AEdS?9QXRG=@9U?*h<@fZgQz`kf zOmcj*#HBP>GpL}K#Th;`4 z4)v_#6om;Q0xuc8Ef>8RGlPd|bWDR;s#pT}l%r`#dJ#?byEd!HNo;B9ANi--lJR9I zOS-{oB3C7gTBzAOXTaw_<5C;zhN&*KRKI?8&lWYpPCZ!Q18HO^%>@46C@P_rW^c@7 zu;#HuyM0ehEKS@HSB{`&osatZx2;OmM^nae5lz<9sA|>P?6oLMmC?>a2|KjY03>#P2QrQxDcoR&?a1vFb=waU$BP{!mA#dH-y3*|Ct`& zFM)s^mFqr01LI*D6u*lp5JV*JuN8J@RxF?O4xFQbytKGnhIL2~S_ceP<{?Q+Ib3{wpB`y~SFr>G%PUga0 zaAXAs9&hokbI>3i7E+rAshLli>b*R?Zgd9xd44~YXvAv!%QQ}i0#lq36-e$XPDE!I z_9`28LVnl;2`0el$y2qynBefxHa7>f)O~?&IQ2V!2VxFen>?Q8XXa>Wk>HF(4ZUE! zEVauB*MDz)0k}?6h(6x<0+-L0eV75^Wc%A*H5j*?j6UA_0u!~~nwEYaHl^s}u@_Pk z^@(ahPQ7?cG<~t9Dj%y@>a`mO^VQbIqv`dI;zK3{ zU3c(NFno^Y_XV|{o@DVqdcm_#AX-BQeo7}e|AVol-pa2iOHG_E! z+R~{N8At*F|A3&@ZVc#ybcUka(8g&n(_yskf(z2sc3XXTev2!+vQSq3q_rk(t=eKA z4cJFR?W5l?SvRg(8X%J2`*ZI1JIS;uw2H3ov&m~_zTf-j+<)hud+xdCo>Lsh%0DRK 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

qzID|~*U-+o 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%0A<De!hjss141}^I2 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 * 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

YgUyu-)ZdB^F+R$C}v&C+AZDR#Wix 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