Fully rewritten for Lazarus. Has no backward compatibility with Delphi XE4 now. Now it can be compiled for Windows/Linux/MacOSX.

This commit is contained in:
meffi@lab313.ru
2014-04-16 15:20:23 +00:00
parent 519a7f2e86
commit 5af2e6c660
24 changed files with 3477 additions and 1357 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

1164
l2sq_table.inc Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,68 +0,0 @@
program tim2view;
uses
Windows,
Vcl.Forms,
Vcl.Themes,
Vcl.Styles,
ecc in 'units\ecc.pas',
edc in 'units\edc.pas',
umain in 'Units\umain.pas' {frmMain},
ucdimage in 'units\ucdimage.pas',
ucommon in 'units\ucommon.pas',
udrawtim in 'units\udrawtim.pas',
uscanresult in 'units\uscanresult.pas',
uscanthread in 'units\uscanthread.pas',
usettings in 'units\usettings.pas',
utim in 'units\utim.pas',
ueventwaitthread in 'units\ueventwaitthread.pas',
udirselect in 'units\udirselect.pas';
{$R *.res}
const
cMailslot = '\\.\mailslot\t2v_slot';
cEventNname = 't2v_open_event';
var
ClientMailSlot: THandle;
path: string;
BytesWritten: DWORD;
begin
ServerMailSlot := CreateMailslot(cMailslot, 0, MAILSLOT_WAIT_FOREVER, nil);
if ServerMailSlot = INVALID_HANDLE_VALUE then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
ClientMailSlot := CreateFile(cMailslot, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if ParamCount > 0 then
path := ParamStr(1)
else
path := '';
if path <> '' then
WriteFile(ClientMailSlot, path[1], Length(path) * SizeOf(Char), BytesWritten, nil);
CommandEvent := OpenEvent(EVENT_MODIFY_STATE, False, cEventNname);
SetEvent(CommandEvent);
CloseHandle(CommandEvent);
CloseHandle(ClientMailSlot);
end;
end
else
begin
CommandEvent := CreateEvent(nil, False, False, cEventNname);
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
CloseHandle(ServerMailSlot);
CloseHandle(CommandEvent);
end;
end.

View File

@@ -1,222 +0,0 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{20D93FC8-189B-40E7-8CB2-DBD3BD57B0B5}</ProjectGuid>
<ProjectVersion>15.1</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<MainSource>tim2view.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Release</Config>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Application</AppType>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
<Cfg_1_Win64>true</Cfg_1_Win64>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
<Cfg_2_Win64>true</Cfg_2_Win64>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_UsePackage>bindcompfmx;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;bindcomp;inetdb;DataSnapClient;DataSnapServer;DataSnapCommon;DBXInterBaseDriver;DataSnapProviderClient;xmlrtl;DbxCommonDriver;IndyProtocols;dbxcds;DBXMySQLDriver;bindengine;soaprtl;DBXOracleDriver;CustomIPTransport;dsnap;DBXInformixDriver;IndyCore;fmxase;DBXFirebirdDriver;inet;fmxobj;inetdbxpress;DBXSybaseASADriver;fmxdae;IPIndyImpl;dbexpress;DataSnapIndy10ServerTransport;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
<DCC_E>false</DCC_E>
<DCC_N>false</DCC_N>
<DCC_S>false</DCC_S>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_UnitSearchPath>.\units;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_UsePackage>vcldbx;TeeDB;inetdbbde;vclib;DBXOdbcDriver;Tee;DBXSybaseASEDriver;ibxpress;svnui;vclimg;fmi;intrawebdb_120_160;vclactnband;vcldb;FMXTee;vcldsnap;bindcompvcl;TeeUI;vclie;DBXDb2Driver;Intraweb_120_160;vcltouch;websnap;vclribbon;VclSmp;vcl;DataSnapConnectors;CloudService;DBXMSSQLDriver;FmxTeeUI;dsnapcon;vclx;webdsnap;svn;bdertl;adortl;PBFolderDialogPackRun;$(DCC_UsePackage)</DCC_UsePackage>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_Locale>1033</VerInfo_Locale>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<DCC_UsePackage>DBXOdbcDriver;DBXSybaseASEDriver;vclimg;vclactnband;vcldb;vcldsnap;bindcompvcl;vclie;DBXDb2Driver;vcltouch;websnap;VclSmp;vcl;DBXMSSQLDriver;dsnapcon;vclx;webdsnap;adortl;$(DCC_UsePackage)</DCC_UsePackage>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<Manifest_File>None</Manifest_File>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1049</VerInfo_Locale>
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_RemoteDebug>true</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<DCC_IMPLICIT_STRING_CAST>false</DCC_IMPLICIT_STRING_CAST>
<DCC_SUSPICIOUS_TYPECAST>false</DCC_SUSPICIOUS_TYPECAST>
<DCC_MapFile>3</DCC_MapFile>
<DCC_Optimize>true</DCC_Optimize>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.523;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Build>523</VerInfo_Build>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<DCC_IOChecking>false</DCC_IOChecking>
<DCC_IntegerOverflowCheck>true</DCC_IntegerOverflowCheck>
<VerInfo_AutoIncVersion>true</VerInfo_AutoIncVersion>
<DCC_RangeChecking>true</DCC_RangeChecking>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<Icon_MainIcon>PROGRAMICON.ico</Icon_MainIcon>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_RemoteDebug>false</DCC_RemoteDebug>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<DCC_MapFile>3</DCC_MapFile>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_DebugInformation>0</DCC_DebugInformation>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<DCC_IMPLICIT_STRING_CAST>false</DCC_IMPLICIT_STRING_CAST>
<VerInfo_Keys>CompanyName=Lab 313;FileDescription=The best TIMs tool ever!:);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<DCC_DebugInformation>false</DCC_DebugInformation>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_IOChecking>false</DCC_IOChecking>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_IMPLICIT_STRING_CAST>false</DCC_IMPLICIT_STRING_CAST>
<DCC_DebugInformation>false</DCC_DebugInformation>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="units\ecc.pas"/>
<DCCReference Include="units\edc.pas"/>
<DCCReference Include="Units\umain.pas">
<Form>frmMain</Form>
</DCCReference>
<DCCReference Include="units\ucdimage.pas"/>
<DCCReference Include="units\ucommon.pas"/>
<DCCReference Include="units\udrawtim.pas"/>
<DCCReference Include="units\uscanresult.pas"/>
<DCCReference Include="units\uscanthread.pas"/>
<DCCReference Include="units\usettings.pas"/>
<DCCReference Include="units\utim.pas"/>
<DCCReference Include="units\ueventwaitthread.pas"/>
<DCCReference Include="units\udirselect.pas"/>
<None Include="units\l2sq_table.inc"/>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Delphi.Personality>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1049</VersionInfo>
<VersionInfo Name="CodePage">1251</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription"/>
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName"/>
<VersionInfoKeys Name="LegalCopyright"/>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename"/>
<VersionInfoKeys Name="ProductName"/>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
<Source>
<Source Name="MainSource">tim2view.dpr</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k180.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp180.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality>
<Deployment/>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">True</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
</Project>

BIN
tim2view.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

154
tim2view.lpi Normal file
View File

@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/>
<Title Value="tim2view"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<UseVersionInfo Value="True"/>
<AutoIncrementBuild Value="True"/>
<MajorVersionNr Value="1"/>
<RevisionNr Value="54"/>
<BuildNr Value="68"/>
<StringTable CompanyName="Lab 313" FileDescription="The best TIMs tool ever!:)" ProductVersion=""/>
</VersionInfo>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<RequiredPackages Count="1">
<Item1>
<PackageName Value="LCL"/>
</Item1>
</RequiredPackages>
<Units Count="13">
<Unit0>
<Filename Value="tim2view.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="tim2view"/>
</Unit0>
<Unit1>
<Filename Value="umain.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmMain"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="umain"/>
</Unit1>
<Unit2>
<Filename Value="edc.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="edc"/>
</Unit2>
<Unit3>
<Filename Value="ecc.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ecc"/>
</Unit3>
<Unit4>
<Filename Value="ucommon.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ucommon"/>
</Unit4>
<Unit5>
<Filename Value="utim.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="utim"/>
</Unit5>
<Unit6>
<Filename Value="ucdimage.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ucdimage"/>
</Unit6>
<Unit7>
<Filename Value="usettings.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="usettings"/>
</Unit7>
<Unit8>
<Filename Value="uscanresult.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uscanresult"/>
</Unit8>
<Unit9>
<Filename Value="uscanthread.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uscanthread"/>
</Unit9>
<Unit10>
<Filename Value="ucpucount.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ucpucount"/>
</Unit10>
<Unit11>
<Filename Value="udrawtim.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="udrawtim"/>
</Unit11>
<Unit12>
<Filename Value="bgrabitmap\bgrabitmap.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="BGRABitmap"/>
</Unit12>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="tim2view"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir);bgrabitmap"/>
<OtherUnitFiles Value="bgrabitmap"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<TargetCPU Value="i386"/>
<TargetOS Value="win32"/>
</CodeGeneration>
<Linking>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<CompilerMessages>
<MsgFileName Value=""/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

21
tim2view.lpr Normal file
View File

@@ -0,0 +1,21 @@
program tim2view;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads, cmem,
{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, umain, edc, ucommon, ecc, ucdimage, utim, usettings, uscanresult,
uscanthread, ucpucount, udrawtim, BGRABitmap;
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.

410
tim2view.lps Normal file
View File

@@ -0,0 +1,410 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectSession>
<PathDelim Value="\"/>
<Version Value="9"/>
<BuildModes Active="Default"/>
<Units Count="34">
<Unit0>
<Filename Value="tim2view.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="tim2view"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="37" Y="11"/>
<UsageCount Value="46"/>
</Unit0>
<Unit1>
<Filename Value="umain.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmMain"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="umain"/>
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="862"/>
<CursorPos X="1" Y="877"/>
<UsageCount Value="46"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
<Unit2>
<Filename Value="edc.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="edc"/>
<WindowIndex Value="0"/>
<TopLine Value="42"/>
<CursorPos X="88" Y="20"/>
<UsageCount Value="46"/>
</Unit2>
<Unit3>
<Filename Value="ecc.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ecc"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="6" Y="11"/>
<UsageCount Value="46"/>
</Unit3>
<Unit4>
<Filename Value="ucommon.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ucommon"/>
<WindowIndex Value="0"/>
<TopLine Value="18"/>
<CursorPos X="15" Y="35"/>
<UsageCount Value="46"/>
</Unit4>
<Unit5>
<Filename Value="utim.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="utim"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="165"/>
<CursorPos X="85" Y="179"/>
<UsageCount Value="46"/>
<Loaded Value="True"/>
</Unit5>
<Unit6>
<Filename Value="ucdimage.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ucdimage"/>
<WindowIndex Value="0"/>
<TopLine Value="12"/>
<CursorPos X="11" Y="37"/>
<UsageCount Value="46"/>
</Unit6>
<Unit7>
<Filename Value="usettings.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="usettings"/>
<WindowIndex Value="0"/>
<TopLine Value="52"/>
<CursorPos X="87" Y="71"/>
<UsageCount Value="46"/>
</Unit7>
<Unit8>
<Filename Value="uscanresult.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uscanresult"/>
<WindowIndex Value="0"/>
<TopLine Value="26"/>
<CursorPos X="1" Y="66"/>
<UsageCount Value="45"/>
</Unit8>
<Unit9>
<Filename Value="uscanthread.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uscanthread"/>
<WindowIndex Value="0"/>
<TopLine Value="173"/>
<CursorPos X="22" Y="197"/>
<UsageCount Value="45"/>
</Unit9>
<Unit10>
<Filename Value="ucpucount.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ucpucount"/>
<WindowIndex Value="0"/>
<TopLine Value="44"/>
<CursorPos X="57" Y="58"/>
<UsageCount Value="44"/>
</Unit10>
<Unit11>
<Filename Value="udrawtim.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="udrawtim"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="187"/>
<CursorPos X="35" Y="203"/>
<UsageCount Value="31"/>
<Loaded Value="True"/>
</Unit11>
<Unit12>
<Filename Value="bgrabitmap\bgrabitmap.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="BGRABitmap"/>
<WindowIndex Value="0"/>
<TopLine Value="55"/>
<CursorPos X="3" Y="69"/>
<UsageCount Value="21"/>
</Unit12>
<Unit13>
<Filename Value="l2sq_table.pas"/>
<UnitName Value="l2sq_table"/>
<WindowIndex Value="0"/>
<TopLine Value="70"/>
<CursorPos X="1" Y="1"/>
<UsageCount Value="19"/>
</Unit13>
<Unit14>
<Filename Value="umain.lfm"/>
<ComponentName Value="frmMain"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="1"/>
<ExtraEditorCount Value="4"/>
<ExtraEditor1>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="1"/>
</ExtraEditor1>
<ExtraEditor2>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="1"/>
</ExtraEditor2>
<ExtraEditor3>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="1"/>
</ExtraEditor3>
<ExtraEditor4>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="1"/>
</ExtraEditor4>
<UsageCount Value="9"/>
<DefaultSyntaxHighlighter Value="LFM"/>
</Unit14>
<Unit15>
<Filename Value="C:\codetyphon\fpcsrc\rtl\unix\cthreads.pp"/>
<UnitName Value="cthreads"/>
<WindowIndex Value="0"/>
<TopLine Value="10"/>
<CursorPos X="29" Y="24"/>
<UsageCount Value="9"/>
</Unit15>
<Unit16>
<Filename Value="C:\codetyphon\typhon\components\pl_Synapse\source\synamisc.pas"/>
<UnitName Value="synamisc"/>
<WindowIndex Value="0"/>
<TopLine Value="151"/>
<CursorPos X="25" Y="165"/>
<UsageCount Value="9"/>
</Unit16>
<Unit17>
<Filename Value="C:\codetyphon\typhon\lcl\forms.pp"/>
<UnitName Value="Forms"/>
<WindowIndex Value="0"/>
<TopLine Value="50"/>
<CursorPos X="3" Y="64"/>
<UsageCount Value="10"/>
</Unit17>
<Unit18>
<Filename Value="C:\codetyphon\fpcsrc\rtl\objpas\fgl.pp"/>
<UnitName Value="fgl"/>
<WindowIndex Value="0"/>
<TopLine Value="138"/>
<CursorPos X="7" Y="152"/>
<UsageCount Value="10"/>
</Unit18>
<Unit19>
<Filename Value="C:\codetyphon\typhon\lcl\comctrls.pp"/>
<UnitName Value="ComCtrls"/>
<WindowIndex Value="0"/>
<TopLine Value="1203"/>
<CursorPos X="3" Y="1217"/>
<UsageCount Value="11"/>
</Unit19>
<Unit20>
<Filename Value="Graphics32\Packages\GR32_L.pas"/>
<UnitName Value="GR32_L"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="18" Y="13"/>
<UsageCount Value="10"/>
</Unit20>
<Unit21>
<Filename Value="Graphics32\GR32.pas"/>
<UnitName Value="GR32"/>
<WindowIndex Value="0"/>
<TopLine Value="432"/>
<CursorPos X="58" Y="447"/>
<UsageCount Value="10"/>
</Unit21>
<Unit22>
<Filename Value="Graphics32\GR32_Png.pas"/>
<UnitName Value="GR32_PNG"/>
<WindowIndex Value="0"/>
<TopLine Value="904"/>
<CursorPos X="1" Y="918"/>
<UsageCount Value="10"/>
</Unit22>
<Unit23>
<Filename Value="Graphics32\GR32_PortableNetworkGraphic.pas"/>
<UnitName Value="GR32_PortableNetworkGraphic"/>
<WindowIndex Value="0"/>
<TopLine Value="4696"/>
<CursorPos X="3" Y="4700"/>
<UsageCount Value="10"/>
</Unit23>
<Unit24>
<Filename Value="C:\lazarus\fpc\2.6.2\source\rtl\inc\objpash.inc"/>
<WindowIndex Value="0"/>
<TopLine Value="178"/>
<CursorPos X="23" Y="192"/>
<UsageCount Value="10"/>
</Unit24>
<Unit25>
<Filename Value="C:\lazarus\lcl\graphics.pp"/>
<UnitName Value="Graphics"/>
<WindowIndex Value="0"/>
<TopLine Value="1369"/>
<CursorPos X="14" Y="1383"/>
<UsageCount Value="10"/>
</Unit25>
<Unit26>
<Filename Value="C:\lazarus\lcl\graphtype.pp"/>
<UnitName Value="GraphType"/>
<WindowIndex Value="0"/>
<TopLine Value="193"/>
<CursorPos X="3" Y="195"/>
<UsageCount Value="10"/>
</Unit26>
<Unit27>
<Filename Value="bgra-controls\bgragraphiccontrol.pas"/>
<UnitName Value="BGRAGraphicControl"/>
<WindowIndex Value="0"/>
<TopLine Value="35"/>
<CursorPos X="14" Y="49"/>
<UsageCount Value="10"/>
</Unit27>
<Unit28>
<Filename Value="bgrabitmap\bgrawinbitmap.pas"/>
<UnitName Value="BGRAWinBitmap"/>
<WindowIndex Value="0"/>
<TopLine Value="33"/>
<CursorPos X="32" Y="47"/>
<UsageCount Value="10"/>
</Unit28>
<Unit29>
<Filename Value="C:\lazarus\packager\registration\fcllaz.pas"/>
<UnitName Value="fcllaz"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="1"/>
<UsageCount Value="10"/>
</Unit29>
<Unit30>
<Filename Value="AggPasMod\Examples\Simple\AlphaMask.dpr"/>
<UnitName Value="AlphaMask"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="26" Y="11"/>
<UsageCount Value="10"/>
</Unit30>
<Unit31>
<Filename Value="bgrabitmap\bgrabitmaptypes.pas"/>
<UnitName Value="BGRABitmapTypes"/>
<WindowIndex Value="0"/>
<TopLine Value="356"/>
<CursorPos X="16" Y="370"/>
<UsageCount Value="10"/>
</Unit31>
<Unit32>
<Filename Value="bgrabitmap\bgradefaultbitmap.pas"/>
<UnitName Value="BGRADefaultBitmap"/>
<WindowIndex Value="0"/>
<TopLine Value="895"/>
<CursorPos X="1" Y="919"/>
<UsageCount Value="10"/>
</Unit32>
<Unit33>
<Filename Value="C:\codetyphon\typhon\packager\registration\fcllaz.pas"/>
<UnitName Value="fcllaz"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="1" Y="1"/>
<UsageCount Value="10"/>
</Unit33>
</Units>
<CustomDefines Count="1">
<Define0 Value="UseCThreads"/>
</CustomDefines>
<General>
<ActiveWindowIndexAtStart Value="0"/>
</General>
<JumpHistory Count="18" HistoryIndex="17">
<Position1>
<Filename Value="umain.pas"/>
<Caret Line="876" Column="31" TopLine="861"/>
</Position1>
<Position2>
<Filename Value="umain.pas"/>
<Caret Line="888" Column="26" TopLine="879"/>
</Position2>
<Position3>
<Filename Value="umain.pas"/>
<Caret Line="894" Column="32" TopLine="880"/>
</Position3>
<Position4>
<Filename Value="umain.pas"/>
<Caret Line="897" Column="9" TopLine="883"/>
</Position4>
<Position5>
<Filename Value="umain.pas"/>
<Caret Line="894" Column="1" TopLine="883"/>
</Position5>
<Position6>
<Filename Value="umain.pas"/>
<Caret Line="894" Column="1" TopLine="883"/>
</Position6>
<Position7>
<Filename Value="umain.pas"/>
<Caret Line="895" Column="1" TopLine="883"/>
</Position7>
<Position8>
<Filename Value="umain.pas"/>
<Caret Line="894" Column="59" TopLine="883"/>
</Position8>
<Position9>
<Filename Value="umain.pas"/>
<Caret Line="896" Column="23" TopLine="883"/>
</Position9>
<Position10>
<Filename Value="umain.pas"/>
<Caret Line="883" Column="47" TopLine="871"/>
</Position10>
<Position11>
<Filename Value="udrawtim.pas"/>
<Caret Line="125" Column="24" TopLine="5"/>
</Position11>
<Position12>
<Filename Value="udrawtim.pas"/>
<Caret Line="10" Column="28" TopLine="4"/>
</Position12>
<Position13>
<Filename Value="umain.pas"/>
<Caret Line="204" Column="30" TopLine="192"/>
</Position13>
<Position14>
<Filename Value="umain.pas"/>
<Caret Line="131" Column="21" TopLine="117"/>
</Position14>
<Position15>
<Filename Value="umain.pas"/>
<Caret Line="518" Column="1" TopLine="504"/>
</Position15>
<Position16>
<Filename Value="umain.pas"/>
<Caret Line="519" Column="1" TopLine="504"/>
</Position16>
<Position17>
<Filename Value="umain.pas"/>
<Caret Line="892" Column="41" TopLine="875"/>
</Position17>
<Position18>
<Filename Value="umain.pas"/>
<Caret Line="519" Column="1" TopLine="504"/>
</Position18>
</JumpHistory>
</ProjectSession>
<EditorMacros Count="0"/>
</CONFIG>

Binary file not shown.

View File

@@ -40,7 +40,7 @@ procedure ReplaceTimInFileFromMemory(const FileName: string; TIM: PTIM;
implementation
uses
ucommon, ecc, edc, classes, sysutils, windows;
ucommon, ecc, edc, classes, FileUtil, sysutils;
function bin2bcd(P: Integer): byte;
begin
@@ -73,9 +73,9 @@ var
begin
Result := False;
Sz := FileSize(FileName);
tmp := nil;
if (Sz > cMaxFileSize) or (Sz = 0) then Exit;
if (Sz > cMaxFileSize) or (Sz = 0) then
Exit;
pFile := GetMemory(cSectorHeaderSize);

View File

@@ -3,7 +3,8 @@ unit ucommon;
interface
const
cProgramName = 'Tim2View r55 by [Lab 313]';
cProgramName = 'Tim2View by [Lab 313]';
cProgramVersion = '2.0 Release';
cExtractedTimsDir = 'TIMS';
cExtractedPngsDir = 'PNGS';
cMaxFileSize = $2EAEED80;
@@ -25,29 +26,13 @@ type
TBytesArray = array [0 .. cMaxFileSize - 1] of byte;
PBytesArray = ^TBytesArray;
procedure Text2Clipboard(const S: string);
function ExtractJustName(const Path: string): string;
function Min(A, B: Integer): Integer;
function Max(A, B: Integer): Integer;
function GetCoreCount: Integer;
function FileSize(const FileName: string): Integer;
implementation
uses sysutils, windows, clipbrd;
function GetCoreCount: Integer;
var
SystemInfo: SYSTEM_INFO;
begin
GetSystemInfo(&SystemInfo);
Result := SystemInfo.dwNumberOfProcessors;
end;
procedure Text2Clipboard(const S: string);
begin
Clipboard.AsText := S;
end;
uses sysutils;
function Min(A, B: Integer): Integer;
begin
@@ -71,22 +56,4 @@ begin
Result := Copy(Result, 1, Length(Result) - Length(ExtractFileExt(Result)));
end;
function FileSize(const FileName: string): Integer;
var
FindData: TWin32FindData;
hFind: THandle;
begin
Result := 0;
hFind := FindFirstFile(PChar(FileName), FindData);
if hFind <> INVALID_HANDLE_VALUE then
begin
Windows.FindClose(hFind);
if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
Result := Integer(FindData.nFileSizeLow);
end;
end;
end.

74
ucpucount.pas Normal file
View File

@@ -0,0 +1,74 @@
unit ucpucount;
interface
//returns number of cores: a computer with two hyperthreaded cores will report 4
function GetLogicalCpuCount: Integer;
implementation
{$IF defined(windows)}
uses windows;
{$endif}
{$IF defined(darwin)}
uses ctypes, sysctl;
{$endif}
{$IFDEF Linux}
uses ctypes;
const _SC_NPROCESSORS_ONLN = 83;
function sysconf(i: cint): clong; cdecl; external name 'sysconf';
{$ENDIF}
function GetLogicalCpuCount: integer;
// returns a good default for the number of threads on this system
{$IF defined(windows)}
//returns total number of processors available to system including logical hyperthreaded processors
var
i: Integer;
ProcessAffinityMask, SystemAffinityMask: DWORD_PTR;
Mask: DWORD;
SystemInfo: SYSTEM_INFO;
begin
if GetProcessAffinityMask(GetCurrentProcess, ProcessAffinityMask, SystemAffinityMask)
then begin
Result := 0;
for i := 0 to 31 do begin
Mask := DWord(1) shl i;
if (ProcessAffinityMask and Mask)<>0 then
inc(Result);
end;
end else begin
//can't get the affinity mask so we just report the total number of processors
GetSystemInfo(SystemInfo);
Result := SystemInfo.dwNumberOfProcessors;
end;
end;
{$ELSEIF defined(UNTESTEDsolaris)}
begin
t = sysconf(_SC_NPROC_ONLN);
end;
{$ELSEIF defined(freebsd) or defined(darwin)}
var
mib: array[0..1] of cint;
len: cint;
t: cint;
begin
mib[0] := CTL_HW;
mib[1] := HW_NCPU;
len := sizeof(t);
fpsysctl(pchar(@mib), 2, @t, @len, Nil, 0);
Result:=t;
end;
{$ELSEIF defined(linux)}
begin
Result:=sysconf(_SC_NPROCESSORS_ONLN);
end;
{$ELSE}
begin
Result:=1;
end;
{$ENDIF}
end.

View File

@@ -3,14 +3,14 @@ unit udrawtim;
interface
uses
utim, Grids, Graphics, types, pngimage;
utim, Grids, Graphics, types, BGRABitmap;
type
PCanvas = ^TCanvas;
PPNG = ^TPngImage; { TODO : Replace with another type }
PDrawSurf = ^TBGRABitmap;
PDrawGrid = ^TDrawGrid;
procedure TimToPNG(TIM: PTIM; CLUT_NUM: Integer; var PNG: PPNG; TranspMode: Byte);
procedure TimToPNG(TIM: PTIM; CLUT_NUM: Integer; var Surf: PDrawSurf; TranspMode: Byte);
procedure DrawClutCell(TIM: PTIM; CLUT_NUM: Integer; Grid: PDrawGrid; X, Y: Integer);
procedure DrawCLUT(TIM: PTIM; CLUT_NUM: Integer; Grid: PDrawGrid);
procedure ClearCanvas(ACanvas: PCanvas; Rect: TRect);
@@ -19,7 +19,7 @@ procedure ClearGrid(Grid: PDrawGrid);
implementation
uses
ucommon, windows;
ucommon, BGRABitmapTypes;
function PrepareCLUT(TIM: PTIM; CLUT_NUM: Integer): PCLUT_COLORS;
var
@@ -107,7 +107,7 @@ begin
ClearCanvas(@Grid^.Canvas, Grid^.CellRect(X - 1, Y - 1));
end;
procedure TimToPNG(TIM: PTIM; CLUT_NUM: Integer; var PNG: PPNG; TranspMode: Byte);
procedure TimToPNG(TIM: PTIM; CLUT_NUM: Integer; var Surf: PDrawSurf; TranspMode: Byte);
var
RW, RH, CW: Word;
CLUT_DATA: PCLUT_COLORS;
@@ -116,14 +116,15 @@ var
R, G, B, STP, ALPHA: Byte;
COLOR: TCLUT_COLOR;
CL: Integer;
P: PBGRAPixel;
Transparent, SemiTransparent: boolean;
begin
RW := GetTimRealWidth(TIM);
RH := GetTimHeight(TIM);
PNG^ := TPngImage.CreateBlank(COLOR_RGBALPHA, 16, RW, RH);
PNG^.CompressionLevel := 0;
PNG^.Filters := [];
if Surf^ <> nil then Surf^.Free;
Surf^ := TBGRABitmap.Create(RW, RH);
CLUT_DATA := PrepareCLUT(TIM, CLUT_NUM);
IMAGE_DATA := PrepareIMAGE(TIM);
@@ -139,6 +140,8 @@ begin
STP := 0;
for Y := 1 to RH do
begin
P := Surf^.ScanLine[Y - 1];
for X := 1 to RW do
begin
case TIM^.HEAD^.bBPP of
@@ -200,14 +203,17 @@ begin
R := 0;
end;
PNG^.AlphaScanline[Y - 1]^[X - 1] := ALPHA;
pRGBLine(PNG^.Scanline[Y - 1])^[X - 1].rgbtBlue := B;
pRGBLine(PNG^.Scanline[Y - 1])^[X - 1].rgbtGreen := G;
pRGBLine(PNG^.Scanline[Y - 1])^[X - 1].rgbtRed := R;
P^.alpha:=ALPHA;
P^.blue := B;
P^.green := G;
P^.red := R;
Inc(P);
Inc(IMAGE_DATA_POS);
end;
end;
Surf^.InvalidateBitmap;
Dispose(CLUT_DATA);
Dispose(IMAGE_DATA);
end;
@@ -231,7 +237,7 @@ begin
Rect := Grid^.CellRect(X, Y);
Grid^.Canvas.Brush.COLOR := RGB(R, G, B);
Grid^.Canvas.Brush.COLOR := RGBToColor(R, G, B);
Grid^.Canvas.FillRect(Rect);

File diff suppressed because it is too large Load Diff

821
umain.lrs Normal file
View File

@@ -0,0 +1,821 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TfrmMain','FORMDATA',[
'TPF0'#8'TfrmMain'#7'frmMain'#4'Left'#3#207#1#6'Height'#3'N'#2#3'Top'#3#134#0
+#5'Width'#3#12#3#18'HorzScrollBar.Page'#3#12#3#18'VertScrollBar.Page'#3':'#2
+#13'ActiveControl'#7#7'pnlList'#10'AutoScroll'#9#12'ClientHeight'#3':'#2#11
+'ClientWidth'#3#12#3#5'Color'#7#9'clBtnFace'#10'Font.Color'#7#12'clWindowTex'
+'t'#11'Font.Height'#2#245#9'Font.Name'#6#6'Tahoma'#9'Icon.Data'#10#242':'#0#0
+#238':'#0#0#0#0#1#0#3#0'00'#0#0#0#0#0#0#168'%'#0#0'6'#0#0#0' '#0#0#0#0#0#0
+#168#16#0#0#222'%'#0#0#16#16#0#0#0#0#0#0'h'#4#0#0#134'6'#0#0'('#0#0#0'0'#0#0
+#0'`'#0#0#0#1#0' '#0#0#0#0#0#128'%'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255
+'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('
+#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252'('
+#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#230#0#255#255#255
+#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255
+#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255
+#255#230#0#255#255#230#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('
+#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0
+#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255
+#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4
+#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#230#0#255#255
+#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4
+#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
,#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252
+'('#4#255#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252'('
+#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255#255#230
+#0#255#255#230#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255#255
+#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255
+#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4
+#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#230#0
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255
+#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4
+#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255
+#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4
+#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252
+'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255#255
+#230#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0
+#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4
+#255#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252
+'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255
+#230#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('
+#4#255#252'('#4#255#252'('#4#255#255#255#255#0#252'('#4#255#252'('#4#255#252
+'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0
+#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4
+#255#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('
+#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#252'('#4#255#252
+'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255#255
+#230#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255
+#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4
,#255#252'('#4#255#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252
+'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255
+#230#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('
+#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255
+#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255
+#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#230#0#255#255#255#255
+#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252
+'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0
+#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4
+#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230
+#0#255#255#230#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252
+'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4
+#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255
+#230#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#252'('
+#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4
+#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#230#0#255
+#255#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252
+'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4
+#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230
+#0#255#255#230#0#255#255#230#0#255#255#230#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252
+'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('
+#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255
+#230#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#252'('
+#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
,'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#230#0#255
+#255#230#0#255#255#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252
+'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252'('
+#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#230#0#255#255#230#0#255#255#230#0#255#255#230#0#255#255#255#255
+#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#252
+'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('
+#4#255#252'('#4#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255#255
+#230#0#255#255#230#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255
+#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#252'('#4#255
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#230
+#0#255#255#230#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#252'('#4#255#252'('#4#255#255#255#255#0#255#255#255#0#6#6#255#255#6#6
+#255#255#6#6#255#255#0#175#231#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#252'('#4#255#252'('#4#255#252'('#4#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#230#0#255#255#230#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255
+#0#175#231#255#0#175#231#255#141#157'5'#255#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#0#175#231#255#0#175#231#255#0#175#231#255
+#0#175#231#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#0#175#231#255
+#141#157'5'#255#141#157'5'#255#141#157'5'#255#141#157'5'#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#175#231
+#255#0#175#231#255#0#175#231#255#0#175#231#255#0#175#231#255#0#175#231#255#6
+#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#141#157'5'#255
+#141#157'5'#255#141#157'5'#255#141#157'5'#255#141#157'5'#255#155'^:'#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
,#255#0#255#255#255#0#255#255#255#0#0#175#231#255#0#175#231#255#0#175#231#255
+#0#175#231#255#0#175#231#255#255#255#255#0#141#157'5'#255#6#6#255#255#6#6#255
+#255#6#6#255#255#6#6#255#255#141#157'5'#255#255#255#255#0#255#255#255#0#141
+#157'5'#255#141#157'5'#255#155'^:'#255#155'^:'#255#155'^:'#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#0#175#231#255#0#175#231#255#0#175#231#255#141#157'5'
+#255#141#157'5'#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255
+#255#141#157'5'#255#141#157'5'#255#155'^:'#255#155'^:'#255#155'^:'#255#155'^'
+':'#255#155'^:'#255#155'^:'#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#141#157'5'#255#141#157'5'#255#141#157'5'#255#141#157'5'
+#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#155'^:'#255#155'^:'#255
+#155'^:'#255#155'^:'#255#155'^:'#255#155'^:'#255#155'^:'#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#155'^:'#255#155'^:'#255#6#6#255#255#6#6#255#255#6#6#255
+#255#6#6#255#255#255#255#255#0#255#255#255#0#155'^:'#255#155'^:'#255#155'^:'
+#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255
+#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#6#6#255#255#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6
+#6#255#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255
,#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6
+#255#255#6#6#255#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255
+#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255
+#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#6#6#255#255#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6
+#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6
+#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
,#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#199#255#255#255#207#0#0#255#129#241#243#255#135#0#0
+#255#0#240#225#255#131#0#0#255#0#240#225#255#131#0#0#255#0#240#225#255#135#0
+#0#255#0#240#225#255#199#0#0#255#0#248#240#199#199#0#0#255#0#248'p'#195#195#0
+#0#255#128#248'x'#193#227#0#0#255#128#252'x'#193#227#0#0#255#128#252'x@'#227
+#0#0#255#128#252'8@c'#0#0#255#128#254'<@c'#0#0#255#192#254'<'#6'1'#0#0#255
+#192#254#28#7#17#0#0#255#192#254#28#7#1#0#0#255#192#255#30#7#129#0#0#255#192
+#255#14#7#193#0#0#255#224#255#14#7#193#0#0#255#224#255#14#15#224#0#0#255#224
+#255#14#15#224#0#0#255#224#255#6#15#240#0#0#255#224#255#134#15#240#0#0#255
+#240#127#135#15#240#0#0#255#240#127#135#152'x'#0#0#255#240#127#159#240#31#0#0
+#255#240#127#255#0#7#0#0#255#240'?'#252#0#129#0#0#255#248'?'#248' `'#0#0#255
+#248'?'#252#16#0#0#0#255#248#31#255#0#1#0#0#255#248#31#255#192#199#0#0#255
+#248#31#255#240#135#0#0#255#252#15#255#240#131#0#0#255#252#15#255#240#129#0#0
+#255#252#15#255#240#129#0#0#255#252#7#255#240#129#0#0#255#252#7#255#240#129#0
+#0#255#252#7#255#240#129#0#0#255#252#3#255#240#131#0#0#135#248#3#199#240#3#0
+#0#0#0#0#0#240#7#0#0#0#0#0#0'0?'#0#0#0#0#0#0#31#255#0#0#0#0#0#0#15#255#0#0#0
+#0#0#0#15#255#0#0#0#0#0#0#15#255#0#0#135#255#255#0#31#255#0#0'('#0#0#0' '#0#0
+#0'@'#0#0#0#1#0' '#0#0#0#0#0#128#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#220#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#220#0#255#255#220#0#255#255#220#0#255#255#255#255#255#0#255
,#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'
+#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#220#0
+#255#255#220#0#255#255#220#0#255#255#255#255#255#0#255#255#255#0#255'&'#0#255
+#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255
+'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255#255#255#255#0#255#255#255#0#220#0#255#255#220#0#255#255#220
+#0#255#255#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255
+#255#255#0#255#255#255#0#255#255#255#0#220#0#255#255#220#0#255#255#255#255
+#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255
+#255#255#0#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#220#0#255#255#220#0#255#255#220#0#255#255#255#255#255#0
+#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255'&'#0
+#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255'&'#0#255#255
+'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0
+#220#0#255#255#220#0#255#255#220#0#255#255#255#255#255#0#255#255#255#0#255'&'
+#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255'&'#0#255#255'&'#0#255#255
+'&'#0#255#255'&'#0#255#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#220#0
+#255#255#220#0#255#255#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255
+#255'&'#0#255#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0
+#255#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#220#0#255#255#220#0#255
+#255#220#0#255#255#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255
+#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255
+#255#255#255#0#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#220#0#255#255#220#0#255#255#220#0#255#255
+#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0
+#255#255'&'#0#255#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'
+#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#220#0#255#255#220#0#255#255#220#0#255#255#255#255#255#0#255#255
+#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255#255
+#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255
+#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#220#0#255#255#220#0#255#255#220#0#255#255#255#255#255#0#255'&'#0#255
+#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#220#0#255
+#255#220#0#255#255#220#0#255#255#255#255#255#0#255'&'#0#255#255'&'#0#255#255
,'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#220#0#255#255#220#0#255#255
+#220#0#255#255#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0
+#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#220#0#255#255#220#0#255#255#220#0#255#255
+#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255'&'#0#255
+#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255
+'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#220#0#255#255#220#0#255#255#220#0#255#255#255#255#255#0
+#255#255#255#0#255'&'#0#255#255'&'#0#255#255'&'#0#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255
+#255'&'#0#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'
+#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#220#0#255#255#220#0#255#255#220#0#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255
+#255#0#175#231#255#255#255#255#0#255#255#255#0#255'&'#0#255#255'&'#0#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#175#231#255#0#175#231#255
+#0#175#231#255#0#175#231#255#6#6#255#255#6#6#255#255#6#6#255#255#0#175#231
+#255#141#157'5'#255#141#157'5'#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#0#175#231#255#0#175#231#255#0#175#231#255#0#175#231
+#255#0#175#231#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#141#157
+'5'#255#141#157'5'#255#141#157'5'#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#0#175#231#255#0#175#231#255#141#157'5'#255#255#255
+#255#0#6#6#255#255#6#6#255#255#6#6#255#255#141#157'5'#255#255#255#255#0#155
+'^:'#255#155'^:'#255#155'^:'#255#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#141#157'5'#255#141#157'5'#255#141#157'5'#255#6#6#255
+#255#6#6#255#255#6#6#255#255#155'^:'#255#155'^:'#255#155'^:'#255#155'^:'#255
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#155'^:'#255#6#6#255#255#6#6#255#255#6#6
+#255#255#255#255#255#0#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#255
+#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
,#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#6#6#255#255
+#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6
+#255#255#6#6#255#255#6#6#255#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255
+#6#6#255#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0
+#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#6#6#255#255#6#6#255#255#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#6#6#255#255#6#6
+#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255
+#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#255#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0
+#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'
+#0#255#255'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0'w'#0#255#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0'w'#0#255#255'w'#0#255#255'w'#0#255#255
+'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255#255'w'#0#255
+#255'w'#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#252'='#255#243#248#24
+#199#225#248#24#199#225#248#24#199#243#248#28#198'q'#252#28'b1'#252#28'b'#17
+#252#30'b'#25#252#30'2'#9#252#30'0A'#252#30'0`'#254#31#16'p'#254#31#16'p'#254
+#31#24#248#254#31#16#248#255#31#24#248#255#31#31#140#255#15#240#3#255#15#224
+#17#255#15#241#8#255#7#248#1#255#135#254#19#255#135#255#17#255#131#255#17#255
+#131#255#17#255#131#255#17#143#129#255#1#0#0#3#3#0#0#1#7#0#0#0#255#0#0#0#255
+#159#252#0#255'('#0#0#0#16#0#0#0' '#0#0#0#1#0' '#0#0#0#0#0'@'#4#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255
+#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#0
+#175#231#255#0#175#231#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#0#175#231#255#0#175#231#255#0#175#231#255#0#175#231#255
+#0#175#231#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#141#157'5'#255
+#141#157'5'#255#141#157'5'#255#141#157'5'#255#255#255#255#0#255#255#255#0#0
+#175#231#255#0#175#231#255#0#175#231#255#0#175#231#255#0#175#231#255#0#175
+#231#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#141
,#157'5'#255#141#157'5'#255#141#157'5'#255#155'^:'#255#255#255#255#0#0#175#231
+#255#0#175#231#255#0#175#231#255#0#175#231#255#141#157'5'#255#255#255#255#0#6
+#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#141#157'5'#255#255#255#255#0
+#155'^:'#255#155'^:'#255#155'^:'#255#155'^:'#255#255#255#255#0#255#255#255#0
+#141#157'5'#255#141#157'5'#255#141#157'5'#255#141#157'5'#255#6#6#255#255#6#6
+#255#255#6#6#255#255#6#6#255#255#155'^:'#255#155'^:'#255#155'^:'#255#155'^:'
+#255#155'^:'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#141#157'5'#255#155'^:'#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#255#255#255#0#155'^:'#255#155'^:'#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255
+#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#6#6
+#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#6#6#255#255#6#6#255
+#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255
+#6#6#255#255#6#6#255#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6
+#6#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255
+#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255#0#255#255
+#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6
+#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255
+#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#6#6#255#255#255#255#255
+#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+#255#255#0#255#255#255#0#255#255#255#0#6#6#255#255#6#6#255#255#6#6#255#255#6
+#6#255#255#6#6#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+#0#255#255#255#0#254'?'#0#0#252#15#0#0#128#3#0#0#0'!'#0#0#4#16#0#0#192#1#0#0
+#240''''#0#0#252'#'#0#0#252'!'#0#0#252'!'#0#0#252'!'#0#0#252'!'#0#0#252#1#0#0
+#252#3#0#0#252#7#0#0#252#31#0#0#4'Menu'#7#6'mmMain'#7'OnClose'#7#9'FormClose'
+#8'OnCreate'#7#10'FormCreate'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'
+#6#3'1.3'#0#6'TPanel'#9'pnlStatus'#4'Left'#2#0#6'Height'#2#30#3'Top'#3#28#2#5
+'Width'#3#12#3#5'Align'#7#8'alBottom'#10'BevelOuter'#7#9'bvLowered'#12'Clien'
+'tHeight'#2#30#11'ClientWidth'#3#12#3#8'TabOrder'#2#2#0#6'TLabel'#9'lblStatu'
+'s'#4'Left'#2'L'#6'Height'#2#28#3'Top'#2#1#5'Width'#3#164#0#5'Align'#7#8'alC'
+'lient'#9'Alignment'#7#14'taRightJustify'#6'Layout'#7#8'tlCenter'#11'ParentC'
+'olor'#8#0#0#12'TProgressBar'#10'pbProgress'#4'Left'#3#240#0#6'Height'#2#28#3
+'Top'#2#1#5'Width'#3#27#2#5'Align'#7#7'alRight'#7'Anchors'#11#5'akTop'#6'akL'
+'eft'#7'akRight'#8'akBottom'#0#6'Smooth'#9#8'TabOrder'#2#1#0#0#7'TButton'#11
+'btnStopScan'#4'Left'#2#1#6'Height'#2#28#3'Top'#2#1#5'Width'#2'K'#5'Align'#7
+#6'alLeft'#7'Caption'#6#9'Stop Scan'#7'Enabled'#8#7'OnClick'#7#16'btnStopSca'
+'nClick'#8'TabOrder'#2#0#0#0#0#9'TComboBox'#8'cbbFiles'#4'Left'#2#0#6'Height'
+#2#21#3'Top'#2#0#5'Width'#3#12#3#5'Align'#7#5'alTop'#13'DropDownCount'#2#30#7
+'Enabled'#8#10'ItemHeight'#2#13#8'OnChange'#7#14'cbbFilesChange'#9'OnCloseUp'
+#7#21'actReturnFocusExecute'#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#0#0
+#0#6'TPanel'#7'pnlMain'#4'Left'#2#0#6'Height'#3#7#2#3'Top'#2#21#5'Width'#3#12
+#3#5'Align'#7#8'alClient'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#3#7#2
+#11'ClientWidth'#3#12#3#8'TabOrder'#2#1#0#9'TSplitter'#7'splMain'#4'Left'#3
+#240#0#6'Height'#3#7#2#3'Top'#2#0#5'Width'#2#5#0#0#6'TPanel'#7'pnlList'#4'Le'
+'ft'#2#0#6'Height'#3#7#2#3'Top'#2#0#5'Width'#3#240#0#5'Align'#7#6'alLeft'#10
+'BevelOuter'#7#6'bvNone'#12'ClientHeight'#3#7#2#11'ClientWidth'#3#240#0#8'Ta'
+'bOrder'#2#0#0#9'TListView'#6'lvList'#4'Left'#2#0#6'Height'#3#230#1#3'Top'#2
+'!'#5'Width'#3#240#0#5'Align'#7#8'alClient'#7'Columns'#14#1#7'Caption'#6#5'#'
+' / 0'#5'Width'#2'<'#0#1#9'Alignment'#7#8'taCenter'#7'Caption'#6#5'W x H'#5
+'Width'#2'F'#0#1#9'Alignment'#7#8'taCenter'#7'Caption'#6#3'BPP'#5'Width'#2'#'
+#0#1#9'Alignment'#7#8'taCenter'#7'Caption'#6#5'CLUTs'#0#0#11'ColumnClick'#8#7
+'Enabled'#8#9'GridLines'#9#13'HideSelection'#8#9'OwnerData'#9#9'PopupMenu'#7
,#6'pmList'#8'ReadOnly'#9#9'RowSelect'#9#8'TabOrder'#2#0#9'ViewStyle'#7#8'vsR'
+'eport'#0#0#6'TPanel'#13'pnlExtractAll'#4'Left'#2#0#6'Height'#2'!'#3'Top'#2#0
+#5'Width'#3#240#0#5'Align'#7#5'alTop'#10'BevelOuter'#7#9'bvLowered'#12'Clien'
+'tHeight'#2'!'#11'ClientWidth'#3#240#0#8'TabOrder'#2#1#0#7'TButton'#17'btnEx'
+'tractAllTims'#4'Left'#3#139#0#6'Height'#2#31#3'Top'#2#1#5'Width'#2'd'#6'Act'
+'ion'#7#14'actExtractPNGs'#5'Align'#7#7'alRight'#8'TabOrder'#2#0#0#0#7'TButt'
+'on'#14'btnExtractPNGs'#4'Left'#2#1#6'Height'#2#31#3'Top'#2#1#5'Width'#2'd'#6
+'Action'#7#14'actExtractTIMs'#5'Align'#7#6'alLeft'#8'TabOrder'#2#1#0#0#0#0#6
+'TPanel'#8'pnlImage'#4'Left'#3#245#0#6'Height'#3#7#2#3'Top'#2#0#5'Width'#3#23
+#2#5'Align'#7#8'alClient'#10'BevelOuter'#7#9'bvLowered'#12'ClientHeight'#3#7
+#2#11'ClientWidth'#3#23#2#8'TabOrder'#2#1#0#9'TSplitter'#12'splImageClut'#6
+'Cursor'#7#8'crVSplit'#4'Left'#2#1#6'Height'#2#3#3'Top'#2#1#5'Width'#3#21#2#5
+'Align'#7#5'alTop'#7'Beveled'#9#12'ResizeAnchor'#7#5'akTop'#0#0#6'TImage'#5
+'pbTim'#4'Left'#2#1#6'Height'#3'U'#1#3'Top'#2#4#5'Width'#3#21#2#5'Align'#7#8
+'alClient'#6'Center'#9#9'PopupMenu'#7#7'pmImage'#12'Proportional'#9#0#0#9'TD'
+'rawGrid'#11'grdCurrClut'#4'Left'#2#1#6'Height'#3#150#0#3'Top'#3'Y'#1#5'Widt'
+'h'#3#21#2#5'Align'#7#8'alBottom'#8'ColCount'#2#1#15'DefaultColWidth'#2#14#16
+'DefaultRowHeight'#2#14#7'Enabled'#8#14'ExtendedSelect'#8#9'FixedCols'#2#0#9
+'FixedRows'#2#0#7'Options'#11#15'goFixedVertLine'#15'goFixedHorzLine'#10'goV'
+'ertLine'#10'goHorzLine'#19'goDrawFocusSelected'#0#8'RowCount'#2#1#10'Scroll'
+'Bars'#7#6'ssNone'#8'TabOrder'#2#0#15'TitleFont.Color'#7#12'clWindowText'#16
+'TitleFont.Height'#2#245#14'TitleFont.Name'#6#6'Tahoma'#7'Visible'#8#10'OnDb'
+'lClick'#7#19'grdCurrClutDblClick'#10'OnDrawCell'#7#19'grdCurrClutDrawCell'#0
+#0#6'TPanel'#15'pnlImageOptions'#4'Left'#2#1#6'Height'#2#23#3'Top'#3#239#1#5
+'Width'#3#21#2#5'Align'#7#8'alBottom'#8'AutoSize'#9#10'BevelOuter'#7#6'bvNon'
+'e'#12'ClientHeight'#2#23#11'ClientWidth'#3#21#2#8'TabOrder'#2#1#0#7'TButton'
+#11'btnShowClut'#4'Left'#3#225#1#6'Height'#2#23#3'Top'#2#0#5'Width'#2'4'#5'A'
+'lign'#7#7'alRight'#7'Caption'#6#4'CLUT'#7'OnClick'#7#16'btnShowClutClick'#8
+'TabOrder'#2#0#0#0#9'TComboBox'#10'cbbBitMode'#4'Left'#2#0#6'Height'#2#21#3
+'Top'#2#0#5'Width'#2'J'#5'Align'#7#6'alLeft'#7'Enabled'#8#10'ItemHeight'#2#13
+#9'ItemIndex'#2#0#13'Items.Strings'#1#6#4'Real'#6#5'4 BPP'#6#5'8 BPP'#6#6'16'
+' BPP'#6#6'24 BPP'#0#8'OnChange'#7#25'actDrawSelectedTimExecute'#9'OnCloseUp'
+#7#21'actReturnFocusExecute'#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#1#4
+'Text'#6#4'Real'#0#0#9'TComboBox'#13'cbbTranspMode'#4'Left'#2'J'#6'Height'#2
+#21#3'Top'#2#0#5'Width'#2'z'#5'Align'#7#6'alLeft'#7'Enabled'#8#10'ItemHeight'
+#2#13#9'ItemIndex'#2#0#13'Items.Strings'#1#6#17'Full transparence'#6#18'Blac'
+'k Transparence'#6#17'Semi Transparence'#6#15'No Transparence'#0#8'OnChange'
+#7#19'cbbTranspModeChange'#9'OnCloseUp'#7#21'actReturnFocusExecute'#5'Style'
+#7#14'csDropDownList'#8'TabOrder'#2#2#4'Text'#6#17'Full transparence'#0#0#9
+'TComboBox'#7'cbbCLUT'#4'Left'#3't'#1#6'Height'#2#21#3'Top'#2#0#5'Width'#2'm'
+#5'Align'#7#7'alRight'#13'DropDownCount'#2#16#10'ItemHeight'#2#13#8'OnChange'
+#7#13'cbbCLUTChange'#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#3#0#0#0#0#0
+#11'TOpenDialog'#11'dlgOpenFile'#5'Title'#6#22'Please, select File...'#10'De'
+'faultExt'#6#4'.bin'#6'Filter'#6#19'All Files (*.*)|*.*'#7'Options'#11#14'of'
+'HideReadOnly'#13'ofNoChangeDir'#18'ofAllowMultiSelect'#15'ofFileMustExist'
+#17'ofNoNetworkButton'#14'ofEnableSizing'#17'ofForceShowHidden'#0#4'left'#3
+#156#2#3'top'#3#246#1#0#0#9'TMainMenu'#6'mmMain'#4'left'#3'`'#2#3'top'#3#248
+#1#0#9'TMenuItem'#6'mnFile'#7'Caption'#6#5'&File'#0#9'TMenuItem'#10'mnScanFi'
+'le'#6'Action'#7#11'actScanFile'#0#0#9'TMenuItem'#9'mnScanDir'#6'Action'#7#10
+'actScanDir'#0#0#9'TMenuItem'#2'N1'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#11'mn'
+'CloseFile'#6'Action'#7#12'actCloseFile'#0#0#9'TMenuItem'#15'mnCloseAllFiles'
+#6'Action'#7#13'actCloseFiles'#0#0#9'TMenuItem'#6'mnExit'#6'Action'#7#7'actE'
+'xit'#0#0#0#9'TMenuItem'#5'mnTIM'#7'Caption'#6#4'&TIM'#0#9'TMenuItem'#9'mnSa'
+'veTIM'#6'Action'#7#13'actExtractTim'#0#0#9'TMenuItem'#11'mnReplaceIn'#6'Act'
+'ion'#7#13'actReplaceTim'#0#0#9'TMenuItem'#11'mnSaveToPNG'#6'Action'#7#10'ac'
+'tTim2Png'#0#0#9'TMenuItem'#2'N4'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#13'mnTi'
+'mInfoMain'#6'Action'#7#10'actTimInfo'#0#0#0#9'TMenuItem'#9'mnOptions'#7'Cap'
+'tion'#6#8'&Options'#0#9'TMenuItem'#11'mnAssociate'#6'Action'#7#12'actAssocT'
+'ims'#0#0#0#9'TMenuItem'#6'mnHelp'#7'Caption'#6#5'&Help'#0#9'TMenuItem'#5'mn'
+'SVN'#6'Action'#7#11'actOpenRepo'#0#0#9'TMenuItem'#6'mnSite'#6'Action'#7#10
+'actOpenLab'#0#0#9'TMenuItem'#2'N3'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#7'mnA'
+'bout'#6'Action'#7#8'actAbout'#0#0#0#0#18'TSavePictureDialog'#10'dlgSavePNG'
+#5'Title'#6'"Please, select filename for PNG...'#10'DefaultExt'#6#4'.png'#6
+'Filter'#6'''Portable Network Graphics (*.png)|*.png'#7'Options'#11#14'ofHid'
,'eReadOnly'#13'ofNoChangeDir'#17'ofNoNetworkButton'#14'ofEnableSizing'#0#4'l'
+'eft'#3#192#2#3'top'#3#248#1#0#0#11'TSaveDialog'#10'dlgSaveTIM'#5'Title'#6'('
+'Please, select where to save TIM file...'#10'DefaultExt'#6#4'.tim'#6'Filter'
+#6'/PSX TIM Files (*.tim)|*.tim|All Files (*.*)|*.*'#7'Options'#11#17'ofOver'
+'writePrompt'#14'ofHideReadOnly'#13'ofNoChangeDir'#17'ofNoNetworkButton'#14
+'ofEnableSizing'#0#4'left'#3'@'#2#3'top'#3#248#1#0#0#12'TColorDialog'#8'dlgC'
+'olor'#5'Color'#7#7'clBlack'#20'CustomColors.Strings'#1#6#13'ColorA=000000'#6
+#13'ColorB=000080'#6#13'ColorC=008000'#6#13'ColorD=008080'#6#13'ColorE=80000'
+'0'#6#13'ColorF=800080'#6#13'ColorG=808000'#6#13'ColorH=808080'#6#13'ColorI='
+'C0C0C0'#6#13'ColorJ=0000FF'#6#13'ColorK=00FF00'#6#13'ColorL=00FFFF'#6#13'Co'
+'lorM=FF0000'#6#13'ColorN=FF00FF'#6#13'ColorO=FFFF00'#6#13'ColorP=FFFFFF'#6
+#13'ColorQ=C0DCC0'#6#13'ColorR=F0CAA6'#6#13'ColorS=F0FBFF'#6#13'ColorT=A4A0A'
+'0'#0#4'left'#3' '#2#3'top'#3#246#1#0#0#11'TActionList'#7'actList'#4'left'#3
+#0#2#3'top'#3#246#1#0#7'TAction'#11'actScanFile'#7'Caption'#6#13'Scan &File.'
+'..'#9'OnExecute'#7#18'actScanFileExecute'#8'ShortCut'#2't'#0#0#7'TAction'#10
+'actScanDir'#7'Caption'#6#18'Scan &Directory...'#9'OnExecute'#7#17'actScanDi'
+'rExecute'#8'ShortCut'#2'u'#0#0#7'TAction'#12'actCloseFile'#7'Caption'#6#16
+'Close &this File'#9'OnExecute'#7#19'actCloseFileExecute'#8'ShortCut'#2'w'#0
+#0#7'TAction'#13'actCloseFiles'#7'Caption'#6#16'Close &all Files'#9'OnExecut'
+'e'#7#20'actCloseFilesExecute'#8'ShortCut'#2'x'#0#0#7'TAction'#7'actExit'#7
+'Caption'#6#8'&Exit...'#9'OnExecute'#7#14'actExitExecute'#8'ShortCut'#2'y'#0
+#0#7'TAction'#13'actExtractTim'#7'Caption'#6#15'&Extract TIM...'#9'OnExecute'
+#7#20'actExtractTimExecute'#8'ShortCut'#2'q'#0#0#7'TAction'#13'actReplaceTim'
+#7'Caption'#6#15'&Replace TIM...'#9'OnExecute'#7#20'actReplaceTimExecute'#8
+'ShortCut'#2'r'#0#0#7'TAction'#10'actTim2Png'#7'Caption'#6#15'Save as &PNG..'
+'.'#9'OnExecute'#7#17'actTim2PngExecute'#8'ShortCut'#2's'#0#0#7'TAction'#11
+'actOpenRepo'#7'Caption'#6#17'Tim2Vew &SVN Repo'#9'OnExecute'#7#18'actOpenRe'
+'poExecute'#0#0#7'TAction'#10'actOpenLab'#7'Caption'#6#15'[&Lab313] Forum'#9
+'OnExecute'#7#17'actOpenLabExecute'#0#0#7'TAction'#8'actAbout'#7'Caption'#6#9
+'&About...'#9'OnExecute'#7#15'actAboutExecute'#0#0#7'TAction'#10'actStretch'
+#9'AutoCheck'#9#7'Caption'#6#14'&Stretch Image'#9'OnExecute'#7#17'actStretch'
+'Execute'#0#0#7'TAction'#10'actTimInfo'#7'Caption'#6#9'&TIM Info'#7'Enabled'
+#8#9'OnExecute'#7#17'actTimInfoExecute'#0#0#7'TAction'#12'actAssocTims'#7'Ca'
+'ption'#6#19'&Open TIMs with T2V'#9'OnExecute'#7#19'actAssocTimsExecute'#0#0
+#7'TAction'#14'actExtractTIMs'#7'Caption'#6#17'Extract all &TIMs'#7'Enabled'
+#8#9'OnExecute'#7#21'actExtractTIMsExecute'#8'ShortCut'#3'q '#0#0#7'TAction'
+#14'actExtractPNGs'#7'Caption'#6#19'&Extract all PNGs'#13#10#7'Enabled'#8#9
+'OnExecute'#7#21'actExtractPNGsExecute'#8'ShortCut'#3's '#0#0#7'TAction'#16
+'actChangeClutIdx'#0#0#7'TAction'#14'actReturnFocus'#9'OnExecute'#7#21'actRe'
+'turnFocusExecute'#0#0#7'TAction'#18'actDrawSelectedTim'#9'OnExecute'#7#25'a'
+'ctDrawSelectedTimExecute'#0#0#0#10'TPopupMenu'#6'pmList'#4'left'#3#128#2#3
+'top'#3#246#1#0#9'TMenuItem'#11'ExtractTIM1'#6'Action'#7#13'actExtractTim'#0
+#0#9'TMenuItem'#11'ReplaceTIM1'#6'Action'#7#13'actReplaceTim'#0#0#9'TMenuIte'
+'m'#10'SaveasPNG1'#6'Action'#7#10'actTim2Png'#0#0#9'TMenuItem'#2'N2'#7'Capti'
+'on'#6#1'-'#0#0#9'TMenuItem'#9'mnTIMInfo'#6'Action'#7#10'actTimInfo'#0#0#0#10
+'TPopupMenu'#7'pmImage'#4'left'#3#224#1#3'top'#3#246#1#0#9'TMenuItem'#11'mnS'
+'aveAsPng'#6'Action'#7#10'actTim2Png'#0#0#9'TMenuItem'#2'N5'#7'Caption'#6#1
+'-'#0#0#9'TMenuItem'#9'mnStretch'#6'Action'#7#10'actStretch'#9'AutoCheck'#9#0
+#0#0#0
]);

View File

@@ -1,129 +1,134 @@
unit umain;
{$mode objfpc}{$H+}
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ComCtrls,
Vcl.ExtCtrls, Vcl.Menus, Vcl.StdCtrls, uScanThread, uCommon,
Winapi.ShellAPI, uDrawTIM, Vcl.ExtDlgs, uTIM, System.Actions,
Vcl.ActnList, uScanResult, System.Types, uSettings, ueventwaitthread;
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ActnList,
Menus, StdCtrls, ExtCtrls, ComCtrls, Grids, ExtDlgs,
const
WM_COMMANDARRIVED = WM_USER + 1;
uscanresult, uscanthread, usettings, utim, udrawtim;
type
{ TfrmMain }
TfrmMain = class(TForm)
dlgOpenFile: TOpenDialog;
mmMain: TMainMenu;
mnFile: TMenuItem;
mnScanFile: TMenuItem;
mnScanDir: TMenuItem;
N1: TMenuItem;
mnCloseFile: TMenuItem;
mnExit: TMenuItem;
mnTIM: TMenuItem;
mnReplaceIn: TMenuItem;
mnHelp: TMenuItem;
mnSVN: TMenuItem;
mnSite: TMenuItem;
N3: TMenuItem;
mnAbout: TMenuItem;
pbProgress: TProgressBar;
mnOptions: TMenuItem;
pnlStatus: TPanel;
lblStatus: TLabel;
btnStopScan: TButton;
mnCloseAllFiles: TMenuItem;
mnSaveToPNG: TMenuItem;
dlgSavePNG: TSavePictureDialog;
mnSaveTIM: TMenuItem;
dlgSaveTIM: TSaveDialog;
cbbFiles: TComboBox;
pnlMain: TPanel;
splMain: TSplitter;
pnlList: TPanel;
lvList: TListView;
pnlImageOptions: TPanel;
cbbTranspMode: TComboBox;
grdCurrClut: TDrawGrid;
pnlImage: TPanel;
splImageClut: TSplitter;
dlgColor: TColorDialog;
actList: TActionList;
actScanFile: TAction;
actScanDir: TAction;
actAbout: TAction;
actAssocTims: TAction;
actChangeClutIdx: TAction;
actCloseFile: TAction;
actCloseFiles: TAction;
actExit: TAction;
N4: TMenuItem;
actExtractTim: TAction;
actReplaceTim: TAction;
actTim2Png: TAction;
actOpenRepo: TAction;
actOpenLab: TAction;
actAbout: TAction;
pmList: TPopupMenu;
ExtractTIM1: TMenuItem;
ReplaceTIM1: TMenuItem;
N2: TMenuItem;
SaveasPNG1: TMenuItem;
cbbBitMode: TComboBox;
actStretch: TAction;
actTimInfo: TAction;
mnTIMInfo: TMenuItem;
mnTimInfoMain: TMenuItem;
actAssocTims: TAction;
mnAssociate: TMenuItem;
actExtractTIMs: TAction;
pbTim: TImage;
btnShowClut: TButton;
cbbCLUT: TComboBox;
actReturnFocus: TAction;
actDrawSelectedTim: TAction;
actExtractPNGs: TAction;
pnlExtractAll: TPanel;
actExtractTim: TAction;
actExtractTIMs: TAction;
actChangeFile: TAction;
actOpenLab: TAction;
actOpenRepo: TAction;
actReplaceTim: TAction;
actReturnFocus: TAction;
actScanDir: TAction;
actScanFile: TAction;
actList: TActionList;
actStretch: TAction;
actTim2Png: TAction;
actTimInfo: TAction;
btnExtractAllTims: TButton;
btnExtractPNGs: TButton;
actChangeFile: TAction;
procedure btnStopScanClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lvListData(Sender: TObject; Item: TListItem);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure grdCurrClutDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
procedure grdCurrClutDblClick(Sender: TObject);
procedure actScanFileExecute(Sender: TObject);
procedure actScanDirExecute(Sender: TObject);
btnShowClut: TButton;
btnStopScan: TButton;
cbbBitMode: TComboBox;
cbbCLUT: TComboBox;
cbbFiles: TComboBox;
cbbTranspMode: TComboBox;
dlgColor: TColorDialog;
dlgOpenFile: TOpenDialog;
dlgSavePNG: TSavePictureDialog;
dlgSaveTIM: TSaveDialog;
ExtractTIM1: TMenuItem;
grdCurrClut: TDrawGrid;
imgTim: TImage;
lblStatus: TLabel;
lvList: TListView;
mnSaveAsPng: TMenuItem;
mnAbout: TMenuItem;
mnAssociate: TMenuItem;
mnCloseAllFiles: TMenuItem;
mnCloseFile: TMenuItem;
mnExit: TMenuItem;
mnFile: TMenuItem;
mmMain: TMainMenu;
mnHelp: TMenuItem;
mnOptions: TMenuItem;
mnReplaceIn: TMenuItem;
mnSaveTIM: TMenuItem;
mnSaveToPNG: TMenuItem;
mnScanDir: TMenuItem;
mnScanFile: TMenuItem;
mnSite: TMenuItem;
mnStretch: TMenuItem;
mnSVN: TMenuItem;
mnTIM: TMenuItem;
mnTIMInfo: TMenuItem;
mnTimInfoMain: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
pbProgress: TProgressBar;
pnlExtractAll: TPanel;
pnlImage: TPanel;
pnlImageOptions: TPanel;
pnlList: TPanel;
pnlStatus: TPanel;
pnlMain: TPanel;
pmImage: TPopupMenu;
pmList: TPopupMenu;
ReplaceTIM1: TMenuItem;
SaveasPNG1: TMenuItem;
dlgSelectDir: TSelectDirectoryDialog;
splImageClut: TSplitter;
splMain: TSplitter;
procedure actAboutExecute(Sender: TObject);
procedure actAssocTimsExecute(Sender: TObject);
procedure actChangeClutIdxExecute(Sender: TObject);
procedure actChangeFileExecute(Sender: TObject);
procedure actCloseFileExecute(Sender: TObject);
procedure actCloseFilesExecute(Sender: TObject);
procedure actExitExecute(Sender: TObject);
procedure actExtractTimExecute(Sender: TObject);
procedure actReplaceTimExecute(Sender: TObject);
procedure actTim2PngExecute(Sender: TObject);
procedure actOpenRepoExecute(Sender: TObject);
procedure actOpenLabExecute(Sender: TObject);
procedure actAboutExecute(Sender: TObject);
procedure actStretchExecute(Sender: TObject);
procedure actTimInfoExecute(Sender: TObject);
procedure actAssocTimsExecute(Sender: TObject);
procedure actExtractTIMsExecute(Sender: TObject);
procedure cbbTranspModeChange(Sender: TObject);
procedure btnShowClutClick(Sender: TObject);
procedure actReturnFocusExecute(Sender: TObject);
procedure actExtractPNGsExecute(Sender: TObject);
procedure actChangeClutIdxExecute(Sender: TObject);
procedure actExtractTimExecute(Sender: TObject);
procedure actExtractTIMsExecute(Sender: TObject);
procedure actOpenLabExecute(Sender: TObject);
procedure actOpenRepoExecute(Sender: TObject);
procedure actReplaceTimExecute(Sender: TObject);
procedure actReturnFocusExecute(Sender: TObject);
procedure actScanDirExecute(Sender: TObject);
procedure actScanFileExecute(Sender: TObject);
procedure actStretchExecute(Sender: TObject);
procedure actTim2PngExecute(Sender: TObject);
procedure actTimInfoExecute(Sender: TObject);
procedure btnShowClutClick(Sender: TObject);
procedure cbbBitModeChange(Sender: TObject);
procedure cbbTranspModeChange(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
procedure grdCurrClutDblClick(Sender: TObject);
procedure grdCurrClutDrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
procedure lvListData(Sender: TObject; Item: TListItem);
procedure lvListSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
procedure cbbBitModeChange(Sender: TObject);
procedure actChangeFileExecute(Sender: TObject);
private
{ Private declarations }
{ private declarations }
StartedScans: Integer; //Count of currently started scans
LastDir: string; //var to store last selected dir
Settings: TSettings; //var to work with program settings
PNG: PPNG; { TODO : Declare variable to store drawable TIM in some drawable format }
WaitThread: TEventWaitThread;
Surf: PDrawSurf;
function FGetSelectedScanResult: TScanResult;
property SelectedScanResult: TScanResult read FGetSelectedScanResult; //Selected scan result
@@ -154,13 +159,8 @@ type
function FormatTimName(const FileName: string; ListIdx_, BitMode: Integer): string;
function FormatPngName(const FileName: string; ListIdx_, BitMode, Clut: Integer): string;
procedure ShowTim;
function ForceForegroundWindow(hwnd: THandle): Boolean;
protected
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
procedure WMCommandArrived(var Message: TMessage); message WM_COMMANDARRIVED;
function ReadPathFromMailslot: string;
public
{ Public declarations }
{ public declarations }
ScanResults: TScanResultList; //List of finished scan results
ScanThreads: TScanThreadList; //List of currently started scans
function CheckForFileOpened(const FileName: string): boolean;
@@ -168,14 +168,19 @@ type
var
frmMain: TfrmMain;
ServerMailSlot: THandle;
implementation
uses
ucdimage, udirselect, registry, pngimage;
uses ucdimage, ucpucount, lcltype, ucommon, LCLIntf, Clipbrd
{$R *.dfm}
{$IFDEF windows}
,registry
{$IFEND}
;
{$R *.lfm}
{ TfrmMain }
procedure TfrmMain.actScanFileExecute(Sender: TObject);
var
@@ -199,13 +204,13 @@ begin
if not dlgSavePNG.Execute then Exit;
PNG^.SaveToFile(dlgSavePNG.FileName);
Surf^.SaveToFile(dlgSavePNG.FileName);
end;
procedure TfrmMain.actTimInfoExecute(Sender: TObject);
const
Tab = #$09;
Row = #13#10;
Row = #10;
var
Info, IsGoodTIM: string;
Index: Integer;
@@ -247,12 +252,12 @@ begin
GetTimImageVRAMY(TIM), GetTimWidth(TIM), GetTimRealWidth(TIM),
GetTimHeight(TIM)]);
case MessageBox(Handle,
PWideChar(Info + Row + Row +
case Application.MessageBox(
PChar(Info + Row + Row +
'If you want to copy this info to clipboard press "YES" button.'),
'Information', MB_OKCANCEL + MB_ICONINFORMATION + MB_TOPMOST) of
'Information', MB_OKCANCEL + MB_ICONINFORMATION) of
IDOK:
Text2Clipboard(Info);
Clipboard.AsText := Info;
end;
FreeTIM(TIM);
@@ -289,10 +294,11 @@ end;
procedure TfrmMain.actAboutExecute(Sender: TObject);
begin
MessageBox(Handle, 'Some "about strings" should be here!:)', 'About', MB_OK + MB_ICONINFORMATION);
Application.MessageBox('Some "about strings" should be here!:)', 'About', MB_OK + MB_ICONINFORMATION);
end;
procedure TfrmMain.actAssocTimsExecute(Sender: TObject);
{$IFDEF windows}
var
reg: TRegistry;
begin
@@ -316,6 +322,9 @@ begin
finally
reg.Free;
end;
{$ELSE}
begin
{$ENDIF}
end;
procedure TfrmMain.actChangeClutIdxExecute(Sender: TObject);
@@ -354,7 +363,7 @@ begin
while cbbFiles.Items.Count > 0 do
actCloseFile.Execute;
cbbFiles.Items.EndUpdate;
end;
end;
procedure TfrmMain.actExitExecute(Sender: TObject);
begin
@@ -368,14 +377,14 @@ var
IsImage: Boolean;
ScanTim: TTimInfo;
TIM: PTIM;
PNG_: PPNG;
Surf_: PDrawSurf;
begin
lblStatus.Caption := sStatusBarPngsExtracting;
FName := SelectedScanResult.ScanFile;
IsImage := SelectedScanResult.IsImage;
New(PNG_);
New(Surf_);
pbProgress.Position := 0;
pbProgress.Max := SelectedScanResult.Count;
@@ -392,17 +401,17 @@ begin
CreateDir(Path);
TIM := LoadTimFromFile(FName, OFFSET, IsImage, SIZE);
TimToPNG(TIM, cbbCLUT.ItemIndex, PNG_, cbbTranspMode.ItemIndex);
TimToPNG(TIM, cbbCLUT.ItemIndex, Surf_, cbbTranspMode.ItemIndex);
PNG_^.SaveToFile(Path + FormatPngName(FName, I - 1, BIT_MODE, 0));
PNG_^.Free;
Surf_^.SaveToFile(Path + FormatPngName(FName, I - 1, BIT_MODE, 0));
Surf_^.Free;
FreeTIM(TIM);
pbProgress.Position := I;
Application.ProcessMessages;
end;
Dispose(PNG_);
Dispose(Surf_);
lblStatus.Caption := sStatusBarExtracted;
pbProgress.Position := 0;
end;
@@ -460,12 +469,12 @@ end;
procedure TfrmMain.actOpenLabExecute(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'tim2view.googlecode.com', nil, nil, SW_SHOW);
OpenUrl('http://lab313.ru');
end;
procedure TfrmMain.actOpenRepoExecute(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'tim2view.googlecode.com', nil, nil, SW_SHOW);
OpenUrl('http://tim2view.googlecode.com');
end;
procedure TfrmMain.actReplaceTimExecute(Sender: TObject);
@@ -487,7 +496,12 @@ procedure TfrmMain.actScanDirExecute(Sender: TObject);
var
SelectedDir: string;
begin
SelectedDir := BrowseForFolder(Handle, sSelectDirCaption, LastDir);
dlgSelectDir.Title := sSelectDirCaption;
dlgSelectDir.FileName := LastDir;
if not dlgSelectDir.Execute then Exit;
SelectedDir := dlgSelectDir.FileName;
if DirectoryExists(SelectedDir) then
begin
ScanPath(SelectedDir);
@@ -496,14 +510,14 @@ begin
end;
end;
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
procedure TfrmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
actCloseFiles.Execute;
ScanThreads.Free;
ScanResults.Free;
if PNG^ <> nil then PNG^.Free;
Dispose(PNG);
Surf^.Free;
Dispose(Surf);
Settings.Free;
end;
@@ -512,6 +526,8 @@ procedure TfrmMain.FormCreate(Sender: TObject);
var
hGridRect: TGridRect;
begin
{$IFDEF Linux}mnOptions.Visible := False;{$IFEND}
Settings := TSettings.Create(ExtractFilePath(ParamStr(0)));
actStretch.Checked := Settings.StretchMode;
@@ -524,47 +540,28 @@ begin
hGridRect.Bottom := -1;
grdCurrClut.Selection := hGridRect;
pbTim.Parent.DoubleBuffered := true;
ScanThreads := TScanThreadList.Create;
ScanResults := TScanResultList.Create;
ScanThreads := TScanThreadList.Create(False); //False - to able scan thread remove itself from this list
ScanResults := TScanResultList.Create(False);
StartedScans := 0;
New(PNG);
PNG^ := nil;
New(Surf);
Surf^ := nil;
SetCLUTListToNoCLUT;
Caption := cProgramName;
DragAcceptFiles(Handle, True);
Caption := Format('%s v%s', [cProgramName, cProgramVersion]);
CheckButtonsAndMainMenu;
if ParamCount > 0 then ScanPath(ParamStr(1));
WaitThread := TEventWaitThread.Create(False);
WaitThread.FreeOnTerminate := True;
end;
procedure TfrmMain.WMDropFiles(var Msg: TWMDropFiles);
procedure TfrmMain.FormDropFiles(Sender: TObject;
const FileNames: array of String);
var
I: Integer;
CountFile: Integer;
SIZE: Integer;
FileName: PChar;
i: Integer;
begin
FileName := nil;
try
CountFile := DragQueryFile(Msg.Drop, $FFFFFFFF, FileName, 1024);
for I := 0 to (CountFile - 1) do
begin
SIZE := DragQueryFile(Msg.Drop, I, nil, 0) + 1;
FileName := StrAlloc(SIZE);
DragQueryFile(Msg.Drop, I, FileName, SIZE);
ScanPath(StrPas(FileName));
StrDispose(FileName);
end;
finally
DragFinish(Msg.Drop);
end;
for i := 1 to Length(FileNames) do
ScanPath(FileNames[i - 1]);
end;
procedure TfrmMain.grdCurrClutDblClick(Sender: TObject);
@@ -624,10 +621,11 @@ begin
DrawSelTim;
DrawSelClut;
end;
procedure TfrmMain.grdCurrClutDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure TfrmMain.grdCurrClutDrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
var
TIM: PTIM;
begin
@@ -746,9 +744,9 @@ begin
ScanThreads.Add(TScanThread.Create(FileName, GetImageScan(FileName)));
ScanThreads.Last.FreeOnTerminate := True;
ScanThreads.Last.Priority := tpNormal;
ScanThreads.Last.OnTerminate := ScanFinished;
ScanThreads.Last.OnTerminate := @ScanFinished;
if StartedScans < GetCoreCount then
if StartedScans < GetLogicalCpuCount then
begin
ScanThreads.Last.Start;
Inc(StartedScans);
@@ -790,7 +788,7 @@ begin
actCloseFiles.Enabled := cbbFiles.Enabled;
actReplaceTim.Enabled := (lvList.Selected <> nil) and (lvList.Selected.Index <> -1);
actTim2Png.Enabled := (PNG^ <> nil) and actReplaceTim.Enabled;
actTim2Png.Enabled := (Surf^ <> nil) and actReplaceTim.Enabled;
actExtractTim.Enabled := actReplaceTim.Enabled;
cbbCLUT.Enabled := actReplaceTim.Enabled;
@@ -873,7 +871,7 @@ var
Index: Integer;
mode: Byte;
begin
pbTim.Picture := nil;
imgTim.Picture.Bitmap := nil;
case cbbBitMode.ItemIndex of
1: mode := cTIM4C;
@@ -887,19 +885,14 @@ begin
TIM := SelectedTimInMode[mode];
if TIM = nil then Exit;
if PNG^ <> nil then
begin
PNG^.Free;
PNG^ := nil;
end;
Index := cbbCLUT.ItemIndex;
TimToPNG(TIM, Index, PNG, cbbTranspMode.ItemIndex);
PNG^.AssignTo(pbTim.Picture.Bitmap);
TimToPNG(TIM, Index, Surf, cbbTranspMode.ItemIndex);
imgTim.Picture.Bitmap := TBitmap.Create;
imgTim.Picture.Bitmap := Surf^.Bitmap;
FreeTIM(TIM);
pbTim.Stretch := actStretch.Checked;
imgTim.Stretch := actStretch.Checked;
end;
procedure TfrmMain.DrawSelClut;
@@ -952,12 +945,14 @@ begin
cbbCLUT.ItemIndex := 0;
end;
function TfrmMain.FormatTimName(const FileName: string; ListIdx_, BitMode: Integer): string;
function TfrmMain.FormatTimName(const FileName: string; ListIdx_,
BitMode: Integer): string;
begin
Result := Format(cAutoExtractionTimFormat, [ExtractJustName(FileName), ListIdx_ + 1, BitMode]);
end;
function TfrmMain.FormatPngName(const FileName: string; ListIdx_, BitMode, Clut: Integer): string;
function TfrmMain.FormatPngName(const FileName: string; ListIdx_, BitMode,
Clut: Integer): string;
begin
Result := Format(cAutoExtractionPngFormat, [ExtractJustName(FileName), ListIdx_ + 1, BitMode, Clut + 1]);
end;
@@ -979,101 +974,5 @@ begin
CheckButtonsAndMainMenu;
end;
procedure TfrmMain.btnStopScanClick(Sender: TObject);
var
I: Integer;
begin
if ScanThreads.Count = 0 then Exit;
for I := 1 to ScanThreads.Count do
ScanThreads[I - 1].StopScan := True;
ScanThreads.Clear;
StartedScans := 0;
btnStopScan.Tag := NativeInt(True);
ScanFinished(nil);
actReturnFocusExecute(Self);
end;
function TfrmMain.ForceForegroundWindow(hwnd: THandle): Boolean;
const
SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
ForegroundThreadID: DWORD;
ThisThreadID: DWORD;
timeout: DWORD;
begin
if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);
if GetForegroundWindow = hwnd then Result := True
else
begin
// Windows 98/2000 doesn't want to foreground a window when some other
// window has keyboard focus
if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
(Win32MinorVersion > 0)))) then
begin
Result := False;
ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
begin
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hwnd);
AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
Result := (GetForegroundWindow = hwnd);
end;
if not Result then
begin
// Code by Daniel P. Stasinski
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
SPIF_SENDCHANGE);
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
end;
end
else
begin
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hwnd);
end;
Result := (GetForegroundWindow = hwnd);
end;
end;
function TfrmMain.ReadPathFromMailslot: string;
var
MessageSize: DWORD;
begin
GetMailslotInfo(ServerMailSlot, nil, MessageSize, nil, nil);
if MessageSize = MAILSLOT_NO_MESSAGE then
begin
Result := '';
Exit;
end;
SetLength(Result, MessageSize div SizeOf(Char));
ReadFile(ServerMailSlot, Result[1], MessageSize * SizeOf(Char), MessageSize, nil);
Result := Trim(Result);
end;
procedure TfrmMain.WMCommandArrived(var Message: TMessage);
var
path: string;
begin
ForceForegroundWindow(Self.Handle);
path := ReadPathFromMailslot;
ScanPath(path);
end;
end.

View File

@@ -1,48 +0,0 @@
unit ueventwaitthread;
interface
uses
Windows, Classes;
type
TEventWaitThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
var
CommandEvent: THandle;
implementation
uses
uMain;
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TEventWaitThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TEventWaitThread }
procedure TEventWaitThread.Execute;
begin
while True do
begin
if WaitForSingleObject(CommandEvent, INFINITE) <> WAIT_OBJECT_0 then
Exit;
PostMessage(frmMain.Handle, WM_COMMANDARRIVED, 0, 0);
end;
end;
end.

View File

@@ -1,74 +0,0 @@
unit udirselect;
interface
function BrowseForFolder(const appHWND: THandle; const browseTitle: String;
const initialFolder: String = ''): String;
implementation
uses
Windows, shlobj;
var
lg_StartFolder: String;
/// /////////////////////////////////////////////////////////////////////
// Call back function used to set the initial browse directory.
/// /////////////////////////////////////////////////////////////////////
function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT; lParam, lpData: lParam)
: Integer stdcall;
begin
if uMsg = BFFM_INITIALIZED then
SendMessage(Wnd, BFFM_SETSELECTION, 1, Integer(@lg_StartFolder[1]));
result := 0;
end;
/// /////////////////////////////////////////////////////////////////////
// This function allows the user to browse for a folder
//
// Arguments:-
// browseTitle : The title to display on the browse dialog.
// initialFolder : Optional argument. Use to specify the folder
// initially selected when the dialog opens.
// mayCreateNewFolder : Flag indicating whether the user can create a
// new folder.
//
// Returns: The empty string if no folder was selected (i.e. if the user
// clicked cancel), otherwise the full folder path.
/// /////////////////////////////////////////////////////////////////////
function BrowseForFolder(const appHWND: THandle; const browseTitle: String;
const initialFolder: String = ''): String;
var
browse_info: TBrowseInfo;
folder: array [0 .. MAX_PATH] of char;
find_context: PItemIDList;
begin
// --------------------------
// Initialise the structure.
// --------------------------
FillChar(browse_info, SizeOf(browse_info), #0);
lg_StartFolder := initialFolder;
browse_info.pszDisplayName := @folder[0];
browse_info.lpszTitle := PChar(browseTitle);
browse_info.ulFlags := BIF_DONTGOBELOWDOMAIN or BIF_RETURNONLYFSDIRS or
BIF_STATUSTEXT or BIF_VALIDATE {or BIF_USENEWUI} or BIF_NONEWFOLDERBUTTON;
browse_info.hwndOwner := appHWND;
if initialFolder <> '' then
browse_info.lpfn := BrowseForFolderCallBack;
find_context := SHBrowseForFolder(browse_info);
if Assigned(find_context) then
begin
if SHGetPathFromIDList(find_context, folder) then
result := folder
else
result := '';
GlobalFreePtr(find_context);
end
else
result := '';
end;
end.

View File

@@ -2,8 +2,7 @@ unit uscanresult;
interface
uses
generics.collections;
uses fgl;
type
TTimInfo = record
@@ -16,6 +15,7 @@ type
Good: Boolean;
end;
type
TScanResult = class(TObject)
private
pScanFile: string;
@@ -38,7 +38,7 @@ type
property ScanTim[index: Integer]: TTimInfo read fGetTim write fSetTim;
end;
TScanResultList = TList<TScanResult>;
TScanResultList = specialize TFPGObjectList<TScanResult>;
implementation

View File

@@ -3,7 +3,7 @@ unit uscanthread;
interface
uses
ucommon, utim, uscanresult, classes, generics.collections;
ucommon, utim, uscanresult, classes, fgl;
type
TScanThread = class(TThread)
@@ -28,17 +28,19 @@ type
procedure Execute; override;
public
constructor Create(const FileToScan: string; ImageScan: boolean);
//property Started: boolean read pStarted write pStarted;
property StopScan: boolean read pStopScan write pStopScan;
end;
TScanThreadList = TList<TScanThread>;
TScanThreadList = specialize TFPGObjectList<TScanThread>;
implementation
uses
umain, ucdimage, sysutils;
umain, ucdimage, sysutils, FileUtil;
const
cClearBufferSize = ((cTIMMaxSize div cSectorDataSize) + 1) * cSectorDataSize * 2;
cClearBufferSize = ((cTIMMaxSize div cSectorDataSize) + 1) *
cSectorDataSize * 2;
cSectorBufferSize = (cClearBufferSize div cSectorDataSize) * cSectorSize;
{ TScanThread }
@@ -86,9 +88,7 @@ var
pScanFinished: boolean;
pRealBufSize, pTimPosition, pTIMNumber: Integer;
begin
Synchronize(StartScan);
SectorBuffer := nil;
ClearBuffer := nil;
Synchronize(@StartScan);
try
if pScanResult.IsImage then
@@ -109,7 +109,7 @@ begin
TIM := CreateTIM;
pStatusText := sStatusBarScanningFile;
Synchronize(SetStatusText);
Synchronize(@SetStatusText);
pRealBufSize := pSrcFileStream.Read(SectorBuffer^[0], pSectorBufferSize);
Inc(pFilePos, pRealBufSize);
@@ -158,22 +158,22 @@ begin
pRealBufSize := pRealBufSize + (pSectorBufferSize div 2);
end;
Synchronize(UpdateProgressBar);
Synchronize(@UpdateProgressBar);
ClearSectorBuffer(SectorBuffer, ClearBuffer);
end;
end;
finally
FreeTIM(TIM);
if SectorBuffer <> nil then FreeMemory(SectorBuffer);
if ClearBuffer <> nil then FreeMemory(ClearBuffer);
FreeMemory(SectorBuffer);
FreeMemory(ClearBuffer);
pSrcFileStream.Free;
pStopScan := True;
pFilePos := 0;
pStatusText := '';
Synchronize(FinishScan);
Synchronize(@FinishScan);
end;
end;

View File

@@ -1,9 +1,11 @@
unit usettings;
{$mode objfpc}{$H+}
interface
uses
IniFiles;
Classes, SysUtils, IniFiles;
type
@@ -28,8 +30,6 @@ type
implementation
uses Classes, SysUtils;
const sMain = 'main';
{ TSettings }

View File

@@ -329,10 +329,12 @@ begin
Inc(Position);
TIM_POS := P;
if TIM = nil then TIM := CreateTIM;
if TIM = nil then
TIM := CreateTIM;
Move(PBytesArray(BUFFER)^[P], TIM^.HEAD^, cTIMHeadSize);
if not CheckHEAD(TIM) then Exit;
if not CheckHEAD(TIM) then
Exit;
Inc(P, cTIMHeadSize);
if TIMHasCLUT(TIM) then
@@ -345,8 +347,10 @@ begin
Move(PBytesArray(BUFFER)^[P], TIM^.IMAGE^, cIMAGEHeadSize);
if not CheckIMAGE(TIM) then Exit;
if not CheckTIMSize(TIM) then Exit;
if not CheckIMAGE(TIM) then
Exit;
if not CheckTIMSize(TIM) then
Exit;
TIM^.dwSize := GetTIMSize(TIM);
TIM^.bGOOD := TIMIsGood(TIM);
@@ -366,9 +370,6 @@ var
Sector: TCDSector;
P, TIM_FULL_SECTORS: Integer;
begin
sImageStream := nil;
TIM_BUF := nil;
try
sImageStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
@@ -380,7 +381,8 @@ begin
New(TIM_BUF);
P := 0;
if SIZE < FirstPartSize then FirstPartSize := SIZE;
if SIZE < FirstPartSize then
FirstPartSize := SIZE;
sImageStream.Seek(TimStartSectorPos, soBeginning);
sImageStream.Read(Sector, cSectorSize);
@@ -430,7 +432,8 @@ var
begin
Result := nil;
if dwSize > cTIMMaxSize then Exit;
if dwSize > cTIMMaxSize then
Exit;
New(BUF);
Result := CreateTIM;
@@ -439,7 +442,8 @@ begin
Stream.Read(BUF^[0], dwSize);
P := 0;
if not LoadTimFromBuf(BUF, Result, P) then FreeTIM(Result);
if not LoadTimFromBuf(BUF, Result, P) then
FreeTIM(Result);
Dispose(BUF);
end;
@@ -449,7 +453,6 @@ function LoadTimFromFile(const FileName: string; var Position: Integer;
var
sTIM: TFileStream;
begin
sTIM := nil;
if not ImageScan then
begin
try